History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/com/sun/beans/decoder/ElementHandler.java (1 of 18352 files). Show all

Unified · Split

java/pkg/com/sun/beans/decoder/ElementHandler.java+224−0
@@ -0,0 +1,224 @@
1+/*
2+ * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
3+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+ *
5+ * This code is free software; you can redistribute it and/or modify it
6+ * under the terms of the GNU General Public License version 2 only, as
7+ * published by the Free Software Foundation. Oracle designates this
8+ * particular file as subject to the "Classpath" exception as provided
9+ * by Oracle in the LICENSE file that accompanied this code.
10+ *
11+ * This code is distributed in the hope that it will be useful, but WITHOUT
12+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+ * version 2 for more details (a copy is included in the LICENSE file that
15+ * accompanied this code).
16+ *
17+ * You should have received a copy of the GNU General Public License version
18+ * 2 along with this work; if not, write to the Free Software Foundation,
19+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+ *
21+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+ * or visit www.oracle.com if you need additional information or have any
23+ * questions.
24+ */
25+package com.sun.beans.decoder;
26+
27+/**
28+ * The base class for element handlers.
29+ *
30+ * @since 1.7
31+ *
32+ * @author Sergey A. Malenkov
33+ *
34+ * @see DocumentHandler
35+ */
36+public abstract class ElementHandler {
37+ private DocumentHandler owner;
38+ private ElementHandler parent;
39+
40+ private String id;
41+
42+ /**
43+ * Returns the document handler that creates this element handler.
44+ *
45+ * @return the owner document handler
46+ */
47+ public final DocumentHandler getOwner() {
48+ return this.owner;
49+ }
50+
51+ /**
52+ * Sets the document handler that creates this element handler.
53+ * The owner document handler should be set after instantiation.
54+ * Such approach is used to simplify the extensibility.
55+ *
56+ * @param owner the owner document handler
57+ * @see DocumentHandler#startElement
58+ */
59+ final void setOwner(DocumentHandler owner) {
60+ if (owner == null) {
61+ throw new IllegalArgumentException("Every element should have owner");
62+ }
63+ this.owner = owner;
64+ }
65+
66+ /**
67+ * Returns the element handler that contains this one.
68+ *
69+ * @return the parent element handler
70+ */
71+ public final ElementHandler getParent() {
72+ return this.parent;
73+ }
74+
75+ /**
76+ * Sets the element handler that contains this one.
77+ * The parent element handler should be set after instantiation.
78+ * Such approach is used to simplify the extensibility.
79+ *
80+ * @param parent the parent element handler
81+ * @see DocumentHandler#startElement
82+ */
83+ final void setParent(ElementHandler parent) {
84+ this.parent = parent;
85+ }
86+
87+ /**
88+ * Returns the value of the variable with specified identifier.
89+ *
90+ * @param id the identifier
91+ * @return the value of the variable
92+ */
93+ protected final Object getVariable(String id) {
94+ if (id.equals(this.id)) {
95+ ValueObject value = getValueObject();
96+ if (value.isVoid()) {
97+ throw new IllegalStateException("The element does not return value");
98+ }
99+ return value.getValue();
100+ }
101+ return (this.parent != null)
102+ ? this.parent.getVariable(id)
103+ : this.owner.getVariable(id);
104+ }
105+
106+ /**
107+ * Returns the value of the parent element.
108+ *
109+ * @return the value of the parent element
110+ */
111+ protected Object getContextBean() {
112+ if (this.parent != null) {
113+ ValueObject value = this.parent.getValueObject();
114+ if (!value.isVoid()) {
115+ return value.getValue();
116+ }
117+ throw new IllegalStateException("The outer element does not return value");
118+ } else {
119+ Object value = this.owner.getOwner();
120+ if (value != null) {
121+ return value;
122+ }
123+ throw new IllegalStateException("The topmost element does not have context");
124+ }
125+ }
126+
127+ /**
128+ * Parses attributes of the element.
129+ * By default, the following atribute is supported:
130+ * <dl>
131+ * <dt>id
132+ * <dd>the identifier of the variable that is intended to store the result
133+ * </dl>
134+ *
135+ * @param name the attribute name
136+ * @param value the attribute value
137+ */
138+ public void addAttribute(String name, String value) {
139+ if (name.equals("id")) { // NON-NLS: the attribute name
140+ this.id = value;
141+ } else {
142+ throw new IllegalArgumentException("Unsupported attribute: " + name);
143+ }
144+ }
145+
146+ /**
147+ * This method is called before parsing of the element's body.
148+ * All attributes are parsed at this point.
149+ * By default, do nothing.
150+ */
151+ public void startElement() {
152+ }
153+
154+ /**
155+ * This method is called after parsing of the element's body.
156+ * By default, it calculates the value of this element.
157+ * The following tasks are executing for any non-void value:
158+ * <ol>
159+ * <li>If the {@code id} attribute is set
160+ * the value of the variable with the specified identifier
161+ * is set to the value of this element.</li>
162+ * <li>This element is used as an argument of parent element if it is possible.</li>
163+ * </ol>
164+ *
165+ * @see #isArgument
166+ */
167+ public void endElement() {
168+ // do nothing if no value returned
169+ ValueObject value = getValueObject();
170+ if (!value.isVoid()) {
171+ if (this.id != null) {
172+ this.owner.setVariable(this.id, value.getValue());
173+ }
174+ if (isArgument()) {
175+ if (this.parent != null) {
176+ this.parent.addArgument(value.getValue());
177+ } else {
178+ this.owner.addObject(value.getValue());
179+ }
180+ }
181+ }
182+ }
183+
184+ /**
185+ * Adds the character that contained in this element.
186+ * By default, only whitespaces are acceptable.
187+ *
188+ * @param ch the character
189+ */
190+ public void addCharacter(char ch) {
191+ if ((ch != ' ') && (ch != '\n') && (ch != '\t') && (ch != '\r')) {
192+ throw new IllegalStateException("Illegal character with code " + (int) ch);
193+ }
194+ }
195+
196+ /**
197+ * Adds the argument that is used to calculate the value of this element.
198+ * By default, no arguments are acceptable.
199+ *
200+ * @param argument the value of the element that contained in this one
201+ */
202+ protected void addArgument(Object argument) {
203+ throw new IllegalStateException("Could not add argument to simple element");
204+ }
205+
206+ /**
207+ * Tests whether the value of this element can be used
208+ * as an argument of the element that contained in this one.
209+ *
210+ * @return {@code true} if the value of this element can be used
211+ * as an argument of the element that contained in this one,
212+ * {@code false} otherwise
213+ */
214+ protected boolean isArgument() {
215+ return this.id == null;
216+ }
217+
218+ /**
219+ * Returns the value of this element.
220+ *
221+ * @return the value of this element
222+ */
223+ protected abstract ValueObject getValueObject();
224+}