org.fusesource.restygwt.rebind.GwtJacksonEncoderDecoderClassCreator.java Source code

Java tutorial

Introduction

Here is the source code for org.fusesource.restygwt.rebind.GwtJacksonEncoderDecoderClassCreator.java

Source

/**
 * Copyright (C) 2009-2012 the original author or authors.
 * See the notice.md file distributed with this work for additional
 * information regarding copyright ownership.
 *
 * 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.
 */

package org.fusesource.restygwt.rebind;

import com.fasterxml.jackson.annotation.JsonValue;
import com.github.nmorel.gwtjackson.client.ObjectMapper;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JMethod;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;

/**
 *
 * @author lucasam
 *
 *         Based on @see
 *         corg.fusesource.restygwt.rebind.JsonEncoderDecoderClassCreator
 *
 */

public class GwtJacksonEncoderDecoderClassCreator extends BaseSourceCreator {
    private static final String GWT_JACKSON_ENCODER_SUFFIX = "_Gen_GwtJackEncDec_";
    private static final String GWT_JACKSON_MAPPER_IF = "GwtJackMapper";

    private static final String OBJECT_MAPPER_CLASS = ObjectMapper.class.getName();

    protected static final String JSON_VALUE_CLASS = JSONValue.class.getName();
    protected static final String JSON_STRING_CLASS = JSONString.class.getName();

    protected boolean javaBeansNamingConventionEnabled;

    public GwtJacksonEncoderDecoderClassCreator(TreeLogger logger, GeneratorContext context, JClassType source) {
        super(logger, context, source, GWT_JACKSON_ENCODER_SUFFIX);
    }

    @Override
    public void generate() throws UnableToCompleteException {
        //Forcing class to be loaded
        try {
            Class.forName(ObjectMapper.class.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        final JClassType sourceClazz = source.isClass() == null ? source.isInterface() : source.isClass();
        if (sourceClazz == null) {
            getLogger().log(ERROR, "Type is not a class");
            throw new UnableToCompleteException();
        }
        generateMapper();
        generateSingleton(shortName);
        generateEncodeMethod(source);
        generateDecodeMethod(source);
    }

    private void generateMapper() {
        p();
        p("public static interface " + GWT_JACKSON_MAPPER_IF + " extends " + OBJECT_MAPPER_CLASS + "<"
                + source.getParameterizedQualifiedSourceName() + "> {};");
        p();
    }

    protected void generateSingleton(String shortName) {
        p();
        p("public static final " + shortName + " INSTANCE = new " + shortName + "();");
        p();
    }

    @Override
    protected ClassSourceFileComposerFactory createComposerFactory() {
        ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory(packageName, shortName);
        composerFactory.setSuperclass(JsonEncoderDecoderInstanceLocator.JSON_ENCODER_DECODER_CLASS + "<"
                + source.getParameterizedQualifiedSourceName() + ">");
        return composerFactory;
    }

    private void generateEncodeMethod(JClassType classType) throws UnableToCompleteException {

        p("public " + JSON_VALUE_CLASS + " encode(" + source.getParameterizedQualifiedSourceName() + " value) {")
                .i(1);

        {
            p("if( value==null ) {").i(1);
            {
                p("return getNullType();");
            }
            i(-1).p("}");

            p(GWT_JACKSON_MAPPER_IF + " mapper__ = " + GWT.class.getName() + ".create(" + GWT_JACKSON_MAPPER_IF
                    + ".class);");
            p(" String returnStr = mapper__.write(value);");
            p("return " + JSONParser.class.getName() + ".parseLenient(returnStr);");
        }
        i(-1).p("}");
        p();
    }

    protected String getValueMethod(JClassType classType) {
        String method = "name";
        for (JMethod jm : classType.isEnum().getMethods()) {
            if (jm.isAnnotationPresent(JsonValue.class)) {
                method = jm.getName();
                break;
            }
        }
        return method;
    }

    private void generateDecodeMethod(JClassType classType) throws UnableToCompleteException {
        p("public " + source.getParameterizedQualifiedSourceName() + " decode(" + JSON_VALUE_CLASS + " value) {")
                .i(1);
        {
            p("if( value == null || value.isNull()!=null ) {").i(1);
            {
                p("return null;").i(-1);
            }
            p("}");

            p(GWT_JACKSON_MAPPER_IF + " mapper__ = " + GWT.class.getName() + ".create(" + GWT_JACKSON_MAPPER_IF
                    + ".class);");
            p(" return (" + source.getParameterizedQualifiedSourceName() + ") mapper__.read(value.toString());");

            i(-1).p("}");
            p();
        }
    }

}