You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2006/08/23 02:11:30 UTC

svn commit: r433811 - in /incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta: MetaDataRepository.java PersistenceAwareClass.java

Author: ppoddar
Date: Tue Aug 22 17:11:29 2006
New Revision: 433811

URL: http://svn.apache.org/viewvc?rev=433811&view=rev
Log:
Added support for PersistenceAwareClass -- wraps java.lang.Class thinly with SourceTracker.
Modified MetaDataRepository to add a container for PersistenceAwareClasses.


Added:
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/PersistenceAwareClass.java
Modified:
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java?rev=433811&r1=433810&r2=433811&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java Tue Aug 22 17:11:29 2006
@@ -20,6 +20,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -85,6 +86,8 @@
     protected final ClassMetaData[] EMPTY_METAS;
     protected final FieldMetaData[] EMPTY_FIELDS;
     protected final Order[] EMPTY_ORDERS;
+    protected static final PersistenceAwareClass[] EMPTY_PAWARE_CLASSES = 
+    	new PersistenceAwareClass[0];
 
     private static final Localizer _loc = Localizer.forPackage
         (MetaDataRepository.class);
@@ -105,7 +108,8 @@
     private final Map _queries = new HashMap();
     private final Map _seqs = new HashMap();
     private final Map _aliases = Collections.synchronizedMap(new HashMap());
-
+    private final Map _pawares = Collections.synchronizedMap(new HashMap());
+    
     // map of classes to lists of their subclasses
     private final Map _subs = Collections.synchronizedMap(new HashMap());
 
@@ -697,6 +701,19 @@
     }
 
     /**
+     * Gets all the registered persistence-aware classes.
+     * 
+     * @return empty array if no class has been registered.
+     * 
+     */
+    public PersistenceAwareClass[] getPersistenceAwareClasses() {
+    	if (_pawares.isEmpty())
+    		return EMPTY_PAWARE_CLASSES;
+    	return (PersistenceAwareClass[])_pawares.values().toArray
+    		(new PersistenceAwareClass[_pawares.size()]);
+    }
+    
+    /**
      * Create a new metadata, populate it with default information, add it to
      * the repository, and return it. Use the default access type.
      */
@@ -727,11 +744,36 @@
     }
 
     /**
+     * Add the given class as persitence-aware.
+     * 
+     * @param cls non-null and must not alreaddy be added as persitence-capable.
+     */
+    public PersistenceAwareClass addPersistenceAware(Class cls) {
+    	if (cls == null)
+    		return null;
+    	if (_pawares.containsKey(cls))
+    		return (PersistenceAwareClass)_pawares.get(cls);
+    	if (getCachedMetaData(cls) == null) {
+    		synchronized(this) {
+	    		PersistenceAwareClass result = newPersistenceAwareClass(cls); 
+	    		_pawares.put(cls,result);
+	    		return result;
+    		}
+    	}
+    	else
+    		throw new MetaDataException(_loc.get("pc-and-aware", cls));
+    }
+    
+    /**
      * Create a new class metadata instance.
      */
     protected ClassMetaData newClassMetaData(Class type) {
         return new ClassMetaData(type, this);
     }
+    
+    protected PersistenceAwareClass newPersistenceAwareClass(Class type) {
+    	return new PersistenceAwareClass(type, this);
+    }
 
     /**
      * Create a new array of the proper class metadata subclass.
@@ -844,8 +886,27 @@
         }
         return false;
     }
+    
+    /**
+     * Remove a persitence-aware class from this receiver.
+     * 
+     * @param cls a class possibly added earlier as persitence-aware.
+     * 
+     * @return true if removed, false if not contained in this receiver
+     */
+    public synchronized boolean removePersistenceAware(Class cls) {
+    	return _pawares.remove(cls) != null;
+    }
 
     /**
+     * Removes all persitence-aware classes from this receiver.
+     *
+     */
+    public synchronized void removeAllPersistenceAware() {
+    	_pawares.clear();
+    }
+    
+    /**
      * Return the least-derived class metadata for the given application
      * identity object.
      *
@@ -1499,6 +1560,18 @@
             (new SequenceMetaData[_seqs.size()]);
     }
 
+    /**
+     * Gets the persistence-aware class corresponding to the given class. Can
+     * be null, if the given class is not registered as persistence-aware with
+     * this receiver.
+     * 
+     * @param cls a Java class possibly registered as persistence-aware earlier
+     * with this receiver.
+     */
+    public synchronized PersistenceAwareClass getPersistenceAware(Class cls) {
+    	return (PersistenceAwareClass)_pawares.get(cls);
+    }
+    
     /**
      * Return the cached a sequence metadata for the given name.
      */

Added: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/PersistenceAwareClass.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/PersistenceAwareClass.java?rev=433811&view=auto
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/PersistenceAwareClass.java (added)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/PersistenceAwareClass.java Tue Aug 22 17:11:29 2006
@@ -0,0 +1,122 @@
+package org.apache.openjpa.meta;
+
+import java.io.File;
+
+import org.apache.openjpa.lib.meta.SourceTracker;
+import org.apache.openjpa.lib.xml.Commentable;
+
+public class PersistenceAwareClass 
+	implements Comparable, SourceTracker,Commentable,MetaDataContext,
+	MetaDataModes {
+
+    private final MetaDataRepository _repos;
+	private final Class _class;
+	
+    private File _srcFile = null;
+    private int _srcType = SRC_OTHER;
+    private String[] _comments = null;
+    private int _listIndex = -1;
+    private int _srcMode = MODE_META | MODE_MAPPING;
+	
+	public PersistenceAwareClass(Class cls, MetaDataRepository repos) {
+		_repos = repos;
+		_class = cls;
+	}
+	
+	public String getName() {
+		return _class.getName();
+	}
+	
+	public MetaDataRepository getRepository() {
+		return _repos;
+	}
+	
+	public Class getDescribedType() {
+		return _class;
+	}
+	
+    public File getSourceFile() {
+        return _srcFile;
+    }
+
+    public Object getSourceScope() {
+        return null;
+    }
+
+    public int getSourceType() {
+        return _srcType;
+    }
+
+    public void setSource(File file, int srcType) {
+        _srcFile = file;
+        _srcType = srcType;
+    }
+
+    public String getResourceName() {
+        return _class.getName();
+    }
+
+    /**
+     * The source mode this metadata has been loaded under.
+     */
+    public int getSourceMode() {
+        return _srcMode;
+    }
+
+    /**
+     * The source mode this metadata has been loaded under.
+     */
+    public void setSourceMode(int mode) {
+        _srcMode = mode;
+    }
+
+    /**
+     * The source mode this metadata has been loaded under.
+     */
+    public void setSourceMode(int mode, boolean on) {
+        if (mode == MODE_NONE)
+            _srcMode = mode;
+        else if (on)
+            _srcMode |= mode;
+        else
+            _srcMode &= ~mode;
+    }
+
+    /**
+     * The index in which this class was listed in the metadata. Defaults to
+     * <code>-1</code> if this class was not listed in the metadata.
+     */
+    public int getListingIndex() {
+        return _listIndex;
+    }
+
+    /**
+     * The index in which this field was listed in the metadata. Defaults to
+     * <code>-1</code> if this class was not listed in the metadata.
+     */
+    public void setListingIndex(int index) {
+        _listIndex = index;
+    }
+
+    ///////////////
+    // Commentable
+    ///////////////
+
+    public String[] getComments() {
+        return (_comments == null) ? ClassMetaData.EMPTY_COMMENTS : _comments;
+    }
+
+    public void setComments(String[] comments) {
+        _comments = comments;
+    }
+    
+    public int compareTo(Object other) {
+        if (other == this)
+            return 0;
+        if (other instanceof PersistenceAwareClass)
+        	return 1;
+        return _class.getName().compareTo(((ClassMetaData) other).
+            getDescribedType().getName());
+    }
+
+}