Author: brett Date: Mon Jun 26 23:13:10 2006 New Revision: 417352 URL: http://svn.apache.org/viewvc?rev=417352&view=rev Log: [MWAR-47] correctly handle timestamps when unpacking files from WAR
Added: maven/plugins/trunk/maven-war-plugin/src/test/resources/unit/sample_wars/simple-updated.war Modified: maven/plugins/trunk/maven-war-plugin/src/main/java/org/apache/maven/plugin/war/AbstractWarMojo.java maven/plugins/trunk/maven-war-plugin/src/test/java/org/apache/maven/plugin/war/WarExplodedMojoTest.java Modified: maven/plugins/trunk/maven-war-plugin/src/main/java/org/apache/maven/plugin/war/AbstractWarMojo.java URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-war-plugin/src/main/java/org/apache/maven/plugin/war/AbstractWarMojo.java?rev=417352&r1=417351&r2=417352&view=diff ============================================================================== --- maven/plugins/trunk/maven-war-plugin/src/main/java/org/apache/maven/plugin/war/AbstractWarMojo.java (original) +++ maven/plugins/trunk/maven-war-plugin/src/main/java/org/apache/maven/plugin/war/AbstractWarMojo.java Mon Jun 26 23:13:10 2006 @@ -16,19 +16,19 @@ * limitations under the License. */ +import org.apache.maven.archiver.MavenArchiveConfiguration; +import org.apache.maven.archiver.MavenArchiver; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter; import org.apache.maven.model.Resource; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.project.MavenProject; -import org.apache.maven.archiver.MavenArchiver; -import org.apache.maven.archiver.MavenArchiveConfiguration; import org.codehaus.plexus.archiver.ArchiverException; import org.codehaus.plexus.archiver.UnArchiver; +import org.codehaus.plexus.archiver.jar.JarArchiver; import org.codehaus.plexus.archiver.manager.ArchiverManager; import org.codehaus.plexus.archiver.manager.NoSuchArchiverException; -import org.codehaus.plexus.archiver.jar.JarArchiver; import org.codehaus.plexus.util.DirectoryScanner; import org.codehaus.plexus.util.FileUtils; import org.codehaus.plexus.util.IOUtil; @@ -417,9 +417,7 @@ * @param filterProperties * @throws java.io.IOException if an error occured while copying webResources */ - public void copyResources( Resource resource, - File webappDirectory, - Properties filterProperties ) + public void copyResources( Resource resource, File webappDirectory, Properties filterProperties ) throws IOException { if ( !resource.getDirectory().equals( webappDirectory.getPath() ) ) @@ -458,8 +456,7 @@ * @param webappDirectory the target directory * @throws java.io.IOException if an error occured while copying webResources */ - public void copyResources( File sourceDirectory, - File webappDirectory ) + public void copyResources( File sourceDirectory, File webappDirectory ) throws IOException { if ( !sourceDirectory.equals( webappDirectory ) ) @@ -518,8 +515,7 @@ * @param webappDirectory * @throws java.io.IOException if an error occured while building the webapp */ - public void buildWebapp( MavenProject project, - File webappDirectory ) + public void buildWebapp( MavenProject project, File webappDirectory ) throws MojoExecutionException, IOException { getLog().info( "Assembling webapp " + project.getArtifactId() + " in " + webappDirectory ); @@ -689,8 +685,7 @@ * @param file File to be unpacked. * @param location Location where to put the unpacked files. */ - private void unpack( File file, - File location ) + private void unpack( File file, File location ) throws MojoExecutionException, NoSuchArchiverException { String archiveExt = FileUtils.getExtension( file.getAbsolutePath() ).toLowerCase(); @@ -700,6 +695,7 @@ UnArchiver unArchiver = archiverManager.getUnArchiver( archiveExt ); unArchiver.setSourceFile( file ); unArchiver.setDestDirectory( location ); + unArchiver.setOverwrite( true ); unArchiver.extract(); } catch ( IOException e ) @@ -719,8 +715,7 @@ * @param srcDir Directory containing unpacked dependent war contents * @param targetDir Directory to overlay srcDir into */ - private void copyDependentWarContents( File srcDir, - File targetDir ) + private void copyDependentWarContents( File srcDir, File targetDir ) throws MojoExecutionException { DirectoryScanner scanner = new DirectoryScanner(); @@ -744,19 +739,14 @@ { File targetFile = new File( targetDir, files[j] ); - // Do not overwrite existing files. - if ( !targetFile.exists() ) + try { - try - { - targetFile.getParentFile().mkdirs(); - copyFileIfModified( new File( srcDir, files[j] ), targetFile ); - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Error copying file '" + files[j] + "' to '" + targetFile + "'", - e ); - } + targetFile.getParentFile().mkdirs(); + copyFileIfModified( new File( srcDir, files[j] ), targetFile ); + } + catch ( IOException e ) + { + throw new MojoExecutionException( "Error copying file '" + files[j] + "' to '" + targetFile + "'", e ); } } } @@ -828,8 +818,7 @@ * <p/> * TO DO: Remove this method when Maven moves to plexus-utils version 1.4 */ - private static void copyFileToDirectoryIfModified( File source, - File destinationDirectory ) + private static void copyFileToDirectoryIfModified( File source, File destinationDirectory ) throws IOException { // TO DO: Remove this method and use the method in WarFileUtils when Maven 2 changes @@ -848,8 +837,7 @@ // support ${token} new FilterWrapper() { - public Reader getReader( Reader fileReader, - Properties filterProperties ) + public Reader getReader( Reader fileReader, Properties filterProperties ) { return new InterpolationFilterReader( fileReader, filterProperties, "${", "}" ); } @@ -857,8 +845,7 @@ // support @token@ new FilterWrapper() { - public Reader getReader( Reader fileReader, - Properties filterProperties ) + public Reader getReader( Reader fileReader, Properties filterProperties ) { return new InterpolationFilterReader( fileReader, filterProperties, "@", "@" ); } @@ -873,10 +860,7 @@ * @param filterProperties * @throws IOException TO DO: Remove this method when Maven moves to plexus-utils version 1.4 */ - private static void copyFilteredFile( File from, - File to, - String encoding, - FilterWrapper[] wrappers, + private static void copyFilteredFile( File from, File to, String encoding, FilterWrapper[] wrappers, Properties filterProperties ) throws IOException { @@ -934,8 +918,7 @@ * <p/> * TO DO: Remove this method when Maven moves to plexus-utils version 1.4 */ - private static void copyFileIfModified( File source, - File destination ) + private static void copyFileIfModified( File source, File destination ) throws IOException { // TO DO: Remove this method and use the method in WarFileUtils when Maven 2 changes @@ -943,6 +926,8 @@ if ( destination.lastModified() < source.lastModified() ) { FileUtils.copyFile( source, destination ); + // preserve timestamp + destination.setLastModified( source.lastModified() ); } } @@ -959,8 +944,7 @@ * @param destinationDirectory * @throws IOException TO DO: Remove this method when Maven moves to plexus-utils version 1.4 */ - private static void copyDirectoryStructureIfModified( File sourceDirectory, - File destinationDirectory ) + private static void copyDirectoryStructureIfModified( File sourceDirectory, File destinationDirectory ) throws IOException { if ( !sourceDirectory.exists() ) @@ -1010,8 +994,7 @@ */ private interface FilterWrapper { - Reader getReader( Reader fileReader, - Properties filterProperties ); + Reader getReader( Reader fileReader, Properties filterProperties ); } /** Modified: maven/plugins/trunk/maven-war-plugin/src/test/java/org/apache/maven/plugin/war/WarExplodedMojoTest.java URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-war-plugin/src/test/java/org/apache/maven/plugin/war/WarExplodedMojoTest.java?rev=417352&r1=417351&r2=417352&view=diff ============================================================================== --- maven/plugins/trunk/maven-war-plugin/src/test/java/org/apache/maven/plugin/war/WarExplodedMojoTest.java (original) +++ maven/plugins/trunk/maven-war-plugin/src/test/java/org/apache/maven/plugin/war/WarExplodedMojoTest.java Mon Jun 26 23:13:10 2006 @@ -203,10 +203,94 @@ assertTrue( "source files not found: " + expectedWebSourceFile.toString(), expectedWebSourceFile.exists() ); assertTrue( "source files not found: " + expectedWebSource2File.toString(), expectedWebSource2File.exists() ); - // check simple.war in the unit test dir under resources to verify the list of files + // check simple.war in the unit test dir under resources to verify the list of files assertTrue( "web xml not found: " + expectedWEBXMLFile.toString(), expectedWEBXMLFile.exists() ); assertTrue( "manifest file not found: " + expectedManifestFile.toString(), expectedManifestFile.exists() ); assertTrue( "war file not found: " + expectedWARFile.toString(), expectedWARFile.exists() ); + } + + /** + * Merge a dependent WAR when a file in the war source directory overrides one found in the WAR. + */ + public void testExplodedWarMergeWarLocalFileOverride() + throws Exception + { + // setup test data + MavenProjectArtifactsStub project = new MavenProjectArtifactsStub(); + SimpleWarArtifactStub simpleWarArtifact = new SimpleWarArtifactStub( getBasedir() ); + + String testId = "testExplodedWarMergeWarLocalFileOverride"; + File webAppDirectory = new File( getTestDirectory(), testId ); + File webAppSource = new File( getTestDirectory(), "/" + testId + "-test-data/source" ); + File simpleJSP = new File( webAppSource, "org/sample/company/test.jsp" ); + createFile( simpleJSP ); + + File workDirectory = new File( getTestDirectory(), "/war/work-" + testId ); + createDir( workDirectory ); + + File classesDir = createClassesDir( testId, true ); + + // configure mojo + project.addArtifact( simpleWarArtifact ); + this.configureMojo( mojo, new LinkedList(), classesDir, webAppSource, webAppDirectory, project ); + setVariableValueToObject( mojo, "workDirectory", workDirectory ); + mojo.execute(); + + // validate operation + File expectedFile = new File( webAppDirectory, "/org/sample/company/test.jsp" ); + + assertTrue( "file not found: " + expectedFile.toString(), expectedFile.exists() ); + assertEquals( "file incorrect", simpleJSP.toString(), FileUtils.fileRead( expectedFile ) ); + } + + /** + * Merge a dependent WAR that gets updated since the last run. + */ + public void testExplodedWarMergeWarUpdated() + throws Exception + { + // setup test data + MavenProjectArtifactsStub project = new MavenProjectArtifactsStub(); + SimpleWarArtifactStub simpleWarArtifact = new SimpleWarArtifactStub( getBasedir() ); + + String testId = "testExplodedWarMergeWarUpdated"; + File webAppDirectory = new File( getTestDirectory(), testId ); + FileUtils.deleteDirectory( webAppDirectory ); + + File webAppSource = new File( getTestDirectory(), "/" + testId + "-test-data/source" ); + + File workDirectory = new File( getTestDirectory(), "/war/work-" + testId ); + createDir( workDirectory ); + + File classesDir = createClassesDir( testId, true ); + + // configure mojo + project.addArtifact( simpleWarArtifact ); + this.configureMojo( mojo, new LinkedList(), classesDir, webAppSource, webAppDirectory, project ); + setVariableValueToObject( mojo, "workDirectory", workDirectory ); + mojo.execute(); + + // validate operation + File expectedFile = new File( webAppDirectory, "/org/sample/company/test.jsp" ); + + assertTrue( "file not found: " + expectedFile.toString(), expectedFile.exists() ); + assertEquals( "file incorrect", "", FileUtils.fileRead( expectedFile ) ); + + // update file, so the local one is older + simpleWarArtifact.setFile( new File( simpleWarArtifact.getFile().getParentFile(), "simple-updated.war" ) ); + + mojo.execute(); + + assertTrue( "file not found: " + expectedFile.toString(), expectedFile.exists() ); + assertEquals( "file incorrect", "updated\n", FileUtils.fileRead( expectedFile ) ); + + // update file, so the local one is newer + simpleWarArtifact.setFile( new File( simpleWarArtifact.getFile().getParentFile(), "simple.war" ) ); + + mojo.execute(); + + assertTrue( "file not found: " + expectedFile.toString(), expectedFile.exists() ); + assertEquals( "file incorrect", "updated\n", FileUtils.fileRead( expectedFile ) ); } /** Added: maven/plugins/trunk/maven-war-plugin/src/test/resources/unit/sample_wars/simple-updated.war URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-war-plugin/src/test/resources/unit/sample_wars/simple-updated.war?rev=417352&view=auto ============================================================================== Binary files /tmp/tmp8HP8m9 and /tmp/tmpAGkM3M differ