001 // Copyright 2005, 2006, 2007, 2008 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
015 package org.apache.tapestry5.ioc.internal.services;
016
017 import javassist.CtClass;
018 import org.apache.tapestry5.ioc.internal.util.OneShotLock;
019 import org.slf4j.Logger;
020
021 /**
022 * Base class for {@link org.apache.tapestry5.ioc.internal.services.ClassFabImpl}. This code is a fork from HiveMind; it
023 * is kept seperate from ClassFabImpl in case we want to re-introduce the idea of an InterfaceFab.
024 */
025 public class AbstractFab
026 {
027 protected final OneShotLock lock = new OneShotLock();
028
029 private final CtClass ctClass;
030
031 private final CtClassSource source;
032
033 private final Logger logger;
034
035 public AbstractFab(CtClassSource source, CtClass ctClass, Logger logger)
036 {
037 this.ctClass = ctClass;
038 this.source = source;
039 this.logger = logger;
040 }
041
042 public void addInterface(Class interfaceClass)
043 {
044 lock.check();
045
046 CtClass ctInterfaceClass = source.toCtClass(interfaceClass);
047
048 try
049 {
050 for (CtClass existing : ctClass.getInterfaces())
051 if (existing == ctInterfaceClass) return;
052 }
053 catch (Exception ex)
054 {
055 // Don't think this code is actually reachable.
056 }
057
058 ctClass.addInterface(ctInterfaceClass);
059 }
060
061 protected CtClass[] toCtClasses(Class[] inputClasses)
062 {
063 if (inputClasses == null || inputClasses.length == 0) return null;
064
065 int count = inputClasses.length;
066 CtClass[] result = new CtClass[count];
067
068 for (int i = 0; i < count; i++)
069 {
070 CtClass ctClass = toCtClass(inputClasses[i]);
071
072 result[i] = ctClass;
073 }
074
075 return result;
076 }
077
078 protected CtClass toCtClass(Class inputClass)
079 {
080 return source.toCtClass(inputClass);
081 }
082
083 public Class createClass()
084 {
085 lock.lock();
086
087 if (logger.isDebugEnabled()) logger.debug(String.format("Creating class from %s", this));
088
089 return source.createClass(ctClass);
090 }
091
092 protected CtClass getCtClass()
093 {
094 return ctClass;
095 }
096
097 protected CtClassSource getSource()
098 {
099 return source;
100 }
101
102 protected Logger getLogger()
103 {
104 return logger;
105 }
106
107 }