001: /**
002: * EasyBeans
003: * Copyright (C) 2006 Bull S.A.S.
004: * Contact: easybeans@ow2.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:PersistenceXmlFileAnalyzer.java 1537 2007-07-08 15:31:22Z benoitf $
023: * --------------------------------------------------------------------------
024: */package org.ow2.easybeans.persistence.xml;
025:
026: import java.net.URL;
027:
028: import javax.persistence.spi.PersistenceProvider;
029:
030: import org.ow2.easybeans.persistence.PersistenceUnitManager;
031: import org.ow2.util.ee.deploy.api.archive.ArchiveException;
032: import org.ow2.util.ee.deploy.api.archive.IArchive;
033: import org.ow2.util.log.Log;
034: import org.ow2.util.log.LogFactory;
035:
036: /**
037: * Class used to analyze a given archive (by analyzing the persistence.xml file
038: * if any).
039: * @author Florent Benoit
040: */
041: public final class PersistenceXmlFileAnalyzer {
042:
043: /**
044: * Directory where persistence.xml file should be.
045: */
046: private static final String DIRECTORY_PERSISTENCE_XML_FILE = "META-INF";
047:
048: /**
049: * Name of the persistence.xml file.
050: */
051: private static final String PERSISTENCE_XML_FILE = "persistence.xml";
052:
053: /**
054: * Logger.
055: */
056: private static Log logger = LogFactory
057: .getLog(PersistenceXmlFileAnalyzer.class);
058:
059: /**
060: * Utility class, no public constructor.
061: */
062: private PersistenceXmlFileAnalyzer() {
063:
064: }
065:
066: /**
067: * Detects and analyze the META-INF/persistence.xml file.
068: * @param archive the file to analyze (or directory) in order to find a
069: * persistence.xml file.
070: * @param classLoader the classloader used to load the persistence provider
071: * class.
072: * @return a persistence unit manager (which can manage the peristence
073: * contexts).
074: * @throws PersistenceXmlFileAnalyzerException if detection or analyze
075: * fails.
076: */
077: public static PersistenceUnitManager analyzePersistenceXmlFile(
078: final IArchive archive, final ClassLoader classLoader)
079: throws PersistenceXmlFileAnalyzerException {
080: URL persistenceXmlURL = null;
081: try {
082: persistenceXmlURL = archive
083: .getResource(DIRECTORY_PERSISTENCE_XML_FILE + '/'
084: + PERSISTENCE_XML_FILE);
085: } catch (ArchiveException e) {
086: throw new PersistenceXmlFileAnalyzerException(
087: "Cannot check if entry '"
088: + DIRECTORY_PERSISTENCE_XML_FILE + '/'
089: + PERSISTENCE_XML_FILE
090: + "' is present on the file '"
091: + archive.getName() + "'.", e);
092: }
093:
094: // Now, do the parsing and fill the structure.
095: JPersistenceUnitInfo[] persistenceUnitInfos = null;
096: if (persistenceXmlURL != null) {
097: try {
098: persistenceUnitInfos = JPersistenceUnitInfoHelper
099: .getPersistenceUnitInfo(persistenceXmlURL);
100: } catch (JPersistenceUnitInfoException e) {
101: throw new PersistenceXmlFileAnalyzerException(
102: "Cannot parse the URL '" + persistenceXmlURL
103: + "'.", e);
104: }
105:
106: for (JPersistenceUnitInfo persistenceUnitInfo : persistenceUnitInfos) {
107: try {
108: // sets the archive
109: persistenceUnitInfo.addJarFile(archive.getURL());
110:
111: // Set the root url
112: persistenceUnitInfo
113: .setPersistenceUnitRootUrl(archive.getURL());
114: } catch (ArchiveException e) {
115: throw new PersistenceXmlFileAnalyzerException(
116: "Cannot get the URL on the jar file '"
117: + archive.getName() + "'.", e);
118: }
119:
120: // sets the classloader
121: persistenceUnitInfo.setClassLoader(classLoader);
122:
123: if (persistenceUnitInfo
124: .getPersistenceProviderClassName() == null) {
125: throw new PersistenceXmlFileAnalyzerException(
126: "No Persistence provider has been set");
127: }
128:
129: // instantiate persistence provider
130: Class persistenceProviderClass;
131: try {
132: ClassLoader ctxLoader = Thread.currentThread()
133: .getContextClassLoader();
134: persistenceProviderClass = ctxLoader
135: .loadClass(persistenceUnitInfo
136: .getPersistenceProviderClassName());
137: } catch (ClassNotFoundException e) {
138: throw new PersistenceXmlFileAnalyzerException(
139: "Cannot load the persistence provider class '"
140: + persistenceUnitInfo
141: .getPersistenceProviderClassName()
142: + "'.");
143: }
144: PersistenceProvider persistenceProvider;
145: try {
146: persistenceProvider = (PersistenceProvider) persistenceProviderClass
147: .newInstance();
148: } catch (InstantiationException e) {
149: throw new PersistenceXmlFileAnalyzerException(
150: "Cannot instantiate the persistence provider class '"
151: + persistenceUnitInfo
152: .getPersistenceProviderClassName()
153: + "'.", e);
154: } catch (IllegalAccessException e) {
155: throw new PersistenceXmlFileAnalyzerException(
156: "Cannot instantiate the persistence provider class '"
157: + persistenceUnitInfo
158: .getPersistenceProviderClassName()
159: + "'.", e);
160: }
161:
162: // Set persistence provider
163: persistenceUnitInfo
164: .setPersistenceProvider(persistenceProvider);
165:
166: }
167:
168: // create persistence unit manager
169: return new PersistenceUnitManager(persistenceUnitInfos);
170: }
171: // nothing found, return nothing(null)
172: return null;
173: }
174:
175: }
|