RarDeploymentDescManager.java

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         // The context to give for the creation of an instance
00125         // of RarDeploymentDesc
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             // An exception occurred trying to bind context
00133             //            logger.log(BasicLevel.ERROR, "Error when binding context for
00134             // RarDeploymentDesc for '" + rarFileName + "'");
00135             //            logger.log(BasicLevel.ERROR, e.getMessage());
00136 
00137             throw new RarDeploymentDescException("Error during the deployment", e);
00138         }
00139         // want both ra.xml & jonas-ra.xml
00140         return getInstance(contctx);
00141     }
00142 
00156     public static RarDeploymentDesc getInstance(Context ctx) throws DeploymentDescException {
00157 
00158         // init xml contents values;
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         // optional parameter
00174         String raDeployDesc;
00175         try {
00176             raDeployDesc = (String) ctx.lookup("altDD");
00177             altDD = true;
00178         } catch (NamingException e) {
00179             // no alt DD
00180             raDeployDesc = "";
00181         }
00182 
00183         //rar file
00184         JarFile rarFile = null;
00185 
00186         //Input Stream
00187         InputStream raInputStream = null;
00188         InputStream jonasRaInputStream = null;
00189 
00190         //ZipEntry
00191         ZipEntry raZipEntry = null;
00192         ZipEntry jonasRaZipEntry = null;
00193 
00194         Connector connector = null;
00195         JonasConnector jonasConnector = null;
00196 
00197         //Build the file
00198         File fRar = new File(rarFileName);
00199 
00200         //Check if the file exists.
00201         if (!(fRar.exists())) {
00202             throw new RarDeploymentDescException("The file '" + rarFileName + "' was not found.");
00203         }
00204 
00205         // load deployment descriptor data (META-INF/ra.xml)
00206         boolean setupRa = true;
00207         boolean setupJonasRa = true;
00208         try {
00209             if (!altDD) {
00210                 
00211                 // If rar is a directory, there is no jar, just read the file from 
00212                 // the directory
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                     //Check the ra entry
00227                     raZipEntry = rarFile.getEntry(RA_FILE_NAME);
00228                     if (raZipEntry == null) {
00229                         connector = null;
00230                         setupRa = false;
00231                     } else {
00232                         //Get the stream
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                 //lookup a WEB-INF/jonas-web.xml file
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                 //Check the jonas-ra entry
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                     //Get the stream
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                     // Can't close the file
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                 // can't close
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                 // can't close
00295                 logger.log(BasicLevel.WARN, "Can't close META-INF/jonas-ra.xml of '" + rarFileName + "'");
00296             }
00297         }
00298 
00299         // instantiate deployment descriptor
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         // Create if null
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         // Create if null
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 }

Generated on Tue Feb 15 15:05:57 2005 for JOnAS by  doxygen 1.3.9.1