001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018: package org.apache.tools.ant.taskdefs.optional.ejb;
019:
020: import java.io.File;
021: import java.io.FileInputStream;
022: import java.io.ObjectInputStream;
023: import javax.ejb.deployment.DeploymentDescriptor;
024:
025: /**
026: * A helper class which performs the actual work of the ddcreator task.
027: *
028: * This class is run with a classpath which includes the weblogic tools and the home and remote
029: * interface class files referenced in the deployment descriptors being built.
030: *
031: */
032: public final class DDCreatorHelper {
033: /**
034: * The root directory of the tree containing the textual deployment descriptors.
035: */
036: private File descriptorDirectory;
037:
038: /**
039: * The directory where generated serialised deployment descriptors are written.
040: */
041: private File generatedFilesDirectory;
042:
043: // CheckStyle:VisibilityModifier OFF - bc
044: /**
045: * The descriptor text files for which a serialised descriptor is to be created.
046: */
047: String[] descriptors;
048:
049: // CheckStyle:VisibilityModifier ON
050:
051: /**
052: * The main method.
053: *
054: * The main method creates an instance of the DDCreatorHelper, passing it the
055: * args which it then processes.
056: * @param args the arguments
057: * @throws Exception on error
058: */
059: public static void main(String[] args) throws Exception {
060: DDCreatorHelper helper = new DDCreatorHelper(args);
061: helper.process();
062: }
063:
064: /**
065: * Initialise the helper with the command arguments.
066: *
067: */
068: private DDCreatorHelper(String[] args) {
069: int index = 0;
070: descriptorDirectory = new File(args[index++]);
071: generatedFilesDirectory = new File(args[index++]);
072:
073: descriptors = new String[args.length - index];
074: for (int i = 0; index < args.length; ++i) {
075: descriptors[i] = args[index++];
076: }
077: }
078:
079: /**
080: * Do the actual work.
081: *
082: * The work proceeds by examining each descriptor given. If the serialised
083: * file does not exist or is older than the text description, the weblogic
084: * DDCreator tool is invoked directly to build the serialised descriptor.
085: */
086: private void process() throws Exception {
087: for (int i = 0; i < descriptors.length; ++i) {
088: String descriptorName = descriptors[i];
089: File descriptorFile = new File(descriptorDirectory,
090: descriptorName);
091:
092: int extIndex = descriptorName.lastIndexOf(".");
093: String serName = null;
094: if (extIndex != -1) {
095: serName = descriptorName.substring(0, extIndex)
096: + ".ser";
097: } else {
098: serName = descriptorName + ".ser";
099: }
100: File serFile = new File(generatedFilesDirectory, serName);
101:
102: // do we need to regenerate the file
103: if (!serFile.exists()
104: || serFile.lastModified() < descriptorFile
105: .lastModified()
106: || regenerateSerializedFile(serFile)) {
107:
108: String[] args = { "-noexit", "-d", serFile.getParent(),
109: "-outputfile", serFile.getName(),
110: descriptorFile.getPath() };
111: try {
112: weblogic.ejb.utils.DDCreator.main(args);
113: } catch (Exception e) {
114: // there was an exception - run with no exit to get proper error
115: String[] newArgs = { "-d",
116: generatedFilesDirectory.getPath(),
117: "-outputfile", serFile.getName(),
118: descriptorFile.getPath() };
119: weblogic.ejb.utils.DDCreator.main(newArgs);
120: }
121: }
122: }
123: }
124:
125: /**
126: * EJBC will fail if the serialized descriptor file does not match the bean classes.
127: * You can test for this by trying to load the deployment descriptor. If it fails,
128: * the serialized file needs to be regenerated because the associated class files
129: * don't match.
130: */
131: private boolean regenerateSerializedFile(File serFile) {
132: try {
133:
134: FileInputStream fis = new FileInputStream(serFile);
135: ObjectInputStream ois = new ObjectInputStream(fis);
136: DeploymentDescriptor dd = (DeploymentDescriptor) ois
137: .readObject();
138: fis.close();
139:
140: // Since the descriptor read properly, everything should be o.k.
141: return false;
142:
143: } catch (Exception e) {
144:
145: // Weblogic will throw an error if the deployment descriptor does
146: // not match the class files.
147: return true;
148:
149: }
150: }
151: }
|