// Copyright (C) 2012 jOVAL.org. All rights reserved.
// This software is licensed under the AGPL 3.0 license available at http://www.joval.org/agpl_v3.txt
package jwsmv.wsman.operation;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Vector;
import javax.security.auth.login.FailedLoginException;
import javax.xml.bind.JAXBException;
import javax.xml.datatype.Duration;
import javax.xml.ws.http.HTTPException;
import org.xmlsoap.ws.addressing.EndpointReferenceType;
import org.dmtf.wsman.AttributableDuration;
import org.dmtf.wsman.AttributableURI;
import org.dmtf.wsman.OptionSet;
import org.dmtf.wsman.SelectorSetType;
import jwsmv.Constants;
import jwsmv.wsman.FaultException;
import jwsmv.wsman.Port;
/**
* Base class for all WSMV operations.
*
* @author David A. Solin
* @version %I%, %G%
*/
abstract class BaseOperation<I, O> implements IOperation<I, O>, Constants {
String action;
List<Object> headers;
AttributableDuration duration = null;
I input;
public BaseOperation(String action, I input) {
this.action = action;
this.input = input;
headers = new Vector<Object>();
}
public void addHeader(Object obj) {
headers.add(obj);
}
public void addSelectorSet(SelectorSetType selectors) {
headers.add(Factories.WSMAN.createSelectorSet(selectors));
}
// Implement IOperation
public void setTimeout(long millis) {
if (duration == null) {
duration = Factories.WSMAN.createAttributableDuration();
}
duration.setValue(Factories.XMLDT.newDuration(millis));
}
public void addResourceURI(String str) {
AttributableURI uri = Factories.WSMAN.createAttributableURI();
uri.setValue(str);
uri.getOtherAttributes().put(MUST_UNDERSTAND, "true");
headers.add(Factories.WSMAN.createResourceURI(uri));
}
public O dispatch(Port port) throws IOException, HTTPException, JAXBException, FaultException, FailedLoginException {
@SuppressWarnings("unchecked")
O result = (O)dispatch0(port);
return result;
}
// Internal
/**
* The internal implementation of dispatch, which subclasses that override the typed public dispatch method can use.
*/
final Object dispatch0(Port port) throws IOException, HTTPException, JAXBException, FaultException, FailedLoginException {
List<Object> dispatchHeaders = new Vector<Object>();
dispatchHeaders.addAll(headers);
if (duration != null) {
dispatchHeaders.add(Factories.WSMAN.createOperationTimeout(duration));
}
return port.dispatch(action, dispatchHeaders, input);
}
}