| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.apache.myfaces.buildtools.maven2.plugin.jdeveloper; |
| |
| import java.io.File; |
| import java.io.FileReader; |
| import java.io.FileWriter; |
| import java.io.IOException; |
| import java.io.InputStreamReader; |
| import java.io.Reader; |
| |
| import java.net.URL; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.Comparator; |
| import java.util.Enumeration; |
| import java.util.Iterator; |
| import java.util.LinkedHashSet; |
| import java.util.LinkedList; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Properties; |
| import java.util.Set; |
| import java.util.TreeMap; |
| import java.util.jar.JarEntry; |
| import java.util.jar.JarFile; |
| |
| import javax.xml.parsers.ParserConfigurationException; |
| |
| import org.apache.maven.artifact.Artifact; |
| import org.apache.maven.model.Dependency; |
| 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.codehaus.plexus.util.DirectoryScanner; |
| import org.codehaus.plexus.util.FileUtils; |
| import org.codehaus.plexus.util.IOUtil; |
| import org.codehaus.plexus.util.xml.Xpp3Dom; |
| import org.codehaus.plexus.util.xml.Xpp3DomBuilder; |
| import org.codehaus.plexus.util.xml.Xpp3DomWriter; |
| import org.codehaus.plexus.util.xml.pull.XmlPullParserException; |
| |
| import org.xml.sax.SAXException; |
| |
| /* |
| * Important informational note: |
| * |
| * The following XML code is similar to what would be seen in a pom file |
| * under the maven-jdev-plugin tag if Libraries (e.g. JSP Runtime |
| * and JSF 1.2) and Distributed Tag Libraries wanted to be added to the .jpr |
| * project. |
| * |
| * What you see below are the defaults that are put in a project's .jpr |
| * automatically without specifying anything. See replaceLibraries(), |
| * replaceTagLibraries() and replaceDefaultTagLibraries(). |
| * |
| * Also note that by setting the property "jdev.plugin.add.libraries" to |
| * false in a project's pom.xml file, no libraries will be added, default |
| * or otherwise. In kind, setting the property "jdev.plugin.add.taglibs" |
| * to false will result in no tag libraries of any kind being added. |
| * |
| * As you would expect, the default for both of these properties is "true". |
| * |
| * <plugin> |
| <groupId>org.apache.myfaces.trinidadbuild</groupId> |
| <artifactId>maven-jdev-plugin</artifactId> |
| <version>1.2.4-SNAPSHOT</version> |
| <inherited>true</inherited> |
| <configuration> |
| <libraries> |
| <library>JSP Runtime</library> |
| <library>JSF 1.2</library> |
| </libraries> |
| <distributedTagLibraries> |
| <distributedTagLibrary> |
| <property> |
| <name>name</name> |
| <value>JSF HTML</value> |
| </property> |
| <property> |
| <name>version</name> |
| <value>1.2</value> |
| </property> |
| <property> |
| <name>jspVersion</name> |
| <value>2.1</value> |
| </property> |
| <property> |
| <name>tld</name> |
| <value>html_basic.tld</value> |
| </property> |
| <property> |
| <name>URI</name> |
| <value>http://java.sun.com/jsf/html</value> |
| </property> |
| </distributedTagLibrary> |
| <distributedTagLibrary> |
| <property> |
| <name>name</name> |
| <value>JSF Core</value> |
| </property> |
| <property> |
| <name>version</name> |
| <value>1.2</value> |
| </property> |
| <property> |
| <name>jspVersion</name> |
| <value>2.1</value> |
| </property> |
| <property> |
| <name>tld</name> |
| <value>jsf_core.tld</value> |
| </property> |
| <property> |
| <name>URI</name> |
| <value>http://java.sun.com/jsf/core</value> |
| </property> |
| </distributedTagLibrary> |
| </distributedTagLibraries> |
| </configuration> |
| </plugin> |
| */ |
| |
| /** |
| * Generates the JDeveloper Workspace and Projects |
| * from a maven development environment. |
| * @version $Id$ |
| * @goal jdev |
| * @execute phase=process-resources |
| * @requiresDependencyResolution test |
| * @description Goal which generates the JDeveloper Workspace and Projects |
| * from a maven development environment. |
| */ |
| public class JDeveloperMojo |
| extends AbstractMojo |
| { |
| /** |
| * Libraries to include in Classpath. |
| * @parameter |
| */ |
| private String[] libraries; |
| |
| /** |
| * List of source root directories |
| * @parameter |
| */ |
| private File[] sourceRoots; |
| |
| /** |
| * List of source root directories for the test project |
| * @parameter |
| */ |
| private File[] testSourceRoots; |
| |
| /** |
| * List of resource root directories |
| * @parameter |
| */ |
| private File[] resourceRoots; |
| |
| /** |
| * List of resource root directories for the test project |
| * @parameter |
| */ |
| private File[] testResourceRoots; |
| |
| /** |
| * Force the Mojo to use the default project.xml or |
| * workspace.xml file to be used in creation of the |
| * workspace file (.jws) or project file (.jpr). Otherwise, |
| * if a .jws or .jpr exists, it will be used instead. |
| * @parameter expression="${force}" default-value=false |
| * |
| */ |
| private boolean force; |
| |
| /** |
| * Compiler to be used by JDeveloper. "Ojc" is the default. |
| * If this parameter is absent or anything other than "Javac", "Ojc" will |
| * be used. |
| * @parameter expression="${jdev.compiler}" default-value="Ojc" |
| */ |
| private String compiler; |
| |
| /** |
| * Make the entire project before each run. Running anything in the |
| * project will automatically trigger a make of the entire project |
| * followed by the run. |
| * @parameter expression="${jdev.make.project}" default-value="false" |
| */ |
| private boolean makeProject; |
| |
| /** |
| * Default file to be run when JDeveloper project is run. |
| * @parameter expression="${jdev.run.target}" |
| */ |
| private String runTarget; |
| |
| /** |
| * Create JDeveloper Workspace and Project Files that correspond to |
| * the format used |
| * @parameter expression="${jdev.release}" default-value="10.1.3.0.4" |
| */ |
| private String release; |
| |
| /** |
| * Name of the Maven Project |
| * @parameter expression="${project}" |
| * @required |
| * @readonly |
| */ |
| private MavenProject project; |
| |
| /** |
| * List of reactorProjects |
| * @parameter expression="${reactorProjects}" |
| * @required |
| * @readonly |
| */ |
| private List reactorProjects; |
| |
| /** |
| * Tag library directory used by each distributed tag library |
| * |
| * @parameter expression="${jdev.tag.lib.dir}" |
| * default-value="@oracle.home@lib/java/shared/oracle.jsf/1.2/jsf-ri.jar!/META-INF" |
| */ |
| private String tagLibDirectory; |
| |
| /** |
| * Tag libraries and their properties. |
| * @parameter |
| */ |
| private Properties[] distributedTagLibraries; |
| |
| /** |
| * Execute the Mojo. |
| */ |
| public void execute() |
| throws MojoExecutionException |
| { |
| _parseRelease(); |
| try |
| { |
| generateWorkspace(); |
| generateProject(); |
| generateTestProject(); |
| } |
| catch (IOException e) |
| { |
| throw new MojoExecutionException(e.getMessage()); |
| } |
| } |
| |
| private void generateWorkspace() |
| throws MojoExecutionException, IOException |
| { |
| if (!project.getCollectedProjects().isEmpty()) |
| { |
| getLog().info("Generating JDeveloper " + release + " workspace: " + |
| project.getArtifactId()); |
| |
| File workspaceFile = getJWorkspaceFile(project); |
| |
| try |
| { |
| Xpp3Dom workspaceDOM = readWorkspaceDOM(workspaceFile); |
| replaceProjects(workspaceFile.getParentFile(), workspaceDOM); |
| writeDOM(workspaceFile, workspaceDOM); |
| } |
| catch (XmlPullParserException e) |
| { |
| throw new MojoExecutionException("Error generating workspace", e); |
| } |
| } |
| } |
| |
| private void generateProject() |
| throws IOException, MojoExecutionException |
| { |
| if (!"pom".equals(project.getPackaging())) |
| { |
| File projectFile = getJProjectFile(project); |
| |
| // Get Project Properties to tell Mojo whether or not to add |
| // library refs and taglibs to the project. |
| Properties props = project.getProperties(); |
| String addLibs = (String)props.get(_PROPERTY_ADD_LIBRARY); |
| String addTagLibs = (String)props.get(_PROPERTY_ADD_TAGLIBS); |
| _addLibraries = (addLibs == null) |
| ? true : (new Boolean(addLibs)).booleanValue(); |
| _addTagLibs = (addTagLibs == null) |
| ? true : (new Boolean(addTagLibs)).booleanValue(); |
| |
| // TODO: read configuration for war:war goal |
| File webappDir = new File(project.getBasedir(), "src/main/webapp"); |
| // TODO: read configuration for compiler:complie goal |
| File outputDir = |
| new File(project.getBuild().getDirectory(), "classes"); |
| |
| MavenProject executionProject = project.getExecutionProject(); |
| List compileSourceRoots = executionProject.getCompileSourceRoots(); |
| if (sourceRoots != null) |
| { |
| for (int i = 0; i < sourceRoots.length; i++) |
| { |
| compileSourceRoots.add(sourceRoots[i].getAbsolutePath()); |
| } |
| } |
| |
| List compileResourceRoots = executionProject.getResources(); |
| if (resourceRoots != null) |
| { |
| for (int i = 0; i < resourceRoots.length; i++) |
| { |
| Resource resource = new Resource(); |
| resource.setDirectory(resourceRoots[i].getAbsolutePath()); |
| compileResourceRoots.add(resource); |
| } |
| } |
| |
| getLog().info("Generating JDeveloper " + release + " Project " + |
| project.getArtifactId()); |
| |
| Set pluginArtifacts = new LinkedHashSet(); |
| pluginArtifacts.addAll(project.getPluginArtifacts()); |
| |
| // Note: include "compile", "provided", "system" and "runtime" scopes |
| Set compileArtifacts = new LinkedHashSet(); |
| compileArtifacts.addAll(project.getCompileArtifacts()); |
| compileArtifacts.addAll(project.getRuntimeArtifacts()); |
| |
| // Note: separate "runtime" vs. "compile" dependencies in JDeveloper? |
| generateProject(projectFile, project.getArtifactId(), |
| project.getPackaging(), project.getDependencies(), |
| new ArrayList(compileArtifacts), compileSourceRoots, |
| compileResourceRoots, |
| Collections.singletonList(webappDir.getPath()), |
| outputDir); |
| } |
| } |
| |
| private void generateTestProject() |
| throws IOException, MojoExecutionException |
| { |
| if (!"pom".equals(project.getPackaging())) |
| { |
| File projectFile = getJProjectTestFile(project); |
| |
| // Get Project Properties to tell Mojo whether or not to add |
| // library refs and taglibs to the project. |
| Properties props = project.getProperties(); |
| String addLibs = (String)props.get(_PROPERTY_ADD_LIBRARY); |
| String addTagLibs = (String)props.get(_PROPERTY_ADD_TAGLIBS); |
| _addLibraries = (addLibs == null) |
| ? true : (new Boolean(addLibs)).booleanValue(); |
| _addTagLibs = (addTagLibs == null) |
| ? true : (new Boolean(addTagLibs)).booleanValue(); |
| File webappDir = new File(project.getBasedir(), "src/test/webapp"); |
| // TODO: read configuration for compiler:testCompile goal |
| File outputDir = |
| new File(project.getBuild().getDirectory(), "test-classes"); |
| |
| // self dependency needed for test project |
| List testDependencies = new ArrayList(project.getTestDependencies()); |
| Dependency selfDependency = new Dependency(); |
| selfDependency.setArtifactId(project.getArtifactId()); |
| selfDependency.setGroupId(project.getGroupId()); |
| selfDependency.setType(project.getPackaging()); |
| testDependencies.add(selfDependency); |
| |
| MavenProject executionProject = project.getExecutionProject(); |
| List compileSourceRoots = |
| executionProject.getTestCompileSourceRoots(); |
| |
| if (testSourceRoots != null) |
| { |
| for (int i = 0; i < testSourceRoots.length; i++) |
| { |
| compileSourceRoots.add(testSourceRoots[i].getAbsolutePath()); |
| } |
| } |
| |
| List compileResourceRoots = executionProject.getTestResources(); |
| if (testResourceRoots != null) |
| { |
| for (int i = 0; i < testResourceRoots.length; i++) |
| { |
| Resource resource = new Resource(); |
| resource.setDirectory(testSourceRoots[i].getAbsolutePath()); |
| compileResourceRoots.add(resource); |
| } |
| } |
| |
| getLog().info("Generating JDeveloper " + release + " Project " + |
| project.getArtifactId() + "-test"); |
| |
| // Note: all artifacts implicitly included in "test" scope |
| generateProject(projectFile, project.getArtifactId() + "-test", |
| project.getPackaging(), testDependencies, |
| project.getTestArtifacts(), compileSourceRoots, |
| compileResourceRoots, |
| Collections.singletonList(webappDir.getPath()), |
| outputDir); |
| } |
| } |
| |
| private void generateProject(File projectFile, String projectName, |
| String packaging, List dependencies, |
| List artifacts, List sourceRoots, |
| List resourceRoots, List webSourceRoots, |
| File outputDir) |
| throws IOException, MojoExecutionException |
| { |
| try |
| { |
| File projectDir = projectFile.getParentFile(); |
| Xpp3Dom projectDOM = readProjectDOM(projectFile); |
| replaceWebappInfo(projectName, projectDOM); |
| replaceSourcePaths(projectDir, sourceRoots, resourceRoots, |
| projectDOM); |
| //replaceResourcePaths(projectDir, resourceRoots, projectDOM); |
| replaceWebSourcePaths(projectDir, webSourceRoots, projectDOM); |
| replaceDependencies(projectDir, dependencies, projectDOM); |
| replaceLibraries(projectDir, artifacts, projectDOM); |
| replaceTagLibraries(projectDOM); |
| replaceOutputDirectory(projectDir, outputDir, projectDOM); |
| replaceParameters(projectName, projectDOM); |
| writeDOM(projectFile, projectDOM); |
| |
| if ("war".equals(packaging)) |
| { |
| copyTagLibraries(projectDir, dependencies, artifacts); |
| } |
| } |
| catch (XmlPullParserException e) |
| { |
| throw new MojoExecutionException("Error generating project", e); |
| } |
| } |
| |
| private void replaceProjects(File workspaceDir, Xpp3Dom workspaceDOM) |
| throws XmlPullParserException |
| { |
| // /jws:workspace |
| // /list[@n="listOfChildren"] |
| Xpp3Dom sourceDOM = workspaceDOM.getChild("list"); |
| |
| // <hash> |
| // <value n="nodeClass" v="oracle.jdeveloper.model.JProject"/> |
| // <url n="URL" path="[workspace-relative-path-to-project.jpr]"/> |
| // </hash> |
| Xpp3Dom targetDOM = new Xpp3Dom("list"); |
| |
| for (Iterator i = project.getCollectedProjects().iterator(); i.hasNext(); ) |
| { |
| MavenProject collectedProject = (MavenProject) i.next(); |
| |
| // if a child project is also a workspace, then don't |
| // put it in the .jws file. It will have its own .jws |
| // file. |
| if (!"pom".equals(collectedProject.getPackaging())) |
| { |
| File projectFile = getJProjectFile(collectedProject); |
| |
| targetDOM.addChild(createProjectReferenceDOM(workspaceDir, |
| projectFile)); |
| |
| File testProjectFile = getJProjectTestFile(collectedProject); |
| targetDOM.addChild(createProjectReferenceDOM(workspaceDir, |
| testProjectFile)); |
| } |
| } |
| |
| // TODO: use a better merge algorithm |
| removeChildren(sourceDOM); |
| |
| // make sure to pass Boolean.FALSE to allow |
| // multiple child elements with the same name |
| Xpp3Dom.mergeXpp3Dom(sourceDOM, targetDOM, Boolean.FALSE); |
| } |
| |
| private void replaceWebSourcePaths(File projectDir, List sourceRoots, |
| Xpp3Dom projectDOM) |
| throws XmlPullParserException |
| { |
| // /jpr:project |
| // /hash[@n="oracle.jdeveloper.model.J2eeSettings"] |
| // /hash[@n="webContentSet"] |
| // /list[@n="url-path"] |
| Xpp3Dom pathsDOM = |
| findNamedChild(projectDOM, "hash", "oracle.jdeveloper.model.J2eeSettings"); |
| Xpp3Dom contentSetDOM = |
| findNamedChild(pathsDOM, "hash", "webContentSet"); |
| Xpp3Dom sourceDOM = findNamedChild(contentSetDOM, "list", "url-path"); |
| |
| // |
| // <url path="[relative-path-to-source-root]" /> |
| // |
| Xpp3Dom targetDOM = new Xpp3Dom("list"); |
| for (Iterator i = sourceRoots.iterator(); i.hasNext(); ) |
| { |
| File sourceRoot = new File((String) i.next()); |
| String relativeRoot = getRelativeDir(projectDir, sourceRoot); |
| Xpp3Dom urlDOM = new Xpp3Dom("url"); |
| urlDOM.setAttribute("path", relativeRoot); |
| targetDOM.addChild(urlDOM); |
| } |
| |
| // TODO: use a better merge algorithm |
| removeChildren(sourceDOM); |
| |
| // make sure to pass Boolean.FALSE to allow |
| // multiple child elements with the same name |
| Xpp3Dom.mergeXpp3Dom(sourceDOM, targetDOM, Boolean.FALSE); |
| } |
| |
| private void replaceWebappInfo(String projectName, Xpp3Dom projectDOM) |
| throws XmlPullParserException |
| { |
| // /jpr:project |
| // /hash[@n="oracle.jdeveloper.model.J2eeSettings"] |
| // /value[@n="j2eeWebAppName" v="maven-generated-webapp"] |
| // /value[@n="j2eeWebContextRoot" v="maven-generated-context-root"] |
| Xpp3Dom settingsDOM = |
| findNamedChild(projectDOM, "hash", "oracle.jdeveloper.model.J2eeSettings"); |
| Xpp3Dom webappNameDOM = |
| findNamedChild(settingsDOM, "value", "j2eeWebAppName"); |
| Xpp3Dom webappContextDOM = |
| findNamedChild(settingsDOM, "value", "j2eeWebContextRoot"); |
| |
| // update the webapp name |
| webappNameDOM.setAttribute("v", projectName + "-webapp"); |
| |
| // update the webapp context root |
| webappContextDOM.setAttribute("v", projectName + "-context-root"); |
| } |
| |
| private void replaceSourcePaths(File projectDir, List sourceRoots, |
| List resourceRoots, Xpp3Dom projectDOM) |
| throws XmlPullParserException |
| { |
| // /jpr:project |
| // /hash[@n="oracle.jdeveloper.model.PathsConfiguration"] |
| // /hash[@n="javaContentSet"] |
| // /list[@n="url-path"] |
| Xpp3Dom pathsDOM = |
| findNamedChild(projectDOM, "hash", "oracle.jdeveloper.model.PathsConfiguration"); |
| Xpp3Dom contentSetDOM = |
| findNamedChild(pathsDOM, "hash", "javaContentSet"); |
| Xpp3Dom sourceDOM = findNamedChild(contentSetDOM, "list", "constituent-sets"); |
| |
| // |
| // <url path="[relative-path-to-source-root]" /> |
| // |
| Xpp3Dom targetDOM = new Xpp3Dom("list"); |
| |
| Collections.sort(sourceRoots); |
| for (Iterator i = sourceRoots.iterator(); i.hasNext(); ) |
| { |
| File sourceRoot = new File((String) i.next()); |
| Xpp3Dom hashDOM = new Xpp3Dom("hash"); |
| |
| Xpp3Dom listDOM = new Xpp3Dom("list"); |
| listDOM.setAttribute("n", "pattern-filters"); |
| hashDOM.addChild(listDOM); |
| |
| Xpp3Dom stringDOM = new Xpp3Dom("string"); |
| stringDOM.setAttribute("v", "+**"); |
| listDOM.addChild(stringDOM); |
| |
| listDOM = new Xpp3Dom("list"); |
| listDOM.setAttribute("n", "url-path"); |
| hashDOM.addChild(listDOM); |
| |
| String relativeRoot = getRelativeDir(projectDir, sourceRoot); |
| Xpp3Dom urlDOM = new Xpp3Dom("url"); |
| urlDOM.setAttribute("path", relativeRoot); |
| listDOM.addChild(urlDOM); |
| |
| targetDOM.addChild(hashDOM); |
| } |
| |
| // TODO: get bug fixed in 10.1.3 for copying resources |
| Collections.sort(resourceRoots, new Comparator() |
| { |
| public int compare(Object a, Object b) |
| { |
| Resource ra = (Resource) a; |
| Resource rb = (Resource) b; |
| return ra.getDirectory().compareTo(rb.getDirectory()); |
| } |
| |
| }); |
| |
| for (Iterator i = resourceRoots.iterator(); i.hasNext(); ) |
| { |
| Resource resource = (Resource) i.next(); |
| File resourceRoot = new File(resource.getDirectory()); |
| String relativeRoot = getRelativeDir(projectDir, resourceRoot); |
| |
| Xpp3Dom hashDOM = new Xpp3Dom("hash"); |
| |
| Xpp3Dom listDOM = new Xpp3Dom("list"); |
| listDOM.setAttribute("n", "pattern-filters"); |
| hashDOM.addChild(listDOM); |
| |
| Xpp3Dom stringDOM = null; |
| // TODO: This is a Hack for excluding the golden files, |
| // which are not really xml files. We need a way, in |
| // the pom file to specify excludes. |
| if (relativeRoot.startsWith("src/test/resources")) |
| { |
| stringDOM = new Xpp3Dom("string"); |
| stringDOM.setAttribute("v", |
| "-oracle/adfinternal/view/faces/renderkit/golden/"); |
| listDOM.addChild(stringDOM); |
| } |
| |
| stringDOM = new Xpp3Dom("string"); |
| stringDOM.setAttribute("v", "+**"); |
| listDOM.addChild(stringDOM); |
| |
| listDOM = new Xpp3Dom("list"); |
| listDOM.setAttribute("n", "url-path"); |
| hashDOM.addChild(listDOM); |
| |
| Xpp3Dom urlDOM = new Xpp3Dom("url"); |
| urlDOM.setAttribute("path", relativeRoot); |
| listDOM.addChild(urlDOM); |
| |
| targetDOM.addChild(hashDOM); |
| } |
| |
| // TODO: use a better merge algorithm |
| removeChildren(sourceDOM); |
| |
| // make sure to pass Boolean.FALSE to allow |
| // multiple child elements with the same name |
| Xpp3Dom.mergeXpp3Dom(sourceDOM, targetDOM, Boolean.FALSE); |
| } |
| |
| private void replaceResourcePaths(File projectDir, List resourceRoots, |
| Xpp3Dom projectDOM) |
| throws XmlPullParserException |
| { |
| // /jpr:project |
| // /hash[@n="oracle.ide.model.ResourcePaths"] |
| // /hash[@n="resourcesContentSet"] |
| // /list[@n="url-path"] |
| |
| Xpp3Dom pathsDOM = |
| findNamedChild(projectDOM, "hash", "oracle.ide.model.ResourcePaths"); |
| Xpp3Dom contentSetDOM = |
| findNamedChild(pathsDOM, "hash", "resourcesContentSet"); |
| Xpp3Dom sourceDOM = findNamedChild(contentSetDOM, "list", "url-path"); |
| |
| // |
| // <url path="[relative-path-to-source-root]" /> |
| // |
| Xpp3Dom targetDOM = new Xpp3Dom("list"); |
| for (Iterator i = resourceRoots.iterator(); i.hasNext(); ) |
| { |
| Resource resource = (Resource) i.next(); |
| File resourceRoot = new File(resource.getDirectory()); |
| String relativeRoot = getRelativeDir(projectDir, resourceRoot); |
| Xpp3Dom urlDOM = new Xpp3Dom("url"); |
| urlDOM.setAttribute("path", relativeRoot); |
| targetDOM.addChild(urlDOM); |
| } |
| |
| // TODO: use a better merge algorithm |
| removeChildren(sourceDOM); |
| |
| // make sure to pass Boolean.FALSE to allow |
| // multiple child elements with the same name |
| Xpp3Dom.mergeXpp3Dom(sourceDOM, targetDOM, Boolean.FALSE); |
| } |
| |
| private void replaceDependencies(File projectDir, List dependencies, |
| Xpp3Dom projectDOM) |
| throws XmlPullParserException |
| { |
| // /jpr:project |
| // /hash[@n="oracle.ide.model.DependencyConfiguration"] |
| // /list[@n="dependencyList"] |
| Xpp3Dom configDOM = |
| findNamedChild(projectDOM, "hash", "oracle.ide.model.DependencyConfiguration"); |
| Xpp3Dom sourceDOM = |
| findNamedChild(configDOM, "list", "dependencyList"); |
| |
| Xpp3Dom targetDOM = new Xpp3Dom("list"); |
| for (Iterator i = dependencies.iterator(); i.hasNext(); ) |
| { |
| Dependency dependency = (Dependency) i.next(); |
| MavenProject dependentProject = |
| findDependentProject(dependency.getManagementKey()); |
| if (dependentProject != null) |
| { |
| File dependentProjectFile = getJProjectFile(dependentProject); |
| String relativePath = |
| getRelativeFile(projectDir, dependentProjectFile); |
| |
| Xpp3Dom hashDOM = new Xpp3Dom("hash"); |
| Xpp3Dom valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "class"); |
| valueDOM.setAttribute("v", |
| "oracle.jdeveloper.library.ProjectLibrary"); |
| Xpp3Dom srcOwnValDOM = new Xpp3Dom("value"); |
| srcOwnValDOM.setAttribute("n", "sourceOwnerURL"); |
| Xpp3Dom urlDOM = new Xpp3Dom("url"); |
| urlDOM.setAttribute("n", "sourceURL"); |
| urlDOM.setAttribute("path", relativePath); |
| hashDOM.addChild(valueDOM); |
| hashDOM.addChild(srcOwnValDOM); |
| hashDOM.addChild(urlDOM); |
| targetDOM.addChild(hashDOM); |
| } |
| } |
| |
| // TODO: use a better merge algorithm |
| removeChildren(sourceDOM); |
| |
| // make sure to pass Boolean.FALSE to allow |
| // multiple child elements with the same name |
| Xpp3Dom.mergeXpp3Dom(sourceDOM, targetDOM, Boolean.FALSE); |
| } |
| |
| private void replaceLibraries(File projectDir, List artifacts, |
| Xpp3Dom projectDOM) |
| throws XmlPullParserException |
| { |
| // /jpr:project |
| // /hash[@n="oracle.jdevimpl.config.JProjectLibraries"] |
| // /hash[@n="internalDefinitions"] |
| // /list[@n="libraryDefinitions"] |
| Xpp3Dom projectLibsDOM = |
| findNamedChild(projectDOM, "hash", "oracle.jdevimpl.config.JProjectLibraries"); |
| Xpp3Dom internalDefsDOM = |
| findNamedChild(projectLibsDOM, "hash", "internalDefinitions"); |
| Xpp3Dom sourceDefsDOM = |
| findNamedChild(internalDefsDOM, "list", "libraryDefinitions"); |
| |
| // /jpr:project |
| // /hash[@n="oracle.jdevimpl.config.JProjectLibraries"] |
| // /list[@n="libraryReferences"] |
| Xpp3Dom sourceRefsDOM = |
| findNamedChild(projectLibsDOM, "list", "libraryReferences"); |
| |
| Xpp3Dom targetDefsDOM = new Xpp3Dom("list"); |
| Xpp3Dom targetRefsDOM = new Xpp3Dom("list"); |
| |
| // |
| // libraryDefinitions |
| // |
| // <hash> |
| // <list n="classPath"> |
| // <url path="[path-to-artifact]" jar-entry="" /> |
| // </list> |
| // <value n="deployedByDefault" v="true"/> |
| // <value n="description" v="[artifact.id]"/> |
| // <value n="id" v="[artifact.id]"/> |
| // </hash> |
| // |
| |
| // sort the artifacts |
| Collections.sort(artifacts, new Comparator() |
| { |
| public int compare(Object a, Object b) |
| { |
| Artifact arta = (Artifact) a; |
| Artifact artb = (Artifact) b; |
| return arta.getId().compareTo(artb.getId()); |
| } |
| |
| }); |
| |
| List libraryRefs = new LinkedList(); |
| for (Iterator i = artifacts.iterator(); i.hasNext(); ) |
| { |
| Artifact artifact = (Artifact) i.next(); |
| |
| if (!isDependentProject(artifact.getDependencyConflictId())) |
| { |
| String id = artifact.getId(); |
| String path = getRelativeFile(projectDir, artifact.getFile()); |
| |
| // libraryDefinitions entry |
| Xpp3Dom hashDOM = new Xpp3Dom("hash"); |
| Xpp3Dom listDOM = new Xpp3Dom("list"); |
| listDOM.setAttribute("n", "classPath"); |
| |
| Xpp3Dom urlDOM = new Xpp3Dom("url"); |
| urlDOM.setAttribute("path", path); |
| urlDOM.setAttribute("jar-entry", ""); |
| listDOM.addChild(urlDOM); |
| hashDOM.addChild(listDOM); |
| |
| Xpp3Dom valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "deployedByDefault"); |
| valueDOM.setAttribute("v", "true"); |
| hashDOM.addChild(valueDOM); |
| |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "description"); |
| valueDOM.setAttribute("v", id); |
| hashDOM.addChild(valueDOM); |
| |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "id"); |
| valueDOM.setAttribute("v", id); |
| hashDOM.addChild(valueDOM); |
| targetDefsDOM.addChild(hashDOM); |
| |
| libraryRefs.add(id); |
| } |
| } |
| |
| // This boolean is set by specifying the jdev.plugin.add.libraries |
| // property at the top of a project's pom file. There are projects |
| // that don't need these libraries in their .jpr files to compile and this |
| // property allows them to be excluded. |
| // |
| // IMPORTANT NOTE: if this property is set in a project, |
| // then libraries will NOT be added, even though they |
| // may be specified under the maven-jdev-plugin. |
| if (_addLibraries) |
| { |
| // Add libraries. The default libraries can be |
| // overridden in the trunk/toplevel pom file. |
| if (_releaseMajor >= 11) |
| { |
| // Add the default libraries |
| libraryRefs.add(0,"JSF 1.2"); |
| libraryRefs.add(0,"JSP Runtime"); |
| } |
| |
| // Add the libraries |
| if (libraries != null) |
| { |
| for (int i = 0; i < libraries.length; i++) |
| { |
| // Default libraries for release 11 were already |
| // added above. |
| if ( (_releaseMajor >= 11) |
| && ( ("JSF 1.2".equalsIgnoreCase(libraries[i])) |
| || ("JSP Runtime".equalsIgnoreCase(libraries[i])) |
| ) |
| ) |
| { |
| continue; |
| } |
| // Add the library |
| libraryRefs.add(0, libraries[i]); |
| } |
| } |
| } |
| |
| // |
| // libraryReferences |
| // |
| // <hash> |
| // <value n="id" v="[artifact.id]"/> |
| // <value n="isJDK" v="false"/> |
| // </hash> |
| // |
| Collections.sort(libraryRefs); |
| |
| for (Iterator i = libraryRefs.iterator(); i.hasNext(); ) |
| { |
| String id = (String) i.next(); |
| |
| // libraryReferences entry |
| Xpp3Dom hashDOM = new Xpp3Dom("hash"); |
| Xpp3Dom valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "id"); |
| valueDOM.setAttribute("v", id); |
| hashDOM.addChild(valueDOM); |
| |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "isJDK"); |
| valueDOM.setAttribute("v", "false"); |
| hashDOM.addChild(valueDOM); |
| targetRefsDOM.addChild(hashDOM); |
| } |
| |
| // First, add JSP Runtime dependency if src/main/webapp exists |
| // TODO: use a better merge algorithm |
| removeChildren(sourceDefsDOM); |
| removeChildren(sourceRefsDOM); |
| |
| // make sure to pass Boolean.FALSE to allow |
| // multiple child elements with the same name |
| Xpp3Dom.mergeXpp3Dom(sourceDefsDOM, targetDefsDOM, Boolean.FALSE); |
| Xpp3Dom.mergeXpp3Dom(sourceRefsDOM, targetRefsDOM, Boolean.FALSE); |
| } |
| |
| private void replaceLocalTagLibraries(Xpp3Dom targetLibsDOM) |
| throws XmlPullParserException |
| { |
| TldContentHandler tldHandler = new TldContentHandler(); |
| String path = null; |
| |
| // Loop through all the .tld files in the WEB-INF dir |
| // Parse each and get the values needed for the TagLibraries |
| // hash in the .jpr file. |
| try |
| { |
| File webInfDir = |
| new File(project.getBasedir(), "src/main/webapp/WEB-INF"); |
| if (webInfDir == null) |
| { |
| return; |
| } |
| |
| File[] files = webInfDir.listFiles(); |
| if (files == null) |
| { |
| return; |
| } |
| |
| Xpp3Dom hashDOM = null; |
| Xpp3Dom valueDOM = null; |
| for (int i = 0; i < files.length; i++) |
| { |
| path = files[i].getPath(); |
| if (path.endsWith(".tld")) |
| { |
| hashDOM = new Xpp3Dom("hash"); |
| // we have a tag library. Parse it and |
| // get the values needed for the .jpr file |
| |
| // Parse |
| tldHandler.parseTld(files[i]); |
| // call gettors to get the values |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "jspVersion"); |
| valueDOM.setAttribute("v", tldHandler.getJspVersion()); |
| hashDOM.addChild(valueDOM); |
| |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "name"); |
| valueDOM.setAttribute("v", tldHandler.getName()); |
| hashDOM.addChild(valueDOM); |
| |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "prefix"); |
| valueDOM.setAttribute("v", tldHandler.getPrefix()); |
| hashDOM.addChild(valueDOM); |
| |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "tldURL"); |
| valueDOM.setAttribute("v", |
| "WEB-INF/" + path.substring(path.indexOf("WEB-INF") + 8)); |
| hashDOM.addChild(valueDOM); |
| |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "URI"); |
| valueDOM.setAttribute("v", tldHandler.getURI()); |
| hashDOM.addChild(valueDOM); |
| |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "version"); |
| valueDOM.setAttribute("v", tldHandler.getVersion()); |
| hashDOM.addChild(valueDOM); |
| |
| // Add each file's hash to the tag-libraries "list" |
| targetLibsDOM.addChild(hashDOM); |
| } // endif |
| } // endfor |
| return; |
| } |
| catch (SAXException saxex) |
| { |
| getLog().info("SAX Parse Exception parsing " + path + ": " + |
| saxex.getMessage(), saxex); |
| } |
| catch (IOException ioe) |
| { |
| getLog().info("Unable to open an InputStream to " + path, ioe); |
| } |
| catch (ParserConfigurationException pce) |
| { |
| getLog().info("Unable to create SAX parser for " + path, pce); |
| } |
| } |
| |
| |
| private void replaceTagLibraries(Xpp3Dom projectDOM) |
| throws XmlPullParserException |
| { |
| // This boolean is set by specifying the jdev.plugin.add.taglibs |
| // property at the top of a project's pom file. There are projects |
| // that don't need taglibs in their .jpr files to compile and this |
| // allows them to be excluded. |
| if (!_addTagLibs) |
| { |
| return; |
| } |
| |
| // /jpr:project |
| // /hash[@n="oracle.jdevimpl.webapp.jsp.libraries.model.ProjectTagLibraries"] |
| // /list[@n="tag-libaries"] |
| Xpp3Dom projectTagsDOM = |
| findNamedChild(projectDOM, "hash", "oracle.jdevimpl.webapp.jsp.libraries.model.ProjectTagLibraries"); |
| Xpp3Dom tagLibsDOM = |
| findNamedChild(projectTagsDOM, "list", "tag-libraries"); |
| |
| Xpp3Dom targetLibsDOM = new Xpp3Dom("list"); |
| |
| // |
| // tagLibraryDefinitions |
| // |
| //<hash> |
| // <hash n="baseLibrary"> |
| // <value n="name" v="JSF HTML"></value> |
| // <value n="version" v="1.2"></value> |
| // </hash> |
| // <value n="jspVersion" v="2.1"></value> |
| // <value n="name" v="JSF HTML"></value> |
| // |
| // <value n="tldURL" v="@oracle.home@lib/java/shared/oracle.jsf/1.2/jsf-ri.jar!/META-INF/html_basic.tld"></value> |
| // <value n="URI" v="http://java.sun.com/jsf/html"></value> |
| // <value n="version" v="1.2"></value> |
| //</hash> |
| // |
| |
| // Parent "hash" |
| Xpp3Dom hashDOM = null; |
| |
| // <value... |
| Xpp3Dom valueDOM = null; |
| |
| if (distributedTagLibraries != null && |
| distributedTagLibraries.length > 0) |
| { |
| // Process each distributed Tag Library |
| for (int i = 0; i < distributedTagLibraries.length; i++) |
| { |
| Properties disTagLib = distributedTagLibraries[i]; |
| String nameName = null; |
| String nameValue = null; |
| String versionName = null; |
| String versionValue = null; |
| |
| // Create parent hash for each taglib |
| hashDOM = new Xpp3Dom("hash"); |
| |
| // baseLibrary "hash" for each taglib |
| Xpp3Dom hashBaseDOM = new Xpp3Dom("hash"); |
| hashBaseDOM.setAttribute("n", "baseLibrary"); |
| // Add baseLibrary hash to parent hash |
| hashDOM.addChild(hashBaseDOM); |
| |
| // Process each property of the taglib |
| for (Enumeration keys = disTagLib.propertyNames(); |
| keys.hasMoreElements(); ) |
| { |
| // Get the name value pair |
| String name = (String) keys.nextElement(); |
| String value = (String) disTagLib.get(name); |
| |
| // Put the name and version values |
| // inside the baseLibrary hash. |
| // This only happens once per taglib |
| if ("name".equals(name)) |
| { |
| nameName = name; |
| nameValue = value; |
| |
| // n="name, v=<name of taglib> in baseLibrary |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", name); |
| valueDOM.setAttribute("v", value); |
| hashBaseDOM.addChild(valueDOM); |
| |
| // Duplicate the "name" <value... |
| // outside of the baseLibrary |
| // n="name, v=<name of taglib> in parent hash |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", nameName); |
| valueDOM.setAttribute("v", nameValue); |
| hashDOM.addChild(valueDOM); |
| } |
| else if ("version".equals(name)) |
| { |
| versionName = name; |
| versionValue = value; |
| |
| // n="version" v=<taglib version> in baseLibrary |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", name); |
| valueDOM.setAttribute("v", value); |
| hashBaseDOM.addChild(valueDOM); |
| |
| // Duplicate the "version" <value... |
| // outside of the baseLibrary |
| // n="version" v=<taglib version> in parent hash |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", versionName); |
| valueDOM.setAttribute("v", versionValue); |
| hashDOM.addChild(valueDOM); |
| } |
| else |
| { |
| if ("tld".equals(name)) |
| { |
| // Did not want to have a URL in the pom file. |
| // I just wanted the user to specify the name |
| // of the tld file. So we fix it for JDev |
| // here. |
| name += "URL"; |
| value = tagLibDirectory + "/" + value; |
| } |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", name); |
| valueDOM.setAttribute("v", value); |
| hashDOM.addChild(valueDOM); |
| } |
| } //endfor processing each property |
| |
| // We are done with this disTagLib |
| // Add it to the targetLibsDOM |
| if (hashDOM != null) |
| { |
| targetLibsDOM.addChild(hashDOM); |
| } |
| } // endfor processing each distributed tag lib |
| } //endif |
| else |
| { |
| // Use Default tag library configuration. See comment before |
| // replaceTagLibraries. |
| replaceDefaultTagLibraries(projectDOM, targetLibsDOM); |
| } |
| |
| replaceLocalTagLibraries(targetLibsDOM); |
| |
| // First, add JSP Runtime dependency if src/main/webapp exists |
| // TODO: use a better merge algorithm |
| removeChildren(tagLibsDOM); |
| |
| // make sure to pass Boolean.FALSE to allow |
| // multiple child elements with the same name |
| Xpp3Dom.mergeXpp3Dom(tagLibsDOM, targetLibsDOM, Boolean.FALSE); |
| } |
| |
| private void replaceDefaultTagLibraries(Xpp3Dom projectDOM, |
| Xpp3Dom targetLibsDOM) |
| throws XmlPullParserException |
| { |
| // Begin JSF HTML Tag lib |
| Xpp3Dom hashDOM = new Xpp3Dom("hash"); |
| Xpp3Dom hashBaseDOM = new Xpp3Dom("hash"); |
| Xpp3Dom valueDOM = null; |
| |
| hashBaseDOM.setAttribute("n", "baseLibrary"); |
| |
| // Add baseLibrary hash to parent hash |
| hashDOM.addChild(hashBaseDOM); |
| |
| // Create parent hash for each taglib |
| // hashDOM = new Xpp3Dom("hash"); |
| |
| // baseLibrary "hash" for each taglib |
| // Xpp3Dom hashBaseDOM = new Xpp3Dom("hash"); |
| // hashBaseDOM.setAttribute("n", "baseLibrary"); |
| |
| // n="name, v=<name of taglib> in baseLibrary |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "name"); |
| valueDOM.setAttribute("v", "JSF HTML"); |
| hashBaseDOM.addChild(valueDOM); |
| |
| // Duplicate the "name" <value... |
| // outside of the baseLibrary |
| // n="name, v=<name of taglib> in parent hash |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "name"); |
| valueDOM.setAttribute("v", "JSF HTML"); |
| hashDOM.addChild(valueDOM); |
| |
| // n="version" v=<taglib version> in baseLibrary |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "version"); |
| valueDOM.setAttribute("v", "1.2"); |
| hashBaseDOM.addChild(valueDOM); |
| |
| // Duplicate the "version" <value... |
| // outside of the baseLibrary |
| // n="name, v=<name of taglib> in parent hash |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "version"); |
| valueDOM.setAttribute("v", "1.2"); |
| hashDOM.addChild(valueDOM); |
| |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "jspVersion"); |
| valueDOM.setAttribute("v", "2.1"); |
| hashDOM.addChild(valueDOM); |
| |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "tldURL"); |
| valueDOM.setAttribute("v", tagLibDirectory + "/html_basic.tld"); |
| hashDOM.addChild(valueDOM); |
| |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "URI"); |
| valueDOM.setAttribute("v", "http://java.sun.com/jsf/html"); |
| hashDOM.addChild(valueDOM); |
| |
| // We are done with this disTagLib |
| // Add it to the targetLibsDOM |
| if (hashDOM != null) |
| { |
| targetLibsDOM.addChild(hashDOM); |
| } |
| |
| // Begin JSF Core Taglib |
| hashDOM = new Xpp3Dom("hash"); |
| hashBaseDOM = new Xpp3Dom("hash"); |
| |
| hashBaseDOM.setAttribute("n", "baseLibrary"); |
| |
| // Add baseLibrary hash to parent hash |
| hashDOM.addChild(hashBaseDOM); |
| |
| // n="name, v=<name of taglib> in baseLibrary |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "name"); |
| valueDOM.setAttribute("v", "JSF Core"); |
| hashBaseDOM.addChild(valueDOM); |
| |
| // Duplicate the "name" <value... |
| // outside of the baseLibrary |
| // n="name, v=<name of taglib> in parent hash |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "name"); |
| valueDOM.setAttribute("v", "JSF Core"); |
| hashDOM.addChild(valueDOM); |
| |
| // n="version" v=<taglib version> in baseLibrary |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "version"); |
| valueDOM.setAttribute("v", "1.2"); |
| hashBaseDOM.addChild(valueDOM); |
| |
| // Duplicate the "version" <value... |
| // outside of the baseLibrary |
| // n="name, v=<name of taglib> in parent hash |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "version"); |
| valueDOM.setAttribute("v", "1.2"); |
| hashDOM.addChild(valueDOM); |
| |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "jspVersion"); |
| valueDOM.setAttribute("v", "2.1"); |
| hashDOM.addChild(valueDOM); |
| |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "tldURL"); |
| valueDOM.setAttribute("v", tagLibDirectory + "/jsf_core.tld"); |
| hashDOM.addChild(valueDOM); |
| |
| valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "URI"); |
| valueDOM.setAttribute("v", "http://java.sun.com/jsf/core"); |
| hashDOM.addChild(valueDOM); |
| |
| // We are done with this disTagLib |
| // Add it to the targetLibsDOM |
| if (hashDOM != null) |
| { |
| targetLibsDOM.addChild(hashDOM); |
| } |
| } |
| |
| private void replaceParameters(String projectName, Xpp3Dom projectDOM) |
| throws XmlPullParserException |
| { |
| if ((_releaseMajor >= 11) && (projectName != null)) |
| { |
| replaceCompiler(projectDOM); |
| replaceMakeProjectAndRunTarget(projectDOM); |
| } |
| } |
| private void replaceCompiler(Xpp3Dom projectDOM) |
| throws XmlPullParserException |
| { |
| // /jpr:project |
| // <hash n="oracle.jdeveloper.compiler.OjcConfiguration"> |
| // <value n="assertionsEnabled" v="true"/> |
| // <value n="compiler.name" v="Ojc"/> |
| // <list n="copyRes"> |
| // <string v=".java"/> |
| Xpp3Dom configDOM = |
| findNamedChild(projectDOM, "hash", |
| "oracle.jdeveloper.compiler.OjcConfiguration"); |
| Xpp3Dom compilerDOM = findNamedChild(configDOM, "value", "compiler.name"); |
| String compilerValue = "Ojc"; |
| |
| if ( (compiler != null) |
| && "Javac".equalsIgnoreCase(compiler) |
| ) |
| { |
| compilerValue = "Javac"; |
| } |
| compilerDOM.setAttribute("v", compilerValue); |
| |
| return; |
| } |
| |
| private void replaceMakeProjectAndRunTarget(Xpp3Dom projectDOM) |
| throws XmlPullParserException |
| { |
| // /jpr:project |
| // /hash[@n="oracle.jdeveloper.runner.RunConfigurations"] |
| // /hash[@n="runConfigurationDefinitions"] |
| // /hash[@n="Default"] |
| // /value[@n="makeProject" v="false"] |
| // /url[@n="targetURL" path="src/main/webapp/index.jspx"] |
| Xpp3Dom configDOM = |
| findNamedChild(projectDOM, "hash", |
| "oracle.jdeveloper.runner.RunConfigurations"); |
| Xpp3Dom defsDOM = |
| findNamedChild(configDOM, "hash", "runConfigurationDefinitions"); |
| Xpp3Dom defaultDOM = findNamedChild(defsDOM, "hash", "Default"); |
| Xpp3Dom makeProjectDom = |
| findNamedChild(defaultDOM, "value", "compileBeforeRun"); |
| |
| if (makeProject) |
| { |
| makeProjectDom.setAttribute("v", "true"); |
| } |
| else |
| { |
| makeProjectDom.setAttribute("v", "false"); |
| } |
| |
| if ((runTarget != null) && !"".equals(runTarget)) |
| { |
| // Convert file separator chars to generic |
| String targetURL = ""; |
| if (File.separatorChar == '/') |
| { |
| targetURL = runTarget.replace('\\', '/'); // Unix |
| } |
| else |
| { |
| targetURL = runTarget.replace('/', '\\'); // Windows |
| } |
| |
| Xpp3Dom targetDOM = new Xpp3Dom("url"); |
| targetDOM.setAttribute("path", targetURL); |
| targetDOM.setAttribute("n", "targetURL"); |
| defaultDOM.addChild(targetDOM); |
| } |
| |
| return; |
| } |
| |
| private void copyTagLibraries(File projectDir, List dependencies, |
| List artifacts) |
| throws IOException |
| { |
| File targetDir = new File(projectDir, "src/main/webapp/WEB-INF"); |
| |
| for (Iterator i = dependencies.iterator(); i.hasNext(); ) |
| { |
| Dependency dependency = (Dependency) i.next(); |
| MavenProject dependentProject = |
| findDependentProject(dependency.getManagementKey()); |
| if (dependentProject != null) |
| { |
| List resourceRoots = dependentProject.getResources(); |
| for (Iterator j = resourceRoots.iterator(); j.hasNext(); ) |
| { |
| Resource resource = (Resource) j.next(); |
| String resourceRoot = resource.getDirectory(); |
| File resourceDirectory = new File(resourceRoot); |
| if (resourceDirectory.exists()) |
| { |
| DirectoryScanner scanner = new DirectoryScanner(); |
| scanner.setBasedir(resourceRoot); |
| scanner.addDefaultExcludes(); |
| scanner.setIncludes(new String[] |
| { "META-INF/*.tld" }); |
| scanner.scan(); |
| |
| String[] tldFiles = scanner.getIncludedFiles(); |
| for (int k = 0; k < tldFiles.length; k++) |
| { |
| File sourceFile = new File(resourceDirectory, tldFiles[k]); |
| File targetFile = new File(targetDir, sourceFile.getName()); |
| |
| if (targetFile.exists()) |
| { |
| targetFile.delete(); |
| } |
| FileUtils.copyFile(sourceFile, targetFile); |
| } |
| } |
| } |
| } |
| } |
| |
| |
| Map sourceMap = new TreeMap(); |
| |
| for (Iterator i = artifacts.iterator(); i.hasNext(); ) |
| { |
| Artifact artifact = (Artifact) i.next(); |
| if (!isDependentProject(artifact.getDependencyConflictId()) && |
| "jar".equals(artifact.getType())) |
| { |
| File file = artifact.getFile(); |
| JarFile jarFile = new JarFile(file); |
| Enumeration jarEntries = jarFile.entries(); |
| while (jarEntries.hasMoreElements()) |
| { |
| JarEntry jarEntry = (JarEntry) jarEntries.nextElement(); |
| String name = jarEntry.getName(); |
| if (name.startsWith("META-INF/") && name.endsWith(".tld")) |
| { |
| List taglibs = (List) sourceMap.get(name); |
| if (taglibs == null) |
| { |
| taglibs = new ArrayList(); |
| sourceMap.put(name, taglibs); |
| } |
| |
| taglibs.add(file); |
| } |
| } |
| } |
| } |
| |
| for (Iterator i = sourceMap.entrySet().iterator(); i.hasNext(); ) |
| { |
| Map.Entry e = (Map.Entry) i.next(); |
| List taglibs = (List) e.getValue(); |
| String name = (String) e.getKey(); |
| |
| for (Iterator ti = taglibs.iterator(); ti.hasNext(); ) |
| { |
| File file = (File) ti.next(); |
| File sourceFile = new File(name); |
| StringBuffer buff = new StringBuffer(sourceFile.getName()); |
| if (taglibs.size() > 1) |
| { |
| String jarName = |
| file.getName().substring(0, file.getName().length() - |
| ".jar".length()); |
| buff.insert(buff.length() - ".tld".length(), "-" + jarName); |
| } |
| |
| URL jarURL = file.toURL(); |
| URL sourceURL = |
| new URL("jar:" + jarURL.toExternalForm() + "!/" + name); |
| File targetFile = new File(targetDir, buff.toString()); |
| if (targetFile.exists()) |
| { |
| targetFile.delete(); |
| } |
| FileUtils.copyURLToFile(sourceURL, targetFile); |
| targetFile.setReadOnly(); |
| } |
| } |
| } |
| |
| private void replaceOutputDirectory(File projectDir, File outputDir, |
| Xpp3Dom projectDOM) |
| throws XmlPullParserException |
| { |
| // /jpr:project |
| // /hash[@n="oracle.jdevimpl.config.JProjectPaths"] |
| |
| Xpp3Dom projectPathsDOM = |
| findNamedChild(projectDOM, "hash", "oracle.jdevimpl.config.JProjectPaths"); |
| Xpp3Dom sourceDOM = new Xpp3Dom("url"); |
| |
| // |
| // <url @n="outputDirectory" path="[relative-path-to-output-dir]" /> |
| // |
| sourceDOM.setAttribute("path", getRelativeDir(projectDir, outputDir)); |
| sourceDOM.setAttribute("n", "outputDirectory"); |
| projectPathsDOM.addChild(sourceDOM); |
| } |
| |
| /** |
| * Returns the JDeveloper project file for a Maven POM. |
| * |
| * @param project the Maven POM |
| * |
| * @return the JDeveloper project file |
| */ |
| private File getJProjectFile(MavenProject project) |
| { |
| String jprName = project.getArtifactId() + ".jpr"; |
| return new File(project.getBasedir(), jprName); |
| } |
| |
| /** |
| * Returns the JDeveloper test project file for a Maven POM. |
| * |
| * @param project the Maven POM |
| * |
| * @return the JDeveloper test project file |
| */ |
| private File getJProjectTestFile(MavenProject project) |
| { |
| String jprName = project.getArtifactId() + "-test.jpr"; |
| return new File(project.getBasedir(), jprName); |
| } |
| |
| /** |
| * Returns the JDeveloper workspace file for a Maven POM. |
| * |
| * @param project the Maven POM |
| * |
| * @return the JDeveloper workspace file |
| */ |
| private File getJWorkspaceFile(MavenProject project) |
| { |
| String jwsName = project.getArtifactId() + ".jws"; |
| return new File(project.getBasedir(), jwsName); |
| } |
| |
| /** |
| * Reads a JDeveloper workspace file into DOM. |
| * |
| * @param workspaceFile the JDeveloper workspace file |
| * |
| * @return the parsed DOM |
| */ |
| private Xpp3Dom readWorkspaceDOM(File workspaceFile) |
| throws IOException, XmlPullParserException |
| { |
| return readDOM(workspaceFile, release + "/workspace.xml"); |
| } |
| |
| /** |
| * Reads a JDeveloper project file into DOM. |
| * |
| * @param projectFile the JDeveloper project file |
| * |
| * @return the parsed DOM |
| */ |
| private Xpp3Dom readProjectDOM(File projectFile) |
| throws IOException, XmlPullParserException |
| { |
| return readDOM(projectFile, release + "/project.xml"); |
| } |
| |
| /** |
| * Reads a source file into DOM, defaulting to a packaged resource if |
| * the source file does not already exist. |
| * |
| * @param sourceFile the source file to be parsed |
| * @param resourcePath the default packaged resource |
| * |
| * @return the parsed DOM |
| */ |
| private Xpp3Dom readDOM(File sourceFile, String resourcePath) |
| throws IOException, XmlPullParserException |
| { |
| Reader reader = null; |
| try |
| { |
| if (!force && sourceFile.exists()) |
| { |
| // parse the existing source file |
| reader = new FileReader(sourceFile); |
| } |
| else |
| { |
| // parse the default resource file |
| URL resource = getClass().getResource(resourcePath); |
| |
| // ensure that the resourcePath can be found |
| if (resource == null) |
| { |
| throw new IOException("Unable to read resource: " + |
| resourcePath); |
| } |
| |
| reader = new InputStreamReader(resource.openStream()); |
| } |
| return Xpp3DomBuilder.build(reader); |
| } |
| finally |
| { |
| IOUtil.close(reader); |
| } |
| } |
| |
| /** |
| * Writes a XML DOM to the target file. |
| * |
| * @param targetFile the target file |
| * @param sourceDOM the source DOM |
| */ |
| private void writeDOM(File targetFile, Xpp3Dom sourceDOM) |
| throws IOException, XmlPullParserException |
| { |
| FileWriter writer = null; |
| try |
| { |
| writer = new FileWriter(targetFile); |
| Xpp3DomWriter.write(writer, sourceDOM); |
| } |
| finally |
| { |
| IOUtil.close(writer); |
| } |
| } |
| |
| private String getRelativeDir(File source, File target) |
| { |
| return getRelativePath(source, target, true); |
| } |
| |
| private String getRelativeFile(File source, File target) |
| { |
| return getRelativePath(source, target, false); |
| } |
| |
| /** |
| * Returns the relative path between two files. |
| * |
| * @param source the source file |
| * @param target the target file |
| * |
| * @return the relative path between two files |
| */ |
| private String getRelativePath(File source, File target, |
| boolean isDirectory) |
| { |
| String sourcePath = source.getAbsolutePath(); |
| String targetPath = target.getAbsolutePath(); |
| |
| if (targetPath.startsWith(sourcePath + File.separatorChar)) |
| { |
| String relativePath = targetPath.substring(sourcePath.length() + 1); |
| relativePath = relativePath.replace(File.separatorChar, '/'); |
| if (isDirectory) |
| { |
| relativePath += "/"; |
| } |
| return relativePath; |
| } |
| else |
| { |
| String[] sourcePaths = sourcePath.split("\\" + File.separator); |
| String[] targetPaths = targetPath.split("\\" + File.separator); |
| |
| // On Windows, the first element in the absolute path is a drive letter |
| if (System.getProperty("os.name").startsWith("Windows")) |
| { |
| // uppercase the drive letter because Cygwin sometimes delivers |
| // a lowercase drive letter |
| sourcePaths[0] = sourcePaths[0].toUpperCase(); |
| targetPaths[0] = targetPaths[0].toUpperCase(); |
| } |
| |
| int sourcePathCount = sourcePaths.length; |
| int targetPathCount = targetPaths.length; |
| int commonPathCount = 0; |
| |
| int minPathCount = Math.min(sourcePathCount, targetPathCount); |
| for (int i = 0; i < minPathCount; i++) |
| { |
| if (sourcePaths[i].equals(targetPaths[i])) |
| { |
| commonPathCount++; |
| } |
| } |
| |
| if (commonPathCount > 0) |
| { |
| int sourceRelativePathCount = sourcePathCount - commonPathCount; |
| int targetRelativePathCount = targetPathCount - commonPathCount; |
| |
| int relativePathCount = |
| sourceRelativePathCount + targetRelativePathCount; |
| String[] relativePaths = new String[relativePathCount]; |
| |
| for (int i = 0; i < sourceRelativePathCount; i++) |
| { |
| relativePaths[i] = ".."; |
| } |
| |
| for (int i = 0; i < targetRelativePathCount; i++) |
| { |
| relativePaths[sourceRelativePathCount + i] = |
| targetPaths[commonPathCount + i]; |
| } |
| |
| // join |
| StringBuffer relativePath = new StringBuffer(); |
| for (int i = 0; i < relativePathCount; i++) |
| { |
| if (i > 0) |
| { |
| relativePath.append("/"); |
| } |
| relativePath.append(relativePaths[i]); |
| } |
| return relativePath.toString(); |
| } |
| else |
| { |
| return targetPath; |
| } |
| } |
| } |
| |
| private Xpp3Dom findNamedChild(Xpp3Dom parent, String childName, |
| String attrValue) |
| { |
| Xpp3Dom[] hash = parent.getChildren(childName); |
| for (int i = 0; i < hash.length; i++) |
| { |
| if (attrValue.equals(hash[i].getAttribute("n"))) |
| { |
| return hash[i]; |
| } |
| } |
| |
| Xpp3Dom child = new Xpp3Dom(childName); |
| child.setAttribute("n", attrValue); |
| parent.addChild(child); |
| |
| return child; |
| } |
| |
| private MavenProject findDependentProject(String dependencyManagementKey) |
| { |
| for (Iterator i = reactorProjects.iterator(); i.hasNext(); ) |
| { |
| MavenProject reactorProject = (MavenProject) i.next(); |
| String ident = |
| reactorProject.getArtifact().getDependencyConflictId(); |
| if (ident.equals(dependencyManagementKey)) |
| { |
| return reactorProject.getExecutionProject(); |
| } |
| } |
| |
| return null; |
| } |
| |
| private boolean isDependentProject(String dependencyManagementKey) |
| { |
| return (findDependentProject(dependencyManagementKey) != null); |
| } |
| |
| private void removeChildren(Xpp3Dom parent) |
| { |
| while (parent.getChildCount() != 0) |
| { |
| parent.removeChild(0); |
| } |
| } |
| |
| private Xpp3Dom createProjectReferenceDOM(File workspaceDir, |
| File projectFile) |
| { |
| Xpp3Dom hashDOM = new Xpp3Dom("hash"); |
| Xpp3Dom urlDOM = new Xpp3Dom("url"); |
| urlDOM.setAttribute("n", "URL"); |
| urlDOM.setAttribute("path", getRelativeFile(workspaceDir, projectFile)); |
| |
| if (_releaseMajor < 11) |
| { |
| Xpp3Dom valueDOM = new Xpp3Dom("value"); |
| valueDOM.setAttribute("n", "nodeClass"); |
| valueDOM.setAttribute("v", "oracle.jdeveloper.model.JProject"); |
| hashDOM.addChild(valueDOM); |
| } |
| hashDOM.addChild(urlDOM); |
| return hashDOM; |
| } |
| |
| private void _parseRelease() |
| { |
| String nums[] = release.split("\\."); |
| try |
| { |
| _releaseMajor = Integer.parseInt(nums[0]); |
| } |
| catch (NumberFormatException e) |
| { |
| // Default release is currently 10.x |
| _releaseMajor = 10; |
| } |
| } |
| |
| private int _releaseMajor = 0; |
| private boolean _addLibraries = true; |
| private boolean _addTagLibs = true; |
| |
| private static final String _PROPERTY_ADD_LIBRARY = "jdev.plugin.add.libraries"; |
| private static final String _PROPERTY_ADD_TAGLIBS = "jdev.plugin.add.taglibs"; |
| |
| } |