001: /*
002: * Copyright 2006-2007 The Scriptella Project Team.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package scriptella.spi.support;
017:
018: import scriptella.spi.ParametersCallback;
019:
020: /**
021: * Hierarchical implementation of {@link scriptella.spi.ParametersCallback} interface.
022: * <p>This class decorates behaviour of a primary callback by obtaining
023: * absent parameter values from the parent callback.
024: * <p><em>Note:</em> This class is mutable and not thread-safe.
025: *
026: * @author Fyodor Kupolov
027: * @version 1.0
028: */
029: public class HierarchicalParametersCallback implements
030: ParametersCallback {
031: private ParametersCallback callback;
032: private ParametersCallback parentCallback;
033:
034: /**
035: * Creates a hierarchical parameters callback instance.
036: *
037: * @param callback primary callback.
038: * @param parentCallback secondary (parent) callback. If null - only primary callback is used.
039: */
040: public HierarchicalParametersCallback(ParametersCallback callback,
041: ParametersCallback parentCallback) {
042: setCallback(callback);
043: setParentCallback(parentCallback);
044: }
045:
046: /**
047: * Returns primary callback.
048: *
049: * @return primary callback.
050: */
051: public ParametersCallback getCallback() {
052: return callback;
053: }
054:
055: /**
056: * Sets primary callback.
057: *
058: * @param callback primary callback. Cannot be null.
059: */
060: public void setCallback(ParametersCallback callback) {
061: if (callback == null) {
062: throw new IllegalArgumentException(
063: "Parameters callback cannot be null");
064: }
065: this .callback = callback;
066: }
067:
068: /**
069: * Returns secondary callback.
070: *
071: * @return secondary callback.
072: */
073: public ParametersCallback getParentCallback() {
074: if (callback == null) {
075: throw new IllegalArgumentException(
076: "Parameters callback cannot be null");
077: }
078: return parentCallback;
079: }
080:
081: /**
082: * Sets secondary callback.
083: *
084: * @param parentCallback secondary callback. May be null, in this case only primary callback is used.
085: */
086: public void setParentCallback(ParametersCallback parentCallback) {
087: this .parentCallback = parentCallback;
088: }
089:
090: /**
091: * This method obtains the value of a specified parameter from the primary callback
092: * . If the returned value is null, the parameter's value is obtained from secondary callback.
093: *
094: * @param name parameter name.
095: * @return value of the specified parameter.
096: */
097: public Object getParameter(final String name) {
098: Object v = callback.getParameter(name);
099: if (v != null) {
100: return v;
101: }
102: return parentCallback == null ? null : parentCallback
103: .getParameter(name);
104: }
105: }
|