Subversion Repositories bacoAlunos

Rev

Rev 1785 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.domain;

import com.owlike.genson.Genson;
import com.owlike.genson.GensonBuilder;
import org.apache.log4j.Logger;
import org.json.JSONException;
import org.json.JSONObject;
import pt.estgp.estgweb.domain.utils.JsonView;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.util.Date;
import java.util.List;

/**
 * @author Jorge Machado
 * @date 2/Mar/2008
 * @time 10:56:46
 * @see pt.estgp.estgweb.domain
 */

public abstract class DomainObject implements JsonView
{
    private static final 1.5.0/docs/api/java/util/logging/Logger.html">Logger logger = 1.5.0/docs/api/java/util/logging/Logger.html">Logger.getLogger(DomainObject.class);
    private static final 5+0%2Fdocs%2Fapi+Date">Date MIN_DATE = new 5+0%2Fdocs%2Fapi+Date">Date(0);
    private static final 5+0%2Fdocs%2Fapi+Date">Date MAX_DATE = new 5+0%2Fdocs%2Fapi+Date">Date(1.5.0/docs/api/java/lang/Integer.html">Integer.MAX_VALUE);

    private static Genson gensonGenericLoad;
    static{
        gensonGenericLoad = new GensonBuilder()
                //Usa ClassMetadata nos objectos contidos se houver
                // porque no principal já foi buscar antes fazendo parse ao JSON no metodo fromJson e fazendo get("@class")
                //porque no genson o @class tem de vir em primeiro e pode não
                // se nos outros não vier info da class ele falha
                .useMethods(true) //only bean proerties
                .useFields(true) //pode existir uma var com campos publicos esses ele serializa
                .useRuntimeType(true)
                .useClassMetadata(true)
                .useDateAsTimestamp(true)
                .exclude(5+0%2Fdocs%2Fapi+Date">Date.class)
                .exclude(java.sql.5+0%2Fdocs%2Fapi+Timestamp">Timestamp.class)
                .exclude(java.sql.5+0%2Fdocs%2Fapi+Date">Date.class)
                .create();
    }

    public static DomainObject fromJson(1.5.0/docs/api/java/lang/String.html">String json)
    {
        try {
            1.5.0/docs/api/java/lang/String.html">String className = (1.5.0/docs/api/java/lang/String.html">String) new JSONObject(json).get("@class");
            if(className != null)
                return (DomainObject) gensonGenericLoad.deserialize(json,1.5.0/docs/api/java/lang/Class.html">Class.forName(className));
            return gensonGenericLoad.deserialize(json,DomainObject.class);
        } catch (1.5.0/docs/api/java/lang/ClassNotFoundException.html">ClassNotFoundException e) {
            logger.error(e,e);
            throw new 1.5.0/docs/api/java/lang/RuntimeException.html">RuntimeException("Fail Json Object:",e);
        } catch (JSONException e) {
            logger.error(e, e);
            throw new 1.5.0/docs/api/java/lang/RuntimeException.html">RuntimeException("Fail Json Object:",e);
        }
    }

    private Genson genson = null;

    private synchronized void createGensonBuilder()
    {
        if(genson == null)
        {


            1.5.0/docs/api/java/beans/BeanInfo.html">BeanInfo bi;
            GensonBuilder gensonBuilder = new GensonBuilder()
                    .useClassMetadata(true)
                    .exclude(5+0%2Fdocs%2Fapi+Object">Object.class);

            //.useFields(false, VisibilityFilter.NONE);


            try {
                bi = 1.5.0/docs/api/java/beans/Introspector.html">Introspector.getBeanInfo(this.getClass());
            } catch (5+0%2Fdocs%2Fapi+IntrospectionException">IntrospectionException e) {
                e.printStackTrace();
                throw new 1.5.0/docs/api/java/lang/RuntimeException.html">RuntimeException(e);
            }
            List<String> excludedProperties = getJsonExcludedProperties();
            1.5.0/docs/api/java/beans/PropertyDescriptor.html">PropertyDescriptor[] pds = bi.getPropertyDescriptors();
            for (int i = 0; i < pds.length; i++) {


                1.5.0/docs/api/java/lang/String.html">String propName = pds[i].getDisplayName();
                if(excludedProperties == null || !excludedProperties.contains(propName))
                    gensonBuilder = gensonBuilder.include(propName,this.getClass());
                else
                    gensonBuilder = gensonBuilder.exclude(propName, this.getClass());
            }
            genson = gensonBuilder.create();
        }
    }

    /**
     * Generic Json Object only for local class methods
     * @return
     * @throws JSONException
     */

    @1.5.0/docs/api/java/lang/Override.html">Override
    public JSONObject toJsonObject() throws JSONException
    {
        return new JSONObject(toJson());
    }

    /**
     * * Generic Json Object only for local class methods
     * @return
     * @throws IOException
     */

    @1.5.0/docs/api/java/lang/Override.html">Override
    public 1.5.0/docs/api/java/lang/String.html">String toJson() {
        createGensonBuilder();
        return genson.serialize(this);
    }

    @1.5.0/docs/api/java/lang/Override.html">Override
    public List<String> getJsonExcludedProperties() {
        return null;
    }

    public void searchMyMethodsStartingWith(1.5.0/docs/api/java/lang/String.html">String propNamePrefix, List<String> listMethods) {
        1.5.0/docs/api/java/beans/BeanInfo.html">BeanInfo bi;

        try {
            bi = 1.5.0/docs/api/java/beans/Introspector.html">Introspector.getBeanInfo(this.getClass());
        } catch (5+0%2Fdocs%2Fapi+IntrospectionException">IntrospectionException e) {
            e.printStackTrace();
            throw new 1.5.0/docs/api/java/lang/RuntimeException.html">RuntimeException(e);
        }
        1.5.0/docs/api/java/beans/PropertyDescriptor.html">PropertyDescriptor[] pds = bi.getPropertyDescriptors();
        for (int i = 0; i < pds.length; i++) {

            1.5.0/docs/api/java/lang/String.html">String propName = pds[i].getDisplayName();
            if(propName.startsWith(propNamePrefix))
                listMethods.add(propName);
        }
    }

    public void setSaveDate(5+0%2Fdocs%2Fapi+Date">Date d)
    {

    }
    public 5+0%2Fdocs%2Fapi+Date">Date getSaveDate()
    {
        return null;
    }


    public 5+0%2Fdocs%2Fapi+Date">Date getStartTime()
    {
        return MIN_DATE;
    }

    public 5+0%2Fdocs%2Fapi+Date">Date getEndTime()
    {
        return MAX_DATE;
    }

    public 1.5.0/docs/api/java/lang/Class.html">Class getReferenceClass()
    {
        return this.getClass();
    }



    public static void main(1.5.0/docs/api/java/lang/String.html">String[] argv) throws 1.5.0/docs/api/java/lang/Exception.html">Exception {

       // AbstractDao.getCurrentSession().beginTransaction();

        1.5.0/docs/api/java/lang/System.html">System.out.println(DomainObject.fromJson("{\n" +
                "              \"flowComponentId\": 67,\n" +
                "              \"@class\": \"pt.estgp.estgweb.domain.BpmnFlowConnectorImpl\",\n" +
                "              \"encaminhadorTarefaVarHolder\": null,\n" +

                "              \"updateDate\": 1497716649000,\n" +
                "              \"id\": 14,\n" +
                "              \"msgEmail\": null,\n" +
                "              \"nameConnection\": \"kn\",\n" +
                "              \"sendEmail\": false,\n" +
                "              \"targetTypes\": null,\n" +
                "              \"encaminhadorTarefaVarHolderType\": null,\n" +
                "              \"saveDate\": 1497716649083,\n" +
                "              \"keyValue\": null,\n" +
                "              \"selected\": true,\n" +
                "              \"dirty\": true\n" +
                "            }").toJson());
    }


   
}