package ecologylab.serialization.serializers; import java.io.File; import java.io.IOException; import java.io.OutputStream; import ecologylab.serialization.ClassDescriptor; import ecologylab.serialization.FieldDescriptor; import ecologylab.serialization.SIMPLTranslationException; import ecologylab.serialization.SimplTypesScope; import ecologylab.serialization.TranslationContextPool; import ecologylab.serialization.SimplTypesScope.GRAPH_SWITCH; import ecologylab.serialization.TranslationContext; import ecologylab.serialization.formatenums.BinaryFormat; import ecologylab.serialization.formatenums.Format; import ecologylab.serialization.formatenums.StringFormat; import ecologylab.serialization.serializers.binaryformats.TLVSerializer; import ecologylab.serialization.serializers.stringformats.BibtexSerializer; import ecologylab.serialization.serializers.stringformats.JSONSerializer; import ecologylab.serialization.serializers.stringformats.StringSerializer; import ecologylab.serialization.serializers.stringformats.XMLSerializer; /** * FormatSerializer. an abstract base class from where format-specific serializers derive. Its main * use is for exposing the API for serialization methods. It contains helper functions and wrapper * serialization functions, allowing software developers to use different types of objects for * serialization, such as System.out, File, StringBuilder, or return serialized data as * StringBuilder * * @author nabeel * */ public abstract class FormatSerializer { /** * * @param object * @param outputStream * @throws SIMPLTranslationException */ public void serialize(Object object, OutputStream outputStream) throws SIMPLTranslationException { TranslationContext translationContext = TranslationContextPool.get().acquire(); serialize(object, outputStream, translationContext); TranslationContextPool.get().release(translationContext); } public abstract void serialize(Object object, OutputStream outputStream, TranslationContext translationContext) throws SIMPLTranslationException; /** * * @param object * @param outputFile * @throws SIMPLTranslationException * @throws IOException */ public void serialize(Object object, File outputFile) throws SIMPLTranslationException { TranslationContext translationContext = TranslationContextPool.get().acquire(); serialize(object, outputFile, translationContext); TranslationContextPool.get().release(translationContext); } public abstract void serialize(Object object, File outputFile, TranslationContext translationContext) throws SIMPLTranslationException; /** * * @param object * @return */ protected ClassDescriptor<? extends FieldDescriptor> getClassDescriptor(Object object) { return ClassDescriptor.getClassDescriptor(object.getClass()); } /** * * @param object * @param translationContext TODO */ protected void serializationPostHook(Object object, TranslationContext translationContext) { if (object instanceof ISimplSerializationPost) { ((ISimplSerializationPost) object).serializationPostHook(translationContext); } } /** * * @param object * @param translationContext TODO */ protected void serializationPreHook(Object object, TranslationContext translationContext) { if (object instanceof ISimplSerializationPre) { ((ISimplSerializationPre) object).serializationPreHook(translationContext); } } /** * * @param object * @param translationContext * @return */ protected boolean alreadySerialized(Object object, TranslationContext translationContext) { return SimplTypesScope.graphSwitch == GRAPH_SWITCH.ON && translationContext.alreadyMarshalled(object); } /** * returns the specific type of serializer based on the input format * * @param format * @return FormatSerializer * @throws SIMPLTranslationException */ public static FormatSerializer getSerializer(Format format) throws SIMPLTranslationException { switch (format) { case XML: return new XMLSerializer(); case JSON: return new JSONSerializer(); case TLV: return new TLVSerializer(); case BIBTEX: return new BibtexSerializer(); default: throw new SIMPLTranslationException(format + " format not supported"); } } /** * returns the specific type of serializer based on the input format * * @param format * @return FormatSerializer * @throws SIMPLTranslationException */ public static StringSerializer getStringSerializer(StringFormat format) throws SIMPLTranslationException { switch (format) { case XML: return new XMLSerializer(); case JSON: return new JSONSerializer(); case BIBTEX: return new BibtexSerializer(); default: throw new SIMPLTranslationException(format + " format not supported"); } } /** * returns the specific type of serializer based on the input format * * @param format * @return FormatSerializer * @throws SIMPLTranslationException */ public static FormatSerializer getBinarySerializer(BinaryFormat format) throws SIMPLTranslationException { switch (format) { case TLV: return new TLVSerializer(); default: throw new SIMPLTranslationException(format + " format not supported"); } } }