001    // Copyright 2004, 2005 The Apache Software Foundation
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    //     http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    package org.apache.tapestry.enhance;
015    
016    import javassist.CtClass;
017    
018    import java.util.HashMap;
019    import java.util.Map;
020    
021    /**
022     * Common code for {@link org.apache.hivemind.service.impl.ClassFabImpl} and
023     * {@link org.apache.hivemind.service.impl.InterfaceFabImpl}.
024     * 
025     * @author Howard M. Lewis Ship
026     * @since 1.1
027     */
028    public class AbstractFab
029    {
030    
031        private final CtClass _ctClass;
032    
033        private final CtClassSource _source;
034    
035        /**
036         * Map from Class to CtClass.
037         * 
038         * @since 1.1
039         */
040        private Map _ctClassCache = new HashMap();
041        
042        public AbstractFab(CtClassSource source, CtClass ctClass)
043        {
044            _ctClass = ctClass;
045            _source = source;
046        }
047    
048        public void addInterface(Class interfaceClass)
049        {
050            CtClass ctInterfaceClass = _source.getCtClass(interfaceClass);
051    
052            _ctClass.addInterface(ctInterfaceClass);
053        }
054    
055        protected CtClass[] convertClasses(Class[] inputClasses)
056        {
057            if (inputClasses == null || inputClasses.length == 0)
058                return null;
059    
060            int count = inputClasses.length;
061            CtClass[] result = new CtClass[count];
062    
063            for (int i = 0; i < count; i++)
064            {
065                CtClass ctClass = convertClass(inputClasses[i]);
066    
067                result[i] = ctClass;
068            }
069    
070            return result;
071        }
072    
073        /**
074         * @since 1.1
075         */
076        protected CtClass convertClass(Class inputClass)
077        {
078            CtClass result = (CtClass) _ctClassCache.get(inputClass);
079    
080            if (result == null)
081            {
082                result = _source.getCtClass(inputClass);
083                _ctClassCache.put(inputClass, result);
084            }
085    
086            return result;
087        }
088    
089        public Class createClass()
090        {
091            return _source.createClass(_ctClass);
092        }
093    
094        public Class createClass(boolean detach)
095        {
096            return _source.createClass(_ctClass, detach);
097        }
098        
099        protected CtClass getCtClass()
100        {
101            return _ctClass;
102        }
103    
104        protected CtClassSource getSource()
105        {
106            return _source;
107        }
108    
109    }