001 /**
002 * GRANITE DATA SERVICES
003 * Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S.
004 *
005 * This file is part of the Granite Data Services Platform.
006 *
007 * Granite Data Services is free software; you can redistribute it and/or
008 * modify it under the terms of the GNU Lesser General Public
009 * License as published by the Free Software Foundation; either
010 * version 2.1 of the License, or (at your option) any later version.
011 *
012 * Granite Data Services is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
015 * General Public License for more details.
016 *
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this library; if not, write to the Free Software
019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
020 * USA, or see <http://www.gnu.org/licenses/>.
021 */
022
023 package org.granite.generator.java;
024
025 import java.util.HashSet;
026 import java.util.List;
027 import java.util.Set;
028
029 import org.granite.generator.as3.ClientType;
030 import org.granite.generator.as3.PackageTranslator;
031
032 /**
033 * @author Franck WOLFF
034 */
035 public class JavaType implements ClientType {
036
037 ///////////////////////////////////////////////////////////////////////////
038 // Fields.
039
040 public static final JavaType BOOLEAN = new JavaType(null, "boolean", false);
041 public static final JavaType INT = new JavaType(null, "int", Integer.valueOf(0));
042 public static final JavaType LONG = new JavaType(null, "long", Long.valueOf(0));
043 public static final JavaType FLOAT = new JavaType(null, "float", Float.valueOf(0.0f));
044 public static final JavaType DOUBLE = new JavaType(null, "double", Double.valueOf(0.0));
045 public static final JavaType STRING = new JavaType(null, "String", null);
046
047 public static final JavaType PAGE_INFO = new JavaType("org.granite.tide.data.model", "PageInfo", null);
048 public static final JavaType SORT_INFO = new JavaType("org.granite.tide.data.model", "SortInfo", null);
049
050 private final String packageName;
051 private final String name;
052 private final String qualifiedName;
053 private final String propertyImplTypeName;
054 private final Object nullValue;
055 private final Set<String> imports = new HashSet<String>();
056
057 ///////////////////////////////////////////////////////////////////////////
058 // Constructors.
059
060 public JavaType(String packageName, String simpleName) {
061 this(packageName, simpleName, null, null);
062 }
063 public JavaType(String packageName, String name, Object nullValue) {
064 this(packageName, name, null, nullValue);
065 }
066 public JavaType(String packageName, String name, String propertyImplTypeName, Object nullValue) {
067 this.packageName = (packageName != null ? packageName : "");
068 this.name = name;
069 this.qualifiedName = (hasPackage() ? (packageName + '.' + name) : name);
070 this.nullValue = nullValue;
071 this.propertyImplTypeName = propertyImplTypeName;
072 if (hasPackage())
073 imports.add(ungenerify(qualifiedName));
074 if (propertyImplTypeName != null)
075 imports.add(ungenerify(propertyImplTypeName));
076 }
077
078 ///////////////////////////////////////////////////////////////////////////
079 // Properties.
080
081 @Override
082 public boolean hasPackage() {
083 return packageName.length() > 0;
084 }
085
086 @Override
087 public String getPackageName() {
088 return packageName;
089 }
090
091 @Override
092 public String getName() {
093 return name;
094 }
095
096 @Override
097 public String getQualifiedName() {
098 return qualifiedName;
099 }
100
101 public String getPropertyImplTypeName() {
102 return propertyImplTypeName;
103 }
104
105 public String getSimplePropertyImplTypeName() {
106 return propertyImplTypeName != null && propertyImplTypeName.indexOf(".") >= 0
107 ? propertyImplTypeName.substring(propertyImplTypeName.lastIndexOf(".")+1) : propertyImplTypeName;
108 }
109
110 @Override
111 public Object getNullValue() {
112 return nullValue;
113 }
114
115 public boolean isNumber() {
116 return false;
117 }
118
119 ///////////////////////////////////////////////////////////////////////////
120 // Methods
121
122 @Override
123 public Set<String> getImports() {
124 return imports;
125 }
126
127 @Override
128 public void addImports(Set<String> classNames) {
129 for (String className : classNames) {
130 if (className.indexOf(".") < 0 || className.startsWith("java.lang"))
131 continue;
132 imports.add(ungenerify(className));
133 }
134 }
135
136 private String ungenerify(String className) {
137 if (className.indexOf("<") >= 0)
138 return className.substring(0, className.indexOf("<"));
139 return className;
140 }
141
142 @Override
143 public JavaType toArrayType() {
144 return new JavaType(packageName, name + "[]", null);
145 }
146
147 @Override
148 public JavaType translatePackage(PackageTranslator translator) {
149 return new JavaType(translator.translate(packageName), getName(), getPropertyImplTypeName(), getNullValue());
150 }
151
152 @Override
153 public JavaType translatePackages(List<PackageTranslator> translators) {
154 boolean translate = false;
155
156 PackageTranslator translator = PackageTranslator.forPackage(translators, packageName);
157 String translatedPackageName = packageName;
158 if (translator != null) {
159 translate = true;
160 translatedPackageName = translator.translate(packageName);
161 }
162
163 Set<String> translatedImports = new HashSet<String>();
164 for (String imp : imports) {
165 translator = PackageTranslator.forPackage(translators, imp);
166 if (translator != null) {
167 translate = true;
168 translatedImports.add(translator.translate(imp));
169 }
170 else
171 translatedImports.add(imp);
172 }
173
174 if (!translate)
175 return this;
176
177 JavaType translatedType = new JavaType(translatedPackageName, getName(), getPropertyImplTypeName(), getNullValue());
178 translatedType.addImports(translatedImports);
179 return translatedType;
180 }
181
182 ///////////////////////////////////////////////////////////////////////////
183 // Utilities.
184
185 @Override
186 public int hashCode() {
187 return qualifiedName.hashCode();
188 }
189
190 @Override
191 public boolean equals(Object obj) {
192 if (obj == this)
193 return true;
194 if (!(obj instanceof JavaType))
195 return false;
196 return qualifiedName.equals(((JavaType)obj).qualifiedName);
197 }
198
199 @Override
200 public String toString() {
201 return qualifiedName;
202 }
203 }