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 2011/09/20 17:57:20 UTC
svn commit: r1173209 [37/49] - in /abdera/abdera2: ./ .settings/ activities/
activities/src/ activities/src/main/ activities/src/main/java/
activities/src/main/java/org/ activities/src/main/java/org/apache/
activities/src/main/java/org/apache/abdera2/ ...
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/serializer/impl/WorkspaceSerializer.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/serializer/impl/WorkspaceSerializer.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/serializer/impl/WorkspaceSerializer.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/serializer/impl/WorkspaceSerializer.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,41 @@
+/*
+ * 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.abdera2.ext.serializer.impl;
+
+import org.apache.abdera2.common.Constants;
+import org.apache.abdera2.ext.serializer.Conventions;
+import org.apache.abdera2.ext.serializer.ObjectContext;
+import org.apache.abdera2.ext.serializer.SerializationContext;
+import org.apache.abdera2.ext.serializer.annotation.Collection;
+
+public class WorkspaceSerializer extends ElementSerializer {
+
+ public WorkspaceSerializer() {
+ super(Constants.WORKSPACE);
+ }
+
+ protected void process(Object source,
+ ObjectContext objectContext,
+ SerializationContext context,
+ Conventions conventions) {
+ writeAttributes(source, objectContext, context, conventions);
+ writeExtensions(source, objectContext, context, conventions);
+ writeElements(Collection.class, new CollectionSerializer(), source, objectContext, context, conventions);
+ writeExtensions(source, objectContext, context, conventions);
+ }
+}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/serializer/impl/WorkspaceSerializer.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Conflicts.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Conflicts.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Conflicts.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Conflicts.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,48 @@
+/*
+ * 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.abdera2.ext.sharing;
+
+import java.util.List;
+
+import org.apache.abdera2.common.Constants;
+import org.apache.abdera2.common.anno.QName;
+import org.apache.abdera2.factory.Factory;
+import org.apache.abdera2.model.Element;
+import org.apache.abdera2.model.Entry;
+import org.apache.abdera2.model.ExtensibleElementWrapper;
+
+@QName(value="conflicts",ns=SharingHelper.SSENS,pfx=SharingHelper.SSEPFX)
+public class Conflicts extends ExtensibleElementWrapper {
+
+ public Conflicts(Element internal) {
+ super(internal);
+ }
+
+ public Conflicts(Factory factory, javax.xml.namespace.QName qname) {
+ super(factory, qname);
+ }
+
+ public List<Entry> getEntries() {
+ return getExtensions(Constants.ENTRY);
+ }
+
+ public void addEntry(Entry entry) {
+ addExtension((Entry)entry.clone());
+ }
+
+}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Conflicts.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/History.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/History.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/History.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/History.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,79 @@
+/*
+ * 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.abdera2.ext.sharing;
+
+import java.util.Date;
+
+import org.apache.abdera2.factory.Factory;
+import org.apache.abdera2.common.anno.QName;
+import org.apache.abdera2.common.date.DateTime;
+import org.apache.abdera2.model.Element;
+import org.apache.abdera2.model.ElementWrapper;
+
+@QName(value="history",ns=SharingHelper.SSENS,pfx=SharingHelper.SSEPFX)
+public class History extends ElementWrapper {
+
+ public History(Element internal) {
+ super(internal);
+ }
+
+ public History(Factory factory, javax.xml.namespace.QName qname) {
+ super(factory, qname);
+ }
+
+ public int getSequence() {
+ String sequence = getAttributeValue("sequence");
+ return sequence != null ? Integer.parseInt(sequence) : 0;
+ }
+
+ public void setSequence(int sequence) {
+ if (sequence > 0) {
+ setAttributeValue("sequence", Integer.toString(sequence));
+ } else {
+ removeAttribute("sequence");
+ }
+ }
+
+ public Date getWhen() {
+ String when = getAttributeValue("when");
+ return when != null ? DateTime.parse(when) : null;
+ }
+
+ public void setWhen(Date when) {
+ if (when != null) {
+ setAttributeValue("when", DateTime.format(when));
+ } else {
+ removeAttribute("when");
+ }
+ }
+
+ public String getBy() {
+ return getAttributeValue("by");
+ }
+
+ public void setBy(String by) {
+ if (by != null) {
+ if (!SharingHelper.isValidEndpointIdentifier(by))
+ throw new IllegalArgumentException("Invalid Endpoint Identifier");
+ setAttributeValue("by", by);
+ } else {
+ removeAttribute("by");
+ }
+ }
+
+}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/History.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Related.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Related.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Related.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Related.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,79 @@
+/*
+ * 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.abdera2.ext.sharing;
+
+import org.apache.abdera2.factory.Factory;
+import org.apache.abdera2.common.anno.QName;
+import org.apache.abdera2.common.iri.IRI;
+import org.apache.abdera2.model.Element;
+import org.apache.abdera2.model.ElementWrapper;
+
+@QName(value="related",ns=SharingHelper.SSENS,pfx=SharingHelper.SSEPFX)
+public class Related extends ElementWrapper {
+
+ public static enum Type {
+ COMPLETE, AGGREGATED
+ };
+
+ public Related(Element internal) {
+ super(internal);
+ }
+
+ public Related(Factory factory, javax.xml.namespace.QName qname) {
+ super(factory, qname);
+ }
+
+ public IRI getLink() {
+ String link = getAttributeValue("link");
+ return link != null ? new IRI(link) : null;
+ }
+
+ public void setLink(String link) {
+ if (link != null) {
+ setAttributeValue("link", new IRI(link).toString());
+ } else {
+ removeAttribute("link");
+ }
+ }
+
+ public String getTitle() {
+ return getAttributeValue("title");
+ }
+
+ public void setTitle(String title) {
+ if (title != null) {
+ setAttributeValue("title", title);
+ } else {
+ removeAttribute("title");
+ }
+ }
+
+ public Type getType() {
+ String type = getAttributeValue("type");
+ return type != null ? Type.valueOf(type.toUpperCase()) : null;
+ }
+
+ public void setType(Type type) {
+ if (type != null) {
+ setAttributeValue("type", type.name().toLowerCase());
+ } else {
+ removeAttribute("type");
+ }
+ }
+
+}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Related.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Sharing.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Sharing.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Sharing.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Sharing.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,98 @@
+/*
+ * 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.abdera2.ext.sharing;
+
+import java.util.Date;
+import java.util.List;
+
+import org.apache.abdera2.factory.Factory;
+import org.apache.abdera2.common.anno.QName;
+import org.apache.abdera2.common.date.DateTime;
+import org.apache.abdera2.model.Element;
+import org.apache.abdera2.model.ExtensibleElementWrapper;
+
+@QName(value="sharing",ns=SharingHelper.SSENS,pfx=SharingHelper.SSEPFX)
+public class Sharing extends ExtensibleElementWrapper {
+
+ public Sharing(Element internal) {
+ super(internal);
+ }
+
+ public Sharing(Factory factory, javax.xml.namespace.QName qname) {
+ super(factory, qname);
+ }
+
+ public Date getSince() {
+ String since = getAttributeValue("since");
+ return since != null ? DateTime.parse(since) : null;
+ }
+
+ public void setSince(Date since) {
+ if (since != null) {
+ setAttributeValue("since", DateTime.format(since));
+ } else {
+ removeAttribute("since");
+ }
+ }
+
+ public Date getUntil() {
+ String until = getAttributeValue("until");
+ return until != null ? DateTime.parse(until) : null;
+ }
+
+ public void setUntil(Date until) {
+ if (until != null) {
+ setAttributeValue("until", DateTime.format(until));
+ } else {
+ removeAttribute("until");
+ }
+ }
+
+ public Date getExpires() {
+ String expires = getAttributeValue("expires");
+ return expires != null ? DateTime.parse(expires) : null;
+ }
+
+ public void setExpires(Date expires) {
+ if (expires != null) {
+ setAttributeValue("expires", DateTime.format(expires));
+ } else {
+ removeAttribute("expires");
+ }
+ }
+
+ public List<Related> getRelated() {
+ return getExtensions(SharingHelper.SSE_RELATED);
+ }
+
+ public void addRelated(Related related) {
+ addExtension(related);
+ }
+
+ public Related addRelated() {
+ return getFactory().newElement(SharingHelper.SSE_RELATED, this);
+ }
+
+ public Related addRelated(String link, String title, Related.Type type) {
+ Related related = addRelated();
+ related.setLink(link);
+ related.setTitle(title);
+ related.setType(type);
+ return related;
+ }
+}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Sharing.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/SharingExtensionFactory.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/SharingExtensionFactory.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/SharingExtensionFactory.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/SharingExtensionFactory.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,36 @@
+/*
+ * 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.abdera2.ext.sharing;
+
+import org.apache.abdera2.common.anno.Namespace;
+import org.apache.abdera2.factory.AbstractExtensionFactory;
+import org.apache.abdera2.factory.AbstractExtensionFactory.Impls;
+import org.apache.abdera2.factory.AbstractExtensionFactory.Impl;
+import static org.apache.abdera2.ext.sharing.SharingHelper.*;
+@Namespace(SSENS)
+@Impls(
+ {
+ @Impl(Conflicts.class),
+ @Impl(History.class),
+ @Impl(Related.class),
+ @Impl(Sharing.class),
+ @Impl(Sync.class),
+ @Impl(Unpublished.class)
+ }
+)
+public class SharingExtensionFactory extends AbstractExtensionFactory {}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/SharingExtensionFactory.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/SharingHelper.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/SharingHelper.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/SharingHelper.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/SharingHelper.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,467 @@
+/*
+ * 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.abdera2.ext.sharing;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
+import org.apache.abdera2.Abdera;
+import org.apache.abdera2.model.Base;
+import org.apache.abdera2.model.Entry;
+import org.apache.abdera2.model.Feed;
+import org.apache.abdera2.model.Source;
+
+public class SharingHelper {
+
+ public static final String SSENS = "http://feedsync.org/2007/feedsync";
+ public static final String SSEPFX = "sx";
+
+ public static final QName SSE_SHARING = new QName(SSENS, "sharing", SSEPFX);
+ public static final QName SSE_RELATED = new QName(SSENS, "related", SSEPFX);
+ public static final QName SSE_CONFLICTS = new QName(SSENS, "conflicts", SSEPFX);
+ public static final QName SSE_HISTORY = new QName(SSENS, "history", SSEPFX);
+ public static final QName SSE_SYNC = new QName(SSENS, "sync", SSEPFX);
+ public static final QName SSE_UNPUBLISHED = new QName(SSENS, "unpublished", SSEPFX);
+
+ protected static boolean isTrue(String value) {
+ return value.equalsIgnoreCase("true") || value.equals("1") || value.equals("-1") || value.equals("yes");
+ }
+
+ public static <T extends Source> Sharing getSharing(T source) {
+ return getSharing(source, false);
+ }
+
+ public static <T extends Source> Sharing getSharing(T source, boolean create) {
+ Sharing sharing = source.getExtension(SSE_SHARING);
+ if (sharing == null && create)
+ sharing = source.addExtension(SSE_SHARING);
+ return sharing;
+ }
+
+ public static <T extends Source> boolean hasSharing(T source) {
+ return getSharing(source) != null;
+ }
+
+ public static Unpublished getUnpublished(Feed feed) {
+ return getUnpublished(feed, false);
+ }
+
+ public static Unpublished getUnpublished(Feed feed, boolean create) {
+ Unpublished unpub = feed.getExtension(SSE_UNPUBLISHED);
+ if (unpub == null && create)
+ unpub = feed.addExtension(SSE_UNPUBLISHED);
+ return unpub;
+ }
+
+ public static Sync getSync(Entry entry) {
+ return getSync(entry, false);
+ }
+
+ public static Sync getSync(Entry entry, boolean create) {
+ Sync sync = entry.getExtension(SSE_SYNC);
+ if (sync == null && create)
+ sync = entry.addExtension(SSE_SYNC);
+ return sync;
+ }
+
+ public static boolean hasSync(Entry entry) {
+ return getSync(entry, false) != null;
+ }
+
+ public static Entry createEntry(Abdera abdera, String by) {
+ return createEntry(abdera, by, null);
+ }
+
+ public static Entry createEntry(Abdera abdera, String by, Feed feed) {
+ Entry entry = feed != null ? feed.addEntry() : abdera.newEntry();
+ entry.newId();
+ Sync sync = getSync(entry, true);
+ sync.setId(entry.getId().toString());
+ sync.setUpdates(1);
+ History history = sync.addHistory();
+ history.setSequence(sync.getUpdates());
+ history.setWhen(new Date());
+ history.setBy(by);
+ return entry;
+ }
+
+ public static void deleteEntry(Entry entry, String by) {
+ Sync sync = getSync(entry, true);
+ sync.incrementUpdates();
+ sync.setDeleted(true);
+ History history = sync.addHistory();
+ history.setSequence(sync.getUpdates());
+ history.setWhen(new Date());
+ history.setBy(by);
+ }
+
+ public static void updateEntry(Entry entry, String by) {
+ Sync sync = getSync(entry, true);
+ sync.incrementUpdates();
+ History history = sync.addHistory();
+ history.setSequence(sync.getUpdates());
+ history.setWhen(new Date());
+ history.setBy(by);
+ }
+
+ public static Map<String, Entry> getSyncIdMap(Feed feed) {
+ Map<String, Entry> entries = new HashMap<String, Entry>();
+ for (Entry entry : feed.getEntries()) {
+ Sync sync = getSync(entry, false);
+ if (sync != null) {
+ String id = sync.getId();
+ if (id != null) {
+ entries.put(id, entry);
+ }
+ }
+ }
+ return entries;
+ }
+
+ public static boolean isSubsumed(Sync s1, Sync s2) {
+ if (s1 == null && s2 == null)
+ return false;
+ if (s1 == null && s2 != null)
+ return true;
+ if (s1 != null && s2 == null)
+ return false;
+ if (s1.equals(s2))
+ return false;
+ if (!s1.getId().equals(s2.getId()))
+ return false;
+ History h1 = s1.getFirstChild(SSE_HISTORY);
+ for (History h2 : s2.getHistory()) {
+ if (isSubsumed(h1, h2))
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean isSubsumed(History h1, History h2) {
+ if (h1 == null && h2 == null)
+ return false;
+ if (h1 == null && h2 != null)
+ return true;
+ if (h1 != null && h2 == null)
+ return false;
+ if (h1.equals(h2))
+ return false;
+ String h1by = h1.getBy();
+ String h2by = h2.getBy();
+ if (h1by != null) {
+ if (h2by != null && h1by.equals(h2by) && h2.getSequence() >= h1.getSequence())
+ return true;
+ } else {
+ if (h2by == null && h1.getWhen().equals(h2.getWhen()) && h1.getSequence() == h2.getSequence())
+ return true;
+ }
+ return false;
+ }
+
+ public static Sync pickWinner(Sync s1, Sync s2) {
+ if (s1 == null && s2 == null)
+ return null;
+ if (s1 == null && s2 != null)
+ return s2;
+ if (s1 != null && s2 == null)
+ return s1;
+ if (s1.equals(s2))
+ return s1;
+ if (!s1.getId().equals(s2.getId()))
+ return null;
+ if (s1.getUpdates() > s2.getUpdates())
+ return s1;
+ if (s1.getUpdates() == s2.getUpdates()) {
+ History h1 = s1.getTopmostHistory();
+ History h2 = s2.getTopmostHistory();
+ Date d1 = h1.getWhen();
+ Date d2 = h2.getWhen();
+ if (d1 != null && d2 == null)
+ return s1;
+ if (d1.after(d2))
+ return s1;
+ if (d1.equals(d2)) {
+ String b1 = h1.getBy();
+ String b2 = h2.getBy();
+ if (b1 != null && b2 == null)
+ return s1;
+ if (b1.compareTo(b2) > 0)
+ return s1;
+ }
+ }
+ return s2;
+ }
+
+ private static List<Entry> getConflicts(Entry entry) {
+ List<Entry> list = new ArrayList<Entry>();
+ Sync sync = getSync(entry, false);
+ if (sync != null) {
+ Conflicts conflicts = sync.getConflicts(false);
+ if (conflicts != null) {
+ list.addAll(conflicts.getEntries());
+ }
+ }
+ list.add(entry);
+ return list;
+ }
+
+ private static Entry compareConflicts(Entry w, List<Entry> outerList, List<Entry> innerList, List<Entry> results) {
+ Entry[] outer = outerList.toArray(new Entry[outerList.size()]);
+ Entry[] inner = innerList.toArray(new Entry[innerList.size()]);
+ for (Entry x : outer) {
+ Sync s1 = getSync(x, false);
+ boolean ok = true;
+ for (Entry y : inner) {
+ Sync s2 = getSync(y, false);
+ if (isSubsumed(s1, s2)) {
+ outerList.remove(s1);
+ ok = false;
+ break;
+ }
+ }
+ if (ok) {
+ results.add(x);
+ if (w == null)
+ w = x;
+ else {
+ Sync s2 = getSync(w);
+ if (pickWinner(s1, s2) == s1)
+ w = x;
+ }
+ }
+ }
+ return w;
+ }
+
+ public static void mergeFeeds(Feed source, Feed dest) {
+ Map<String, Entry> destentries = getSyncIdMap(dest);
+ for (Entry entry : source.getEntries()) {
+ Sync s2 = getSync(entry, false);
+ if (s2 != null) {
+ String id = s2.getId();
+ if (id != null) {
+ Entry existing = destentries.get(id);
+ if (existing == null) {
+ Entry e = (Entry)entry.clone();
+ dest.addEntry(e);
+ } else {
+ Sync s1 = getSync(existing, false);
+ List<Entry> c1 = getConflicts(existing);
+ List<Entry> c2 = getConflicts(entry);
+ List<Entry> m = new ArrayList<Entry>();
+ Entry w = null;
+ w = compareConflicts(w, c1, c2, m);
+ w = compareConflicts(w, c2, c1, m);
+ // if (w != null) dest.addEntry((Entry)w.clone());
+ if (s1.isNoConflicts())
+ return;
+ if (m.size() > 0) {
+ Sync sync = getSync(w, true);
+ sync.setConflicts(null);
+ Conflicts conflicts = sync.getConflicts(true);
+ for (Entry e : m) {
+ if (e != w)
+ conflicts.addEntry(e);
+ }
+ }
+ }
+ }
+ } // otherwise skip the entry
+ }
+ }
+
+ private static void mergeConflictItems(Entry entry, List<Entry> conflicts) {
+ Sync sync = getSync(entry, true);
+ for (Entry x : conflicts) {
+ Sync xsync = getSync(x, false);
+ if (xsync != null) {
+ List<History> list = xsync.getHistory();
+ History[] history = list.toArray(new History[list.size()]);
+ for (History h1 : history) {
+ h1 = (History)h1.clone();
+ h1.discard();
+ boolean ok = true;
+ for (History h2 : sync.getHistory()) {
+ if (isSubsumed(h1, h2)) {
+ ok = false;
+ break;
+ }
+ }
+ if (ok)
+ sync.addHistory((History)h1);
+ }
+ }
+ }
+ }
+
+ public static Entry resolveConflicts(Entry entry, ConflictResolver resolver, String by) {
+ List<Entry> conflicts = getConflicts(entry);
+ entry = resolver.resolve(entry, conflicts);
+ updateEntry(entry, by);
+ mergeConflictItems(entry, conflicts);
+ return entry;
+ }
+
+ public static interface ConflictResolver {
+ Entry resolve(Entry entry, List<Entry> conflicts);
+ }
+
+ public static Entry unpublish(Entry entry) {
+ if (entry == null)
+ return null;
+ Base base = entry.getParentElement();
+ if (base == null || !(base instanceof Feed))
+ return null;
+ Feed feed = (Feed)base;
+ Unpublished unpub = getUnpublished(feed, true);
+ Entry newentry = (Entry)entry.clone();
+ newentry.setParentElement(unpub);
+ unpub.addEntry(newentry);
+ entry.discard();
+ return newentry;
+ }
+
+ public static Entry republish(Entry entry) {
+ if (entry == null)
+ return null;
+ Base base = entry.getParentElement();
+ if (base == null || !(base instanceof Unpublished))
+ return null;
+ Unpublished unpub = (Unpublished)base;
+ Feed feed = unpub.getParentElement();
+ Entry newentry = (Entry)entry.clone();
+ newentry.setParentElement(feed);
+ feed.addEntry(newentry);
+ entry.discard();
+ return newentry;
+ }
+
+ public static void publish(Feed feed, Date expires, boolean initial) {
+ if (initial) {
+ Sharing sharing = getSharing(feed, true);
+ Date since = getMin(feed);
+ Date until = getMax(feed);
+ sharing.setSince(since);
+ sharing.setUntil(until);
+ sharing.setExpires(expires);
+ } else {
+ Sharing sharing = getSharing(feed, false);
+ if (sharing != null) {
+ sharing.setExpires(expires);
+ } else {
+ publish(feed, expires, true);
+ }
+ }
+ }
+
+ private static Date getMax(Feed feed) {
+ Date d = null;
+ for (Entry entry : feed.getEntries()) {
+ Date updated = entry.getUpdated();
+ if (d == null)
+ d = updated;
+ if (updated.after(d))
+ d = updated;
+ }
+ return d;
+ }
+
+ private static Date getMin(Feed feed) {
+ Date d = null;
+ for (Entry entry : feed.getEntries()) {
+ Date updated = entry.getUpdated();
+ if (d == null)
+ d = updated;
+ if (updated.before(d))
+ d = updated;
+ }
+ return d;
+ }
+
+ public static boolean hasConflicts(Entry entry) {
+ Sync sync = getSync(entry);
+ if (sync != null) {
+ Conflicts conflicts = sync.getConflicts();
+ if (conflicts != null) {
+ if (conflicts.getEntries().size() > 0) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public static boolean isValidEndpointIdentifier(String id) {
+ if (id == null)
+ return false;
+ char[] chars = id.toCharArray();
+ for (int i = 0; i < chars.length; i++) {
+ char c = chars[i];
+ if (!is_alphanum(c) && !is_reserved_or_other(c) && !is_hex(chars, i)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private static boolean is_alphanum(char c) {
+ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9');
+ }
+
+ private static boolean is_reserved_or_other(char c) {
+ return c == '/' || c == '?'
+ || c == '#'
+ || c == '('
+ || c == ')'
+ || c == '+'
+ || c == ','
+ || c == '-'
+ || c == '.'
+ || c == ':'
+ || c == '='
+ || c == '@'
+ || c == ';'
+ || c == '$'
+ || c == '_'
+ || c == '!'
+ || c == '*'
+ || c == '\'';
+ }
+
+ private static boolean is_hex(char[] chars, int i) {
+ if (chars[i] == '%') {
+ if (i + 2 > chars.length)
+ return false;
+ return is_hex(chars[i], chars[i + 1], chars[i + 2]);
+ }
+ return false;
+ }
+
+ private static boolean is_hexdigit(char c) {
+ return (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') || (c >= '0' && c <= '9');
+ }
+
+ private static boolean is_hex(char c, char c2, char c3) {
+ return (c == '%' && is_hexdigit(c2) && is_hexdigit(c3));
+ }
+}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/SharingHelper.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Sync.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Sync.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Sync.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Sync.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,136 @@
+/*
+ * 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.abdera2.ext.sharing;
+
+import java.util.Date;
+import java.util.List;
+
+import org.apache.abdera2.common.anno.QName;
+import org.apache.abdera2.factory.Factory;
+import org.apache.abdera2.model.Element;
+import org.apache.abdera2.model.ExtensibleElementWrapper;
+@QName(value="sync",ns=SharingHelper.SSENS,pfx=SharingHelper.SSEPFX)
+public class Sync extends ExtensibleElementWrapper {
+
+ public Sync(Element internal) {
+ super(internal);
+ }
+
+ public Sync(Factory factory, javax.xml.namespace.QName qname) {
+ super(factory, qname);
+ }
+
+ public String getId() {
+ return getAttributeValue("id");
+ }
+
+ public void setId(String id) {
+ if (id != null) {
+ setAttributeValue("id", id);
+ } else {
+ removeAttribute("id");
+ }
+ }
+
+ public int getUpdates() {
+ String updates = getAttributeValue("updates");
+ return updates != null ? Integer.parseInt(updates) : 0;
+ }
+
+ public void setUpdates(int updates) {
+ if (updates > 0) {
+ setAttributeValue("updates", Integer.toString(updates));
+ } else {
+ removeAttribute("updates");
+ }
+ }
+
+ public void incrementUpdates() {
+ setUpdates(getUpdates() + 1);
+ }
+
+ public boolean isDeleted() {
+ String deleted = getAttributeValue("deleted");
+ return deleted != null ? SharingHelper.isTrue(deleted) : false;
+ }
+
+ public void setDeleted(boolean deleted) {
+ if (deleted) {
+ setAttributeValue("deleted", "true");
+ } else {
+ removeAttribute("deleted");
+ }
+ }
+
+ public boolean isNoConflicts() {
+ String noconflicts = getAttributeValue("noconflicts");
+ return noconflicts != null ? SharingHelper.isTrue(noconflicts) : false;
+ }
+
+ public void setNoConflicts(boolean noconflicts) {
+ if (noconflicts) {
+ setAttributeValue("noconflicts", "true");
+ } else {
+ removeAttribute("noconflicts");
+ }
+ }
+
+ public List<History> getHistory() {
+ return getExtensions(SharingHelper.SSE_HISTORY);
+ }
+
+ public void addHistory(History history) {
+ this.addExtension(history);
+ }
+
+ public History addHistory() {
+ return this.addExtension(SharingHelper.SSE_HISTORY, SharingHelper.SSE_HISTORY);
+ }
+
+ public History addHistory(int sequence, Date when, String by) {
+ History history = addHistory();
+ history.setSequence(sequence);
+ history.setWhen(when);
+ history.setBy(by);
+ return history;
+ }
+
+ public History getTopmostHistory() {
+ return this.getFirstChild(SharingHelper.SSE_HISTORY);
+ }
+
+ public Conflicts getConflicts() {
+ return getConflicts(false);
+ }
+
+ public void setConflicts(Conflicts conflicts) {
+ Conflicts con = getConflicts();
+ if (con != null)
+ con.discard();
+ if (conflicts != null)
+ addExtension(conflicts);
+ }
+
+ public Conflicts getConflicts(boolean create) {
+ Conflicts con = getExtension(SharingHelper.SSE_CONFLICTS);
+ if (con == null && create)
+ con = getFactory().newElement(SharingHelper.SSE_CONFLICTS, this.getInternal());
+ return con;
+ }
+
+}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Sync.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Unpublished.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Unpublished.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Unpublished.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Unpublished.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,48 @@
+/*
+ * 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.abdera2.ext.sharing;
+
+import java.util.List;
+
+
+import org.apache.abdera2.common.Constants;
+import org.apache.abdera2.common.anno.QName;
+import org.apache.abdera2.factory.Factory;
+import org.apache.abdera2.model.Element;
+import org.apache.abdera2.model.Entry;
+import org.apache.abdera2.model.ExtensibleElementWrapper;
+
+@QName(value="unpublished",ns=SharingHelper.SSENS,pfx=SharingHelper.SSEPFX)
+public class Unpublished extends ExtensibleElementWrapper {
+
+ public Unpublished(Element internal) {
+ super(internal);
+ }
+
+ public Unpublished(Factory factory, javax.xml.namespace.QName qname) {
+ super(factory, qname);
+ }
+
+ public List<Entry> getEntries() {
+ return getExtensions(Constants.ENTRY);
+ }
+
+ public void addEntry(Entry entry) {
+ addExtension((Entry)entry.clone());
+ }
+}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/sharing/Unpublished.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/InReplyTo.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/InReplyTo.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/InReplyTo.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/InReplyTo.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,108 @@
+/*
+ * 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.abdera2.ext.thread;
+
+import javax.activation.MimeType;
+
+import org.apache.abdera2.factory.Factory;
+import org.apache.abdera2.model.Element;
+import org.apache.abdera2.model.ElementWrapper;
+import org.apache.abdera2.common.anno.QName;
+import org.apache.abdera2.common.iri.IRI;
+import static org.apache.abdera2.ext.thread.ThreadConstants.*;
+
+@QName(value=LN_INREPLYTO,ns=THR_NS,pfx=THR_PREFIX)
+public class InReplyTo extends ElementWrapper {
+
+ public InReplyTo(Element internal) {
+ super(internal);
+ }
+
+ public InReplyTo(Factory factory) {
+ super(factory, ThreadConstants.IN_REPLY_TO);
+ }
+
+ public IRI getHref() {
+ String href = getAttributeValue("href");
+ return (href != null) ? new IRI(href) : null;
+ }
+
+ public MimeType getMimeType() {
+ try {
+ String type = getAttributeValue("type");
+ return (type != null) ? new MimeType(type) : null;
+ } catch (javax.activation.MimeTypeParseException e) {
+ throw new org.apache.abdera2.common.mediatype.MimeTypeParseException(e);
+ }
+ }
+
+ public IRI getRef() {
+ String ref = getAttributeValue("ref");
+ return (ref != null) ? new IRI(ref) : null;
+ }
+
+ public IRI getResolvedHref() {
+ IRI href = getHref();
+ IRI base = getBaseUri();
+ return (base == null) ? href : (href != null) ? base.resolve(href) : null;
+ }
+
+ public IRI getResolvedSource() {
+ IRI href = getSource();
+ IRI base = getBaseUri();
+ return (base == null) ? href : (href != null) ? base.resolve(href) : null;
+ }
+
+ public IRI getSource() {
+ String source = getAttributeValue("source");
+ return (source != null) ? new IRI(source) : null;
+ }
+
+ public void setHref(IRI ref) {
+ setAttributeValue("href", ref.toString());
+ }
+
+ public void setHref(String ref) {
+ setAttributeValue("href", ref);
+ }
+
+ public void setMimeType(MimeType mimeType) {
+ setAttributeValue("type", mimeType.toString());
+ }
+
+ public void setMimeType(String mimeType) {
+ setAttributeValue("type", mimeType);
+ }
+
+ public void setRef(IRI ref) {
+ setAttributeValue("ref", ref.toString());
+ }
+
+ public void setRef(String ref) {
+ setAttributeValue("ref", ref);
+ }
+
+ public void setSource(IRI source) {
+ setAttributeValue("source", source.toString());
+ }
+
+ public void setSource(String source) {
+ setAttributeValue("source", source);
+ }
+
+}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/InReplyTo.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/ThreadConstants.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/ThreadConstants.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/ThreadConstants.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/ThreadConstants.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,42 @@
+/*
+ * 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.abdera2.ext.thread;
+
+import javax.xml.namespace.QName;
+
+import org.apache.abdera2.common.Constants;
+
+public interface ThreadConstants extends Constants {
+
+ public static final String THR_NS = "http://purl.org/syndication/thread/1.0";
+ public static final String LN_INREPLYTO = "in-reply-to";
+ public static final String LN_REF = "ref";
+ public static final String LN_COUNT = "count";
+ public static final String LN_WHEN = "when";
+ public static final String LN_TOTAL = "total";
+ public static final String THR_PREFIX = "thr";
+ public static final QName IN_REPLY_TO = new QName(THR_NS, LN_INREPLYTO, THR_PREFIX);
+ public static final QName THRCOUNT = new QName(THR_NS, LN_COUNT, THR_PREFIX);
+ /** @deprecated Use Constants.THRUPDATED */
+ public static final QName THRWHEN = new QName(THR_NS, LN_WHEN, THR_PREFIX);
+ public static final QName THRUPDATED = new QName(THR_NS, LN_UPDATED, THR_PREFIX);
+ public static final QName THRTOTAL = new QName(THR_NS, LN_TOTAL, THR_PREFIX);
+ public static final QName THRREF = new QName(LN_REF);
+ public static final QName THRSOURCE = new QName(LN_SOURCE);
+
+}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/ThreadConstants.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/ThreadExtensionFactory.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/ThreadExtensionFactory.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/ThreadExtensionFactory.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/ThreadExtensionFactory.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,30 @@
+/*
+ * 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.abdera2.ext.thread;
+
+import org.apache.abdera2.common.anno.Namespace;
+import org.apache.abdera2.factory.AbstractExtensionFactory;
+import org.apache.abdera2.factory.AbstractExtensionFactory.Impls;
+import org.apache.abdera2.factory.AbstractExtensionFactory.Impl;
+
+@Namespace(ThreadConstants.THR_NS)
+@Impls({
+ @Impl(InReplyTo.class),
+ @Impl(Total.class)
+})
+public final class ThreadExtensionFactory extends AbstractExtensionFactory implements ThreadConstants {}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/ThreadExtensionFactory.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/ThreadHelper.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/ThreadHelper.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/ThreadHelper.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/ThreadHelper.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,169 @@
+/*
+ * 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.abdera2.ext.thread;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import javax.activation.MimeType;
+
+import org.apache.abdera2.factory.Factory;
+import org.apache.abdera2.common.date.DateTime;
+import org.apache.abdera2.model.Entry;
+import org.apache.abdera2.model.Link;
+import org.apache.abdera2.model.Source;
+import org.apache.abdera2.common.iri.IRI;
+
+public final class ThreadHelper {
+
+ ThreadHelper() {
+ }
+
+ public static int getCount(Link link) {
+ String val = link.getAttributeValue(ThreadConstants.THRCOUNT);
+ return (val != null) ? Integer.parseInt(val) : 0;
+ }
+
+ @SuppressWarnings("deprecation")
+ public static DateTime getUpdated(Link link) {
+ String val = link.getAttributeValue(ThreadConstants.THRUPDATED);
+ if (val == null) // thr:when was updated to thr:updated, some old impls may still be using thr:when
+ val = link.getAttributeValue(ThreadConstants.THRWHEN);
+ return (val != null) ? DateTime.valueOf(val) : null;
+ }
+
+ public static void setCount(Link link, int count) {
+ link.setAttributeValue(ThreadConstants.THRCOUNT, String.valueOf(count).trim());
+ }
+
+ public static void setUpdated(Link link, Date when) {
+ link.setAttributeValue(ThreadConstants.THRUPDATED, DateTime.valueOf(when).getValue());
+ }
+
+ public static void setUpdated(Link link, Calendar when) {
+ link.setAttributeValue(ThreadConstants.THRUPDATED, DateTime.valueOf(when).getValue());
+ }
+
+ public static void setUpdated(Link link, long when) {
+ link.setAttributeValue(ThreadConstants.THRUPDATED, DateTime.valueOf(when).getValue());
+ }
+
+ public static void setUpdated(Link link, String when) {
+ link.setAttributeValue(ThreadConstants.THRUPDATED, DateTime.valueOf(when).getValue());
+ }
+
+ public static Total addTotal(Entry entry, int total) {
+ Factory factory = entry.getFactory();
+ Total totalelement = (Total)factory.newExtensionElement(ThreadConstants.THRTOTAL, entry);
+ totalelement.setValue(total);
+ return totalelement;
+ }
+
+ public static Total getTotal(Entry entry) {
+ return entry.getFirstChild(ThreadConstants.THRTOTAL);
+ }
+
+ public static void addInReplyTo(Entry entry, InReplyTo replyTo) {
+ entry.addExtension(replyTo);
+ }
+
+ public static InReplyTo addInReplyTo(Entry entry) {
+ return entry.addExtension(ThreadConstants.IN_REPLY_TO);
+ }
+
+ public static InReplyTo addInReplyTo(Entry entry, Entry ref) {
+ if (ref.equals(entry))
+ return null;
+ InReplyTo irt = addInReplyTo(entry);
+ try {
+ irt.setRef(ref.getId());
+ Link altlink = ref.getAlternateLink();
+ if (altlink != null) {
+ irt.setHref(altlink.getResolvedHref());
+ if (altlink.getMimeType() != null)
+ irt.setMimeType(altlink.getMimeType());
+ }
+ Source src = ref.getSource();
+ if (src != null) {
+ Link selflink = src.getSelfLink();
+ if (selflink != null)
+ irt.setSource(selflink.getResolvedHref());
+ }
+ } catch (Exception e) {
+ }
+ return irt;
+ }
+
+ public static InReplyTo addInReplyTo(Entry entry, IRI ref) {
+ try {
+ if (entry.getId() != null && entry.getId().equals(ref))
+ return null;
+ } catch (Exception e) {
+ }
+ InReplyTo irt = addInReplyTo(entry);
+ irt.setRef(ref);
+ return irt;
+ }
+
+ public static InReplyTo addInReplyTo(Entry entry, String ref) {
+ return addInReplyTo(entry, new IRI(ref));
+ }
+
+ public static InReplyTo addInReplyTo(Entry entry, IRI ref, IRI source, IRI href, MimeType type) {
+ InReplyTo irt = addInReplyTo(entry, ref);
+ if (irt != null) {
+ if (source != null)
+ irt.setSource(source);
+ if (href != null)
+ irt.setHref(href);
+ if (type != null)
+ irt.setMimeType(type);
+ }
+ return irt;
+ }
+
+ public static InReplyTo addInReplyTo(Entry entry, String ref, String source, String href, String type) {
+ InReplyTo irt = addInReplyTo(entry, ref);
+ if (irt != null) {
+ if (source != null)
+ irt.setSource(source);
+ if (href != null)
+ irt.setHref(href);
+ if (type != null)
+ irt.setMimeType(type);
+ }
+ return irt;
+ }
+
+ public static InReplyTo getInReplyTo(Entry entry) {
+ return entry.getFirstChild(ThreadConstants.IN_REPLY_TO);
+ }
+
+ public static Iterable<InReplyTo> getInReplyTos(Entry entry) {
+ return entry.getExtensions(ThreadConstants.IN_REPLY_TO);
+ }
+
+ public static InReplyTo newInReplyTo(Factory factory) {
+ return new InReplyTo(factory);
+ }
+
+ public static Total newTotal(Factory factory) {
+ return new Total(factory);
+ }
+
+}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/ThreadHelper.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/Total.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/Total.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/Total.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/Total.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,46 @@
+/*
+ * 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.abdera2.ext.thread;
+
+import org.apache.abdera2.common.anno.QName;
+import org.apache.abdera2.factory.Factory;
+import org.apache.abdera2.model.Element;
+import org.apache.abdera2.model.ElementWrapper;
+import static org.apache.abdera2.ext.thread.ThreadConstants.*;
+
+@QName(value=LN_TOTAL,ns=THR_NS,pfx=THR_PREFIX)
+public class Total extends ElementWrapper {
+
+ public Total(Element internal) {
+ super(internal);
+ }
+
+ public Total(Factory factory) {
+ super(factory, ThreadConstants.THRTOTAL);
+ }
+
+ public int getValue() {
+ String val = getText();
+ return (val != null) ? Integer.parseInt(val) : -1;
+ }
+
+ public void setValue(int value) {
+ setText(String.valueOf(value));
+ }
+
+}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/Total.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/tombstones/Tombstone.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/tombstones/Tombstone.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/tombstones/Tombstone.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/tombstones/Tombstone.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,138 @@
+/*
+ * 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.abdera2.ext.tombstones;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import org.apache.abdera2.factory.Factory;
+import org.apache.abdera2.common.iri.IRI;
+import org.apache.abdera2.common.anno.QName;
+import org.apache.abdera2.common.date.DateTime;
+import org.apache.abdera2.model.Element;
+import org.apache.abdera2.model.ExtensibleElementWrapper;
+import org.apache.abdera2.model.Person;
+import org.apache.abdera2.model.Text;
+
+@QName(value="deleted-entry",ns=TombstonesHelper.TNS)
+public class Tombstone extends ExtensibleElementWrapper {
+
+ public Tombstone(Element internal) {
+ super(internal);
+ }
+
+ public Tombstone(Factory factory) {
+ super(factory, TombstonesHelper.DELETED_ENTRY);
+ }
+
+ public String getRef() {
+ return getAttributeValue("ref");
+ }
+
+ public Tombstone setRef(String id) {
+ if (id != null) {
+ setAttributeValue("ref", id);
+ } else {
+ removeAttribute("ref");
+ }
+ return this;
+ }
+
+ public Tombstone setRef(IRI id) {
+ return setRef(id.toString());
+ }
+
+ public Date getWhen() {
+ String v = getAttributeValue("when");
+ return v != null ? DateTime.parse(v) : null;
+ }
+
+ public Tombstone setWhen(Date date) {
+ return setWhen(DateTime.format(date));
+ }
+
+ public Tombstone setWhen(String date) {
+ if (date != null) {
+ setAttributeValue("when", date);
+ } else {
+ removeAttribute("when");
+ }
+ return this;
+ }
+
+ public Tombstone setWhen(long date) {
+ return setWhen(DateTime.valueOf(date));
+ }
+
+ public Tombstone setWhen(Calendar date) {
+ return setWhen(DateTime.valueOf(date));
+ }
+
+ public Tombstone setWhen(DateTime date) {
+ return setWhen(date.toString());
+ }
+
+ public Person getBy() {
+ return getExtension(TombstonesHelper.BY);
+ }
+
+ public Tombstone setBy(Person person) {
+ if (getBy() != null)
+ getBy().discard();
+ addExtension(person);
+ return this;
+ }
+
+ public Person setBy(String name) {
+ return setBy(name, null, null);
+ }
+
+ public Person setBy(String name, String email, String uri) {
+ if (name != null) {
+ Person person = getFactory().newPerson(TombstonesHelper.BY, this);
+ person.setName(name);
+ person.setEmail(email);
+ person.setUri(uri);
+ return person;
+ } else {
+ if (getBy() != null)
+ getBy().discard();
+ return null;
+ }
+ }
+
+ public Text getComment() {
+ return getExtension(TombstonesHelper.COMMENT);
+ }
+
+ public Text setComment(String comment) {
+ return setComment(Text.Type.TEXT, comment);
+ }
+
+ public Text setComment(Text.Type type, String comment) {
+ if (comment != null) {
+ Text text = getFactory().newText(TombstonesHelper.COMMENT, type, this);
+ text.setValue(comment);
+ return text;
+ } else {
+ if (getComment() != null)
+ getComment().discard();
+ return null;
+ }
+ }
+}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/tombstones/Tombstone.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/tombstones/TombstonesExtensionFactory.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/tombstones/TombstonesExtensionFactory.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/tombstones/TombstonesExtensionFactory.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/tombstones/TombstonesExtensionFactory.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,27 @@
+/*
+ * 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.abdera2.ext.tombstones;
+
+import org.apache.abdera2.common.anno.Namespace;
+import org.apache.abdera2.factory.AbstractExtensionFactory;
+import org.apache.abdera2.factory.AbstractExtensionFactory.Impls;
+import org.apache.abdera2.factory.AbstractExtensionFactory.Impl;
+
+@Namespace(TombstonesHelper.TNS)
+@Impls({@Impl(Tombstone.class)})
+public final class TombstonesExtensionFactory extends AbstractExtensionFactory {}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/tombstones/TombstonesExtensionFactory.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/tombstones/TombstonesHelper.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/tombstones/TombstonesHelper.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/tombstones/TombstonesHelper.java (added)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/tombstones/TombstonesHelper.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,147 @@
+/*
+ * 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.abdera2.ext.tombstones;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import javax.xml.namespace.QName;
+
+import org.apache.abdera2.common.date.DateTime;
+import org.apache.abdera2.model.Base;
+import org.apache.abdera2.model.Entry;
+import org.apache.abdera2.model.Feed;
+
+/**
+ * Note this is an experimental implementation of the Tombstones specification. The tombstone spec is a work-in-progress
+ * and will continue to evolve. This extension should only be used for experimentation or prototype development.
+ * http://www.ietf.org/internet-drafts/draft-snell-atompub-tombstones-04.txt
+ */
+public class TombstonesHelper {
+
+ public static final String TNS = "http://purl.org/atompub/tombstones/1.0";
+
+ public static final QName DELETED_ENTRY = new QName(TNS, "deleted-entry");
+ public static final QName BY = new QName(TNS, "by");
+ public static final QName COMMENT = new QName(TNS, "comment");
+
+ public static Iterable<Tombstone> getTombstones(Feed source) {
+ return source.getExtensions(DELETED_ENTRY);
+ }
+
+ public static void addTombstone(Feed source, Tombstone tombstone) {
+ source.addExtension(tombstone);
+ }
+
+ public static Tombstone addTombstone(Feed source, Entry entry) {
+ Tombstone tombstone = source.getFactory().newExtensionElement(DELETED_ENTRY, source);
+ tombstone.setRef(entry.getId());
+ Base parent = entry.getParentElement();
+ if (parent != null && parent.equals(source))
+ entry.discard();
+ return tombstone;
+ }
+
+ public static Tombstone addTombstone(Feed source, Entry entry, Date when, String by, String comment) {
+ Tombstone ts = addTombstone(source, entry);
+ ts.setWhen(when);
+ ts.setBy(by);
+ ts.setComment(comment);
+ return ts;
+ }
+
+ public static Tombstone addTombstone(Feed source, Entry entry, String when, String by, String comment) {
+ Tombstone ts = addTombstone(source, entry);
+ ts.setWhen(when);
+ return ts;
+ }
+
+ public static Tombstone addTombstone(Feed source, Entry entry, Calendar when, String by, String comment) {
+ Tombstone ts = addTombstone(source, entry);
+ ts.setWhen(when);
+ ts.setBy(by);
+ ts.setComment(comment);
+ return ts;
+ }
+
+ public static Tombstone addTombstone(Feed source, Entry entry, long when, String by, String comment) {
+ Tombstone ts = addTombstone(source, entry);
+ ts.setWhen(when);
+ ts.setBy(by);
+ ts.setComment(comment);
+ return ts;
+ }
+
+ public static Tombstone addTombstone(Feed source, Entry entry, DateTime when, String by, String comment) {
+ Tombstone ts = addTombstone(source, entry);
+ ts.setWhen(when);
+ ts.setBy(by);
+ ts.setComment(comment);
+ return ts;
+
+ }
+
+ public static boolean hasTombstones(Feed source) {
+ return source.getExtension(DELETED_ENTRY) != null;
+ }
+
+ public static Tombstone addTombstone(Feed source, String id) {
+ Tombstone tombstone = source.getFactory().newExtensionElement(DELETED_ENTRY);
+ tombstone.setRef(id);
+ return tombstone;
+ }
+
+ public static Tombstone addTombstone(Feed source, String id, Date when, String by, String comment) {
+ Tombstone ts = addTombstone(source, id);
+ ts.setWhen(when);
+ ts.setBy(by);
+ ts.setComment(comment);
+ return ts;
+ }
+
+ public static Tombstone addTombstone(Feed source, String id, String when, String by, String comment) {
+ Tombstone ts = addTombstone(source, id);
+ ts.setWhen(when);
+ return ts;
+ }
+
+ public static Tombstone addTombstone(Feed source, String id, Calendar when, String by, String comment) {
+ Tombstone ts = addTombstone(source, id);
+ ts.setWhen(when);
+ ts.setBy(by);
+ ts.setComment(comment);
+ return ts;
+ }
+
+ public static Tombstone addTombstone(Feed source, String id, long when, String by, String comment) {
+ Tombstone ts = addTombstone(source, id);
+ ts.setWhen(when);
+ ts.setBy(by);
+ ts.setComment(comment);
+ return ts;
+ }
+
+ public static Tombstone addTombstone(Feed source, String id, DateTime when, String by, String comment) {
+ Tombstone ts = addTombstone(source, id);
+ ts.setWhen(when);
+ ts.setBy(by);
+ ts.setComment(comment);
+ return ts;
+ }
+
+}
Propchange: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/tombstones/TombstonesHelper.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/resources/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/resources/META-INF/MANIFEST.MF?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/resources/META-INF/MANIFEST.MF (added)
+++ abdera/abdera2/ext/src/main/resources/META-INF/MANIFEST.MF Tue Sep 20 15:56:46 2011
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path:
+
Propchange: abdera/abdera2/ext/src/main/resources/META-INF/MANIFEST.MF
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: abdera/abdera2/ext/src/main/resources/META-INF/services/org.apache.abdera2.factory.ExtensionFactory
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/resources/META-INF/services/org.apache.abdera2.factory.ExtensionFactory?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/resources/META-INF/services/org.apache.abdera2.factory.ExtensionFactory (added)
+++ abdera/abdera2/ext/src/main/resources/META-INF/services/org.apache.abdera2.factory.ExtensionFactory Tue Sep 20 15:56:46 2011
@@ -0,0 +1,7 @@
+org.apache.abdera2.ext.thread.ThreadExtensionFactory
+org.apache.abdera2.ext.features.FeaturesExtensionFactory
+org.apache.abdera2.ext.tombstones.TombstonesExtensionFactory
+org.apache.abdera2.ext.media.MediaExtensionFactory
+org.apache.abdera2.ext.opensearch.model.OpenSearchExtensionFactory
+org.apache.abdera2.ext.sharing.SharingExtensionFactory
+org.apache.abdera2.ext.rss.RssExtensionFactory
\ No newline at end of file
Added: abdera/abdera2/ext/src/main/resources/META-INF/services/org.apache.abdera2.parser.Parser
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/resources/META-INF/services/org.apache.abdera2.parser.Parser?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/resources/META-INF/services/org.apache.abdera2.parser.Parser (added)
+++ abdera/abdera2/ext/src/main/resources/META-INF/services/org.apache.abdera2.parser.Parser Tue Sep 20 15:56:46 2011
@@ -0,0 +1 @@
+org.apache.abdera2.ext.html.HtmlParser
\ No newline at end of file
Added: abdera/abdera2/ext/src/main/resources/META-INF/services/org.apache.abdera2.writer.Writer
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/resources/META-INF/services/org.apache.abdera2.writer.Writer?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/ext/src/main/resources/META-INF/services/org.apache.abdera2.writer.Writer (added)
+++ abdera/abdera2/ext/src/main/resources/META-INF/services/org.apache.abdera2.writer.Writer Tue Sep 20 15:56:46 2011
@@ -0,0 +1 @@
+org.apache.abdera2.ext.json.JSONWriter
\ No newline at end of file