00001
00027 package org.objectweb.jonas_rar.deployment.lib;
00028
00029 import java.io.File;
00030 import java.io.FileInputStream;
00031 import java.io.IOException;
00032 import java.io.InputStream;
00033 import java.io.InputStreamReader;
00034 import java.io.Reader;
00035 import java.util.jar.JarFile;
00036 import java.util.zip.ZipEntry;
00037
00038 import javax.naming.Context;
00039 import javax.naming.NamingException;
00040
00041 import org.objectweb.jonas_lib.deployment.api.DeploymentDescException;
00042 import org.objectweb.jonas_lib.deployment.digester.JDigester;
00043 import org.objectweb.jonas_lib.deployment.lib.AbsDeploymentDescManager;
00044
00045 import org.objectweb.jonas_rar.deployment.api.RarDeploymentDesc;
00046 import org.objectweb.jonas_rar.deployment.api.RarDeploymentDescException;
00047 import org.objectweb.jonas_rar.deployment.rules.ConnectorRuleSet;
00048 import org.objectweb.jonas_rar.deployment.rules.JonasConnectorRuleSet;
00049 import org.objectweb.jonas_rar.deployment.xml.Connector;
00050 import org.objectweb.jonas_rar.deployment.xml.JonasConnector;
00051
00052 import org.objectweb.jonas.common.Log;
00053 import org.objectweb.jonas.naming.CompNamingContext;
00054
00055 import org.objectweb.util.monolog.api.BasicLevel;
00056 import org.objectweb.util.monolog.api.Logger;
00057
00062 public class RarDeploymentDescManager extends AbsDeploymentDescManager {
00063
00067 public static final String RA_FILE_NAME = "META-INF/ra.xml";
00068
00072 public static final String JONAS_RA_FILE_NAME = "META-INF/jonas-ra.xml";
00073
00077 private static boolean parsingWithValidation = true;
00078
00082 private static JDigester connectorDigester = null;
00083
00087 private static JDigester jonasConnectorDigester = null;
00088
00092 private static ConnectorRuleSet connectorRuleSet = new ConnectorRuleSet();
00093
00097 private static JonasConnectorRuleSet jonasConnectorRuleSet = new JonasConnectorRuleSet();
00098
00102 private static Logger logger = Log.getLogger(Log.JONAS_DBM_PREFIX);
00103
00107 private RarDeploymentDescManager() {
00108 }
00109
00121 public static RarDeploymentDesc getInstance(String rarFileName, ClassLoader classLoader)
00122 throws DeploymentDescException {
00123
00124
00125
00126 Context contctx = null;
00127 try {
00128 contctx = new CompNamingContext(rarFileName);
00129 contctx.rebind("rarFileName", rarFileName);
00130 contctx.rebind("classloader", classLoader);
00131 } catch (Exception e) {
00132
00133
00134
00135
00136
00137 throw new RarDeploymentDescException("Error during the deployment", e);
00138 }
00139
00140 return getInstance(contctx);
00141 }
00142
00156 public static RarDeploymentDesc getInstance(Context ctx) throws DeploymentDescException {
00157
00158
00159 String xmlContent = "";
00160 String jonasXmlContent = "";
00161 boolean altDD = false;
00162
00163 String rarFileName = null;
00164 ClassLoader classLoader = null;
00165 try {
00166 rarFileName = (String) ctx.lookup("rarFileName");
00167 classLoader = (ClassLoader) ctx.lookup("classloader");
00168 } catch (NamingException e) {
00169 String err = "Error while getting parameter from context param ";
00170 throw new RarDeploymentDescException(err, e);
00171 }
00172
00173
00174 String raDeployDesc;
00175 try {
00176 raDeployDesc = (String) ctx.lookup("altDD");
00177 altDD = true;
00178 } catch (NamingException e) {
00179
00180 raDeployDesc = "";
00181 }
00182
00183
00184 JarFile rarFile = null;
00185
00186
00187 InputStream raInputStream = null;
00188 InputStream jonasRaInputStream = null;
00189
00190
00191 ZipEntry raZipEntry = null;
00192 ZipEntry jonasRaZipEntry = null;
00193
00194 Connector connector = null;
00195 JonasConnector jonasConnector = null;
00196
00197
00198 File fRar = new File(rarFileName);
00199
00200
00201 if (!(fRar.exists())) {
00202 throw new RarDeploymentDescException("The file '" + rarFileName + "' was not found.");
00203 }
00204
00205
00206 boolean setupRa = true;
00207 boolean setupJonasRa = true;
00208 try {
00209 if (!altDD) {
00210
00211
00212
00213 if (fRar.isDirectory()) {
00214 File rarXmlF = new File(rarFileName, RA_FILE_NAME);
00215 if (!rarXmlF.exists()) {
00216 connector = null;
00217 setupRa = false;
00218 } else {
00219 raInputStream = new FileInputStream(rarXmlF);
00220 xmlContent = xmlContent(raInputStream);
00221 raInputStream = new FileInputStream(rarXmlF);
00222 }
00223 } else {
00224 rarFile = new JarFile(rarFileName);
00225
00226
00227 raZipEntry = rarFile.getEntry(RA_FILE_NAME);
00228 if (raZipEntry == null) {
00229 connector = null;
00230 setupRa = false;
00231 } else {
00232
00233 raInputStream = rarFile.getInputStream(raZipEntry);
00234 xmlContent = xmlContent(raInputStream);
00235 raInputStream = rarFile.getInputStream(raZipEntry);
00236 }
00237 }
00238 } else {
00239 raInputStream = new FileInputStream(raDeployDesc);
00240 xmlContent = xmlContent(raInputStream);
00241 raInputStream = new FileInputStream(raDeployDesc);
00242 }
00243
00244 if (fRar.isDirectory()) {
00245
00246 File rarJXmlF = new File(rarFileName, JONAS_RA_FILE_NAME);
00247 if (rarJXmlF.exists()) {
00248 jonasRaInputStream = new FileInputStream(rarJXmlF);
00249 jonasXmlContent = xmlContent(jonasRaInputStream);
00250 jonasRaInputStream = new FileInputStream(rarJXmlF);
00251 }
00252 } else {
00253
00254 rarFile = new JarFile(rarFileName);
00255 jonasRaZipEntry = rarFile.getEntry(JONAS_RA_FILE_NAME);
00256 if (jonasRaZipEntry == null) {
00257 jonasConnector = null;
00258 setupJonasRa = false;
00259 } else {
00260
00261 jonasRaInputStream = rarFile.getInputStream(jonasRaZipEntry);
00262 jonasXmlContent = xmlContent(jonasRaInputStream);
00263 jonasRaInputStream = rarFile.getInputStream(jonasRaZipEntry);
00264 }
00265 }
00266 } catch (Exception e) {
00267 if (rarFile != null) {
00268 try {
00269 rarFile.close();
00270 } catch (IOException ioe) {
00271
00272 logger.log(BasicLevel.WARN, "Can't close '" + rarFileName + "'");
00273 }
00274 }
00275 throw new RarDeploymentDescException("Cannot read the XML deployment descriptors of the rar file '"
00276 + rarFileName + "'.", e);
00277 }
00278
00279 if (setupRa) {
00280 connector = loadConnector(new InputStreamReader(raInputStream), raDeployDesc);
00281 try {
00282 raInputStream.close();
00283 } catch (IOException e) {
00284
00285 logger.log(BasicLevel.WARN, "Can't close META-INF/ra.xml of '" + rarFileName + "'");
00286 }
00287 }
00288
00289 if (setupJonasRa) {
00290 jonasConnector = loadJonasConnector(new InputStreamReader(jonasRaInputStream), JONAS_RA_FILE_NAME);
00291 try {
00292 jonasRaInputStream.close();
00293 } catch (IOException e) {
00294
00295 logger.log(BasicLevel.WARN, "Can't close META-INF/jonas-ra.xml of '" + rarFileName + "'");
00296 }
00297 }
00298
00299
00300 RarDeploymentDesc rdd = new RarDeploymentDesc(classLoader, connector, jonasConnector);
00301 rdd.setXmlContent(xmlContent);
00302 rdd.setJOnASXmlContent(jonasXmlContent);
00303 return rdd;
00304 }
00305
00314 public static Connector loadConnector(Reader reader, String fileName) throws DeploymentDescException {
00315
00316 Connector connector = new Connector();
00317
00318
00319 if (connectorDigester == null) {
00320 connectorDigester = new JDigester(connectorRuleSet, parsingWithValidation, true, new ConnectorDTDs(),
00321 new ConnectorSchemas());
00322 }
00323
00324 try {
00325 connectorDigester.parse(reader, fileName, connector);
00326 } catch (DeploymentDescException e) {
00327 throw e;
00328 } finally {
00329 connectorDigester.push(null);
00330 }
00331 return connector;
00332 }
00333
00342 public static JonasConnector loadJonasConnector(Reader reader, String fileName) throws DeploymentDescException {
00343
00344 JonasConnector jonasConnector = new JonasConnector();
00345
00346
00347 if (jonasConnectorDigester == null) {
00348 jonasConnectorDigester = new JDigester(jonasConnectorRuleSet, parsingWithValidation, true,
00349 new JonasConnectorDTDs(), new JonasConnectorSchemas());
00350 }
00351
00352 try {
00353 jonasConnectorDigester.parse(reader, fileName, jonasConnector);
00354 } catch (DeploymentDescException e) {
00355 throw e;
00356 } finally {
00357 jonasConnectorDigester.push(null);
00358 }
00359 return jonasConnector;
00360 }
00361
00366 public static boolean getParsingWithValidation() {
00367 return RarDeploymentDescManager.parsingWithValidation;
00368 }
00369
00374 public static void setParsingWithValidation(boolean validation) {
00375 RarDeploymentDescManager.parsingWithValidation = validation;
00376 }
00377
00378 }