001: /**
002: * JOnAS: Java(TM) Open Application Server
003: * Copyright (C) 1999 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: WSManagerWrapper.java 5078 2004-07-06 12:59:11Z sauthieg $
023: * --------------------------------------------------------------------------
024: */package org.objectweb.jonas_ws.deployment.lib.wrapper;
025:
026: import java.lang.reflect.InvocationTargetException;
027: import java.lang.reflect.Method;
028: import java.net.URL;
029:
030: import org.objectweb.jonas_ws.deployment.api.WSDeploymentDesc;
031: import org.objectweb.jonas_ws.deployment.api.WSDeploymentDescException;
032:
033: import org.objectweb.jonas.common.Log;
034: import org.objectweb.jonas.server.LoaderManager;
035:
036: import org.objectweb.util.monolog.api.BasicLevel;
037: import org.objectweb.util.monolog.api.Logger;
038:
039: /**
040: * Wrap the WSDeploymentDescManager to solve ClassLoader problems linked to
041: * Digester.
042: *
043: * @author Guillaume Sauthier
044: */
045: public class WSManagerWrapper {
046:
047: /**
048: * WSDeploymentDescManager fully qualified classname
049: */
050: private static final String WS_MANAGER_CLASSNAME = "org.objectweb.jonas_ws.deployment.lib.WSDeploymentDescManager";
051:
052: /**
053: * logger
054: */
055: private static Logger logger = Log.getLogger(Log.JONAS_EAR_PREFIX);
056:
057: /**
058: * Private Empty Constructor for utility class
059: */
060: private WSManagerWrapper() {
061: }
062:
063: /**
064: * Wrap the WSDeploymentDescManager.getInstance().getDeploymentDesc(url, moduleCL, earCL) call.
065: *
066: * @param url module URL
067: * @param moduleCL module ClassLoader
068: * @param earCL Application ClassLoader
069: *
070: * @return the WSDeploymentDesc of the given module
071: *
072: * @throws WSDeploymentDescException When WSDeploymentDesc cannot be instanciated.
073: */
074: public static WSDeploymentDesc getDeploymentDesc(URL url,
075: ClassLoader moduleCL, ClassLoader earCL)
076: throws WSDeploymentDescException {
077: LoaderManager lm = LoaderManager.getInstance();
078: WSDeploymentDesc wsDD = null;
079:
080: try {
081: ClassLoader tools = lm.getToolsLoader();
082: Class manager = tools.loadClass(WS_MANAGER_CLASSNAME);
083: Method m = manager.getDeclaredMethod("getInstance",
084: new Class[] {});
085: Object instance = m.invoke(null, new Object[] {});
086: m = manager.getDeclaredMethod("getDeploymentDesc",
087: new Class[] { URL.class, ClassLoader.class,
088: ClassLoader.class });
089: wsDD = (WSDeploymentDesc) m.invoke(instance, new Object[] {
090: url, moduleCL, earCL });
091: } catch (InvocationTargetException ite) {
092: Throwable t = ite.getTargetException();
093: if (WSDeploymentDescException.class.isInstance(t)) {
094: throw (WSDeploymentDescException) ite
095: .getTargetException();
096: } else {
097: throw new WSDeploymentDescException(
098: "WSDeploymentDescManager.getDeploymentDesc fails",
099: t);
100: }
101: } catch (Exception e) {
102: // TODO add i18n here
103: throw new WSDeploymentDescException(
104: "Problems when using reflection on WSDeploymentDescManager",
105: e);
106: }
107:
108: return wsDD;
109: }
110:
111: /**
112: * Wrap the WSDeploymentDescManager.getInstance().getDeploymentDesc(url, url, moduleCL, earCL) call.
113: *
114: * @param url module URL
115: * @param unpackedURL unpacked URL of the module (may be null)
116: * @param moduleCL module ClassLoader
117: * @param earCL Application ClassLoader
118: *
119: * @return the WSDeploymentDesc of the given module
120: *
121: * @throws WSDeploymentDescException When WSDeploymentDesc cannot be instanciated.
122: */
123: public static WSDeploymentDesc getDeploymentDesc(URL url,
124: URL unpackedURL, ClassLoader moduleCL, ClassLoader earCL)
125: throws WSDeploymentDescException {
126: LoaderManager lm = LoaderManager.getInstance();
127: WSDeploymentDesc wsDD = null;
128:
129: try {
130: ClassLoader tools = lm.getToolsLoader();
131: Class manager = tools.loadClass(WS_MANAGER_CLASSNAME);
132: Method m = manager.getDeclaredMethod("getInstance",
133: new Class[] {});
134: Object instance = m.invoke(null, new Object[] {});
135: m = manager.getDeclaredMethod("getDeploymentDesc",
136: new Class[] { URL.class, URL.class,
137: ClassLoader.class, ClassLoader.class });
138: wsDD = (WSDeploymentDesc) m.invoke(instance, new Object[] {
139: url, unpackedURL, moduleCL, earCL });
140: } catch (InvocationTargetException ite) {
141: Throwable t = ite.getTargetException();
142: if (WSDeploymentDescException.class.isInstance(t)) {
143: throw (WSDeploymentDescException) ite
144: .getTargetException();
145: } else {
146: throw new WSDeploymentDescException(
147: "WSDeploymentDescManager.getDeploymentDesc fails",
148: t);
149: }
150: } catch (Exception e) {
151: // TODO add i18n here
152: throw new WSDeploymentDescException(
153: "Problems when using reflection on WSDeploymentDescManager",
154: e);
155: }
156:
157: return wsDD;
158: }
159:
160: /**
161: * Wrap the WSDeploymentDescManager.setParsingWithValidation() call.
162: *
163: * @param b true/false
164: */
165: public static void setParsingWithValidation(boolean b) {
166: LoaderManager lm = LoaderManager.getInstance();
167:
168: try {
169: ClassLoader tools = lm.getToolsLoader();
170: Class manager = tools.loadClass(WS_MANAGER_CLASSNAME);
171: Method m = manager.getDeclaredMethod(
172: "setParsingWithValidation",
173: new Class[] { boolean.class });
174: m.invoke(null, new Object[] { new Boolean(b) });
175: } catch (Exception e) {
176: // Should never occurs
177: logger.log(BasicLevel.ERROR, e);
178: }
179: }
180:
181: /**
182: * Wrap the WSDeploymentDescManager.getInstance().removeCache() call.
183: *
184: * @param cl WebApp ClassLoader
185: */
186: public static void removeCache(ClassLoader cl) {
187: LoaderManager lm = LoaderManager.getInstance();
188:
189: try {
190: ClassLoader tools = lm.getToolsLoader();
191: Class manager = tools.loadClass(WS_MANAGER_CLASSNAME);
192: Method m = manager.getDeclaredMethod("getInstance",
193: new Class[] {});
194: Object instance = m.invoke(null, new Object[] {});
195: m = manager.getDeclaredMethod("removeCache",
196: new Class[] { ClassLoader.class });
197: m.invoke(instance, new Object[] { cl });
198: } catch (Exception e) {
199: // Should never occurs
200: logger.log(BasicLevel.ERROR, e);
201: }
202: }
203:
204: }
|