You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@opennlp.apache.org by Joern Kottmann <ko...@gmail.com> on 2012/02/10 09:11:26 UTC

Re: svn commit: r1242648 - /incubator/opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/postag/POSModel.java

Isn't there a better way to indicate that we cannot find the
Factory class?

I am sure that is something which often will fail if users
specify a custom Factory class in their model. We need a
good error message here which really explains what is going wrong.

Jörn

On Fri, Feb 10, 2012 at 4:36 AM, <co...@apache.org> wrote:

> Author: colen
> Date: Fri Feb 10 03:36:10 2012
> New Revision: 1242648
>
> URL: http://svn.apache.org/viewvc?rev=1242648&view=rev
> Log:
> OPENNLP-429: Added mechanism to save the factory class name, and to load
> it back.
>
> Modified:
>
>  incubator/opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/postag/POSModel.java
>
> Modified:
> incubator/opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/postag/POSModel.java
> URL:
> http://svn.apache.org/viewvc/incubator/opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/postag/POSModel.java?rev=1242648&r1=1242647&r2=1242648&view=diff
>
> ==============================================================================
> ---
> incubator/opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/postag/POSModel.java
> (original)
> +++
> incubator/opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/postag/POSModel.java
> Fri Feb 10 03:36:10 2012
> @@ -21,6 +21,7 @@ package opennlp.tools.postag;
>  import java.io.IOException;
>  import java.io.InputStream;
>  import java.io.OutputStream;
> +import java.lang.reflect.Constructor;
>  import java.util.Collections;
>  import java.util.HashSet;
>  import java.util.Map;
> @@ -64,10 +65,22 @@ public final class POSModel extends Base
>   private static final String POS_MODEL_ENTRY_NAME = "pos.model";
>   private static final String TAG_DICTIONARY_ENTRY_NAME = "tags.tagdict";
>   private static final String NGRAM_DICTIONARY_ENTRY_NAME =
> "ngram.dictionary";
> +  private static final String FACTORY_NAME = "pos.factory";
>
>   public POSModel(String languageCode, AbstractModel posModel,
>       POSDictionary tagDictionary, Dictionary ngramDict, Map<String,
> String> manifestInfoEntries) {
>
> +    this(languageCode, posModel, tagDictionary, ngramDict,
> manifestInfoEntries, null);
> +  }
> +
> +  public POSModel(String languageCode, AbstractModel posModel,
> +      POSDictionary tagDictionary, Dictionary ngramDict) {
> +    this (languageCode, posModel, tagDictionary, ngramDict, null, null);
> +  }
> +
> +  public POSModel(String languageCode, AbstractModel posModel,
> +      POSDictionary tagDictionary, Dictionary ngramDict, Map<String,
> String> manifestInfoEntries, Factory posFactory) {
> +
>     super(COMPONENT_NAME, languageCode, manifestInfoEntries);
>
>     if (posModel == null)
> @@ -81,12 +94,16 @@ public final class POSModel extends Base
>     if (ngramDict != null)
>       artifactMap.put(NGRAM_DICTIONARY_ENTRY_NAME, ngramDict);
>
> +    // The factory is optional
> +    if (posFactory!=null)
> +        setManifestProperty(FACTORY_NAME,
> posFactory.getClass().getCanonicalName());
> +
>     checkArtifactMap();
>   }
>
>   public POSModel(String languageCode, AbstractModel posModel,
> -      POSDictionary tagDictionary, Dictionary ngramDict) {
> -    this (languageCode, posModel, tagDictionary, ngramDict, null);
> +      POSDictionary tagDictionary, Dictionary ngramDict, Factory f) {
> +    this (languageCode, posModel, tagDictionary, ngramDict, null, f);
>   }
>
>   public POSModel(InputStream in) throws IOException,
> InvalidFormatException {
> @@ -110,7 +127,17 @@ public final class POSModel extends Base
>     if (!(artifactMap.get(POS_MODEL_ENTRY_NAME) instanceof AbstractModel))
> {
>       throw new InvalidFormatException("POS model is incomplete!");
>     }
> -
> +
> +    // validate the factory
> +    String factoryName = getManifestProperty(FACTORY_NAME);
> +    if(factoryName != null) {
> +      try {
> +        Class.forName(factoryName);
> +      } catch (ClassNotFoundException e) {
> +        throw new InvalidFormatException("Could not find the POS factory
> class: " + factoryName);
> +      }
> +    }
> +
>     // Ensure that the tag dictionary is compatible with the model
>     Object tagdictEntry = artifactMap.get(TAG_DICTIONARY_ENTRY_NAME);
>
> @@ -167,6 +194,46 @@ public final class POSModel extends Base
>   public POSDictionary getTagDictionary() {
>     return (POSDictionary) artifactMap.get(TAG_DICTIONARY_ENTRY_NAME);
>   }
> +
> +  public Factory getFactory() {
> +    String factoryName = getManifestProperty(FACTORY_NAME);
> +    Factory theFactory = null;
> +    Class<?> factoryClass = null;
> +    if(factoryName != null) {
> +      try {
> +        factoryClass = Class.forName(factoryName);
> +      } catch (ClassNotFoundException e) {
> +        // already validated
> +        return null;
> +      }
> +    }
> +
> +    Constructor<?> constructor = null;
> +    if(factoryClass != null) {
> +      try {
> +        constructor = factoryClass.getConstructor(Dictionary.class,
> POSDictionary.class);
> +        theFactory = (Factory)
> constructor.newInstance(getNgramDictionary(), getTagDictionary());
> +      } catch (NoSuchMethodException e) {
> +        // ignore, will try another constructor
> +      } catch (Exception e) {
> +        throw new IllegalArgumentException("Could not load POS Factory
> using Dictionary, POSDictionary constructor: " + factoryName, e);
> +      }
> +      if(theFactory == null) {
> +        try {
> +          factoryClass.getConstructor();
> +          try {
> +            theFactory = (Factory) constructor.newInstance();
> +          } catch (Exception e) {
> +            throw new IllegalArgumentException("Could not load POS
> Factory using default constructor: " + factoryName, e);
> +          }
> +        } catch (NoSuchMethodException e) {
> +          // we couldn't load the class... raise an exception
> +          throw new IllegalArgumentException("Could not load POS Factory:
> " + factoryName, e);
> +        }
> +      }
> +    }
> +    return theFactory;
> +  }
>
>   /**
>    * Retrieves the ngram dictionary.
>
>
>