1 package org.apache.velocity.runtime.parser.node;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 import java.lang.reflect.InvocationTargetException;
23 import org.apache.velocity.exception.VelocityException;
24 import org.apache.velocity.runtime.log.Log;
25 import org.apache.velocity.util.introspection.Introspector;
26
27
28 /**
29 * Executor that simply tries to execute a put(key, value)
30 * operation. This will try to find a put(key) method
31 * for any type of object, not just objects that
32 * implement the Map interface as was previously
33 * the case.
34 *
35 * @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a>
36 * @author <a href="mailto:henning@apache.org">Henning P. Schmiedehausen</a>
37 * @version $Id: PutExecutor.java 687177 2008-08-19 22:00:32Z nbubna $
38 * @since 1.5
39 */
40 public class PutExecutor extends SetExecutor
41 {
42 private final Introspector introspector;
43 private final String property;
44
45 /**
46 * @param log
47 * @param introspector
48 * @param clazz
49 * @param arg
50 * @param property
51 */
52 public PutExecutor(final Log log, final Introspector introspector,
53 final Class clazz, final Object arg, final String property)
54 {
55 this.log = log;
56 this.introspector = introspector;
57 this.property = property;
58
59 discover(clazz, arg);
60 }
61
62 /**
63 * @param clazz
64 * @param arg
65 */
66 protected void discover(final Class clazz, final Object arg)
67 {
68 Object [] params;
69
70 // If you passed in null as property, we don't use the value
71 // for parameter lookup. Instead we just look for put(Object) without
72 // any parameters.
73 //
74 // In any other case, the following condition will set up an array
75 // for looking up put(String, Object) on the class.
76
77 if (property == null)
78 {
79 // The passed in arg object is used by the Cache to look up the method.
80 params = new Object[] { arg };
81 }
82 else
83 {
84 params = new Object[] { property, arg };
85 }
86
87 try
88 {
89 setMethod(introspector.getMethod(clazz, "put", params));
90 }
91 /**
92 * pass through application level runtime exceptions
93 */
94 catch( RuntimeException e )
95 {
96 throw e;
97 }
98 catch(Exception e)
99 {
100 String msg = "Exception while looking for put('" + params[0] + "') method";
101 log.error(msg, e);
102 throw new VelocityException(msg, e);
103 }
104 }
105
106 /**
107 * @see org.apache.velocity.runtime.parser.node.SetExecutor#execute(java.lang.Object, java.lang.Object)
108 */
109 public Object execute(final Object o, final Object value)
110 throws IllegalAccessException, InvocationTargetException
111 {
112 Object [] params;
113
114 if (isAlive())
115 {
116 // If property != null, pass in the name for put(key, value). Else just put(value).
117 if (property == null)
118 {
119 params = new Object [] { value };
120 }
121 else
122 {
123 params = new Object [] { property, value };
124 }
125
126 return getMethod().invoke(o, params);
127 }
128
129 return null;
130 }
131 }