You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stanbol.apache.org by rw...@apache.org on 2013/11/07 10:41:21 UTC

svn commit: r1539574 - in /stanbol/trunk/enhancer/generic: nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/impl/ nlp-json/src/main/resources/META-INF/services/ nlp/src/main/java/org/apache/stanbol/enhancer/nlp/ nlp/src/main/java/o...

Author: rwesten
Date: Thu Nov  7 09:41:21 2013
New Revision: 1539574

URL: http://svn.apache.org/r1539574
Log:
STANBOL-1132: applied the patch provided by Cristian Petroaca on the 28/Oct/13. I have made some minor modifications to account for the SpanTypeEnum that was moved to an own file. Also some formatting related changes where made

Added:
    stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/impl/DependencyRelationSupport.java   (with props)
    stanbol/trunk/enhancer/generic/nlp/src/test/java/org/apache/stanbol/enhancer/nlp/dependency/
    stanbol/trunk/enhancer/generic/nlp/src/test/java/org/apache/stanbol/enhancer/nlp/dependency/DependencyRelationTest.java   (with props)
Modified:
    stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/impl/CorefTagSupport.java
    stanbol/trunk/enhancer/generic/nlp-json/src/main/resources/META-INF/services/org.apache.stanbol.enhancer.nlp.json.valuetype.ValueTypeParser
    stanbol/trunk/enhancer/generic/nlp-json/src/main/resources/META-INF/services/org.apache.stanbol.enhancer.nlp.json.valuetype.ValueTypeSerializer
    stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/NlpAnnotations.java
    stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/coref/CorefTag.java
    stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/dependency/DependencyRelation.java
    stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/dependency/GrammaticalRelation.java
    stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/dependency/GrammaticalRelationTag.java

Modified: stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/impl/CorefTagSupport.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/impl/CorefTagSupport.java?rev=1539574&r1=1539573&r2=1539574&view=diff
==============================================================================
--- stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/impl/CorefTagSupport.java (original)
+++ stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/impl/CorefTagSupport.java Thu Nov  7 09:41:21 2013
@@ -15,6 +15,7 @@
  * limitations under the License.
  */package org.apache.stanbol.enhancer.nlp.json.valuetype.impl;
 
+import java.util.Collections;
 import java.util.Set;
 
 import org.apache.felix.scr.annotations.Component;
@@ -85,14 +86,13 @@ public class CorefTagSupport implements 
 			throw new IllegalStateException("Field 'isRepresentative' must have a true/false format");
 		}
 		
-		CorefTag corefTag = new CorefTag(jIsRepresentative.asBoolean());
-		
 		JsonNode node = jCoref.path(MENTIONS_TAG);
-        
+		Set<Span> mentions = Collections.<Span> emptySet();
+		
 		if(node.isArray()) {
             ArrayNode jMentions = (ArrayNode)node;
             
-            for(int i=0;i<jMentions.size();i++) {
+            for(int i = 0;i < jMentions.size();i++) {
                 JsonNode member = jMentions.get(i);
                 
                 if(member.isObject()) {
@@ -116,11 +116,11 @@ public class CorefTagSupport implements 
                     
                     }
                     
-                    corefTag.addMention(mentionedSpan);
+                    mentions.add(mentionedSpan);
                 }
             }
 		}    
                 
-		return corefTag;
+		return new CorefTag(jIsRepresentative.asBoolean(), Collections.unmodifiableSet(mentions));
 	}	
 }
\ No newline at end of file

Added: stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/impl/DependencyRelationSupport.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/impl/DependencyRelationSupport.java?rev=1539574&view=auto
==============================================================================
--- stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/impl/DependencyRelationSupport.java (added)
+++ stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/impl/DependencyRelationSupport.java Thu Nov  7 09:41:21 2013
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */package org.apache.stanbol.enhancer.nlp.json.valuetype.impl;
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.ConfigurationPolicy;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.stanbol.enhancer.nlp.dependency.DependencyRelation;
+import org.apache.stanbol.enhancer.nlp.dependency.GrammaticalRelation;
+import org.apache.stanbol.enhancer.nlp.dependency.GrammaticalRelationTag;
+import org.apache.stanbol.enhancer.nlp.json.valuetype.ValueTypeParser;
+import org.apache.stanbol.enhancer.nlp.json.valuetype.ValueTypeSerializer;
+import org.apache.stanbol.enhancer.nlp.model.AnalysedText;
+import org.apache.stanbol.enhancer.nlp.model.Span;
+import org.apache.stanbol.enhancer.nlp.model.SpanTypeEnum;
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.node.ObjectNode;
+
+@Component(immediate = true, policy = ConfigurationPolicy.IGNORE)
+@Service(value = {ValueTypeParser.class, ValueTypeSerializer.class})
+@Property(name = ValueTypeParser.PROPERTY_TYPE, value = DependencyRelationSupport.TYPE_VALUE)
+public class DependencyRelationSupport implements ValueTypeParser<DependencyRelation>,
+        ValueTypeSerializer<DependencyRelation> {
+
+    public static final String TYPE_VALUE = "org.apache.stanbol.enhancer.nlp.dependency.DependencyRelation";
+
+    private static final String RELATION_TYPE_TAG = "tag";
+    private static final String RELATION_STANBOL_TYPE_TAG = "relationType";
+    private static final String RELATION_IS_DEPENDEE_TAG = "isDependent";
+    private static final String RELATION_PARTNER_TYPE_TAG = "partnerType";
+    private static final String RELATION_PARTNER_START_TAG = "partnerStart";
+    private static final String RELATION_PARTNER_END_TAG = "partnerEnd";
+    private static final String ROOT_TAG = "ROOT";
+
+    @Override
+    public ObjectNode serialize(ObjectMapper mapper, DependencyRelation relation) {
+        ObjectNode jDependencyRelation = mapper.createObjectNode();
+
+        GrammaticalRelationTag gramRelTag = relation.getGrammaticalRelationTag();
+        jDependencyRelation.put(RELATION_TYPE_TAG, gramRelTag.getTag());
+        jDependencyRelation.put(RELATION_STANBOL_TYPE_TAG, gramRelTag.getGrammaticalRelation().ordinal());
+        jDependencyRelation.put(RELATION_IS_DEPENDEE_TAG, (relation.isDependent() ? "true" : "false"));
+
+        Span partner = relation.getPartner();
+        if (partner != null) {
+            jDependencyRelation.put(RELATION_PARTNER_TYPE_TAG, partner.getType().toString());
+            jDependencyRelation.put(RELATION_PARTNER_START_TAG, partner.getStart());
+            jDependencyRelation.put(RELATION_PARTNER_END_TAG, partner.getEnd());
+        } else {
+            jDependencyRelation.put(RELATION_PARTNER_TYPE_TAG, ROOT_TAG);
+            jDependencyRelation.put(RELATION_PARTNER_START_TAG, 0);
+            jDependencyRelation.put(RELATION_PARTNER_END_TAG, 0);
+        }
+
+        return jDependencyRelation;
+    }
+
+    @Override
+    public Class<DependencyRelation> getType() {
+        return DependencyRelation.class;
+    }
+
+    @Override
+    public DependencyRelation parse(ObjectNode jDependencyRelation, AnalysedText at) {
+        JsonNode tag = jDependencyRelation.path(RELATION_TYPE_TAG);
+
+        if (!tag.isTextual()) {
+            throw new IllegalStateException("Unable to parse GrammaticalRelationTag. The value of the "
+                                            + "'tag' field MUST have a textual value (json: "
+                                            + jDependencyRelation + ")");
+        }
+
+        GrammaticalRelation grammaticalRelation = GrammaticalRelation.class.getEnumConstants()[jDependencyRelation
+                .path(RELATION_STANBOL_TYPE_TAG).asInt()];
+        GrammaticalRelationTag gramRelTag = new GrammaticalRelationTag(tag.getTextValue(),
+                grammaticalRelation);
+
+        JsonNode isDependent = jDependencyRelation.path(RELATION_IS_DEPENDEE_TAG);
+
+        if (!isDependent.isBoolean()) {
+            throw new IllegalStateException("Field 'isDependent' must have a true/false format");
+        }
+
+        Span partnerSpan = null;
+        String typeString = jDependencyRelation.path(RELATION_PARTNER_TYPE_TAG).getTextValue();
+
+        if (!typeString.equals(ROOT_TAG)) {
+            SpanTypeEnum spanType = SpanTypeEnum.valueOf(jDependencyRelation.path(RELATION_PARTNER_TYPE_TAG)
+                    .getTextValue());
+            int spanStart = jDependencyRelation.path(RELATION_PARTNER_START_TAG).asInt();
+            int spanEnd = jDependencyRelation.path(RELATION_PARTNER_END_TAG).asInt();
+
+            switch (spanType) {
+                case Chunk:
+                    partnerSpan = at.addChunk(spanStart, spanEnd);
+                    break;
+                // unused types
+                // case Sentence:
+                // case Text:
+                // case TextSection:
+                // break;
+                case Token:
+                    partnerSpan = at.addToken(spanStart, spanEnd);
+                    break;
+            }
+        }
+
+        return new DependencyRelation(gramRelTag, isDependent.asBoolean(), partnerSpan);
+    }
+}

Propchange: stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/impl/DependencyRelationSupport.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: stanbol/trunk/enhancer/generic/nlp-json/src/main/resources/META-INF/services/org.apache.stanbol.enhancer.nlp.json.valuetype.ValueTypeParser
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancer/generic/nlp-json/src/main/resources/META-INF/services/org.apache.stanbol.enhancer.nlp.json.valuetype.ValueTypeParser?rev=1539574&r1=1539573&r2=1539574&view=diff
==============================================================================
--- stanbol/trunk/enhancer/generic/nlp-json/src/main/resources/META-INF/services/org.apache.stanbol.enhancer.nlp.json.valuetype.ValueTypeParser (original)
+++ stanbol/trunk/enhancer/generic/nlp-json/src/main/resources/META-INF/services/org.apache.stanbol.enhancer.nlp.json.valuetype.ValueTypeParser Thu Nov  7 09:41:21 2013
@@ -2,4 +2,5 @@ org.apache.stanbol.enhancer.nlp.json.val
 org.apache.stanbol.enhancer.nlp.json.valuetype.impl.NerTagSupport
 org.apache.stanbol.enhancer.nlp.json.valuetype.impl.MorphoFeaturesSupport
 org.apache.stanbol.enhancer.nlp.json.valuetype.impl.PhraseTagSupport
-org.apache.stanbol.enhancer.nlp.json.valuetype.impl.DependencyFeaturesSupport
\ No newline at end of file
+org.apache.stanbol.enhancer.nlp.json.valuetype.impl.DependencyRelationSupport
+org.apache.stanbol.enhancer.nlp.json.valuetype.impl.CorefTagSupport
\ No newline at end of file

Modified: stanbol/trunk/enhancer/generic/nlp-json/src/main/resources/META-INF/services/org.apache.stanbol.enhancer.nlp.json.valuetype.ValueTypeSerializer
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancer/generic/nlp-json/src/main/resources/META-INF/services/org.apache.stanbol.enhancer.nlp.json.valuetype.ValueTypeSerializer?rev=1539574&r1=1539573&r2=1539574&view=diff
==============================================================================
--- stanbol/trunk/enhancer/generic/nlp-json/src/main/resources/META-INF/services/org.apache.stanbol.enhancer.nlp.json.valuetype.ValueTypeSerializer (original)
+++ stanbol/trunk/enhancer/generic/nlp-json/src/main/resources/META-INF/services/org.apache.stanbol.enhancer.nlp.json.valuetype.ValueTypeSerializer Thu Nov  7 09:41:21 2013
@@ -2,4 +2,5 @@ org.apache.stanbol.enhancer.nlp.json.val
 org.apache.stanbol.enhancer.nlp.json.valuetype.impl.NerTagSupport
 org.apache.stanbol.enhancer.nlp.json.valuetype.impl.MorphoFeaturesSupport
 org.apache.stanbol.enhancer.nlp.json.valuetype.impl.PhraseTagSupport
-org.apache.stanbol.enhancer.nlp.json.valuetype.impl.DependencyFeaturesSupport
\ No newline at end of file
+org.apache.stanbol.enhancer.nlp.json.valuetype.impl.DependencyRelationSupport
+org.apache.stanbol.enhancer.nlp.json.valuetype.impl.CorefTagSupport
\ No newline at end of file

Modified: stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/NlpAnnotations.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/NlpAnnotations.java?rev=1539574&r1=1539573&r2=1539574&view=diff
==============================================================================
--- stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/NlpAnnotations.java (original)
+++ stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/NlpAnnotations.java Thu Nov  7 09:41:21 2013
@@ -17,7 +17,7 @@
 package org.apache.stanbol.enhancer.nlp;
 
 import org.apache.stanbol.enhancer.nlp.coref.CorefTag;
-import org.apache.stanbol.enhancer.nlp.dependency.DependencyFeatures;
+import org.apache.stanbol.enhancer.nlp.dependency.DependencyRelation;
 import org.apache.stanbol.enhancer.nlp.model.AnalysedText;
 import org.apache.stanbol.enhancer.nlp.model.Chunk;
 import org.apache.stanbol.enhancer.nlp.model.Token;
@@ -77,8 +77,8 @@ public interface NlpAnnotations {
 	 * other words in the sentence. Typically used on {@link Token}s.
 	 * <p>
 	 */
-	Annotation<DependencyFeatures> DEPENDENCY_ANNOTATION = new Annotation<DependencyFeatures>(
-			"stanbol.enhancer.nlp.dependency", DependencyFeatures.class);
+	Annotation<DependencyRelation> DEPENDENCY_ANNOTATION = new Annotation<DependencyRelation>(
+			"stanbol.enhancer.nlp.dependency", DependencyRelation.class);
 
 	/**
 	 * {@link Annotation} representing all the words which are a

Modified: stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/coref/CorefTag.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/coref/CorefTag.java?rev=1539574&r1=1539573&r2=1539574&view=diff
==============================================================================
--- stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/coref/CorefTag.java (original)
+++ stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/coref/CorefTag.java Thu Nov  7 09:41:21 2013
@@ -44,19 +44,18 @@ public class CorefTag extends Tag<CorefT
 	 */
 	private Set<Span> mentions;
 
-	
 	public CorefTag() {
-	    //TODO: if mentions can be modified you can not use Collections.emptySet
-	    //      because this would cause exceptions in #addMention or if users
-	    //      to #getMentions().remove(...)
-	    //IMHO mentions should be made immutable by using a
-	    //Collections.unmodifiableSet(..) for the field and removing the
-	    //#addMentions(..) method.
-		this(null, false, Collections.<Span> emptySet());
+		this(null, false, Collections.unmodifiableSet(Collections
+				.<Span> emptySet()));
 	}
 
 	public CorefTag(boolean isRepresentative) {
-		this(null, isRepresentative, Collections.<Span> emptySet());
+		this(null, isRepresentative, Collections.unmodifiableSet(Collections
+				.<Span> emptySet()));
+	}
+	
+	public CorefTag(boolean isRepresentative, Set<Span> mentions) {
+		this(null, isRepresentative, mentions);
 	}
 
 	public CorefTag(String tag, boolean isRepresentative, Set<Span> mentions) {
@@ -65,24 +64,34 @@ public class CorefTag extends Tag<CorefT
 		this.isRepresentative = isRepresentative;
 		this.mentions = mentions;
 	}
+
 	/**
 	 * Getter whether the {@link Token} to which this tag is attached is the
-     * representative metion in the chain.
+	 * representative mention in the chain.
+	 * 
 	 * @return the representative state
 	 */
 	public boolean isRepresentative() {
 		return this.isRepresentative;
 	}
+
 	/**
-	 * Getter for the set of {@link Token}s representing mentions
-	 * of the {@link Token} to which this tag is attached.
+	 * Getter for the set of {@link Token}s representing mentions of the
+	 * {@link Token} to which this tag is attached.
+	 * 
 	 * @return
 	 */
 	public Set<Span> getMentions() {
 		return this.mentions;
 	}
 
-	public void addMention(Span mention) {
-		this.mentions.add(mention);
+	public int hashCode() {
+		return super.hashCode()
+				+ ((this.mentions != null) ? this.mentions.hashCode() : 0);
+	}
+
+	public boolean equals(Object obj) {
+		return super.equals(obj) && (obj instanceof CorefTag)
+				&& (this.mentions.equals(((CorefTag) obj).getMentions()));
 	}
 }

Modified: stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/dependency/DependencyRelation.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/dependency/DependencyRelation.java?rev=1539574&r1=1539573&r2=1539574&view=diff
==============================================================================
--- stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/dependency/DependencyRelation.java (original)
+++ stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/dependency/DependencyRelation.java Thu Nov  7 09:41:21 2013
@@ -43,17 +43,9 @@ public class DependencyRelation {
 	 */
 	private Span partner;
 
-	public DependencyRelation() {
-	}
-
-	public DependencyRelation(GrammaticalRelationTag grammaticalRelationTag) {
+	public DependencyRelation(GrammaticalRelationTag grammaticalRelationTag, boolean isDependent,
+			Span partner) {
 		this.grammaticalRelationTag = grammaticalRelationTag;
-	}
-
-	public DependencyRelation(GrammaticalRelationTag grammaticalRelationTag,
-			boolean isDependent, Span partner) {
-		this(grammaticalRelationTag);
-
 		this.isDependent = isDependent;
 		this.partner = partner;
 	}
@@ -62,27 +54,14 @@ public class DependencyRelation {
 		return grammaticalRelationTag;
 	}
 
-	public void setGrammaticalRelationTag(
-			GrammaticalRelationTag grammaticalRelationTag) {
-		this.grammaticalRelationTag = grammaticalRelationTag;
-	}
-
 	public boolean isDependent() {
 		return isDependent;
 	}
 
-	public void setDependent(boolean isDependent) {
-		this.isDependent = isDependent;
-	}
-
 	public Span getPartner() {
 		return this.partner;
 	}
 
-	public void setPartner(Span partner) {
-		this.partner = partner;
-	}
-
 	public int hashCode() {
 		return grammaticalRelationTag.hashCode()
 				+ ((partner != null) ? partner.hashCode() : 0)
@@ -90,14 +69,14 @@ public class DependencyRelation {
 	}
 
 	public boolean equals(Object obj) {
-		return super.equals(obj)
-				&& (obj instanceof DependencyRelation)
+		return (obj instanceof DependencyRelation)
 				&& (this.grammaticalRelationTag
 						.equals(((DependencyRelation) obj)
 								.getGrammaticalRelationTag()))
 				&& (this.isDependent == ((DependencyRelation) obj)
 						.isDependent())
-				&& (this.partner
-						.equals(((DependencyRelation) obj).getPartner()));
+				&& (this.partner == null
+						&& ((DependencyRelation) obj).getPartner() == null || this.partner
+							.equals(((DependencyRelation) obj).getPartner()));
 	}
 }

Modified: stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/dependency/GrammaticalRelation.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/dependency/GrammaticalRelation.java?rev=1539574&r1=1539573&r2=1539574&view=diff
==============================================================================
--- stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/dependency/GrammaticalRelation.java (original)
+++ stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/dependency/GrammaticalRelation.java Thu Nov  7 09:41:21 2013
@@ -16,8 +16,9 @@
 */
 package org.apache.stanbol.enhancer.nlp.dependency;
 
-import java.util.Collection;
-import java.util.HashSet;
+import java.util.EnumMap;
+import java.util.EnumSet;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -499,9 +500,9 @@ public enum GrammaticalRelation {
 	private GrammaticalRelationCategory category;
 
 	/**
-	 * The parents of this grammatical relation.
+	 * The parent of this grammatical relation.
 	 */
-	private Set<GrammaticalRelation> parents;
+	private GrammaticalRelation parent;
 
 	GrammaticalRelation(GrammaticalRelationCategory category) {
 		this(category, null);
@@ -513,34 +514,49 @@ public enum GrammaticalRelation {
 
 	GrammaticalRelation(GrammaticalRelationCategory category,
 			GrammaticalRelation parent) {
-		if (parent != null) {
-			this.parents = new HashSet<GrammaticalRelation>();
-			addParents(parent);
-		}
-
-		if (category != null) {
-			this.category = category;
-		}
+		this.parent = parent;
+		this.category = category;
 	}
 
 	public GrammaticalRelationCategory getCategory() {
 		return this.category;
 	}
 
-	public Collection<GrammaticalRelation> getParents() {
-		return this.parents;
+	public GrammaticalRelation getParent() {
+		return this.parent;
 	}
 
-	private void addParents(GrammaticalRelation parent) {
-		this.parents.add(parent);
+	public Set<GrammaticalRelation> hierarchy() {
+		return transitiveClosureMap.get(this);
+	}
+
+	/**
+	 * This is needed because one can not create EnumSet instances before the
+	 * initialization of an Enum has finished.
+	 * <p>
+	 * To keep using the much faster {@link EnumSet} a static member initialised
+	 * in an static {} block is used as a workaround.
+	 */
+	private static final Map<GrammaticalRelation, Set<GrammaticalRelation>> transitiveClosureMap;
+
+	static {
+		transitiveClosureMap = new EnumMap<GrammaticalRelation, Set<GrammaticalRelation>>(
+				GrammaticalRelation.class);
+
+		for (GrammaticalRelation relation : GrammaticalRelation.values()) {
+			Set<GrammaticalRelation> parents = EnumSet.of(relation);
+
+			GrammaticalRelation relationParent = relation.getParent();
+			Set<GrammaticalRelation> transParents = transitiveClosureMap
+					.get(relationParent);
+
+			if (transParents != null) {
+				parents.addAll(transParents);
+			} else if (relationParent != null) {
+				parents.add(relationParent);
+			} // else no parent
 
-		Collection<GrammaticalRelation> grandParents = parent.getParents();
-		if (grandParents == null) {
-			this.category = parent.getCategory();
-		} else {
-			for (GrammaticalRelation grandParent : grandParents) {
-				addParents(grandParent);
-			}
+			transitiveClosureMap.put(relation, parents);
 		}
 	}
 }

Modified: stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/dependency/GrammaticalRelationTag.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/dependency/GrammaticalRelationTag.java?rev=1539574&r1=1539573&r2=1539574&view=diff
==============================================================================
--- stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/dependency/GrammaticalRelationTag.java (original)
+++ stanbol/trunk/enhancer/generic/nlp/src/main/java/org/apache/stanbol/enhancer/nlp/dependency/GrammaticalRelationTag.java Thu Nov  7 09:41:21 2013
@@ -39,14 +39,23 @@ public class GrammaticalRelationTag exte
 			GrammaticalRelation grammaticalRelation) {
 		this(tag);
 
-		this.setGrammaticalRelation(grammaticalRelation);
+		this.grammaticalRelation = grammaticalRelation;
 	}
 
 	public GrammaticalRelation getGrammaticalRelation() {
 		return grammaticalRelation;
 	}
 
-	public void setGrammaticalRelation(GrammaticalRelation grammaticalRelation) {
-		this.grammaticalRelation = grammaticalRelation;
+	@Override
+	public int hashCode() {
+		return super.hashCode() + grammaticalRelation.hashCode();
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		return super.equals(obj)
+				&& obj instanceof GrammaticalRelationTag
+				&& grammaticalRelation
+						.equals(((GrammaticalRelationTag) obj).grammaticalRelation);
 	}
 }

Added: stanbol/trunk/enhancer/generic/nlp/src/test/java/org/apache/stanbol/enhancer/nlp/dependency/DependencyRelationTest.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancer/generic/nlp/src/test/java/org/apache/stanbol/enhancer/nlp/dependency/DependencyRelationTest.java?rev=1539574&view=auto
==============================================================================
--- stanbol/trunk/enhancer/generic/nlp/src/test/java/org/apache/stanbol/enhancer/nlp/dependency/DependencyRelationTest.java (added)
+++ stanbol/trunk/enhancer/generic/nlp/src/test/java/org/apache/stanbol/enhancer/nlp/dependency/DependencyRelationTest.java Thu Nov  7 09:41:21 2013
@@ -0,0 +1,74 @@
+package org.apache.stanbol.enhancer.nlp.dependency;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.stanbol.enhancer.contentitem.inmemory.InMemoryContentItemFactory;
+import org.apache.stanbol.enhancer.nlp.model.AnalysedText;
+import org.apache.stanbol.enhancer.nlp.model.AnalysedTextFactory;
+import org.apache.stanbol.enhancer.servicesapi.Blob;
+import org.apache.stanbol.enhancer.servicesapi.ContentItem;
+import org.apache.stanbol.enhancer.servicesapi.ContentItemFactory;
+import org.apache.stanbol.enhancer.servicesapi.helper.ContentItemHelper;
+import org.apache.stanbol.enhancer.servicesapi.impl.StringSource;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.junit.Assert;
+
+public class DependencyRelationTest {
+    /**
+     * Empty AnalysedText instance created before each test
+     */
+    private static AnalysedText at;
+
+    private static final ContentItemFactory ciFactory = InMemoryContentItemFactory.getInstance();
+    private static final AnalysedTextFactory atFactory = AnalysedTextFactory.getDefaultInstance();
+
+    private static ContentItem ci;
+    private static Entry<UriRef,Blob> textBlob;
+
+    @BeforeClass
+    public static void setup() throws IOException {
+        ci = ciFactory.createContentItem(new StringSource(""));
+        textBlob = ContentItemHelper.getBlob(ci, Collections.singleton("text/plain"));
+        at = atFactory.createAnalysedText(textBlob.getValue());
+    }
+
+    @Test
+    public void testSimpleGrammaticalRelationInit() {
+        GrammaticalRelationTag gramRelationTag = new GrammaticalRelationTag(
+            "agent", GrammaticalRelation.Agent);
+        DependencyRelation depRelation = new DependencyRelation(gramRelationTag, false, at.addToken(0, 0));
+
+        Assert.assertEquals("agent", depRelation.getGrammaticalRelationTag().getTag());
+
+        GrammaticalRelation relation = depRelation.getGrammaticalRelationTag().getGrammaticalRelation();
+        Assert.assertEquals(GrammaticalRelation.Agent, relation);
+        Assert.assertEquals(null, relation.getParent());
+        Assert.assertEquals(GrammaticalRelationCategory.Argument, relation.getCategory());
+    }
+
+    @Test
+    public void testGrammaticalRelationWithHierarchyInit() {
+        GrammaticalRelationTag gramRelationTag = new GrammaticalRelationTag(
+            "abbrev", GrammaticalRelation.AbbreviationModifier);
+        DependencyRelation depRelation = new DependencyRelation(gramRelationTag, false, at.addToken(0, 0));
+
+        Assert.assertEquals("abbrev", depRelation.getGrammaticalRelationTag().getTag());
+
+        GrammaticalRelation relation = depRelation.getGrammaticalRelationTag().getGrammaticalRelation();
+        Assert.assertEquals(GrammaticalRelation.AbbreviationModifier, relation);
+        Assert.assertEquals(GrammaticalRelation.Modifier, relation.getParent());
+
+        Set<GrammaticalRelation> expectedHierarcy = EnumSet.of(GrammaticalRelation.Dependent,
+            GrammaticalRelation.Modifier, GrammaticalRelation.AbbreviationModifier);
+
+        Set<GrammaticalRelation> hierarchy = relation.hierarchy();
+        Assert.assertEquals(expectedHierarcy, hierarchy);
+    }
+}

Propchange: stanbol/trunk/enhancer/generic/nlp/src/test/java/org/apache/stanbol/enhancer/nlp/dependency/DependencyRelationTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain