/************************************************************************************** * Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. * * http://aspectwerkz.codehaus.org * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the LGPL license * * a copy of which has been included with this distribution in the license.txt file. * **************************************************************************************/ package org.codehaus.aspectwerkz.transform.inlining.compiler; import org.codehaus.aspectwerkz.joinpoint.management.AdviceInfoContainer; import org.codehaus.aspectwerkz.util.Strings; import org.codehaus.aspectwerkz.transform.TransformationConstants; import org.codehaus.aspectwerkz.transform.inlining.EmittedJoinPoint; import org.codehaus.aspectwerkz.reflect.ClassInfo; /** * Info needed for the compilation of the join point, holds both the initial model and the latest redefined model. * * @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a> */ public final class CompilationInfo { private final Model m_initialModel; private Model m_redefinedModel; private int m_redefinitionCounter = 0; public CompilationInfo(final Model initialModel) { m_initialModel = initialModel; } public Model getInitialModel() { return m_initialModel; } public Model getRedefinedModel() { return m_redefinedModel; } public void setRedefinedModel(final Model redefinedModel) { m_redefinedModel = redefinedModel; } public int getRedefinitionCounter() { return m_redefinitionCounter; } public void incrementRedefinitionCounter() { m_redefinitionCounter += 1; } public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof CompilationInfo)) { return false; } final CompilationInfo compilationInfo = (CompilationInfo) o; if (m_redefinitionCounter != compilationInfo.m_redefinitionCounter) { return false; } if (m_initialModel != null ? !m_initialModel.equals(compilationInfo.m_initialModel) : compilationInfo.m_initialModel != null) { return false; } if (m_redefinedModel != null ? !m_redefinedModel.equals(compilationInfo.m_redefinedModel) : compilationInfo.m_redefinedModel != null) { return false; } return true; } public int hashCode() { int result; result = (m_initialModel != null ? m_initialModel.hashCode() : 0); result = 29 * result + (m_redefinedModel != null ? m_redefinedModel.hashCode() : 0); result = 29 * result + m_redefinitionCounter; return result; } /** * Represents the information needed to compile one joinpoint at a given time * * @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a> */ public final static class Model { private final String m_joinPointClassName; private final EmittedJoinPoint m_emittedJoinPoint; private final AdviceInfoContainer m_adviceInfoContainer; private final ClassInfo m_thisClassInfo; public Model(final EmittedJoinPoint emittedJoinPoint, final AdviceInfoContainer adviceInfoContainer, final ClassInfo thisClassInfo) { m_emittedJoinPoint = emittedJoinPoint; m_adviceInfoContainer = adviceInfoContainer; m_joinPointClassName = m_emittedJoinPoint.getJoinPointClassName(); m_thisClassInfo = thisClassInfo; } public Model(final EmittedJoinPoint emittedJoinPoint, final AdviceInfoContainer adviceInfoContainer, final int redefinitionCounter, final ClassInfo thisClassInfo) { m_emittedJoinPoint = emittedJoinPoint; m_adviceInfoContainer = adviceInfoContainer; m_joinPointClassName = Strings.replaceSubString( m_emittedJoinPoint.getJoinPointClassName(), TransformationConstants.JOIN_POINT_CLASS_SUFFIX, new StringBuffer().append('_').append(redefinitionCounter). append(TransformationConstants.JOIN_POINT_CLASS_SUFFIX).toString() ); m_thisClassInfo = thisClassInfo; } public String getJoinPointClassName() { return m_joinPointClassName; } public EmittedJoinPoint getEmittedJoinPoint() { return m_emittedJoinPoint; } public AdviceInfoContainer getAdviceInfoContainer() { return m_adviceInfoContainer; } /** * JoinPoint this class class info (caller) * @return */ public ClassInfo getThisClassInfo() { return m_thisClassInfo; } public int hashCode() { return m_emittedJoinPoint.hashCode(); } public boolean equals(Object o) { return ((Model) o).m_emittedJoinPoint == m_emittedJoinPoint; } } }