Java tutorial
/* ========================================================================== * Copyright 2003-2006 Mevenide Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================================= */ package org.codehaus.mojo.nbm; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.security.DigestOutputStream; import java.security.MessageDigest; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.jar.Attributes; import java.util.jar.JarEntry; import java.util.jar.JarInputStream; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; import org.apache.lucene.search.Hits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.TermQuery; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.deployer.ArtifactDeployer; import org.apache.maven.artifact.deployer.ArtifactDeploymentException; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.handler.ArtifactHandler; import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; import org.apache.maven.artifact.installer.ArtifactInstallationException; import org.apache.maven.artifact.installer.ArtifactInstaller; import org.apache.maven.artifact.metadata.ArtifactMetadata; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.ArtifactRepositoryFactory; import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout; import org.apache.maven.model.Dependency; import org.apache.maven.model.Model; import org.apache.maven.model.io.xpp3.MavenXpp3Writer; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.project.artifact.AttachedArtifact; import org.apache.maven.project.artifact.ProjectArtifactMetadata; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.Input; import org.apache.tools.ant.taskdefs.PathConvert; import org.apache.tools.ant.types.FileSet; import org.codehaus.plexus.util.IOUtil; import org.codehaus.plexus.util.StringUtils; /** * A goal for identifying netbeans modules from the installation and populating the local * repository with them. Optionally you can also deploy to a remote repository. * <p/> * If you are looking for an existing remote repository for netbeans artifacts, check out * <a href="http://bits.netbeans.org/maven2/">http://bits.netbeans.org/maven2/</a>, * it contains API artifacts for multiple releases. * <p/> * See this <a href="repository.html">HOWTO</a> on how to generate the NetBeans binaries required * by this goal. * <p/> * <b>Compatibility Note</b>: The 3.0+ version puts all unrecognized, non-module, 3rd party jars * in the org.netbeans.external group and adds them as dependencies to respective modules. * That can cause backward incompatibility with earlier versions which generated incomplete (different) * maven metadata. * * @author <a href="mailto:mkleint@codehaus.org">Milos Kleint</a> * @goal populate-repository * @requiresProject false * @aggregator */ public class PopulateRepositoryMojo extends AbstractNbmMojo { /** * an url where to deploy the netbeans artifacts. Optional, if not specified, the artifacts will be only installed * in local repository, if you need to give credentials to access remote repo, the id of the server is hardwired to "netbeans". * @parameter expression="${deployUrl}" */ private String deployUrl; /** * Optional parameter, by default the generated metadata is installed in local repository. * Setting this parameter to false will avoid installing the bits. Only meaningful together with * a defined "deployUrl" parameter. * @parameter expression="${skipInstall}" default-value="false" * @since 3.0 */ private boolean skipLocalInstall; /** * Location of netbeans installation * * @parameter expression="${netbeansInstallDirectory}" */ protected File netbeansInstallDirectory; /** * If you want to install/deploy also netbeans api javadocs, download the javadoc zip file from netbeans.org * expand it to a directory, it should contain multiple zip files. Define this parameter as absolute path to the zip files folder. * * @parameter expression="${netbeansJavadocDirectory}" */ protected File netbeansJavadocDirectory; /** * Assumes a folder with <code-name-base>.zip files containing sources for modules. * @parameter expression="${netbeansSourcesDirectory}" */ protected File netbeansSourcesDirectory; /** * If defined, will match the nbm files found in the designated folder with the modules * and upload the nbm file next to the module jar in local and remote repositories. * * Assumes a folder with <code-name-base>.nbm files containing nbm files for modules. * @parameter expression="${netbeansNbmDirectory}" * @since 3.0 */ protected File netbeansNbmDirectory; /** * Optional parameter, when specified, will force all modules to have the designated version. * Good when depending on releases. Then you would for example specify RELEASE50 in this parameter and * all modules get this version in the repository. If not defined, the maven version is * derived from the OpenIDE-Module-Specification-Version manifest attribute. * <p/> * Highly Recommended! * @parameter expression="${forcedVersion}" */ protected String forcedVersion; /** * Optional parameter, when specified it shall point to a directory containing a * Nexus Lucene index. This index will be used to find external libraries that * are referenced by NetBeans modules and populate the POM metadata with correct * dependencies. Any dependencies not found this way, will be generated a unique * id under the org.netbeans.external groupId. * <p/> * The Nexus Lucene index zip file for central repository can be found here: * http://repo1.maven.org/maven2/.index/nexus-maven-repository-index.zip * Unzip it to a directory and use this parameter to point to it. * @parameter expression="${nexusIndexDirectory}" * @since 3.0 */ private File nexusIndexDirectory; // <editor-fold defaultstate="collapsed" desc="Component parameters"> /** * Local maven repository. * * @parameter expression="${localRepository}" * @required * @readonly */ protected ArtifactRepository localRepository; /** * Maven ArtifactFactory. * * @component */ private ArtifactFactory artifactFactory; /** * Maven ArtifactInstaller. * * @component */ private ArtifactInstaller artifactInstaller; /** * Maven ArtifactDeployer. * * @component */ private ArtifactDeployer artifactDeployer; /** * Maven ArtifactHandlerManager * * @component */ private ArtifactHandlerManager artifactHandlerManager; /** * Maven ArtifactRepositoryFactory. * * @component */ private ArtifactRepositoryFactory repositoryFactory; // end of component params custom code folding // </editor-fold> public void execute() throws MojoExecutionException { getLog().info("Populate repository with netbeans modules"); Project antProject = registerNbmAntTasks(); ArtifactRepository deploymentRepository = null; if (deployUrl != null) { ArtifactRepositoryLayout layout = new DefaultRepositoryLayout(); deploymentRepository = repositoryFactory.createDeploymentArtifactRepository("netbeans", deployUrl, layout, true); } else if (skipLocalInstall) { throw new MojoExecutionException( "When skipping install to local repository, one shall define the deploUrl 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, ","); HashMap<ModuleWrapper, Artifact> moduleDefinitions = new HashMap<ModuleWrapper, Artifact>(); HashMap<String, Collection<ModuleWrapper>> clusters = new HashMap<String, Collection<ModuleWrapper>>(); 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()) { //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"; } String version = forcedVersion == null ? examinator.getSpecVersion() : forcedVersion; String group = "org.netbeans." + (examinator.hasPublicPackages() ? "api" : "modules"); Artifact art = createArtifact(artifact, version, group); ModuleWrapper wr = new ModuleWrapper(artifact, version, group, examinator, module); wr.setCluster(clust); moduleDefinitions.put(wr, art); Collection<ModuleWrapper> col = clusters.get(clust); if (col == null) { col = new ArrayList<ModuleWrapper>(); clusters.put(clust, col); } col.add(wr); } } List<ModuleWrapper> wrapperList = new ArrayList<ModuleWrapper>(moduleDefinitions.keySet()); int count = wrapperList.size() + 1; int index = 0; 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<ExternalsWrapper> externals = new ArrayList<ExternalsWrapper>(); IndexSearcher searcher = null; if (nexusIndexDirectory != null && nexusIndexDirectory.exists()) { try { Directory nexusDir = FSDirectory.getDirectory(nexusIndexDirectory); IndexReader nexusReader = IndexReader.open(nexusDir); searcher = new IndexSearcher(nexusReader); } catch (IOException ex) { Logger.getLogger(PopulateRepositoryMojo.class.getName()).log(Level.SEVERE, null, ex); } } try { for (Map.Entry<ModuleWrapper, Artifact> elem : moduleDefinitions.entrySet()) { ModuleWrapper man = elem.getKey(); Artifact art = elem.getValue(); index = index + 1; getLog().info("Processing " + index + "/" + count); File pom = createMavenProject(man, wrapperList, externals, searcher); 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()); } 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, localRepository); if (javadoc != null) { artifactDeployer.deploy(javadoc, javadocArt, deploymentRepository, localRepository); } if (source != null) { artifactDeployer.deploy(source, sourceArt, deploymentRepository, localRepository); } if (nbm != null) { artifactDeployer.deploy(nbm, nbmArt, deploymentRepository, localRepository); } } } 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) { Logger.getLogger(PopulateRepositoryMojo.class.getName()).log(Level.SEVERE, null, 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, localRepository); } } catch (ArtifactDeploymentException exc) { throw new MojoExecutionException("Error Deploying artifact", exc); } } } 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, localRepository); } } catch (ArtifactDeploymentException ex) { throw new MojoExecutionException("Error Deploying artifact", ex); } } } } void install(File file, Artifact art) throws MojoExecutionException { assert localRepository != null; try { artifactInstaller.install(file, art, localRepository); } catch (ArtifactInstallationException e) { // TODO: install exception that does not give a trace throw new MojoExecutionException("Error installing artifact", e); } } //performs the same tasks as the MavenProjectHelper Artifact createAttachedArtifact(Artifact primary, File file, String type, String classifier) { assert type != null; ArtifactHandler handler = null; handler = artifactHandlerManager.getArtifactHandler(type); if (handler == null) { getLog().warn("No artifact handler for " + type); handler = artifactHandlerManager.getArtifactHandler("jar"); } Artifact artifact = new AttachedArtifact(primary, type, classifier, handler); artifact.setFile(file); artifact.setResolved(true); return artifact; } private File createMavenProject(ModuleWrapper wrapper, List<ModuleWrapper> wrapperList, List<ExternalsWrapper> externalsList, IndexSearcher searcher) { Model mavenModel = new Model(); mavenModel.setGroupId(wrapper.getGroup()); mavenModel.setArtifactId(wrapper.getArtifact()); mavenModel.setVersion(wrapper.getVersion()); mavenModel.setPackaging("jar"); mavenModel.setModelVersion("4.0.0"); ExamineManifest man = wrapper.getModuleManifest(); List<Dependency> deps = new ArrayList<Dependency>(); if (!man.getDependencyTokens().isEmpty()) { for (String elem : man.getDependencyTokens()) { // create pseudo wrapper ModuleWrapper wr = new ModuleWrapper(elem); int index = wrapperList.indexOf(wr); if (index > -1) { wr = wrapperList.get(index); Dependency dep = new Dependency(); dep.setArtifactId(wr.getArtifact()); dep.setGroupId(wr.getGroup()); dep.setVersion(wr.getVersion()); dep.setType("jar"); //we don't want the API modules to depend on non-api ones.. // otherwise the transitive dependency mechanism pollutes your classpath.. if (wrapper.getModuleManifest().hasPublicPackages() && !wr.getModuleManifest().hasPublicPackages()) { dep.setScope("runtime"); } deps.add(dep); } else { getLog().warn("No module found for dependency '" + elem + "'"); } } } //need some generic way to handle Classpath: items. //how to figure the right version? String cp = wrapper.getModuleManifest().getClasspath(); if (!cp.isEmpty()) { StringTokenizer tok = new StringTokenizer(cp); while (tok.hasMoreTokens()) { String path = tok.nextToken(); File f = new File(wrapper.getFile().getParentFile(), path); if (f.exists()) { FileInputStream fis = null; DigestOutputStream os = null; boolean added = false; if (searcher != null) { try { MessageDigest shaDig = MessageDigest.getInstance("SHA1"); fis = new FileInputStream(f); os = new DigestOutputStream(new NullOutputStream(), shaDig); IOUtil.copy(fis, os); IOUtil.close(fis); IOUtil.close(os); String sha = encode(shaDig.digest()); TermQuery q = new TermQuery(new Term("1", sha)); Hits hits = searcher.search(q); if (hits.length() == 1) { Document doc = hits.doc(0); Field idField = doc.getField("u"); if (idField != null) { String id = idField.stringValue(); String[] splits = StringUtils.split(id, "|"); Dependency dep = new Dependency(); dep.setArtifactId(splits[1]); dep.setGroupId(splits[0]); dep.setVersion(splits[2]); dep.setType("jar"); if (splits.length > 3 && !"NA".equals(splits[3])) { dep.setClassifier(splits[3]); } deps.add(dep); added = true; } } } catch (Exception x) { x.printStackTrace(); } } if (!added) { ExternalsWrapper ex = new ExternalsWrapper(); ex.setFile(f); String artId = f.getName(); if (artId.endsWith(".jar")) { artId = artId.substring(0, artId.length() - ".jar".length()); } ex.setVersion(wrapper.getVersion()); ex.setArtifact(artId); ex.setGroupid("org.netbeans.external"); externalsList.add(ex); Dependency dep = new Dependency(); dep.setArtifactId(artId); dep.setGroupId("org.netbeans.external"); dep.setVersion(wrapper.getVersion()); dep.setType("jar"); deps.add(dep); } } } } wrapper.deps = deps; mavenModel.setDependencies(deps); FileWriter writer = null; File fil = null; try { MavenXpp3Writer xpp = new MavenXpp3Writer(); fil = File.createTempFile("maven", ".pom"); fil.deleteOnExit(); writer = new FileWriter(fil); xpp.write(writer, mavenModel); } catch (IOException ex) { ex.printStackTrace(); } finally { if (writer != null) { try { writer.close(); } catch (IOException io) { io.printStackTrace(); } } } return fil; } File createExternalProject(ExternalsWrapper wrapper) { Model mavenModel = new Model(); mavenModel.setGroupId(wrapper.getGroupid()); mavenModel.setArtifactId(wrapper.getArtifact()); mavenModel.setVersion(wrapper.getVersion()); mavenModel.setPackaging("jar"); mavenModel.setModelVersion("4.0.0"); mavenModel.setName( "Maven definition for " + wrapper.getFile().getName() + " - external part of NetBeans module."); mavenModel.setDescription( "POM and identification for artifact that was not possible to uniquely identify as a maven dependency."); FileWriter writer = null; File fil = null; try { MavenXpp3Writer xpp = new MavenXpp3Writer(); fil = File.createTempFile("maven", ".pom"); fil.deleteOnExit(); writer = new FileWriter(fil); xpp.write(writer, mavenModel); } catch (IOException ex) { ex.printStackTrace(); } finally { if (writer != null) { try { writer.close(); } catch (IOException io) { io.printStackTrace(); } } } return fil; } private File createClusterProject(Artifact cluster, Collection<ModuleWrapper> mods) { Model mavenModel = new Model(); mavenModel.setGroupId(cluster.getGroupId()); mavenModel.setArtifactId(cluster.getArtifactId()); mavenModel.setVersion(cluster.getVersion()); // mavenModel.setPackaging("nbm-application"); mavenModel.setPackaging("pom"); mavenModel.setModelVersion("4.0.0"); List<Dependency> deps = new ArrayList<Dependency>(); for (ModuleWrapper wr : mods) { Dependency dep = new Dependency(); dep.setArtifactId(wr.getArtifact()); dep.setGroupId(wr.getGroup()); dep.setVersion(wr.getVersion()); dep.setType("nbm-file"); deps.add(dep); } mavenModel.setDependencies(deps); // // // Build build = new Build(); // Plugin plg = new Plugin(); // plg.setGroupId("org.codehaus.mojo"); // plg.setArtifactId("nbm-maven-plugin"); // plg.setVersion("2.7-SNAPSHOT"); // plg.setExtensions(true); // build.addPlugin(plg); // mavenModel.setBuild(build); FileWriter writer = null; File fil = null; try { MavenXpp3Writer xpp = new MavenXpp3Writer(); fil = File.createTempFile("maven", ".pom"); fil.deleteOnExit(); writer = new FileWriter(fil); xpp.write(writer, mavenModel); } catch (IOException ex) { ex.printStackTrace(); } finally { IOUtil.close(writer); } return fil; } Artifact createArtifact(String artifact, String version, String group) { return artifactFactory.createBuildArtifact(group, artifact, version, "jar"); } private Artifact createClusterArtifact(String artifact, String version) { return artifactFactory.createBuildArtifact("org.netbeans.cluster", artifact, version, "pom"); } private static Pattern PATTERN_CLUSTER = Pattern.compile("([a-zA-Z]+)[0-9\\.]*"); static String stripClusterName(String key) { Matcher m = PATTERN_CLUSTER.matcher(key); if (m.matches()) { return m.group(1); } return key; } private class ExternalsWrapper { private File file; private String artifact; private String groupid; public String getArtifact() { return artifact; } public void setArtifact(String artifact) { this.artifact = artifact; } public File getFile() { return file; } public void setFile(File file) { this.file = file; } public String getGroupid() { return groupid; } public void setGroupid(String groupid) { this.groupid = groupid; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } private String version; } private class ModuleWrapper { ExamineManifest man; private String artifact; private String version; private String group; private File file; private String cluster; String module; List<Dependency> deps; public ModuleWrapper(String module) { this.module = module; } public ModuleWrapper(String art, String ver, String grp, ExamineManifest manifest, File fil) { man = manifest; artifact = art; version = ver; group = grp; file = fil; } public int hashCode() { return getModule().hashCode(); } public boolean equals(Object obj) { return getModule().equals(((ModuleWrapper) obj).getModule()); } public String getModule() { return module != null ? module : getModuleManifest().getModule(); } public ExamineManifest getModuleManifest() { return man; } private String getArtifact() { return artifact; } private String getVersion() { return version; } private String getGroup() { return group; } private File getFile() { return file; } void setCluster(String clust) { cluster = clust; } String getCluster() { return cluster; } } private static class NullOutputStream extends OutputStream { public void write(int b) throws IOException { } } /** * Encodes a 128 bit or 160-bit byte array into a String. * * @param binaryData Array containing the digest * @return Encoded hex string, or null if encoding failed */ private static String encode(byte[] binaryData) { if (binaryData.length != 16 && binaryData.length != 20) { int bitLength = binaryData.length * 8; throw new IllegalArgumentException("Unrecognised length for binary data: " + bitLength + " bits"); } String retValue = ""; for (int i = 0; i < binaryData.length; i++) { String t = Integer.toHexString(binaryData[i] & 0xff); if (t.length() == 1) { retValue += ("0" + t); } else { retValue += t; } } return retValue.trim(); } }