package org.maltparser.core.feature.spec;
import java.net.URL;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import org.maltparser.core.exception.MaltChainedException;
import org.maltparser.core.feature.FeatureException;
import org.maltparser.core.feature.spec.reader.FeatureSpecReader;
import org.maltparser.core.feature.spec.reader.ParReader;
import org.maltparser.core.helper.HashMap;
/**
*
*
* @author Johan Hall
*/
public class SpecificationModels {
private HashMap<URL, FeatureSpecReader> specReaderMap;
private HashMap<String, SpecificationModel> specModelMap;
private HashMap<Integer, SpecificationModel> specModelIntMap;
private LinkedHashMap<URL, ArrayList<SpecificationModel>> specModelKeyMap;
private ArrayList<SpecificationModel> currentSpecModelURL;
private int counter = 0;
public SpecificationModels() throws MaltChainedException {
specReaderMap = new HashMap<URL, FeatureSpecReader>();
specModelMap = new HashMap<String, SpecificationModel>();
specModelIntMap = new HashMap<Integer, SpecificationModel>();
specModelKeyMap = new LinkedHashMap<URL, ArrayList<SpecificationModel>>();
}
public void add(int index, String featureSpec) throws MaltChainedException {
this.add(Integer.toString(index), "MAIN", featureSpec);
}
public void add(String specModelName, String featureSpec) throws MaltChainedException {
this.add(specModelName, "MAIN", featureSpec);
}
public void add(int index, String subModelName, String featureSpec) throws MaltChainedException {
this.add(Integer.toString(index), subModelName, featureSpec);
}
public void add(String specModelName, String subModelName, String featureSpec) throws MaltChainedException {
if (featureSpec == null) {
throw new FeatureException("Feature specification is missing.");
}
if (specModelName == null) {
throw new FeatureException("Unknown feature model name.");
}
if (subModelName == null) {
throw new FeatureException("Unknown subfeature model name.");
}
if (!specModelMap.containsKey(specModelName.toUpperCase())) {
SpecificationModel specModel = new SpecificationModel(specModelName.toUpperCase());
specModelMap.put(specModelName.toUpperCase(), specModel);
currentSpecModelURL.add(specModel);
specModelIntMap.put(counter++, specModel);
}
specModelMap.get(specModelName.toUpperCase()).add(subModelName, featureSpec);
}
public int getNextIndex() {
return counter;
}
public void loadParReader(URL specModelURL, String markingStrategy, String coveredRoot) throws MaltChainedException {
if (specModelURL == null) {
throw new FeatureException("The URL to the feature specification model is missing or not well-formed. ");
}
FeatureSpecReader specReader = null;
String urlSuffix = specModelURL.toString().substring(specModelURL.toString().length() - 3);
urlSuffix = Character.toUpperCase(urlSuffix.charAt(0)) + urlSuffix.substring(1);
try {
Class<?> clazz = Class.forName("org.maltparser.core.feature.spec.reader." + urlSuffix + "Reader");
specReader = (FeatureSpecReader) clazz.newInstance();
} catch (InstantiationException e) {
throw new FeatureException("Could not initialize the feature specification reader to read the specification file: " + specModelURL.toString(), e);
} catch (IllegalAccessException e) {
throw new FeatureException("Could not initialize the feature specification reader to read the specification file: " + specModelURL.toString(), e);
} catch (ClassNotFoundException e) {
throw new FeatureException("Could not find the feature specification reader to read the specification file: " + specModelURL.toString(), e);
}
specReaderMap.put(specModelURL, specReader);
if (specReader instanceof ParReader) {
if (markingStrategy.equalsIgnoreCase("head") || markingStrategy.equalsIgnoreCase("path") || markingStrategy.equalsIgnoreCase("head+path")) {
((ParReader) specReader).setPplifted(true);
}
if (markingStrategy.equalsIgnoreCase("path") || markingStrategy.equalsIgnoreCase("head+path")) {
((ParReader) specReader).setPppath(true);
}
if (!coveredRoot.equalsIgnoreCase("none")) {
((ParReader) specReader).setPpcoveredRoot(true);
}
}
currentSpecModelURL = new ArrayList<SpecificationModel>();
specModelKeyMap.put(specModelURL, currentSpecModelURL);
specReader.load(specModelURL, this);
}
public void load(URL specModelURL) throws MaltChainedException {
if (specModelURL == null) {
throw new FeatureException("The URL to the feature specification model is missing or not well-formed. ");
}
FeatureSpecReader specReader = null;
String urlSuffix = specModelURL.toString().substring(specModelURL.toString().length() - 3);
urlSuffix = Character.toUpperCase(urlSuffix.charAt(0)) + urlSuffix.substring(1);
try {
Class<?> clazz = Class.forName("org.maltparser.core.feature.spec.reader." + urlSuffix + "Reader");
specReader = (FeatureSpecReader) clazz.newInstance();
} catch (InstantiationException e) {
throw new FeatureException("Could not initialize the feature specification reader to read the specification file: " + specModelURL.toString(), e);
} catch (IllegalAccessException e) {
throw new FeatureException("Could not initialize the feature specification reader to read the specification file: " + specModelURL.toString(), e);
} catch (ClassNotFoundException e) {
throw new FeatureException("Could not find the feature specification reader to read the specification file: " + specModelURL.toString(), e);
}
specReaderMap.put(specModelURL, specReader);
currentSpecModelURL = new ArrayList<SpecificationModel>();
specModelKeyMap.put(specModelURL, currentSpecModelURL);
specReader.load(specModelURL, this);
}
public SpecificationModel getSpecificationModel(URL url, int specModelUrlIndex) {
return specModelKeyMap.get(url).get(specModelUrlIndex);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (URL url : specModelKeyMap.keySet()) {
for (int i = 0; i < specModelKeyMap.get(url).size(); i++) {
sb.append(url.toString());
sb.append(':');
sb.append(i);
sb.append('\n');
sb.append(specModelKeyMap.get(url).get(i).toString());
}
}
return sb.toString();
}
}