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}