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/28 22:26:05 UTC
svn commit: r616050 [1/3] - in
/incubator/abdera/java/trunk/extensions/converters: ./
src/main/java/org/apache/abdera/converter/
src/main/java/org/apache/abdera/ext/
src/main/java/org/apache/abdera/ext/serializer/
src/main/java/org/apache/abdera/ext/se...
Author: jmsnell
Date: Mon Jan 28 13:26:00 2008
New Revision: 616050
URL: http://svn.apache.org/viewvc?rev=616050&view=rev
Log:
Reworking the annotation-based converter framework around the StreamWriter interface.
This includes an ObjectResponseContext class that will allow a conforming java-bean to be returned by a server impl and automatically serialized into an Atom document.
This is highly experimental and needs to be fully debugged. Expect changes
Added:
incubator/abdera/java/trunk/extensions/converters/pom.xml
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/AbstractConventions.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/AbstractSerializationContext.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/ConventionSerializationContext.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/Conventions.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/DefaultConventions.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/DefaultSerializationContext.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/ObjectContext.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/ObjectResponseContext.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/SerializationContext.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/SerializationException.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/Serializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/SerializerProvider.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Accept.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Attribute.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Author.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/BaseURI.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Categories.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Category.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Collection.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Content.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Contributor.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Control.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Convention.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/DateTime.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Draft.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Edited.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Email.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/EntityTag.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Entry.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Extension.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Feed.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Generator.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/HrefLanguage.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/ID.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/IRI.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Icon.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Label.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Language.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/LastModified.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Length.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Link.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Logo.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/MediaType.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Person.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Published.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Rel.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Rights.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Scheme.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Serializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Service.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Source.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Src.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Subtitle.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Summary.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Text.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Title.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/URI.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Updated.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Value.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Version.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Workspace.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/CategoriesSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/CategorySerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/CollectionSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/ContentSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/ControlSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/DateTimeSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/ElementSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/EntrySerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/ExtensionSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/FOMSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/FeedSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/GeneratorSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/IRISerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/LinkSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/PersonSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/ServiceSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/SimpleElementSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/SourceSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/TextSerializer.java
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/impl/WorkspaceSerializer.java
Removed:
incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/converter/
Added: incubator/abdera/java/trunk/extensions/converters/pom.xml
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/pom.xml?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/pom.xml (added)
+++ incubator/abdera/java/trunk/extensions/converters/pom.xml Mon Jan 28 13:26:00 2008
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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. -->
+<project
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.abdera</groupId>
+ <artifactId>abdera</artifactId>
+ <version>0.4.0-incubating-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>abdera-extensions-serializer</artifactId>
+ <packaging>jar</packaging>
+ <name>Abdera Extensions - Serializer</name>
+ <version>0.4.0-incubating-SNAPSHOT</version>
+ <description>Atom Specification Extensions - Serializer</description>
+ <inceptionYear>2006</inceptionYear>
+ <url>http://incubator.apache.org/abdera</url>
+ <scm>
+ <connection>scm:svn:http://svn.apache.org/repos/asf/incubator/abdera/java/trunk/extensions/serializer</connection>
+ <developerConnection>scm:svn:https://svn.apache.org/repos/asf/incubator/abdera/java/trunk/extensions/serializer</developerConnection>
+ <url>http://svn.apache.org/repos/asf/incubator/abdera/java/trunk/extensions/serializer</url>
+ </scm>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.abdera</groupId>
+ <artifactId>abdera-core</artifactId>
+ <version>0.4.0-incubating-SNAPSHOT</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.abdera</groupId>
+ <artifactId>abdera-parser</artifactId>
+ <version>0.4.0-incubating-SNAPSHOT</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.abdera</groupId>
+ <artifactId>abdera-protocol</artifactId>
+ <version>0.4.0-incubating-SNAPSHOT</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.abdera</groupId>
+ <artifactId>abdera-server</artifactId>
+ <version>0.4.0-incubating-SNAPSHOT</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.ws.commons.axiom</groupId>
+ <artifactId>axiom-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.ws.commons.axiom</groupId>
+ <artifactId>axiom-impl</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>stax</groupId>
+ <artifactId>stax-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.woodstox</groupId>
+ <artifactId>wstx-asl</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </dependency>
+ </dependencies>
+</project>
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/AbstractConventions.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/AbstractConventions.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/AbstractConventions.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/AbstractConventions.java Mon Jan 28 13:26:00 2008
@@ -0,0 +1,129 @@
+/*
+* 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.serializer;
+
+import java.io.Serializable;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Member;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import org.apache.abdera.ext.serializer.annotation.Convention;
+
+public abstract class AbstractConventions
+ implements Conventions,
+ Cloneable,
+ Serializable {
+
+ private final Map<Class<? extends Annotation>,Pattern> conventions =
+ new HashMap<Class<? extends Annotation>,Pattern>();
+ private final boolean isCaseSensitive;
+
+ protected AbstractConventions() {
+ this(false);
+ }
+
+ protected AbstractConventions(boolean isCaseSensitive) {
+ this.isCaseSensitive = isCaseSensitive;
+ }
+
+ public Iterator<Class<? extends Annotation>> iterator() {
+ return conventions.keySet().iterator();
+ }
+
+ public void setConvention(
+ String pattern,
+ Class<? extends Annotation> annotationType) {
+ Pattern regex =
+ isCaseSensitive ?
+ Pattern.compile(pattern) :
+ Pattern.compile(pattern,Pattern.CASE_INSENSITIVE);
+ conventions.put(annotationType, regex);
+ }
+
+ public void setConvention(
+ Class<? extends Annotation> annotationType) {
+ Convention conv = annotationType.getAnnotation(Convention.class);
+ if (conv == null)
+ throw new IllegalArgumentException(
+ "No Convention Annotation [" + annotationType + "]");
+ setConvention(conv.value(),annotationType);
+ }
+
+ public Class<? extends Annotation> matchConvention(
+ AccessibleObject accessor) {
+ return matchConvention(accessor, null);
+ }
+
+ public Class<? extends Annotation> matchConvention(
+ AccessibleObject accessor,
+ Class<? extends Annotation> expect) {
+ if (accessor == null) return null;
+ String name = ((Member)accessor).getName();
+ for (Map.Entry<Class<? extends Annotation>, Pattern> entry : conventions.entrySet()) {
+ if (entry.getValue().matcher(name).matches() &&
+ (expect == null || expect == entry.getKey()))
+ return entry.getKey();
+ }
+ return null;
+ }
+
+ public boolean isMatch(
+ AccessibleObject accessor,
+ Class<? extends Annotation> expect) {
+ return matchConvention(accessor,expect) != null;
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = PRIME * result + ((conventions == null) ? 0 : conventions.hashCode());
+ result = PRIME * result + (isCaseSensitive ? 1231 : 1237);
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null) return false;
+ if (getClass() != obj.getClass()) return false;
+ final AbstractConventions other = (AbstractConventions) obj;
+ if (conventions == null) {
+ if (other.conventions != null) return false;
+ } else if (!conventions.equals(other.conventions)) return false;
+ if (isCaseSensitive != other.isCaseSensitive) return false;
+ return true;
+ }
+
+ public Conventions clone() {
+ try {
+ return (Conventions)super.clone();
+ } catch (CloneNotSupportedException e) {
+ return copy();
+ }
+ }
+
+ protected Conventions copy() {
+ throw new SerializationException(
+ new CloneNotSupportedException());
+ }
+}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/AbstractSerializationContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/AbstractSerializationContext.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/AbstractSerializationContext.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/AbstractSerializationContext.java Mon Jan 28 13:26:00 2008
@@ -0,0 +1,170 @@
+/*
+* 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.serializer;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.ext.serializer.impl.FOMSerializer;
+import org.apache.abdera.model.Element;
+import org.apache.abdera.writer.StreamWriter;
+
+@SuppressWarnings("unchecked")
+public abstract class AbstractSerializationContext
+ implements SerializationContext {
+
+ private final Abdera abdera;
+ private final StreamWriter streamWriter;
+ private final Map<Class,Serializer> serializers =
+ new HashMap<Class,Serializer>();
+
+ protected AbstractSerializationContext(
+ StreamWriter streamWriter) {
+ this(new Abdera(), streamWriter);
+ }
+
+ protected AbstractSerializationContext(
+ Abdera abdera,
+ StreamWriter streamWriter) {
+ this.abdera = abdera;
+ this.streamWriter = streamWriter;
+ setSerializer(Element.class, new FOMSerializer());
+ }
+
+ public StreamWriter getStreamWriter() {
+ return this.streamWriter;
+ }
+
+ public Abdera getAbdera() {
+ return abdera;
+ }
+
+ public Serializer getSerializer(ObjectContext objectContext) {
+ try {
+ Class type = objectContext.getObjectType();
+ Serializer serializer = serializers.get(type);
+ if (serializer == null) serializer = objectContext.getSerializer();
+ if (serializer == null) {
+ for (Annotation annotation : objectContext.getAnnotations()) {
+ serializer = serializers.get(annotation.annotationType());
+ if (serializer != null) return serializer;
+ }
+ }
+ if (serializer == null && !type.isAnnotation()) {
+ for (Class knownType : serializers.keySet()) {
+ if (!knownType.isAnnotation() &&
+ knownType.isAssignableFrom(type)) {
+ return serializers.get(knownType);
+ }
+ }
+ }
+ return serializer;
+ } catch (Throwable t) {
+ throw new SerializationException(t);
+ }
+ }
+
+ public boolean hasSerializer(ObjectContext objectContext) {
+ return getSerializer(objectContext) != null;
+ }
+
+ public boolean hasSerializer(Object object) {
+ return hasSerializer(new ObjectContext(object));
+ }
+
+ public boolean hasSerializer(
+ Object object,
+ Object parent,
+ AccessibleObject accessor) {
+ return hasSerializer(new ObjectContext(object,parent,accessor));
+ }
+
+ public boolean hasSerializer(Class<?> type) {
+ if (serializers.containsKey(type)) return true;
+ if (!type.isAnnotation()) {
+ for (Class<?> t : serializers.keySet()) {
+ if (!t.isAnnotation() &&
+ t.isAssignableFrom(type)) return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean hasSerializer(AccessibleObject accessor) {
+ Class<? extends Object> returnType = getReturnType(accessor);
+ org.apache.abdera.ext.serializer.annotation.Serializer serializer =
+ accessor.getAnnotation(org.apache.abdera.ext.serializer.annotation.Serializer.class);
+ if (serializer != null && hasSerializer(serializer.value())) return true;
+ if (returnType != null && hasSerializer(returnType)) return true;
+ return false;
+ }
+
+ public void setSerializer(Class type, Serializer Serializer) {
+ serializers.put(type, Serializer);
+ }
+
+ public void serialize(Object object) {
+ serialize(object,new ObjectContext(object));
+ }
+
+ public void serialize(Object object, ObjectContext objectContext) {
+ if (objectContext == null) objectContext = new ObjectContext(object);
+ Serializer serializer = getSerializer(objectContext);
+ if (serializer != null)
+ serialize(object,objectContext,serializer);
+ else
+ throw new SerializationException(
+ "No Serializer available for " +
+ objectContext.getObjectType());
+ }
+
+ public void serialize(Object object, Serializer serializer) {
+ serialize(object,new ObjectContext(object),serializer);
+ }
+
+ public void serialize(
+ Object object,
+ ObjectContext objectContext,
+ Serializer serializer) {
+ if (objectContext == null) objectContext = new ObjectContext(object);
+ Serializer overrideSerializer = getSerializer(objectContext);
+ if (overrideSerializer != null) serializer = overrideSerializer;
+ if (serializer != null) {
+ serializer.serialize(object, objectContext, this);
+ } else {
+ throw new SerializationException(
+ "No Serializer available for " +
+ objectContext.getObjectType());
+ }
+ }
+
+ public static Class<? extends Object> getReturnType(
+ AccessibleObject accessor) {
+ if (accessor instanceof Field)
+ return ((Field)accessor).getType();
+ else if (accessor instanceof Method)
+ return ((Method)accessor).getReturnType();
+ else return null;
+ }
+
+}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java Mon Jan 28 13:26:00 2008
@@ -0,0 +1,365 @@
+/*
+* 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.serializer;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
+import org.apache.abdera.ext.serializer.annotation.Attribute;
+import org.apache.abdera.ext.serializer.annotation.BaseURI;
+import org.apache.abdera.ext.serializer.annotation.Extension;
+import org.apache.abdera.ext.serializer.annotation.Language;
+import org.apache.abdera.ext.serializer.annotation.Value;
+import org.apache.abdera.ext.serializer.impl.ExtensionSerializer;
+import org.apache.abdera.ext.serializer.impl.SimpleElementSerializer;
+import org.apache.abdera.i18n.rfc4646.Lang;
+import org.apache.abdera.writer.StreamWriter;
+
+@SuppressWarnings("unchecked")
+public abstract class BaseSerializer
+ extends Serializer {
+
+ public static final String DEFAULT = "##default";
+
+ protected abstract void init(
+ Object source,
+ ObjectContext objectContext,
+ SerializationContext context,
+ Conventions conventions);
+
+ protected abstract void finish(
+ Object source,
+ ObjectContext objectContext,
+ SerializationContext context,
+ Conventions conventions);
+
+ protected void process(
+ Object source,
+ ObjectContext objectContext,
+ SerializationContext context,
+ Conventions conventions) {
+ }
+
+ public void serialize(
+ Object source,
+ ObjectContext objectContext,
+ SerializationContext context) {
+ Conventions conventions =
+ ((ConventionSerializationContext)context)
+ .getConventions();
+ init(
+ source,
+ objectContext,
+ context,
+ conventions);
+ process(source, objectContext, context, conventions);
+ finish(
+ source,
+ objectContext,
+ context,
+ conventions);
+ }
+
+ protected void writeTextValue(
+ Object source,
+ ObjectContext objectContext,
+ SerializationContext context,
+ Conventions conventions) {
+ AccessibleObject accessor =
+ objectContext.getAccessor(
+ Value.class,
+ conventions);
+ Object value = null;
+ if (accessor != null) {
+ value = eval(accessor, source);
+ }
+ context.getStreamWriter()
+ .writeElementText(
+ value != null ?
+ toString(value) :
+ toString(source));
+ }
+
+ protected void writeExtensions(
+ Object source,
+ ObjectContext objectContext,
+ SerializationContext context,
+ Conventions conventions) {
+ AccessibleObject[] accessors = objectContext.getAccessors(Extension.class, conventions);
+ for (AccessibleObject accessor : accessors) {
+ Object value = eval(accessor,source);
+ ObjectContext valueContext = new ObjectContext(value,source,accessor);
+ Extension extension = valueContext.getAnnotation(Extension.class);
+ boolean simple = extension != null ? extension.simple() : false;
+ Serializer ser = context.getSerializer(valueContext);
+ if (ser == null) {
+ if (simple) {
+ QName qname = getQName(accessor);
+ ser = new SimpleElementSerializer(qname);
+ } else {
+ ser = context.getSerializer(valueContext);
+ if (ser == null) {
+ QName qname = getQName(accessor);
+ ser = new ExtensionSerializer(qname);
+ }
+ }
+ }
+ ser.serialize(value, valueContext, context);
+ }
+ }
+
+ protected void writeAttributes(
+ Object source,
+ ObjectContext objectContext,
+ SerializationContext context,
+ Conventions conventions) {
+ writeCommon(source, objectContext, context, conventions);
+ StreamWriter sw = context.getStreamWriter();
+ AccessibleObject[] accessors = objectContext.getAccessors(Attribute.class, conventions);
+ for (AccessibleObject accessor : accessors) {
+ QName qname = getQName(accessor);
+ Object value = eval(accessor, source);
+ if (value != null)
+ sw.writeAttribute(qname, toString(value));
+ }
+ }
+
+ protected boolean writeElement(
+ Class<? extends Annotation> annotation,
+ Serializer serializer,
+ Object source,
+ ObjectContext objectContext,
+ SerializationContext context,
+ Conventions conventions) {
+ AccessibleObject accessor = objectContext.getAccessor(annotation, conventions);
+ if (accessor != null) {
+ Object value = eval(accessor, source);
+ ObjectContext valueContext = new ObjectContext(value,source,accessor);
+ serializer.serialize(value, valueContext, context);
+ return true;
+ }
+ return false;
+ }
+
+ protected void writeElements(
+ Class<? extends Annotation> annotation,
+ Serializer serializer,
+ Object source,
+ ObjectContext objectContext,
+ SerializationContext context,
+ Conventions conventions) {
+ AccessibleObject[] accessors = objectContext.getAccessors(annotation, conventions);
+ for (AccessibleObject accessor : accessors) {
+ if (accessor != null) {
+ Object value = eval(accessor, source);
+ Object[] values = toArray(value);
+ for (Object val : values) {
+ ObjectContext valueContext = new ObjectContext(val,source,accessor);
+ serializer.serialize(val, valueContext, context);
+ }
+ }
+ }
+ }
+
+ public static Object eval(AccessibleObject accessor, Object parent) {
+ try {
+ if (accessor instanceof Field)
+ return ((Field)accessor).get(parent);
+ else if (accessor instanceof Method)
+ return ((Method)accessor).invoke(parent, new Object[0]);
+ else return null;
+ } catch (Throwable t) {
+ throw new SerializationException(t);
+ }
+ }
+
+ protected boolean hasAnnotation(
+ AnnotatedElement item,
+ Class<? extends Annotation> annotation) {
+ return item.isAnnotationPresent(annotation);
+ }
+
+ protected void writeElement(StreamWriter sw, QName qname, String value) {
+ sw.startElement(qname)
+ .writeElementText(value)
+ .endElement();
+ }
+
+ public static String toString(Object value) {
+ if (value == null) return null;
+ Object[] values = toArray(value);
+ StringBuilder buf = new StringBuilder();
+ for (int n= 0; n < values.length; n++) {
+ if (n > 0) buf.append(", ");
+ buf.append(values[n].toString());
+ }
+ return buf.toString();
+ }
+
+ public static Object[] toArray(Object value) {
+ if (value == null) return new Object[0];
+ if (value.getClass().isArray()) {
+ return (Object[])value;
+ } else if (value instanceof Collection) {
+ return ((Collection)value).toArray();
+ } else if (value instanceof Map) {
+ return ((Map)value).values().toArray();
+ } else if (value instanceof Dictionary) {
+ List<Object> list = new ArrayList<Object>();
+ Enumeration e = ((Dictionary)value).elements();
+ while(e.hasMoreElements()) list.add(e.nextElement());
+ return list.toArray();
+ } else if (value instanceof Iterator) {
+ List<Object> list = new ArrayList<Object>();
+ Iterator i = (Iterator) value;
+ while(i.hasNext()) list.add(i.next());
+ return list.toArray();
+ } else if (value instanceof Enumeration) {
+ List<Object> list = new ArrayList<Object>();
+ Enumeration e = (Enumeration) value;
+ while(e.hasMoreElements()) list.add(e.nextElement());
+ return list.toArray();
+ } else if (value instanceof Iterable) {
+ List<Object> list = new ArrayList<Object>();
+ Iterable v = (Iterable) value;
+ Iterator i = v.iterator();
+ while(i.hasNext()) list.add(i.next());
+ return list.toArray();
+ } else {
+ return new Object[] {value};
+ }
+ }
+
+ protected static boolean isUndefined(String value) {
+ return value == null || DEFAULT.equals(value);
+ }
+
+ protected static QName getQName(AccessibleObject accessor) {
+ Extension ext = accessor.getAnnotation(Extension.class);
+ if (ext != null) return getQName(ext);
+ Attribute attr = accessor.getAnnotation(Attribute.class);
+ if (attr != null) return getQName(attr);
+ return new QName(
+ accessor instanceof Method ?
+ ((Method)accessor).getName() :
+ ((Field)accessor).getName());
+ }
+
+ protected static QName getQName(
+ Extension extension) {
+ QName qname = null;
+ if (extension != null) {
+ if (isUndefined(extension.prefix()) &&
+ isUndefined(extension.ns()) &&
+ isUndefined(extension.name())) {
+ qname = new QName(
+ extension.ns(),
+ extension.name(),
+ extension.prefix());
+ } else if (
+ isUndefined(extension.prefix()) &&
+ !isUndefined(extension.ns()) &&
+ !isUndefined(extension.name())) {
+ qname = new QName(
+ extension.ns(),
+ extension.name());
+ } else if (!isUndefined(extension.name())) {
+ qname = new QName(extension.name());
+ }
+ }
+ return qname;
+ }
+
+ protected static QName getQName(
+ Attribute attribute) {
+ QName qname = null;
+ if (attribute != null) {
+ if (isUndefined(attribute.prefix()) &&
+ isUndefined(attribute.ns()) &&
+ isUndefined(attribute.name())) {
+ qname = new QName(
+ attribute.ns(),
+ attribute.name(),
+ attribute.prefix());
+ } else if (
+ isUndefined(attribute.prefix()) &&
+ !isUndefined(attribute.ns()) &&
+ !isUndefined(attribute.name())) {
+ qname = new QName(
+ attribute.ns(),
+ attribute.name());
+ } else if (!isUndefined(attribute.name())) {
+ qname = new QName(attribute.name());
+ }
+ }
+ return qname;
+ }
+
+ @SuppressWarnings("deprecation")
+ protected void writeCommon(
+ Object source,
+ ObjectContext objectContext,
+ SerializationContext context,
+ Conventions conventions) {
+ StreamWriter sw = context.getStreamWriter();
+ String lang = null;
+ AccessibleObject accessor = objectContext.getAccessor(Language.class, conventions);
+ if (accessor != null) {
+ Object value = eval(accessor, source);
+ if (value != null) {
+ if (value instanceof Lang ||
+ value instanceof org.apache.abdera.i18n.lang.Lang) {
+ lang = value.toString();
+ } else {
+ lang = toString(value);
+ }
+ }
+ }
+ if (lang == null) {
+ Language _lang = objectContext.getAnnotation(Language.class);
+ if (_lang != null && !_lang.value().equals(DEFAULT)) {
+ lang = _lang.value();
+ }
+ }
+ if (lang != null)
+ sw.writeLanguage(lang);
+
+
+ String base = null;
+ accessor = objectContext.getAccessor(BaseURI.class, conventions);
+ if (accessor != null) {
+ Object value = eval(accessor, source);
+ if (value != null)
+ base = toString(value);
+ }
+ if (base != null)
+ sw.writeBase(base);
+ }
+}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/ConventionSerializationContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/ConventionSerializationContext.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/ConventionSerializationContext.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/ConventionSerializationContext.java Mon Jan 28 13:26:00 2008
@@ -0,0 +1,91 @@
+/*
+* 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.serializer;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AccessibleObject;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.writer.StreamWriter;
+
+public class ConventionSerializationContext
+ extends DefaultSerializationContext {
+
+ private static final long serialVersionUID = 7504071837124132972L;
+
+ protected Conventions conventions;
+
+ public ConventionSerializationContext(StreamWriter streamWriter) {
+ this(new Abdera(),streamWriter);
+ }
+
+ public ConventionSerializationContext(
+ Conventions conventions,
+ StreamWriter streamWriter) {
+ this(null,conventions,streamWriter);
+ }
+
+ public ConventionSerializationContext(
+ Abdera abdera,
+ StreamWriter streamWriter) {
+ super(abdera,streamWriter);
+ this.conventions = new DefaultConventions();
+ initSerializers();
+ }
+
+ public ConventionSerializationContext(
+ Abdera abdera,
+ Conventions conventions,
+ StreamWriter streamWriter) {
+ super(abdera,streamWriter);
+ this.conventions = conventions;
+ initSerializers();
+ }
+
+ public Conventions getConventions() {
+ return conventions;
+ }
+
+ public void setConventions(Conventions conventions) {
+ this.conventions = conventions;
+ }
+
+ public boolean hasSerializer(AccessibleObject accessor) {
+ boolean answer = super.hasSerializer(accessor);
+ if (answer) return true;
+ Class<? extends Annotation> annotation =
+ getConventions().matchConvention(accessor);
+ return annotation != null && hasSerializer(annotation);
+ }
+
+ private <T>void initSerializers() {
+ for (Class<? extends Annotation> type : conventions) {
+ org.apache.abdera.ext.serializer.annotation.Serializer serializer =
+ type.getAnnotation(org.apache.abdera.ext.serializer.annotation.Serializer.class);
+ if (serializer != null) {
+ try {
+ Serializer ser = serializer.value().newInstance();
+ this.setSerializer(type,ser);
+ } catch (Throwable t) {
+ throw new SerializationException(t);
+ }
+ }
+ }
+ }
+
+}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/Conventions.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/Conventions.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/Conventions.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/Conventions.java Mon Jan 28 13:26:00 2008
@@ -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.abdera.ext.serializer;
+
+import java.io.Serializable;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AccessibleObject;
+
+public interface Conventions
+ extends Serializable,
+ Cloneable,
+ Iterable<Class <? extends Annotation>>{
+
+ void setConvention(
+ Class<? extends Annotation> annotationType);
+
+ void setConvention(
+ String pattern,
+ Class<? extends Annotation> annotationType);
+
+ Class<? extends Annotation> matchConvention(
+ AccessibleObject accessor);
+
+ Class<? extends Annotation> matchConvention(
+ AccessibleObject accessor,
+ Class<? extends Annotation> expect);
+
+ boolean isMatch(
+ AccessibleObject accessor,
+ Class<? extends Annotation> expect);
+
+ Conventions clone();
+}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/DefaultConventions.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/DefaultConventions.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/DefaultConventions.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/DefaultConventions.java Mon Jan 28 13:26:00 2008
@@ -0,0 +1,121 @@
+/*
+* 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.serializer;
+
+import java.lang.annotation.Annotation;
+
+import org.apache.abdera.ext.serializer.annotation.Accept;
+import org.apache.abdera.ext.serializer.annotation.Author;
+import org.apache.abdera.ext.serializer.annotation.BaseURI;
+import org.apache.abdera.ext.serializer.annotation.Categories;
+import org.apache.abdera.ext.serializer.annotation.Category;
+import org.apache.abdera.ext.serializer.annotation.Collection;
+import org.apache.abdera.ext.serializer.annotation.Content;
+import org.apache.abdera.ext.serializer.annotation.Contributor;
+import org.apache.abdera.ext.serializer.annotation.Control;
+import org.apache.abdera.ext.serializer.annotation.DateTime;
+import org.apache.abdera.ext.serializer.annotation.Draft;
+import org.apache.abdera.ext.serializer.annotation.Edited;
+import org.apache.abdera.ext.serializer.annotation.Email;
+import org.apache.abdera.ext.serializer.annotation.Entry;
+import org.apache.abdera.ext.serializer.annotation.Extension;
+import org.apache.abdera.ext.serializer.annotation.Generator;
+import org.apache.abdera.ext.serializer.annotation.HrefLanguage;
+import org.apache.abdera.ext.serializer.annotation.ID;
+import org.apache.abdera.ext.serializer.annotation.IRI;
+import org.apache.abdera.ext.serializer.annotation.Icon;
+import org.apache.abdera.ext.serializer.annotation.Label;
+import org.apache.abdera.ext.serializer.annotation.Language;
+import org.apache.abdera.ext.serializer.annotation.Length;
+import org.apache.abdera.ext.serializer.annotation.Link;
+import org.apache.abdera.ext.serializer.annotation.Logo;
+import org.apache.abdera.ext.serializer.annotation.MediaType;
+import org.apache.abdera.ext.serializer.annotation.Person;
+import org.apache.abdera.ext.serializer.annotation.Published;
+import org.apache.abdera.ext.serializer.annotation.Rel;
+import org.apache.abdera.ext.serializer.annotation.Rights;
+import org.apache.abdera.ext.serializer.annotation.Scheme;
+import org.apache.abdera.ext.serializer.annotation.Source;
+import org.apache.abdera.ext.serializer.annotation.Src;
+import org.apache.abdera.ext.serializer.annotation.Subtitle;
+import org.apache.abdera.ext.serializer.annotation.Summary;
+import org.apache.abdera.ext.serializer.annotation.Text;
+import org.apache.abdera.ext.serializer.annotation.Title;
+import org.apache.abdera.ext.serializer.annotation.URI;
+import org.apache.abdera.ext.serializer.annotation.Updated;
+import org.apache.abdera.ext.serializer.annotation.Value;
+import org.apache.abdera.ext.serializer.annotation.Version;
+import org.apache.abdera.ext.serializer.annotation.Workspace;
+
+public class DefaultConventions
+ extends AbstractConventions {
+
+ private static final long serialVersionUID = 6797950641657672805L;
+
+ private static final Class<?>[] annotations =
+ {Accept.class,
+ Author.class,
+ BaseURI.class,
+ Categories.class,
+ Category.class,
+ Collection.class,
+ Content.class,
+ Contributor.class,
+ Control.class,
+ Draft.class,
+ Edited.class,
+ Email.class,
+ Entry.class,
+ Extension.class,
+ Generator.class,
+ HrefLanguage.class,
+ Icon.class,
+ ID.class,
+ Label.class,
+ Language.class,
+ Length.class,
+ Link.class,
+ Logo.class,
+ MediaType.class,
+ Published.class,
+ Rel.class,
+ Rights.class,
+ Scheme.class,
+ Source.class,
+ Src.class,
+ Subtitle.class,
+ Summary.class,
+ Title.class,
+ Updated.class,
+ URI.class,
+ Value.class,
+ Version.class,
+ Workspace.class,
+ Text.class,
+ DateTime.class,
+ Person.class,
+ IRI.class
+ };
+
+ @SuppressWarnings("unchecked")
+ public DefaultConventions() {
+ super(false);
+ for (Class<?> type : annotations) setConvention((Class<? extends Annotation>) type);
+ }
+
+}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/DefaultSerializationContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/DefaultSerializationContext.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/DefaultSerializationContext.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/DefaultSerializationContext.java Mon Jan 28 13:26:00 2008
@@ -0,0 +1,73 @@
+/*
+* 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.serializer;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.util.ServiceUtil;
+import org.apache.abdera.writer.StreamWriter;
+
+@SuppressWarnings("unchecked")
+public class DefaultSerializationContext
+ extends AbstractSerializationContext {
+
+ private static final long serialVersionUID = 740460842415905883L;
+
+ private final List<SerializerProvider> providers;
+
+ public DefaultSerializationContext(StreamWriter streamWriter) {
+ super(streamWriter);
+ initSerializers();
+ providers = loadConverterProviders();
+ }
+
+ public DefaultSerializationContext(Abdera abdera, StreamWriter streamWriter) {
+ super(abdera, streamWriter);
+ initSerializers();
+ providers = loadConverterProviders();
+ }
+
+ private void initSerializers() {
+ SerializerProvider[] providers = getConverterProviders();
+ for (SerializerProvider provider : providers) {
+ for (Map.Entry<Class,Serializer> entry : provider) {
+ setSerializer(entry.getKey(), entry.getValue());
+ }
+ }
+ }
+
+ /**
+ * Returns the listing of registered ConverterProvider implementations
+ */
+ public SerializerProvider[] getConverterProviders() {
+ return providers != null ?
+ providers.toArray(
+ new SerializerProvider[providers.size()]) :
+ new SerializerProvider[0];
+ }
+
+ protected static synchronized List<SerializerProvider> loadConverterProviders() {
+ List<SerializerProvider> providers =
+ ServiceUtil.loadimpls(
+ "META-INF/services/org.apache.abdera.converter.ConverterProvider");
+ return providers;
+ }
+
+}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/ObjectContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/ObjectContext.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/ObjectContext.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/ObjectContext.java Mon Jan 28 13:26:00 2008
@@ -0,0 +1,193 @@
+/*
+* 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.serializer;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@SuppressWarnings("unchecked")
+public class ObjectContext {
+
+ private final Class objectType;
+ private final Object parent;
+ private final AccessibleObject accessor;
+ private final Annotation[] annotations;
+ private final Serializer serializer;
+ private final Field[] fields;
+ private final Method[] methods;
+
+ public ObjectContext(Object object) {
+ this(object,null,null);
+ }
+
+ public ObjectContext(
+ Object object,
+ Object parent,
+ AccessibleObject accessor) {
+ this.objectType =
+ object != null ?
+ object.getClass() :
+ accessor != null ?
+ AbstractSerializationContext.getReturnType(accessor) :
+ null;
+ this.parent = parent;
+ this.accessor = accessor;
+ this.annotations = initAnnotations();
+ this.serializer = initSerializer();
+ this.fields = initFields();
+ this.methods = initMethods();
+ }
+
+ private Field[] initFields() {
+ Field[] fields = objectType.getFields();
+ List<Field> list = new ArrayList<Field>();
+ for (Field field : fields) {
+ int mods = field.getModifiers();
+ // ignore static fields
+ if (!Modifier.isStatic(mods)) {
+ list.add(field);
+ }
+ }
+ return list.toArray(new Field[list.size()]);
+ }
+
+ private Method[] initMethods() {
+ Method[] methods = objectType.getMethods();
+ List<Method> list = new ArrayList<Method>();
+ for (Method method : methods) {
+ // only methods that have no parameters, return a value, are not
+ // abstract and are not static
+ int mods = method.getModifiers();
+ if (!Modifier.isStatic(mods) &&
+ !Modifier.isAbstract(mods) &&
+ method.getParameterTypes().length == 0 &&
+ method.getReturnType() != Void.class) {
+ list.add(method);
+ }
+ }
+ return list.toArray(new Method[list.size()]);
+ }
+
+ private Annotation[] initAnnotations() {
+ Map<Class<? extends Annotation>, Annotation> annotations = new
+ HashMap<Class<? extends Annotation>, Annotation>();
+ if (objectType != null) {
+ for (Annotation annotation : objectType.getAnnotations()) {
+ annotations.put(annotation.annotationType(),annotation);
+ }
+ }
+ if (accessor != null) {
+ for (Annotation annotation : accessor.getAnnotations()) {
+ annotations.put(annotation.annotationType(), annotation);
+ }
+ }
+ return annotations.values().toArray(new Annotation[annotations.size()]);
+ }
+
+ private Serializer initSerializer() {
+ try {
+ org.apache.abdera.ext.serializer.annotation.Serializer ser =
+ getAnnotation(
+ org.apache.abdera.ext.serializer.annotation.Serializer.class);
+ if (ser != null) {
+ Class<? extends Serializer> serclass = ser.value();
+ return serclass.newInstance();
+ }
+ return null;
+ } catch (Throwable t) {
+ throw new SerializationException(t);
+ }
+ }
+
+ public AccessibleObject getAccessor() {
+ return accessor;
+ }
+
+ public Object getParent() {
+ return parent;
+ }
+
+ public Class getObjectType() {
+ return objectType;
+ }
+
+ public <X extends Annotation>X getAnnotation(
+ Class<X> annotationType) {
+ for (Annotation annotation : annotations) {
+ if (annotation.annotationType() == annotationType)
+ return (X)annotation;
+ }
+ return null;
+ }
+
+ public Annotation[] getAnnotations() {
+ return annotations;
+ }
+
+ public Serializer getSerializer() {
+ return serializer;
+ }
+
+ public Field[] getFields() {
+ return fields;
+ }
+
+ public Method[] getMethods() {
+ return methods;
+ }
+
+ public AccessibleObject[] getAccessors() {
+ List<AccessibleObject> list = new ArrayList<AccessibleObject>();
+ for (Method method : methods) list.add(method);
+ for (Field field : fields) list.add(field);
+ return list.toArray(new AccessibleObject[list.size()]);
+ }
+
+ public AccessibleObject[] getAccessors(
+ Class<? extends Annotation> annotation,
+ Conventions conventions) {
+ List<AccessibleObject> accessors = new ArrayList<AccessibleObject>();
+ for (AccessibleObject accessor : getAccessors()) {
+ if (accessor.isAnnotationPresent(annotation) ||
+ annotation.equals(conventions.matchConvention(accessor))) {
+ accessors.add(accessor);
+ }
+ }
+ return accessors.toArray(new AccessibleObject[accessors.size()]);
+ }
+
+ public AccessibleObject getAccessor(
+ Class<? extends Annotation> annotation,
+ Conventions conventions) {
+ for (AccessibleObject accessor : getAccessors()) {
+ if (accessor.isAnnotationPresent(annotation) ||
+ annotation.equals(conventions.matchConvention(accessor))) {
+ return accessor;
+ }
+ }
+ return null;
+ }
+
+}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/ObjectResponseContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/ObjectResponseContext.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/ObjectResponseContext.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/ObjectResponseContext.java Mon Jan 28 13:26:00 2008
@@ -0,0 +1,197 @@
+/*
+* 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.serializer;
+
+import java.io.IOException;
+import java.lang.reflect.AccessibleObject;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.ext.serializer.annotation.EntityTag;
+import org.apache.abdera.ext.serializer.annotation.LastModified;
+import org.apache.abdera.ext.serializer.annotation.MediaType;
+import org.apache.abdera.model.AtomDate;
+import org.apache.abdera.protocol.server.context.StreamWriterResponseContext;
+import org.apache.abdera.writer.StreamWriter;
+
+public class ObjectResponseContext
+ extends StreamWriterResponseContext {
+
+ private final Object object;
+ private final ObjectContext objectContext;
+ private final Conventions conventions;
+ private final Class<? extends SerializationContext> context;
+
+ public ObjectResponseContext(
+ Object object,
+ Abdera abdera,
+ String encoding,
+ String sw) {
+ this(object,null,null,abdera,encoding,sw);
+ }
+
+ public ObjectResponseContext(
+ Object object,
+ Class<? extends SerializationContext> context,
+ Conventions conventions,
+ Abdera abdera,
+ String encoding,
+ String sw) {
+ super(abdera, encoding, sw);
+ this.object = object;
+ this.objectContext = new ObjectContext(object);
+ this.conventions =
+ conventions != null ?
+ conventions :
+ new DefaultConventions();
+ this.context =
+ context != null ?
+ context :
+ ConventionSerializationContext.class;
+ init();
+ }
+
+ public ObjectResponseContext(
+ Object object,
+ Abdera abdera,
+ String encoding) {
+ this(object,null,null,abdera,encoding,null);
+ }
+
+ public ObjectResponseContext(
+ Object object,
+ Class<? extends SerializationContext> context,
+ Conventions conventions,
+ Abdera abdera,
+ String encoding) {
+ this(object,context,conventions,abdera,encoding,null);
+ }
+
+ public ObjectResponseContext(
+ Object object,
+ Abdera abdera) {
+ this(object,null,null,abdera,null,null);
+ }
+
+ public ObjectResponseContext(
+ Object object,
+ Class<? extends SerializationContext> context,
+ Conventions conventions,
+ Abdera abdera) {
+ this(object,context,null,abdera,null,null);
+ }
+
+ private void init() {
+ setContentType(getObjectContentType());
+ setEntityTag(getObjectEntityTag());
+ setLastModified(getObjectLastModified());
+ }
+
+ private Date getObjectLastModified() {
+ Date date = null;
+ AccessibleObject accessor =
+ objectContext.getAccessor(
+ LastModified.class,
+ conventions);
+ if (accessor != null) {
+ Object value = BaseSerializer.eval(accessor, object);
+ date = getDate(value);
+ }
+ return date;
+ }
+
+ private Date getDate(
+ Object value) {
+ Date date = null;
+ if (value == null) return null;
+ if (value instanceof Date) {
+ date = (Date) value;
+ } else if (value instanceof Calendar) {
+ date = ((Calendar)value).getTime();
+ } else if (value instanceof Long) {
+ date = new Date(((Long)value).longValue());
+ } else if (value instanceof String) {
+ date = AtomDate.parse((String)value);
+ } else {
+ date = AtomDate.parse(value.toString());
+ }
+ return date;
+ }
+
+ private String getObjectEntityTag() {
+ String etag = null;
+ AccessibleObject accessor =
+ objectContext.getAccessor(
+ EntityTag.class,
+ conventions);
+ if (accessor != null) {
+ Object value = BaseSerializer.eval(accessor, object);
+ etag = value != null ? BaseSerializer.toString(value) : null;
+ }
+ return etag;
+ }
+
+ private String getObjectContentType() {
+ String ctype = null;
+ AccessibleObject accessor =
+ objectContext.getAccessor(
+ MediaType.class,
+ conventions);
+ if (accessor != null) {
+ Object value = BaseSerializer.eval(accessor, object);
+ ctype = value != null ? BaseSerializer.toString(value) : null;
+ }
+ if (ctype == null) {
+ MediaType content_type = objectContext.getAnnotation(MediaType.class);
+ if (content_type != null && !content_type.value().equals(BaseSerializer.DEFAULT)) {
+ ctype = content_type.value();
+ }
+ }
+ return ctype;
+ }
+
+ @Override
+ protected void writeTo(
+ StreamWriter sw)
+ throws IOException {
+ SerializationContext context =
+ newSerializationContext(
+ getAbdera(),
+ conventions,
+ sw);
+ sw.startDocument();
+ context.serialize(object, objectContext);
+ sw.endDocument();
+ }
+
+ private SerializationContext newSerializationContext(
+ Abdera abdera,
+ Conventions conventions,
+ StreamWriter sw) {
+ try {
+ return context.getConstructor(
+ Abdera.class,
+ Conventions.class,
+ StreamWriter.class)
+ .newInstance(abdera,conventions,sw);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/SerializationContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/SerializationContext.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/SerializationContext.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/SerializationContext.java Mon Jan 28 13:26:00 2008
@@ -0,0 +1,55 @@
+/*
+* 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.serializer;
+
+import java.io.Serializable;
+import java.lang.reflect.AccessibleObject;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.writer.StreamWriter;
+
+public interface SerializationContext
+ extends Serializable {
+
+ Abdera getAbdera();
+
+ StreamWriter getStreamWriter();
+
+ void serialize(Object object);
+
+ void serialize(Object object, ObjectContext objectContext);
+
+ void serialize(Object object, Serializer serializer);
+
+ void serialize(Object object, ObjectContext objectContext, Serializer serializer);
+
+ void setSerializer(Class<?> type, Serializer serializer);
+
+ Serializer getSerializer(ObjectContext objectContext);
+
+ boolean hasSerializer(ObjectContext objectContext);
+
+ boolean hasSerializer(Object object);
+
+ boolean hasSerializer(Object object, Object parent, AccessibleObject accessor);
+
+ boolean hasSerializer(Class<?> type);
+
+ boolean hasSerializer(AccessibleObject accessor);
+
+}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/SerializationException.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/SerializationException.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/SerializationException.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/SerializationException.java Mon Jan 28 13:26:00 2008
@@ -0,0 +1,45 @@
+/*
+* 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.serializer;
+
+public class SerializationException
+ extends RuntimeException {
+
+ private static final long serialVersionUID = 3399703987771955406L;
+
+ public SerializationException() {
+ super();
+ }
+
+ public SerializationException(
+ String message,
+ Throwable cause) {
+ super(message, cause);
+ }
+
+ public SerializationException(
+ String message) {
+ super(message);
+ }
+
+ public SerializationException(
+ Throwable cause) {
+ super(cause);
+ }
+
+}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/Serializer.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/Serializer.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/Serializer.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/Serializer.java Mon Jan 28 13:26:00 2008
@@ -0,0 +1,40 @@
+/*
+* 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.serializer;
+
+
+public abstract class Serializer {
+
+ /**
+ * Serializes the given object to the specified writer
+ */
+ public void serialize(
+ Object object,
+ SerializationContext serializationContext) {
+ serialize(object, new ObjectContext(object), serializationContext);
+ }
+
+ /**
+ * Serializes the given object to the specified writer
+ */
+ public abstract void serialize(
+ Object object,
+ ObjectContext context,
+ SerializationContext serializationContext);
+
+}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/SerializerProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/SerializerProvider.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/SerializerProvider.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/SerializerProvider.java Mon Jan 28 13:26:00 2008
@@ -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.abdera.ext.serializer;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+@SuppressWarnings("unchecked")
+public abstract class SerializerProvider
+ implements Iterable<Map.Entry<Class,Serializer>>{
+
+ protected Map<Class,Serializer> serializers =
+ new HashMap<Class,Serializer>();
+
+ protected void setConverter(
+ Class type,
+ Serializer serializer) {
+ serializers.put(type, serializer);
+ }
+
+ public Iterator<Entry<Class, Serializer>> iterator() {
+ return serializers.entrySet().iterator();
+ }
+
+}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Accept.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Accept.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Accept.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Accept.java Mon Jan 28 13:26:00 2008
@@ -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.abdera.ext.serializer.annotation;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.FIELD;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+@Retention(RUNTIME)
+@Target({METHOD,FIELD})
+@Convention(".*accept")
+public @interface Accept {}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Attribute.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Attribute.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Attribute.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Attribute.java Mon Jan 28 13:26:00 2008
@@ -0,0 +1,34 @@
+/*
+* 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.serializer.annotation;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+@Retention(RUNTIME)
+@Target({METHOD,FIELD})
+@Convention(".*attribute")
+public @interface Attribute {
+ String name() default "##default";
+ String ns() default "##default";
+ String prefix() default "##default";
+}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Author.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Author.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Author.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Author.java Mon Jan 28 13:26:00 2008
@@ -0,0 +1,31 @@
+/*
+* 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.serializer.annotation;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+@Retention(RUNTIME)
+@Target({TYPE,METHOD,FIELD})
+@Convention(".*author(?:s)?")
+public @interface Author {}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/BaseURI.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/BaseURI.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/BaseURI.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/BaseURI.java Mon Jan 28 13:26:00 2008
@@ -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.abdera.ext.serializer.annotation;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.FIELD;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+@Retention(RUNTIME)
+@Target({METHOD,FIELD})
+@Convention(".*baseuri")
+public @interface BaseURI {}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Categories.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Categories.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Categories.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Categories.java Mon Jan 28 13:26:00 2008
@@ -0,0 +1,34 @@
+/*
+* 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.serializer.annotation;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import org.apache.abdera.ext.serializer.impl.CategoriesSerializer;
+
+@Retention(RUNTIME)
+@Target({TYPE,METHOD,FIELD})
+@Convention(".*categories")
+@Serializer(CategoriesSerializer.class)
+public @interface Categories {}
Added: incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Category.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Category.java?rev=616050&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Category.java (added)
+++ incubator/abdera/java/trunk/extensions/converters/src/main/java/org/apache/abdera/ext/serializer/annotation/Category.java Mon Jan 28 13:26:00 2008
@@ -0,0 +1,37 @@
+/*
+* 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.serializer.annotation;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import org.apache.abdera.ext.serializer.impl.CategorySerializer;
+
+@Retention(RUNTIME)
+@Target({TYPE,METHOD,FIELD})
+@Convention(".*category|.*categories")
+@Serializer(CategorySerializer.class)
+public @interface Category {
+ String scheme() default "##default";
+ String label() default "##default";
+}