Author: rafale Date: Thu Jan 10 13:17:00 2008 New Revision: 610933 URL: http://svn.apache.org/viewvc?rev=610933&view=rev Log: merged from experimentation (tested manual roundtrip on quickstart)
Modified: maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/ArchetypeArtifactManager.java maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/DefaultArchetypeArtifactManager.java maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/DefaultPomManager.java maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/PomManager.java maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/util/FileCharsetDetector.java maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/mdo/archetype-catalog.mdo Modified: maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/ArchetypeArtifactManager.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/ArchetypeArtifactManager.java?rev=610933&r1=610932&r2=610933&view=diff ============================================================================== --- maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/ArchetypeArtifactManager.java (original) +++ maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/ArchetypeArtifactManager.java Thu Jan 10 13:17:00 2008 @@ -20,18 +20,22 @@ package org.apache.maven.archetype.common; import org.apache.maven.archetype.exception.UnknownArchetype; -import org.apache.maven.archetype.exception.UnknownGroup; import org.apache.maven.archetype.metadata.ArchetypeDescriptor; import org.apache.maven.artifact.repository.ArtifactRepository; import java.io.File; +import java.io.IOException; import java.util.List; import java.util.zip.ZipFile; +import org.apache.maven.model.Model; +import org.codehaus.plexus.util.xml.pull.XmlPullParserException; public interface ArchetypeArtifactManager { String ROLE = ArchetypeArtifactManager.class.getName(); + public Model getArchetypePom(File jar) throws XmlPullParserException, UnknownArchetype, IOException; + /** */ File getArchetypeFile( @@ -99,6 +103,8 @@ ArtifactRepository localRepository, List repositories ); + + boolean isFileSetArchetype( File archetypeFile ); /** */ @@ -135,6 +141,8 @@ ArtifactRepository localRepository, List repositories ); + + boolean isOldArchetype( File archetypeFile ); /** */ @@ -145,6 +153,11 @@ ArtifactRepository archetypeRepository, ArtifactRepository localRepository, List repositories + ) + throws + UnknownArchetype; + org.apache.maven.archetype.old.descriptor.ArchetypeDescriptor getOldArchetypeDescriptor( + File archetypeFile ) throws UnknownArchetype; Modified: maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/DefaultArchetypeArtifactManager.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/DefaultArchetypeArtifactManager.java?rev=610933&r1=610932&r2=610933&view=diff ============================================================================== --- maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/DefaultArchetypeArtifactManager.java (original) +++ maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/DefaultArchetypeArtifactManager.java Thu Jan 10 13:17:00 2008 @@ -20,19 +20,15 @@ package org.apache.maven.archetype.common; import org.apache.maven.archetype.exception.UnknownArchetype; -import org.apache.maven.archetype.exception.UnknownGroup; import org.apache.maven.archetype.metadata.ArchetypeDescriptor; import org.apache.maven.archetype.metadata.io.xpp3.ArchetypeDescriptorXpp3Reader; import org.apache.maven.archetype.old.descriptor.ArchetypeDescriptorBuilder; import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.repository.metadata.GroupRepositoryMetadata; -import org.apache.maven.artifact.repository.metadata.Plugin; -import org.apache.maven.artifact.repository.metadata.RepositoryMetadata; import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager; -import org.apache.maven.artifact.repository.metadata.RepositoryMetadataResolutionException; import org.apache.maven.archetype.downloader.DownloadException; import org.apache.maven.archetype.downloader.DownloadNotFoundException; import org.apache.maven.archetype.downloader.Downloader; +import org.apache.maven.project.MavenProject; import org.codehaus.plexus.logging.AbstractLogEnabled; import org.codehaus.plexus.util.StringUtils; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; @@ -47,11 +43,11 @@ import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Enumeration; -import java.util.Iterator; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; +import org.apache.maven.model.Model; /** @plexus.component */ public class DefaultArchetypeArtifactManager @@ -64,6 +60,9 @@ /** @plexus.requirement */ private RepositoryMetadataManager repositoryMetadataManager; + /** @plexus.requirement */ + private PomManager pomManager; + public File getArchetypeFile( final String groupId, final String artifactId, @@ -200,10 +199,29 @@ repositories ); - org.apache.maven.archetype.metadata.ArchetypeDescriptor descriptor = - loadFileSetArchetypeDescriptor( archetypeJarLoader ); + return isFileSetArchetype(archetypeJarLoader); + } + catch ( XmlPullParserException e ) + { + return false; + } + catch ( IOException e ) + { + return false; + } + catch ( UnknownArchetype e ) + { + return false; + } + } + + public boolean isFileSetArchetype(File archetypeFile) { + try + { + ClassLoader archetypeJarLoader = + getArchetypeJarLoader(archetypeFile); - return descriptor.getName() != null; + return isFileSetArchetype(archetypeJarLoader); } catch ( XmlPullParserException e ) { @@ -329,10 +347,29 @@ repositories ); - org.apache.maven.archetype.old.descriptor.ArchetypeDescriptor descriptor = - loadOldArchetypeDescriptor( archetypeJarLoader ); + return isOldArchetype(archetypeJarLoader); + } + catch ( XmlPullParserException e ) + { + return false; + } + catch ( IOException e ) + { + return false; + } + catch ( UnknownArchetype ex ) + { + return false; + } + } + + public boolean isOldArchetype(File archetypeFile) { + try + { + ClassLoader archetypeJarLoader = + getArchetypeJarLoader(archetypeFile); - return descriptor.getId() != null; + return isOldArchetype(archetypeJarLoader); } catch ( XmlPullParserException e ) { @@ -398,6 +435,24 @@ return new InputStreamReader( is ); } + private boolean isFileSetArchetype ( ClassLoader archetypeJarLoader ) + throws XmlPullParserException, IOException + { + org.apache.maven.archetype.metadata.ArchetypeDescriptor descriptor = + loadFileSetArchetypeDescriptor ( archetypeJarLoader ); + + return descriptor.getName () != null; + } + + private boolean isOldArchetype ( ClassLoader archetypeJarLoader ) + throws IOException, XmlPullParserException + { + org.apache.maven.archetype.old.descriptor.ArchetypeDescriptor descriptor = + loadOldArchetypeDescriptor ( archetypeJarLoader ); + + return descriptor.getId () != null; + } + private org.apache.maven.archetype.metadata.ArchetypeDescriptor loadFileSetArchetypeDescriptor( ClassLoader archetypeJarLoader ) @@ -512,5 +567,52 @@ ( loader == null ) ? Thread.currentThread().getContextClassLoader().getResourceAsStream( name ) : loader.getResourceAsStream( name ); + } + + public Model getArchetypePom ( File jar ) + throws XmlPullParserException, UnknownArchetype, IOException + { + String pomFileName = null; + ZipFile zipFile = getArchetypeZipFile ( jar ); + Enumeration enumeration = zipFile.entries (); + while ( enumeration.hasMoreElements () ) + { + ZipEntry el = (ZipEntry) enumeration.nextElement (); +// System.err.println ( +// "entry=" + el.getName () + " " + el.getComment () + " D" + el.isDirectory () +// ); + + String entry = el.getName (); + if ( entry.startsWith ( "META-INF/maven" ) && entry.endsWith ( "pom.xml" ) ) + { + pomFileName = entry; + } + } + + return + ( pomFileName == null ) + ? null + : pomManager.readPom ( zipFile.getInputStream ( zipFile.getEntry ( pomFileName ) ) ); + } + + public org.apache.maven.archetype.old.descriptor.ArchetypeDescriptor getOldArchetypeDescriptor ( + File archetypeFile + ) + throws UnknownArchetype + { + try + { + ClassLoader archetypeJarLoader = getArchetypeJarLoader ( archetypeFile ); + + return loadOldArchetypeDescriptor ( archetypeJarLoader ); + } + catch ( XmlPullParserException e ) + { + throw new UnknownArchetype ( e ); + } + catch ( IOException e ) + { + throw new UnknownArchetype ( e ); + } } } Modified: maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/DefaultPomManager.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/DefaultPomManager.java?rev=610933&r1=610932&r2=610933&view=diff ============================================================================== --- maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/DefaultPomManager.java (original) +++ maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/DefaultPomManager.java Thu Jan 10 13:17:00 2008 @@ -290,6 +290,40 @@ return model; } + + public Model readPom( InputStream pomStream ) + throws + IOException, + XmlPullParserException + { // TODO ensure correct encoding by using default one from method argument !!! + + Model model; + Reader pomReader = null; + try + { +// FileCharsetDetector detector = new FileCharsetDetector( pomStream ); + + String fileEncoding = /*detector.isFound() ? detector.getCharset() :*/ "UTF-8"; + + pomReader = new InputStreamReader( pomStream, fileEncoding ); + + MavenXpp3Reader reader = new MavenXpp3Reader(); + + model = reader.read( pomReader ); + + if ( StringUtils.isEmpty( model.getModelEncoding() ) ) + { + model.setModelEncoding( fileEncoding ); + } + } + finally + { + IOUtil.close( pomReader ); + pomReader = null; + } + return model; + } + public void writePom( final Model model, final File pomFile, final File initialPomFile ) Modified: maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/PomManager.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/PomManager.java?rev=610933&r1=610932&r2=610933&view=diff ============================================================================== --- maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/PomManager.java (original) +++ maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/PomManager.java Thu Jan 10 13:17:00 2008 @@ -25,8 +25,8 @@ import org.dom4j.DocumentException; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; public interface PomManager { @@ -53,6 +53,11 @@ XmlPullParserException; Model readPom( File pomFile ) + throws + IOException, + XmlPullParserException; + + Model readPom( InputStream pomStream ) throws IOException, XmlPullParserException; Modified: maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/util/FileCharsetDetector.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/util/FileCharsetDetector.java?rev=610933&r1=610932&r2=610933&view=diff ============================================================================== --- maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/util/FileCharsetDetector.java (original) +++ maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/java/org/apache/maven/archetype/common/util/FileCharsetDetector.java Thu Jan 10 13:17:00 2008 @@ -29,6 +29,7 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; /** @author rafale */ public class FileCharsetDetector @@ -57,6 +58,64 @@ ); BufferedInputStream imp = new BufferedInputStream( new FileInputStream( detectedFile ) ); + + byte[] buf = new byte[1024]; + int len; + boolean done = false; + boolean isAscii = true; + + while ( ( len = imp.read( buf, 0, buf.length ) ) != -1 ) + { + // Check if the stream is only ascii. + if ( isAscii ) + { + isAscii = det.isAscii( buf, len ); + } + + // DoIt if non-ascii and not done yet. + if ( !isAscii && !done ) + { + done = det.DoIt( buf, len, false ); + found = done; + } + } + det.DataEnd(); + + if ( !isFound() ) + { + String[] prob = det.getProbableCharsets(); + + if ( prob.length > 0 ) + { + charset = prob[0]; + } + } + + if ( isAscii ) + { + charset = "ASCII"; + } + } + + public FileCharsetDetector( InputStream detectedStream ) + throws + FileNotFoundException, + IOException + { + nsDetector det = new nsDetector( nsPSMDetector.ALL ); + + det.Init( + new nsICharsetDetectionObserver() + { + public void Notify( String charset ) + { + FileCharsetDetector.this.charset = charset; + FileCharsetDetector.this.found = true; + } + } + ); + + BufferedInputStream imp = new BufferedInputStream( detectedStream ); byte[] buf = new byte[1024]; int len; Modified: maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/mdo/archetype-catalog.mdo URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/mdo/archetype-catalog.mdo?rev=610933&r1=610932&r2=610933&view=diff ============================================================================== --- maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/mdo/archetype-catalog.mdo (original) +++ maven/sandbox/trunk/archetypeng/archetypeng-common/src/main/mdo/archetype-catalog.mdo Thu Jan 10 13:17:00 2008 @@ -45,6 +45,16 @@ </association> </field> </fields> + <codeSegments> + <codeSegment> + <code><![CDATA[ + public String toString () + { + return archetypes.toString(); + } + ]]></code> + </codeSegment> + </codeSegments> </class> <class> <name>Archetype</name>