001 package org.maltparser.core.feature.spec;
002
003 import java.net.URL;
004 import java.util.ArrayList;
005 import java.util.HashMap;
006 import java.util.LinkedHashMap;
007
008 import org.maltparser.core.exception.MaltChainedException;
009 import org.maltparser.core.feature.FeatureException;
010 import org.maltparser.core.feature.spec.reader.FeatureSpecReader;
011 import org.maltparser.core.feature.spec.reader.ParReader;
012
013 /**
014 *
015 *
016 * @author Johan Hall
017 */
018 public class SpecificationModels {
019 private HashMap<URL, FeatureSpecReader> specReaderMap;
020 private HashMap<String, SpecificationModel> specModelMap;
021 private HashMap<Integer, SpecificationModel> specModelIntMap;
022 private LinkedHashMap<URL, ArrayList<SpecificationModel>> specModelKeyMap;
023 private ArrayList<SpecificationModel> currentSpecModelURL;
024 private int counter = 0;
025
026
027 public SpecificationModels() throws MaltChainedException {
028 specReaderMap = new HashMap<URL, FeatureSpecReader>();
029 specModelMap = new HashMap<String, SpecificationModel>();
030 specModelIntMap = new HashMap<Integer, SpecificationModel>();
031 specModelKeyMap = new LinkedHashMap<URL, ArrayList<SpecificationModel>>();
032 }
033
034 public void add(int index, String featureSpec) throws MaltChainedException {
035 this.add(Integer.toString(index), "MAIN", featureSpec);
036 }
037
038 public void add(String specModelName, String featureSpec) throws MaltChainedException {
039 this.add(specModelName, "MAIN", featureSpec);
040 }
041
042 public void add(int index, String subModelName, String featureSpec) throws MaltChainedException {
043 this.add(Integer.toString(index), subModelName, featureSpec);
044 }
045
046 public void add(String specModelName, String subModelName, String featureSpec) throws MaltChainedException {
047 if (featureSpec == null) { throw new FeatureException("Feature specification is missing."); }
048 if (specModelName == null) {throw new FeatureException("Unknown feature model name."); }
049 if (subModelName == null) {throw new FeatureException("Unknown subfeature model name."); }
050
051 if (!specModelMap.containsKey(specModelName.toUpperCase())) {
052 SpecificationModel specModel = new SpecificationModel(specModelName.toUpperCase());
053 specModelMap.put(specModelName.toUpperCase(), specModel);
054 currentSpecModelURL.add(specModel);
055 specModelIntMap.put(counter++, specModel);
056 }
057 specModelMap.get(specModelName.toUpperCase()).add(subModelName, featureSpec);
058 }
059
060 public int getNextIndex() {
061 return counter;
062 }
063
064 public void loadParReader(URL specModelURL, String markingStrategy, String coveredRoot) throws MaltChainedException {
065 if (specModelURL == null) {
066 throw new FeatureException("The URL to the feature specification model is missing or not well-formed. ");
067 }
068 FeatureSpecReader specReader = null;
069 String urlSuffix = specModelURL.toString().substring(specModelURL.toString().length()-3);
070 urlSuffix = Character.toUpperCase(urlSuffix.charAt(0)) + urlSuffix.substring(1);
071 try {
072 Class<?> clazz = Class.forName("org.maltparser.core.feature.spec.reader."+urlSuffix+"Reader");
073 specReader = (FeatureSpecReader)clazz.newInstance();
074 } catch (InstantiationException e) {
075 throw new FeatureException("Could not initialize the feature specification reader to read the specification file: "+specModelURL.toString(), e);
076 } catch (IllegalAccessException e) {
077 throw new FeatureException("Could not initialize the feature specification reader to read the specification file: "+specModelURL.toString(), e);
078 } catch (ClassNotFoundException e) {
079 throw new FeatureException("Could not find the feature specification reader to read the specification file: "+specModelURL.toString(), e);
080 }
081 specReaderMap.put(specModelURL, specReader);
082
083 if (specReader instanceof ParReader) {
084 if (markingStrategy.equalsIgnoreCase("head") || markingStrategy.equalsIgnoreCase("path") || markingStrategy.equalsIgnoreCase("head+path")) {
085 ((ParReader)specReader).setPplifted(true);
086 }
087 if (markingStrategy.equalsIgnoreCase("path") || markingStrategy.equalsIgnoreCase("head+path")) {
088 ((ParReader)specReader).setPppath(true);
089 }
090 if (!coveredRoot.equalsIgnoreCase("none")) {
091 ((ParReader)specReader).setPpcoveredRoot(true);
092 }
093 }
094 currentSpecModelURL = new ArrayList<SpecificationModel>();
095 specModelKeyMap.put(specModelURL, currentSpecModelURL);
096 specReader.load(specModelURL, this);
097 }
098
099 public void load(URL specModelURL) throws MaltChainedException {
100 if (specModelURL == null) {
101 throw new FeatureException("The URL to the feature specification model is missing or not well-formed. ");
102 }
103 FeatureSpecReader specReader = null;
104 String urlSuffix = specModelURL.toString().substring(specModelURL.toString().length()-3);
105 urlSuffix = Character.toUpperCase(urlSuffix.charAt(0)) + urlSuffix.substring(1);
106 try {
107 Class<?> clazz = Class.forName("org.maltparser.core.feature.spec.reader."+urlSuffix+"Reader");
108 specReader = (FeatureSpecReader)clazz.newInstance();
109 } catch (InstantiationException e) {
110 throw new FeatureException("Could not initialize the feature specification reader to read the specification file: "+specModelURL.toString(), e);
111 } catch (IllegalAccessException e) {
112 throw new FeatureException("Could not initialize the feature specification reader to read the specification file: "+specModelURL.toString(), e);
113 } catch (ClassNotFoundException e) {
114 throw new FeatureException("Could not find the feature specification reader to read the specification file: "+specModelURL.toString(), e);
115 }
116 specReaderMap.put(specModelURL, specReader);
117
118 currentSpecModelURL = new ArrayList<SpecificationModel>();
119 specModelKeyMap.put(specModelURL, currentSpecModelURL);
120 specReader.load(specModelURL, this);
121 }
122
123 public SpecificationModel getSpecificationModel(URL url, int specModelUrlIndex) {
124 return specModelKeyMap.get(url).get(specModelUrlIndex);
125 }
126
127 public String toString() {
128 StringBuilder sb = new StringBuilder();
129
130 for (URL url : specModelKeyMap.keySet()) {
131 for (int i = 0; i < specModelKeyMap.get(url).size(); i++) {
132 sb.append(url.toString());
133 sb.append(':');
134 sb.append(i);
135 sb.append('\n');
136 sb.append(specModelKeyMap.get(url).get(i).toString());
137 }
138 }
139 return sb.toString();
140 }
141 }