001: /*
002: * ========================================================================
003: *
004: * Copyright 2003 The Apache Software Foundation.
005: *
006: * Licensed under the Apache License, Version 2.0 (the "License");
007: * you may not use this file except in compliance with the License.
008: * You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: *
018: * ========================================================================
019: */
020: package org.apache.cactus.integration.ant;
021:
022: import java.util.ArrayList;
023: import java.util.List;
024:
025: import org.apache.cactus.integration.ant.container.Container;
026: import org.apache.cactus.integration.ant.container.ContainerFactory;
027: import org.apache.cactus.integration.ant.container.ContainerWrapper;
028: import org.apache.cactus.integration.ant.container.GenericContainer;
029: import org.apache.tools.ant.BuildException;
030: import org.apache.tools.ant.DynamicConfigurator;
031: import org.apache.tools.ant.types.DataType;
032:
033: /**
034: * Ant data type that represents a set of J2EE containers.
035: *
036: * @version $Id: ContainerSet.java 238810 2004-02-29 10:05:26Z vmassol $
037: */
038: public class ContainerSet extends DataType implements
039: DynamicConfigurator {
040:
041: // Instance Variables ------------------------------------------------------
042:
043: /**
044: * The list of nested container elements.
045: */
046: private ContainerFactory factory = new ContainerFactory();
047:
048: /**
049: * The list of nested container and containerset elements.
050: */
051: private List containers = new ArrayList();
052:
053: /**
054: * The timeout in milliseconds.
055: */
056: private long timeout = -1;
057:
058: /**
059: * The proxy port.
060: */
061: private int proxyPort = -1;
062:
063: // DynamicConfigurator Implementation --------------------------------------
064:
065: /**
066: * @see org.apache.tools.ant.DynamicConfigurator#createDynamicElement
067: */
068: public final Object createDynamicElement(String theName)
069: throws BuildException {
070: if (isReference()) {
071: throw noChildrenAllowed();
072: }
073: Container container = this .factory.createContainer(theName);
074: this .containers.add(container);
075: return container;
076: }
077:
078: /**
079: * @see org.apache.tools.ant.DynamicConfigurator#setDynamicAttribute
080: */
081: public final void setDynamicAttribute(String theName,
082: String theValue) throws BuildException {
083: if (isReference()) {
084: throw tooManyAttributes();
085: }
086: throw new BuildException("Attribute [" + theName
087: + "] not supported");
088: }
089:
090: // Public Methods ----------------------------------------------------------
091:
092: /**
093: * Adds a nested generic container to the set of containers.
094: *
095: * @param theContainer The generic container element to add
096: */
097: public final void addGeneric(GenericContainer theContainer) {
098: this .containers.add(theContainer);
099: }
100:
101: /**
102: * Returns an iterator over the nested container elements, in the order
103: * they appear in the build file.
104: *
105: * @return An iterator over the nested container elements
106: */
107: public final Container[] getContainers() {
108: Container[] containers = (Container[]) this .containers
109: .toArray(new Container[this .containers.size()]);
110: if (this .proxyPort > 0) {
111: for (int i = 0; i < containers.length; i++) {
112: containers[i] = new ContainerWrapper(containers[i]) {
113: public int getPort() {
114: return proxyPort;
115: }
116: };
117: }
118: }
119: return containers;
120: }
121:
122: /**
123: * Returns the timeout after which connecting to a container will be
124: * given up, or <code>-1</code> if no timeout has been set.
125: *
126: * @return The timeout in milliseconds
127: */
128: public final long getTimeout() {
129: return this .timeout;
130: }
131:
132: /**
133: * Sets the timeout after which connecting to a container will be given
134: * up.
135: *
136: * @param theTimeout The timeout in milliseconds
137: */
138: public final void setTimeout(long theTimeout) {
139: this .timeout = theTimeout;
140: }
141:
142: /**
143: * Returns the proxy port, or <code>-1</code> if no proxy port has been set.
144: *
145: * @return The proxy port
146: */
147: public final int getProxyPort() {
148: return this .proxyPort;
149: }
150:
151: /**
152: * Sets the proxy port which will be used by the test caller instead
153: * of the real container port. This can be used to insert protocol
154: * tracers between the test caller and the container.
155: *
156: * @param theProxyPort The proxy port to set
157: */
158: public final void setProxyPort(int theProxyPort) {
159: this.proxyPort = theProxyPort;
160: }
161:
162: }
|