View Javadoc

1   /*
2    * Copyright (c) 2007, James Leigh All rights reserved.
3    * 
4    * Redistribution and use in source and binary forms, with or without
5    * modification, are permitted provided that the following conditions are met:
6    * 
7    * - Redistributions of source code must retain the above copyright notice, this
8    *   list of conditions and the following disclaimer.
9    * - Redistributions in binary form must reproduce the above copyright notice,
10   *   this list of conditions and the following disclaimer in the documentation
11   *   and/or other materials provided with the distribution. 
12   * - Neither the name of the openrdf.org nor the names of its contributors may
13   *   be used to endorse or promote products derived from this software without
14   *   specific prior written permission.
15   * 
16   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26   * POSSIBILITY OF SUCH DAMAGE.
27   * 
28   */
29  package org.openrdf.elmo.impl;
30  
31  import java.lang.reflect.InvocationTargetException;
32  import java.lang.reflect.Method;
33  import java.util.ArrayList;
34  import java.util.Collections;
35  import java.util.List;
36  import java.util.Map;
37  
38  import javax.interceptor.InvocationContext;
39  
40  /**
41   * Internal implementation of InvocationContext. This is passed to AroundInvoke
42   * methods of registered behaviours.
43   * 
44   * @author James Leigh
45   * 
46   */
47  public class InvocationContextImpl implements InvocationContext {
48  
49  	private Object target;
50  
51  	private Method method;
52  
53  	private Object[] parameters;
54  
55  	private Method proceed;
56  
57  	private List<Object> invokeTarget = new ArrayList<Object>();
58  
59  	private List<Method> invokeMethod = new ArrayList<Method>();
60  
61  	private int count;
62  
63  	public InvocationContextImpl(Object target, Method method,
64  			Object[] parameters, Method proceed) {
65  		this.target = target;
66  		this.method = method;
67  		this.parameters = parameters;
68  		this.proceed = proceed;
69  	}
70  
71  	public InvocationContextImpl appendInvocation(Object target, Method method) {
72  		invokeTarget.add(target);
73  		invokeMethod.add(method);
74  		return this;
75  	}
76  
77  	public Object getTarget() {
78  		return target;
79  	}
80  
81  	public Method getMethod() {
82  		return method;
83  	}
84  
85  	public Object[] getParameters() {
86  		return parameters;
87  	}
88  
89  	public void setParameters(Object[] parameters) {
90  		this.parameters = parameters;
91  	}
92  
93  	@SuppressWarnings("unchecked")
94  	public Map<String, Object> getContextData() {
95  		return Collections.EMPTY_MAP;
96  	}
97  
98  	public Object proceed() throws Exception {
99  		try {
100 			if (count < invokeTarget.size()) {
101 				Method im = invokeMethod.get(count);
102 				Object it = invokeTarget.get(count);
103 				count++;
104 				Class<?>[] param = im.getParameterTypes();
105 				if (param.length == 1
106 						&& param[0].equals(InvocationContext.class))
107 					return im.invoke(it, this);
108 				return im.invoke(it, getParameters());
109 			}
110 			return proceed.invoke(target, parameters);
111 		} catch (InvocationTargetException e) {
112 			Throwable cause = e.getCause();
113 			if (cause instanceof Exception)
114 				throw (Exception) cause;
115 			throw e;
116 		}
117 	}
118 
119 }