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 * </executions> * <configuration> * <classpathScope>test</classpathScope> - * <mainClass>org.uimafit.util.JCasGenPomFriendly</mainClass> + * <mainClass>org.apache.uima.fit.util.util.JCasGenPomFriendly</mainClass> * <arguments> - * <argument>file:src/test/resources/META-INF/org.uimafit/type/**/*.xml</argument> + * <argument>file:src/test/resources/META-INF/org.apache.uima.fit/type/**/*.xml</argument> * <argument>${basedir}/src/test/java</argument> * </arguments> * </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; }