001 package org.maltparser.core.feature.system;
002
003 import java.lang.reflect.Constructor;
004 import java.lang.reflect.InvocationTargetException;
005
006 import org.maltparser.core.config.ConfigurationRegistry;
007 import org.maltparser.core.exception.MaltChainedException;
008 import org.maltparser.core.feature.AbstractFeatureFactory;
009 import org.maltparser.core.feature.FeatureException;
010 import org.maltparser.core.feature.function.Function;
011 /**
012 *
013 *
014 * @author Johan Hall
015 * @since 1.0
016 **/
017 public class FunctionDescription {
018 private String name;
019 private Class<?> functionClass;
020 private boolean hasSubfunctions;
021 private boolean hasFactory;
022
023 // public FunctionDescription(String name, Class<?> functionClass, boolean hasSubfunctions) {
024 // setName(name);
025 // setFunctionClass(functionClass);
026 // setHasSubfunctions(hasSubfunctions);
027 // }
028
029 public FunctionDescription(String name, Class<?> functionClass, boolean hasSubfunctions, boolean hasFactory) {
030 setName(name);
031 setFunctionClass(functionClass);
032 setHasSubfunctions(hasSubfunctions);
033 setHasFactory(hasFactory);
034 }
035
036 public Function newFunction(ConfigurationRegistry registry) throws MaltChainedException {
037 if (hasFactory) {
038 for (Class<?> c : registry.keySet()) {
039 try {
040 c.asSubclass(functionClass);
041 } catch (ClassCastException e) {
042 continue;
043 }
044 return ((AbstractFeatureFactory)registry.get(c)).makeFunction(name);
045 }
046 return null;
047 }
048 Constructor<?>[] constructors = functionClass.getConstructors();
049 if (constructors.length == 0) {
050 try {
051 return (Function)functionClass.newInstance();
052 } catch (InstantiationException e) {
053 throw new FeatureException("The function '"+functionClass.getName()+"' cannot be initialized. ", e);
054 } catch (IllegalAccessException e) {
055 throw new FeatureException("The function '"+functionClass.getName()+"' cannot be initialized. ", e);
056 }
057 }
058 Class<?>[] params = constructors[0].getParameterTypes();
059 if (params.length == 0) {
060 try {
061 return (Function)functionClass.newInstance();
062 } catch (InstantiationException e) {
063 throw new FeatureException("The function '"+functionClass.getName()+"' cannot be initialized. ", e);
064 } catch (IllegalAccessException e) {
065 throw new FeatureException("The function '"+functionClass.getName()+"' cannot be initialized. ", e);
066 }
067 }
068 Object[] arguments = new Object[params.length];
069 for (int i = 0; i < params.length; i++) {
070 if (hasSubfunctions && params[i] == java.lang.String.class) {
071 arguments[i] = name;
072 } else {
073 arguments[i] = registry.get(params[i]);
074 if (arguments[i] == null) {
075 return null;
076 }
077 }
078 }
079 try {
080 return (Function)constructors[0].newInstance(arguments);
081 } catch (InstantiationException e) {
082 throw new FeatureException("The function '"+functionClass.getName()+"' cannot be initialized. ", e);
083 } catch (IllegalAccessException e) {
084 throw new FeatureException("The function '"+functionClass.getName()+"' cannot be initialized. ", e);
085 } catch (InvocationTargetException e) {
086 throw new FeatureException("The function '"+functionClass.getName()+"' cannot be initialized. ", e);
087 }
088 }
089
090 public String getName() {
091 return name;
092 }
093
094 public void setName(String name) {
095 this.name = name;
096 }
097
098 public Class<?> getFunctionClass() {
099 return functionClass;
100 }
101
102 public void setFunctionClass(Class<?> functionClass) {
103 this.functionClass = functionClass;
104 }
105
106 public boolean isHasSubfunctions() {
107 return hasSubfunctions;
108 }
109
110 public void setHasSubfunctions(boolean hasSubfunctions) {
111 this.hasSubfunctions = hasSubfunctions;
112 }
113
114 public boolean isHasFactory() {
115 return hasFactory;
116 }
117
118 public void setHasFactory(boolean hasFactory) {
119 this.hasFactory = hasFactory;
120 }
121
122 public boolean equals(Object obj) {
123 if (this == obj)
124 return true;
125 if (obj == null)
126 return false;
127 if (getClass() != obj.getClass())
128 return false;
129 if (!(name.equalsIgnoreCase(((FunctionDescription)obj).getName()))) {
130 return false;
131 } else if (!(functionClass.equals(((FunctionDescription)obj).getFunctionClass()))) {
132 return false;
133 }
134 return true;
135 }
136
137 public String toString() {
138 StringBuilder sb = new StringBuilder();
139 sb.append(name);
140 sb.append("->");
141 sb.append(functionClass.getName());
142 return sb.toString();
143 }
144 }