001    // Copyright 2006, 2007, 2011 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    /**
018     * Used when fabricating a new class. Represents a wrapper around the Javassist library.
019     * <p/>
020     * The core concept of Javassist is how method bodies (as well as constructor bodies, etc.) are specified ... as a very
021     * Java-like scripting language. Details are available at the <a href="http://jboss.org/products/javassist">Javassist
022     * home page</a>.
023     * <p/>
024     * Method bodies look largely like Java. References to java classes must be fully qualified. Several special variables
025     * are used:
026     * <ul>
027     * <li><code>$0</code> first parameter, equivalent to <code>this</code> in Java code (and can't be used when creating a
028     * static method)
029     * <li><code>$1, $2, ...</code> actual parameters to the method
030     * <li><code>$args</code> all the parameters as an <code>Object[]</code>
031     * <li><code>$r</code> the return type of the method, typically used as <code>return ($r) ...</code>. <code>$r</code> is
032     * valid with method that return <code>void</code>. This also handles conversions between wrapper types and primitive
033     * types.
034     * <li><code>$w</code> conversion from primitive type to wrapper type, used as <code>($w) foo()</code> where
035     * <code>foo()</code> returns a primitive type and a wrapper type is needed
036     * <li>
037     * </ul>
038     * <p/>
039     * ClassFab instances are not thread safe.
040     * <p/>
041     * ClassFab instances are created by a {@link org.apache.tapestry5.ioc.services.ClassFactory}.
042     * 
043     * @deprecated In 5.3, use {@link PlasticProxyFactory} instead
044     */
045    public interface ClassFab
046    {
047        /**
048         * Adds the specified interface as an interface implemented by this class. It is not an error to invoke this method
049         * multiple times with the same interface class (and the interface is only added once).
050         */
051        void addInterface(Class interfaceClass);
052    
053        /**
054         * Adds a new field with the given name and type. The field is added as a private field.
055         */
056        void addField(String name, Class type);
057    
058        /**
059         * Adds a new field with the provided modifiers.
060         */
061        void addField(String name, int modifiers, Class Type);
062    
063        /**
064         * Adds a method. The method is a public instance method.
065         * 
066         * @param modifiers
067         *            Modifiers for the method (see {@link java.lang.reflect.Modifier}).
068         * @param signature
069         *            defines the name, return type, parameters and exceptions thrown
070         * @param body
071         *            The body of the method.
072         * @throws RuntimeException
073         *             if a method with that signature has already been added, or if there is a Javassist
074         *             compilation error
075         */
076        void addMethod(int modifiers, MethodSignature signature, String body);
077    
078        /**
079         * Adds a constructor to the class. The constructor will be public.
080         * 
081         * @param parameterTypes
082         *            the type of each parameter, or null if the constructor takes no parameters.
083         * @param exceptions
084         *            the type of each exception, or null if the constructor throws no exceptions.
085         * @param body
086         *            The body of the constructor.
087         */
088        void addConstructor(Class[] parameterTypes, Class[] exceptions, String body);
089    
090        /**
091         * Adds an implementation of toString, as a method that returns a fixed string.
092         */
093        void addToString(String toString);
094    
095        /**
096         * Makes the fabricated class implement the provided service interface. The interface will be added, and all methods
097         * in the interface will be delegate wrappers. If toString() is not part of the delegate interface, then an
098         * implementation will be supplied that returns the provided string. This method is used when creating objects that
099         * proxy their behavior to some other object.
100         * 
101         * @param serviceInterface
102         *            the interface to implement
103         * @param delegateExpression
104         *            the expression used to find the delegate on which methods should be invoked. Typically
105         *            a field name, such as "_delegate", or a method to invoke, such as "_service()".
106         * @param toString
107         *            fixed value to be returned as the description of the resultant object
108         */
109        void proxyMethodsToDelegate(Class serviceInterface, String delegateExpression, String toString);
110    
111        /**
112         * Copies annotations from delegate class to the fabricated class.
113         * 
114         * @param delegateClass
115         *            class of the delegate
116         * @since 5.2.0
117         */
118        void copyClassAnnotationsFromDelegate(Class delegateClass);
119    
120        /**
121         * Copies method annotations from delegate class to the methods of the fabricated class.
122         * 
123         * @param serviceInterface
124         *            service interface
125         * @param delegateClass
126         *            class of the delegate
127         * @since 5.2.0
128         */
129        void copyMethodAnnotationsFromDelegate(Class serviceInterface, Class delegateClass);
130    
131        /**
132         * Invoked last to create the class. This will enforce that all abstract methods have been implemented in the
133         * (concrete) class.
134         */
135        Class createClass();
136    
137        /**
138         * Adds a public no-op method. The method will return null, false, or zero as per the return type (if not void).
139         */
140    
141        void addNoOpMethod(MethodSignature signature);
142    }