001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018: package org.apache.tools.ant.taskdefs.optional.script;
019:
020: import org.apache.tools.ant.Task;
021: import org.apache.tools.ant.MagicNames;
022: import org.apache.tools.ant.BuildException;
023: import org.apache.tools.ant.DynamicConfigurator;
024: import java.util.Map;
025: import java.util.HashMap;
026: import java.util.List;
027: import java.util.ArrayList;
028:
029: /**
030: * The script execution class. This class finds the defining script task
031: * and passes control to that task's executeScript method.
032: *
033: * @since Ant 1.6
034: */
035: public class ScriptDefBase extends Task implements DynamicConfigurator {
036:
037: /** Nested elements */
038: private Map nestedElementMap = new HashMap();
039:
040: /** Attributes */
041: private Map attributes = new HashMap();
042:
043: private String text;
044:
045: /**
046: * Locate the script defining task and execute the script by passing
047: * control to it
048: */
049: public void execute() {
050: getScript().executeScript(attributes, nestedElementMap, this );
051: }
052:
053: private ScriptDef getScript() {
054: String name = getTaskType();
055: Map scriptRepository = (Map) getProject().getReference(
056: MagicNames.SCRIPT_REPOSITORY);
057: if (scriptRepository == null) {
058: throw new BuildException("Script repository not found for "
059: + name);
060: }
061:
062: ScriptDef definition = (ScriptDef) scriptRepository
063: .get(getTaskType());
064: if (definition == null) {
065: throw new BuildException("Script definition not found for "
066: + name);
067: }
068: return definition;
069: }
070:
071: /**
072: * Create a nested element
073: *
074: * @param name the nested element name
075: * @return the element to be configured
076: */
077: public Object createDynamicElement(String name) {
078: List nestedElementList = (List) nestedElementMap.get(name);
079: if (nestedElementList == null) {
080: nestedElementList = new ArrayList();
081: nestedElementMap.put(name, nestedElementList);
082: }
083: Object element = getScript().createNestedElement(name);
084: nestedElementList.add(element);
085: return element;
086: }
087:
088: /**
089: * Set a task attribute
090: *
091: * @param name the attribute name.
092: * @param value the attribute's string value
093: */
094: public void setDynamicAttribute(String name, String value) {
095: ScriptDef definition = getScript();
096: if (!definition.isAttributeSupported(name)) {
097: throw new BuildException("<" + getTaskType()
098: + "> does not support the \"" + name
099: + "\" attribute");
100: }
101:
102: attributes.put(name, value);
103: }
104:
105: /**
106: * Set the script text.
107: *
108: * @param text a component of the script text to be added.
109: * @since ant1.7
110: */
111: public void addText(String text) {
112: this .text = getProject().replaceProperties(text);
113: }
114:
115: /**
116: * get the text of this element; may be null
117: * @return text or null for no nested text
118: * @since ant1.7
119: */
120: public String getText() {
121: return text;
122: }
123:
124: /**
125: * Utility method for nested scripts; throws a BuildException
126: * with the given message.
127: * @param message text to pass to the BuildException
128: * @throws BuildException always.
129: * @since ant1.7
130: */
131: public void fail(String message) {
132: throw new BuildException(message);
133: }
134: }
|