001: /*
002: * The contents of this file are subject to the terms of the Common Development
003: * and Distribution License (the License). You may not use this file except in
004: * compliance with the License.
005: *
006: * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
007: * or http://www.netbeans.org/cddl.txt.
008: *
009: * When distributing Covered Code, include this CDDL Header Notice in each file
010: * and include the License file at http://www.netbeans.org/cddl.txt.
011: * If applicable, add the following below the CDDL Header, with the fields
012: * enclosed by brackets [] replaced by your own identifying information:
013: * "Portions Copyrighted [year] [name of copyright owner]"
014: *
015: * The Original Software is NetBeans. The Initial Developer of the Original
016: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
017: * Microsystems, Inc. All Rights Reserved.
018: */
019:
020: package org.netbeans.modules.soa.mapper.basicmapper.methoid;
021:
022: import java.beans.PropertyChangeEvent;
023: import java.beans.PropertyChangeListener;
024: import java.util.List;
025:
026: import org.netbeans.modules.soa.mapper.common.basicmapper.methoid.IField;
027: import org.netbeans.modules.soa.mapper.common.basicmapper.methoid.IFieldNode;
028: import org.netbeans.modules.soa.mapper.common.basicmapper.methoid.IMethoid;
029: import org.netbeans.modules.soa.mapper.common.IMapperNode;
030:
031: /**
032: * A BasicMethoidNode that has the additional capability of automatically
033: * adding one input field each time the last input field is linked to.
034: * This allows the user to always be able to link more inputs to the methoid.
035: *
036: * @author Josh Sandusky
037: */
038: public class BasicAccumulatingMethoidNode extends BasicMethoidNode {
039:
040: /**
041: * the listener to listen on the child node add link event.
042: */
043: private PropertyChangeListener mNodeListListener;
044:
045: /**
046: * Constructor for the AccumulatingMethoidNode object with the specified default
047: * methoid node, and the mapper.
048: *
049: * @param defaultNode the node to be wrapped
050: * @param mapper Description of the Parameter
051: */
052: public BasicAccumulatingMethoidNode(IMethoid methoid) {
053: super (methoid);
054: mNodeListListener = new NodeLinkListener();
055: int i = 1;
056: for (IMapperNode node = getFirstNode(); node != null; node = getNextNode(node)) {
057: IFieldNode fn = (IFieldNode) node;
058: if (fn.isInput()) {
059: node.addPropertyChangeListener(mNodeListListener);
060: IField f = (IField) fn.getFieldObject();
061: String fname = f.getName();
062: String fieldName = fname;
063:
064: int sharp = fname.indexOf('#');
065: if (sharp > 0) {
066: fieldName = fname.substring(0, sharp);
067: fieldName += i;
068: if (sharp + 1 < fname.length()) {
069: fieldName += fname.substring(sharp + 1);
070: }
071: }
072: fn.setName(fieldName);
073: i++;
074: }
075: }
076: addPropertyChangeListener(new ChildNodeListener());
077: }
078:
079: /**
080: * Check if a new child is necessary, and adds a new child.
081: */
082: public void checkAddNew() {
083: List inputNodes = getInputFieldNodes();
084: IFieldNode node = null;
085: for (int i = inputNodes.size() - 1; i >= 0; i--) {
086: node = (IFieldNode) inputNodes.get(i);
087: if (node.getLinkCount() == 0 && !node.hasInPlaceLiteral()) {
088: return;
089: }
090: }
091: if (node != null) {
092: getNextNewNode();
093: }
094: }
095:
096: /**
097: * Add and return the new input child of this methoid.
098: *
099: * @return the new input child of this methoid.
100: */
101: public IFieldNode getNextNewNode() {
102: List inputNodes = getInputFieldNodes();
103: IFieldNode lastNode = (IFieldNode) inputNodes.get(inputNodes
104: .size() - 1);
105: IField f = (IField) lastNode.getFieldObject();
106: String fname = f.getName();
107: String fieldName = fname;
108: int sharp = fname.indexOf('#');
109: if (sharp > 0) {
110: fieldName = fname.substring(0, sharp);
111: fieldName += (inputNodes.size() + 1);
112: if (sharp + 1 < fname.length()) {
113: fieldName += fname.substring(sharp + 1);
114: }
115: }
116: String fieldTypeName = lastNode.getTypeName();
117: IField newField = new BasicField(fname, lastNode.getTypeName(),
118: lastNode.getToolTipText(), f.getData(), true, false, f
119: .getLiteralUpdater());
120: IFieldNode newFieldNode = new BasicFieldNode(newField);
121: newFieldNode.setName(fieldName);
122: addNextNode(lastNode, newFieldNode);
123: return newFieldNode;
124: }
125:
126: /**
127: * Return a cloned instance of AccumulatingMethoidNode. The mapper is not cloned.
128: *
129: * @return a cloned instance of AccumulatingMethoidNode.
130: */
131: public Object clone() {
132: BasicAccumulatingMethoidNode newNode = (BasicAccumulatingMethoidNode) super
133: .clone();
134: newNode.mNodeListListener = new NodeLinkListener();
135: for (IMapperNode node = newNode.getFirstNode(); node != null; node = newNode
136: .getNextNode(node)) {
137: if (((IFieldNode) node).isInput()) {
138: node
139: .addPropertyChangeListener(newNode.mNodeListListener);
140: }
141: }
142: newNode.addPropertyChangeListener(new ChildNodeListener());
143: return newNode;
144: }
145:
146: /**
147: * Property listener listens on the child node add link event.
148: *
149: * @author sleong
150: * @created January 29, 2003
151: */
152: private class NodeLinkListener implements PropertyChangeListener {
153: /**
154: * Listens on the child node add link event. Add new node if necessary.
155: *
156: * @param e the PropertyChangeEvent.
157: */
158: public void propertyChange(PropertyChangeEvent e) {
159: if (e.getPropertyName().equals(IMapperNode.LINK_ADDED)) {
160: checkAddNew();
161: }
162: }
163: }
164:
165: /**
166: * Property listener listens on the new and remove child node of this
167: * methoid.
168: *
169: * @author sleong
170: * @created January 29, 2003
171: */
172: private class ChildNodeListener implements PropertyChangeListener {
173: /**
174: * Add and remove the child property listener, if new or remove child
175: * happened, accordingly.
176: *
177: * @param e the PropertyChangeEvent
178: */
179: public void propertyChange(PropertyChangeEvent e) {
180: if (e.getPropertyName().equals(NODE_INSERTED)) {
181: IMapperNode n = (IMapperNode) e.getNewValue();
182: n.addPropertyChangeListener(mNodeListListener);
183: } else if (e.getPropertyName().equals(NODE_REMOVED)) {
184: IMapperNode n = (IMapperNode) e.getOldValue();
185: n.removePropertyChangeListener(mNodeListListener);
186: checkAddNew();
187: }
188: }
189: }
190: }
|