001: /**
002: * JOnAS: Java(TM) Open Application Server
003: * Copyright (C) 2004 Bull S.A.
004: * Contact: jonas-team@objectweb.org
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019: * USA
020: *
021: * --------------------------------------------------------------------------
022: * $Id: AbsArchiveModifier.java 5949 2004-12-14 17:26:32Z sauthieg $
023: * --------------------------------------------------------------------------
024: */package org.objectweb.jonas_lib.genclientstub.modifier;
025:
026: import java.util.ArrayList;
027: import java.util.Iterator;
028: import java.util.List;
029:
030: import org.objectweb.jonas_lib.genbase.GenBaseException;
031: import org.objectweb.jonas_lib.genbase.archive.Archive;
032: import org.objectweb.jonas_lib.genbase.archive.J2EEArchive;
033: import org.objectweb.jonas_lib.genbase.archive.WebApp;
034: import org.objectweb.jonas_lib.genbase.generator.Config;
035: import org.objectweb.jonas_lib.genbase.modifier.ArchiveModifier;
036: import org.objectweb.jonas_lib.genclientstub.ClientStubGenException;
037: import org.objectweb.jonas_lib.genclientstub.generator.Generator;
038:
039: /**
040: * Defines common methods used by all modifier
041: */
042: public abstract class AbsArchiveModifier extends ArchiveModifier {
043:
044: /**
045: * Constructor
046: * @param archive the j2ee archive
047: */
048: public AbsArchiveModifier(J2EEArchive archive) {
049: super (archive);
050: }
051:
052: /**
053: * Modify the current archive and return a modified archive.
054: * @return a modified archive.
055: * @throws GenBaseException When Client Generation or storing phase fails.
056: */
057: public abstract Archive modify() throws GenBaseException;
058:
059: /**
060: * Generates stub/tie classes for a given archive with its config
061: * @param config configuration to use for the generator
062: * @param archive the file containing the remote class
063: * @throws ClientStubGenException if the generation fails
064: */
065: protected void generateFoundStubs(Config config, Archive archive)
066: throws ClientStubGenException {
067:
068: // List of classes on which generate stubs
069: List classesStub = new ArrayList();
070: try {
071: List files = archive.getContainedFiles();
072:
073: for (Iterator itFiles = files.iterator(); itFiles.hasNext();) {
074: String clName = (String) itFiles.next();
075: if (clName.endsWith("_Stub.class")
076: || clName.endsWith("_Tie.class")) {
077: // Extract classname from stub and add entry in the list
078: if (archive instanceof WebApp) {
079: if (clName.startsWith("WEB-INF/classes/")) {
080: classesStub.add(clName
081: .substring("WEB-INF/classes/"
082: .length()));
083: }
084: } else {
085: classesStub.add(clName);
086: }
087: }
088: }
089:
090: // launch generation for all classes found
091: for (Iterator itClass = classesStub.iterator(); itClass
092: .hasNext();) {
093: String clName = (String) itClass.next();
094:
095: // Remove stub name
096: int removeStubIdx = 0;
097: if (clName.endsWith("_Stub.class")) {
098: removeStubIdx = clName.length()
099: - "_Stub.class".length();
100: } else if (clName.endsWith("_Tie.class")) {
101: removeStubIdx = clName.length()
102: - "_Tie.class".length();
103: } else {
104: continue;
105: }
106: clName = clName.substring(0, removeStubIdx);
107:
108: // Remove the _ from the className
109: int idx = clName.lastIndexOf('/') + 1;
110: if (clName.charAt(idx) == '_') {
111: String pkgName = clName.substring(0, idx);
112: clName = pkgName
113: + clName
114: .substring(idx + 1, clName.length());
115: }
116:
117: // Translate / into . (/ is in jar entry, classname should contain .)
118: clName = clName.replaceAll("/", ".");
119:
120: // javax object and existing omg stubs
121: if (clName.indexOf("javax.") != -1
122: || clName.indexOf("org.omg.stub") != -1) {
123: continue;
124: }
125:
126: // Doesn't take into account Home and Remote
127: if (clName.indexOf("Home") != -1
128: || clName.indexOf("Remote") != -1) {
129: continue;
130: }
131:
132: Generator g = new Generator(config, null, clName,
133: archive);
134: try {
135: g.generate();
136: g.compile();
137: } catch (ClientStubGenException cstge) {
138: continue;
139: }
140: // add files in archive
141: g.addFiles(archive);
142: }
143: } catch (Exception e) {
144: throw new ClientStubGenException(
145: "Cannot find/build stubs from the file "
146: + archive.getRootFile(), e);
147: }
148:
149: }
150:
151: }
|