All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.advantageous.boon.json.serializers.impl.FieldSerializerUseAnnotationsImpl Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2013-2014 Richard M. Hightower
 * Licensed 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.
 *
 * __________                              _____          __   .__
 * \______   \ ____   ____   ____   /\    /     \ _____  |  | _|__| ____    ____
 *  |    |  _//  _ \ /  _ \ /    \  \/   /  \ /  \\__  \ |  |/ /  |/    \  / ___\
 *  |    |   (  <_> |  <_> )   |  \ /\  /    Y    \/ __ \|    <|  |   |  \/ /_/  >
 *  |______  /\____/ \____/|___|  / \/  \____|__  (____  /__|_ \__|___|  /\___  /
 *         \/                   \/              \/     \/     \/       \//_____/
 *      ____.                     ___________   _____    ______________.___.
 *     |    |____ ___  _______    \_   _____/  /  _  \  /   _____/\__  |   |
 *     |    \__  \\  \/ /\__  \    |    __)_  /  /_\  \ \_____  \  /   |   |
 * /\__|    |/ __ \\   /  / __ \_  |        \/    |    \/        \ \____   |
 * \________(____  /\_/  (____  / /_______  /\____|__  /_______  / / ______|
 *               \/           \/          \/         \/        \/  \/
 */

package io.advantageous.boon.json.serializers.impl;

import io.advantageous.boon.core.reflection.FastStringUtils;
import io.advantageous.boon.core.reflection.fields.FieldAccess;
import io.advantageous.boon.json.serializers.*;
import io.advantageous.boon.Sets;
import io.advantageous.boon.core.TypeType;
import io.advantageous.boon.primitive.Arry;
import io.advantageous.boon.primitive.CharBuf;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;

/**
 * Created by rick on 1/1/14.
 */
public class FieldSerializerUseAnnotationsImpl implements FieldSerializer {

    private final boolean includeNulls;
    private final boolean includeDefault;
    private final boolean useAnnotations;
    private final boolean includeEmpty;
    private final boolean handleSimpleBackReference;
    private final boolean handleComplexBackReference;
    private final String view;
    private IdentityHashMap idMap;
    private Map overrideMap;
    private Map customFieldSerializerMap;
    private List customFieldSerializers;

    private final Set noHandle = Sets.safeSet(Class.class);

    private final List filterProperties;




    public FieldSerializerUseAnnotationsImpl ( boolean includeNulls,
                                               boolean includeDefault, boolean useAnnotations,
                                               boolean includeEmpty, boolean handleSimpleBackReference,
                                               boolean handleComplexBackReference,
                                               Map overrideMap,
                                               List filterProperties,
                                               Map customFieldSerializerMap,
                                               List customFieldSerializers,
                                               String view) {
        this.includeNulls = includeNulls;
        this.includeDefault = includeDefault;
        this.useAnnotations = useAnnotations;
        this.includeEmpty = includeEmpty;
        this.handleSimpleBackReference = handleSimpleBackReference;
        this.handleComplexBackReference = handleComplexBackReference;
        this.view = view;

        if (handleComplexBackReference) {
            idMap = new IdentityHashMap (  );
        }

        this.overrideMap = overrideMap;
        this.filterProperties = filterProperties;
        this.customFieldSerializerMap = customFieldSerializerMap;
        this.customFieldSerializers = customFieldSerializers;

    }

    private void serializeFieldName ( String name, CharBuf builder ) {
        builder.addJsonFieldName ( FastStringUtils.toCharArray(name) );
    }

    @Override
    public final boolean serializeField ( JsonSerializerInternal serializer, Object parent, FieldAccess fieldAccess, CharBuf builder ) {

        final String fieldName = fieldAccess.alias();
        TypeType typeEnum = fieldAccess.typeEnum();

        if ( useAnnotations && fieldAccess.ignore() )  {
            return false;
        }

        if ( useAnnotations && view != null && !fieldAccess.isViewActive(view)  )  {
            return false;
        }


        final boolean include = (useAnnotations && fieldAccess.include());


        if (filterProperties != null ) {
            for (FieldFilter filter: filterProperties)  {
                if (!filter.include ( parent, fieldAccess )) {
                    return false;
                }
            }
        }


        if ( customFieldSerializerMap != null ) {

            final CustomFieldSerializer customFieldSerializer = customFieldSerializerMap.get ( fieldAccess.name() );
            if ( customFieldSerializer.serializeField (serializer, parent, fieldAccess, builder) ) {
                return true;
            }
        }

        if ( customFieldSerializers != null ) {

            for (CustomFieldSerializer cfs : customFieldSerializers) {
                if (cfs.serializeField ( serializer, parent, fieldAccess, builder ) == true) {
                    return true;
                }
            }

        }



        switch ( typeEnum ) {
            case INT:
                int value = fieldAccess.getInt ( parent );
                if (includeDefault || include || value !=0) {
                    serializeFieldName ( fieldName, builder );
                    builder.addInt ( value  );
                    return true;
                }
                return false;
            case BOOLEAN:
                boolean bvalue = fieldAccess.getBoolean ( parent );
                if (includeDefault || include ||  bvalue ) {
                    serializeFieldName ( fieldName, builder );
                    builder.addBoolean ( bvalue  );
                    return true;
                }
                return false;

            case BYTE:
                byte byvalue = fieldAccess.getByte ( parent );
                if (includeDefault || include ||  byvalue != 0 ) {
                    serializeFieldName ( fieldName, builder );
                    builder.addByte ( byvalue  );
                    return true;
                }
                return false;
            case LONG:
                long lvalue = fieldAccess.getLong ( parent );
                if ( includeDefault || include || lvalue != 0 ) {
                    serializeFieldName ( fieldName, builder );
                    builder.addLong ( lvalue  );
                    return true;
                }
                return false;
            case DOUBLE:
                double dvalue = fieldAccess.getDouble ( parent );
                if (includeDefault || include || dvalue != 0 ) {
                    serializeFieldName ( fieldName, builder );
                    builder.addDouble ( dvalue  );
                    return true;
                }
                return false;
            case FLOAT:
                float fvalue = fieldAccess.getFloat ( parent );
                if (includeDefault || include || fvalue != 0.0f ) {
                    serializeFieldName ( fieldName, builder );
                    builder.addFloat ( fvalue  );
                    return true;
                }
                return false;
            case SHORT:
                short svalue = fieldAccess.getShort( parent );
                if (includeDefault || include || svalue != 0 ) {
                    serializeFieldName ( fieldName, builder );
                    builder.addShort ( svalue  );
                    return true;
                }
                return false;
            case CHAR:
                char cvalue = fieldAccess.getChar( parent );
                if (includeDefault || include || cvalue != 0 ) {
                    serializeFieldName ( fieldName, builder );
                    builder.addQuoted( "" + cvalue  );
                    return true;
                }
                return false;

            case OBJECT:
                typeEnum = TypeType.getInstanceType(fieldAccess.getObject ( parent ));
                break;

        }

        Object value = fieldAccess.getObject ( parent );

        if (!includeNulls && !include && value == null ) {
            return false;
        }


        if ((includeNulls || fieldAccess.include()) &&  value == null ) {
            serializeFieldName ( fieldName, builder );
            builder.addNull ();
            return true;
        }







        switch ( typeEnum )  {
            case BIG_DECIMAL:
                serializeFieldName ( fieldName, builder );
                builder.addBigDecimal ( (BigDecimal ) value );
                return true;
            case BIG_INT:
                serializeFieldName ( fieldName, builder );
                builder.addBigInteger ( ( BigInteger ) value );
                return true;
            case DATE:
                serializeFieldName ( fieldName, builder );
                serializer.serializeDate ( ( Date ) value, builder );
                return true;
            case STRING:
                String string = (String) value;
                if (includeEmpty ||  include || string.length() > 0) {
                    serializeFieldName ( fieldName, builder );
                    serializer.serializeString( string, builder );
                    return true;
                }
                return false;
            case CLASS:
                serializeFieldName ( fieldName, builder );
                builder.addQuoted ( (( Class ) value).getName());
                return true;

            case TIME_ZONE:

                serializeFieldName ( fieldName, builder );
                TimeZone zone = (TimeZone) value;

                builder.addQuoted ( zone.getID() );
                return true;
            case CHAR_SEQUENCE:
                String s2 =  value.toString();
                if (includeEmpty ||  include || s2.length() > 0) {
                    serializeFieldName ( fieldName, builder );
                    serializer.serializeString( s2, builder );
                    return true;
                }
                return false;
            case INTEGER_WRAPPER:
                serializeFieldName ( fieldName, builder );
                builder.addInt ( ( Integer ) value );
                return true;
            case LONG_WRAPPER:
                serializeFieldName ( fieldName, builder );
                builder.addLong ( ( Long ) value );
                return true;
            case FLOAT_WRAPPER:
                serializeFieldName ( fieldName, builder );
                builder.addFloat ( ( Float ) value );
                return true;
            case DOUBLE_WRAPPER:
                serializeFieldName ( fieldName, builder );
                builder.addDouble ( ( Double ) value );
                return true;
            case SHORT_WRAPPER:
                serializeFieldName ( fieldName, builder );
                builder.addShort ( ( Short ) value );
                return true;
            case BYTE_WRAPPER:
                serializeFieldName ( fieldName, builder );
                builder.addByte ( ( Byte ) value );
                return true;
            case CHAR_WRAPPER:
                serializeFieldName ( fieldName, builder );
                builder.addQuoted ( value.toString() );
                return true;
            case ENUM:
                serializeFieldName ( fieldName, builder );
                builder.addQuoted ( value.toString () );
                return true;
            case COLLECTION:
            case LIST:
            case SET:
                Collection collection = (Collection) value;
                if (includeEmpty ||  include || collection.size () > 0) {
                    serializeFieldName ( fieldName, builder );
                    serializer.serializeCollection ( collection, builder );
                    return true;
                }
                return false;
            case MAP:
                Map map = (Map) value;
                if (includeEmpty ||  include || map.size () > 0) {
                    serializeFieldName ( fieldName, builder );
                    serializer.serializeMap ( map, builder );
                    return true;
                }
                return false;


            case ARRAY:
            case ARRAY_INT:
            case ARRAY_BYTE:
            case ARRAY_SHORT:
            case ARRAY_FLOAT:
            case ARRAY_DOUBLE:
            case ARRAY_LONG:
            case ARRAY_STRING:
            case ARRAY_OBJECT:
                if (includeEmpty ||  include || Arry.len(value) > 0) {
                    serializeFieldName ( fieldName, builder );
                    serializer.serializeArray ( value, builder );
                    return true;
                }
                return false;

            case INTERFACE:
            case ABSTRACT:
                if (handleSimpleBackReference && value == parent ) {
                    return false;
                } else if (handleComplexBackReference) {
                    if ( idMap.containsKey ( value ) ) {
                        return false;
                    } else {
                        idMap.put ( value, value );
                    }
                }

                serializeFieldName ( fieldName, builder );

                if (overrideMap!=null) {

                    SerializeUtils.handleInstance(serializer, value, builder,
                            overrideMap, noHandle, false, typeEnum);

                } else {
                    serializer.serializeSubtypeInstance(value, builder);
                }

                return true;
            case INSTANCE:
                if (handleSimpleBackReference && value == parent ) {
                    return false;
                } else if (handleComplexBackReference) {
                    if ( idMap.containsKey ( value ) ) {
                        return false;
                    } else {
                        idMap.put ( value, value );
                    }
                }

                serializeFieldName ( fieldName, builder );


                if (overrideMap!=null) {

                    SerializeUtils.handleInstance(serializer, value, builder,
                            overrideMap, noHandle, false, typeEnum);

                } else {
                    if ( fieldAccess.type() == value.getClass () ) {
                        serializer.serializeInstance ( value, builder );
                    } else {
                        serializer.serializeSubtypeInstance ( value, builder );
                    }
                }


                return true;

            case CURRENCY:
                serializeFieldName ( fieldName, builder );
                builder.addCurrency(( Currency ) value );
                return true;

            default:
                serializeFieldName ( fieldName, builder );
                serializer.serializeUnknown ( value, builder );
                return true;

        }

    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy