1 /*
2 This project provide access to non public fields
3 and methods as help for writing tests.
4 Copyright (C) 2007 Christof Lehmann
5
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License
8 as published by the Free Software Foundation; either version 2
9 of the License, or (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 */
20 package net.sf.testextensions;
21
22 import java.lang.reflect.Field;
23
24 /**
25 * The class <code>AccessFieldImpl</code> declares the required
26 * methods for accessing a non public field.
27 *
28 * @author forge-cl
29 *
30 */
31 class AccessFieldImpl implements AccessField {
32
33 /**
34 * The file <code>inspectedObject</code> contains
35 * the concret instance of the class.
36 */
37 private Object inspectedObject;
38 /**
39 * The field <code>selectedField</code> contains
40 * the field, which should manipulate.
41 */
42 private Field selectedField;
43
44 /**
45 *
46 */
47 private AccessibilityManipulator manipulator;
48 /**
49 * The constructor take over the required data and
50 * initialised the object.
51 * @param theInspectedClass the class which will inspected.
52 * @param theInspectedObject the object, which is an instance
53 * of the class.
54 * @param theSelectedField the field, which contains to the
55 * class and the object.
56 */
57 public AccessFieldImpl(final Class theInspectedClass,
58 final Object theInspectedObject, final Field theSelectedField) {
59 inspectedObject = theInspectedObject;
60 selectedField = theSelectedField;
61 selectAccessibilityManipulator();
62 }
63
64 /**
65 * The method <code>selectAccessibilityManipulator</code>
66 * select a behavior for manipulation of the
67 * SecurityManager.
68 */
69 private void selectAccessibilityManipulator() {
70 manipulator = AccessibilityManipulator.selectManipulator(selectedField);
71 }
72
73 /**
74 * The method <code>getValue</code> give the value of the selected field.
75 *
76 * @return the value of the selected field.
77 * @throws TestExtensionException
78 * shows, that an error occures during field access.
79 */
80 public Object getValue() throws TestExtensionException {
81 Object aValue = null;
82 manipulator.before();
83 try {
84 aValue = selectedField.get(inspectedObject);
85 } catch (IllegalArgumentException e) {
86 throw new TestExtensionException(e);
87 } catch (IllegalAccessException e) {
88 throw new TestExtensionException(e);
89 } finally {
90 manipulator.after();
91 }
92 return aValue;
93 }
94
95 /**
96 * The method <code>setValue</code> set the selected field to the given
97 * value.
98 *
99 * @param aNewValue
100 * the value, which should the selected field contains after this
101 * method call.
102 * @throws TestExtensionException
103 * if the dstValue does not suite to the field or any other
104 * exception occures.
105 */
106 public void setValue(final Object aNewValue) throws TestExtensionException {
107 manipulator.before();
108 try {
109 selectedField.set(inspectedObject, aNewValue);
110 } catch (IllegalArgumentException e) {
111 throw new TestExtensionException(e);
112 } catch (IllegalAccessException e) {
113 throw new TestExtensionException(e);
114 } finally {
115 manipulator.after();
116 }
117
118 }
119
120 }