blob: 22456a81049ea7d439caa01244832a9b8e9e5f27 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.tomcat5.progress;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.enterprise.deploy.shared.StateType;
import javax.enterprise.deploy.spi.TargetModuleID;
import javax.enterprise.deploy.spi.exceptions.OperationUnsupportedException;
import javax.enterprise.deploy.spi.status.ClientConfiguration;
import javax.enterprise.deploy.spi.status.DeploymentStatus;
import javax.enterprise.deploy.spi.status.ProgressEvent;
import javax.enterprise.deploy.spi.status.ProgressListener;
import javax.enterprise.deploy.spi.status.ProgressObject;
import org.openide.util.Parameters;
/**
* MultiProgressObjectWrapper wraps multiple progress objects into a single one.
* <p>
* If all wrapped objects are in COMPLETED or FAILED state the state object
* will be changed to:
* <ul>
* <li>{@link StateType.COMPLETED} if all wrapped objects reached the COMPLETED state
* <li>{@link StateType.FAILED} if any of wrapped objects reached the FAILED state
* </ul>
* <p>
* Note that all wrapped objects have to be in COMPLETED or FAILED state to
* invoke the change of the state of this object. However this does not mean
* the events from the wrapped objects are not propagated to the listeners of
* this object.
* <p>
* The behaviour of {@link StateType.RELEASED} is quite unsure from JSR-88.
* This implementation does not consider it as end state of the ProgressObject.
*
* @author herolds
* @author Petr Hejl
*/
public class MultiProgressObjectWrapper implements ProgressObject, ProgressListener {
private final ProgressEventSupport pes = new ProgressEventSupport(this);
private final ProgressObject[] progressObjects;
private String message = ""; // NOI18N
private StateType state = StateType.RUNNING;
/** Creates a new instance of MultipleOpsProgressObject */
public MultiProgressObjectWrapper(ProgressObject[] objects) {
Parameters.notNull("progObjs", state);
if (objects.length == 0) {
throw new IllegalArgumentException("At least one progress object must be passed."); // NOI18N
}
progressObjects = new ProgressObject[objects.length];
System.arraycopy(objects, 0, progressObjects, 0, objects.length);
for (int i = 0; i < objects.length; i++) {
ProgressObject po = objects[i];
// XXX unsafe publication
po.addProgressListener(this);
}
updateState(null);
}
/** JSR88 method. */
public ClientConfiguration getClientConfiguration(TargetModuleID targetModuleID) {
return null; // PENDING
}
/** JSR88 method. */
public synchronized DeploymentStatus getDeploymentStatus() {
DeploymentStatus ds = progressObjects[0].getDeploymentStatus();
// all deployment objects are supposed to be of the same action and command type
return new Status(ds.getAction(), ds.getCommand(), message, state);
}
/** JSR88 method. */
public TargetModuleID[] getResultTargetModuleIDs() {
List<TargetModuleID> returnVal = new ArrayList<TargetModuleID>();
for (int i = 0; i < progressObjects.length; i++) {
ProgressObject po = progressObjects[i];
if (po.getDeploymentStatus().isCompleted()) {
returnVal.addAll(Arrays.asList(po.getResultTargetModuleIDs()));
}
}
return returnVal.toArray(new TargetModuleID[returnVal.size()]);
}
/** JSR88 method. */
public boolean isCancelSupported() {
return false;
}
/** JSR88 method. */
public void cancel() throws OperationUnsupportedException {
throw new OperationUnsupportedException("cancel not supported in Tomcat deployment"); // NOI18N
}
/** JSR88 method. */
public boolean isStopSupported() {
return false;
}
/** JSR88 method. */
public void stop() throws OperationUnsupportedException {
throw new OperationUnsupportedException("stop not supported in Tomcat deployment"); // NOI18N
}
/** JSR88 method. */
public void addProgressListener(ProgressListener l) {
pes.addProgressListener(l);
}
/** JSR88 method. */
public void removeProgressListener(ProgressListener l) {
pes.removeProgressListener(l);
}
/**
* Handles the progress events from wrapped objects.
*/
public void handleProgressEvent(ProgressEvent progressEvent) {
updateState(progressEvent.getDeploymentStatus().getMessage());
pes.fireHandleProgressEvent(progressEvent.getTargetModuleID(), progressEvent.getDeploymentStatus());
}
private synchronized void updateState(String receivedMessage) {
if (state == StateType.COMPLETED || state == StateType.FAILED) {
return;
}
boolean completed = true;
boolean failed = false;
for (ProgressObject progress : progressObjects) {
DeploymentStatus status = progress.getDeploymentStatus();
if (status == null || (!status.isCompleted() && !status.isFailed())) {
completed = false;
break;
}
if (status.isFailed()) {
failed = true;
}
}
if (completed) {
state = failed ? StateType.FAILED : StateType.COMPLETED;
message = receivedMessage == null ? "" : receivedMessage;
}
}
}