/**************************************************************************************
* 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 QPL license *
* a copy of which has been included with this distribution in the license.txt file. *
**************************************************************************************/
package org.codehaus.aspectwerkz.joinpoint;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.ref.WeakReference;
import org.codehaus.aspectwerkz.pointcut.GetPointcut;
import org.codehaus.aspectwerkz.IndexTuple;
/**
* Matches well defined point of execution in the program where a field is
* accessed. Stores meta data from the join point. I.e. a reference to original
* object A method etc. Handles the invocation of the advices added to the
* join point.
*
* @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r</a>
*/
public class MemberFieldGetJoinPoint extends FieldJoinPoint {
/**
* A weak reference to the target object.
*/
protected WeakReference m_targetObjectReference;
/**
* The serial version uid for the class.
*
* @TODO recalculate
*/
private static final long serialVersionUID = 446929646654050997L;
/**
* Creates a new MemberFieldGetJoinPoint object.
*
* @param uuid the UUID for the AspectWerkz system to use
* @param targetObject the target object
* @param signature the field signature
*/
public MemberFieldGetJoinPoint(final String uuid,
final Object targetObject,
final String signature) {
super(uuid, signature);
if (targetObject == null) throw new IllegalArgumentException("target object can not be null");
m_targetObjectReference = new WeakReference(targetObject);
createMetaData();
}
/**
* Returns the target object.
*
* @return the target object
*/
public Object getTargetInstance() {
return m_targetObjectReference.get();
}
/**
* Returns the target class.
*
* @return the target class
*/
public Class getTargetClass() {
return m_targetObjectReference.get().getClass();
}
/**
* Loads the advices for this pointcut.
*/
protected void loadAdvices() {
synchronized (m_preAdvices) {
synchronized (m_postAdvices) {
List preAdvices = new ArrayList();
List postAdvices = new ArrayList();
List pointcuts = m_system.getGetPointcuts(m_classMetaData, m_fieldMetaData);
for (Iterator it = pointcuts.iterator(); it.hasNext();) {
GetPointcut fieldPointcut = (GetPointcut)it.next();
IndexTuple[] preAdviceIndexes = fieldPointcut.getPreAdviceIndexes();
for (int j = 0; j < preAdviceIndexes.length; j++) {
preAdvices.add(preAdviceIndexes[j]);
}
IndexTuple[] postAdviceIndexes = fieldPointcut.getPostAdviceIndexes();
for (int j = 0; j < postAdviceIndexes.length; j++) {
postAdvices.add(postAdviceIndexes[j]);
}
}
m_preAdvices = new IndexTuple[preAdvices.size()];
int i = 0;
for (Iterator it = preAdvices.iterator(); it.hasNext(); i++) {
m_preAdvices[i] = (IndexTuple)it.next();
}
m_postAdvices = new IndexTuple[postAdvices.size()];
i = 0;
for (Iterator it = postAdvices.iterator(); it.hasNext(); i++) {
m_postAdvices[i] = (IndexTuple)it.next();
}
m_initialized = true;
}
}
}
/**
* Provides custom serialization.
*
* @param stream the object output stream that should write the serialized object
* @throws java.lang.Exception in case of failure
*/
private void writeObject(final ObjectOutputStream stream) throws Exception {
ObjectOutputStream.PutField fields = stream.putFields();
fields.put("m_targetObjectReference", m_targetObjectReference.get());
stream.writeFields();
}
/**
* Provides custom deserialization.
*
* @param stream the object input stream containing the serialized object
* @throws java.lang.Exception in case of failure
*/
private void readObject(final ObjectInputStream stream) throws Exception {
ObjectInputStream.GetField fields = stream.readFields();
m_targetObjectReference = new WeakReference(fields.get("m_targetObjectReference", null));
}
}