in nb-repository-plugin/src/main/java/org/apache/netbeans/nbm/repository/PopulateRepositoryMojo.java [280:740]
public void execute()
throws MojoExecutionException
{
getLog().info( "Populate repository with NetBeans modules" );
Project antProject = antProject();
ArtifactRepository deploymentRepository = null;
if ( parentGAV != null )
{
// populate artefactParent
artefactParent = new Parent();
String[] split = parentGAV.split( ":" );
if ( split.length != 3 )
{
throw new MojoExecutionException(
"parentGAV should respect the following format groupId:artefactId:version" );
}
artefactParent.setGroupId( split[0] );
artefactParent.setArtifactId( split[1] );
artefactParent.setVersion( split[2] );
}
if ( deployUrl != null )
{
ArtifactRepositoryLayout layout = new DefaultRepositoryLayout();
deploymentRepository = repositoryFactory.createDeploymentArtifactRepository(
deployId, deployUrl, layout, true );
}
else if ( skipLocalInstall )
{
throw new MojoExecutionException(
"When skipping install to local repository, one shall define the deployUrl parameter" );
}
if ( netbeansInstallDirectory == null )
{
Input input = (Input) antProject.createTask( "input" );
input.setMessage( "Please enter NetBeans installation directory:" );
input.setAddproperty( "installDir" );
try
{
input.execute();
}
catch ( BuildException e )
{
getLog().error( "Cannot run ant:input" );
throw new MojoExecutionException( e.getMessage(), e );
}
String prop = antProject.getProperty( "installDir" );
netbeansInstallDirectory = new File( prop );
}
File rootDir = netbeansInstallDirectory;
if ( !rootDir.exists() )
{
getLog().error( "NetBeans installation doesn't exist." );
throw new MojoExecutionException( "NetBeans installation doesn't exist." );
}
getLog().info( "Copying NetBeans artifacts from " + netbeansInstallDirectory );
PathConvert convert = (PathConvert) antProject.createTask( "pathconvert" );
convert.setPathSep( "," );
convert.setProperty( "netbeansincludes" );
FileSet set = new FileSet();
set.setDir( rootDir );
set.createInclude().setName( "**/modules/*.jar" );
set.createInclude().setName( "*/core/*.jar" );
set.createInclude().setName( "platform*/lib/*.jar" );
convert.createPath().addFileset( set );
try
{
convert.execute();
}
catch ( BuildException e )
{
getLog().error( "Cannot run ant:pathconvert" );
throw new MojoExecutionException( e.getMessage(), e );
}
String prop = antProject.getProperty( "netbeansincludes" );
StringTokenizer tok = new StringTokenizer( prop, "," );
Map<ModuleWrapper, Artifact> moduleDefinitions = new HashMap<>();
Map<String, Collection<ModuleWrapper>> clusters = new HashMap<>();
while ( tok.hasMoreTokens() )
{
String token = tok.nextToken();
File module = new File( token );
String clust = module.getAbsolutePath().substring( rootDir.getAbsolutePath().length() + 1 );
clust = clust.substring( 0, clust.indexOf( File.separator ) );
ExamineManifest examinator = new ExamineManifest( getLog() );
examinator.setPopulateDependencies( true );
examinator.setJarFile( module );
examinator.checkFile();
if ( examinator.isNetBeansModule() || examinator.isOsgiBundle() )
{
//TODO get artifact id from the module's manifest?
String artifact = module.getName().substring( 0, module.getName().indexOf( ".jar" ) );
if ( "boot".equals( artifact ) )
{
artifact = "org-netbeans-bootstrap";
}
if ( "core".equals( artifact ) )
{
artifact = "org-netbeans-core-startup";
}
if ( "core-base".equals( artifact ) )
{
artifact = "org-netbeans-core-startup-base";
}
String version = forcedVersion == null ? examinator.getSpecVersion() : forcedVersion;
String group = groupIdPrefix + ( examinator.isOsgiBundle() ? GROUP_EXTERNAL : examinator.hasPublicPackages() ? GROUP_API : GROUP_IMPL );
Artifact art = createArtifact( artifact, version, group );
ModuleWrapper wr = new ModuleWrapper( artifact, version, group, examinator, module );
if ( examinator.isOsgiBundle() )
{
Dependency dep = findExternal( module );
if ( dep != null )
{
art = createArtifact( dep.getArtifactId(), dep.getVersion(), dep.getGroupId() );
group = dep.getGroupId();
version = dep.getVersion();
wr = new ModuleWrapperMaven( artifact, version, group, examinator, module , dep );
}
}
wr.setCluster( clust );
moduleDefinitions.put( wr, art );
Collection<ModuleWrapper> col = clusters.get( clust );
if ( col == null )
{
col = new ArrayList<>();
clusters.put( clust, col );
}
col.add( wr );
}
}
File javadocRoot = null;
if ( netbeansJavadocDirectory != null )
{
javadocRoot = netbeansJavadocDirectory ;
if ( !javadocRoot.exists() )
{
javadocRoot = null;
throw new MojoExecutionException(
"The netbeansJavadocDirectory parameter doesn't point to an existing folder" );
}
}
File sourceRoot = null;
if ( netbeansSourcesDirectory != null )
{
sourceRoot = netbeansSourcesDirectory;
if ( !sourceRoot.exists() )
{
sourceRoot = null;
throw new MojoExecutionException(
"The netbeansSourceDirectory parameter doesn't point to an existing folder" );
}
}
File nbmRoot = null;
if ( netbeansNbmDirectory != null )
{
nbmRoot = netbeansNbmDirectory;
if ( !nbmRoot.exists() )
{
nbmRoot = null;
throw new MojoExecutionException(
"The nbmDirectory parameter doesn't point to an existing folder" );
}
}
List<ModuleWrapper> wrapperList = new ArrayList<>( moduleDefinitions.keySet() );
// artifact that we need to populate
Map<ModuleWrapper, Artifact> tobePopulated = new HashMap<>();
// external artefacts
Map<ModuleWrapper, Artifact> oncentralWrapper = new HashMap<>();
// triage
for ( Map.Entry<ModuleWrapper, Artifact> entry : moduleDefinitions.entrySet() )
{
if ( entry.getKey() instanceof ModuleWrapperMaven )
{
oncentralWrapper.put( entry.getKey(), entry.getValue() );
}
else
{
tobePopulated.put( entry.getKey(), entry.getValue() );
}
}
List<ExternalsWrapper> externals = new ArrayList<>();
int count = tobePopulated.size() + 1;
int index = 0;
try
{
for ( Map.Entry<ModuleWrapper, Artifact> elem : tobePopulated.entrySet() )
{
ModuleWrapper man = elem.getKey();
Artifact art = elem.getValue();
index = index + 1;
getLog().info( "Processing " + index + "/" + count );
File pom = createMavenProject( man, wrapperList, externals );
ArtifactMetadata metadata = new ProjectArtifactMetadata( art, pom );
art.addMetadata( metadata );
File javadoc = null;
Artifact javadocArt = null;
if ( javadocRoot != null )
{
File zip = new File( javadocRoot, art.getArtifactId() + ".zip" );
if ( zip.exists() )
{
javadoc = zip;
javadocArt = createAttachedArtifact( art, javadoc, "jar", "javadoc" );
}
}
File source = null;
Artifact sourceArt = null;
if ( sourceRoot != null )
{
File zip = new File( sourceRoot, art.getArtifactId() + ".zip" );
if ( zip.exists() )
{
source = zip;
sourceArt = createAttachedArtifact( art, source, "jar", "sources" );
}
}
File nbm = null;
Artifact nbmArt = null;
if ( nbmRoot != null )
{
File zip = new File( nbmRoot, art.getArtifactId() + ".nbm" );
if ( !zip.exists() )
{
zip = new File( nbmRoot,
man.getCluster() + File.separator + art.getArtifactId() + ".nbm" );
}
if ( zip.exists() )
{
nbm = zip;
nbmArt = createAttachedArtifact( art, nbm, "nbm-file", null );
if ( nbmArt.getArtifactHandler().getExtension().equals( "nbm-file" ) )
{
// Maven 2.x compatibility.
nbmArt = createAttachedArtifact( art, nbm, "nbm", null );
}
assert nbmArt.getArtifactHandler().getExtension().equals( "nbm" );
}
}
File moduleJar = man.getFile();
File moduleJarMinusCP = null;
if ( ! man.getModuleManifest().getClasspath().isEmpty() )
{
try
{
moduleJarMinusCP = File.createTempFile( man.getArtifact(), ".jar" );
moduleJarMinusCP.deleteOnExit();
InputStream is = new FileInputStream( moduleJar );
try
{
OutputStream os = new FileOutputStream( moduleJarMinusCP );
try
{
JarInputStream jis = new JarInputStream( is );
Manifest mani = new Manifest( jis.getManifest() );
mani.getMainAttributes().remove( Attributes.Name.CLASS_PATH );
if ( !man.deps.isEmpty() )
{ // MNBMODULE-132
StringBuilder b = new StringBuilder();
for ( Dependency dep : man.deps )
{
if ( b.length() > 0 )
{
b.append( ' ' );
}
b.append( dep.getGroupId() ).append( ':' ).append( dep.getArtifactId() ).append( ':' ).append( dep.getVersion() );
if ( dep.getClassifier() != null )
{
b.append( ":" ).append( dep.getClassifier() );
}
}
mani.getMainAttributes().putValue( "Maven-Class-Path", b.toString() );
}
else
{
getLog().warn( "did not find any external artifacts for " + man.getModule() );
}
JarOutputStream jos = new JarOutputStream( os, mani );
JarEntry entry;
while ( ( entry = jis.getNextJarEntry() ) != null )
{
if ( entry.getName().matches( "META-INF/.+[.]SF" ) )
{
throw new IOException( "cannot handle signed JARs" );
}
jos.putNextEntry( entry );
byte[] buf = new byte[(int) entry.getSize()];
int read = jis.read( buf, 0, buf.length );
if ( read != buf.length )
{
throw new IOException( "read wrong amount" );
}
jos.write( buf );
}
jos.close();
}
finally
{
os.close();
}
}
finally
{
is.close();
}
}
catch ( IOException x )
{
getLog().warn( "Could not process " + moduleJar + ": " + x, x );
moduleJarMinusCP.delete();
moduleJarMinusCP = null;
}
}
try
{
if ( !skipLocalInstall )
{
install( moduleJarMinusCP != null ? moduleJarMinusCP : moduleJar, art );
if ( javadoc != null )
{
install( javadoc, javadocArt );
}
if ( source != null )
{
install( source, sourceArt );
}
if ( nbm != null )
{
install( nbm, nbmArt );
}
}
try
{
if ( deploymentRepository != null )
{
artifactDeployer.deploy( moduleJarMinusCP != null ? moduleJarMinusCP : moduleJar, art,
deploymentRepository, session.getLocalRepository() );
if ( javadoc != null )
{
artifactDeployer.deploy( javadoc, javadocArt, deploymentRepository, session.getLocalRepository() );
}
if ( source != null )
{
artifactDeployer.deploy( source, sourceArt, deploymentRepository, session.getLocalRepository() );
}
if ( nbm != null )
{
artifactDeployer.deploy( nbm, nbmArt, deploymentRepository, session.getLocalRepository() );
}
}
}
catch ( ArtifactDeploymentException ex )
{
throw new MojoExecutionException( "Error Deploying artifact", ex );
}
}
finally
{
if ( moduleJarMinusCP != null )
{
moduleJarMinusCP.delete();
}
}
}
}
finally
{
/*if ( searcher != null )
{
try
{
searcher.close();
}
catch ( IOException ex )
{
getLog().error( ex );
}
}*/
}
//process collected non-recognized external jars..
if ( externals.size() > 0 )
{
index = 0;
count = externals.size();
for ( ExternalsWrapper ex : externals )
{
Artifact art = createArtifact( ex.getArtifact(), ex.getVersion(), ex.getGroupid() );
index = index + 1;
getLog().info( "Processing external " + index + "/" + count );
File pom = createExternalProject( ex );
ArtifactMetadata metadata = new ProjectArtifactMetadata( art, pom );
art.addMetadata( metadata );
if ( !skipLocalInstall )
{
install( ex.getFile(), art );
}
try
{
if ( deploymentRepository != null )
{
artifactDeployer.deploy( ex.getFile(), art,
deploymentRepository, session.getLocalRepository() );
}
}
catch ( ArtifactDeploymentException exc )
{
throw new MojoExecutionException( "Error Deploying artifact", exc );
}
}
}
if ( ! defineCluster )
{
getLog().info( "Not creating cluster POMs." );
}
else if ( forcedVersion == null )
{
getLog().warn( "Version not specified, cannot create cluster POMs." );
}
else
{
for ( Map.Entry<String, Collection<ModuleWrapper>> elem : clusters.entrySet() )
{
String cluster = stripClusterName( elem.getKey() );
Collection<ModuleWrapper> modules = elem.getValue();
getLog().info( "Processing cluster " + cluster );
Artifact art = createClusterArtifact( cluster, forcedVersion );
File pom = createClusterProject( art, modules );
ProjectArtifactMetadata metadata = new ProjectArtifactMetadata( art, pom );
art.addMetadata( metadata );
if ( !skipLocalInstall )
{
install( pom, art );
}
try
{
if ( deploymentRepository != null )
{
artifactDeployer.deploy( pom, art, deploymentRepository, session.getLocalRepository() );
}
}
catch ( ArtifactDeploymentException ex )
{
throw new MojoExecutionException( "Error Deploying artifact", ex );
}
}
}
}