2 * Copyright (c) 2018 Pantheon Technologies, s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.mdsal.binding.java.api.generator
10 import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.AUGMENTABLE_AUGMENTATION_NAME
11 import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.AUGMENTATION_FIELD
13 import com.google.common.base.MoreObjects
14 import java.util.Collection
15 import java.util.Collections
18 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty
19 import org.opendaylight.mdsal.binding.model.api.GeneratedType
20 import org.opendaylight.mdsal.binding.model.api.Type
21 import org.opendaylight.yangtools.yang.binding.CodeHelpers
22 import java.util.ArrayList
23 import org.opendaylight.mdsal.binding.model.util.Types
24 import org.opendaylight.yangtools.yang.binding.Identifiable
25 import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject
26 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping
27 import com.google.common.collect.ImmutableMap
28 import org.opendaylight.yangtools.yang.binding.AugmentationHolder
29 import java.util.HashMap
31 abstract class AbstractBuilderTemplate extends BaseTemplate {
33 * Generated property is set if among methods is found one with the name GET_AUGMENTATION_METHOD_NAME.
35 protected val Type augmentType
38 * Set of class attributes (fields) which are derived from the getter methods names.
40 protected val Set<GeneratedProperty> properties
43 * GeneratedType for key type, null if this type does not have a key.
45 protected val Type keyType
47 protected val GeneratedType targetType;
49 new(AbstractJavaGeneratedType javaType, GeneratedType type, GeneratedType targetType,
50 Set<GeneratedProperty> properties, Type augmentType, Type keyType) {
52 this.targetType = targetType
53 this.properties = properties
54 this.augmentType = augmentType
55 this.keyType = keyType
58 new(GeneratedType type, GeneratedType targetType, Set<GeneratedProperty> properties, Type augmentType,
61 this.targetType = targetType
62 this.properties = properties
63 this.augmentType = augmentType
64 this.keyType = keyType
68 * Template method which generates class attributes.
70 * @param makeFinal value which specify whether field is|isn't final
71 * @return string with class attributes and their types
73 def generateFields(boolean makeFinal) '''
74 «IF properties !== null»
76 private«IF makeFinal» final«ENDIF» «f.returnType.importedName» «f.fieldName»;
80 private«IF makeFinal» final«ENDIF» «keyType.importedName» key;
84 def generateAugmentField(boolean isPrivate) '''
85 «IF augmentType !== null»
86 «IF isPrivate»private «ENDIF»«Map.importedName»<«Class.importedName»<? extends «augmentType.importedName»>, «augmentType.importedName»> «AUGMENTATION_FIELD» = «Collections.importedName».emptyMap();
90 override generateToString(Collection<GeneratedProperty> properties) '''
91 «IF properties !== null»
92 @«Override.importedName»
93 public «String.importedName» toString() {
94 final «MoreObjects.importedName».ToStringHelper helper = «MoreObjects.importedName».toStringHelper("«targetType.name»");
95 «FOR property : properties»
96 «CodeHelpers.importedName».appendValue(helper, "«property.fieldName»", «property.fieldName»);
98 «IF augmentType !== null»
99 «CodeHelpers.importedName».appendValue(helper, "«AUGMENTATION_FIELD»", «AUGMENTATION_FIELD».values());
101 return helper.toString();
107 * Template method which generate getter methods for IMPL class.
109 * @return string with getter methods
111 def generateGetters(boolean addOverride) '''
112 «IF keyType !== null»
113 «IF addOverride»@«Override.importedName»«ENDIF»
114 public «keyType.importedName» «BindingMapping.IDENTIFIABLE_KEY_NAME»() {
119 «IF !properties.empty»
120 «FOR field : properties SEPARATOR '\n'»
121 «IF addOverride»@«Override.importedName»«ENDIF»
125 «IF augmentType !== null»
127 @SuppressWarnings("unchecked")
128 «IF addOverride»@«Override.importedName»«ENDIF»
129 public <E extends «augmentType.importedName»> E «AUGMENTABLE_AUGMENTATION_NAME»(«Class.importedName»<E> augmentationType) {
130 return (E) «AUGMENTATION_FIELD».get(«CodeHelpers.importedName».nonNullValue(augmentationType, "augmentationType"));
135 def CharSequence generateCopyConstructor(boolean impl, Type fromType, Type implType) '''
136 «IF impl»private«ELSE»public«ENDIF» «type.name»(«fromType.importedName» base) {
137 «val allProps = new ArrayList(properties)»
138 «val isList = implementsIfc(targetType, Types.parameterizedTypeFor(Types.typeForClass(Identifiable), targetType))»
139 «IF isList && keyType !== null»
140 «val keyProps = new ArrayList((keyType as GeneratedTransferObject).properties)»
141 «Collections.sort(keyProps, [ p1, p2 | return p1.name.compareTo(p2.name) ])»
142 «FOR field : keyProps»
143 «removeProperty(allProps, field.name)»
145 if (base.«BindingMapping.IDENTIFIABLE_KEY_NAME»() == null) {
146 this.key = new «keyType.importedName»(
147 «FOR keyProp : keyProps SEPARATOR ", "»
148 base.«keyProp.getterMethodName»()
151 «FOR field : keyProps»
152 this.«field.fieldName» = base.«field.getterMethodName»();
155 this.key = base.«BindingMapping.IDENTIFIABLE_KEY_NAME»();
156 «FOR field : keyProps»
157 this.«field.fieldName» = key.«field.getterMethodName»();
161 «FOR field : allProps»
162 this.«field.fieldName» = base.«field.getterMethodName»();
164 «IF augmentType !== null»
166 this.«AUGMENTATION_FIELD» = «ImmutableMap.importedName».copyOf(base.«AUGMENTATION_FIELD»);
168 if (base instanceof «implType.importedName») {
169 «implType.importedName» impl = («implType.importedName») base;
170 if (!impl.«AUGMENTATION_FIELD».isEmpty()) {
171 this.«AUGMENTATION_FIELD» = new «HashMap.importedName»<>(impl.«AUGMENTATION_FIELD»);
173 } else if (base instanceof «AugmentationHolder.importedName») {
174 @SuppressWarnings("unchecked")
175 «AugmentationHolder.importedName»<«fromType.importedName»> casted =(«AugmentationHolder.importedName»<«fromType.importedName»>) base;
176 if (!casted.augmentations().isEmpty()) {
177 this.«AUGMENTATION_FIELD» = new «HashMap.importedName»<>(casted.augmentations());
185 private def boolean implementsIfc(GeneratedType type, Type impl) {
186 for (Type ifc : type.implements) {
187 if (ifc.equals(impl)) {
194 private def void removeProperty(Collection<GeneratedProperty> props, String name) {
195 var GeneratedProperty toRemove = null
197 if (p.name.equals(name)) {
201 if (toRemove !== null) {
202 props.remove(toRemove);