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.as3.reflect;
024    
025    import java.io.IOException;
026    import java.net.URL;
027    import java.util.ArrayList;
028    import java.util.Collection;
029    import java.util.Collections;
030    import java.util.List;
031    
032    import org.granite.generator.as3.ClientType;
033    import org.granite.generator.as3.PropertyType;
034    import org.granite.util.ClassUtil;
035    import org.granite.util.PropertyDescriptor;
036    import org.granite.util.URIUtil;
037    
038    /**
039     * @author Franck WOLFF
040     */
041    public abstract class JavaAbstractType implements JavaType {
042    
043        ///////////////////////////////////////////////////////////////////////////
044        // Generation type.
045            
046            public static enum GenerationType {
047                    NOT_GENERATED,
048                    GENERATED_SINGLE,
049                    GENERATED_WITH_BASE
050            }
051    
052        ///////////////////////////////////////////////////////////////////////////
053        // Fields.
054    
055        protected final JavaTypeFactory provider;
056        protected final Class<?> type;
057        protected final URL url;
058        protected final ClientType clientType;
059        protected final Kind kind;
060        protected final GenerationType generationType;
061    
062        private long lastModified = Long.MIN_VALUE;
063    
064        ///////////////////////////////////////////////////////////////////////////
065        // Constructor.
066    
067        protected JavaAbstractType(JavaTypeFactory provider, Class<?> type, URL url) {
068            this(provider, type, url, PropertyType.SIMPLE);
069        }
070        
071        protected JavaAbstractType(JavaTypeFactory provider, Class<?> type, URL url, PropertyType propertyType) {
072            if (provider == null || type == null)
073                throw new IllegalArgumentException("Parameter provider and type cannot be null");
074    
075            this.provider = provider;
076            this.type = type;
077            this.url = url;
078            this.clientType = provider.getClientType(type, null, null, propertyType);
079            this.kind = provider.getKind(type);
080            this.generationType = provider.getGenerationType(kind, type);
081        }
082    
083        ///////////////////////////////////////////////////////////////////////////
084        // Properties.
085    
086        protected JavaTypeFactory getProvider() {
087            return provider;
088        }
089    
090        @Override
091            public Class<?> getType() {
092            return type;
093        }
094    
095            @Override
096            public String getName() {
097            if (type.isMemberClass())
098                    return type.getEnclosingClass().getSimpleName() + '$' + type.getSimpleName();
099            return type.getSimpleName();
100        }
101    
102        @Override
103            public Package getPackage() {
104            return type.getPackage();
105        }
106    
107        @Override
108            public String getPackageName() {
109            return (type.getPackage() != null ? type.getPackage().getName() : "");
110        }
111    
112        public String getQualifiedName() {
113            if (type.getPackage() == null)
114                return getName();
115            return new StringBuilder().append(getPackageName()).append('.').append(getName()).toString();
116        }
117    
118        @Override
119            public URL getUrl() {
120            return url;
121        }
122    
123        @Override
124            public boolean isBean() {
125                    return kind == Kind.BEAN;
126            }
127    
128            @Override
129            public boolean isEntity() {
130                    return kind == Kind.ENTITY;
131            }
132    
133            @Override
134            public boolean isEnum() {
135                    return kind == Kind.ENUM;
136            }
137    
138            @Override
139            public boolean isInterface() {
140                    return kind == Kind.INTERFACE;
141            }
142            
143            @Override
144            public boolean isRemoteDestination() {
145                    return kind == Kind.REMOTE_DESTINATION;
146            }
147    
148            @Override
149            public boolean isGenerated() {
150                    return generationType != GenerationType.NOT_GENERATED;
151            }
152    
153            @Override
154            public boolean isWithBase() {
155                    return generationType == GenerationType.GENERATED_WITH_BASE;
156            }
157    
158            @Override
159            public GenerationType getGenerationType() {
160                    return generationType;
161            }
162    
163            @Override
164            public Kind getKind() {
165                    return kind;
166            }
167    
168            @Override
169            public long getLastModified() {
170            if (lastModified == Long.MIN_VALUE) {
171                try {
172                    lastModified = URIUtil.lastModified(url);
173                } catch (IOException e) {
174                    lastModified = -1L;
175                }
176            }
177            return lastModified;
178        }
179    
180        public ClientType getAs3Type() {
181            return clientType;
182        }
183    
184        @Override
185            public ClientType getClientType() {
186            return clientType;
187        }
188    
189        ///////////////////////////////////////////////////////////////////////////
190        // Utility.
191    
192        protected <T extends Collection<?>> T removeNull(T coll) {
193            coll.remove(null);
194            return coll;
195        }
196    
197        protected PropertyDescriptor[] getPropertyDescriptors(Class<?> type) {
198            PropertyDescriptor[] propertyDescriptors = ClassUtil.getProperties(type);
199            return (propertyDescriptors != null ? propertyDescriptors : new PropertyDescriptor[0]);
200        }
201    
202        protected List<JavaProperty> getSortedUnmodifiableList(Collection<JavaProperty> coll) {
203            List<JavaProperty> list = (coll instanceof List<?> ? (List<JavaProperty>)coll : new ArrayList<JavaProperty>(coll));
204            Collections.sort(list);
205            return Collections.unmodifiableList(list);
206        }
207    }