001    // Copyright 2011, 2012 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.services;
016    
017    import org.apache.tapestry5.ioc.Location;
018    import org.apache.tapestry5.ioc.ObjectCreator;
019    import org.apache.tapestry5.plastic.ClassInstantiator;
020    import org.apache.tapestry5.plastic.PlasticClassListenerHub;
021    import org.apache.tapestry5.plastic.PlasticClassTransformation;
022    import org.apache.tapestry5.plastic.PlasticClassTransformer;
023    
024    import java.lang.reflect.Constructor;
025    import java.lang.reflect.Method;
026    
027    /**
028     * A service used to create proxies of varying types. As a secondary concern, manages to identify the
029     * location of methods and constructors, which is important for exception reporting.
030     *
031     * @since 5.3
032     */
033    public interface PlasticProxyFactory extends PlasticClassListenerHub
034    {
035        /**
036         * Returns the class loader used when creating new classes, this is a child class loader
037         * of another class loader (usually, the thread's context class loader).
038         */
039        ClassLoader getClassLoader();
040    
041        /**
042         * Creates a proxy object that implements the indicated interface, then invokes the callback to further
043         * configure the proxy.
044         *
045         * @param interfaceType
046         *         interface implemented by proxy
047         * @param callback
048         *         configures the proxy
049         * @return instantiator that can be used to create an instance of the proxy class
050         */
051        <T> ClassInstantiator<T> createProxy(Class<T> interfaceType, PlasticClassTransformer callback);
052    
053        /**
054         * Creates the underlying {@link PlasticClassTransformation} for an interface proxy. This should only be
055         * used in the cases where encapsulating the PlasticClass construction into a {@linkplain PlasticClassTransformer
056         * callback} is not feasible (which is the case for some of the older APIs inside Tapestry IoC).
057         *
058         * @param interfaceType
059         *         class proxy will extend from
060         * @return transformation from which an instantiator may be created
061         */
062        <T> PlasticClassTransformation<T> createProxyTransformation(Class<T> interfaceType);
063    
064        /**
065         * Creates a proxy instance that delegates all methods through a corresponding
066         * ObjectCreator. Each method invocation on the proxy will route through {@link ObjectCreator#createObject()} (the
067         * creator implementation may decide to
068         * cache the return value as appropriate).
069         *
070         * @param <T>
071         *         type of proxy
072         * @param interfaceType
073         *         interface class for proxy
074         * @param creator
075         *         object responsible for creating the real object
076         * @param description
077         *         the <code>toString()</code> of the proxy
078         * @return proxy instance
079         */
080        <T> T createProxy(Class<T> interfaceType, ObjectCreator<T> creator, String description);
081    
082        /**
083         * Converts a method to a {@link Location}, which includes information about the source file name and line number.
084         *
085         * @param method
086         *         to look up
087         * @return the location (identifying the method and possibly, the line number within the method)
088         */
089        Location getMethodLocation(Method method);
090    
091        /**
092         * Return a string representation for the constructor (including class and parameters) and (if available) file name
093         * and line number.
094         *
095         * @return the location (identifying the constructor and possibly, the line number within the method)
096         */
097        Location getConstructorLocation(Constructor constructor);
098    
099        /**
100         * Clears any cached information stored by the proxy factory; this is useful in Tapestry development mode
101         * when a class loader may have been discarded (because the proxy factory may indirectly keep references
102         * to classes loaded by the old class loader).
103         *
104         * @since 5.3.3
105         */
106        void clearCache();
107    }