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 2007/10/27 21:00:48 UTC

svn commit: r589181 - in /incubator/abdera/java/trunk: examples/src/main/java/org/apache/abdera/examples/ext/ extensions/main/src/main/java/org/apache/abdera/ext/features/ extensions/main/src/test/java/org/apache/abdera/test/ext/features/

Author: jmsnell
Date: Sat Oct 27 12:00:47 2007
New Revision: 589181

URL: http://svn.apache.org/viewvc?rev=589181&view=rev
Log:
Updates the features impl to match the current draft of the spec

Added:
    incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/Features.java
Modified:
    incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/ext/Features.java
    incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/Feature.java
    incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/FeaturesExtensionFactory.java
    incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/FeaturesHelper.java
    incubator/abdera/java/trunk/extensions/main/src/test/java/org/apache/abdera/test/ext/features/FeatureTest.java

Modified: incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/ext/Features.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/ext/Features.java?rev=589181&r1=589180&r2=589181&view=diff
==============================================================================
--- incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/ext/Features.java (original)
+++ incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/ext/Features.java Sat Oct 27 12:00:47 2007
@@ -40,10 +40,11 @@
     Collection collection = workspace.addCollection("My collection", "foo");
     
     // Specify which features are supported by the collection
-    FeaturesHelper.addFeature(collection, FeaturesHelper.FEATURE_SUPPORTS_DRAFTS);
-    FeaturesHelper.addFeature(collection, FeaturesHelper.FEATURE_REQUIRES_TEXT_TEXT);
-    FeaturesHelper.addFeature(collection, FeaturesHelper.FEATURE_IGNORES_SLUG);
-    FeaturesHelper.addFeature(collection, FeaturesHelper.FEATURE_SUPPORTS_BIDI);
+    org.apache.abdera.ext.features.Features features = FeaturesHelper.addFeaturesElement(collection);
+    features.addFeature(FeaturesHelper.FEATURE_SUPPORTS_DRAFTS);
+    features.addFeature(FeaturesHelper.FEATURE_REQUIRES_TEXT_TEXT);
+    features.addFeature(FeaturesHelper.FEATURE_IGNORES_SLUG);
+    features.addFeature(FeaturesHelper.FEATURE_SUPPORTS_BIDI);
     
     // Get the support status of a specific feature
     System.out.println(FeaturesHelper.getFeatureStatus(collection, FeaturesHelper.FEATURE_SUPPORTS_DRAFTS));
@@ -53,9 +54,8 @@
     System.out.println(FeaturesHelper.getFeatureStatus(collection, FeaturesHelper.FEATURE_SUPPORTS_GEO));
     
     
-    Feature[] features = null;
-    features = FeaturesHelper.getFeatures(collection);
-    for (Feature feature : features) {
+    Feature[] fs = FeaturesHelper.getFeatures(collection);
+    for (Feature feature : fs) {
       System.out.println("\t" + feature.getRef());
     }
     
@@ -73,3 +73,4 @@
   }
   
 }
+

Modified: incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/Feature.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/Feature.java?rev=589181&r1=589180&r2=589181&view=diff
==============================================================================
--- incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/Feature.java (original)
+++ incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/Feature.java Sat Oct 27 12:00:47 2007
@@ -17,12 +17,18 @@
 */
 package org.apache.abdera.ext.features;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.activation.MimeType;
+import javax.activation.MimeTypeParseException;
 import javax.xml.namespace.QName;
 
 import org.apache.abdera.factory.Factory;
 import org.apache.abdera.i18n.iri.IRI;
 import org.apache.abdera.model.Element;
 import org.apache.abdera.model.ExtensibleElementWrapper;
+import org.apache.abdera.util.MimeTypeHelper;
 
 public class Feature 
   extends ExtensibleElementWrapper {
@@ -68,4 +74,32 @@
       removeAttribute(new QName("label"));
   }
   
+  
+  public void addType(String mediaRange) {
+    addType(new String[] {mediaRange});
+  }
+  
+  public void addType(String... mediaRanges) {
+    mediaRanges = MimeTypeHelper.condense(mediaRanges);
+    for (String mediaRange : mediaRanges) {
+      try {
+        addSimpleExtension(FeaturesHelper.TYPE, new MimeType(mediaRange).toString());
+      } catch (MimeTypeParseException e) {}
+    }
+  }
+  
+  public String[] getTypes() {
+    List<String> list = new ArrayList<String>();
+    for (Element type : getExtensions(FeaturesHelper.TYPE)) {
+      String value = type.getText();
+      if (value != null) {
+        value = value.trim();
+        try {
+          list.add(new MimeType(value).toString());
+        } catch (MimeTypeParseException e) {}
+      }
+    }
+    return list.toArray(new String[list.size()]);
+  }
+
 }

Added: incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/Features.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/Features.java?rev=589181&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/Features.java (added)
+++ incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/Features.java Sat Oct 27 12:00:47 2007
@@ -0,0 +1,97 @@
+/*
+* 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.ext.features;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.apache.abdera.factory.Factory;
+import org.apache.abdera.i18n.iri.IRI;
+import org.apache.abdera.model.Element;
+import org.apache.abdera.model.ExtensibleElementWrapper;
+import org.apache.abdera.util.URIHelper;
+
+public class Features 
+  extends ExtensibleElementWrapper {
+  
+  public Features(
+    Element internal) {
+      super(internal);
+  }
+  
+  public Features(
+    Factory factory, 
+    QName qname) {
+      super(factory, qname);
+  }
+
+  public IRI getResolvedHref() {
+    return URIHelper.resolve(getResolvedBaseUri(), getHref());
+  }
+  
+  public IRI getHref() {
+    String href = getAttributeValue("href");
+    return href != null ? new IRI(href) : null;
+  }
+  
+  public void setHref(String href) {
+    setAttributeValue("href", (new IRI(href)).toString());
+  }
+  
+  public String getName() {
+    return getAttributeValue("name");
+  }
+  
+  public void setName(String name) {
+    setAttributeValue("name",name);
+  }
+  
+  public void addFeature(Feature feature) {
+    addExtension(feature);
+  }
+  
+  public void addFeature(Feature... features) {
+    for (Feature feature : features) addFeature(feature);
+  }
+  
+  public Feature addFeature(String feature) {
+    Feature f = addExtension(FeaturesHelper.FEATURE);
+    f.setRef(feature);
+    return f;
+  }
+
+  public Feature addFeature(String feature, String href, String label) {
+    Feature f = addExtension(FeaturesHelper.FEATURE);
+    f.setRef(feature);
+    f.setHref(href);
+    f.setLabel(label);
+    return f;
+  }
+  
+  public Feature[] addFeatures(String... features) {
+    List<Feature> list = new ArrayList<Feature>();
+    for (String feature : features) list.add(addFeature(feature));
+    return list.toArray(new Feature[list.size()]);
+  }
+  
+  public List<Feature> getFeatures() {
+    return getExtensions(FeaturesHelper.FEATURE);
+  }
+}

Modified: incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/FeaturesExtensionFactory.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/FeaturesExtensionFactory.java?rev=589181&r1=589180&r2=589181&view=diff
==============================================================================
--- incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/FeaturesExtensionFactory.java (original)
+++ incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/FeaturesExtensionFactory.java Sat Oct 27 12:00:47 2007
@@ -25,6 +25,7 @@
   public FeaturesExtensionFactory() {
     super(FeaturesHelper.FNS);
     addImpl(FeaturesHelper.FEATURE,Feature.class);
+    addImpl(FeaturesHelper.FEATURES,Features.class);
   }
   
 }

Modified: incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/FeaturesHelper.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/FeaturesHelper.java?rev=589181&r1=589180&r2=589181&view=diff
==============================================================================
--- incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/FeaturesHelper.java (original)
+++ incubator/abdera/java/trunk/extensions/main/src/main/java/org/apache/abdera/ext/features/FeaturesHelper.java Sat Oct 27 12:00:47 2007
@@ -18,19 +18,23 @@
 package org.apache.abdera.ext.features;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
 
-import javax.activation.MimeType;
-import javax.activation.MimeTypeParseException;
 import javax.xml.namespace.QName;
 
+import org.apache.abdera.Abdera;
 import org.apache.abdera.factory.Factory;
-import org.apache.abdera.i18n.iri.IRI;
 import org.apache.abdera.model.Collection;
+import org.apache.abdera.model.Document;
 import org.apache.abdera.model.Element;
 import org.apache.abdera.model.Service;
 import org.apache.abdera.model.Workspace;
-import org.apache.abdera.util.MimeTypeHelper;
+import org.apache.abdera.protocol.Response.ResponseType;
+import org.apache.abdera.protocol.client.AbderaClient;
+import org.apache.abdera.protocol.client.ClientResponse;
 
 /**
  * Implementation of the current APP Features Draft
@@ -45,6 +49,7 @@
   
   public static final String FNS = "http://purl.org/atompub/features/1.0";
   public static final QName FEATURE = new QName(FNS, "feature","f");
+  public static final QName FEATURES = new QName(FNS, "features","f");
   public static final QName TYPE = new QName(FNS, "type", "f");
   
   private static final String FEATURE_BASE                   = "http://www.w3.org/2007/app/";
@@ -215,17 +220,73 @@
    * examples of the type of markup that would be removed include scripts and embed 
    */
   public static final String FEATURE_FILTERS_MARKUP = BLOG_FEATURE_BASE + "filtersUnsafeMarkup";
+    
+  private FeaturesHelper() {}
   
+  private static Map<String,Features> featuresCache = 
+    Collections.synchronizedMap(new WeakHashMap<String,Features>());
   
-  private FeaturesHelper() {}
+  private static Features getCachedFeatures(String iri) {
+    return featuresCache.get(iri);
+  }
+  
+  private static void setCachedFeatures(String iri, Features features) {
+    featuresCache.put(iri,features);
+  }
+  
+  public static void flushCachedFeatures() {
+    featuresCache.clear();
+  }
+  
+  public static Features newFeatures(Abdera abdera) {
+    Factory factory = abdera.getFactory();
+    Document<Features> doc = factory.newDocument();
+    Features features = factory.newElement(FEATURES,doc);
+    doc.setRoot(features);
+    return features;
+  }
+  
+  public static Features getFeaturesElement(Collection collection) {
+    return getFeaturesElement(collection,true);
+  }
+  
+  public static Features getFeaturesElement(Collection collection, boolean outofline) {
+    Features features = collection.getExtension(FEATURES);
+    if (features != null && outofline) {
+      if (features.getHref() != null) {
+        String iri = features.getResolvedHref().toASCIIString();
+        features = getCachedFeatures(iri);
+        if (features == null) {
+          Abdera abdera = collection.getFactory().getAbdera();
+          AbderaClient client = new AbderaClient(abdera);
+          ClientResponse resp = client.get(iri);
+          if(resp.getType() == ResponseType.SUCCESS) {
+            Document<Features> doc = resp.getDocument();
+            features = doc.getRoot();
+            setCachedFeatures(iri,features);
+          } else {
+            features = null;
+          }
+        }
+      }
+    }
+    return features;
+  }
+  
+  public static Feature getFeature(
+    Collection collection,
+    String feature) {
+      return getFeature(getFeaturesElement(collection), feature);
+  }
   
   /**
    * Returns the specified feature element or null
    */
   public static Feature getFeature(
-    Collection collection,
+    Features features,
     String feature) {
-      List<Element> list = collection.getExtensions(FEATURE);
+      if (features == null) return null;
+      List<Element> list = features.getExtensions(FEATURE);
       for (Element el : list) {
         if (el.getAttributeValue("ref").equals(feature))
           return (Feature) el;
@@ -234,66 +295,28 @@
   }
   
   public static Status getFeatureStatus(Collection collection, String feature) {
-    Feature f = getFeature(collection,feature);
-    return f != null ? Status.SPECIFIED : Status.UNSPECIFIED;
+    return getFeatureStatus(getFeaturesElement(collection), feature);
   }
   
-  public static Feature[] getFeatures(Collection collection) {    
-    List<Feature> features = collection.getExtensions(FEATURE);
-    return features.toArray(new Feature[features.size()]);
+  public static Status getFeatureStatus(Features features, String feature) {
+    if (features == null) return Status.UNSPECIFIED;
+    Feature f = getFeature(features,feature);
+    return f != null ? Status.SPECIFIED : Status.UNSPECIFIED;
   }
   
-  /**
-   * Add the specified features to the collection
-   */
-  public static Feature[] addFeatures(
-    Collection collection, 
-    String... features) {
-      List<Feature> list = new ArrayList<Feature>();
-      for (String feature : features)
-        list.add(addFeature(collection,feature));
-      return list.toArray(new Feature[list.size()]);
+  public static Feature[] getFeatures(Collection collection) {
+    Features features = getFeaturesElement(collection);
+    if (features == null) return null;
+    List<Feature> list = features.getExtensions(FEATURE);
+    return list.toArray(new Feature[list.size()]);
   }
   
-  /**
-   * Add the specified feature to the collection
-   * @param collection The collection
-   * @param feature The IRI of the feature to add 
-   */
-  public static Feature addFeature(
-    Collection collection, 
-    String feature) {
-      return addFeature(
-        collection, 
-        feature, 
-        null, null);
-  }
-    
-  /**
-   * Add the specified feature to the collection
-   * @param collection The collection
-   * @param feature The IRI of the feature to add 
-   * @param required True if the feature is required
-   * @param href An IRI pointing to a human readable resource describing the feature
-   * @param label A human readable label for the feature
-   */
-  public static Feature addFeature(
-    Collection collection, 
-    String feature,
-    String href,
-    String label) {
-    if (getFeature(collection, feature) != null) 
-      throw new IllegalArgumentException("Feature already specified");
-    Factory factory = collection.getFactory();
-    Feature el = 
-      (Feature)factory.newExtensionElement(
-        FeaturesHelper.FEATURE, collection);
-    collection.declareNS(FNS, "f");
-    el.setRef(new IRI(feature).toString());
-    if (href != null) el.setHref(new IRI(href).toString());
-    if (label != null) el.setLabel(label);
-    return el;
-  }
+  public static Features addFeaturesElement(Collection collection) {
+    if (getFeaturesElement(collection,false) != null) 
+      throw new IllegalArgumentException(
+        "A collection element can only contain one features element");
+    return collection.addExtension(FEATURES);
+  }  
   
   /**
    * Select a Collection from the service document
@@ -339,32 +362,5 @@
     }
     return list.toArray(new Collection[list.size()]);
   }
-  
-  public static void addType(Feature feature, String mediaRange) {
-    addType(feature, new String[] {mediaRange});
-  }
-  
-  public static void addType(Feature feature, String... mediaRanges) {
-    mediaRanges = MimeTypeHelper.condense(mediaRanges);
-    for (String mediaRange : mediaRanges) {
-      try {
-        feature.addSimpleExtension(TYPE, new MimeType(mediaRange).toString());
-      } catch (MimeTypeParseException e) {}
-    }
-  }
-  
-  public static String[] getTypes(Feature feature) {
-    List<String> list = new ArrayList<String>();
-    for (Element type : feature.getExtensions(TYPE)) {
-      String value = type.getText();
-      if (value != null) {
-        value = value.trim();
-        try {
-          list.add(new MimeType(value).toString());
-        } catch (MimeTypeParseException e) {}
-      }
-    }
-    return list.toArray(new String[list.size()]);
-  }
-  
+   
 }

Modified: incubator/abdera/java/trunk/extensions/main/src/test/java/org/apache/abdera/test/ext/features/FeatureTest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/main/src/test/java/org/apache/abdera/test/ext/features/FeatureTest.java?rev=589181&r1=589180&r2=589181&view=diff
==============================================================================
--- incubator/abdera/java/trunk/extensions/main/src/test/java/org/apache/abdera/test/ext/features/FeatureTest.java (original)
+++ incubator/abdera/java/trunk/extensions/main/src/test/java/org/apache/abdera/test/ext/features/FeatureTest.java Sat Oct 27 12:00:47 2007
@@ -23,24 +23,36 @@
 import org.apache.abdera.ext.features.AcceptSelector;
 import org.apache.abdera.ext.features.Feature;
 import org.apache.abdera.ext.features.FeatureSelector;
+import org.apache.abdera.ext.features.Features;
 import org.apache.abdera.ext.features.FeaturesHelper;
 import org.apache.abdera.ext.features.Selector;
 import org.apache.abdera.ext.features.XPathSelector;
 import org.apache.abdera.ext.features.FeaturesHelper.Status;
 import org.apache.abdera.model.Collection;
+import org.apache.abdera.model.Document;
 import org.apache.abdera.model.Service;
 import org.apache.abdera.model.Workspace;
 
 public class FeatureTest extends TestCase {
 
+  public static void testFeaturesDocument() throws Exception {
+    Abdera abdera = Abdera.getInstance();
+    Features features = FeaturesHelper.newFeatures(abdera);
+    assertNotNull(features);
+    assertNotNull(features.getDocument());
+    Document<Features> doc = features.getDocument();
+    assertTrue(doc.getRoot() instanceof Features);
+  }
+  
   public static void testFeatures() throws Exception {
-    Abdera abdera = new Abdera();
+    Abdera abdera = Abdera.getInstance();
     Collection coll = abdera.getFactory().newCollection();
-    FeaturesHelper.addFeature(
-      coll, "http://example.com/features/foo", 
+    Features features = FeaturesHelper.addFeaturesElement(coll);
+    features.addFeature(
+      "http://example.com/features/foo", 
       null, "foo & here");
-    FeaturesHelper.addFeature(
-      coll, "http://example.com/features/bar", 
+    features.addFeature(
+      "http://example.com/features/bar", 
       null, null);
     
     assertEquals(Status.SPECIFIED,FeaturesHelper.getFeatureStatus(
@@ -56,12 +68,13 @@
   
   public static void testSelectors() throws Exception {
     
-    Abdera abdera = new Abdera();
+    Abdera abdera = Abdera.getInstance();
     Service service = abdera.newService();
     Workspace workspace = service.addWorkspace("a");
     Collection collection1 = workspace.addCollection("a1","a1");
     collection1.setAcceptsEntry();
-    FeaturesHelper.addFeature(collection1, FeaturesHelper.FEATURE_SUPPORTS_DRAFTS);
+    Features features = FeaturesHelper.addFeaturesElement(collection1);
+    features.addFeature(FeaturesHelper.FEATURE_SUPPORTS_DRAFTS);
     Collection collection2 = workspace.addCollection("a2","a2");
     collection2.setAccept("image/*");
     
@@ -80,7 +93,7 @@
     assertEquals(collections[0],collection2);
     
     Selector s3 = new XPathSelector(
-      "f:feature[@ref='" + FeaturesHelper.FEATURE_SUPPORTS_DRAFTS + "']");
+      "f:features/f:feature[@ref='" + FeaturesHelper.FEATURE_SUPPORTS_DRAFTS + "']");
     
     collections = FeaturesHelper.select(service,s3);
     
@@ -90,10 +103,10 @@
   
 
   public static void testType() throws Exception {
-     Abdera abdera = new Abdera();
+    Abdera abdera = Abdera.getInstance();
      Feature feature = abdera.getFactory().newElement(FeaturesHelper.FEATURE);
-     FeaturesHelper.addType(feature, "image/jpg","image/gif","image/png","image/*");
-     String[] types = FeaturesHelper.getTypes(feature);
+     feature.addType("image/jpg","image/gif","image/png","image/*");
+     String[] types = feature.getTypes();
      assertEquals(1,types.length);
      assertEquals("image/*", types[0]);
   }