Example usage for com.google.gwt.core.ext.typeinfo JField isEnumConstant

List of usage examples for com.google.gwt.core.ext.typeinfo JField isEnumConstant

Introduction

In this page you can find the example usage for com.google.gwt.core.ext.typeinfo JField isEnumConstant.

Prototype

JEnumConstant isEnumConstant();

Source Link

Usage

From source file:org.jboss.errai.bus.rebind.BusClientConfigGenerator.java

License:Apache License

private void generateMarshaller(JClassType visit, TreeLogger logger, SourceWriter writer) {
    Boolean enumType = visit.isEnum() != null;
    Map<String, Class> types = new HashMap<String, Class>();
    Map<String, ValueExtractor> getters = new HashMap<String, ValueExtractor>();
    Map<String, ValueBinder> setters = new HashMap<String, ValueBinder>();
    Map<Class, Integer> arrayConverters = new HashMap<Class, Integer>();

    try {/*from  w w w .  j  a v a2 s  . c  om*/
        JClassType scan = visit;

        do {
            for (JField f : scan.getFields()) {
                if (f.isTransient() || f.isStatic() || f.isEnumConstant() != null)
                    continue;

                JClassType type = f.getType().isClassOrInterface();
                JMethod getterMeth;
                JMethod setterMeth;
                if (type == null) {
                    JPrimitiveType pType = f.getType().isPrimitive();
                    Class c;
                    if (pType == null) {
                        JArrayType aType = f.getType().isArray();
                        if (aType == null)
                            continue;

                        String name = aType.getQualifiedBinaryName();
                        int depth = 0;
                        for (int i = 0; i < name.length(); i++) {
                            if (name.charAt(i) == '[')
                                depth++;
                            else
                                break;
                        }

                        types.put(f.getName(), c = Class.forName(name.substring(0, depth)
                                + getInternalRep(aType.getQualifiedBinaryName().substring(depth))));

                        arrayConverters.put(c, depth);

                    } else {
                        types.put(f.getName(), c = ParseTools
                                .unboxPrimitive(Class.forName(pType.getQualifiedBoxedSourceName())));
                    }
                } else {

                    types.put(f.getName(), Class.forName(type.getQualifiedBinaryName()));
                }

                getterMeth = getAccessorMethod(visit, f);
                setterMeth = getSetterMethod(visit, f);

                if (getterMeth == null) {
                    if (f.isPublic()) {
                        getters.put(f.getName(), new ValueExtractor(f));
                    } else if (visit == scan) {
                        throw new GenerationException("could not find a read accessor in class: "
                                + visit.getQualifiedSourceName() + "; for field: " + f.getName()
                                + "; should declare an accessor: " + ReflectionUtil.getGetter(f.getName()));
                    }
                } else {
                    getters.put(f.getName(), new ValueExtractor(getterMeth));
                }

                if (setterMeth == null) {
                    if (f.isPublic()) {
                        setters.put(f.getName(), new ValueBinder(f));
                    } else if (visit == scan) {
                        throw new GenerationException("could not find a write accessor in class: "
                                + visit.getQualifiedSourceName() + "; for field: " + f.getName()
                                + "; should declare an accessor: " + ReflectionUtil.getSetter(f.getName()));
                    }
                } else {
                    setters.put(f.getName(), new ValueBinder(setterMeth));
                }

            }
        } while ((scan = scan.getSuperclass()) != null
                && !scan.getQualifiedSourceName().equals("java.lang.Object"));

    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    }

    try {
        if (!enumType)
            visit.getConstructor(new JClassType[0]);
    } catch (NotFoundException e) {
        String errorMsg = "Type marked for serialization does not expose a default constructor: "
                + visit.getQualifiedSourceName();
        logger.log(TreeLogger.Type.ERROR, errorMsg, e);
        throw new GenerationException(errorMsg, e);
    }

    Map<String, Object> templateVars = Make.Map.<String, Object>$()
            ._("className", visit.getQualifiedSourceName())
            ._("canonicalClassName", visit.getQualifiedBinaryName())._("fields", types.keySet())
            ._("targetTypes", types)._("getters", getters)._("setters", setters)
            ._("arrayConverters", arrayConverters)._("enumType", enumType)._();

    String genStr;

    writer.print(genStr = (String) execute(demarshallerGenerator, templateVars));

    log.debug("generated demarshaller: \n" + genStr);

    logger.log(TreeLogger.Type.INFO, genStr);

    writer.print(genStr = (String) execute(marshallerGenerator, templateVars));

    log.debug("generated marshaller: \n" + genStr);

    logger.log(TreeLogger.Type.INFO, genStr);
    logger.log(TreeLogger.Type.INFO, "Generated marshaller/demarshaller for: " + visit.getName());
}