001 package org.maltparser.parser.algorithm.twoplanar; 002 003 import org.maltparser.core.exception.MaltChainedException; 004 import org.maltparser.core.feature.function.AddressFunction; 005 import org.maltparser.core.feature.value.AddressValue; 006 import org.maltparser.parser.Algorithm; 007 import org.maltparser.parser.ParsingException; 008 009 /** 010 * 011 * @author Carlos Gomez Rodriguez 012 **/ 013 public class TwoPlanarAddressFunction extends AddressFunction { 014 public enum TwoPlanarSubFunction { 015 ACTIVESTACK, INACTIVESTACK , INPUT 016 }; 017 protected String subFunctionName; 018 protected TwoPlanarSubFunction subFunction; 019 protected Algorithm parsingAlgorithm; 020 protected int index; 021 022 public TwoPlanarAddressFunction(String subFunctionName, Algorithm parsingAlgorithm) { 023 super(); 024 setSubFunctionName(subFunctionName); 025 setAlgorithm(parsingAlgorithm); 026 } 027 028 public void initialize(Object[] arguments) throws MaltChainedException { 029 if (arguments.length != 1) { 030 throw new ParsingException("Could not initialize "+this.getClass().getName()+": number of arguments are not correct. "); 031 } 032 if (!(arguments[0] instanceof Integer)) { 033 throw new ParsingException("Could not initialize "+this.getClass().getName()+": the first argument is not an integer. "); 034 } 035 036 setIndex(((Integer)arguments[0]).intValue()); 037 } 038 039 public Class<?>[] getParameterTypes() { 040 Class<?>[] paramTypes = { java.lang.Integer.class }; 041 return paramTypes; 042 } 043 044 public void update() throws MaltChainedException { 045 update((TwoPlanarConfig)parsingAlgorithm.getCurrentParserConfiguration()); 046 } 047 048 public void update(Object[] arguments) throws MaltChainedException { 049 if (arguments.length != 1 || !(arguments[0] instanceof TwoPlanarConfig)) { 050 throw new ParsingException("Arguments to the two-planar address function are not correct. "); 051 } 052 update((TwoPlanarConfig)arguments[0]); 053 } 054 055 private void update(TwoPlanarConfig config) throws MaltChainedException { 056 if (subFunction == TwoPlanarSubFunction.ACTIVESTACK) { 057 address.setAddress(config.getActiveStackNode(index)); 058 } else if ( subFunction == TwoPlanarSubFunction.INACTIVESTACK ) { 059 address.setAddress(config.getInactiveStackNode(index)); 060 } else if (subFunction == TwoPlanarSubFunction.INPUT) { 061 address.setAddress(config.getInputNode(index)); 062 } else { 063 address.setAddress(null); 064 } 065 } 066 067 public String getSubFunctionName() { 068 return subFunctionName; 069 } 070 071 public void setSubFunctionName(String subFunctionName) { 072 this.subFunctionName = subFunctionName; 073 subFunction = TwoPlanarSubFunction.valueOf(subFunctionName.toUpperCase()); 074 } 075 076 public TwoPlanarSubFunction getSubFunction() { 077 return subFunction; 078 } 079 080 public AddressValue getAddressValue() { 081 return address; 082 } 083 084 public Algorithm getParsingAlgorithm() { 085 return parsingAlgorithm; 086 } 087 088 public void setAlgorithm(Algorithm parsingAlgorithm) { 089 this.parsingAlgorithm = parsingAlgorithm; 090 } 091 092 public int getIndex() { 093 return index; 094 } 095 096 public void setIndex(int index) { 097 this.index = index; 098 } 099 100 public boolean equals(Object obj) { 101 if (this == obj) 102 return true; 103 if (obj == null) 104 return false; 105 if (getClass() != obj.getClass()) 106 return false; 107 108 TwoPlanarAddressFunction other = (TwoPlanarAddressFunction) obj; 109 if (index != other.index) 110 return false; 111 if (parsingAlgorithm == null) { 112 if (other.parsingAlgorithm != null) 113 return false; 114 } else if (!parsingAlgorithm.equals(other.parsingAlgorithm)) 115 return false; 116 if (subFunction == null) { 117 if (other.subFunction != null) 118 return false; 119 } else if (!subFunction.equals(other.subFunction)) 120 return false; 121 return true; 122 } 123 124 public String toString() { 125 return subFunctionName + "[" + index + "]"; 126 } 127 }