All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sun.jdo.api.persistence.enhancer.meta.JDOMetaDataModelImpl Maven / Gradle / Ivy

There is a newer version: 6.2024.6
Show newest version
/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 1997-2010 Oracle and/or its affiliates. All rights reserved.
 *
 * The contents of this file are subject to the terms of either the GNU
 * General Public License Version 2 only ("GPL") or the Common Development
 * and Distribution License("CDDL") (collectively, the "License").  You
 * may not use this file except in compliance with the License.  You can
 * obtain a copy of the License at
 * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
 * or packager/legal/LICENSE.txt.  See the License for the specific
 * language governing permissions and limitations under the License.
 *
 * When distributing the software, include this License Header Notice in each
 * file and include the License file at packager/legal/LICENSE.txt.
 *
 * GPL Classpath Exception:
 * Oracle designates this particular file as subject to the "Classpath"
 * exception as provided by Oracle in the GPL Version 2 section of the License
 * file that accompanied this code.
 *
 * Modifications:
 * If applicable, add the following below the License Header, with the fields
 * enclosed by brackets [] replaced by your own identifying information:
 * "Portions Copyright [year] [name of copyright owner]"
 *
 * Contributor(s):
 * If you wish your version of this file to be governed by only the CDDL or
 * only the GPL Version 2, indicate your decision by adding "[Contributor]
 * elects to include this software in this distribution under the [CDDL or GPL
 * Version 2] license."  If you don't indicate a single choice of license, a
 * recipient has the option to distribute your version of this file under
 * either the CDDL, the GPL Version 2 or to extend the choice of license to
 * its licensees as provided above.  However, if you add GPL Version 2 code
 * and therefore, elected the GPL Version 2 license, then the option applies
 * only if the new code is made subject to such option by the copyright
 * holder.
 */

package com.sun.jdo.api.persistence.enhancer.meta;

import java.io.PrintWriter;

import com.sun.jdo.api.persistence.enhancer.util.Support;
import com.sun.jdo.api.persistence.model.Model;
import com.sun.jdo.api.persistence.model.jdo.PersistenceFieldElement;
import com.sun.jdo.api.persistence.model.jdo.PersistenceClassElement;
import com.sun.jdo.api.persistence.model.jdo.RelationshipElement;


/**
 * Provides the JDO meta information based on a JDO meta model.
 */
//@olsen: new class
public class JDOMetaDataModelImpl extends Support
    implements JDOMetaData
{
    // misc
    protected final PrintWriter out;

    // model
    protected Model model;

    /**
     * Creates an instance.
     */
    public JDOMetaDataModelImpl(Model model) {
        this(model, null);
    }

    public JDOMetaDataModelImpl(Model model,
                                PrintWriter out)
        throws JDOMetaDataUserException, JDOMetaDataFatalError
    {
        // check arguments
        if (model == null) {
            final String msg
                = "Initializing meta data: model == null";//NOI18N
            throw new JDOMetaDataFatalError(msg);
        }
        this.model = model;
        this.out = out;
    }

    /**
     * Tests whether a class is known to be transient.
     */
    public boolean isTransientClass(String classPath)
        throws JDOMetaDataUserException, JDOMetaDataFatalError
    {
        //^olsen: delegate to Model once supported
        if (classPath.startsWith("java/"))//NOI18N
            return true;
        if (classPath.startsWith("javax/"))//NOI18N
            return true;
        if (classPath.startsWith("com/sun/jdo/"))//NOI18N
            return true;
        return false;
    }

    /**
     * Tests whether a class is known to be persistence-capable.
     */
    public boolean isPersistenceCapableClass(String classPath)
        throws JDOMetaDataUserException, JDOMetaDataFatalError
    {
        //^olsen: delegate to Model once supported
        if (isTransientClass(classPath))
            return false;
        final String className = pathToName(classPath);
        return model.isPersistent(className);
    }

    /**
     * Tests whether a class is known as a persistence-capable root class.
     */
    public boolean isPersistenceCapableRootClass(String classPath)
        throws JDOMetaDataUserException, JDOMetaDataFatalError
    {
        //@olsen: 4631388 - do not attempt to support inheritance right now
        final String className = pathToName(classPath);
        return model.isPersistent(className);
        //return (model.isPersistent(className)
        //        && !model.hasPersistentSuperclass(className));
    }

    /**
     * Returns the name of the persistence-capable root class of a class.
     */
    public String getPersistenceCapableRootClass(String classPath)
        throws JDOMetaDataUserException, JDOMetaDataFatalError
    {
        //^olsen: exchange dummy implementation once supported by Model
        return (isPersistenceCapableClass(classPath) ? classPath : null);
    }

    /**
     * Returns the name of the superclass of a class.
     * 

* @param classPath the JVM-qualified name of the class * @return the name of the superclass. */ public String getSuperClass(String classPath) throws JDOMetaDataUserException, JDOMetaDataFatalError { //throw new UnsupportedOperationException ("not implemented yet"); return null; } /** * Tests whether a type is known for Second Class Objects. */ public boolean isSecondClassObjectType(String classPath) throws JDOMetaDataUserException, JDOMetaDataFatalError { final String className = pathToName(classPath); return model.isSecondClassObject(className); } /** * Tests whether a type is known for Mutable Second Class Objects. */ public boolean isMutableSecondClassObjectType(String classPath) throws JDOMetaDataUserException, JDOMetaDataFatalError { final String className = pathToName(classPath); return model.isMutableSecondClassObject(className); } /** * Tests whether a field of a class is known to be persistent. */ public boolean isPersistentField(String classPath, String fieldName) throws JDOMetaDataUserException, JDOMetaDataFatalError { final String className = pathToName(classPath); return model.isPersistent(className, fieldName); } /** * Tests whether a field of a class is known to be transactional. */ public boolean isTransactionalField(String classPath, String fieldName) throws JDOMetaDataUserException, JDOMetaDataFatalError { //throw new UnsupportedOperationException ("not implemented yet"); return false; } /** * Tests whether a field of a class is known to be Primary Key. */ public boolean isPrimaryKeyField(String classPath, String fieldName) throws JDOMetaDataUserException, JDOMetaDataFatalError { final String className = pathToName(classPath); return model.isKey(className, fieldName); } /** * Tests whether a field of a class is known to be part of the * Default Fetch Group. Please note that for a relationship field, this * method always returns false. */ public boolean isDefaultFetchGroupField(String classPath, String fieldName) throws JDOMetaDataUserException, JDOMetaDataFatalError { final String className = pathToName(classPath); boolean isdfgField = model.isDefaultFetchGroup(className, fieldName); if(isdfgField) { final PersistenceFieldElement pfe = model.getPersistenceField(className, fieldName); if (pfe instanceof RelationshipElement) { // This is a relationship field. Flag it as not belonging // to dfg. // Relationship fields are always flaged as not belonging to dfg // This assures that access to a relationship fields is always // mediated. // Please see call to this method from following for more details. // 1. EJBMetaDataModelImpl#getFieldFlags() // 2. MethodAnnotater#notePutFieldAnnotation() // 3. MethodAnnotater#noteGetFieldAnnotation() isdfgField = false; } } return isdfgField; } /** * Returns the unique field index of a declared, persistent field of a * class. */ public int getFieldNo(String classPath, String fieldName) throws JDOMetaDataUserException, JDOMetaDataFatalError { final String className = pathToName(classPath); final PersistenceFieldElement pfe = model.getPersistenceField(className, fieldName); if (pfe == null || pfe.getPersistenceType() != PersistenceFieldElement.PERSISTENT) return -1; return pfe.getFieldNumber(); } /** * Returns an array of field names of all declared, persistent fields * of a class. */ private final String[] getPersistentFields(String classPath) throws JDOMetaDataUserException, JDOMetaDataFatalError { final String className = pathToName(classPath); final PersistenceClassElement pce = model.getPersistenceClass(className); if (pce == null) return new String[]{}; // exctract field names into result array final PersistenceFieldElement[] pfes = pce.getFields(); final int nofFields = (pfes != null ? pfes.length : 0); final String[] names = new String[nofFields]; for (int i = 0; i < nofFields; i++) { final PersistenceFieldElement pfe = pfes[i]; names[i] = pfe.getName(); //@olsen: debugging check if (false) { if (pfe.getPersistenceType() != PersistenceFieldElement.PERSISTENT) { final String msg = ("Getting persistent field names: " //NOI18N + "Encountered non-persistent field '"//NOI18N + names[i] + "' for class " + classPath);//NOI18N throw new JDOMetaDataFatalError(msg); //out.println(msg); //names[i] = null; } } } return names; } /** * Returns an array of field names of all declared persistent and * transactional fields of a class. */ public String[] getManagedFields(String classPath) throws JDOMetaDataUserException, JDOMetaDataFatalError { return getPersistentFields(classPath); } static protected String pathToName(String classPath) { if (classPath != null) { return classPath.replace('/', '.'); } else { return null; } } static protected String nameToPath(String className) { if (className != null) { return className.replace('.', '/'); } else { return null; } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy