You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2014/04/25 17:06:34 UTC

svn commit: r1590049 - /uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/MetaDataObject_impl.java

Author: schor
Date: Fri Apr 25 15:06:33 2014
New Revision: 1590049

URL: http://svn.apache.org/r1590049
Log:
[UIMA-3776] fix refactoring of java bean info caching

Modified:
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/MetaDataObject_impl.java

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/MetaDataObject_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/MetaDataObject_impl.java?rev=1590049&r1=1590048&r2=1590049&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/MetaDataObject_impl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/MetaDataObject_impl.java Fri Apr 25 15:06:33 2014
@@ -163,9 +163,14 @@ public abstract class MetaDataObject_imp
   
   // Cache for Java Bean info lookup
   // Class level cache (static) for introspection - 30x speedup in CDE for large descriptor
-  private static final transient ConcurrentHashMapWithProducer<Class<? extends MetaDataObject_impl>, MetaDataAttr[]> class2attrsMap =
-      new ConcurrentHashMapWithProducer<Class<? extends MetaDataObject_impl>, MetaDataAttr[]>();
-      
+  private static final transient ConcurrentHashMapWithProducer<Class<? extends MetaDataObject_impl>, MetaDataAttr[]> 
+      class2attrsMap =
+          new ConcurrentHashMapWithProducer<Class<? extends MetaDataObject_impl>, MetaDataAttr[]>();
+  // holds the additional unfiltered ones      
+  private static final transient ConcurrentHashMapWithProducer<Class<? extends MetaDataObject_impl>, MetaDataAttr[]> 
+      class2attrsMapUnfiltered =
+          new ConcurrentHashMapWithProducer<Class<? extends MetaDataObject_impl>, MetaDataAttr[]>();
+            
   private transient URL mSourceUrl;
   
   // This is only used if we are capturing comments and ignorable whitespace in the XML
@@ -194,6 +199,21 @@ public abstract class MetaDataObject_imp
   }
   
   /**
+   * Like getAttributes, but doesn't filter the attributes.  
+   * Design is only for backwards compatibility.  Unfiltered version
+   * used only by getAttributeValue and setAttributeValue
+   * @return an unfiltered array of Attribute objects associated with this class
+   */
+  MetaDataAttr[] getUnfilteredAttributes() {
+    final Class<? extends MetaDataObject_impl> clazz = this.getClass();
+    MetaDataAttr[] attrs = class2attrsMapUnfiltered.get(clazz);
+    if (null == attrs) {
+      getAttributesFromBeans(clazz);
+    }
+    return class2attrsMapUnfiltered.get(clazz);
+  }
+  
+  /**
    * On first call, looks up the information using JavaBeans introspection, but then
    * caches the result for subsequent calls.
    * 
@@ -206,14 +226,29 @@ public abstract class MetaDataObject_imp
     final Class<? extends MetaDataObject_impl> clazz = this.getClass();
     MetaDataAttr[] attrs = class2attrsMap.get(clazz), otherAttrs = null;
     if (null == attrs) {
-      PropertyDescriptor[] pds;
-      try {
-        pds = Introspector.getBeanInfo(clazz, Introspector.IGNORE_ALL_BEANINFO).getPropertyDescriptors();
-      } catch (IntrospectionException e) {
-        throw new UIMARuntimeException(e);
-      }
-      ArrayList<MetaDataAttr> resultList = new ArrayList<MetaDataAttr>(pds.length);
-      for (PropertyDescriptor pd : pds) {
+      getAttributesFromBeans(clazz);
+    }
+    return class2attrsMap.get(clazz);
+  }
+
+  private void getAttributesFromBeans(final Class<? extends MetaDataObject_impl> clazz) {
+    PropertyDescriptor[] pds;
+    try {
+      pds = Introspector.getBeanInfo(clazz, Introspector.IGNORE_ALL_BEANINFO).getPropertyDescriptors();
+    } catch (IntrospectionException e) {
+      throw new UIMARuntimeException(e);
+    }
+    ArrayList<MetaDataAttr> resultList = new ArrayList<MetaDataAttr>(pds.length);
+    ArrayList<MetaDataAttr> resultListUnfiltered = new ArrayList<MetaDataAttr>(pds.length);
+    for (PropertyDescriptor pd : pds) {
+        String propName = pd.getName();
+        Class<?> propClass = pd.getPropertyType();
+        // translate primitive types (int, boolean, etc.) to wrapper classes
+        if (propClass.isPrimitive()) {
+          propClass = getWrapperClass(propClass);
+        }
+        MetaDataAttr mda = new MetaDataAttr(propName, pd.getReadMethod(), pd.getWriteMethod(), propClass);
+        resultListUnfiltered.add(mda);
         // only include properties with read and write methods,
         // and don't include the SourceUrl property, which is for
         // internal bookkeeping and shouldn't affect object equality
@@ -221,22 +256,18 @@ public abstract class MetaDataObject_imp
         // related to comments and whitespace
         if (pd.getReadMethod() != null && pd.getWriteMethod() != null
                 && !pd.getName().equals(PROP_NAME_SOURCE_URL)
-                && !pd.getName().equals(PROP_NAME_INFOSET)) {
-          String propName = pd.getName();
-          Class<?> propClass = pd.getPropertyType();
-          // translate primitive types (int, boolean, etc.) to wrapper classes
-          if (propClass.isPrimitive()) {
-            propClass = getWrapperClass(propClass);
-          }
-          resultList.add(new MetaDataAttr(propName, pd.getReadMethod(), pd.getWriteMethod(), propClass));
+                && !pd.getName().equals(PROP_NAME_INFOSET)) { 
+          resultList.add(mda);
         }
       }
-      resultList.addAll(getAdditionalAttributes());
-      attrs = resultList.toArray(new MetaDataAttr[resultList.size()]);
-      otherAttrs = class2attrsMap.putIfAbsent(clazz, attrs);
-      attrs = (otherAttrs != null) ? otherAttrs : attrs;
-    }
-    return attrs;
+    resultList.addAll(getAdditionalAttributes());
+    resultListUnfiltered.addAll(getAdditionalAttributes());
+    MetaDataAttr[] attrs = resultList.toArray(new MetaDataAttr[resultList.size()]);
+    MetaDataAttr[] otherAttrs = class2attrsMap.putIfAbsent(clazz, attrs);
+    
+    attrs = resultListUnfiltered.toArray(new MetaDataAttr[resultListUnfiltered.size()]);
+    otherAttrs = class2attrsMapUnfiltered.putIfAbsent(clazz, attrs);
+    attrs = (otherAttrs != null) ? otherAttrs : attrs;
   }
   
   /**
@@ -297,7 +328,7 @@ public abstract class MetaDataObject_imp
    */
   public Object getAttributeValue(String aName) {
     try {
-      MetaDataAttr[] attrs = getAttributes();
+      MetaDataAttr[] attrs = getUnfilteredAttributes();
       for (MetaDataAttr attr : attrs) {
         if (attr.name.equals(aName)) {
           Method reader = attr.reader;
@@ -361,7 +392,7 @@ public abstract class MetaDataObject_imp
    */
   public void setAttributeValue(String aName, Object aValue) {
     try {
-      MetaDataAttr[] attrs = getAttributes();
+      MetaDataAttr[] attrs = getUnfilteredAttributes();
       for (MetaDataAttr attr : attrs) {
         if (attr.name.equals(aName)) {
           Method writer = attr.writer;