KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > codehaus > aspectwerkz > transform > inlining > deployer > DeploymentHandle


1 /**************************************************************************************
2  * Copyright (c) Jonas BonŽr, Alexandre Vasseur. All rights reserved. *
3  * http://aspectwerkz.codehaus.org *
4  * ---------------------------------------------------------------------------------- *
5  * The software in this package is published under the terms of the LGPL license *
6  * a copy of which has been included with this distribution in the license.txt file. *
7  **************************************************************************************/

8 package org.codehaus.aspectwerkz.transform.inlining.deployer;
9
10 import java.util.Map JavaDoc;
11 import java.util.HashMap JavaDoc;
12 import java.util.Iterator JavaDoc;
13 import java.util.Set JavaDoc;
14 import java.lang.ref.WeakReference JavaDoc;
15
16 import org.codehaus.aspectwerkz.util.UuidGenerator;
17 import org.codehaus.aspectwerkz.definition.AdviceDefinition;
18 import org.codehaus.aspectwerkz.definition.SystemDefinitionContainer;
19 import org.codehaus.aspectwerkz.definition.SystemDefinition;
20 import org.codehaus.aspectwerkz.definition.AspectDefinition;
21 import org.codehaus.aspectwerkz.expression.ExpressionInfo;
22
23 /**
24  * Universal Unique IDentifier (UUID) for a deployment event.
25  * <p/>
26  * Can be stored by the user to allow access to a specific deployment event.
27  * <p/>
28  * Visibility for all methods are package private, user should only use it as a handle.
29  *
30  * @author <a HREF="mailto:jboner@codehaus.org">Jonas BonŽr </a>
31  */

32 public final class DeploymentHandle {
33
34     private final String JavaDoc UUID;
35     private final Map JavaDoc m_definitionChangeElements = new HashMap JavaDoc();
36     private final WeakReference JavaDoc m_loaderRef;
37     private final WeakReference JavaDoc m_classRef;
38
39     /**
40      * Creates a new handle.
41      *
42      * @param clazz the class of the entity being deployed
43      */

44     DeploymentHandle(final Class JavaDoc clazz, final ClassLoader JavaDoc loader) {
45         if (clazz == null) {
46             throw new IllegalArgumentException JavaDoc("class can not be null");
47         }
48         if (loader == null) {
49             throw new IllegalArgumentException JavaDoc("loader can not be null");
50         }
51         UUID = UuidGenerator.generate(clazz);
52         m_loaderRef = new WeakReference JavaDoc(loader);
53         m_classRef = new WeakReference JavaDoc(clazz);
54     }
55
56     void registerDefinitionChange(final AdviceDefinition adviceDef, final ExpressionInfo oldExpression) {
57         m_definitionChangeElements.put(
58                 adviceDef.getQualifiedName(),
59                 new DefinitionChangeElement(adviceDef, oldExpression)
60         );
61     }
62
63     Class JavaDoc getAspectClass() {
64         return (Class JavaDoc) m_classRef.get();
65     }
66
67     Map JavaDoc getDefintionChangeElements() {
68         return m_definitionChangeElements;
69     }
70
71     void revertChanges() {
72         final ClassLoader JavaDoc loader = (ClassLoader JavaDoc) m_loaderRef.get();
73         // hotdeployment is done thru the virtual system, so reverts changes as well
74
SystemDefinition systemDef = SystemDefinitionContainer.getVirtualDefinitionAt(loader);
75         for (Iterator JavaDoc it2 = systemDef.getAspectDefinitions().iterator(); it2.hasNext();) {
76             AspectDefinition aspectDef = (AspectDefinition) it2.next();
77             for (Iterator JavaDoc it3 = aspectDef.getAfterAdviceDefinitions().iterator(); it3.hasNext();) {
78                 AdviceDefinition adviceDef = (AdviceDefinition) it3.next();
79                 DefinitionChangeElement changeElement =
80                         (DefinitionChangeElement) m_definitionChangeElements.get(adviceDef.getQualifiedName());
81                 if (changeElement != null) {
82                     changeElement.getAdviceDef().setExpressionInfo(changeElement.getOldExpression());
83                 }
84             }
85         }
86     }
87
88     public String JavaDoc toString() {
89         return new StringBuffer JavaDoc().append("DeploymentHandle [").
90                 append(UUID.toString()).append(',').
91                 append(((Class JavaDoc) m_classRef.get()).getName()).append(',').
92                 append((ClassLoader JavaDoc) m_loaderRef.get()).append(']').toString();
93     }
94
95     public int hashCode() {
96         return UUID.hashCode();
97     }
98
99     public boolean equals(Object JavaDoc o) {
100         return ((DeploymentHandle) o).UUID.equals(UUID);
101     }
102
103     /**
104      * Holds the definition change of one advice.
105      *
106      * @author <a HREF="mailto:jboner@codehaus.org">Jonas BonŽr </a>
107      */

108     static class DefinitionChangeElement {
109         private final AdviceDefinition m_adviceDef;
110         private final ExpressionInfo m_oldExpression;
111
112         public DefinitionChangeElement(final AdviceDefinition adviceDef, final ExpressionInfo oldExpression) {
113             m_adviceDef = adviceDef;
114             m_oldExpression = oldExpression;
115         }
116
117         public ExpressionInfo getOldExpression() {
118             return m_oldExpression;
119         }
120
121         public AdviceDefinition getAdviceDef() {
122             return m_adviceDef;
123         }
124     }
125 }
126
Popular Tags