001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.xbean.spring.generator;
018    
019    import java.util.Set;
020    import java.util.HashSet;
021    import java.util.Collections;
022    
023    /**
024     * @author Dain Sundstrom
025     * @version $Id$
026     * @since 1.0
027     */
028    public class Type {
029        private final String name;
030        private final Type nestedType;
031        private final boolean primitive;
032    
033        public static Type newSimpleType(String name) {
034            if (name == null) throw new NullPointerException("type");
035            if (name.indexOf("[") >= 0 || name.indexOf("]") >= 0) {
036                throw new IllegalArgumentException("Name can not contain '[' or ']' " + name);
037            }
038            return new Type(name, null);
039        }
040    
041        public static Type newArrayType(String type, int dimensions) {
042            if (type == null) throw new NullPointerException("type");
043            if (dimensions < 1) throw new IllegalArgumentException("dimensions must be atleast one");
044            StringBuffer buf = new StringBuffer(type.length() + (dimensions * 2));
045            buf.append(type);
046            for (int i = 0; i < dimensions; i ++) {
047                buf.append("[]");
048            }
049            return new Type(buf.toString(), newSimpleType(type));
050        }
051    
052        public static Type newCollectionType(String collectionType, Type elementType) {
053            if (collectionType == null) throw new NullPointerException("collectionType");
054            if (elementType == null) throw new NullPointerException("elementType");
055            return new Type(collectionType, elementType);
056        }
057    
058        private Type(String name, Type nestedType) {
059            this.name = name;
060            this.nestedType = nestedType;
061            primitive = (nestedType == null) && primitives.contains(name);
062        }
063    
064        public String getName() {
065            return name;
066        }
067    
068        public Type getNestedType() {
069            return nestedType;
070        }
071    
072        public boolean isCollection() {
073            return nestedType != null;
074        }
075    
076        public boolean isPrimitive() {
077            return primitive;
078        }
079    
080        public int hashCode() {
081            return super.hashCode();
082        }
083    
084        public boolean equals(Object obj) {
085            return super.equals(obj);
086        }
087    
088        private static final Set primitives;
089    
090        static {
091            Set set = new HashSet();
092            set.add("boolean");
093            set.add("byte");
094            set.add("char");
095            set.add("short");
096            set.add("int");
097            set.add("long");
098            set.add("float");
099            set.add("double");
100            primitives = Collections.unmodifiableSet(set);
101        }
102    }