X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fconfig%2Fyang-jmx-generator-plugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfig%2Fyangjmxgenerator%2Fplugin%2Fftl%2FTemplateFactory.java;h=1eaa35f7813f5d3482c92b745dc67f99e66346ac;hp=49a20bd46250da8e2bbe83bc767af1dd75398260;hb=f48f157c11ce02504cd53d349d611282f649d47c;hpb=9212fed678702583f4a555641208cf1c7b45b829 diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/TemplateFactory.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/TemplateFactory.java index 49a20bd462..1eaa35f781 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/TemplateFactory.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/TemplateFactory.java @@ -7,15 +7,23 @@ */ package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl; -import com.google.common.base.Function; import com.google.common.base.Preconditions; -import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import javax.management.openmbean.SimpleType; +import org.opendaylight.controller.config.api.DependencyResolver; +import org.opendaylight.controller.config.api.IdentityAttributeRef; import org.opendaylight.controller.config.api.RuntimeBeanRegistratorAwareModule; import org.opendaylight.controller.config.api.annotations.AbstractServiceInterface; import org.opendaylight.controller.config.api.runtime.RuntimeBean; -import org.opendaylight.controller.config.spi.Module; +import org.opendaylight.controller.config.spi.AbstractModule; import org.opendaylight.controller.config.yangjmxgenerator.AbstractEntry; import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry; import org.opendaylight.controller.config.yangjmxgenerator.RuntimeBeanEntry; @@ -35,75 +43,23 @@ import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Anno import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Constructor; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Field; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Header; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.IdentityRefModuleField; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.MethodDeclaration; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.MethodDefinition; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.ModuleField; import org.opendaylight.controller.config.yangjmxgenerator.plugin.util.FullyQualifiedNameHelper; -import org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil; import org.opendaylight.yangtools.sal.binding.model.api.ParameterizedType; import org.opendaylight.yangtools.sal.binding.model.api.Type; - -import javax.management.openmbean.SimpleType; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; +import org.opendaylight.yangtools.yang.binding.BindingMapping; public class TemplateFactory { - public static Map getFtlTemplates( - ModuleMXBeanEntry entry) { - Map result = new HashMap<>(); - - result.putAll(TemplateFactory.tOsFromMbe(entry)); - - // IFC - result.put(entry.getMXBeanInterfaceName() + ".java", - TemplateFactory.mXBeanInterfaceTemplateFromMbe(entry)); - - // ABS fact - result.put(entry.getAbstractFactoryName() + ".java", - TemplateFactory.abstractFactoryTemplateFromMbe(entry)); - - // ABS module - result.put(entry.getAbstractModuleName() + ".java", - TemplateFactory.abstractModuleTemplateFromMbe(entry)); - - return result; - } - - public static Map getFtlStubTemplates( - ModuleMXBeanEntry entry) { - Map result = new HashMap<>(); - // STUB fact - result.put(entry.getStubFactoryName() + ".java", - TemplateFactory.stubFactoryTemplateFromMbe(entry)); - - result.put(entry.getStubModuleName() + ".java", - TemplateFactory.stubModuleTemplateFromMbe(entry)); - return result; - } - - public static Map getFtlTemplates( - ServiceInterfaceEntry entry) { - - Map result = new HashMap<>(); - result.put(entry.getTypeName() + ".java", - TemplateFactory.serviceInterfaceFromSie(entry)); - - return result; - } - /** * Get map of file name as key, FtlFile instance representing runtime mx * bean as value that should be persisted from this instance. */ public static Map getTOAndMXInterfaceFtlFiles( - RuntimeBeanEntry entry) { + final RuntimeBeanEntry entry) { Map result = new HashMap<>(); { // create GeneralInterfaceFtlFile for runtime MXBean. Attributes will // be transformed to getter methods @@ -153,12 +109,12 @@ public class TemplateFactory { } // FIXME: put into Type.toString - static String serializeType(Type type) { + static String serializeType(final Type type, final boolean addWildcards) { if (type instanceof ParameterizedType){ ParameterizedType parameterizedType = (ParameterizedType) type; - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append(parameterizedType.getRawType().getFullyQualifiedName()); - sb.append("<"); + sb.append(addWildcards ? " extendedInterfaces = Lists .newArrayList(AbstractServiceInterface.class.getCanonicalName()); @@ -207,47 +166,36 @@ public class TemplateFactory { Lists. newArrayList()); sieTemplate.setJavadoc(sie.getNullableDescription()); - if (sie.getNullableDescription() != null) + if (sie.getNullableDescription() != null) { sieTemplate.getAnnotations().add( Annotation.createDescriptionAnnotation(sie .getNullableDescription())); + } sieTemplate.getAnnotations().addAll(Annotation.createSieAnnotations(sie)); return sieTemplate; } public static AbstractFactoryTemplate abstractFactoryTemplateFromMbe( - ModuleMXBeanEntry mbe) { + final ModuleMXBeanEntry mbe) { AbstractFactoryAttributesProcessor attrProcessor = new AbstractFactoryAttributesProcessor(); attrProcessor.processAttributes(mbe.getAttributes(), mbe.getPackageName()); - Collection transformed = Collections2.transform(mbe - .getProvidedServices().keySet(), - new Function() { - @Override - public String apply(String input) { - return input + ".class"; - } - }); return new AbstractFactoryTemplate(getHeaderFromEntry(mbe), mbe.getPackageName(), mbe.getAbstractFactoryName(), - mbe.getGloballyUniqueName(), mbe.getFullyQualifiedName(mbe - .getStubModuleName()), attrProcessor.getFields(), - Lists.newArrayList(transformed), mbe); + attrProcessor.getFields() + ); } public static AbstractModuleTemplate abstractModuleTemplateFromMbe( - ModuleMXBeanEntry mbe) { - AbstractModuleAttributesProcessor attrProcessor = new AbstractModuleAttributesProcessor(); - attrProcessor.processAttributes(mbe.getAttributes(), - mbe.getPackageName()); + final ModuleMXBeanEntry mbe) { + AbstractModuleAttributesProcessor attrProcessor = new AbstractModuleAttributesProcessor(mbe.getAttributes()); List moduleFields = attrProcessor.getModuleFields(); List implementedIfcs = Lists.newArrayList( - Module.class.getCanonicalName(), mbe.getFullyQualifiedName(mbe.getMXBeanInterfaceName())); for (String implementedService : mbe.getProvidedServices().keySet()) { @@ -269,36 +217,32 @@ public class TemplateFactory { .getCanonicalName()); } + List extendedClasses = Collections.singletonList(AbstractModule.class.getCanonicalName() + "<" + mbe.getAbstractModuleName() + ">"); + AbstractModuleTemplate abstractModuleTemplate = new AbstractModuleTemplate( getHeaderFromEntry(mbe), mbe.getPackageName(), - mbe.getAbstractModuleName(), implementedIfcs, moduleFields, + mbe.getAbstractModuleName(), extendedClasses, implementedIfcs, moduleFields, attrProcessor.getMethods(), generateRuntime, registratorFullyQualifiedName); - if (mbe.getNullableDescription() != null) + if (mbe.getNullableDescription() != null) { abstractModuleTemplate.getAnnotations().add( Annotation.createDescriptionAnnotation(mbe .getNullableDescription())); + } return abstractModuleTemplate; } public static StubFactoryTemplate stubFactoryTemplateFromMbe( - ModuleMXBeanEntry mbe) { + final ModuleMXBeanEntry mbe) { return new StubFactoryTemplate(getHeaderFromEntry(mbe), mbe.getPackageName(), mbe.getStubFactoryName(), - mbe.getFullyQualifiedName(mbe.getAbstractFactoryName()), - mbe.getStubModuleName()); - } - - public static StubModuleTemplate stubModuleTemplateFromMbe( - ModuleMXBeanEntry mbe) { - return new StubModuleTemplate(getHeaderFromEntry(mbe), - mbe.getPackageName(), mbe.getStubModuleName(), - mbe.getFullyQualifiedName(mbe.getAbstractModuleName())); + mbe.getFullyQualifiedName(mbe.getAbstractFactoryName()) + ); } public static GeneralInterfaceTemplate mXBeanInterfaceTemplateFromMbe( - ModuleMXBeanEntry mbe) { + final ModuleMXBeanEntry mbe) { MXBeanInterfaceAttributesProcessor attrProcessor = new MXBeanInterfaceAttributesProcessor(); attrProcessor.processAttributes(mbe.getAttributes()); GeneralInterfaceTemplate ifcTemplate = new GeneralInterfaceTemplate( @@ -310,7 +254,7 @@ public class TemplateFactory { } public static Map tOsFromMbe( - ModuleMXBeanEntry mbe) { + final ModuleMXBeanEntry mbe) { Map retVal = Maps.newHashMap(); TOAttributesProcessor processor = new TOAttributesProcessor(); processor.processAttributes(mbe.getAttributes()); @@ -331,7 +275,7 @@ public class TemplateFactory { } public static Map tOsFromRbe( - RuntimeBeanEntry rbe) { + final RuntimeBeanEntry rbe) { Map retVal = Maps.newHashMap(); TOAttributesProcessor processor = new TOAttributesProcessor(); Map yangPropertiesToTypesMap = Maps.newHashMap(rbe.getYangPropertiesToTypesMap()); @@ -340,12 +284,15 @@ public class TemplateFactory { for (Rpc rpc : rbe.getRpcs()) { AttributeIfc returnType = rpc.getReturnType(); - if (returnType == VoidAttribute.getInstance()) + if (returnType == VoidAttribute.getInstance()) { continue; - if (returnType instanceof JavaAttribute) + } + if (returnType instanceof JavaAttribute) { continue; - if (returnType instanceof ListAttribute && returnType.getOpenType() instanceof SimpleType) + } + if (returnType instanceof ListAttribute && returnType.getOpenType() instanceof SimpleType) { continue; + } Preconditions.checkState(yangPropertiesToTypesMap.containsKey(returnType.getAttributeYangName()) == false, "Duplicate TO %s for %s", returnType.getAttributeYangName(), rbe); @@ -369,7 +316,7 @@ public class TemplateFactory { return retVal; } - private static Header getHeaderFromEntry(AbstractEntry mbe) { + private static Header getHeaderFromEntry(final AbstractEntry mbe) { return new Header(mbe.getYangModuleName(), mbe.getYangModuleLocalname()); } @@ -379,7 +326,7 @@ public class TemplateFactory { private final List tos = Lists.newArrayList(); - void processAttributes(Map attributes) { + void processAttributes(final Map attributes) { for (Entry attrEntry : attributes.entrySet()) { AttributeIfc attributeIfc = attrEntry.getValue(); if (attributeIfc instanceof TOAttribute) { @@ -395,7 +342,7 @@ public class TemplateFactory { } } - private void createTOInternal(TOAttribute toAttribute) { + private void createTOInternal(final TOAttribute toAttribute) { Map attrs = toAttribute.getCapitalizedPropertiesToTypesMap(); // recursive processing of TO's attributes @@ -413,38 +360,54 @@ public class TemplateFactory { private List fields; private List methods; - public TOInternal(Type type, Map attrs) { + public TOInternal(final Type type, final Map attrs) { this(type.getFullyQualifiedName(), type.getName(), attrs, type.getPackageName()); } - public TOInternal(String fullyQualifiedName, String name, - Map attrs, String packageName) { + public TOInternal(final String fullyQualifiedName, final String name, + final Map attrs, final String packageName) { this.fullyQualifiedName = fullyQualifiedName; this.name = name; processAttrs(attrs, packageName); } - private void processAttrs(Map attrs, String packageName) { + private final static String dependencyResolverVarName = "dependencyResolver"; + private final static String dependencyResolverInjectMethodName = "injectDependencyResolver"; + + private void processAttrs(final Map attrs, final String packageName) { fields = Lists.newArrayList(); methods = Lists.newArrayList(); + // FIXME conflict if "dependencyResolver" field from yang + Field depRes = new Field(DependencyResolver.class.getName(), dependencyResolverVarName); + fields.add(depRes); + methods.add(new MethodDefinition("void", dependencyResolverInjectMethodName, Lists.newArrayList(depRes), + "this." + dependencyResolverVarName + " = " + dependencyResolverVarName + ";")); + for (Entry attrEntry : attrs.entrySet()) { String innerName = attrEntry.getKey(); - String varName = BindingGeneratorUtil - .parseToValidParamName(attrEntry.getKey()); + String varName = BindingMapping.getPropertyName(attrEntry.getKey()); String fullyQualifiedName, nullableDefault = null; if (attrEntry.getValue() instanceof TypedAttribute) { Type type = ((TypedAttribute) attrEntry.getValue()).getType(); - fullyQualifiedName = serializeType(type); if(attrEntry.getValue() instanceof JavaAttribute) { nullableDefault = ((JavaAttribute)attrEntry.getValue()).getNullableDefaultWrappedForCode(); + if(((JavaAttribute)attrEntry.getValue()).isIdentityRef()) { + + String fieldType = serializeType(type, true); + String innerType = getInnerTypeFromIdentity(type); + methods.add(new MethodDefinition(fieldType, "resolve" + attrEntry.getKey(), Collections.emptyList(), + "return " + varName + ".resolveIdentity(" + dependencyResolverVarName + "," + innerType + ".class);")); + type = identityRefType; + } } + fullyQualifiedName = serializeType(type); } else { fullyQualifiedName = FullyQualifiedNameHelper .getFullyQualifiedName(packageName, attrEntry.getValue().getUpperCaseCammelCase()); } - fields.add(new Field(fullyQualifiedName, varName, nullableDefault)); + fields.add(new Field(fullyQualifiedName, varName, nullableDefault, needsDepResolver(attrEntry.getValue()))); String getterName = "get" + innerName; MethodDefinition getter = new MethodDefinition( @@ -461,6 +424,43 @@ public class TemplateFactory { methods.add(setter); } + // Add hashCode + final MethodDefinition hashCode = getHash(attrs); + methods.add(hashCode); + + // Add equals + final MethodDefinition equals = getEquals(attrs); + methods.add(equals); + } + + private MethodDefinition getEquals(final Map attrs) { + final StringBuilder equalsBodyBuilder = new StringBuilder( + " if (this == o) return true;\n" + + " if (o == null || getClass() != o.getClass()) return false;\n"); + equalsBodyBuilder.append(String.format( + " final %s that = (%s) o;\n", name, name)); + for (AttributeIfc s : attrs.values()) { + equalsBodyBuilder.append(String.format( + " if(java.util.Objects.equals(%1$s, that.%1$s) == false) {\n" + + " return false;\n" + + " }\n\n", s.getLowerCaseCammelCase())); + } + equalsBodyBuilder.append( + " return true;\n"); + return new MethodDefinition("boolean", "equals", Collections.singletonList(new Field("Object", "o")), + Collections.singletonList(new Annotation("Override", Collections.emptyList())), equalsBodyBuilder.toString()); + } + + private MethodDefinition getHash(final Map attrs) { + final StringBuilder hashBodyBuilder = new StringBuilder( + " return java.util.Objects.hash("); + for (AttributeIfc s : attrs.values()) { + hashBodyBuilder.append(s.getLowerCaseCammelCase()); + hashBodyBuilder.append(", "); + } + hashBodyBuilder.replace(hashBodyBuilder.length() - 2, hashBodyBuilder.length(), ");\n"); + return new MethodDefinition("int", "hashCode", Collections.emptyList(), + Collections.singletonList(new Annotation("Override", Collections.emptyList())), hashBodyBuilder.toString()); } String getType() { @@ -481,10 +481,11 @@ public class TemplateFactory { } } + private static class MXBeanInterfaceAttributesProcessor { private final List methods = Lists.newArrayList(); - void processAttributes(Map attributes) { + void processAttributes(final Map attributes) { for (Entry attrEntry : attributes.entrySet()) { String returnType; AttributeIfc attributeIfc = attrEntry.getValue(); @@ -492,6 +493,11 @@ public class TemplateFactory { if (attributeIfc instanceof TypedAttribute) { TypedAttribute typedAttribute = (TypedAttribute) attributeIfc; returnType = serializeType(typedAttribute.getType()); + + if (attributeIfc instanceof JavaAttribute && ((JavaAttribute)attrEntry.getValue()).isIdentityRef()) { + returnType = serializeType(identityRefType); + } + } else { throw new UnsupportedOperationException( "Attribute not supported: " @@ -503,13 +509,13 @@ public class TemplateFactory { MethodDeclaration getter = new MethodDeclaration(returnType, getterName, Collections. emptyList()); - String varName = BindingGeneratorUtil - .parseToValidParamName(attrEntry.getKey()); + String varName = BindingMapping.getPropertyName(attrEntry.getKey()); String setterName = "set" + attributeIfc.getUpperCaseCammelCase(); MethodDeclaration setter = new MethodDeclaration("void", setterName, Lists.newArrayList(new Field(returnType, varName))); + methods.add(getter); methods.add(setter); @@ -525,13 +531,31 @@ public class TemplateFactory { } } + private static final Type identityRefType = new Type() { + public final Class IDENTITY_ATTRIBUTE_REF_CLASS = IdentityAttributeRef.class; + + @Override + public String getPackageName() { + return IDENTITY_ATTRIBUTE_REF_CLASS.getPackage().getName(); + } + + @Override + public String getName() { + return IDENTITY_ATTRIBUTE_REF_CLASS.getSimpleName(); + } + + @Override + public String getFullyQualifiedName() { + return IDENTITY_ATTRIBUTE_REF_CLASS.getName(); + } + }; + private static class AbstractFactoryAttributesProcessor { private final List fields = Lists.newArrayList(); - private static final String STRING_FULLY_QUALIFIED_NAME = "java.util.List"; - void processAttributes(Map attributes, - String packageName) { + void processAttributes(final Map attributes, + final String packageName) { for (Entry attrEntry : attributes.entrySet()) { String type; String nullableDefaultWrapped = null; @@ -540,27 +564,6 @@ public class TemplateFactory { if (attributeIfc instanceof TypedAttribute) { TypedAttribute typedAttribute = (TypedAttribute) attributeIfc; type = serializeType(typedAttribute.getType()); - } else if (attributeIfc instanceof TOAttribute) { - String fullyQualifiedName = FullyQualifiedNameHelper - .getFullyQualifiedName(packageName, attributeIfc.getUpperCaseCammelCase()); - - type = fullyQualifiedName; - } else if (attributeIfc instanceof ListAttribute) { //FIXME: listAttribute might extend TypedAttribute - String fullyQualifiedName = null; - AttributeIfc innerAttr = ((ListAttribute) attributeIfc) - .getInnerAttribute(); - if (innerAttr instanceof JavaAttribute) { - fullyQualifiedName = ((JavaAttribute) innerAttr) - .getType().getFullyQualifiedName(); - nullableDefaultWrapped = ((JavaAttribute) innerAttr).getNullableDefaultWrappedForCode(); - } else if (innerAttr instanceof TOAttribute) { - fullyQualifiedName = FullyQualifiedNameHelper - .getFullyQualifiedName(packageName, innerAttr.getUpperCaseCammelCase()); - } - - type = STRING_FULLY_QUALIFIED_NAME.concat("<") - .concat(fullyQualifiedName).concat(">"); - } else { throw new UnsupportedOperationException( "Attribute not supported: " @@ -578,45 +581,42 @@ public class TemplateFactory { } private static class AbstractModuleAttributesProcessor { + private static class Holder { + private final List moduleFields; + private final List methods; - private static final String STRING_FULLY_QUALIFIED_NAME = "java.util.List"; + private Holder(final List moduleFields, final List methods) { + this.moduleFields = Collections.unmodifiableList(moduleFields); + this.methods = Collections.unmodifiableList(methods); + } + } - private final List moduleFields = Lists.newArrayList(); - private final List methods = Lists.newArrayList(); + private final Holder holder; + + + private AbstractModuleAttributesProcessor(final Map attributes) { + this.holder = processAttributes(attributes); + } - void processAttributes(Map attributes, - String packageName) { + private static Holder processAttributes(final Map attributes) { + List moduleFields = new ArrayList<>(); + List methods = new ArrayList<>(); for (Entry attrEntry : attributes.entrySet()) { String type, nullableDefaultWrapped = null; AttributeIfc attributeIfc = attrEntry.getValue(); + boolean isIdentity = false; + boolean needsDepResolver = needsDepResolver(attrEntry.getValue()); if (attributeIfc instanceof TypedAttribute) { TypedAttribute typedAttribute = (TypedAttribute) attributeIfc; type = serializeType(typedAttribute.getType()); if (attributeIfc instanceof JavaAttribute) { nullableDefaultWrapped = ((JavaAttribute) attributeIfc).getNullableDefaultWrappedForCode(); + if(((JavaAttribute)attrEntry.getValue()).isIdentityRef()) { + isIdentity = true; + type = serializeType(typedAttribute.getType(), true); + } } - - } else if (attributeIfc instanceof TOAttribute) { - String fullyQualifiedName = FullyQualifiedNameHelper - .getFullyQualifiedName(packageName, attributeIfc.getUpperCaseCammelCase()); - - type = fullyQualifiedName; - } else if (attributeIfc instanceof ListAttribute) { - String fullyQualifiedName = null; - AttributeIfc innerAttr = ((ListAttribute) attributeIfc) - .getInnerAttribute(); - if (innerAttr instanceof JavaAttribute) { - fullyQualifiedName = ((JavaAttribute) innerAttr) - .getType().getFullyQualifiedName(); - nullableDefaultWrapped = ((JavaAttribute) innerAttr).getNullableDefaultWrappedForCode(); - } else if (innerAttr instanceof TOAttribute) { - fullyQualifiedName = FullyQualifiedNameHelper - .getFullyQualifiedName(packageName, innerAttr.getUpperCaseCammelCase()); - } - - type = STRING_FULLY_QUALIFIED_NAME.concat("<") - .concat(fullyQualifiedName).concat(">"); } else { throw new UnsupportedOperationException( "Attribute not supported: " @@ -642,17 +642,50 @@ public class TemplateFactory { } } - String varName = BindingGeneratorUtil - .parseToValidParamName(attrEntry.getKey()); - moduleFields.add(new ModuleField(type, varName, attributeIfc - .getUpperCaseCammelCase(), nullableDefaultWrapped, isDependency, dependency, isListOfDependencies)); + String varName = BindingMapping.getPropertyName(attrEntry.getKey()); + + ModuleField field; + if (isIdentity) { + String identityBaseClass = getInnerTypeFromIdentity(((TypedAttribute) attributeIfc).getType()); + IdentityRefModuleField identityField = new IdentityRefModuleField(type, varName, + attributeIfc.getUpperCaseCammelCase(), identityBaseClass); + + String getterName = "get" + + attributeIfc.getUpperCaseCammelCase() + "Identity"; + MethodDefinition additionalGetter = new MethodDefinition(type, getterName, Collections. emptyList(), + Collections. emptyList(), "return " + identityField.getIdentityClassName() + + ";"); + methods.add(additionalGetter); + + String setterName = "set" + + attributeIfc.getUpperCaseCammelCase(); + + String setterBody = "this." + identityField.getIdentityClassName() + " = " + identityField.getIdentityClassName() + ";"; + MethodDefinition additionalSetter = new MethodDefinition("void", + setterName, + Lists.newArrayList(new Field(type, identityField.getIdentityClassName())), + Collections. emptyList(), setterBody); + additionalSetter.setJavadoc(attributeIfc.getNullableDescription()); + + methods.add(additionalSetter); + + type = serializeType(identityRefType); + field = identityField; + } else { + field = new ModuleField(type, varName, attributeIfc.getUpperCaseCammelCase(), + nullableDefaultWrapped, isDependency, dependency, isListOfDependencies, needsDepResolver); + } + moduleFields.add(field); + String getterName = "get" + attributeIfc.getUpperCaseCammelCase(); MethodDefinition getter = new MethodDefinition(type, getterName, Collections. emptyList(), Lists.newArrayList(overrideAnnotation), "return " - + varName + ";"); + + varName + ";"); + + methods.add(getter); String setterName = "set" + attributeIfc.getUpperCaseCammelCase(); @@ -674,19 +707,38 @@ public class TemplateFactory { annotations, setterBody); setter.setJavadoc(attributeIfc.getNullableDescription()); - methods.add(getter); methods.add(setter); } + return new Holder(moduleFields, methods); } List getModuleFields() { - return moduleFields; + return holder.moduleFields; } List getMethods() { - return methods; + return holder.methods; } } + + private static boolean needsDepResolver(final AttributeIfc value) { + if(value instanceof TOAttribute) { + return true; + } + if(value instanceof ListAttribute) { + AttributeIfc innerAttribute = ((ListAttribute) value).getInnerAttribute(); + return needsDepResolver(innerAttribute); + } + + return false; + } + + private static String getInnerTypeFromIdentity(final Type type) { + Preconditions.checkArgument(type instanceof ParameterizedType); + Type[] args = ((ParameterizedType) type).getActualTypeArguments(); + Preconditions.checkArgument(args.length ==1); + return serializeType(args[0]); + } }