Package org.apache.abdera.ext.serializer

Source Code of org.apache.abdera.ext.serializer.BaseSerializer

/*
* 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);
  }
}
TOP

Related Classes of org.apache.abdera.ext.serializer.BaseSerializer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.