📄 jonasdeploymenttool.java
字号:
// descriptorName is just a file without path path = ""; fileName = descriptorName; } if (fileName.startsWith(EJB_DD)) { return path + JONAS_DD; } int endOfBaseName = descriptorName.indexOf(getConfig().baseNameTerminator, startOfFileName); /* * Check for the odd case where the terminator and/or filename * extension aren't found. These will ensure "jonas-" appears at the * end of the name and before the '.' (if present). */ if (endOfBaseName < 0) { // baseNameTerminator not found: the descriptor use the // JOnAS naming convention, ie [Foo.xml,jonas-Foo.xml] and // not [Foo<baseNameTerminator>-ejb-jar.xml, // Foo<baseNameTerminator>-jonas-ejb-jar.xml]. endOfBaseName = descriptorName.lastIndexOf('.') - 1; if (endOfBaseName < 0) { // no . found endOfBaseName = descriptorName.length() - 1; } jonasConvention = true; } baseName = descriptorName.substring(startOfFileName + 1, endOfBaseName + 1); remainder = descriptorName.substring(endOfBaseName + 1); if (jonasConvention) { jonasDN = path + "jonas-" + baseName + ".xml"; } else { jonasDN = path + baseName + "jonas-" + remainder; } log("Standard EJB descriptor name: " + descriptorName, Project.MSG_VERBOSE); log("JOnAS-specific descriptor name: " + jonasDN, Project.MSG_VERBOSE); return jonasDN; } /** {@inheritDoc}. */ protected String getJarBaseName(String descriptorFileName) { String baseName = null; if (getConfig().namingScheme.getValue().equals(EjbJar.NamingScheme.DESCRIPTOR)) { // try to find JOnAS specific convention name if (descriptorFileName.indexOf(getConfig().baseNameTerminator) == -1) { // baseNameTerminator not found: the descriptor use the // JOnAS naming convention, ie [Foo.xml,jonas-Foo.xml] and // not [Foo<baseNameTerminator>-ejb-jar.xml, // Foo<baseNameTerminator>-jonas-ejb-jar.xml]. String aCanonicalDescriptor = descriptorFileName.replace('\\', '/'); int lastSeparatorIndex = aCanonicalDescriptor.lastIndexOf('/'); int endOfBaseName; if (lastSeparatorIndex != -1) { endOfBaseName = descriptorFileName.indexOf(".xml", lastSeparatorIndex); } else { endOfBaseName = descriptorFileName.indexOf(".xml"); } if (endOfBaseName != -1) { baseName = descriptorFileName.substring(0, endOfBaseName); } } } if (baseName == null) { // else get standard baseName baseName = super.getJarBaseName(descriptorFileName); } log("JAR base name: " + baseName, Project.MSG_VERBOSE); return baseName; } /** {@inheritDoc}. */ protected void registerKnownDTDs(DescriptorHandler handler) { handler.registerDTD(EJB_JAR_1_1_PUBLIC_ID, jonasroot + File.separator + "xml" + File.separator + EJB_JAR_1_1_DTD); handler.registerDTD(EJB_JAR_2_0_PUBLIC_ID, jonasroot + File.separator + "xml" + File.separator + EJB_JAR_2_0_DTD); handler.registerDTD(JONAS_EJB_JAR_2_4_PUBLIC_ID, jonasroot + File.separator + "xml" + File.separator + JONAS_EJB_JAR_2_4_DTD); handler.registerDTD(JONAS_EJB_JAR_2_5_PUBLIC_ID, jonasroot + File.separator + "xml" + File.separator + JONAS_EJB_JAR_2_5_DTD); } /** * Add to the given hashtable all the file generated by GenIC. * * @param genericJarFile jar file. * @param ejbFiles the hashtable. */ private void addGenICGeneratedFiles( File genericJarFile, Hashtable ejbFiles) { Java genicTask = null; // GenIC task String genicClass = null; // GenIC class (3 are supported for various // versions if (nogenic) { return; } genicTask = new Java(getTask()); genicTask.setTaskName("genic"); genicTask.setFork(true); // jonasroot genicTask.createJvmarg().setValue("-Dinstall.root=" + jonasroot); // java policy file String jonasConfigDir = jonasroot + File.separator + "config"; File javaPolicyFile = new File(jonasConfigDir, "java.policy"); if (javaPolicyFile.exists()) { genicTask.createJvmarg().setValue("-Djava.security.policy=" + javaPolicyFile.toString()); } // outputdir try { outputdir = createTempDir(); } catch (IOException aIOException) { String msg = "Cannot create temp dir: " + aIOException.getMessage(); throw new BuildException(msg, aIOException); } log("Using temporary output directory: " + outputdir, Project.MSG_VERBOSE); genicTask.createArg().setValue("-d"); genicTask.createArg().setFile(outputdir); // work around a bug of GenIC 2.5 String key; File f; Enumeration keys = ejbFiles.keys(); while (keys.hasMoreElements()) { key = (String) keys.nextElement(); f = new File(outputdir + File.separator + key); f.getParentFile().mkdirs(); } log("Worked around a bug of GenIC 2.5.", Project.MSG_VERBOSE); // classpath Path classpath = getCombinedClasspath(); if (classpath == null) { classpath = new Path(getTask().getProject()); } classpath.append(new Path(classpath.getProject(), jonasConfigDir)); classpath.append(new Path(classpath.getProject(), outputdir.toString())); // try to create the classpath for the correct ORB if (orb != null) { String orbJar = jonasroot + File.separator + "lib" + File.separator + orb + "_jonas.jar"; classpath.append(new Path(classpath.getProject(), orbJar)); } log("Using classpath: " + classpath.toString(), Project.MSG_VERBOSE); genicTask.setClasspath(classpath); // class name (search in the classpath provided for the ejbjar element) genicClass = getGenicClassName(classpath); if (genicClass == null) { log("Cannot find GenIC class in classpath.", Project.MSG_ERR); throw new BuildException("GenIC class not found, please check the classpath."); } else { log("Using '" + genicClass + "' GenIC class." , Project.MSG_VERBOSE); genicTask.setClassname(genicClass); } // keepgenerated if (keepgenerated) { genicTask.createArg().setValue("-keepgenerated"); } // nocompil if (nocompil) { genicTask.createArg().setValue("-nocompil"); } // novalidation if (novalidation) { genicTask.createArg().setValue("-novalidation"); } // javac if (javac != null) { genicTask.createArg().setValue("-javac"); genicTask.createArg().setLine(javac); } // javacopts if (javacopts != null && !javacopts.equals("")) { genicTask.createArg().setValue("-javacopts"); genicTask.createArg().setLine(javacopts); } // rmicopts if (rmicopts != null && !rmicopts.equals("")) { genicTask.createArg().setValue("-rmicopts"); genicTask.createArg().setLine(rmicopts); } // secpropag if (secpropag) { genicTask.createArg().setValue("-secpropag"); } // verbose if (verbose) { genicTask.createArg().setValue("-verbose"); } // additionalargs if (additionalargs != null) { genicTask.createArg().setValue(additionalargs); } // the generated classes must not be added in the generic JAR! // is that buggy on old JOnAS (2.4) ?? genicTask.createArg().setValue("-noaddinjar"); // input file to process by GenIC genicTask.createArg().setValue(genericJarFile.getPath()); // calling GenIC task log("Calling " + genicClass + " for " + getConfig().descriptorDir + File.separator + descriptorName + ".", Project.MSG_VERBOSE); if (genicTask.executeJava() != 0) { // the method deleteOnExit() do not work because the directory is not empty log("Deleting temp output directory '" + outputdir + "'.", Project.MSG_VERBOSE); deleteAllFiles(outputdir); if (!keepgeneric) { log("Deleting generic JAR " + genericJarFile.toString(), Project.MSG_VERBOSE); genericJarFile.delete(); } throw new BuildException("GenIC reported an error."); } // add the generated files to the ejbFiles addAllFiles(outputdir, "", ejbFiles); } /** * Get the GenIC class name to use in the given classpath. * * @param classpath classpath where the GenIC class must be searched. * @return the GenIC class name. Return <code>null</code> if the class name * cannot be found. */ String getGenicClassName(Path classpath) { log("Looking for GenIC class in classpath: " + classpath.toString(), Project.MSG_VERBOSE); AntClassLoader cl = classpath.getProject().createClassLoader(classpath); try { cl.loadClass(JonasDeploymentTool.GENIC_CLASS); log("Found GenIC class '" + JonasDeploymentTool.GENIC_CLASS + "' in classpath.", Project.MSG_VERBOSE); return JonasDeploymentTool.GENIC_CLASS; } catch (ClassNotFoundException cnf1) { log("GenIC class '" + JonasDeploymentTool.GENIC_CLASS + "' not found in classpath.", Project.MSG_VERBOSE); } try { cl.loadClass(JonasDeploymentTool.OLD_GENIC_CLASS_1); log("Found GenIC class '" + JonasDeploymentTool.OLD_GENIC_CLASS_1 + "' in classpath.", Project.MSG_VERBOSE); return JonasDeploymentTool.OLD_GENIC_CLASS_1; } catch (ClassNotFoundException cnf2) { log("GenIC class '" + JonasDeploymentTool.OLD_GENIC_CLASS_1 + "' not found in classpath.", Project.MSG_VERBOSE); } try { cl.loadClass(JonasDeploymentTool.OLD_GENIC_CLASS_2); log("Found GenIC class '" + JonasDeploymentTool.OLD_GENIC_CLASS_2 + "' in classpath.", Project.MSG_VERBOSE); return JonasDeploymentTool.OLD_GENIC_CLASS_2; } catch (ClassNotFoundException cnf3) { log("GenIC class '" + JonasDeploymentTool.OLD_GENIC_CLASS_2 + "' not found in classpath.", Project.MSG_VERBOSE); } return null; } /** * Verify the configuration. * @param descriptorFileName the name of the descriptor file. * @param saxParser not used. * @throws BuildException if there is an error. */ protected void checkConfiguration(String descriptorFileName, SAXParser saxParser) throws BuildException { // jonasroot if (jonasroot == null) { throw new BuildException("The jonasroot attribut is not set."); } else if (!jonasroot.isDirectory()) { throw new BuildException("The jonasroot attribut '" + jonasroot + "' is not a valid directory."); } // orb if (orb != null && !orb.equals(RMI_ORB) && !orb.equals(JEREMIE_ORB) && !orb.equals(DAVID_ORB)) { throw new BuildException("The orb attribut '" + orb + "' is not valid (must be either " + RMI_ORB + ", " + JEREMIE_ORB + " or " + DAVID_ORB + ")."); } // additionalargs if (additionalargs != null && additionalargs.equals("")) { throw new BuildException("Empty additionalargs attribut."); } // javac if (javac != null && javac.equals("")) { throw new BuildException("Empty javac attribut."); } } /* ----------------------------------------------------------------------------------- */ /* utilitary methods */ /* ----------------------------------------------------------------------------------- */ /** * Create a temporary directory for GenIC output. * * @return the temp directory. * @throws BuildException if a temp directory cannot be created. */ private File createTempDir() throws IOException { File tmpDir = File.createTempFile("genic", null, null); tmpDir.delete(); if (!tmpDir.mkdir()) { throw new IOException("Cannot create the temporary directory '" + tmpDir + "'."); } return tmpDir; } /** * Delete a file. If the file is a directory, delete recursivly all the * files inside. * * @param aFile file to delete. */ private void deleteAllFiles(File aFile) { if (aFile.isDirectory()) { File[] someFiles = aFile.listFiles(); for (int i = 0; i < someFiles.length; i++) { deleteAllFiles(someFiles[i]); } } aFile.delete(); } /** * Add a file to the a given hashtable. If the file is a directory, add * recursivly all the files inside to the hashtable. * * @param file the file to add. * @param rootDir the current sub-directory to scan. * @param hashtable the hashtable where to add the files. */ private void addAllFiles(File file, String rootDir, Hashtable hashtable) { if (!file.exists()) { throw new IllegalArgumentException(); } String newRootDir; if (file.isDirectory()) { File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { if (rootDir.length() > 0) { newRootDir = rootDir + File.separator + files[i].getName(); } else { newRootDir = files[i].getName(); } addAllFiles(files[i], newRootDir, hashtable); } } else { hashtable.put(rootDir, file); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -