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 023package org.granite.generator.java; 024 025import java.util.HashSet; 026import java.util.List; 027import java.util.Set; 028 029import org.granite.generator.as3.ClientType; 030import org.granite.generator.as3.PackageTranslator; 031 032/** 033 * @author Franck WOLFF 034 */ 035public 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}