You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by jm...@apache.org on 2008/01/01 07:53:35 UTC

svn commit: r607810 - in /incubator/abdera/java/trunk/core/src: main/java/org/apache/abdera/util/EntityTag.java test/java/org/apache/abdera/test/core/EntityTagTest.java

Author: jmsnell
Date: Mon Dec 31 22:53:34 2007
New Revision: 607810

URL: http://svn.apache.org/viewvc?rev=607810&view=rev
Log:
Parsing improvements for EntityTag and a test case

Added:
    incubator/abdera/java/trunk/core/src/test/java/org/apache/abdera/test/core/EntityTagTest.java
Modified:
    incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/EntityTag.java

Modified: incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/EntityTag.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/EntityTag.java?rev=607810&r1=607809&r2=607810&view=diff
==============================================================================
--- incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/EntityTag.java (original)
+++ incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/EntityTag.java Mon Dec 31 22:53:34 2007
@@ -19,6 +19,8 @@
 import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.abdera.i18n.text.Localizer;
 import org.apache.commons.codec.binary.Hex;
@@ -26,57 +28,66 @@
 /**
  * Implements an EntityTag.
  */
-public class EntityTag implements Cloneable, Serializable {
-
+public class EntityTag 
+  implements Cloneable, 
+             Serializable,
+             Comparable<EntityTag> {
+  
   private static final long serialVersionUID = 1559972888659121461L;
   
-  private static final String INVALID_ENTITY_TAG = Localizer
-      .get("INVALID.ENTITY.TAG");
-
+  private static final Pattern PATTERN = 
+    Pattern.compile("(\\*)|([wW]/)?\"([^\"]*)\"");
+  
+  private static final String INVALID_ENTITY_TAG = 
+    Localizer.get("INVALID.ENTITY.TAG");
+  
   public static final EntityTag WILD = new EntityTag("*");
   
   public static EntityTag parse(String entity_tag) {
     if (entity_tag == null || entity_tag.length() == 0)
       throw new IllegalArgumentException(INVALID_ENTITY_TAG);
-    boolean weak = entity_tag.startsWith("W/");
-    boolean wild = entity_tag.equals("*");
-    if (!wild && !weak && !entity_tag.startsWith("\""))
+    Matcher m = PATTERN.matcher(entity_tag);
+    if (m.find()) {
+      boolean wild = m.group(1) != null;
+      boolean weak = m.group(2) != null;
+      String tag = wild ? "*" : m.group(3);
+      return new EntityTag(tag, weak, wild);
+    } else {
       throw new IllegalArgumentException(INVALID_ENTITY_TAG);
-    String tag = wild ? "*" : entity_tag.substring((weak) ? 3 : 1, entity_tag.length() - 1);
-    return new EntityTag(tag, weak);
+    }
   }
-
+  
   public static EntityTag[] parseTags(String entity_tags) {
     if (entity_tags == null || entity_tags.length() == 0)
       return new EntityTag[0];
-    String[] tags = entity_tags.split("((?<=\")\\s*,\\s*(?=(W/)?\"))");
+    String[] tags = entity_tags.split("((?<=\")\\s*,\\s*(?=([wW]/)?\"|\\*))");
     List<EntityTag> etags = new ArrayList<EntityTag>();
     for (String tag : tags) {
       etags.add(EntityTag.parse(tag.trim()));
     }
     return etags.toArray(new EntityTag[etags.size()]);
   }
-
+  
   public static boolean matchesAny(EntityTag tag1, String tags) {
     return matchesAny(tag1, parseTags(tags), false);
   }
-
+  
   public static boolean matchesAny(EntityTag tag1, String tags, boolean weak) {
     return matchesAny(tag1, parseTags(tags), weak);
   }
-
+  
   public static boolean matchesAny(String tag1, String tags) {
     return matchesAny(parse(tag1), parseTags(tags), false);
   }
-
+  
   public static boolean matchesAny(String tag1, String tags, boolean weak) {
     return matchesAny(parse(tag1), parseTags(tags), weak);
   }
-
+  
   public static boolean matchesAny(EntityTag tag1, EntityTag[] tags) {
     return matchesAny(tag1, tags, false);
   }
-
+  
   public static boolean matchesAny(EntityTag tag1, EntityTag[] tags,
       boolean weak) {
     if (tags == null)
@@ -88,43 +99,59 @@
     }
     return false;
   }
-
+  
   public static boolean matches(EntityTag tag1, EntityTag tag2) {
     return tag1.equals(tag2);
   }
-
+  
   public static boolean matches(String tag1, String tag2) {
     EntityTag etag1 = parse(tag1);
     EntityTag etag2 = parse(tag2);
     return etag1.equals(etag2);
   }
-
+  
   public static boolean matches(EntityTag tag1, String tag2) {
     return tag1.equals(parse(tag2));
   }
-
+  
   private final String tag;
-
+  
   private final boolean weak;
   private final boolean wild;
-
+  
   public EntityTag(String tag) {
     this(tag, false);
   }
-
+  
   public EntityTag(String tag, boolean weak) {
-    checkTag(tag);
+    EntityTag etag = attemptParse(tag);
+    if (etag == null) {
+      if (tag.indexOf('"') > -1)
+        throw new IllegalArgumentException(INVALID_ENTITY_TAG);
+      this.tag = tag;
+      this.weak = weak;
+      this.wild = tag.equals("*");
+    } else {
+      this.tag = etag.tag;
+      this.weak = etag.weak;
+      this.wild = etag.wild;
+    }
+  }
+  
+  private EntityTag(String tag, boolean weak, boolean wild) {
     this.tag = tag;
     this.weak = weak;
-    this.wild = tag.equals("*");
+    this.wild = wild;
   }
-
-  private void checkTag(String tag) {
-    if (tag.startsWith("\"") || 
-        (tag.endsWith("\"") && !tag.endsWith("\\\"")) )
-      throw new IllegalArgumentException("Invalid Entity Tag");
+  
+  private EntityTag attemptParse(String tag) {
+    try {
+      return parse(tag);
+    } catch (Exception e) {
+      return null;
+    }
   }
-
+  
   public boolean isWild() {
     return wild;
   }
@@ -132,11 +159,11 @@
   public String getTag() {
     return tag;
   }
-
+  
   public boolean isWeak() {
     return weak;
   }
-
+  
   public String toString() {
     StringBuilder buf = new StringBuilder();
     if (wild) {
@@ -150,7 +177,7 @@
     }
     return buf.toString();
   }
-
+  
   @Override public int hashCode() {
     final int prime = 31;
     int result = 1;
@@ -159,7 +186,7 @@
     result = prime * result + (wild ? 1231 : 1237);
     return result;
   }
-
+  
   @Override public boolean equals(Object obj) {
     if (this == obj) return true;
     if (obj == null) return false;
@@ -173,12 +200,16 @@
     if (wild != other.wild) return false;
     return true;
   }
-
+  
   @Override
-  protected Object clone() throws CloneNotSupportedException {
-    return super.clone();
+  protected EntityTag clone() {
+    try {
+      return (EntityTag) super.clone();
+    } catch (CloneNotSupportedException e) {
+      return new EntityTag(tag,weak,wild); // not going to happen
+    }
   }
-
+  
   /**
    * Utility method for generating ETags. Works by concatenating the UTF-8 bytes
    * of the provided strings then generating an MD5 hash of the result.
@@ -202,7 +233,7 @@
     }
     return new EntityTag(etag);
   }
-
+  
   /**
    * Checks that the passed in ETag matches the ETag generated by the generate
    * method
@@ -211,7 +242,7 @@
     EntityTag etag2 = generate(material);
     return EntityTag.matches(etag, etag2);
   }
-
+  
   public static String toString(EntityTag... tags) {
     StringBuilder buf = new StringBuilder();
     for (EntityTag tag : tags) {
@@ -230,4 +261,12 @@
     }
     return buf.toString();
   }
-}
+  
+  public int compareTo(EntityTag o) {
+    if (o.isWild() && !isWild()) return 1;
+    if (isWild() && !o.isWild()) return -1;
+    if (o.isWeak() && !isWeak()) return -1;
+    if (isWeak() && !o.isWeak()) return 1;
+    return tag.compareTo(o.tag);
+  }
+}
\ No newline at end of file

Added: incubator/abdera/java/trunk/core/src/test/java/org/apache/abdera/test/core/EntityTagTest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/core/src/test/java/org/apache/abdera/test/core/EntityTagTest.java?rev=607810&view=auto
==============================================================================
--- incubator/abdera/java/trunk/core/src/test/java/org/apache/abdera/test/core/EntityTagTest.java (added)
+++ incubator/abdera/java/trunk/core/src/test/java/org/apache/abdera/test/core/EntityTagTest.java Mon Dec 31 22:53:34 2007
@@ -0,0 +1,76 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  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.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.abdera.test.core;
+
+import junit.framework.TestCase;
+
+import org.apache.abdera.util.EntityTag;
+
+public class EntityTagTest extends TestCase {
+
+  public static void testEntityTag() throws Exception {
+    String[] tags = {
+      "hello",
+      "\"hello\"",
+      "W/\"hello\"",
+      "*"
+    };
+    EntityTag[] etags = new EntityTag[tags.length];
+    for (int n = 0; n < tags.length; n++) {
+      etags[n] = new EntityTag(tags[n]);
+    }
+    assertFalse(etags[0].isWeak());
+    assertFalse(etags[0].isWild());
+    assertFalse(etags[1].isWeak());
+    assertFalse(etags[1].isWild());
+    assertTrue(etags[2].isWeak());
+    assertFalse(etags[2].isWild());
+    assertFalse(etags[3].isWeak());
+    assertTrue(etags[3].isWild());
+    assertEquals(etags[0].getTag(),"hello");
+    assertEquals(etags[1].getTag(),"hello");
+    assertEquals(etags[2].getTag(),"hello");
+    assertEquals(etags[3].getTag(),"*");
+    assertEquals(etags[0].toString(),tags[1]);
+    assertEquals(etags[1].toString(),tags[1]);
+    assertEquals(etags[2].toString(),tags[2]);
+    assertEquals(etags[3].toString(),tags[3]);
+    
+    assertTrue(EntityTag.matches(etags[3], etags[0]));
+    assertTrue(EntityTag.matches(etags[3], etags[1]));
+    assertTrue(EntityTag.matches(etags[3], etags[2]));
+    assertTrue(EntityTag.matches(etags[3], etags[3]));
+
+    assertTrue(EntityTag.matches(etags[0], etags[1]));
+    assertFalse(EntityTag.matches(etags[0], etags[2]));
+    
+    assertTrue(EntityTag.matchesAny(etags[3], new EntityTag[] {etags[0], etags[1], etags[2]}));
+    assertTrue(EntityTag.matchesAny(etags[0], new EntityTag[] {etags[3], etags[1], etags[2]}));
+    assertTrue(EntityTag.matchesAny(etags[1], new EntityTag[] {etags[0], etags[3], etags[2]}));
+    assertTrue(EntityTag.matchesAny(etags[2], new EntityTag[] {etags[0], etags[1], etags[3]}));
+    
+    java.util.Arrays.sort(etags);
+    assertEquals(etags[0].toString(),tags[3]);
+    assertEquals(etags[1].toString(),tags[1]);
+    assertEquals(etags[2].toString(),tags[1]);
+    assertEquals(etags[3].toString(),tags[2]);
+    EntityTag etag = EntityTag.generate("a","b","c","d");
+    assertEquals(etag.toString(),"\"e2fc714c4727ee9395f324cd2e7f331f\"");
+  }
+  
+}