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.compiler;
9
10 import org.codehaus.aspectwerkz.joinpoint.management.AdviceInfoContainer;
11 import org.codehaus.aspectwerkz.util.Strings;
12 import org.codehaus.aspectwerkz.transform.TransformationConstants;
13 import org.codehaus.aspectwerkz.transform.inlining.EmittedJoinPoint;
14 import org.codehaus.aspectwerkz.reflect.ClassInfo;
15
16 /***
17 * Info needed for the compilation of the join point, holds both the initial model and the latest redefined model.
18 *
19 * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr </a>
20 */
21 public final class CompilationInfo {
22 private final Model m_initialModel;
23 private Model m_redefinedModel;
24 private int m_redefinitionCounter = 0;
25
26 public CompilationInfo(final Model initialModel) {
27 m_initialModel = initialModel;
28 }
29
30 public Model getInitialModel() {
31 return m_initialModel;
32 }
33
34 public Model getRedefinedModel() {
35 return m_redefinedModel;
36 }
37
38 public void setRedefinedModel(final Model redefinedModel) {
39 m_redefinedModel = redefinedModel;
40 }
41
42 public int getRedefinitionCounter() {
43 return m_redefinitionCounter;
44 }
45
46 public void incrementRedefinitionCounter() {
47 m_redefinitionCounter += 1;
48 }
49
50 public boolean equals(Object o) {
51 if (this == o) {
52 return true;
53 }
54 if (!(o instanceof CompilationInfo)) {
55 return false;
56 }
57
58 final CompilationInfo compilationInfo = (CompilationInfo) o;
59
60 if (m_redefinitionCounter != compilationInfo.m_redefinitionCounter) {
61 return false;
62 }
63 if (m_initialModel != null ?
64 !m_initialModel.equals(compilationInfo.m_initialModel) :
65 compilationInfo.m_initialModel != null) {
66 return false;
67 }
68 if (m_redefinedModel != null ?
69 !m_redefinedModel.equals(compilationInfo.m_redefinedModel) :
70 compilationInfo.m_redefinedModel != null) {
71 return false;
72 }
73
74 return true;
75 }
76
77 public int hashCode() {
78 int result;
79 result = (m_initialModel != null ? m_initialModel.hashCode() : 0);
80 result = 29 * result + (m_redefinedModel != null ? m_redefinedModel.hashCode() : 0);
81 result = 29 * result + m_redefinitionCounter;
82 return result;
83 }
84
85 /***
86 * Represents the information needed to compile one joinpoint at a given time
87 *
88 * @author <a href="mailto:jboner@codehaus.org">Jonas Bonér </a>
89 */
90 public final static class Model {
91 private final String m_joinPointClassName;
92 private final EmittedJoinPoint m_emittedJoinPoint;
93 private final AdviceInfoContainer m_adviceInfoContainer;
94 private final ClassInfo m_thisClassInfo;
95
96 public Model(final EmittedJoinPoint emittedJoinPoint,
97 final AdviceInfoContainer adviceInfoContainer,
98 final ClassInfo thisClassInfo) {
99 m_emittedJoinPoint = emittedJoinPoint;
100 m_adviceInfoContainer = adviceInfoContainer;
101 m_joinPointClassName = m_emittedJoinPoint.getJoinPointClassName();
102 m_thisClassInfo = thisClassInfo;
103 }
104
105 public Model(final EmittedJoinPoint emittedJoinPoint,
106 final AdviceInfoContainer adviceInfoContainer,
107 final int redefinitionCounter,
108 final ClassInfo thisClassInfo) {
109 m_emittedJoinPoint = emittedJoinPoint;
110 m_adviceInfoContainer = adviceInfoContainer;
111 m_joinPointClassName = Strings.replaceSubString(
112 m_emittedJoinPoint.getJoinPointClassName(),
113 TransformationConstants.JOIN_POINT_CLASS_SUFFIX,
114 new StringBuffer().append('_').append(redefinitionCounter).
115 append(TransformationConstants.JOIN_POINT_CLASS_SUFFIX).toString()
116 );
117 m_thisClassInfo = thisClassInfo;
118 }
119
120 public String getJoinPointClassName() {
121 return m_joinPointClassName;
122 }
123
124 public EmittedJoinPoint getEmittedJoinPoint() {
125 return m_emittedJoinPoint;
126 }
127
128 public AdviceInfoContainer getAdviceInfoContainer() {
129 return m_adviceInfoContainer;
130 }
131
132 /***
133 * JoinPoint this class class info (caller)
134 * @return
135 */
136 public ClassInfo getThisClassInfo() {
137 return m_thisClassInfo;
138 }
139
140 public int hashCode() {
141 return m_emittedJoinPoint.hashCode();
142 }
143
144 public boolean equals(Object o) {
145 return ((Model) o).m_emittedJoinPoint == m_emittedJoinPoint;
146 }
147 }
148 }