001: //$Id: AttributeListCreatorAction.java 250 2006-08-25 21:30:26Z jg_hamburg $
002: /********************************************************************************
003: * DDTUnit, a Datadriven Approach to Unit- and Moduletesting
004: * Copyright (c) 2004, Joerg and Kai Gellien
005: * All rights reserved.
006: *
007: * The Software is provided under the terms of the Common Public License 1.0
008: * as provided with the distribution of DDTUnit in the file cpl-v10.html.
009: * Redistribution and use in source and binary forms, with or without
010: * modification, are permitted provided that the following conditions
011: * are met:
012: *
013: * + Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * + Redistributions in binary form must reproduce the above
017: * copyright notice, this list of conditions and the following
018: * disclaimer in the documentation and/or other materials provided
019: * with the distribution.
020: *
021: * + Neither the name of the authors or DDTUnit, nor the
022: * names of its contributors may be used to endorse or promote
023: * products derived from this software without specific prior
024: * written permission.
025: *
026: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
027: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
028: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
029: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
030: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
031: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
032: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
033: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
034: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
035: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
036: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
037: ********************************************************************************/package junitx.ddtunit.data.processing;
038:
039: import java.util.List;
040: import java.util.Map;
041:
042: import junitx.ddtunit.DDTException;
043: import junitx.ddtunit.data.TypedObject;
044:
045: import org.apache.log4j.Logger;
046:
047: public class AttributeListCreatorAction extends ActionBase {
048: protected Logger log = Logger
049: .getLogger(AttributeListCreatorAction.class);
050:
051: public AttributeListCreatorAction(Map<String, String> attrMap) {
052: super (attrMap);
053: this .attrMap.put(ParserConstants.XML_ATTR_ID, "attrlist");
054: this .attrMap.put(ParserConstants.XML_ATTR_TYPE,
055: "java.util.Vector");
056: this .attrMap.put(ParserConstants.XML_ATTR_HINT, "attrlist");
057: }
058:
059: /*
060: * (non-Javadoc)
061: *
062: * @see junitx.ddtunit.parser.ActionBase#process()
063: */
064: public IAction process() {
065: log.debug("process AttributeListCreator - START");
066: IAction rootAction = getPrevious();
067: if (rootAction == null) {
068: throw new DDTException(
069: "AttributeListCreatorAction must follow another action in action stack.");
070: }
071: // process different types of actions according to rootAction type
072: String hintValue = rootAction.getHint();
073:
074: if (HintTypes.INTERNAL_MAPENTRY.equals(hintValue)) {
075: rootAction.processSuccessor(this );
076: } else if (HintTypes.CONSTRUCTOR.equals(hintValue)
077: || HintTypes.CALL.equals(hintValue)) {
078: rootAction.processSuccessor(this );
079: } else if (HintTypes.FIELDS.equals(hintValue)) {
080: rootAction.processSuccessor(this );
081: } else if (HintTypes.BEAN.equals(hintValue)) {
082: rootAction.processSuccessor(this );
083: } else if (HintTypes.ARRAY.equals(hintValue)) {
084: rootAction.processSuccessor(this );
085: } else {
086: throw new UnsupportedOperationException(
087: "AttributeListCreatorAction does not support hint '"
088: + hintValue + "'");
089: }
090: pop();
091: // do not forget to process the actual root element
092: if (rootAction.getPrevious() != null) {
093: rootAction = rootAction.process();
094: }
095: return rootAction;
096: }
097:
098: /*
099: * (non-Javadoc)
100: *
101: * @see junitx.ddtunit.parser.ActionBase#inject()
102: */
103: public IAction inject() {
104: String type = (String) this .attrMap
105: .get(ParserConstants.XML_ATTR_TYPE);
106: String id = (String) this .attrMap
107: .get(ParserConstants.XML_ATTR_ID);
108: // check if type is based on java.util.Collection
109: try {
110: if (type == null
111: && ParserConstants.XML_ELEM_ITEM.equals(id)) {
112: type = TypedObject.UNKNOWN_TYPE;
113: } else if (HintTypes.ARRAY.equals(this .getHint())) {
114: // do nothing
115: } else {
116: Class clazz = Class.forName(type);
117: Class super clazz = clazz;
118: boolean found = false;
119: while (!found && super clazz != null) {
120: if ("java.util.Collection".equals(super clazz
121: .getName())
122: || "java.util.AbstractCollection"
123: .equals(super clazz.getName())) {
124: found = true;
125: }
126: super clazz = super clazz.getSuperclass();
127: }
128: if (!found) {
129: throw new DDTException(
130: "Container class '"
131: + type
132: + "' does not implement java.util.Collection.");
133: }
134: }
135: } catch (Exception ex) {
136: throw new DDTException("Container class '" + type
137: + "' does not implement java.util.Collection.", ex);
138: }
139: this .injectedObject = new TypedObject(id, type);
140: return this ;
141: }
142:
143: public void processSuccessor(IAction successor) {
144: log.debug("processSuccessor(" + successor + ") - START");
145: ((List<TypedObject>) this.getValue())
146: .add(successor.getObject());
147: }
148:
149: }
|