    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    }