blob: c7d4583afc412f0af5d07628d4a6f7d62b9e9de0 [file] [log] [blame]
Vinod Kumar S38046502016-03-23 15:30:27 +05301/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Vinod Kumar S38046502016-03-23 15:30:27 +05303 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.yangutils.translator.tojava;
18
Bharat saraswal96dfef02016-06-16 00:29:12 +053019import java.io.Serializable;
Vinod Kumar S38046502016-03-23 15:30:27 +053020import java.util.Objects;
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +053021
Vinod Kumar S38046502016-03-23 15:30:27 +053022import org.onosproject.yangutils.datamodel.YangNode;
Bharat saraswal6ef0b762016-04-05 12:45:45 +053023import org.onosproject.yangutils.translator.exception.TranslatorException;
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +053024import org.onosproject.yangutils.translator.tojava.javamodel.JavaLeafInfoContainer;
Gaurav Agrawal8a5af142016-06-15 13:58:01 +053025import org.onosproject.yangutils.translator.tojava.javamodel.AttributesJavaDataType;
26import org.onosproject.yangutils.utils.io.impl.YangToJavaNamingConflictUtil;
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +053027
Vinod Kumar S38046502016-03-23 15:30:27 +053028import com.google.common.base.MoreObjects;
29
Gaurav Agrawal8a5af142016-06-15 13:58:01 +053030import static org.onosproject.yangutils.translator.tojava.javamodel.AttributesJavaDataType.getJavaImportClass;
31import static org.onosproject.yangutils.translator.tojava.javamodel.AttributesJavaDataType.getJavaImportPackage;
Gaurav Agrawal338735b2016-04-18 18:53:11 +053032
Vinod Kumar S38046502016-03-23 15:30:27 +053033/**
Bharat saraswald9822e92016-04-05 15:13:44 +053034 * Represents the information about individual imports in the generated file.
Vinod Kumar S38046502016-03-23 15:30:27 +053035 */
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +053036public class JavaQualifiedTypeInfo
Bharat saraswal96dfef02016-06-16 00:29:12 +053037 implements Comparable<JavaQualifiedTypeInfo>, Serializable {
38
39 private static final long serialVersionUID = 806201634L;
40
Vinod Kumar S38046502016-03-23 15:30:27 +053041 /**
42 * Package location where the imported class/interface is defined.
43 */
44 private String pkgInfo;
45
46 /**
47 * Class/interface being referenced.
48 */
49 private String classInfo;
50
51 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053052 * Creates a java qualified type info object.
Vinod Kumar S38046502016-03-23 15:30:27 +053053 */
54 public JavaQualifiedTypeInfo() {
55 }
56
57 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053058 * Returns the imported package info.
Vinod Kumar S38046502016-03-23 15:30:27 +053059 *
60 * @return the imported package info
61 */
62 public String getPkgInfo() {
Vinod Kumar S38046502016-03-23 15:30:27 +053063 return pkgInfo;
64 }
65
66 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053067 * Sets the imported package info.
Vinod Kumar S38046502016-03-23 15:30:27 +053068 *
69 * @param pkgInfo the imported package info
70 */
71 public void setPkgInfo(String pkgInfo) {
Vinod Kumar S38046502016-03-23 15:30:27 +053072 this.pkgInfo = pkgInfo;
73 }
74
75 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053076 * Returns the imported class/interface info.
Vinod Kumar S38046502016-03-23 15:30:27 +053077 *
78 * @return the imported class/interface info
79 */
80 public String getClassInfo() {
Vinod Kumar S38046502016-03-23 15:30:27 +053081 return classInfo;
82 }
83
84 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053085 * Sets the imported class/interface info.
Vinod Kumar S38046502016-03-23 15:30:27 +053086 *
87 * @param classInfo the imported class/interface info
88 */
89 public void setClassInfo(String classInfo) {
Vinod Kumar S38046502016-03-23 15:30:27 +053090 this.classInfo = classInfo;
91 }
92
93 /**
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +053094 * Updates the leaf's java information.
Vinod Kumar S38046502016-03-23 15:30:27 +053095 *
Bharat saraswal33dfa012016-05-17 19:59:16 +053096 * @param leaf leaf whose java information is being updated
Vinod Kumar S38046502016-03-23 15:30:27 +053097 */
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +053098 public static void updateLeavesJavaQualifiedInfo(JavaLeafInfoContainer leaf) {
Vinod Kumar S38046502016-03-23 15:30:27 +053099
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530100 JavaQualifiedTypeInfo importInfo = leaf.getJavaQualifiedInfo();
Vinod Kumar S38046502016-03-23 15:30:27 +0530101
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530102 if (leaf.getDataType() == null) {
103 throw new TranslatorException("missing data type of leaf " + leaf.getName());
Vinod Kumar S38046502016-03-23 15:30:27 +0530104 }
105
106 /*
107 * Current leaves holder is adding a leaf info as a attribute to the
108 * current class.
109 */
janani bdd1314f2016-05-19 17:39:50 +0530110 String className = AttributesJavaDataType.getJavaImportClass(leaf.getDataType(), leaf.isLeafList(),
111 leaf.getConflictResolveConfig());
Vinod Kumar S38046502016-03-23 15:30:27 +0530112 if (className != null) {
113 /*
114 * Corresponding to the attribute type a class needs to be imported,
115 * since it can be a derived type or a usage of wrapper classes.
116 */
117 importInfo.setClassInfo(className);
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530118 String classPkg = AttributesJavaDataType.getJavaImportPackage(leaf.getDataType(),
Bharat saraswalcad0e652016-05-26 23:48:38 +0530119 leaf.isLeafList(), leaf.getConflictResolveConfig());
Vinod Kumar S38046502016-03-23 15:30:27 +0530120 if (classPkg == null) {
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530121 throw new TranslatorException("import package cannot be null when the class is used");
Vinod Kumar S38046502016-03-23 15:30:27 +0530122 }
123 importInfo.setPkgInfo(classPkg);
124 } else {
125 /*
126 * The attribute does not need a class to be imported, for example
127 * built in java types.
128 */
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530129 String dataTypeName = AttributesJavaDataType.getJavaDataType(leaf.getDataType());
Vinod Kumar S38046502016-03-23 15:30:27 +0530130 if (dataTypeName == null) {
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530131 throw new TranslatorException("not supported data type");
Vinod Kumar S38046502016-03-23 15:30:27 +0530132 }
133 importInfo.setClassInfo(dataTypeName);
134 }
Vinod Kumar S38046502016-03-23 15:30:27 +0530135 }
136
137 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530138 * Returns the import info for an attribute, which needs to be used for code
Vinod Kumar S38046502016-03-23 15:30:27 +0530139 * generation for import or for qualified access.
140 *
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530141 * @param curNode current data model node for which the java file is being
142 * generated
Vinod Kumar S38046502016-03-23 15:30:27 +0530143 * @param attributeName name of the attribute being added, it will used in
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530144 * import info for child class
Vinod Kumar S38046502016-03-23 15:30:27 +0530145 * @return return the import info for this attribute
146 */
147 public static JavaQualifiedTypeInfo getQualifiedTypeInfoOfCurNode(YangNode curNode,
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530148 String attributeName) {
Vinod Kumar S38046502016-03-23 15:30:27 +0530149
150 JavaQualifiedTypeInfo importInfo = new JavaQualifiedTypeInfo();
151
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530152 if (!(curNode instanceof JavaFileInfoContainer)) {
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530153 throw new TranslatorException("missing java file information to get the package details "
Vinod Kumar S38046502016-03-23 15:30:27 +0530154 + "of attribute corresponding to child node");
155 }
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530156
Vinod Kumar S38046502016-03-23 15:30:27 +0530157 importInfo.setClassInfo(attributeName);
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530158 importInfo.setPkgInfo(((JavaFileInfoContainer) curNode)
159 .getJavaFileInfo().getPackage());
Vinod Kumar S38046502016-03-23 15:30:27 +0530160
161 return importInfo;
162 }
163
164 /**
Gaurav Agrawal56527662016-04-20 15:49:17 +0530165 * Returns the java qualified type information for the wrapper classes.
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530166 *
167 * @param referredTypesAttrInfo attribute of referred type
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530168 * @param conflictResolver plugin configurations
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530169 * @return return the import info for this attribute
170 */
Bharat saraswal33dfa012016-05-17 19:59:16 +0530171 public static JavaQualifiedTypeInfo getQualifiedInfoOfFromString(JavaAttributeInfo referredTypesAttrInfo,
janani bdd1314f2016-05-19 17:39:50 +0530172 YangToJavaNamingConflictUtil conflictResolver) {
Bharat saraswalc0e04842016-05-12 13:16:57 +0530173
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530174 /*
175 * Get the java qualified type information for the wrapper classes and
176 * set it in new java attribute information.
177 */
178 JavaQualifiedTypeInfo qualifiedInfoOfFromString = new JavaQualifiedTypeInfo();
Bharat saraswal33dfa012016-05-17 19:59:16 +0530179
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530180 qualifiedInfoOfFromString.setClassInfo(
janani bdd1314f2016-05-19 17:39:50 +0530181 getJavaImportClass(referredTypesAttrInfo.getAttributeType(), true, conflictResolver));
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530182 qualifiedInfoOfFromString.setPkgInfo(
Bharat saraswalcad0e652016-05-26 23:48:38 +0530183 getJavaImportPackage(referredTypesAttrInfo.getAttributeType(), true, conflictResolver));
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530184 return qualifiedInfoOfFromString;
185 }
186
Vinod Kumar S38046502016-03-23 15:30:27 +0530187 @Override
188 public int hashCode() {
Vinod Kumar S38046502016-03-23 15:30:27 +0530189 return Objects.hash(pkgInfo, classInfo);
190 }
191
192 @Override
193 public boolean equals(Object obj) {
194
195 if (this == obj) {
196 return true;
197 }
198 if (obj instanceof JavaQualifiedTypeInfo) {
199 JavaQualifiedTypeInfo other = (JavaQualifiedTypeInfo) obj;
200 return Objects.equals(pkgInfo, other.pkgInfo) &&
201 Objects.equals(classInfo, other.classInfo);
202 }
203 return false;
204 }
205
206 /**
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530207 * Checks if the import info matches.
Vinod Kumar S38046502016-03-23 15:30:27 +0530208 *
209 * @param importInfo matched import
210 * @return if equal or not
211 */
212 public boolean exactMatch(JavaQualifiedTypeInfo importInfo) {
Vinod Kumar S38046502016-03-23 15:30:27 +0530213 return equals(importInfo)
214 && Objects.equals(pkgInfo, importInfo.getPkgInfo())
215 && Objects.equals(classInfo, importInfo.getClassInfo());
216 }
217
218 @Override
219 public String toString() {
Vinod Kumar S38046502016-03-23 15:30:27 +0530220 return MoreObjects.toStringHelper(getClass())
221 .add("pkgInfo", pkgInfo)
222 .add("classInfo", classInfo).toString();
223 }
224
225 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530226 * Checks that there is no 2 objects with the same class name.
Vinod Kumar S38046502016-03-23 15:30:27 +0530227 *
228 * @param other compared import info.
229 */
230 @Override
231 public int compareTo(JavaQualifiedTypeInfo other) {
Vinod Kumar S38046502016-03-23 15:30:27 +0530232 return getClassInfo().compareTo(other.getClassInfo());
233 }
234
235}