FileDocCategorySizeDatePackage
PersistenceUnitInfoImpl.javaAPI DocGlassfish v2 API20070Thu Jul 19 11:29:40 BST 2007com.sun.enterprise.server

PersistenceUnitInfoImpl

public class PersistenceUnitInfoImpl extends Object implements PersistenceUnitInfo
This class implements {@link PersistenceUnitInfo} interface.
author
Sanjeeb.Sahoo@Sun.COM

Fields Summary
private static final String
DEFAULT_PROVIDER_NAME
private static final String
DEFAULT_DS_NAME
private static String
defaultProvider
private static Logger
logger
private static com.sun.enterprise.util.i18n.StringManager
localStrings
private com.sun.enterprise.deployment.PersistenceUnitDescriptor
persistenceUnitDescriptor
private String
applicationLocation
private File
absolutePuRootFile
private DataSource
jtaDataSource
private DataSource
nonJtaDataSource
private List
jarFiles
private com.sun.enterprise.loader.InstrumentableClassLoader
classLoader
Constructors Summary
public PersistenceUnitInfoImpl(com.sun.enterprise.deployment.PersistenceUnitDescriptor persistenceUnitDescriptor, String applicationLocation, com.sun.enterprise.loader.InstrumentableClassLoader classLoader)


     
             
             
              
        this.persistenceUnitDescriptor = persistenceUnitDescriptor;
        this.applicationLocation = applicationLocation;
        this.classLoader = classLoader;
        jarFiles = _getJarFiles();
        jtaDataSource = _getJtaDataSource();
        nonJtaDataSource = _getNonJtaDataSource();
    
Methods Summary
private java.util.List_getJarFiles()

        List<String> jarFileNames = new ArrayList<String>(
                persistenceUnitDescriptor.getJarFiles());
        List<URL> jarFiles = new ArrayList<URL>(jarFileNames.size() + 1);
        String absolutePuRoot = getAbsolutePuRootFile().getAbsolutePath();
        for (String jarFileName : jarFileNames) {
            String nativeJarFileName = jarFileName.replace('/",
                    File.separatorChar);
            final File parentFile = new File(absolutePuRoot).getParentFile();
            // only components are exploded, hence first look for original archives.
            File jarFile = new File(parentFile, nativeJarFileName);
            if (!jarFile.exists()) {
                // if the referenced jar is itself a component, then
                // it might have been exploded, hence let's see
                // if that is the case.

                // let's calculate the name component and path component from this URI
                // e.g. if URI is ../../foo_bar/my-ejb.jar,
                // name component is foo_bar/my-ejb.jar and
                // path component is ../../
                // These are my own notions used here.
                String pathComponent = "";
                String nameComponent = jarFileName;
                if(jarFileName.lastIndexOf("../") != -1) {
                    final int separatorIndex = jarFileName.lastIndexOf("../")+3;
                    pathComponent = jarFileName.substring(0,separatorIndex);
                    nameComponent = jarFileName.substring(separatorIndex);
                }
                logger.fine("For jar-file="+ jarFileName+ ", " + // NOI18N
                        "pathComponent=" +pathComponent + // NOI18N
                        ", nameComponent=" + nameComponent); // NOI18N
                File parentPath = new File(parentFile, pathComponent);
                jarFile = new File(parentPath, DeploymentUtils.
                        getRelativeEmbeddedModulePath(parentPath.
                        getAbsolutePath(), nameComponent));
            }
            if (jarFile.exists()) {
                try {
                    jarFiles.add(jarFile.toURI().toURL());
                } catch (MalformedURLException e) {
                    throw new RuntimeException(e);
                }
            } else {
                // Should be a caught by verifier. So, just log a message
                String msg = localStrings.getString("puinfo.referenced_jar_not_found",
                        new Object[]{absolutePuRoot, jarFileName, jarFile});
                logger.log(Level.WARNING, msg);
            }
        }
        return jarFiles;
    
protected javax.sql.DataSource_getJtaDataSource()

        /*
         * Use DEFAULT_DS_NAME iff user has not specified both jta-ds-name
         * and non-jta-ds-name; and user has specified transaction-type as JTA.
         * See Gf issue #1204 as well.
         */
        if (getTransactionType() != PersistenceUnitTransactionType.JTA) {
            logger.logp(Level.FINE,
                    "PersistenceUnitInfoImpl", // NOI18N
                    "_getJtaDataSource", // NOI18N
                    "This PU is configured as non-jta, so jta-data-source is null"); // NOI18N
            return null; // this is a non-jta-data-source
        }
        String DSName;
        String userSuppliedJTADSName = persistenceUnitDescriptor.getJtaDataSource();
        if (!isNullOrEmpty(userSuppliedJTADSName)) {
            DSName = userSuppliedJTADSName; // use user supplied jta-ds-name
        } else if (isNullOrEmpty(persistenceUnitDescriptor.getNonJtaDataSource())) {
            DSName = DEFAULT_DS_NAME;
        } else {
            String msg = localStrings.getString("puinfo.jta-ds-not-configured", // NOI18N
                    new Object[] {persistenceUnitDescriptor.getName()});
            throw new RuntimeException(msg);
        }
        try {
            logger.logp(Level.FINE, "PersistenceUnitLoaderImpl", // NOI18N
                    "_getJtaDataSource", "JTADSName = {0}", // NOI18N
                    DSName);
            return DataSource.class.cast(lookupPMDataSource(DSName));
        } catch (NamingException e) {
            throw new RuntimeException(e);
        }
    
protected javax.sql.DataSource_getNonJtaDataSource()

        /*
         * If non-JTA name is *not* provided
         * - use the JTA DS name (if supplied) to call lookupNonTxResource
         * If non-JTA name is provided
         * - use non-JTA DS name to call lookupNonTxResource
         * (this is done for ease of use, because user does not have to
         * explicitly mark a connection pool as non-transactional.
         * Calling lookupNonTxResource() with a resource which is
         * already configured as non-transactional has no side effects.)
         * If neither non-JTA nor JTA name is provided
         * use DEFAULT_DS_NAME to call lookupNonTxResource
         */
        String DSName;
        String userSuppliedNonJTADSName = persistenceUnitDescriptor.getNonJtaDataSource();
        if (!isNullOrEmpty(userSuppliedNonJTADSName)) {
            DSName = userSuppliedNonJTADSName;
        } else {
            String userSuppliedJTADSName = persistenceUnitDescriptor.getJtaDataSource();
            if (!isNullOrEmpty(userSuppliedJTADSName)) {
                DSName = userSuppliedJTADSName;
            } else {
                DSName = DEFAULT_DS_NAME;
            }
        }
        try {
            logger.logp(Level.FINE,
                    "PersistenceUnitInfoImpl", // NOI18N
                    "_getNonJtaDataSource", "nonJTADSName = {0}", // NOI18N
                    DSName);
            return DataSource.class.cast(lookupNonJtaDataSource(DSName));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    
public voidaddTransformer(javax.persistence.spi.ClassTransformer transformer)
{@inheritDoc}

        classLoader.addTransformer(transformer);
    
private static voidcreateJar(java.lang.String sourcePath, java.lang.String destinationPath)
Utility method to create a Jar file out of a directory. Right now this not used because TopLink Essential can handle exploded directories, but for better pluggability with different provoder we may have to do use this method to create a jar out of exploded dir.

param
sourcePath is the source dir name.
param
destinationPath is the target jar file that's going to be created. destinationPath first gets deleted if already exists.
throws
java.io.IOException

        FileArchive source = new FileArchive();
        OutputJarArchive destination = new OutputJarArchive();
        try {
            source.open(sourcePath);
            destination.create(destinationPath);
            for (Enumeration entries = source.entries();
                 entries.hasMoreElements();) {
                String entry = String.class.cast(entries.nextElement());
                InputStream is = null;
                OutputStream os = null;
                try {
                    is = source.getEntry(entry);
                    os = destination.putNextEntry(entry);
                    ArchivistUtils.copyWithoutClose(is, os);
                } finally {
                    if (is != null) is.close();
                    if (os != null) destination.closeEntry();
                }
            }
        } finally {
            source.close();
            destination.close();
        }
    
public booleanexcludeUnlistedClasses()

        return persistenceUnitDescriptor.isExcludeUnlistedClasses();
    
private java.lang.StringgetAbsolutePuRoot()
This method calculates the absolute path of the root of a PU. Absolute path is not the path with regards to root of file system. It is the path from the root of the Java EE application this persistence unit belongs to. Returned path always uses '/' as path separator.

return
the absolute path of the root of this persistence unit

        RootDeploymentDescriptor rootDD = persistenceUnitDescriptor.getParent().
                getParent();
        String puRoot = persistenceUnitDescriptor.getPuRoot();
        if(rootDD.isApplication()){
            return puRoot;
        } else {
            ModuleDescriptor module = BundleDescriptor.class.cast(rootDD).
                    getModuleDescriptor();
            if(module.isStandalone()) {
                return puRoot;
            } else {
                final String moduleLocation =
                        DeploymentUtils.getRelativeEmbeddedModulePath(
                        applicationLocation, module.getArchiveUri());
                return moduleLocation + '/" + puRoot; // see we always '/'
            }
        }
    
private java.io.FilegetAbsolutePuRootFile()

        if (absolutePuRootFile == null) {
            absolutePuRootFile = new File(applicationLocation,
                    getAbsolutePuRoot().replace('/", File.separatorChar));
            if (!absolutePuRootFile.exists()) {
                throw new RuntimeException(
                        absolutePuRootFile.getAbsolutePath() + " does not exist!");
            }
        }
        return absolutePuRootFile;
    
public java.lang.ClassLoadergetClassLoader()
{@inheritDoc}

        return ClassLoader.class.cast(classLoader);
    
private static java.lang.StringgetDefaultprovider()
This method first checks if default provider is specified in the environment (e.g. using -D option in domain.xml). If so, we use that. Else we defaults to TopLink.

return

        final String DEFAULT_PERSISTENCE_PROVIDER_PROPERTY =
                "com.sun.persistence.defaultProvider"; // NOI18N
        if(defaultProvider == null) {
            defaultProvider =
                    System.getProperty(DEFAULT_PERSISTENCE_PROVIDER_PROPERTY,
                        DEFAULT_PROVIDER_NAME);
        }

        return defaultProvider;
    
public java.util.ListgetJarFileUrls()
{@inheritDoc}

        return jarFiles;
    
public javax.sql.DataSourcegetJtaDataSource()
{@inheritDoc}

        return jtaDataSource;
    
public java.util.ListgetManagedClassNames()
{@inheritDoc}

        return persistenceUnitDescriptor.getClasses(); // its already unmodifiable
    
public java.util.ListgetMappingFileNames()
{@inheritDoc}

        return persistenceUnitDescriptor.getMappingFiles(); // its already unmodifiable
    
public java.lang.ClassLoadergetNewTempClassLoader()
{@inheritDoc}

        return classLoader.copy();
    
public javax.sql.DataSourcegetNonJtaDataSource()
{@inheritDoc}

        return nonJtaDataSource;
    
public java.lang.StringgetPersistenceProviderClassName()
{@inheritDoc}

        return getPersistenceProviderClassNameForPuDesc(persistenceUnitDescriptor);
    
public static java.lang.StringgetPersistenceProviderClassNameForPuDesc(com.sun.enterprise.deployment.PersistenceUnitDescriptor persistenceUnitDescriptor)

        String provider = persistenceUnitDescriptor.getProvider();
        if (isNullOrEmpty(provider)) {
            provider = getDefaultprovider();
        }
        return provider;
    
public java.lang.StringgetPersistenceUnitName()
{@inheritDoc}

        return persistenceUnitDescriptor.getName();
    
public java.net.URLgetPersistenceUnitRootUrl()

        try {
            return getAbsolutePuRootFile().toURI().toURL();
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
    
public java.util.PropertiesgetProperties()
{@inheritDoc}

        return persistenceUnitDescriptor.getProperties(); // its already a clone
    
public javax.persistence.spi.PersistenceUnitTransactionTypegetTransactionType()
{@inheritDoc}

        return PersistenceUnitTransactionType.valueOf(
                persistenceUnitDescriptor.getTransactionType());
    
private static booleanisNullOrEmpty(java.lang.String s)

        return s == null || s.length() == 0;
    
protected javax.sql.DataSourcelookupNonJtaDataSource(java.lang.String DSName)
get resource of type "nontx"

param
DSName resource name
return
Object (datasource) representing the resource
throws
NamingException when the resource is not available

        return (DataSource)ConnectorRuntime.getRuntime().lookupNonTxResource(DSName, false);
    
protected javax.sql.DataSourcelookupPMDataSource(java.lang.String DSName)
get resource of type "__PM"

param
DSName resource name
return
Object (datasource) representing the resource
throws
NamingException when the resource is not available

        return (DataSource)ConnectorRuntime.getRuntime().lookupPMResource(DSName, false);
    
public java.lang.StringtoString()

        /*
         * This method is used for debugging only.
         */
        StringBuilder result = new StringBuilder("<persistence-unit>"); // NOI18N
        result.append("\n\t<PURoot>" + getPersistenceUnitRootUrl() + "</PURoot>"); // NOI18N
        result.append("\n\t<name>" + getPersistenceUnitName() + "</name>"); // NOI18N
        result.append("\n\t<provider>" + getPersistenceProviderClassName() + // NOI18N
                "</provider>"); // NOI18N
        result.append("\n\t<transaction-type>" + getTransactionType() + // NOI18N
                "</transaction-type>"); // NOI18N
        result.append("\n\t<jta-data-source>" + getJtaDataSource() + // NOI18N
                "</jta-data-source>"); // NOI18N
        result.append("\n\t<non-jta-data-source>" + getNonJtaDataSource() + // NOI18N
                "</non-jta-data-source>"); // NOI18N
        for (URL jar : getJarFileUrls()) {
            result.append("\n\t<jar-file>" + jar + "</jar-file>"); // NOI18N
        }
        for (String mappingFile : getMappingFileNames()) {
            result.append("\n\t<mapping-file>" + mappingFile + // NOI18N
                    "</mapping-file>"); // NOI18N
        }
        for (String clsName : getManagedClassNames()) {
            result.append("\n\t<class-name>" + clsName + "</class-name>"); // NOI18N
        }
        result.append("\n\t<exclude-unlisted-classes>" + excludeUnlistedClasses() + // NOI18N
                "</exclude-unlisted-classes>"); // NOI18N
        result.append("\n\t<properties>" + getProperties() + "</properties>"); // NOI18N
        result.append("\n\t<class-loader>" + getClassLoader() + // NOI18N
                "</class-loader>"); // NOI18N
        result.append("\n</persistence-unit>\n"); // NOI18N
        return result.toString();