Search in sources :

Example 1 with PersistenceUnitFragment

use of org.apache.openejb.jee.jpa.fragment.PersistenceUnitFragment in project tomee by apache.

the class ReadDescriptors method deploy.

@SuppressWarnings({ "unchecked" })
public AppModule deploy(final AppModule appModule) throws OpenEJBException {
    for (final EjbModule ejbModule : appModule.getEjbModules()) {
        if (ejbModule.getEjbJar() == null) {
            readEjbJar(ejbModule, appModule);
        }
        if (ejbModule.getOpenejbJar() == null) {
            readOpenejbJar(ejbModule);
        }
        if (ejbModule.getBeans() == null) {
            readBeans(ejbModule);
        }
        readValidationConfigType(ejbModule);
        readCmpOrm(ejbModule);
        readResourcesXml(ejbModule);
    }
    for (final ClientModule clientModule : appModule.getClientModules()) {
        readAppClient(clientModule, appModule);
        readValidationConfigType(clientModule);
        readResourcesXml(clientModule);
    }
    for (final ConnectorModule connectorModule : appModule.getConnectorModules()) {
        readConnector(connectorModule, appModule);
        readValidationConfigType(connectorModule);
        readResourcesXml(connectorModule);
    }
    for (final WebModule webModule : appModule.getWebModules()) {
        readWebApp(webModule, appModule);
        readValidationConfigType(webModule);
        readResourcesXml(webModule);
    }
    final List<Object> persistenceUrls = (List<Object>) appModule.getAltDDs().get("persistence.xml");
    if (persistenceUrls != null) {
        for (final Object persistenceUrl : persistenceUrls) {
            final boolean url = persistenceUrl instanceof URL;
            final Source source = getSource(persistenceUrl);
            final String moduleName;
            final String path;
            final String rootUrl;
            if (url) {
                final URL pUrl = (URL) persistenceUrl;
                File file = URLs.toFile(pUrl);
                path = file.getAbsolutePath();
                if (file.getName().endsWith("persistence.xml")) {
                    final File parentFile = file.getParentFile();
                    final String parent = parentFile.getName();
                    if (parent.equalsIgnoreCase("WEB-INF") || parent.equalsIgnoreCase("META-INF")) {
                        file = parentFile.getParentFile();
                    } else {
                        // we don't really know so simply go back (users will often put persistence.xml in root resource folder with arquillian)
                        file = file.getParentFile();
                    }
                }
                moduleName = file.toURI().toString();
                String tmpRootUrl = moduleName;
                final String extForm = pUrl.toExternalForm();
                if (extForm.contains("WEB-INF/classes/META-INF/")) {
                    if (!ROOT_URL_FROM_WEBINF) {
                        tmpRootUrl = extForm.substring(0, extForm.indexOf("/META-INF"));
                    } else {
                        tmpRootUrl = extForm.substring(0, extForm.indexOf("/classes/META-INF"));
                    }
                }
                if (tmpRootUrl.endsWith(".war")) {
                    tmpRootUrl = tmpRootUrl.substring(0, tmpRootUrl.length() - ".war".length());
                }
                rootUrl = tmpRootUrl;
            } else {
                moduleName = "";
                rootUrl = "";
                path = null;
            }
            try {
                final Persistence persistence = JaxbPersistenceFactory.getPersistence(Persistence.class, source.get());
                final PersistenceModule persistenceModule = new PersistenceModule(appModule, rootUrl, persistence);
                persistenceModule.getWatchedResources().add(moduleName);
                if (url && "file".equals(((URL) persistenceUrl).getProtocol())) {
                    persistenceModule.getWatchedResources().add(path);
                }
                appModule.addPersistenceModule(persistenceModule);
            } catch (final Exception e1) {
                DeploymentLoader.logger.error("Unable to load Persistence Unit from EAR: " + appModule.getJarLocation() + ", module: " + moduleName + ". Exception: " + e1.getMessage(), e1);
            }
        }
    }
    final List<URL> persistenceFragmentUrls = (List<URL>) appModule.getAltDDs().get("persistence-fragment.xml");
    if (persistenceFragmentUrls != null) {
        for (final URL persistenceFragmentUrl : persistenceFragmentUrls) {
            try {
                final PersistenceFragment persistenceFragment = JaxbPersistenceFactory.getPersistence(PersistenceFragment.class, persistenceFragmentUrl);
                // merging
                for (final PersistenceUnitFragment fragmentUnit : persistenceFragment.getPersistenceUnitFragment()) {
                    for (final PersistenceModule persistenceModule : appModule.getPersistenceModules()) {
                        final Persistence persistence = persistenceModule.getPersistence();
                        for (final PersistenceUnit unit : persistence.getPersistenceUnit()) {
                            if (!fragmentUnit.getName().equals(unit.getName())) {
                                continue;
                            }
                            if (!persistenceFragment.getVersion().equals(persistence.getVersion())) {
                                logger.error("persistence unit version and fragment version are different, fragment will be ignored");
                                continue;
                            }
                            if ("file".equals(persistenceFragmentUrl.getProtocol())) {
                                persistenceModule.getWatchedResources().add(URLs.toFile(persistenceFragmentUrl).getAbsolutePath());
                            }
                            for (final String clazz : fragmentUnit.getClazz()) {
                                if (!unit.getClazz().contains(clazz)) {
                                    logger.info("Adding class " + clazz + " to persistence unit " + fragmentUnit.getName());
                                    unit.getClazz().add(clazz);
                                }
                            }
                            for (final String mappingFile : fragmentUnit.getMappingFile()) {
                                if (!unit.getMappingFile().contains(mappingFile)) {
                                    logger.info("Adding mapping file " + mappingFile + " to persistence unit " + fragmentUnit.getName());
                                    unit.getMappingFile().add(mappingFile);
                                }
                            }
                            for (final String jarFile : fragmentUnit.getJarFile()) {
                                if (!unit.getJarFile().contains(jarFile)) {
                                    logger.info("Adding jar file " + jarFile + " to persistence unit " + fragmentUnit.getName());
                                    unit.getJarFile().add(jarFile);
                                }
                            }
                            if (fragmentUnit.isExcludeUnlistedClasses()) {
                                unit.setExcludeUnlistedClasses(true);
                                logger.info("Excluding unlisted classes for persistence unit " + fragmentUnit.getName());
                            }
                        // else let the main persistence unit decide
                        }
                    }
                }
            } catch (final Exception e1) {
                DeploymentLoader.logger.error("Unable to load Persistence Unit Fragment from EAR: " + appModule.getJarLocation() + ", fragment: " + persistenceFragmentUrl.toString() + ". Exception: " + e1.getMessage(), e1);
            }
        }
    }
    return appModule;
}
Also used : URL(java.net.URL) InputSource(org.xml.sax.InputSource) OpenEJBException(org.apache.openejb.OpenEJBException) JAXBException(javax.xml.bind.JAXBException) SAXException(org.xml.sax.SAXException) IOException(java.io.IOException) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) Persistence(org.apache.openejb.jee.jpa.unit.Persistence) PersistenceUnitFragment(org.apache.openejb.jee.jpa.fragment.PersistenceUnitFragment) PersistenceUnit(org.apache.openejb.jee.jpa.unit.PersistenceUnit) PersistenceFragment(org.apache.openejb.jee.jpa.fragment.PersistenceFragment) List(java.util.List) File(java.io.File)

Aggregations

File (java.io.File)1 IOException (java.io.IOException)1 URL (java.net.URL)1 List (java.util.List)1 JAXBException (javax.xml.bind.JAXBException)1 ParserConfigurationException (javax.xml.parsers.ParserConfigurationException)1 OpenEJBException (org.apache.openejb.OpenEJBException)1 PersistenceFragment (org.apache.openejb.jee.jpa.fragment.PersistenceFragment)1 PersistenceUnitFragment (org.apache.openejb.jee.jpa.fragment.PersistenceUnitFragment)1 Persistence (org.apache.openejb.jee.jpa.unit.Persistence)1 PersistenceUnit (org.apache.openejb.jee.jpa.unit.PersistenceUnit)1 InputSource (org.xml.sax.InputSource)1 SAXException (org.xml.sax.SAXException)1