On Thu, Feb 28, 2008 at 10:03 AM, Roberto Franchini
<[EMAIL PROTECTED]> wrote:
> On Wed, Feb 27, 2008 at 12:32 AM, Steven Bethard wrote:
> > Worked like a charm. Using the appropriate _impl classes, I was able
> > to write exactly the kind of utility functions I was hoping for,
> > e.g.::
> >
> > AnalysisEngine relevanceReader = Util.getAnalysisEngine(
> > RelevanceReader.class,
> > Util.getTypeSystem(Document.class, RelevantDomain.class),
> > RelevanceReader.PARAM_ANNOTATIONS_PATH, annotationsPath);
>
> MAy you post this useful (at least for me) factory method?
It's actually a fair bit of code, but here you go:
public static AnalysisEngine getAnalysisEngine(
Class<? extends AnalysisComponent> componentClass,
TypeSystemDescription typeSystem,
Object ... configurationParameters)
throws ResourceInitializationException {
// create the descriptor and set configuration parameters
AnalysisEngineDescription desc =
new AnalysisEngineDescription_impl();
desc.setFrameworkImplementation(Constants.JAVA_FRAMEWORK_NAME);
desc.setPrimitive(true);
desc.setAnnotatorImplementationName(componentClass.getName());
setConfigurationParameters(desc, configurationParameters);
// set the type system
if (typeSystem != null) {
desc.getAnalysisEngineMetaData().setTypeSystem(typeSystem);
}
// create the AnalysisEngine, initialize it and return it
AnalysisEngine engine = new PrimitiveAnalysisEngine_impl();
engine.initialize(desc, null);
return engine;
}
public static CollectionReader getCollectionReader(
Class<? extends CollectionReader> readerClass,
TypeSystemDescription typeSystem,
Object ... configurationParameters)
throws ResourceInitializationException {
// create the descriptor and set configuration parameters
CollectionReaderDescription desc =
new CollectionReaderDescription_impl();
desc.setFrameworkImplementation(Constants.JAVA_FRAMEWORK_NAME);
desc.setImplementationName(readerClass.getName());
setConfigurationParameters(desc, configurationParameters);
// set the type system
if (typeSystem != null) {
desc.getCollectionReaderMetaData().setTypeSystem(typeSystem);
}
// create the CollectionReader
CollectionReader reader;
try {
reader = readerClass.newInstance();
} catch (InstantiationException e) {
throw new ResourceInitializationException(e);
} catch (IllegalAccessException e) {
throw new ResourceInitializationException(e);
}
// initialize the CollectionReader and return it
reader.initialize(desc, null);
return reader;
}
public static TypeSystemDescription getTypeSystem(
Class<?> ... annotationClasses) {
TypeSystemDescription typeSystem =
new TypeSystemDescription_impl();
List<Import> imports = new ArrayList<Import>();
for (Class<?> annotationClass: annotationClasses) {
Import imp = new Import_impl();
imp.setName(annotationClass.getName());
imports.add(imp);
}
Import[] importArray = new Import[imports.size()];
typeSystem.setImports(imports.toArray(importArray));
return typeSystem;
}
private static void setConfigurationParameters(
ResourceCreationSpecifier specifier,
Object ... configurationParameters) {
if (configurationParameters.length % 2 != 0) {
String message = "a value must be specified for each parameter";
throw new IllegalArgumentException(message);
}
ResourceMetaData metaData = specifier.getMetaData();
ConfigurationParameterDeclarations paramDecls =
metaData.getConfigurationParameterDeclarations();
ConfigurationParameterSettings paramSettings =
metaData.getConfigurationParameterSettings();
for (int i = 0; i < configurationParameters.length; i += 2) {
String name = (String)configurationParameters[i];
Object value = configurationParameters[i + 1];
String javaClassName = value.getClass().getName();
String uimaType = javaUimaTypeMap.get(javaClassName);
if (uimaType == null) {
String message = "invalid parameter type " + javaClassName;
throw new IllegalArgumentException(message);
}
ConfigurationParameter param =
new ConfigurationParameter_impl();
param.setName(name);
param.setType(uimaType);
paramDecls.addConfigurationParameter(param);
paramSettings.setParameterValue(name, value);
}
}
private static final Map<String, String> javaUimaTypeMap =
new HashMap<String, String>();
static {
javaUimaTypeMap.put(
boolean.class.getName(),
ConfigurationParameter.TYPE_BOOLEAN);
javaUimaTypeMap.put(
float.class.getName(),
ConfigurationParameter.TYPE_FLOAT);
javaUimaTypeMap.put(
int.class.getName(),
ConfigurationParameter.TYPE_INTEGER);
javaUimaTypeMap.put(
String.class.getName(),
ConfigurationParameter.TYPE_STRING);
};