Log in Help
Print
Homereleasesgate-5.1-beta2-build3402-ALLpluginsUIMAsrcgateuimamapping 〉 ObjectManager.java
 
/*
 *  Copyright (c) 2005, The University of Sheffield.
 *
 *  This file is part of the GATE/UIMA integration layer, and is free
 *  software, released under the terms of the GNU Lesser General Public
 *  Licence, version 2.1 (or any later version).  A copy of this licence
 *  is provided in the file LICENCE in the distribution.
 *
 *  UIMA is a product of IBM, details are available from
 *  http://alphaworks.ibm.com/tech/uima
 */
package gate.uima.mapping;

import java.util.*;
import java.io.InputStream;
import java.io.IOException;

import org.apache.uima.cas.TypeSystem;
import org.jdom.Element;

public class ObjectManager {
  /**
   * Helper class that should not be instantiated.
   */
  private ObjectManager() {
  }

  private static Map elementNameToClass = null;

  private static synchronized void init() throws MappingException {
    // return if already inited
    if(elementNameToClass != null) {
      return;
    }

    Map elementNameMap = new HashMap();

    Properties builderClasses = new Properties();
    InputStream propsStream =
        ObjectManager.class.getResourceAsStream("objectbuilders.properties");
    try {
      builderClasses.load(propsStream);
    }
    catch(IOException ioe) {
      throw new MappingException("Couldn't load objectbuilders.properties");
    }

    // file format is elementName=className
    Iterator buildersIt = builderClasses.entrySet().iterator();
    while(buildersIt.hasNext()) {
      Map.Entry builder = (Map.Entry)buildersIt.next();
      try {
        Class builderClass = Class.forName((String)builder.getValue());
        elementNameMap.put(builder.getKey(), builderClass);
      }
      catch(ClassNotFoundException cnfe) {
        throw new MappingException("Couldn't load builder class "
            + builder.getValue(), cnfe);
      }
    }

    // store complete map
    elementNameToClass = elementNameMap;
  }

  /**
   * Create an object builder appropriate to the given XML element, and
   * initialise it with the given type system.
   */
  public static ObjectBuilder createBuilder(Element elt, TypeSystem typeSystem)
          throws MappingException {
    // load builder definitions, if necessary
    if(elementNameToClass == null) {
      init();
    }

    String elementName = elt.getName();
    Class builderClass = (Class)elementNameToClass.get(elementName);
    if(builderClass == null) {
      throw new MappingException("Unrecognised element name " + elementName);
    }

    ObjectBuilder builder = null;
    try {
      builder = (ObjectBuilder)builderClass.newInstance();
    }
    catch(IllegalAccessException iae) {
      throw new MappingException("Couldn't access class "
          + builderClass.getName(), iae);
    }
    catch(InstantiationException ie) {
      throw new MappingException("Couldn't instantiate builder class "
          + builderClass.getName(), ie);
    }

    builder.configure(elt, typeSystem);
    return builder;
  }
}