All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hpccsystems.ws.client.HPCCWsWorkUnitsClient Maven / Gradle / Ivy

Go to download

This project allows a user to interact with ESP services in a controlled manner. The API calls available under org.hpccsystems.ws.client.platform allow for a user to target ESP's across multiple environments running a range of hpccsystems-platform versions. There is no guarantee that if a user utilizes org.hpccsystems.ws.client.gen generated stub code from wsdl, that the calls will be backwards compatible with older hpccsystems-platform versions.

There is a newer version: 9.8.38-1
Show newest version
package org.hpccsystems.ws.client;

import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map.Entry;
import java.util.List;
import java.util.Set;

import org.apache.log4j.Logger;
import org.apache.axis.client.Stub;
import org.apache.axis.utils.StringUtils;
import org.apache.axis.types.NonNegativeInteger;
import org.hpccsystems.ws.client.HPCCWsSMCClient;
import org.hpccsystems.ws.client.gen.wsworkunits.v1_74.*;
import org.hpccsystems.ws.client.platform.WUState;
import org.hpccsystems.ws.client.platform.Workunit;
import org.hpccsystems.ws.client.platform.WorkunitInfo;
import org.hpccsystems.ws.client.platform.ECLResultInfo;
import org.hpccsystems.ws.client.platform.QueryFileInfo;
import org.hpccsystems.ws.client.platform.QueryResult;
import org.hpccsystems.ws.client.platform.QuerySetFilterType;
import org.hpccsystems.ws.client.platform.Version;
import org.hpccsystems.ws.client.platform.WUActionCode;
import org.hpccsystems.ws.client.platform.WULogFileInfo;
import org.hpccsystems.ws.client.platform.WUQueryInfo;
import org.hpccsystems.ws.client.utils.Connection;
import org.hpccsystems.ws.client.utils.DataSingleton;
import org.hpccsystems.ws.client.utils.EqualsUtil;
import org.hpccsystems.ws.client.utils.HashCodeUtil;
import org.hpccsystems.ws.client.utils.WUFileType;
import org.hpccsystems.ws.client.wrappers.ApplicationValueWrapper;
import org.hpccsystems.ws.client.wrappers.WUExceptionWrapper;
import org.hpccsystems.ws.client.wrappers.wsdfu.WsDFUClientSoapProxyWrapper;
import org.hpccsystems.ws.client.wrappers.wsworkunits.WUCreateAndUpdateWrapper;
import org.hpccsystems.ws.client.wrappers.wsworkunits.WUCreateRequestWrapper;
import org.hpccsystems.ws.client.wrappers.wsworkunits.WUCreateResponseWrapper;

import org.hpccsystems.ws.client.wrappers.wsworkunits.WUInfoRequestWrapper;
import org.hpccsystems.ws.client.wrappers.wsworkunits.WUInfoResponseWrapper;
import org.hpccsystems.ws.client.wrappers.wsworkunits.WUUpdateRequestWrapper;
import org.hpccsystems.ws.client.wrappers.wsworkunits.WUUpdateResponseWrapper;
import org.hpccsystems.ws.client.wrappers.wsworkunits.WsWorkunitsClientSoapProxyWrapper;

/**
 * ESP Client code for common WsWorkUnits operations
 */
public class HPCCWsWorkUnitsClient extends DataSingleton
{
    public static HPCCWsWorkUnitsClient get(Connection connection)
    {
        return new HPCCWsWorkUnitsClient(connection);
    }

    private static final Logger                           log                            = Logger.getLogger(HPCCWsWorkUnitsClient.class.getName());
    public static final String                            WSWORKUNITSWSDLURI             = "/WsWorkunits";
    private WsWorkunitsServiceSoapProxy                   wsWorkunitsServiceSoapProxy    = null;
    public static final int                               defaultWaitTime                = 10000;
    public static final int                               defaultResultLimit             = 100;
    public static final int                               defaultMaxWaitTime             = 1000 * 60 * 5;
    private Version                                       targetVersion                  = null;
    private boolean                                       verbose                        = false;
    private WsWorkunitsClientSoapProxyWrapper             soapWrapper                    =null;
    private static URL                                    originalURL;
    private String                                        initErrMessage                 = "";

    /**
     * Should be called after instantiation to confirm
     * Successful initialization.
     *
     * The client init can fail due to many different types of issues
     * including invalid connectivity options, invalid credentials, etc
     *
     * @return
     */
    public boolean hasInitError()
    {
        return !initErrMessage.isEmpty();
    }

    /**
     * Returns error message encountered during initialization of wsdfuclient.
     * Empty string if no error encountered
     * @return
     */
    public String getInitError()
    {
        return initErrMessage;
    }

    /**
     * Provides the WSDL URL originally used to create the underlying stub code
     * @return
     * @throws MalformedURLException
     */
    public static URL getOriginalURL() throws MalformedURLException
    {
        if (originalURL == null) originalURL = new URL(getOriginalWSDLURL());

        return originalURL;
    }

    /**
     * Provides the WSDL port originally used to create the underlying stub code
     * @return
     * @throws MalformedURLException
     */
    public static int getOriginalPort() throws MalformedURLException
    {
        return getOriginalURL().getPort();
    }

    /**
     * Performs limited refresh of local WU instance based on that WU's state on target
     * HPCC cluster if state of WU has not changed, Graphs, Results,ResultsView, ResultSchemas,
     * SourceFiles, ApplicationValues are not updated. However if local WU instance's state
     * is found to differ from the server's version, a full refresh is performed.
     *
     * @param wu
     * @throws Exception
     */
    protected void fastWURefresh(WorkunitInfo wu) throws Exception
    {
        getSoapProxy();

        WUState previousState = getStateID(wu);

        WUQuery request = new WUQuery();
        request.setWuid(wu.getWuid());
        request.setCount(1);

        WUQueryResponse response = wsWorkunitsServiceSoapProxy.WUQuery(request);
        if (response.getWorkunits() != null && response.getWorkunits().length == 1)
        {
            wu.update(response.getWorkunits()[0]);
        }

        if (previousState != getStateID(wu))
        {
            fullWURefresh(wu);
        }
    }

    /**
     * Performs full refresh of local WU instance based on that WU's state on target
     * HPCC cluster. Full refresh includes Graphs, Results,ResultsView, ResultSchemas,
     * SourceFiles, ApplicationValues.
     *
     * @param wu
     * @throws Exception
     */
    protected void fullWURefresh(WorkunitInfo wu) throws Exception
    {
        fullWURefresh(wu, true, true, true, true);
    }

    /**
     * Synchronizes local WU instance with current state of that WU on target HPCC cluster.
     * Caller can choose which portions of the wu state to update.
     * @param wu
     * @param includeGraphs
     * @param includeResults
     * @param includeSourceFiles
     * @param includeApplicationValues
     * @throws Exception
     */
    void fullWURefresh(WorkunitInfo wu, boolean includeGraphs, boolean includeResults, boolean includeSourceFiles, boolean includeApplicationValues) throws Exception
    {
        getSoapProxy();

        WUInfoRequestWrapper request = new WUInfoRequestWrapper();
        request.setWuid(wu.getWuid());
        request.setIncludeGraphs(includeGraphs);
        request.setIncludeResults(includeResults);
        request.setIncludeResultsViewNames(includeResults);
        request.setSuppressResultSchemas(!includeResults);
        request.setIncludeSourceFiles(includeSourceFiles);
        request.setIncludeApplicationValues(includeApplicationValues);

        WUInfoResponseWrapper response = soapWrapper.WUInfo(request);

        if (response.getWorkunit() == null)
        {
            // Call succeeded, but no response...
            for (WUExceptionWrapper e : response.getExceptions())
            {
                if (e.getCode().equals("20082") || e.getCode().equals("20080"))
                {
                    // No longer exists... //$NON-NLS-1$ //$NON-NLS-2$
                    wu.setStateID(999);
                    // setChanged();
                    // notifyObservers(Notification.WORKUNIT);
                    break;
                }
            }
        }
        else
        {
            wu.update(response.getWorkunit());
        }
    }

    /**
     * @param verbose
     *            - sets verbose mode
     */
    public void setVerbose(boolean verbose)
    {
        this.verbose = verbose;
    }

    /**
     * Provides soapproxy object for HPCCWsWorkUnitsClient which can be used to access the web service methods directly
     *
     * @return soapproxy for HPCCWsWorkUnitsClient
     * @throws Exception
     *             if soapproxy not available
     */
    public WsWorkunitsServiceSoapProxy getSoapProxy() throws Exception
    {
        if (wsWorkunitsServiceSoapProxy != null)
            return wsWorkunitsServiceSoapProxy;
        else
            throw new Exception("wsTopologyServiceSoapProxy not available.");
    }

    /**
     * Provides the WSDL URL originally used to create the underlying stub code
     *
     * @return original WSLD URL
     */
    public static String getOriginalWSDLURL()
    {
        return (new WsWorkunitsLocator()).getWsWorkunitsServiceSoapAddress();
    }

    /**
     * @param wsWorkunitsServiceSoapProxy
     */
    protected HPCCWsWorkUnitsClient(WsWorkunitsServiceSoapProxy wsWorkunitsServiceSoapProxy)
    {
        this.wsWorkunitsServiceSoapProxy = wsWorkunitsServiceSoapProxy;
    }

    /**
     * @param baseConnection
     */
    protected HPCCWsWorkUnitsClient(Connection baseConnection)
    {
        this(baseConnection.getProtocol(), baseConnection.getHost(), baseConnection.getPort(),
                baseConnection.getUserName(), baseConnection.getPassword());
    }

    /**
     * @param protocol
     * @param targetHost
     * @param targetPort
     * @param user
     * @param pass
     */
    protected HPCCWsWorkUnitsClient(String protocol, String targetHost, String targetPort, String user, String pass)
    {
        try
        {
            initErrMessage = "";
            String address = Connection.buildUrl(protocol, targetHost, targetPort, WSWORKUNITSWSDLURI);
            HPCCWsSMCClient wssmc = new HPCCWsSMCClient(protocol, targetHost, targetPort, user, pass);
            targetVersion = new Version(wssmc.getHPCCBuild());
            initWsWorkUnitsSoapProxy(address, user, pass);
        }
        catch (Exception e)
        {
            log.error("HPCCWsWorkUnitsClient: Could not stablish target HPCC bulid version, review all HPCC connection values");
            if (!e.getLocalizedMessage().isEmpty())
            {
                initErrMessage = e.getLocalizedMessage();
                log.error("HPCCWsWorkUnitsClient: " + e.getLocalizedMessage()) ;
            }
        }
    }

    /**
     * Initializes the service's underlying soap proxy. Should only be used by constructors
     *
     * @param baseURL
     *            Target service base URL
     * @param user
     *            User credentials
     * @param pass
     *            User credentials
     * @throws Exception
     */
    private void initWsWorkUnitsSoapProxy(String baseURL, String user, String pass) throws Exception
    {
        if (targetVersion != null)
        {
            soapWrapper = new WsWorkunitsClientSoapProxyWrapper(baseURL, user,pass,targetVersion);
            wsWorkunitsServiceSoapProxy = soapWrapper.getLatestRaw();
        }
        else
            throw new Exception("Cannot initialize WsWorkUnitsSoapProxy without valid HPCC version object");
    }

    /**
     * Reports if the WU in question is in the compiled state. Makes a call to the target Web Service to extract
     * information about the WU
     *
     * @param wuid
     * @return true if state is compiled
     * @throws Exception
     */
    public boolean isWorkunitCompiled(String wuid) throws Exception
    {
        WorkunitInfo thewui = getWUInfo(wuid);
        if (thewui != null) return isWorkunitCompiled(thewui);

        return false;
    }

    /**
     * Reports if the WU in question is in the compiled state. Does not make call to the target Web Service, extracts
     * information from the WU object
     *
     * @param thewui
     * @return true if state is compiled
     */
    public boolean isWorkunitCompiled(WorkunitInfo thewui)
    {
        return isWorkunitState(getStateID(thewui), WUState.COMPILED);
    }

    /**
     * Reports if the WU in question is in the failed state. Does not make call to the target Web Service, extracts
     * information from the WU object
     *
     * @param thewui
     * @return true if state is failed
     */
    public boolean isWorkunitFailed(WorkunitInfo thewui)
    {
        return isWorkunitState(getStateID(thewui), WUState.FAILED);
    }

    /**
     * Reports if the string state represents the failed state
     *
     * @param state
     * @return true if state is failed
     */
    public boolean isWorkunitFailed(String state)
    {
        return state.equalsIgnoreCase(WUState.FAILED.toString());
    }

    /**
     * Compares two WuStates
     *
     * @param state1
     * @param state2
     * @return true if state1 == state2
     */
    static private boolean isWorkunitState(WUState state1, WUState state2)
    {
        return state1 == state2;
    }

    /**
     * Replies true if given wuid is in complete state. This method makes call to WS, it is preferable to use WU object
     * version
     *
     * @param wuid
     * @return
     * @throws Exception
     */
    public boolean isWorkunitComplete(String wuid) throws Exception
    {
        WorkunitInfo thewui = getWUInfo(wuid);
        if (thewui != null)
        {
            return isWorkunitComplete(thewui);
        }

        return false;
    }

    /**
     * Replies true if given wuid is in complete state. This method does not make a call to WS, and it is preferable over
     * the version that calls WS.
     *
     * @param thewui
     * @return true if wu is in one of the complete states
     */
    static public boolean isWorkunitComplete(WorkunitInfo thewui)
    {
        WUActionCode origAction = WUActionCode.fromName(thewui.getActionEx()); // some WUs have ActionEX as a string
        if (origAction == WUActionCode.WUActionUnknown)
            origAction = WUActionCode.fromInteger(thewui.getAction()); // some WUs have Action as a code

        return isWorkunitComplete(getStateID(thewui), origAction);
    }

    /**
     * reports if a workunit is complete based on wustate, and original action if available
     *
     * @param state
     * @return true if wu is in completed state
    */
    static public boolean isWorkunitComplete(WUState state, WUActionCode origAction)
    {
        if (origAction == WUActionCode.WUActionRun && isWorkunitState(state, WUState.COMPILED))
            return false;

        return isWorkunitComplete(state);
    }

    /**
     * reports if WuState is in the completed set
     *
     * @param state
     * @return true if state is in completed set
     */
    static public boolean isWorkunitComplete(WUState state)
    {
        switch (state)
        {
            case UNKNOWN_ONSERVER:
            case COMPLETED:
            case FAILED:
            case ABORTED:
            case ARCHIVED:
            case COMPILED:
                return true;
            case ABORTING:
            case BLOCKED:
            case COMPILING:
            case LAST:
            case RUNNING:
            case SCHEDULED:
            case SUBMITTED:
            case UNKNOWN:
            case WAIT:
            case PAUSED:
            default:
                return false;
        }
    }

    /**
     *
     * @param wu
     *            the workunit
     * @return the state of the workunit
     */
    public static WUState getStateID(WorkunitInfo wu)
    {
        if (wu != null)
        {
            if (wu.getStateID() != null)
            {
                return getStateID(wu.getStateID());
            }
            else if (wu.getState() != null)
            {
                return Workunit.translateWUState(wu.getState());
            }
        }

        return WUState.UNKNOWN;
    }

    /**
     * Converts integer representation of WU state, to WUState enumeration
     *
     * @param id
     * @return WU state enumeration
     */
    public static WUState getStateID(Integer id)
    {
        switch (id)
        {
            case 1:
                return WUState.COMPILED;
            case 2:
                return WUState.RUNNING;
            case 3:
                return WUState.COMPLETED;
            case 4:
                return WUState.FAILED;
            case 5:
                return WUState.ARCHIVED;
            case 6:
                return WUState.ABORTING;
            case 7:
                return WUState.ABORTED;
            case 8:
                return WUState.BLOCKED;
            case 9:
                return WUState.SUBMITTED;
            case 10:
                return WUState.SCHEDULED;
            case 11:
                return WUState.COMPILING;
            case 12:
                return WUState.WAIT;
            case 13:
                return WUState.WAIT;
            case 14:
                return WUState.WAIT;
            case 15:
                return WUState.RUNNING;
            case 16:
                return WUState.PAUSED;
            case 999:
                return WUState.UNKNOWN_ONSERVER;
            default:
                return WUState.UNKNOWN;
        }
    }

    /**
     * Attempts to create, compile and publish a query based on ecl provided via a workunitinfo object.
     *
     * @param wu  - Workunitinfo object containing all pertinent information for WU request
     * @return
     * @throws Exception
     */
    public WUPublishWorkunitResponse publishWUFromEcl(WorkunitInfo wu) throws Exception
    {
        WUPublishWorkunitResponse publishWUResp = null;

        getSoapProxy();
        if (wu.getECL() == null || wu.getECL().length() == 0)
            throw new Exception("Empty ECL submited");
        else
        {
            WorkunitInfo eclwu = createWUFromECL(wu);

            try
            {
                Thread.sleep(wu.getSleepMillis());
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }

            submitWU(eclwu); // if no exception proceed
            monitorWUToCompletion(eclwu);
            publishWUResp = publishWU(eclwu);
        }

        return publishWUResp;
    }

    /**
     * Attempts to publish a query based on a given Workunit.
     *
     * @param wu
     * @return
     * @throws Exception
     */
    public WUPublishWorkunitResponse publishWU(WorkunitInfo wu) throws Exception
    {
        WUPublishWorkunitResponse publishWUResp = null;

        getSoapProxy();
        if (wu == null)
            throw new Exception("Invalid wuid submited");
        else
        {
            WUPublishWorkunit publishWU = new WUPublishWorkunit();
            publishWU.setJobName(wu.getJobname());
            publishWU.setWuid(wu.getWuid());
            publishWU.setCluster(wu.getCluster());
            publishWU.setActivate((int) 1);

            publishWUResp = wsWorkunitsServiceSoapProxy.WUPublishWorkunit(publishWU);

            ArrayOfEspException exceptions = publishWUResp.getExceptions();
            if (exceptions != null)
            {
                throwWsWUExceptions(exceptions, "Could not publish WU");
            }
        }

        return publishWUResp;
    }

    public void publishWU(String wuid) throws Exception
    {
        getSoapProxy();

        if (wuid == null || wuid.isEmpty())
            throw new Exception("Invalid wuid submited");
        else
        {
            WUPublishWorkunit publishWU = new WUPublishWorkunit();
            publishWU.setWuid(wuid);

            wsWorkunitsServiceSoapProxy.WUPublishWorkunit(publishWU);
        }
    }

    /**
     * Get information about a given WorkUnit. Workunit must not be archived.
     *
     * @param wuid       - ID of target workunit
     * @return           - ECLWorkunit object with information pertaining to the WU
     * @throws Exception - Caller must handle exceptions
     */
    public WorkunitInfo getWUInfo(String wuid) throws Exception
    {
        return getWUInfo(wuid, false);
    }

    /**
     * Get information about a given WorkUnit, caller can request to unarchive
     * the WU if necessary to fetch WU info.
     *
     * @param wuid
     *            - ID of target workunit
     * @param unarchive
     *            - unarchive archived workunit
     * @return - ECLWorkunit object with information pertaining to the WU
     * @throws Exception
     *             - Caller must handle exceptions
     */
    public WorkunitInfo getWUInfo(String wuid, boolean unarchive) throws Exception
    {

        WorkunitInfo workunit = null;

        getSoapProxy();

        WUInfoRequestWrapper wuinfodetailsparams = new WUInfoRequestWrapper();
        wuinfodetailsparams.setIncludeApplicationValues(false);
        wuinfodetailsparams.setIncludeDebugValues(false);
        wuinfodetailsparams.setIncludeExceptions(true);
        wuinfodetailsparams.setIncludeGraphs(false);
        wuinfodetailsparams.setIncludeResults(true);
        wuinfodetailsparams.setWuid(wuid);
        WUInfoResponseWrapper wuInfoResponse = soapWrapper.WUInfo(wuinfodetailsparams);
        ArrayOfEspException exceptions = wuInfoResponse.getRawArrayOfEspExceptions();
        if (exceptions == null && wuInfoResponse.getWorkunit() != null)
        {
            if (unarchive && wuInfoResponse.getWorkunit().getArchived())
            {
                doWorkunitAction(wuid, ECLWUActions.Restore);
                return getWUInfo(wuid);
            }
            workunit = wuInfoResponse.getWorkunit();
            workunit.setOriginalEclWatchUrl(getEclWatchUrl());

        }
        else
        {
            throwWsWUExceptions(exceptions, "Could not fetch WU Info");
        }

        return workunit;
    }

    /**
     * Get information about a given WorkUnit, Workunit must not be archived.
     * Caller can choose which WU information portion to fetch
     * @param wuid
     * @param includeResults
     * @param includeGraphs
     * @param includeSourceFiles
     * @param includeApplicationValues
     * @param includeDebugValues
     * @param includeExceptions
     * @param includeVariables
     * @param includeXmlSchemas
     * @param includeTimers
     * @return
     * @throws Exception
     */
    public WorkunitInfo getWUInfo(String wuid, boolean includeResults, boolean includeGraphs,
            boolean includeSourceFiles, boolean includeApplicationValues, Boolean includeDebugValues,
            Boolean includeExceptions, Boolean includeVariables, Boolean includeXmlSchemas, Boolean includeTimers)
                    throws Exception
    {
        return getWUInfo(wuid, includeResults, includeGraphs, includeSourceFiles, includeApplicationValues,
                includeDebugValues, includeExceptions, includeVariables, includeXmlSchemas, includeTimers, false);
    }

    /**
     * Get information about a given WorkUnit, caller can request to unarchive
     * Caller can choose which WU information portion to fetch
     *
     * @param wuid
     * @param includeResults
     * @param includeGraphs
     * @param includeSourceFiles
     * @param includeApplicationValues
     * @param includeDebugValues
     * @param includeExceptions
     * @param includeVariables
     * @param includeXmlSchemas
     * @param includeTimers
     * @param unarchive
     * @return
     * @throws Exception
     */
    public WorkunitInfo getWUInfo(String wuid, boolean includeResults, boolean includeGraphs,
            boolean includeSourceFiles, boolean includeApplicationValues, Boolean includeDebugValues,
            Boolean includeExceptions, Boolean includeVariables, Boolean includeXmlSchemas, Boolean includeTimers,
            boolean unarchive) throws Exception
    {
        getSoapProxy();

        WUInfoRequestWrapper request = new WUInfoRequestWrapper();
        request.setWuid(wuid);
        request.setIncludeGraphs(includeGraphs);
        request.setIncludeResults(includeResults);
        request.setIncludeResultsViewNames(includeResults);
        request.setSuppressResultSchemas(!includeResults);
        request.setIncludeSourceFiles(includeSourceFiles);
        request.setIncludeApplicationValues(includeApplicationValues);
        request.setIncludeDebugValues(includeDebugValues);
        request.setIncludeExceptions(includeExceptions);
        request.setIncludeTimers(includeTimers);
        request.setIncludeVariables(includeVariables);
        request.setIncludeXmlSchemas(includeXmlSchemas);

        WUInfoResponseWrapper resp = soapWrapper.WUInfo(request);

        this.throwWsWUExceptions(resp.getRawArrayOfEspExceptions(), "Could not retrieve workunit:");
        WorkunitInfo wk = resp.getWorkunit();
        if (unarchive && wk != null && wk.getArchived() != null && wk.getArchived())
        {
            doWorkunitAction(wuid, ECLWUActions.Restore);
            return getWUInfo(wuid, includeResults, includeGraphs, includeSourceFiles, includeApplicationValues,
                    includeDebugValues, includeExceptions, includeVariables, includeXmlSchemas, includeTimers,
                    false);
        }
        if (wk==null)
        {
            return null;
        }
        wk.setResultViews(resp.getResultViews());
        return wk;
    }

    /**
     * This method queries WU information using a bogus WUID. Used as a mechanism for testing connectivity with HPCC
     * ESP. Temporarily increases timeout value to 3 seconds;
     *
     * @return           - True if able to reply is received within timout value of 3 secs, false otherwise
     * @throws Exception - Caller must handle exceptions
     */
    public boolean testWUQuery() throws Exception
    {
        int oldTimeout = -1;

        getSoapProxy();

        WUQuery request = new WUQuery();
        request.setWuid("XXX"); //$NON-NLS-1$
        try
        {
            oldTimeout = ((Stub) wsWorkunitsServiceSoapProxy.getWsWorkunitsServiceSoap()).getTimeout();

            ((org.apache.axis.client.Stub) wsWorkunitsServiceSoapProxy.getWsWorkunitsServiceSoap()).setTimeout(3 * 1000);

            wsWorkunitsServiceSoapProxy.WUQuery(request);
            return true;
        }
        catch (ArrayOfEspException e)
        {}
        catch (RemoteException e)
        {}
        finally
        {
            if (oldTimeout != -1)
                ((org.apache.axis.client.Stub) wsWorkunitsServiceSoapProxy.getWsWorkunitsServiceSoap()).setTimeout(oldTimeout);
        }
        return false;
    }

    /**
     * Converts EspException from v1_56 to v1_58
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.EspException  in
     * @return EspException
     */
    private EspException convertEspException(org.hpccsystems.ws.client.gen.wsworkunits.v1_56.EspException in)
    {
        EspException out = new EspException();
        if (in.getCode() != null) out.setCode(in.getCode());
        if (in.getAudience() != null) out.setAudience(in.getAudience());
        if (in.getSource() != null) out.setSource(in.getSource());
        if (in.getMessage() != null) out.setMessage(in.getMessage());
        return out;
    }

    /**
     * Converts ArrayOfEspException from v1_56 to v1_58
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ArrayOfEspException in
     * @return ArrayOfEspException
     */
    private ArrayOfEspException convertArrayOfEspException(org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ArrayOfEspException in)
    {
        if (in==null)
        {
            return null;
        }

        ArrayOfEspException out = new ArrayOfEspException();
        if (in.getSource() != null) out.setSource(in.getSource());
        if (in.getException() != null)
        {
            EspException[] temp_exceptions = new EspException[in.getException().length];
            for (int i = 0; i < in.getException().length; i++)
            {
                temp_exceptions[i] = convertEspException(in.getException(i));
            }
            out.setException(temp_exceptions);
        }
        return out;
    }

    /**
     * Converts ThorLogInfo from v1_56 to v1_58
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ThorLogInfo in
     * @return ThorLogInfo
     */
    private ThorLogInfo convertThorLogInfo(org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ThorLogInfo in)
    {
        ThorLogInfo out = new ThorLogInfo();
        if (in.getProcessName() != null) out.setProcessName(in.getProcessName());
        if (in.getClusterGroup() != null) out.setClusterGroup(in.getClusterGroup());
        if (in.getLogDate() != null) out.setLogDate(in.getLogDate());
        if (in.getNumberSlaves() != null) out.setNumberSlaves(in.getNumberSlaves());
        return out;
    }

    /**
     * Converts ECLQuery from v1_56 to v1_58
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLQuery in
     * @return ECLQuery
     */
    private ECLQuery convertECLQuery(org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLQuery in)
    {
        ECLQuery out = new ECLQuery();
        if (in.getText() != null) out.setText(in.getText());
        if (in.getCpp() != null) out.setCpp(in.getCpp());
        if (in.getResTxt() != null) out.setResTxt(in.getResTxt());
        if (in.getDll() != null) out.setDll(in.getDll());
        if (in.getDll() != null) out.setThorLog(in.getThorLog());
        if (in.getQueryMainDefinition() != null) out.setQueryMainDefinition(in.getQueryMainDefinition());
        return out;
    }

    /**
     * Converts ECLHelpFile from v1_56 to v1_58
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLHelpFile in
     * @return ECLHelpFile
     */
    private ECLHelpFile convertECLHelpFile(org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLHelpFile in)
    {
        ECLHelpFile out = new ECLHelpFile();
        if (in.getName() != null) out.setName(in.getName());
        if (in.getType() != null) out.setType(in.getType());
        if (in.getIPAddress() != null) out.setIPAddress(in.getIPAddress());
        if (in.getDescription() != null) out.setDescription(in.getDescription());
        if (in.getFileSize() != null) out.setFileSize(in.getFileSize());
        if (in.getPID() != null) out.setPID(in.getPID());
        // minActivityID and maxActivityId not supported in 1.56
        return out;
    }

    /**
     * Converts ECLException from v1_56 to v1_58
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLException in
     * @return ECLException
     */
    private ECLException convertECLException(org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLException in)
    {
        ECLException out = new ECLException();
        if (in.getSource() != null) out.setSource(in.getSource());
        if (in.getSeverity() != null) out.setSeverity(in.getSeverity());
        if (in.getCode() != null) out.setCode(in.getCode());
        if (in.getMessage() != null) out.setMessage(in.getMessage());
        if (in.getFileName() != null) out.setFileName(in.getFileName());
        if (in.getLineNo() != null) out.setLineNo(in.getLineNo());
        if (in.getColumn() != null) out.setColumn(in.getColumn());
        return out;
    }

    /**
     * Converts ECLGraph from v1_56 to v1_58
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLGraph
     *            in
     * @return ECLGraph
     */
    private ECLGraph convertECLGraph(org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLGraph in)
    {
        ECLGraph out = new ECLGraph();
        if (in.getName() != null) out.setName(in.getName());
        if (in.getLabel() != null) out.setLabel(in.getLabel());
        if (in.getType() != null) out.setType(in.getType());
        if (in.getRunning() != null) out.setRunning(in.getRunning());
        if (in.getComplete() != null) out.setComplete(in.getComplete());
        if (in.getFailed() != null) out.setFailed(in.getFailed());
        if (in.getRunningId() != null) out.setRunningId(in.getRunningId());
        if (in.getWhenStarted() != null) out.setWhenStarted(in.getWhenStarted());
        if (in.getWhenFinished() != null) out.setWhenFinished(in.getWhenFinished());
        return out;
    }

    /**
     * Converts ECLSchemaItem from v1_56 to v1_58
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLSchemaItem
     *            in
     * @return ECLSchemaItem
     */
    private ECLSchemaItem convertECLSchemaItem(org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLSchemaItem in)
    {
        ECLSchemaItem out = new ECLSchemaItem();
        if (in.getColumnName() != null) out.setColumnName(in.getColumnName());
        if (in.getColumnType() != null) out.setColumnType(in.getColumnType());
        if (in.getColumnTypeCode() != null) out.setColumnTypeCode(in.getColumnTypeCode());
        if (in.getIsConditional() != null) out.setIsConditional(in.getIsConditional());
        return out;
    }

    /**
     * Converts ECLResult from v1_56 to v1_58
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLResult
     *            in
     * @return ECLResult
     */
    private ECLResult convertECLResult(org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLResult in)
    {
        ECLResult out = new ECLResult();
        if (in.getName() != null) out.setName(in.getName());
        if (in.getSequence() != null) out.setSequence(in.getSequence());
        if (in.getValue() != null) out.setValue(in.getValue());
        if (in.getLink() != null) out.setLink(in.getLink());
        if (in.getFileName() != null) out.setFileName(in.getFileName());
        if (in.getIsSupplied() != null) out.setIsSupplied(in.getIsSupplied());
        if (in.getShowFileContent() != null) out.setShowFileContent(in.getShowFileContent());
        if (in.getTotal() != null) out.setTotal(in.getTotal());
        if (in.getXmlSchema() != null) out.setXmlSchema(in.getXmlSchema());
        if (in.getECLSchemas() != null)
        {
            ECLSchemaItem[] teclschemaitems = new ECLSchemaItem[in.getECLSchemas().length];
            for (int i = 0; i < in.getECLSchemas().length; i++)
                teclschemaitems[i] = convertECLSchemaItem(in.getECLSchemas()[i]);
            out.setECLSchemas(teclschemaitems);
        }
        return out;
    }

    /**
     * Converts ECLSourceFile from v1_56 to v1_58
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLSourceFile
     *            in
     * @return ECLSourceFile
     */
    private ECLSourceFile convertECLSourceFile(org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLSourceFile in)
    {
        ECLSourceFile out = new ECLSourceFile();
        if (in.getFileCluster() != null) out.setFileCluster(in.getFileCluster());
        if (in.getName() != null) out.setName(in.getName());
        if (in.getIsSuperFile() != null) out.setIsSuperFile(in.getIsSuperFile());
        if (in.getSubs() != null) out.setSubs(in.getSubs());
        if (in.getCount() != null) out.setCount(in.getCount());
        if (in.getECLSourceFiles() != null)
        {
            ECLSourceFile[] teclsourcefile = new ECLSourceFile[in.getECLSourceFiles().length];
            for (int i = 0; i < in.getECLSourceFiles().length; i++)
                teclsourcefile[i] = convertECLSourceFile(in.getECLSourceFiles()[i]);
            out.setECLSourceFiles(teclsourcefile);
        }
        return out;
    }

    /**
     * Converts ECLTimer from v1_56 to v1_58
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLTimer
     *            in
     * @return ECLTimer
     */
    private ECLTimer convertECLTimer(org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLTimer in)
    {
        ECLTimer out = new ECLTimer();
        if (in.getName() != null) out.setName(in.getName());
        if (in.getValue() != null) out.setValue(in.getValue());
        if (in.getCount() != null) out.setCount(in.getCount());
        if (in.getGraphName() != null) out.setGraphName(in.getGraphName());
        if (in.getSubGraphId() != null) out.setSubGraphId(in.getSubGraphId());
        return out;
    }

    /**
     * Converts DebugValue from v1_56 to v1_58
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.DebugValue
     *            in
     * @return DebugValue
     */
    private DebugValue convertDebugValue(org.hpccsystems.ws.client.gen.wsworkunits.v1_56.DebugValue in)
    {
        DebugValue out = new DebugValue();
        if (in.getName() != null) out.setName(in.getName());
        if (in.getValue() != null) out.setValue(in.getValue());
        return out;
    }

    /**
     * Converts ApplicationValue from v1_56 to v1_58
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ApplicationValue
     *            in
     * @return ApplicationValue
     */
    private ApplicationValue convertApplicationValue(
            org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ApplicationValue in)
    {
        ApplicationValue out = new ApplicationValue();
        if (in.getApplication() != null) out.setApplication(in.getApplication());
        if (in.getName() != null) out.setName(in.getName());
        if (in.getValue() != null) out.setValue(in.getValue());
        return out;
    }

    /**
     * Converts ECLWorkflow from v1_56 to v1_58
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLWorkflow
     *            in
     * @return ECLWorkflow
     */
    private ECLWorkflow convertECLWorkflow(org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLWorkflow in)
    {
        ECLWorkflow out = new ECLWorkflow();
        if (in.getWFID() != null) out.setWFID(in.getWFID());
        if (in.getEventName() != null) out.setEventName(in.getEventName());
        if (in.getEventText() != null) out.setEventText(in.getEventText());
        if (in.getCount() != null) out.setCount(in.getCount());
        if (in.getCountRemaining() != null) out.setCountRemaining(in.getCountRemaining());
        return out;
    }

    /**
     * Converts ECLTimingData from v1_56 to v1_58
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLTimingData
     *            in
     * @return ECLTimingData
     */
    private ECLTimingData convertECLTimingData(org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLTimingData in)
    {
        ECLTimingData out = new ECLTimingData();
        if (in.getName() != null) out.setName(in.getName());
        if (in.getGraphNum() != null) out.setGraphNum(in.getGraphNum());
        if (in.getSubGraphNum() != null) out.setSubGraphNum(in.getSubGraphNum());
        if (in.getGID() != null) out.setGID(in.getGID());
        if (in.getMin() != null) out.setMin(in.getMin());
        if (in.getMS() != null) out.setMS(in.getMS());
        return out;
    }

    /**
     * Converts ECLWorkunit from v1_56 to v1_58
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLWorkunit
     *            in
     * @return ECLWorkunit
     */
    private ECLWorkunit convertECLWorkunit(org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLWorkunit in)
    {
        ECLWorkunit out = new ECLWorkunit();

        if (in.getWuid() != null) out.setWuid(in.getWuid());
        if (in.getOwner() != null) out.setOwner(in.getOwner());
        if (in.getCluster() != null) out.setCluster(in.getCluster());
        if (in.getRoxieCluster() != null) out.setRoxieCluster(in.getRoxieCluster());
        if (in.getJobname() != null) out.setJobname(in.getJobname());
        if (in.getQueue() != null) out.setQueue(in.getQueue());
        if (in.getStateID() != null) out.setStateID(in.getStateID());
        if (in.getState() != null) out.setState(in.getState());
        if (in.getStateEx() != null) out.setStateEx(in.getStateEx());
        if (in.getDescription() != null) out.setDescription(in.getDescription());
        if (in.get_protected() != null) out.set_protected(in.get_protected());
        if (in.getActive() != null) out.setActive(in.getActive());
        if (in.getAction() != null) out.setAction(in.getAction());
        if (in.getActionEx() != null) out.setActionEx(in.getActionEx());
        if (in.getDateTimeScheduled() != null) out.setDateTimeScheduled(in.getDateTimeScheduled());
        if (in.getPriorityClass() != null) out.setPriorityClass(in.getPriorityClass());
        if (in.getPriorityLevel() != null) out.setPriorityLevel(in.getPriorityLevel());
        if (in.getScope() != null) out.setScope(in.getScope());
        if (in.getSnapshot() != null) out.setSnapshot(in.getSnapshot());
        if (in.getResultLimit() != null) out.setResultLimit(in.getResultLimit());
        if (in.getArchived() != null) out.setArchived(in.getArchived());
        if (in.getIsPausing() != null) out.setIsPausing(in.getIsPausing());
        if (in.getThorLCR() != null) out.setThorLCR(in.getThorLCR());
        if (in.getEventSchedule() != null) out.setEventSchedule(in.getEventSchedule());
        //RODRIGO
//        if (in.getHaveSubGraphTimings() != null) out.setHaveSubGraphTimings(in.getHaveSubGraphTimings());
        if (in.getTotalClusterTime() != null) out.setTotalClusterTime(in.getTotalClusterTime());
        if (in.getAllowedClusters() != null) out.setAllowedClusters(in.getAllowedClusters());
        if (in.getErrorCount() != null) out.setErrorCount(in.getErrorCount());
        if (in.getWarningCount() != null) out.setWarningCount(in.getWarningCount());
        if (in.getInfoCount() != null) out.setInfoCount(in.getInfoCount());
        if (in.getAlertCount() != null) out.setAlertCount(in.getAlertCount());
        if (in.getGraphCount() != null) out.setGraphCount(in.getGraphCount());
        if (in.getSourceFileCount() != null) out.setSourceFileCount(in.getSourceFileCount());
        if (in.getResultCount() != null) out.setResultCount(in.getResultCount());
        if (in.getVariableCount() != null) out.setVariableCount(in.getVariableCount());
        if (in.getTimerCount() != null) out.setTimerCount(in.getTimerCount());
        if (in.getHasDebugValue() != null) out.setHasDebugValue(in.getHasDebugValue());
        if (in.getApplicationValueCount() != null) out.setApplicationValueCount(in.getApplicationValueCount());
        if (in.getXmlParams() != null) out.setXmlParams(in.getXmlParams());
        if (in.getAccessFlag() != null) out.setAccessFlag(in.getAccessFlag());
        if (in.getClusterFlag() != null) out.setClusterFlag(in.getClusterFlag());
        if (in.getHelpersDesc() != null) out.setHelpersDesc(in.getHelpersDesc());
        if (in.getGraphsDesc() != null) out.setGraphsDesc(in.getGraphsDesc());
        if (in.getSourceFilesDesc() != null) out.setSourceFilesDesc(in.getSourceFilesDesc());
        if (in.getResultsDesc() != null) out.setResultsDesc(in.getResultsDesc());
        if (in.getVariablesDesc() != null) out.setVariablesDesc(in.getVariablesDesc());
        if (in.getTimersDesc() != null) out.setTimersDesc(in.getTimersDesc());
        if (in.getDebugValuesDesc() != null) out.setDebugValuesDesc(in.getDebugValuesDesc());
        if (in.getApplicationValuesDesc() != null) out.setApplicationValuesDesc(in.getApplicationValuesDesc());
        if (in.getWorkflowsDesc() != null) out.setWorkflowsDesc(in.getWorkflowsDesc());
        if (in.getHasArchiveQuery() != null) out.setHasArchiveQuery(in.getHasArchiveQuery());
        if (in.getResourceURLs() != null) out.setResourceURLs(in.getResourceURLs());
        if (in.getResultViewCount() != null) out.setResultViewCount(in.getResultViewCount());
        if (in.getResourceURLCount() != null) out.setResourceURLCount(in.getResourceURLCount());
        if (in.getDebugValueCount() != null) out.setDebugValueCount(in.getDebugValueCount());
        if (in.getWorkflowCount() != null) out.setWorkflowCount(in.getWorkflowCount());
        if (in.getQuery() != null) out.setQuery(convertECLQuery(in.getQuery()));

        if (in.getThorLogList() != null)
        {
            ThorLogInfo[] tli = new ThorLogInfo[in.getThorLogList().length];
            for (int i = 0; i < in.getThorLogList().length; i++)
                tli[i] = convertThorLogInfo(in.getThorLogList()[i]);
            out.setThorLogList(tli);
        }
        if (in.getHelpers() != null)
        {
            ECLHelpFile[] teclhf = new ECLHelpFile[in.getHelpers().length];
            for (int i = 0; i < in.getHelpers().length; i++)
                teclhf[i] = convertECLHelpFile(in.getHelpers()[i]);
            out.setHelpers(teclhf);
        }
        if (in.getExceptions() != null)
        {
            ECLException[] te = new ECLException[in.getExceptions().length];
            for (int i = 0; i < in.getExceptions().length; i++)
                te[i] = convertECLException(in.getExceptions()[i]);
            out.setExceptions(te);
        }
        if (in.getGraphs() != null)
        {
            ECLGraph[] tg = new ECLGraph[in.getGraphs().length];
            for (int i = 0; i < in.getGraphs().length; i++)
                tg[i] = convertECLGraph(in.getGraphs()[i]);
            out.setGraphs(tg);
        }

        if (in.getSourceFiles() != null)
        {
            ECLSourceFile[] teclsf = new ECLSourceFile[in.getSourceFiles().length];
            for (int i = 0; i < in.getSourceFiles().length; i++)
                teclsf[i] = convertECLSourceFile(in.getSourceFiles()[i]);
            out.setSourceFiles(teclsf);
        }
        if (in.getResults() != null)
        {
            ECLResult[] tresults = new ECLResult[in.getResults().length];
            for (int i = 0; i < in.getResults().length; i++)
                tresults[i] = convertECLResult(in.getResults()[i]);
            out.setResults(tresults);
        }
        if (in.getVariables() != null)
        {
            ECLResult[] tvariables = new ECLResult[in.getVariables().length];
            for (int i = 0; i < in.getVariables().length; i++)
                tvariables[i] = convertECLResult(in.getVariables()[i]);
            out.setVariables(tvariables);
        }
        if (in.getTimers() != null)
        {
            ECLTimer[] tecltimer = new ECLTimer[in.getTimers().length];
            for (int i = 0; i < in.getTimers().length; i++)
                tecltimer[i] = convertECLTimer(in.getTimers()[i]);
            out.setTimers(tecltimer);
        }
        if (in.getDebugValues() != null)
        {
            DebugValue[] tdebugvalue = new DebugValue[in.getDebugValues().length];
            for (int i = 0; i < in.getDebugValues().length; i++)
                tdebugvalue[i] = convertDebugValue(in.getDebugValues()[i]);
            out.setDebugValues(tdebugvalue);
        }
        if (in.getApplicationValues() != null)
        {
            ApplicationValue[] tapplicationvalues = new ApplicationValue[in.getApplicationValues().length];
            for (int i = 0; i < in.getApplicationValues().length; i++)
                tapplicationvalues[i] = convertApplicationValue(in.getApplicationValues()[i]);
            out.setApplicationValues(tapplicationvalues);
        }
        if (in.getWorkflows() != null)
        {
            ECLWorkflow[] teclworkflows = new ECLWorkflow[in.getWorkflows().length];
            for (int i = 0; i < in.getWorkflows().length; i++)
                teclworkflows[i] = convertECLWorkflow(in.getWorkflows()[i]);
            out.setWorkflows(teclworkflows);
        }
        if (in.getTimingData() != null)
        {
            ECLTimingData[] tecltimingdatas = new ECLTimingData[in.getTimingData().length];
            for (int i = 0; i < in.getTimingData().length; i++)
                tecltimingdatas[i] = convertECLTimingData(in.getTimingData()[i]);
            out.setTimingData(tecltimingdatas);
        }

        return out;
    }

    /**
     * Convert from latest wuquery response to 1.56 wuquery response
     *
     * @param org.hpccsystems.ws.client.gen.wsworkunits.v1_56.WUQueryResponse
     *            in
     * @return WUQueryResponse
     */
    private WUQueryResponse convertWUQueryResponse(org.hpccsystems.ws.client.gen.wsworkunits.v1_56.WUQueryResponse in)
    {
        WUQueryResponse out = new WUQueryResponse();

        if (in.getType() != null) out.setType(in.getType());
        if (in.getCluster() != null) out.setCluster(in.getCluster());
        if (in.getRoxieCluster() != null) out.setRoxieCluster(in.getRoxieCluster());
        if (in.getOwner() != null) out.setOwner(in.getOwner());
        if (in.getState() != null) out.setState(in.getState());
        if (in.getStartDate() != null) out.setStartDate(in.getStartDate());
        if (in.getEndDate() != null) out.setEndDate(in.getEndDate());
        if (in.getECL() != null) out.setECL(in.getECL());
        if (in.getJobname() != null) out.setJobname(in.getJobname());
        if (in.getLogicalFile() != null) out.setLogicalFile(in.getLogicalFile());
        if (in.getLogicalFileSearchType() != null) out.setLogicalFileSearchType(in.getLogicalFileSearchType());
        if (in.getCurrent() != null) out.setCurrent(in.getCurrent());
        if (in.getNext() != null) out.setNext(in.getNext());
        if (in.getCount() != null) out.setCount(in.getCount());
        if (in.getPageSize() != null) out.setPageSize(in.getPageSize());
        if (in.getPrevPage() != null) out.setPrevPage(in.getPrevPage());
        if (in.getNextPage() != null) out.setNextPage(in.getNextPage());
        if (in.getLastPage() != null) out.setLastPage(in.getLastPage());
        if (in.getNumWUs() != null) out.setNumWUs(in.getNumWUs());
        if (in.getFirst() != null) out.setFirst(in.getFirst());
        if (in.getPageStartFrom() != null) out.setPageStartFrom(in.getPageStartFrom());
        if (in.getPageEndAt() != null) out.setPageEndAt(in.getPageEndAt());
        //RODRIGO
        //if (in.getLastNDays() != null) out.setLastNDays(in.getLastNDays());
        if (in.getSortby() != null) out.setSortby(in.getSortby());
        if (in.getDescending() != null) out.setDescending(in.getDescending());
        if (in.getBasicQuery() != null) out.setBasicQuery(in.getBasicQuery());
        if (in.getFilters() != null) out.setFilters(in.getFilters());
        if (in.getCacheHint() != null) out.setCacheHint(in.getCacheHint());
        if (in.getExceptions() != null) out.setExceptions(convertArrayOfEspException(in.getExceptions()));
        if (in.getWorkunits() != null)
        {
            ECLWorkunit[] tmpwu = new ECLWorkunit[in.getWorkunits().length];
            for (int i = 0; i < in.getWorkunits().length; i++)
                tmpwu[i] = convertECLWorkunit(in.getWorkunits()[i]);
            out.setWorkunits(tmpwu);
        }

        return out;
    }

    /**
     * Check the version found at instatiation with compatibility version
     *
     * @param Version
     *            input
     * @return boolean true if server build version >= input version
     */
    private boolean compatibilityCheck(Version input)
    {
        if (targetVersion == null || input == null)
            return false;

        if (targetVersion.major > input.major)
            return true;
        else if (targetVersion.major < input.major) return false;
        if (targetVersion.minor > input.minor)
            return true;
        else if (targetVersion.minor < input.minor) return false;
        if (targetVersion.point > input.point)
            return true;
        else if (targetVersion.point < input.point)
            return false;
        else
            return true;
    }


    /**
     * As of Platform version 6.0.0. Now maps to new prototype, excluding the pageSize and startPageFrom parameters.
     * Executes a WUQuery, based on parameters provided. If a custom WUQuery is desired, the caller can make a direct
     * call to WUQuery based on the soapproxy for this client. If using applicationValues objects for filtering, a user
     * must pair the Application with either an attribute name, or attribute value.
     *
     * @param wuid
     * @param jobname
     * @param cluster
     * @param archived
     * @param sortby
     * @param state
     * @param endDate
     * @param startDate
     * @param pageStartFrom
     * @param pageSize
     * @param owner
     * @param applicationValues
     * @return
     * @throws Exception
     */
    public List workUnitUQuery(String wuid, String jobname, String cluster, Boolean archived, WUQueryInfo.SortBy sortby,
            WUState state, Date endDate, Date startDate, Long pageStartFrom, Long pageSize,
            String owner, List applicationValues) throws Exception
    {
        WUQueryInfo info=new WUQueryInfo();
        info.setWuid(wuid);
        info.setJobname(jobname);
        info.setCluster(cluster);
        info.setArchived(archived);
        info.setSortBy(sortby);
        info.setState(state);
        info.setEndDate(endDate);
        info.setStartDate(startDate);
        info.setOwner(owner);
        info.setApplicationValues(applicationValues);
        info.setPageSize(pageSize==null?10000:pageSize);
        info.setPageStartFrom(pageStartFrom==null?0:pageStartFrom);

        return (workUnitUQuery(info));
    }

    public List workUnitUQuery(WUQueryInfo info) throws Exception
    {
        WUQueryResponse wuQueryResponse = new WUQueryResponse();

        getSoapProxy();

        //currently just checks application values
        info.validate();

        if (!compatibilityCheck(new Version("6.0.0")))
        {
            Set workunit_set =
                    new HashSet();
            org.hpccsystems.ws.client.gen.wsworkunits.v1_56.WUQueryResponse fallbackresponse = null;
            if (info.getApplicationValues().size()>1)
            {
                for (int i=0; i < info.getApplicationValues().size();i++)
                {
                    org.hpccsystems.ws.client.gen.wsworkunits.v1_56.WUQuery internal=info.getRaw156(i);
                    fallbackresponse = soapWrapper.getVersion1_56Raw().WUQuery(internal);
                    if (fallbackresponse != null)
                    {
                        throwWsWUExceptions(convertArrayOfEspException(fallbackresponse.getExceptions()),
                       "Error in WU query");
                    }
                    Set internal_wu_set
                        = new HashSet();
                    if (fallbackresponse.getWorkunits() != null)
                    {
                        for (org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLWorkunit wu : fallbackresponse
                                .getWorkunits())
                        {
                            internal_wu_set.add(wu);
                        }
                        if (workunit_set.isEmpty())
                        {
                            workunit_set.addAll(internal_wu_set);
                        }
                        else
                        {
                            // intersection of s1 and s2
                            workunit_set.retainAll(internal_wu_set);
                        }
                    }
                }
            }
            else
            {
                fallbackresponse = soapWrapper.getVersion1_56Raw().WUQuery(info.getRaw156(0));
                if (fallbackresponse != null) {
                    throwWsWUExceptions(convertArrayOfEspException(fallbackresponse.getExceptions()), "Error in WU query");
                }
                if (fallbackresponse.getWorkunits() != null)
                {
                    for (org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLWorkunit wu : fallbackresponse.getWorkunits())
                    {
                        workunit_set.add(wu);
                    }
                }
            }

            // rebuild response as latest
            org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLWorkunit[] workunits = workunit_set
                    .toArray(new org.hpccsystems.ws.client.gen.wsworkunits.v1_56.ECLWorkunit[workunit_set.size()]);
            fallbackresponse.setWorkunits(workunits);
            fallbackresponse.setNumWUs(fallbackresponse.getWorkunits().length);
            wuQueryResponse = convertWUQueryResponse(fallbackresponse);
        }
        else
        {
            wuQueryResponse = wsWorkunitsServiceSoapProxy.WUQuery(info.getRaw());
            throwWsWUExceptions(wuQueryResponse.getExceptions(), "Error in WU query");
        }

        List result=new ArrayList();
        if (wuQueryResponse.getWorkunits() != null)
        {
            for (int i=0; i < wuQueryResponse.getWorkunits().length;i++) {
                result.add(new WorkunitInfo(wuQueryResponse.getWorkunits()[i]));
            }
        }
        return result;

    }

    /**
     * This method queries information about a given WU and answers if the WU has reported errors.
     *
     * @param wuid
     *            - The ID of the target workunit
     * @return - true if errors present
     * @throws Exception
     *             - Caller must handle exceptions
     */
    public boolean doesWUContainErrors(String wuid) throws Exception
    {
        boolean errsfound = true;
        WorkunitInfo workunit = getWUInfo(wuid);

        if (workunit != null) errsfound = workunit.getErrorCount().intValue() <= 0;

        return errsfound;
    }


    /**
     * Requests target HPCC System to create and compile WU based on workunit info provided.
     *
     * @param wu   - The workunit information used to create WU on HPCC cluster
     * @return
     * @throws Exception
     */
    public WorkunitInfo createWUFromECL(WorkunitInfo wu) throws Exception
    {
        WorkunitInfo createdWU = null;

        getSoapProxy();

        WUCreateAndUpdateWrapper wucreateparameters = new WUCreateAndUpdateWrapper();
        wucreateparameters.setAction(WUActionCode.WUActionCompile.ordinal());
        wucreateparameters.setQueryText(wu.getECL());
        wucreateparameters.setApplicationValues(wu.getRawApplicationValues());
        wucreateparameters.setDebugValues(wu.getDebugValues());
        wucreateparameters.setJobname(wu.getJobname());
        wucreateparameters.setClusterOrig(wu.getCluster());
        wucreateparameters.setResultLimit(wu.getResultLimit());
        wucreateparameters.setWuid(wu.getWuid());

        WUUpdateResponseWrapper wuUpdateResponse = soapWrapper.WUCreateAndUpdate(wucreateparameters);

        createdWU = wuUpdateResponse.getWorkunit();

        if (wuUpdateResponse.getExceptions().size()==0)
        {
            createdWU.setMaxMonitorMillis(wu.getMaxMonitorMillis());
            createdWU.setCluster(wu.getCluster());
            createdWU.setJobname(wu.getJobname());
            createdWU.setSleepMillis(wu.getSleepMillis());
            createdWU.setOriginalEclWatchUrl(getEclWatchUrl());
        }
        else
        {
            throwWsWUExceptions(createdWU.getRawArrayOfEspExceptions(), "Error compiling ECL query");
        }
        return createdWU;
    }

    /*
     * this method is purely for the Platform class
     */
    public WorkunitInfo createWUFromECL(String archiveOrEcl, int resultLimit, List appVals, String jobName, boolean compileOnly) throws Exception
    {
        WorkunitInfo wi=new WorkunitInfo().setECL(archiveOrEcl).setJobname(jobName).setApplicationValues(appVals).setResultLimit(resultLimit==0?null:resultLimit);

        return createWUFromECL(wi);
    }

    /**
     * @param jobName
     *            the pattern to find in the jobname (wildcard * matches multiple jobnames)
     * @param owner
     *            - hpcc owner of the job
     * @param ecl
     *            - text in the ecl
     * @param archived - if true, search archived workunits. If false or null, search unarchived workunits.
     * @param wuid - wuid to search for
     * @param cluster - cluster to search workunits for
     * @param state - WUState of workunits to find
     * @return an List of matching workunits
     * @throws Exception
     */
    public List getWorkunits(String jobName, String owner, String ecl, Boolean archived, String wuid,
            String cluster, WUState state) throws Exception
    {
        WUQueryInfo params = new WUQueryInfo().setJobname(jobName).setOwner(owner).setECL(ecl)
                .setArchived(archived).setWuid(wuid).setCluster(cluster).setState(state);
        return workUnitUQuery(params);
    }

    public List getWorkunits(WUQueryInfo params) throws Exception
    {
        return this.workUnitUQuery(params);
    }

    /**
     * Given an ECL query, this method will create a WU, compile and run it
     *
     * @param ecl
     *            - The ecl query to compile/run
     * @param targetCluster
     *            - The cluster where the ecl is to be compiled/run
     * @return - Object with WU information
     * @throws Exception
     *             - Caller must handle exceptions
     */
    public WorkunitInfo compileWUFromECL(WorkunitInfo wu) throws Exception
    {
        Integer sleeptime = wu.getSleepMillis();

        if (sleeptime == null)
        {
            sleeptime = defaultWaitTime;
        }

        WorkunitInfo createdWU = createWUFromECL(wu);

        if (createdWU != null && createdWU.getErrorCount() == 0 && createdWU.getExceptions().size()==0)
        {
            createdWU.setCluster(wu.getCluster());
            submitWU(createdWU); // if no exception proceed
            this.monitorWUToCompletion(createdWU);

            // exceptions, etc. aren't always included in the submit response; do another request to get all workunit
            // info
            WorkunitInfo res = this.getWUInfo(createdWU.getWuid(), false, false, false, false, false, true, false,
                    false, false);

            int actualerrors = 0;
            for (WUExceptionWrapper ex:res.getExceptions())
            {
                if ("error".equalsIgnoreCase(ex.getSeverity()))
                {
                    this.throwWUECLExceptions(res.getRawExceptions(), "Workunit Compile Failed");
                }
            }
        }
        return createdWU;
    }

    /**
     * Given an ECL query, this method will create a WU, compile and run it
     *
     * @param ecl
     *            - The ecl query to compile/run
     * @param targetCluster
     *            - The cluster where the ecl is to be compiled/run
     * @return - Object with WU information
     * @throws Exception
     *             - Caller must handle exceptions
     */
    public void submitWU(WorkunitInfo wu) throws Exception
    {
        submitWU(wu.getWuid(), wu.getCluster());
    }

    public void submitWU(String wuid, String cluster) throws Exception
    {
        getSoapProxy();

        WUSubmit wuSubmitParams = new WUSubmit();
        wuSubmitParams.setWuid(wuid);
        wuSubmitParams.setCluster(cluster);

        WUSubmitResponse submitResponse = wsWorkunitsServiceSoapProxy.WUSubmit(wuSubmitParams);

        ArrayOfEspException exceptions = submitResponse.getExceptions();
        if (exceptions != null)
        {
            throwWsWUExceptions(exceptions, "Error compiling ECL query");
        }
    }

    /**
     * Given an ECL query, this method will create a WU, compile and run it
     *
     * @param ecl
     *            - The ecl query to compile/run
     * @param targetCluster
     *            - The cluster where the ecl is to be compiled/run
     * @param resultLimit
     *            - Limit on results
     * @return - Object with WU information
     * @throws Exception
     *             - Caller must handle exceptions
     */
    public WURunResponse createAndRunWUFromECL(WorkunitInfo wu) throws Exception
    {
        WURunResponse wuRunResponse = null;

        getSoapProxy();
        WorkunitInfo compiledWU = null;
        compiledWU = compileWUFromECL(wu);

        if (compiledWU != null)
        {
            WURun runparameters = new WURun();
            runparameters.setWuid(compiledWU.getWuid());
            runparameters.setVariables(wu.getRawNamedValues());
            runparameters.setCluster(wu.getCluster());

            wuRunResponse = wsWorkunitsServiceSoapProxy.WURun(runparameters);

            ArrayOfEspException exceptions = wuRunResponse.getExceptions();
            if (exceptions != null)
            {
                throwWsWUExceptions(exceptions, "Error running WUID: " + compiledWU.getWuid());
            }
            else if (isWorkunitFailed(wuRunResponse.getState()))
            {
                String error = wuRunResponse.getResults();
                throw new Exception("Error running WUID: " + compiledWU.getWuid() + ":\n" + error);
            }
        }

        return wuRunResponse;
    }

    /**
     * Given an ECL query, this method will create a WU, compile and run it, and return results in String object - Not
     * recommended for large resultsets.
     *
     * @param ecl
     *            - The ecl query to compile/run
     * @param targetCluster
     *            - The cluster where the ecl is to be compiled/run
     * @param resultLimit
     *            - Limit on results
     * @return - Object with WU information
     * @throws Exception
     *             - Caller must handle exceptions
     */
    public String createAndRunWUFromECLAndGetResults(WorkunitInfo wu) throws Exception
    {
        WURunResponse createAndRunWUFromECL = createAndRunWUFromECL(wu);
        return createAndRunWUFromECL.getResults();
    }

    /**
     * Given an ECL query, this method will create a WU, compile and run it, and return wuid. Workuinit state, and
     * results can be queried based on WUID
     *
     * @param ecl
     *            - The ecl query to compile/run
     * @param targetCluster
     *            - The cluster where the ecl is to be compiled/run
     * @param resultLimit
     *            - Limit on results
     * @return - Workunit ID
     * @throws Exception
     *             - Caller must handle exceptions
     */
    public String createAndRunWUFromECLAndGetWUID(WorkunitInfo wu) throws Exception
    {
        WURunResponse createAndRunWUFromECL = createAndRunWUFromECL(wu);
        return createAndRunWUFromECL.getWuid();
    }

    /**
     * Fetches results associated with a given Logical name
     *
     * @param wuid
     *            - The target WUID to fetch results from
     * @param sequence
     *            - Zero based index result sequence (Each result set may contain multiple results)
     * @param cluster
     *            - The target cluster
     * @param suppressXMLShema
     *            - Results are accompanied by a schema, do you want to suppress it?
     * @param resultOffset
     *            - Request results starting at record offset
     * @param resultCount
     *            - Total result record count
     * @return - Results in xml string
     * @throws Exception
     */
    public String fetchResultsFromLogicalName(String logicalName, int sequence, String cluster,
            boolean suppressXMLShema, long resultOffset, int resultCount) throws Exception
    {
        WUResultResponse wuResultResponse = fetchRawResults(logicalName, false, sequence, cluster, suppressXMLShema,
                resultOffset, resultCount);
        ArrayOfEspException exceptions = wuResultResponse.getExceptions();
        if (exceptions != null) throwWsWUExceptions(exceptions, "Could not fetch results");

        return wuResultResponse.getResult();
    }

    /**
     * Fetches results associated with a given WUID. If the given WUID has been archived, results might not be available
     * using this function Use fetchResultsFromLogicalName instead
     *
     * @param wuid
     *            - The target WUID to fetch results from
     * @param sequence
     *            - Zero based index result sequence (Each result set may contain multiple results)
     * @param cluster
     *            - The target cluster
     * @param suppressXMLShema
     *            - Results are accompanied by a schema, do you want to suppress it?
     * @param resultOffset
     *            - Request results starting at record offset
     * @param resultCount
     *            - Total result record count re
     * @return - Results in xml string
     * @throws Exception
     */
    public String fetchResults(String wuid, int sequence, String cluster, boolean suppressXMLShema, long resultOffset,
            int resultCount) throws Exception
    {
        WUResultResponse wuResultResponse = fetchRawResults(wuid, true, sequence, cluster, suppressXMLShema,
                resultOffset, resultCount);
        ArrayOfEspException exceptions = wuResultResponse.getExceptions();
        if (exceptions != null) throwWsWUExceptions(exceptions, "Could not fetch results");

        return wuResultResponse.getResult();
    }

    /**
     * Fetches results associated with a given WUID or logical file name.
     *  If the given WUID has been archived, results might not be available -use fetchResultsFromLogicalName instead
     *
     * @param wuidorlogicalname
     * @param useWuid
     * @param sequence
     * @param cluster
     * @param suppressXMLShema
     * @param resultOffset
     * @param resultCount
     * @return
     * @throws Exception
     */
    public WUResultResponse fetchRawResults(String wuidorlogicalname, boolean useWuid, int sequence, String cluster,
            boolean suppressXMLShema, long resultOffset, int resultCount) throws Exception
    {
        getSoapProxy();

        if (wuidorlogicalname == null || wuidorlogicalname.length() == 0)
            throw new Exception("Please provide either WUID or LogicalName");
        else
        {
            WUResult parameters = new WUResult();
            if (useWuid)
                parameters.setWuid(wuidorlogicalname);
            else
                parameters.setLogicalName(wuidorlogicalname);
            parameters.setSequence(sequence);
            parameters.setStart(resultOffset);
            parameters.setCount(resultCount);
            if (cluster != null) parameters.setCluster(cluster);
            parameters.setSuppressXmlSchema(suppressXMLShema);

            return fetchRawResults(parameters);
        }
    }

    /**
     * @param wuid
     *            does this string follow the known WU format
     * @return true if it wuid appears to be a workunit, false otherwise
     *
     *         logic borrowed from platform code: workunit.cpp bool looksLikeAWuid(const char * wuid) { if (!wuid)
     *         return false; if (wuid[0] != 'W') return false; if (!isdigit(wuid[1]) || !isdigit(wuid[2]) ||
     *         !isdigit(wuid[3]) || !isdigit(wuid[4])) return false; if (!isdigit(wuid[5]) || !isdigit(wuid[6]) ||
     *         !isdigit(wuid[7]) || !isdigit(wuid[8])) return false; return (wuid[9]=='-'); }
     */
    public static boolean looksLikeAWuid(String wuid)
    {
        if (wuid == null || wuid.length() == 0) return false;
        if (wuid.charAt(0) != 'W' && wuid.charAt(0) != 'w') return false;
        if (!Character.isDigit(wuid.charAt(1)) || !Character.isDigit(wuid.charAt(2))
                || !Character.isDigit(wuid.charAt(3)) || !Character.isDigit(wuid.charAt(4)))
            return false;
        if (!Character.isDigit(wuid.charAt(5)) || !Character.isDigit(wuid.charAt(6))
                || !Character.isDigit(wuid.charAt(7)) || !Character.isDigit(wuid.charAt(8)))
            return false;
        return (wuid.charAt(9) == '-');
    }

    /**
     * Fetches results associated with a given WUID or logical file name.
     * All parameters and options must be pre-set in the "parameters" input param
     *
     * @param parameters
     * @return
     * @throws Exception
     */
    public WUResultResponse fetchRawResults(WUResult parameters) throws Exception
    {
        getSoapProxy();

        return wsWorkunitsServiceSoapProxy.WUResult(parameters);
    }

    /**
     * Creates and throws exception with exception message response from WS
     *
     * @param wsWUResponseExceptions
     * @param message
     * @throws Exception
     */
    private void throwWsWUExceptions(ArrayOfEspException wsWUResponseExceptions, String message) throws Exception
    {
        if (wsWUResponseExceptions==null || wsWUResponseExceptions.getException()==null
                || wsWUResponseExceptions.getException().length==0)
        {
            return;
        }
        StringBuilder multimessage = new StringBuilder();
        multimessage.append(message);
        multimessage.append("\n");
        for (EspException exception : wsWUResponseExceptions
                .getException())
        {
            multimessage.append("\t");
            multimessage.append(exception.getMessage());
        }

        throw new Exception(multimessage.toString(),wsWUResponseExceptions);
    }

    /**
     * Creates and throws exception with exception message response from WS
     *
     * @param eclExceptions
     *            - the array of ECLException objects to throw
     * @param message
     *            - the prefix message
     * @throws Exception
     */
    private void throwWUECLExceptions(ECLException[] eclExceptions, String message) throws Exception
    {
        if (eclExceptions == null || eclExceptions.length==0)
        {
            return;
        }
        StringBuilder multimessage = new StringBuilder();
        multimessage.append(message);
        multimessage.append("\n");
        for (int i = 0; i < eclExceptions.length; i++)
        {
            multimessage.append("\t");
            multimessage.append(eclExceptions[i].getMessage());
        }

        throw new Exception(multimessage.toString());
    }

    private void refreshWU(boolean full, WorkunitInfo wu) throws Exception
    {
        if (full || HPCCWsWorkUnitsClient.isWorkunitComplete(wu))
        {
            fullWURefresh(wu);
        }
        else
        {
            fastWURefresh(wu);
        }
    }

    private void monitorWUToCompletion(WorkunitInfo wu) throws Exception
    {
        int timerTickCount = 0;
        String id = wu.getWuid();
        if (wu.getJobname() != null)
        {
            id = id + "(" + wu.getJobname() + ")";
        }
        log.trace("Monitoring WU " + id + " to completion.");
        while (!HPCCWsWorkUnitsClient.isWorkunitComplete(wu))
        {
            try
            {
                log.trace("Monitoring WU " + id + " to completion ( " + timerTickCount + ") ...");
                Thread.sleep(wu.getSleepMillis());
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }

            timerTickCount++;
            if (timerTickCount * wu.getSleepMillis() > wu.getMaxMonitorMillis())
                throw new Exception("Timed out waiting for WUID " + wu.getWuid() + " to complete.");

            try
            {
                if (timerTickCount == 1)
                    refreshWU(true, wu);
                else if (timerTickCount < 5 && timerTickCount % 1 == 0)
                    refreshWU(false, wu);
                else if (timerTickCount < 30 && timerTickCount % 5 == 0)
                    refreshWU(false, wu);
                else if (timerTickCount < 60 && timerTickCount % 10 == 0)
                    refreshWU(false, wu);
                else if (timerTickCount < 120 && timerTickCount % 30 == 0)
                    refreshWU(true, wu);
                else if (timerTickCount % 60 == 0) refreshWU(true, wu);
            }
            catch (Exception e)
            {
                throw new Exception("Error attempting to refresh WU " + wu.getWuid() + "\n" + e.getLocalizedMessage(), e);
            }
        }
    }

    /**
     * Submit the given ECL code for syntax check upon the given target cluster
     *
     * @param ecl          - The ECL to syntax check
     * @param cluster      - The HPCC target cluster on which to syntax check
     * @param timeout      - Maximum time for this check
     * @return
     * @throws Exception
     */
    public List syntaxCheckECL(String ecl, String cluster, Integer timeout) throws Exception
    {
        getSoapProxy();

        WUSyntaxCheckECL checkParams = new WUSyntaxCheckECL();
        checkParams.setECL(ecl);
        checkParams.setCluster(cluster);
        checkParams.setTimeToWait(timeout);
        WUSyntaxCheckResponse resp = wsWorkunitsServiceSoapProxy.WUSyntaxCheckECL(checkParams);
        List result=new ArrayList();
        if (resp.getErrors() != null) {
            for (int i=0; i < resp.getErrors().length;i++) {
                result.add(new WUExceptionWrapper(resp.getErrors()[i]));
            }
        }
        return result;

    }

    /**
     * Fetch details about the given query
     *
     * @param querySetName
     * @param clusterName
     * @param filter
     * @return
     * @throws Exception
     */
    public WUQuerySetDetailsResponse getQueriesDetail(String querySetName, String clusterName, String filter) throws Exception
    {
        getSoapProxy();

        WUQuerysetDetails wuQuerysetDetails = new WUQuerysetDetails();
        wuQuerysetDetails.setQuerySetName(querySetName);
        wuQuerysetDetails.setClusterName(clusterName);
        wuQuerysetDetails.setFilter(filter);

        return wsWorkunitsServiceSoapProxy.WUQuerysetDetails(wuQuerysetDetails);
    }

    /**
     * Request that a given workunit is aborted
     *
     * @param wuid
     * @throws Exception
     */
    public void abortWU(String wuid) throws Exception
    {
        getSoapProxy();

        WUAbort request = new WUAbort();
        String[] wuids = new String[1];
        wuids[0] = wuid;
        request.setWuids(wuids);
        request.setBlockTillFinishTimer(1);
        wsWorkunitsServiceSoapProxy.WUAbort(request);
    }

    /**
     * Request that a given workunit is deleted
     * @param wuid
     * @throws Exception
     */
    public void deleteWU(String wuid) throws Exception
    {
        getSoapProxy();

        WUDelete request = new WUDelete();
        String[] wuids = new String[1];
        wuids[0] = wuid;
        request.setWuids(wuids);
        request.setBlockTillFinishTimer(1);
        WUDeleteResponse resp= wsWorkunitsServiceSoapProxy.WUDelete(request);
        this.throwWsWUExceptions(resp.getExceptions(), "Could not delete " + wuid + ":");
    }

    /**
     * Request that a given workunit is re-submitted. Caller can choose to clone the wu, and
     * to restart the WU's workflow.
     *
     * @param wuid
     * @param restart
     * @param clone
     * @throws Exception
     */
    public void resubmitWU(String wuid, boolean restart, boolean clone) throws Exception
    {
        getSoapProxy();

        WUResubmit request = new WUResubmit();
        request.setResetWorkflow(restart);
        request.setCloneWorkunit(clone);
        String[] wuids = new String[1];
        wuids[0] = wuid;
        request.setWuids(wuids);

        wsWorkunitsServiceSoapProxy.WUResubmit(request);
    }

    /**
     * Fetch set of available QuerySets
     * @return
     * @throws Exception
     */
    public QuerySet[] getQuerySets() throws Exception
    {
        getSoapProxy();

        QuerySet[] queryset = null;
        WUQuerysets request = new WUQuerysets();
        WUQuerysetsResponse response = wsWorkunitsServiceSoapProxy.WUQuerysets(request);
        if (response != null)
        {
            queryset = response.getQuerysets();
        }

        return queryset;
    }

    @Override
    protected boolean isComplete()
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    protected void fastRefresh()
    {
        // TODO Auto-generated method stub
    }

    @Override
    protected void fullRefresh()
    {
        // TODO Auto-generated method stub
    }

    @Override
    public boolean equals(Object aThat)
    {
        if (this == aThat)
        {
            return true;
        }

        if (!(aThat instanceof HPCCWsWorkUnitsClient))
        {
            return false;
        }

        HPCCWsWorkUnitsClient that = (HPCCWsWorkUnitsClient) aThat;
        WsWorkunitsServiceSoapProxy thatSoapProxy;
        try
        {
            thatSoapProxy = that.getSoapProxy();
        }
        catch (Exception e)
        {
            thatSoapProxy = null;
            return aThat == null;
        }

        return EqualsUtil.areEqual(wsWorkunitsServiceSoapProxy.getEndpoint(), thatSoapProxy.getEndpoint())
                && EqualsUtil.areEqual(((Stub) wsWorkunitsServiceSoapProxy.getWsWorkunitsServiceSoap()).getUsername(),
                        ((Stub) thatSoapProxy.getWsWorkunitsServiceSoap()).getUsername())
                && EqualsUtil.areEqual(((Stub) wsWorkunitsServiceSoapProxy.getWsWorkunitsServiceSoap()).getPassword(),
                        ((Stub) thatSoapProxy.getWsWorkunitsServiceSoap()).getPassword());
    }

    @Override
    public int hashCode()
    {
        int result = HashCodeUtil.SEED;
        if (hasInitError())
            return result = HashCodeUtil.hash(result, getInitError());

        result = HashCodeUtil.hash(result, wsWorkunitsServiceSoapProxy.getEndpoint());
        result = HashCodeUtil.hash(result, ((Stub) wsWorkunitsServiceSoapProxy.getWsWorkunitsServiceSoap()).getUsername());
        result = HashCodeUtil.hash(result, ((Stub) wsWorkunitsServiceSoapProxy.getWsWorkunitsServiceSoap()).getPassword());
        return result;
    }

    /**
     * Return a workunit result
     *
     * @param WUResult
     * @return WUResultResponse
     * @throws Exception
     */
    public WUResultResponse getWorkunitResult(WUResult wur) throws Exception
    {
        return getWorkunitResult(wur, false);
    }

    /**
     * @param wuid - wuid to return result for
     * @param resultname - resultname to return result for
     * @return content of result
     * @throws Exception
     */
    public String getWorkunitResult(String wuid, String resultname) throws Exception
    {
        WUResult params=new WUResult();
        params.setWuid(wuid);
        params.setResultName(resultname);
        params.setSuppressXmlSchema(true);
        WUResultResponse resp=getWorkunitResult(params,true);
        if (resp != null)
        {
            this.throwWsWUExceptions(resp.getExceptions(), "Unable to retrieve result " + resultname + " from wuid " + wuid + ":");
            return resp.getResult();
        }
        return null;
    }
    /**
     * Return a workunit result
     *
     * @param WUResult
     * @param unarchive
     * @return WUResultResponse
     * @throws Exception
     */
    public WUResultResponse getWorkunitResult(WUResult wur, boolean unarchive) throws Exception
    {
        // get the object first to make sure it's not archived
        if (unarchive)
        {
            this.getWUInfo(wur.getWuid(), unarchive);
        }
        // get the response
        WUResultResponse resp = getSoapProxy().getWsWorkunitsServiceSoap().WUResult(wur);
        return resp;
    }

    /**
     * Request a given action to be performed upon the given workunit.
     *
     * @param wuid       - The target workunit
     * @param action     - The action to be requested see ECLWUActions
     * @return
     * @throws ArrayOfEspException
     * @throws RemoteException
     * @throws Exception
     */
    public boolean doWorkunitAction(String wuid, ECLWUActions action) throws ArrayOfEspException, RemoteException, Exception
    {
        WUAction wa = new WUAction();
        wa.setWUActionType(action);
        wa.setWuids(new String[] { wuid });
        WUActionResponse war = this.getSoapProxy().getWsWorkunitsServiceSoap().WUAction(wa);
        if (war == null || war.getActionResults() == null || war.getActionResults().length == 0
                || war.getActionResults()[0].getResult() == null
                || !war.getActionResults()[0].getResult().equals("Success"))
        {
            // fallback to 1.56 api
            org.hpccsystems.ws.client.gen.wsworkunits.v1_56.WUAction fwa = new org.hpccsystems.ws.client.gen.wsworkunits.v1_56.WUAction();
            fwa.setActionType(action.getValue());
            fwa.setWuids(new String[] { wuid });
            org.hpccsystems.ws.client.gen.wsworkunits.v1_56.WUActionResponse fwar = soapWrapper.getVersion1_56Raw().getWsWorkunitsServiceSoap().WUAction(fwa);
            if (fwar == null || fwar.getActionResults() == null || fwar.getActionResults().length == 0
                    || fwar.getActionResults()[0].getResult() == null
                    || !fwar.getActionResults()[0].getResult().equals("Success"))
            {
                String failreason = "unknown action result";
                if (fwar != null && fwar.getActionResults() != null && fwar.getActionResults()[0].getResult() != null)
                    failreason = fwar.getActionResults()[0].getResult();
                throw new Exception("Unable to perform " + action.getValue() + " on " + wuid + " :: " + failreason);
            }
        }
        return true;
    }

    private String getEclWatchUrl() throws Exception
    {
        String url = this.getSoapProxy().getEndpoint().toLowerCase().replace("wsworkunits", "");
        return url;
    }

    /**
     * Create a new workunit. Does not update/run/submit
     * @return new WorkunitInfo containing created wuid
     * @throws Exception
     */
    public WorkunitInfo createWorkunit() throws Exception
    {
        WUCreateRequestWrapper params=new WUCreateRequestWrapper();
        WUCreateResponseWrapper resp=soapWrapper.WUCreate(params);
        this.throwWsWUExceptions(resp.getRawArrayOfEspExceptions(),"Could not create workunit");
        return resp.getWorkunit();
    }

    /**
     * Protect a workunit
     * @param wuid - wuid to protect
     * @return WorkunitInfo with updated status
     * @throws Exception
     */
    public WorkunitInfo protectWorkunit(String wuid) throws Exception
    {
        final WUUpdateRequestWrapper params = new WUUpdateRequestWrapper();
        params.set_protected(true);
        params.setWuid(wuid);
        WUUpdateResponseWrapper resp= soapWrapper.WUUpdate(params);

        this.throwWsWUExceptions(resp.getRawArrayOfEspExceptions(),"Could not protect workunit " + wuid);
        return resp.getWorkunit();
    }

    /**
     * Get Workunit file
     * @param wuid
     * @param filename
     * @param filetype
     * @param description
     * @param ipaddr
     * @param entirefile
     * @return
     * @throws Exception
     */
    public WULogFileInfo getWorkunitFile(String wuid, String filename, WUFileType filetype, String description, String ipaddr, boolean entirefile) throws Exception
    {
        WUFile file = new WUFile();
        file.setWuid(wuid);
        file.setName(filename);
        file.setType(filetype.toString());
        file.setDescription(description);
        file.setIPAddress(ipaddr);
        if (entirefile)
        {
            file.setOption(1);
        }
        WULogFileResponse logFileResponse = getSoapProxy().WUFile(file);
        this.throwWsWUExceptions(logFileResponse.getExceptions(), "Could not retrieve file " + filename + " for wuid " + wuid);
        return new WULogFileInfo(logFileResponse);

    }
    /**
     * Request to run a given workunit. Caller can set various WU options.
     *
     * @param wuid - wuid to call WURun for
     * @param namedvalues - override stored variables with this set of stored variables
     * @param appvalues - override application values with this set of app values
     * @param timeout - if provided, timeout before returning
     * @param cloneWorkunit - if true, clone workunit before rerunning
     * @param appsource - application source for app values
     * @return WorkunitInfo with wuid of run, run status & result
     * @throws Exception
     */
    public WorkunitInfo runWorkunit(String wuid,HashMap namedvalues,HashMap appvalues,
            Integer timeout,Boolean cloneWorkunit, String appsource) throws Exception
    {
        WURun params=new WURun();
        params.setWuid(wuid);
        params.setCloneWorkunit(cloneWorkunit);
        //default setting is synchronous/waits until workunit completes. Set this to asynchronous
        params.setWait(timeout);

        if (appvalues != null)
        {
            ApplicationValue[] vars=new ApplicationValue[appvalues.size()];
            int i=0;
            for (Entry item:appvalues.entrySet()) {
                ApplicationValue val=new ApplicationValue();
                val.setName(item.getKey());
                val.setValue(item.getValue());
                val.setApplication(appsource);
                vars[i]=val;
                i++;
            }
            params.setApplicationValues(vars);
        }
        if (namedvalues != null)
        {
            NamedValue[] nvars=new NamedValue[namedvalues.size()];
            int i=0;
            for (Entry item:namedvalues.entrySet())
            {
                NamedValue val=new NamedValue();
                val.setName(item.getKey());
                val.setValue(item.getValue());
                nvars[i]=val;
                i++;
            }
            params.setVariables(nvars);
        }
        WURunResponse resp=getSoapProxy().WURun(params);
        this.throwWsWUExceptions(resp.getExceptions(),"Could not run workunit " + wuid);
        WorkunitInfo wi=new WorkunitInfo();
        wi.setState(resp.getState());
        wi.setWuid(resp.getWuid());
        if (!StringUtils.isEmpty(resp.getResults()) && !StringUtils.isEmpty(resp.getResults()))
        {
            ECLResultInfo msg=new ECLResultInfo();
            msg.setValue(resp.getResults());
            wi.setResults(Arrays.asList(msg));
        }
        return wi;
    }

    /**
     * Fetch list of querysets
     *
     * @param filtertype
     * @param filtervalue
     * @param querySetName
     * @param clustername
     * @return
     * @throws Exception
     */
    public List searchQueries(QuerySetFilterType filtertype, String filtervalue, String querySetName,
            String clustername) throws Exception
    {
        final WUQuerysetDetails params=new WUQuerysetDetails();
        params.setClusterName(clustername);
        params.setFilter(filtervalue);
        if (filtertype != null)
        {
            params.setFilterType(WUQuerySetFilterType.fromValue(filtertype.toString()));
        }
        params.setQuerySetName(querySetName);
        WUQuerySetDetailsResponse resp=getSoapProxy().WUQuerysetDetails(params);
        throwWsWUExceptions(resp.getExceptions(), "Could not search queries:" );
        QuerySetQuery[] queries = resp.getQuerysetQueries();
        List result=new ArrayList();
        if (queries!=null)
        {
            for (QuerySetQuery item:queries)
            {
                result.add(new QueryResult(item));
            }
        }
        return result;
    }
    /**
     * Call WUListQueries service
     * @param queryid - unique ID of the query
     * @param queryname - name/alias of the query
     * @param clustername - name of the cluster the query is on
     * @param querysetname - name of the queryset the cluster is part of
     * @param pageSize - number of results to return (if null, 100 results are returned)
     * @param pageStartFrom - which result to start returning on (if null, results start with 1)
     * @param activated - whether to return activated queries
     * @param filename - return queries using this filename
     * @return List of QueryResults populated from QuerySetQuery list
     * @throws Exception
     */
    public List listQueries(String queryid, String queryname, String clustername, String querysetname,
            Integer pageSize,Integer pageStartFrom,
            Boolean activated, String filename,Boolean descending) throws Exception
    {
        final WUListQueries params = new WUListQueries();
        if (pageSize != null)
        {
            params.setPageSize(new NonNegativeInteger(String.valueOf(pageSize)));
        }
        if (pageStartFrom != null)
        {
            params.setPageStartFrom(new NonNegativeInteger(String.valueOf(pageStartFrom)));
        }
        params.setDescending(descending);
        params.setClusterName(clustername);
        params.setQuerySetName(querysetname);
        params.setQueryName(queryname);
        params.setQueryID(queryid);
        params.setActivated(activated);
        params.setFileName(filename);
        WUListQueriesResponse resp = getSoapProxy().WUListQueries(params);
        throwWsWUExceptions(resp.getExceptions(), "Could not fetch queries: ");
        QuerySetQuery[] queries = resp.getQuerysetQueries();
        List result=new ArrayList();
        if (queries!=null)
        {
            for (QuerySetQuery item:queries) {
                result.add(new QueryResult(item));
            }
        }
        return result;
    }

    /**
     * @param queryname - query to retrieve files for
     * @param cluster - the cluster to search for said query
     * @return - List of matching queries
     * @throws Exception
     */
    public List getQueryFiles(String queryname, String cluster) throws Exception
    {
        final WUQueryFiles queryFiles = new WUQueryFiles(cluster, queryname);
        WUQueryFilesResponse resp = getSoapProxy().WUQueryFiles(queryFiles);
        this.throwWsWUExceptions(resp.getExceptions(), "Could not get files for query " + queryname + ":");
        List result=new ArrayList();
        if (resp.getFiles() != null)
        {
            for (int i = 0; i < resp.getFiles().length; i++)
            {
                result.add(new QueryFileInfo(resp.getFiles()[i]));
            }
        }
        return result;
    }

    /**
     * @param queryId - unique id of query to activate
     * @param cluster - cluster to activate upon
     * @return
     * @throws Exception
     */
    public QueryResult activateQuery(String queryId, String cluster) throws Exception
    {
        final WUQuerysetQueryAction queryAction = new WUQuerysetQueryAction();
        queryAction.setAction(QuerySetQueryActionTypes.Activate);
        final QuerySetQueryActionItem item = new QuerySetQueryActionItem();
        item.setQueryId(queryId);
        final QuerySetQueryActionItem[] items = new QuerySetQueryActionItem[]{item};
        queryAction.setQuerySetName(cluster);
        queryAction.setQueries(items);
        final WUQuerySetQueryActionResponse resp =getSoapProxy().WUQuerysetQueryAction(queryAction);
        this.throwWsWUExceptions(resp.getExceptions(), "Could not activate query " + queryId);
        if (resp.getResults() != null && resp.getResults().length>0)
        {
            QueryResult wrapped=new QueryResult(resp.getResults()[0]);
            if (QuerySetQueryActionTypes.Activate.equals(resp.getAction()))
            {
                wrapped.setActivated(true);
            }
            else
            {
                wrapped.setActivated(false);
            }
            return wrapped;
        }
        return null;
    }
    /**
     * @param querynames - queries to delete
     * @param cluster - cluster to delete from
     * @return - List result of actions
     * @throws Exception
     */
    public List deleteQueries(Set querynames, String cluster) throws Exception
    {
        WUQuerysetQueryAction params=new WUQuerysetQueryAction();
        QuerySetQueryActionItem[] queries=new QuerySetQueryActionItem[querynames.size()];
        int i=0;
        for (String queryname:querynames)
        {
            QuerySetQueryActionItem item=new QuerySetQueryActionItem();
            item.setQueryId(queryname);
            queries[i]=item;
            i++;
        }
        params.setQueries(queries);
        params.setQuerySetName(cluster);
        params.setAction(QuerySetQueryActionTypes.Delete);

        WUQuerySetQueryActionResponse resp = getSoapProxy().WUQuerysetQueryAction(params);
        this.throwWsWUExceptions(resp.getExceptions(), "Could not delete queries: ");
        List results=new ArrayList();

        if (resp.getResults() != null)
        {
            for (int j=0; j < resp.getResults().length;j++)
            {
                QuerySetQueryActionResult res=resp.getResults()[j];
                results.add(new QueryResult(res));
            }
        }
        return results;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy