📄 bobberarchetype.java
字号:
/* * Copyright 2001-2005 The Apache Software Foundation. * * 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 com.javaforge.bobber.plugin.archetype;import com.javaforge.bobber.archetype.model.Template;import com.javaforge.bobber.archetype.model.Variable;import com.javaforge.bobber.archetype.model.io.xpp3.BobberArchetypeXpp3Reader;import java.io.File;import java.io.FileOutputStream;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.StringWriter;import java.io.Writer;import java.net.MalformedURLException;import java.net.URL;import java.net.URLClassLoader;import java.util.ArrayList;import java.util.Enumeration;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.StringTokenizer;import java.util.jar.JarEntry;import java.util.jar.JarFile;import java.util.zip.ZipEntry;import org.apache.maven.archetype.Archetype;import org.apache.maven.archetype.ArchetypeDescriptorException;import org.apache.maven.archetype.ArchetypeNotFoundException;import org.apache.maven.archetype.ArchetypeTemplateProcessingException;import org.apache.maven.artifact.Artifact;import org.apache.maven.artifact.factory.ArtifactFactory;import org.apache.maven.artifact.repository.ArtifactRepository;import org.apache.maven.artifact.resolver.ArtifactResolutionException;import org.apache.maven.artifact.resolver.ArtifactResolver;import org.apache.maven.settings.MavenSettingsBuilder;import org.apache.velocity.VelocityContext;import org.codehaus.plexus.components.interactivity.InputHandler;import org.codehaus.plexus.logging.AbstractLogEnabled;import org.codehaus.plexus.util.FileUtils;import org.codehaus.plexus.util.IOUtil;import org.codehaus.plexus.util.StringUtils;import org.codehaus.plexus.util.xml.pull.XmlPullParserException;import org.codehaus.plexus.velocity.VelocityComponent;//source blatantly copied from org.apache.maven.archetype.DefaultArchetype. Also stole code from DefaultPluginVersionManager.java//and maven-model for the mdopublic class BobberArchetype extends AbstractLogEnabled implements Archetype{ private static final String NEW_LINE = System.getProperty("line.separator"); // ---------------------------------------------------------------------- // Components // ---------------------------------------------------------------------- /** @component */ private VelocityComponent velocity; /** @component */ private ArtifactResolver artifactResolver; /** @component */ private InputHandler inputHandler; /** @component */ private ArtifactFactory artifactFactory; /** @component */ private MavenSettingsBuilder settingsBuilder; private static final int MESSAGE_LINE_LENGTH = 80; public void createArchetype(String archetypeGroupId, String archetypeArtifactId, String archetypeVersion, ArtifactRepository localRepository, List remoteRepositories, Map parameters) throws ArchetypeNotFoundException, ArchetypeDescriptorException, ArchetypeTemplateProcessingException { // --------------------------------------------------------------------- //locate the archetype file // --------------------------------------------------------------------- Artifact archetypeArtifact = artifactFactory.createArtifact(archetypeGroupId, archetypeArtifactId, archetypeVersion, Artifact.SCOPE_RUNTIME, "jar"); try { artifactResolver.resolve(archetypeArtifact, remoteRepositories, localRepository); } catch (ArtifactResolutionException e) { throw new ArchetypeDescriptorException("Error attempting to download archetype: " + e.getMessage(), e); } // ---------------------------------------------------------------------- // Load the archetype descriptor // ---------------------------------------------------------------------- BobberArchetypeXpp3Reader builder = new BobberArchetypeXpp3Reader(); com.javaforge.bobber.archetype.model.BobberArchetype archetype; JarFile archetypeJarFile; try { archetypeJarFile = new JarFile(archetypeArtifact.getFile()); final ZipEntry zipEntry = archetypeJarFile.getEntry(ARCHETYPE_DESCRIPTOR); InputStream is = archetypeJarFile.getInputStream(zipEntry); if (is == null) { throw new ArchetypeDescriptorException( "The " + ARCHETYPE_DESCRIPTOR + " descriptor cannot be found."); } archetype = builder.read(new InputStreamReader(is)); archetypeJarFile.close(); } catch (IOException e) { throw new ArchetypeDescriptorException("Error reading the " + ARCHETYPE_DESCRIPTOR + " descriptor.", e); } catch (XmlPullParserException e) { throw new ArchetypeDescriptorException("Error reading the " + ARCHETYPE_DESCRIPTOR + " descriptor.", e); } // ---------------------------------------------------------------------- // // ---------------------------------------------------------------------- String basedir = (String) parameters.get("basedir"); String artifactId = (String) parameters.get("artifactId"); File pomFile = new File(basedir, ARCHETYPE_POM); File outputDirectoryFile; if (pomFile.exists() && archetype.isAllowPartial()) { outputDirectoryFile = new File(basedir); } else { outputDirectoryFile = new File(basedir, artifactId); // TODO temporarily allow partial generation, remove it later if (!archetype.isAllowPartial() && outputDirectoryFile.exists() && outputDirectoryFile.listFiles().length > 0) { throw new ArchetypeTemplateProcessingException( outputDirectoryFile.getName() + " already exists - please run from a clean directory"); } outputDirectoryFile.mkdir(); } String outputDirectory = outputDirectoryFile.getAbsolutePath(); // ---------------------------------------------------------------------- // Set up the Velocity context // ---------------------------------------------------------------------- VelocityContext context = new VelocityContext(); String packageName = (String) parameters.get("package"); addParamToContext("package", packageName, context); addParamToContext("packagePath", StringUtils.replace(packageName, ".", "/"), context); for (Iterator iterator = parameters.keySet().iterator(); iterator.hasNext();) { String key = (String) iterator.next(); Object value = parameters.get(key); addParamToContext(key, value, context); } //add in the specified system properties //if this were a mojo could have set the settings using the ${settings} expression. Since it is not need to get it from the settings builder boolean inInteractiveMode = false; try { inInteractiveMode = settingsBuilder.buildSettings().getInteractiveMode().booleanValue(); //TODO there must be a cleaner way of doing this String temp = System.getProperty("interactive", null); if (temp != null) { inInteractiveMode = Boolean.valueOf(temp).booleanValue(); } getLogger().info("Interactive is: " + inInteractiveMode); } catch (Exception ie) { throw new ArchetypeTemplateProcessingException("unable to read settings ", ie); } if (inInteractiveMode) { getLogger().info("Please enter the values for the following archetype variables:"); } final List variables = archetype.getVariables(); processVariables(variables.iterator(), context, inInteractiveMode); // --------------------------------------------------------------------- // Get Logger and display all parameters used // --------------------------------------------------------------------- if (getLogger().isInfoEnabled()) { Object[] keys = context.getKeys(); if (keys.length > 0) { getLogger().info("----------------------------------------------------------------------------"); getLogger().info("Using following parameters for creating Archetype: " + archetypeArtifactId + ":" + archetypeVersion); getLogger().info("----------------------------------------------------------------------------"); for (int i = 0; i < keys.length; i++) { String parameterName = (String) keys[i]; Object parameterValue = context.get(parameterName); getLogger().info("Parameter: " + parameterName + " = " + parameterValue); } } else { getLogger().info("No Parameters found for creating Archetype"); } } // ---------------------------------------------------------------------- // Extract the archetype to the chosen directory // ---------------------------------------------------------------------- try { archetypeJarFile = new JarFile(archetypeArtifact.getFile()); Enumeration entries = archetypeJarFile.entries(); while (entries.hasMoreElements()) { JarEntry entry = (JarEntry) entries.nextElement(); String path = entry.getName(); if (!path.startsWith(ARCHETYPE_RESOURCES) || path.endsWith(".vm")) { continue; } File t = new File(outputDirectory, path.substring(19)); if (entry.isDirectory()) { // Assume directories are stored parents first then children. getLogger().debug("Extracting directory: " + entry.getName() + " to " + t.getAbsolutePath()); t.mkdir(); continue; } getLogger().debug("Extracting file: " + entry.getName() + " to " + t.getAbsolutePath()); t.createNewFile(); IOUtil.copy(archetypeJarFile.getInputStream(entry), new FileOutputStream(t)); } archetypeJarFile.close(); //remove the archetype descriptor File t = new File(outputDirectory, ARCHETYPE_DESCRIPTOR); t.delete(); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -