001: /*
002: * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
003: */
004: package com.tc.aspectwerkz.proxy;
005:
006: import com.tc.aspectwerkz.DeploymentModel;
007: import com.tc.aspectwerkz.definition.DefinitionParserHelper;
008: import com.tc.aspectwerkz.definition.SystemDefinition;
009: import com.tc.aspectwerkz.intercept.AdvisableImpl;
010:
011: /**
012: * Facade for Proxy service. Proxy are exposed to the weaver upon compilation, and can be made Advisable as well. <p/>
013: * We provide 2 proxy strategy: one by subclassing a non final concrete class, and thus having the proxy delegate to the
014: * real implementation thru super.xxx(..) calls, and one by delegating to N implementations of N interfaces. <p/> Proxy
015: * strategy provide a cache mechanism if ones wants to cache the compiled proxy. <p/> Pointcut to match delegating
016: * proxies should use a "+" as for regular subtype matching. <p/> Pointcut to match subclassing proxies don't need to
017: * use a "+" - precisely to avoid pointcut refactoring to match them.
018: *
019: * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr </a>
020: * @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a>
021: */
022: public class Proxy {
023:
024: /**
025: * Creates a new subclassing proxy instance based for the class specified and instantiates it using its default
026: * no-argument constructor. <p/> The proxy will be cached and non-advisable.
027: *
028: * @param clazz the target class to make a proxy for
029: * @return the proxy instance
030: */
031: public static Object newInstance(final Class clazz,
032: final SystemDefinition definition) {
033: return ProxySubclassingStrategy.newInstance(clazz, definition);
034: }
035:
036: /**
037: * Creates a new subclassing proxy instance for the class specified and instantiates it using the constructor matching
038: * the argument type array specified. <p/> The proxy will be cached and non-advisable.
039: *
040: * @param clazz the target class to make a proxy for
041: * @param argumentTypes the argument types matching the signature of the constructor to use when instantiating the
042: * proxy
043: * @param argumentValues the argument values to use when instantiating the proxy
044: * @return the proxy instance
045: */
046: public static Object newInstance(final Class clazz,
047: final Class[] argumentTypes, final Object[] argumentValues,
048: final SystemDefinition definition) {
049: return ProxySubclassingStrategy.newInstance(clazz,
050: argumentTypes, argumentValues, definition);
051: }
052:
053: /**
054: * Creates a new subclassing proxy instance based for the class specified and instantiates it using its default
055: * no-argument constructor.
056: *
057: * @param clazz the target class to make a proxy for
058: * @param useCache true if a cached instance of the proxy classed should be used
059: * @param makeAdvisable true if the proxy class should implement the <code>Advisable</code> interface, e.g. be
060: * prepared for programmatic, runtime, per instance hot deployement of advice
061: * @return the proxy instance
062: */
063: public static Object newInstance(final Class clazz,
064: final boolean useCache, final boolean makeAdvisable,
065: final SystemDefinition definition) {
066: return ProxySubclassingStrategy.newInstance(clazz, useCache,
067: makeAdvisable, definition);
068: }
069:
070: /**
071: * Creates a new subclassing proxy instance for the class specified and instantiates it using the constructor matching
072: * the argument type array specified.
073: *
074: * @param clazz the target class to make a proxy for
075: * @param argumentTypes the argument types matching the signature of the constructor to use when instantiating the
076: * proxy
077: * @param argumentValues the argument values to use when instantiating the proxy
078: * @param useCache true if a cached instance of the proxy classed should be used
079: * @param makeAdvisable true if the proxy class should implement the <code>Advisable</code> interface, e.g. be
080: * prepared for programmatic, runtime, per instance hot deployement of advice
081: * @return the proxy instance
082: */
083: public static Object newInstance(final Class clazz,
084: final Class[] argumentTypes, final Object[] argumentValues,
085: final boolean useCache, final boolean makeAdvisable,
086: final SystemDefinition definition) {
087: return ProxySubclassingStrategy.newInstance(clazz,
088: argumentTypes, argumentValues, useCache, makeAdvisable,
089: definition);
090: }
091:
092: /**
093: * Create a delegation proxy or retrieve it from cache and instantiate it, using the given implementations. <p/> Each
094: * implementation must implement the respective given interface.
095: *
096: * @param interfaces
097: * @param implementations
098: * @param useCache
099: * @param makeAdvisable
100: * @return
101: */
102: public static Object newInstance(final Class[] interfaces,
103: final Object[] implementations, final boolean useCache,
104: final boolean makeAdvisable,
105: final SystemDefinition definition) {
106: return ProxyDelegationStrategy.newInstance(interfaces,
107: implementations, useCache, makeAdvisable, definition);
108: }
109:
110: /**
111: * Enhances the proxy class with the Advisable mixin, to allow runtime per instance additions of interceptors. Simply
112: * register in the system definition.
113: *
114: * @param proxyClassName
115: * @param loader
116: */
117: static void makeProxyAdvisable(final String proxyClassName,
118: ClassLoader loader, final SystemDefinition definition) {
119: // changes occurs in the virtual definition only
120: String withinPointcut = "within("
121: + proxyClassName.replace('/', '.') + ')';
122: definition
123: .addMixinDefinition(DefinitionParserHelper
124: .createAndAddMixinDefToSystemDef(
125: AdvisableImpl.CLASS_INFO,
126: withinPointcut,
127: DeploymentModel.PER_INSTANCE, false,
128: definition));
129: DefinitionParserHelper.createAndAddAdvisableDef('('
130: + withinPointcut + " && execution(!static * *.*(..)))",
131: definition);
132: }
133: }
|