You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by re...@apache.org on 2013/02/20 18:14:04 UTC

svn commit: r1448303 - in /uima/sandbox/uimafit/trunk: uimafit-examples/src/main/java/org/apache/uima/fit/examples/getstarted/ uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/ uimafit/src/main/java/org/apache/uima/fit/factory/ uimafit/s...

Author: rec
Date: Wed Feb 20 17:14:03 2013
New Revision: 1448303

URL: http://svn.apache.org/r1448303
Log:
[UIMA-2679] Support legacy uimaFIT META-INF location 
https://issues.apache.org/jira/browse/UIMA-267
Issue UIMA-2679: Support legacy uimaFIT META-INF location 
https://issues.apache.org/jira/browse/UIMA-2679
- Marked several files as internal API
- Changed META-INF location to org.apache.uima.fit
- Extended LegacySupportModule to scan for descriptors
- Moved descriptor scanning code to MetaDataUtil

Added:
    uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/LegacySupport.java   (with props)
    uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/MetaDataType.java   (with props)
    uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/MetaDataUtil.java   (with props)
    uima/sandbox/uimafit/trunk/uimafit/src/test/resources/META-INF/org.apache.uima.fit/
      - copied from r1446497, uima/sandbox/uimafit/trunk/uimafit/src/test/resources/META-INF/org.uimafit/
Removed:
    uima/sandbox/uimafit/trunk/uimafit/src/test/resources/META-INF/org.uimafit/
Modified:
    uima/sandbox/uimafit/trunk/uimafit-examples/src/main/java/org/apache/uima/fit/examples/getstarted/GetStartedQuickDescriptor.java
    uima/sandbox/uimafit/trunk/uimafit-examples/src/main/java/org/apache/uima/fit/examples/getstarted/GetStartedQuickPipeline.java
    uima/sandbox/uimafit/trunk/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/LegacySupportPluginImpl.java
    uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/factory/FsIndexFactory.java
    uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactory.java
    uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/EnhancedClassFile.java
    uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/ExtendedExternalResourceDescription_impl.java
    uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/ExtendedLogger.java
    uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/JCasGenPomFriendly.java
    uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/LegacySupportPlugin.java
    uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/ReflectionUtil.java

Modified: uima/sandbox/uimafit/trunk/uimafit-examples/src/main/java/org/apache/uima/fit/examples/getstarted/GetStartedQuickDescriptor.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uimafit/trunk/uimafit-examples/src/main/java/org/apache/uima/fit/examples/getstarted/GetStartedQuickDescriptor.java?rev=1448303&r1=1448302&r2=1448303&view=diff
==============================================================================
--- uima/sandbox/uimafit/trunk/uimafit-examples/src/main/java/org/apache/uima/fit/examples/getstarted/GetStartedQuickDescriptor.java (original)
+++ uima/sandbox/uimafit/trunk/uimafit-examples/src/main/java/org/apache/uima/fit/examples/getstarted/GetStartedQuickDescriptor.java Wed Feb 20 17:14:03 2013
@@ -35,7 +35,7 @@ public class GetStartedQuickDescriptor {
 
   public static void main(String[] args) throws ResourceInitializationException,
           FileNotFoundException, SAXException, IOException {
-    // uimaFIT automatically uses all type systems listed in META-INF/org.uimafit/types.txt
+    // uimaFIT automatically uses all type systems listed in META-INF/org.apache.uima.fit/types.txt
 
     // Instantiate the analysis engine using the value "uimaFIT" for the parameter
     // PARAM_STRING ("stringParam").

Modified: uima/sandbox/uimafit/trunk/uimafit-examples/src/main/java/org/apache/uima/fit/examples/getstarted/GetStartedQuickPipeline.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uimafit/trunk/uimafit-examples/src/main/java/org/apache/uima/fit/examples/getstarted/GetStartedQuickPipeline.java?rev=1448303&r1=1448302&r2=1448303&view=diff
==============================================================================
--- uima/sandbox/uimafit/trunk/uimafit-examples/src/main/java/org/apache/uima/fit/examples/getstarted/GetStartedQuickPipeline.java (original)
+++ uima/sandbox/uimafit/trunk/uimafit-examples/src/main/java/org/apache/uima/fit/examples/getstarted/GetStartedQuickPipeline.java Wed Feb 20 17:14:03 2013
@@ -31,7 +31,7 @@ import org.apache.uima.jcas.JCas;
 public class GetStartedQuickPipeline {
 
   public static void main(String[] args) throws UIMAException {
-    // uimaFIT automatically uses all type systems listed in META-INF/org.uimafit/types.txt
+    // uimaFIT automatically uses all type systems listed in META-INF/org.apache.uima.fit/types.txt
 
     // uimaFIT doesn't provide any collection readers - so we will just instantiate a JCas and
     // run it through our AE

Modified: uima/sandbox/uimafit/trunk/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/LegacySupportPluginImpl.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uimafit/trunk/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/LegacySupportPluginImpl.java?rev=1448303&r1=1448302&r2=1448303&view=diff
==============================================================================
--- uima/sandbox/uimafit/trunk/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/LegacySupportPluginImpl.java (original)
+++ uima/sandbox/uimafit/trunk/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/LegacySupportPluginImpl.java Wed Feb 20 17:14:03 2013
@@ -33,6 +33,10 @@ import org.apache.uima.fit.legacy.conver
 import org.apache.uima.fit.legacy.converter.SofaCapabilityConverter;
 import org.apache.uima.fit.legacy.converter.TypeCapabilityConverter;
 import org.apache.uima.fit.util.LegacySupportPlugin;
+import org.apache.uima.fit.util.MetaDataType;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.uimafit.factory.FsIndexFactory;
+import org.uimafit.factory.TypeSystemDescriptionFactory;
 
 /**
  * Legacy support plug in for the Google Code version of uimaFIT.
@@ -138,4 +142,15 @@ public class LegacySupportPluginImpl imp
     }
     converterRegistry.put(aConverter.getModernType(), aConverter);
   }
+
+  public String[] scanTypeDescriptors(MetaDataType aType) throws ResourceInitializationException {
+    switch (aType) {
+      case FS_INDEX:
+        return FsIndexFactory.scanIndexDescriptors();
+      case TYPE_SYSTEM:
+        return TypeSystemDescriptionFactory.scanTypeDescriptors();
+      default:
+        return new String[0];
+    }
+  }
 }

Modified: uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/factory/FsIndexFactory.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/factory/FsIndexFactory.java?rev=1448303&r1=1448302&r2=1448303&view=diff
==============================================================================
--- uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/factory/FsIndexFactory.java (original)
+++ uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/factory/FsIndexFactory.java Wed Feb 20 17:14:03 2013
@@ -20,8 +20,7 @@ package org.apache.uima.fit.factory;
 
 import static java.util.Arrays.asList;
 import static org.apache.uima.UIMAFramework.getXMLParser;
-import static org.apache.uima.fit.factory.TypeSystemDescriptionFactory.resolve;
-import static org.apache.uima.fit.factory.TypeSystemDescriptionFactory.scanImportsAndManifests;
+import static org.apache.uima.fit.util.MetaDataUtil.*;
 import static org.apache.uima.fit.util.ReflectionUtil.getInheritableAnnotation;
 
 import java.io.IOException;
@@ -31,6 +30,7 @@ import java.util.List;
 import org.apache.commons.logging.LogFactory;
 import org.apache.uima.fit.descriptor.FsIndex;
 import org.apache.uima.fit.descriptor.FsIndexKey;
+import org.apache.uima.fit.util.MetaDataType;
 import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.resource.metadata.FsIndexCollection;
 import org.apache.uima.resource.metadata.FsIndexDescription;
@@ -147,17 +147,6 @@ public final class FsIndexFactory {
     return key;
   }
 
-  /**
-   * System property indicating which locations to scan for index descriptions. A list of locations
-   * may be given separated by ";".
-   */
-  public static final String FS_INDEX_IMPORT_PATTERN = "org.uimafit.fsindex.import_pattern";
-
-  /**
-   * Index manifest location.
-   */
-  public static final String FS_INDEX_MANIFEST_PATTERN = "classpath*:META-INF/org.uimafit/fsindexes.txt";
-
   private static String[] indexDescriptorLocations;
 
   /**
@@ -204,8 +193,8 @@ public final class FsIndexFactory {
 
   /**
    * Creates a {@link FsIndexCollection} from all index descriptions that can be found via the
-   * {@link #FS_INDEX_IMPORT_PATTERN} or via the {@code META-INF/org.uimafit/fsindexes.txt} files in
-   * the classpath.
+   * {@link #FS_INDEX_IMPORT_PATTERN} or via the {@code META-INF/org.apache.uima.fit/fsindexes.txt}
+   * files in the classpath.
    * 
    * @return the auto-scanned indexes.
    */
@@ -240,8 +229,7 @@ public final class FsIndexFactory {
    */
   public static String[] scanIndexDescriptors() throws ResourceInitializationException {
     if (indexDescriptorLocations == null) {
-      indexDescriptorLocations = resolve(scanImportsAndManifests(FS_INDEX_MANIFEST_PATTERN,
-              FS_INDEX_IMPORT_PATTERN));
+      indexDescriptorLocations = scanDescriptors(MetaDataType.FS_INDEX);
     }
     return indexDescriptorLocations;
   }

Modified: uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactory.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactory.java?rev=1448303&r1=1448302&r2=1448303&view=diff
==============================================================================
--- uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactory.java (original)
+++ uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactory.java Wed Feb 20 17:14:03 2013
@@ -19,20 +19,15 @@
 package org.apache.uima.fit.factory;
 
 import static org.apache.uima.UIMAFramework.getXMLParser;
+import static org.apache.uima.fit.util.MetaDataUtil.scanDescriptors;
 import static org.apache.uima.util.CasCreationUtils.mergeTypeSystems;
 
 import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
 
-import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.LogFactory;
+import org.apache.uima.fit.util.MetaDataType;
 import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.resource.metadata.Import;
 import org.apache.uima.resource.metadata.TypeSystemDescription;
@@ -40,8 +35,6 @@ import org.apache.uima.resource.metadata
 import org.apache.uima.resource.metadata.impl.TypeSystemDescription_impl;
 import org.apache.uima.util.InvalidXMLException;
 import org.apache.uima.util.XMLInputSource;
-import org.springframework.core.io.Resource;
-import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 
 /**
  */
@@ -50,17 +43,6 @@ public final class TypeSystemDescription
     // This class is not meant to be instantiated
   }
 
-  /**
-   * System property indicating which locations to scan for type descriptions. A list of locations
-   * may be given separated by ";".
-   */
-  public static final String TYPE_IMPORT_PATTERN = "org.apache.uima.fit.type.import_pattern";
-
-  /**
-   * Type manifest location.
-   */
-  public static final String TYPE_MANIFEST_PATTERN = "classpath*:META-INF/org.uimafit/types.txt";
-
   private static String[] typeDescriptorLocations;
 
   /**
@@ -134,8 +116,8 @@ public final class TypeSystemDescription
 
   /**
    * Creates a {@link TypeSystemDescription} from all type descriptions that can be found via the
-   * {@link #TYPE_IMPORT_PATTERN} or via the {@code META-INF/org.uimafit/types.txt} files in the
-   * classpath.
+   * {@link #TYPE_IMPORT_PATTERN} or via the {@code META-INF/org.apache.uima.fit/types.txt} files in
+   * the classpath.
    * 
    * @return the auto-scanned type system.
    */
@@ -170,8 +152,7 @@ public final class TypeSystemDescription
    */
   public static String[] scanTypeDescriptors() throws ResourceInitializationException {
     if (typeDescriptorLocations == null) {
-      typeDescriptorLocations = resolve(scanImportsAndManifests(TYPE_MANIFEST_PATTERN,
-              TYPE_IMPORT_PATTERN));
+      typeDescriptorLocations = scanDescriptors(MetaDataType.TYPE_SYSTEM);
     }
     return typeDescriptorLocations;
   }
@@ -183,65 +164,4 @@ public final class TypeSystemDescription
   public static void forceTypeDescriptorsScan() {
     typeDescriptorLocations = null;
   }
-
-  /**
-   * Scan patterns from manifest files and from the specified system property.
-   * 
-   * @param manifestPatterns
-   *          pattern matching the manifest files.
-   * @param importProperty
-   *          system property containing additional patterns.
-   * @return array or all patterns found.
-   */
-  public static String[] scanImportsAndManifests(String manifestPatterns, String importProperty)
-          throws ResourceInitializationException {
-    ArrayList<String> patterns = new ArrayList<String>();
-
-    // Scan auto-import locations
-    patterns.addAll(Arrays.asList(System.getProperty(importProperty, "").split(";")));
-
-    // Scan manifest
-    for (String mfUrl : resolve(manifestPatterns)) {
-      InputStream is = null;
-      try {
-        is = new URL(mfUrl).openStream();
-        @SuppressWarnings("unchecked")
-        List<? extends String> lines = IOUtils.readLines(is);
-        patterns.addAll(lines);
-      } catch (IOException e) {
-        throw new ResourceInitializationException(e);
-      } finally {
-        IOUtils.closeQuietly(is);
-      }
-    }
-
-    return patterns.toArray(new String[patterns.size()]);
-  }
-
-  /**
-   * Resolve a list of patterns to a set of URLs.
-   * 
-   * @return an array of locations.
-   * @throws ResourceInitializationException
-   *           if the locations could not be resolved.
-   */
-  public static String[] resolve(String... patterns) throws ResourceInitializationException {
-    Set<String> locations = new HashSet<String>();
-    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
-    try {
-      // Scan auto-import locations. Using a set to avoid scanning a pattern twice.
-      for (String pattern : new TreeSet<String>(Arrays.asList(patterns))) {
-        String p = pattern.trim();
-        if (p.length() == 0) {
-          continue;
-        }
-        for (Resource r : resolver.getResources(pattern)) {
-          locations.add(r.getURL().toString());
-        }
-      }
-      return locations.toArray(new String[locations.size()]);
-    } catch (IOException e) {
-      throw new ResourceInitializationException(e);
-    }
-  }
 }

Modified: uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/EnhancedClassFile.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/EnhancedClassFile.java?rev=1448303&r1=1448302&r2=1448303&view=diff
==============================================================================
--- uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/EnhancedClassFile.java (original)
+++ uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/EnhancedClassFile.java Wed Feb 20 17:14:03 2013
@@ -25,7 +25,7 @@ import java.lang.annotation.RetentionPol
 import java.lang.annotation.Target;
 
 /**
- * Marks a class as having been processed by an uimaFIT class enhancer, such as the
+ * INTERNAL API - Marks a class as having been processed by an uimaFIT class enhancer, such as the
  * uimafit-maven-plugin. If the annotation is present, the enhancer does process the class again.
  */
 @Retention(RetentionPolicy.RUNTIME)

Modified: uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/ExtendedExternalResourceDescription_impl.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/ExtendedExternalResourceDescription_impl.java?rev=1448303&r1=1448302&r2=1448303&view=diff
==============================================================================
--- uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/ExtendedExternalResourceDescription_impl.java (original)
+++ uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/ExtendedExternalResourceDescription_impl.java Wed Feb 20 17:14:03 2013
@@ -27,7 +27,7 @@ import org.apache.uima.resource.impl.Ext
 import org.apache.uima.resource.metadata.ExternalResourceBinding;
 
 /**
- * Extended {@link ExternalResourceDescription_impl} which can carry
+ * INTERNAL API - Extended {@link ExternalResourceDescription_impl} which can carry
  * {@link ExternalResourceDescription}s.
  * 
  */

Modified: uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/ExtendedLogger.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/ExtendedLogger.java?rev=1448303&r1=1448302&r2=1448303&view=diff
==============================================================================
--- uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/ExtendedLogger.java (original)
+++ uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/ExtendedLogger.java Wed Feb 20 17:14:03 2013
@@ -27,7 +27,7 @@ import org.apache.uima.util.Level;
 import org.apache.uima.util.Logger;
 
 /**
- * Wrapper for the UIMA {@link Logger} offering a more convenient API similar to that of the Apache
+ * INTERNAL API - Wrapper for the UIMA {@link Logger} offering a more convenient API similar to that of the Apache
  * Commons Logging interface {@link org.apache.commons.logging.Log Log} or to that of Log4J's
  * {@code Category} and SLF4J's {@code Logger}, using the names {@code error}, {@code warn},
  * {@code info}, {@code debug} and {@code trace} and mapping these to UIMA logging levels.

Modified: uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/JCasGenPomFriendly.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/JCasGenPomFriendly.java?rev=1448303&r1=1448302&r2=1448303&view=diff
==============================================================================
--- uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/JCasGenPomFriendly.java (original)
+++ uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/JCasGenPomFriendly.java Wed Feb 20 17:14:03 2013
@@ -24,7 +24,6 @@ import java.io.IOException;
 
 import org.apache.uima.cas.CAS;
 import org.apache.uima.cas.impl.CASImpl;
-import org.apache.uima.fit.factory.TypeSystemDescriptionFactory;
 import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.resource.metadata.TypeSystemDescription;
 import org.apache.uima.tools.jcasgen.Jg;
@@ -55,9 +54,9 @@ import org.apache.uima.util.XMLInputSour
  *   &lt;/executions>
  *   &lt;configuration>
  *     &lt;classpathScope>test&lt;/classpathScope>
- *     &lt;mainClass>org.uimafit.util.JCasGenPomFriendly&lt;/mainClass>
+ *     &lt;mainClass>org.apache.uima.fit.util.util.JCasGenPomFriendly&lt;/mainClass>
  *     &lt;arguments>
- *       &lt;argument>file:src/test/resources/META-INF/org.uimafit/type/**&#47;*.xml&lt;/argument>
+ *       &lt;argument>file:src/test/resources/META-INF/org.apache.uima.fit/type/**&#47;*.xml&lt;/argument>
  *       &lt;argument>${basedir}/src/test/java&lt;/argument>
  *     &lt;/arguments>
  *   &lt;/configuration>
@@ -71,7 +70,7 @@ public class JCasGenPomFriendly {
    */
   public static void main(String[] args) throws Exception {
     Jg jg = new Jg();
-    for (String file : TypeSystemDescriptionFactory.resolve(args[0].split(";"))) {
+    for (String file : MetaDataUtil.resolve(args[0].split(";"))) {
       generate(jg, file, args[1], load(file));
     }
   }

Added: uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/LegacySupport.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/LegacySupport.java?rev=1448303&view=auto
==============================================================================
--- uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/LegacySupport.java (added)
+++ uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/LegacySupport.java Wed Feb 20 17:14:03 2013
@@ -0,0 +1,70 @@
+package org.apache.uima.fit.util;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AccessibleObject;
+
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * INTERNAL API - Legacy support.
+ */
+public final class LegacySupport {
+
+  private LegacySupport() {
+    // No instances
+  }
+
+  private static LegacySupportPlugin legacySupportPlugin;
+
+  // Initialize legacy support once on startup.
+  static {
+    try {
+      Class<?> plc = Class.forName("org.apache.uima.fit.legacy.LegacySupportPluginImpl");
+      legacySupportPlugin = (LegacySupportPlugin) plc.newInstance();
+    } catch (IllegalAccessException e) {
+      // Cannot access legacy support for some reason, where to log this?
+    } catch (ClassNotFoundException e) {
+      // Legacy support not available.
+    } catch (InstantiationException e) {
+      // Some other odd reason the plugin cannot be instantiated. Again, where to log this?
+    }
+
+    // If no legacy support is available, instantiate a dummy.
+    if (legacySupportPlugin == null) {
+      legacySupportPlugin = new LegacySupportPlugin() {
+        public boolean isAnnotationPresent(AccessibleObject aObject,
+                Class<? extends Annotation> aAnnotationClass) {
+          return false;
+        }
+
+        public <L extends Annotation, M extends Annotation> M getAnnotation(
+                AccessibleObject aObject, Class<M> aAnnotationClass) {
+          return null;
+        }
+
+        public boolean isAnnotationPresent(Class<?> aObject,
+                Class<? extends Annotation> aAnnotationClass) {
+          return false;
+        }
+
+        public <L extends Annotation, M extends Annotation> M getAnnotation(Class<?> aObject,
+                Class<M> aAnnotationClass) {
+          return null;
+        }
+
+        public String[] scanTypeDescriptors(MetaDataType aType)
+                throws ResourceInitializationException {
+          return new String[0];
+        }
+      };
+    }
+  }
+  
+  /**
+   * Get legacy support instance. Never returns {@code null}. If no legacy support plug-in is 
+   * available, a dummy plug-in is returned.
+   */
+  public static LegacySupportPlugin getInstance() {
+    return legacySupportPlugin;
+  }
+}

Propchange: uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/LegacySupport.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/LegacySupportPlugin.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/LegacySupportPlugin.java?rev=1448303&r1=1448302&r2=1448303&view=diff
==============================================================================
--- uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/LegacySupportPlugin.java (original)
+++ uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/LegacySupportPlugin.java Wed Feb 20 17:14:03 2013
@@ -3,6 +3,11 @@ package org.apache.uima.fit.util;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.AccessibleObject;
 
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * INTERNAL API - Legacy support plug-in API.
+ */
 public interface LegacySupportPlugin {
   /**
    * Checks if a legacy version of the given modern annotation is present.
@@ -69,4 +74,13 @@ public interface LegacySupportPlugin {
 //   */
 //  <M extends Annotation> Object getDefaultValue(AccessibleObject aObject, Class<M> aAnnotationClass,
 //          String aProperty);
+
+  /**
+   * Get all currently accessible descriptor locations for the given type.
+   * 
+   * @return an array of locations.
+   * @throws ResourceInitializationException
+   *           if the locations could not be resolved.
+   */
+  String[] scanTypeDescriptors(MetaDataType aType) throws ResourceInitializationException;
 }

Added: uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/MetaDataType.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/MetaDataType.java?rev=1448303&view=auto
==============================================================================
--- uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/MetaDataType.java (added)
+++ uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/MetaDataType.java Wed Feb 20 17:14:03 2013
@@ -0,0 +1,9 @@
+package org.apache.uima.fit.util;
+
+/**
+ * INTERNAL API - Kinds of meta data uimaFIT uses.
+ */
+public enum MetaDataType {
+  TYPE_SYSTEM,
+  FS_INDEX;
+}

Propchange: uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/MetaDataType.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/MetaDataUtil.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/MetaDataUtil.java?rev=1448303&view=auto
==============================================================================
--- uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/MetaDataUtil.java (added)
+++ uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/MetaDataUtil.java Wed Feb 20 17:14:03 2013
@@ -0,0 +1,139 @@
+package org.apache.uima.fit.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+
+/**
+ * INTERNAL API - Utility methods to locate and access uimaFIT meta data.
+ */
+public final class MetaDataUtil {
+
+  private MetaDataUtil() {
+    // No instances
+  }
+
+  /**
+   * Scan patterns from manifest files and from the specified system property.
+   * 
+   * @param manifestPatterns
+   *          pattern matching the manifest files.
+   * @param importProperty
+   *          system property containing additional patterns.
+   * @return array or all patterns found.
+   */
+  public static String[] scanImportsAndManifests(MetaDataType aType)
+          throws ResourceInitializationException {
+    ArrayList<String> patterns = new ArrayList<String>();
+
+    // Scan auto-import locations
+    for (String property : getImportProperties(aType)) {
+      patterns.addAll(Arrays.asList(System.getProperty(property, "").split(";")));
+    }
+
+    // Scan manifest
+    for (String mfUrl : resolve(getManifestLocations(aType))) {
+      InputStream is = null;
+      try {
+        is = new URL(mfUrl).openStream();
+        @SuppressWarnings("unchecked")
+        List<? extends String> lines = IOUtils.readLines(is);
+        patterns.addAll(lines);
+      } catch (IOException e) {
+        throw new ResourceInitializationException(e);
+      } finally {
+        IOUtils.closeQuietly(is);
+      }
+    }
+
+    return patterns.toArray(new String[patterns.size()]);
+  }
+
+  /**
+   * Resolve a list of patterns to a set of URLs.
+   * 
+   * @return an array of locations.
+   * @throws ResourceInitializationException
+   *           if the locations could not be resolved.
+   */
+  public static String[] resolve(String... patterns) throws ResourceInitializationException {
+    Set<String> locations = new HashSet<String>();
+    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
+    try {
+      // Scan auto-import locations. Using a set to avoid scanning a pattern twice.
+      for (String pattern : new TreeSet<String>(Arrays.asList(patterns))) {
+        String p = pattern.trim();
+        if (p.length() == 0) {
+          continue;
+        }
+        for (Resource r : resolver.getResources(pattern)) {
+          locations.add(r.getURL().toString());
+        }
+      }
+      return locations.toArray(new String[locations.size()]);
+    } catch (IOException e) {
+      throw new ResourceInitializationException(e);
+    }
+  }
+
+  /**
+   * Get manifest locations for the specified type.
+   */
+  public static String[] getManifestLocations(MetaDataType aType) {
+    List<String> locations = new ArrayList<String>();
+    switch (aType) {
+      case FS_INDEX:
+        locations.add("classpath*:META-INF/org.apache.uima.fit/fsindexes.txt");
+        break;
+      case TYPE_SYSTEM:
+        locations.add("classpath*:META-INF/org.apache.uima.fit/types.txt");
+        break;
+    }
+
+    return locations.toArray(new String[locations.size()]);
+  }
+
+  /**
+   * Get system properties indicating which locations to scan for descriptions of the given type. A
+   * list of locations may be given separated by ";".
+   */
+  public static String[] getImportProperties(MetaDataType aType) {
+    List<String> locations = new ArrayList<String>();
+    switch (aType) {
+      case FS_INDEX:
+        locations.add("org.apache.uima.fit.fsindex.import_pattern");
+        break;
+      case TYPE_SYSTEM:
+        locations.add("org.apache.uima.fit.type.import_pattern");
+        break;
+    }
+
+    return locations.toArray(new String[locations.size()]);
+  }
+  
+  /**
+   * Get all currently accessible descriptor locations for the given type.
+   * 
+   * @return an array of locations.
+   * @throws ResourceInitializationException
+   *           if the locations could not be resolved.
+   */
+  public static String[] scanDescriptors(MetaDataType aType)
+          throws ResourceInitializationException {
+    String[] locations1 = resolve(scanImportsAndManifests(aType));
+    String[] locations2 = LegacySupport.getInstance().scanTypeDescriptors(aType);
+    return (String[]) ArrayUtils.addAll(locations1, locations2);
+  }
+}

Propchange: uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/MetaDataUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/ReflectionUtil.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/ReflectionUtil.java?rev=1448303&r1=1448302&r2=1448303&view=diff
==============================================================================
--- uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/ReflectionUtil.java (original)
+++ uima/sandbox/uimafit/trunk/uimafit/src/main/java/org/apache/uima/fit/util/ReflectionUtil.java Wed Feb 20 17:14:03 2013
@@ -26,50 +26,10 @@ import java.util.Arrays;
 import java.util.List;
 
 /**
+ * INTERNAL API - Utility methods to access Java annotations.
  */
 public final class ReflectionUtil {
 
-  private static LegacySupportPlugin legacySupportPlugin;
-
-  // Initialize legacy support once on startup.
-  static {
-    try {
-      Class<?> plc = Class.forName("org.apache.uima.fit.legacy.LegacySupportPluginImpl");
-      legacySupportPlugin = (LegacySupportPlugin) plc.newInstance();
-    } catch (IllegalAccessException e) {
-      // Cannot access legacy support for some reason, where to log this?
-    } catch (ClassNotFoundException e) {
-      // Legacy support not available.
-    } catch (InstantiationException e) {
-      // Some other odd reason the plugin cannot be instantiated. Again, where to log this?
-    }
-
-    // If no legacy support is available, instantiate a dummy.
-    if (legacySupportPlugin == null) {
-      legacySupportPlugin = new LegacySupportPlugin() {
-        public boolean isAnnotationPresent(AccessibleObject aObject,
-                Class<? extends Annotation> aAnnotationClass) {
-          return false;
-        }
-
-        public <L extends Annotation, M extends Annotation> M getAnnotation(
-                AccessibleObject aObject, Class<M> aAnnotationClass) {
-          return null;
-        }
-
-        public boolean isAnnotationPresent(Class<?> aObject,
-                Class<? extends Annotation> aAnnotationClass) {
-          return false;
-        }
-
-        public <L extends Annotation, M extends Annotation> M getAnnotation(Class<?> aObject,
-                Class<M> aAnnotationClass) {
-          return null;
-        }
-      };
-    }
-  }
-  
   private ReflectionUtil() {
     // Library class
   }
@@ -173,7 +133,7 @@ public final class ReflectionUtil {
     }
     
     // If not present, check if an equivalent legacy annotation is present
-    return legacySupportPlugin.isAnnotationPresent(aObject, aAnnotationClass);
+    return LegacySupport.getInstance().isAnnotationPresent(aObject, aAnnotationClass);
   }
   
   /**
@@ -188,7 +148,7 @@ public final class ReflectionUtil {
     }
     
     // If not present, check if an equivalent legacy annotation is present
-    return legacySupportPlugin.isAnnotationPresent(aObject, aAnnotationClass);
+    return LegacySupport.getInstance().isAnnotationPresent(aObject, aAnnotationClass);
   }
   
   /**
@@ -200,7 +160,7 @@ public final class ReflectionUtil {
   {
     T annotation = aObject.getAnnotation(aAnnotationClass);
     if (annotation == null) {
-      annotation = legacySupportPlugin.getAnnotation(aObject, aAnnotationClass);
+      annotation = LegacySupport.getInstance().getAnnotation(aObject, aAnnotationClass);
     }
     return annotation;
   }
@@ -214,7 +174,7 @@ public final class ReflectionUtil {
   {
     T annotation = aObject.getAnnotation(aAnnotationClass);
     if (annotation == null) {
-      annotation = legacySupportPlugin.getAnnotation(aObject, aAnnotationClass);
+      annotation = LegacySupport.getInstance().getAnnotation(aObject, aAnnotationClass);
     }
     return annotation;
   }