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    }