SOAP Web Services Operations

Introduction to Web Services Operations

When looking through the WSDL, you can find all of the operations available along with their responses at the top. Every operation is represented by an <element> block with the corresponding name for the operation; the response is simply the name of the operation with a "Response" suffix.

The responses contain an "operationResult", which is described by the following complexType in the WSDL:


            <complexType name="operationResult">  
  <sequence>  
    <element maxOccurs="1" name="success" type="xsd:string"></element>  
    <element maxOccurs="1" name="message" nillable="true" type="xsd:string"></element>                       
  </sequence>  
</complexType>
            

This WSDL describes that inside the corresponding element (i.e. "editReturn") will appear two more elements: "success", which will be either "true" or "false", and a "message" element that will contain a relevant message from the server (generally only non-nill when the operation failed).

Authentication

For each operation, it is necessary to include authentication information. This is specified by the required "authentication" element seen in every request type. Looking further in the WSDL, we see the following:


            <complexType name="authentication">  
  <sequence>  
    <element name="password" nillable="false" type="xsd:string"></element>  
    <element name="username" nillable="false" type="xsd:string"></element>  
  </sequence>  
</complexType>
            

This complex type corresponds to this authentication element. The authentication type must contain two sub-elements: username and password, which are each of the type String. This is used by Cascade CMS to authenticate the user making the SOAP request and to ensure that the user has the proper permissions to carry out that operation.

Example:


            <m:authentication>  
  <m:username>admin</m:username>  
  <m:password>admin</m:password>  
</m:authentication>
            

Operation Overview

Creating and Editing are two very similar operations. Looking at the WSDL, we see both the "create" and "edit" operations take two sub-elements: authentication (discussed above) and asset. Asset is a universal classification for all Cascade CMS assets and for including workflow information (when necessary). Looking at the "asset" complexType , we see the following:


            <!-- asset is an aggregate type that includes all possible Cascade CMS assets  
     bundled with workflow configuration. When a user does not have the privileges to bypass  
     workflow, this configuration is used to configure the step assignments of the workflow -->
<complexType name="asset">  
  <sequence>  
    <element maxOccurs="1" minOccurs="0" name="workflowConfiguration" type="impl:workflow-configuration"></element>  
    <choice>  
      <element maxOccurs="1" minOccurs="1" name="feedBlock" nillable="true" type="impl:feedBlock"></element>
      <element maxOccurs="1" minOccurs="1" name="indexBlock" nillable="true" type="impl:indexBlock"></element>
      <element maxOccurs="1" minOccurs="1" name="textBlock" nillable="true" type="impl:textBlock"></element>
      <element maxOccurs="1" minOccurs="1" name="xhtmlDataDefinitionBlock" nillable="true" type="impl:xhtmlDataDefinitionBlock"></element>
      <element maxOccurs="1" minOccurs="1" name="xmlBlock" nillable="true" type="impl:xmlBlock"></element>
      <element maxOccurs="1" minOccurs="1" name="file" nillable="true" type="impl:file"></element>
      <element maxOccurs="1" minOccurs="1" name="folder" nillable="true" type="impl:folder"></element>
      <element maxOccurs="1" minOccurs="1" name="page" nillable="true" type="impl:page"></element>
      <element maxOccurs="1" minOccurs="1" name="reference" nillable="true" type="impl:reference"></element>
      <element maxOccurs="1" minOccurs="1" name="xsltFormat" nillable="true" type="impl:xsltFormat"></element>
      <element maxOccurs="1" minOccurs="1" name="scriptFormat" nillable="true" type="impl:scriptFormat"></element>
      <element maxOccurs="1" minOccurs="1" name="symlink" nillable="true" type="impl:symlink"></element>
      <element maxOccurs="1" minOccurs="1" name="template" nillable="true" type="impl:template"></element>
      <!-- admin area assets (must be manager or higher to access,
         no workflowConfiguration needed -->
      <element maxOccurs="1" minOccurs="1" name="user" nillable="true" type="impl:user"></element>
      <element maxOccurs="1" minOccurs="1" name="group" nillable="true" type="impl:group"></element>
      <element maxOccurs="1" minOccurs="1" name="role" nillable="true" type="impl:role"></element>
      <element maxOccurs="1" minOccurs="1" name="assetFactory" nillable="true" type="impl:assetFactory"></element>
      <element maxOccurs="1" minOccurs="1" name="assetFactoryContainer" nillable="true" type="impl:assetFactoryContainer"></element>
      <element maxOccurs="1" minOccurs="1" name="contentType" nillable="true" type="impl:contentType"></element>
      <element maxOccurs="1" minOccurs="1" name="contentTypeContainer" nillable="true" type="impl:contentTypeContainer"></element>
      <element maxOccurs="1" minOccurs="1" name="connectorContainer" nillable="true" type="impl:connectorContainer"></element>
      <element maxOccurs="1" minOccurs="1" name="twitterConnector" nillable="true" type="impl:twitterConnector"></element>
      <element maxOccurs="1" minOccurs="1" name="facebookConnector" nillable="true" type="impl:facebookConnector"></element>
      <element maxOccurs="1" minOccurs="1" name="wordPressConnector" nillable="true" type="impl:wordPressConnector"></element>
      <element maxOccurs="1" minOccurs="1" name="googleAnalyticsConnector" nillable="true" type="impl:googleAnalyticsConnector"></element>
      <element maxOccurs="1" minOccurs="1" name="pageConfigurationSet" nillable="true" type="impl:pageConfigurationSet"></element>
      <element maxOccurs="1" minOccurs="1" name="pageConfigurationSetContainer" nillable="true" type="impl:pageConfigurationSetContainer"></element>
      <element maxOccurs="1" minOccurs="1" name="dataDefinition" nillable="true" type="impl:dataDefinition"></element>
      <element maxOccurs="1" minOccurs="1" name="dataDefinitionContainer" nillable="true" type="impl:dataDefinitionContainer"></element>
      <element maxOccurs="1" minOccurs="1" name="sharedField" nillable="true" type="impl:sharedField"></element>
      <element maxOccurs="1" minOccurs="1" name="sharedFieldContainer" nillable="true" type="impl:sharedFieldContainer"></element>
      <element maxOccurs="1" minOccurs="1" name="metadataSet" nillable="true" type="impl:metadataSet"></element>
      <element maxOccurs="1" minOccurs="1" name="metadataSetContainer" nillable="true" type="impl:metadataSetContainer"></element>
      <element maxOccurs="1" minOccurs="1" name="publishSet" nillable="true" type="impl:publishSet"></element>
      <element maxOccurs="1" minOccurs="1" name="publishSetContainer" nillable="true" type="impl:publishSetContainer"></element>
      <element maxOccurs="1" minOccurs="1" name="target" nillable="true" type="impl:target"></element>
      <element maxOccurs="1" minOccurs="1" name="siteDestinationContainer" nillable="true" type="impl:siteDestinationContainer"></element>
      <element maxOccurs="1" minOccurs="1" name="destination" nillable="true" type="impl:destination"></element>
      <element maxOccurs="1" minOccurs="1" name="fileSystemTransport" nillable="true" type="impl:fileSystemTransport"></element>
      <element maxOccurs="1" minOccurs="1" name="ftpTransport" nillable="true" type="impl:ftpTransport"></element>
      <element maxOccurs="1" minOccurs="1" name="databaseTransport" nillable="true" type="impl:databaseTransport"></element>
      <element maxOccurs="1" minOccurs="1" name="cloudTransport" nillable="true" type="impl:cloudTransport"></element>
      <element maxOccurs="1" minOccurs="1" name="transportContainer" nillable="true" type="impl:transportContainer"></element>
      <element maxOccurs="1" minOccurs="1" name="workflowDefinition" nillable="true" type="impl:workflowDefinition"></element>
      <element maxOccurs="1" minOccurs="1" name="workflowDefinitionContainer" nillable="true" type="impl:workflowDefinitionContainer"></element>
      <element maxOccurs="1" minOccurs="1" name="workflowEmail" nillable="true" type="impl:workflowEmail"></element>
      <element maxOccurs="1" minOccurs="1" name="workflowEmailContainer" nillable="true" type="impl:workflowEmailContainer"></element>
      <element maxOccurs="1" minOccurs="1" name="twitterFeedBlock" nillable="true" type="impl:twitterFeedBlock"></element>
      <!-- other assets -->
      <element maxOccurs="1" minOccurs="1" name="site" nillable="true" type="impl:site"></element>
      <element maxOccurs="1" minOccurs="1" name="editorConfiguration" nillable="true" type="impl:editorConfiguration"></element>
    </choice>  
  </sequence>  
</complexType>
            

First, there is the workflowConfiguration element. This is necessary when the user executing the SOAP request does not have the required permissions to bypass workflow, and the operation is subject to workflow. For more information about workflow and SOAP, please see Workflow and Web Services Operations.

Next, there is the choice element that specifies that the user has a choice between all these assets, and each one corresponds to a specific asset type in Cascade CMS. Note that due to the choice element wrapping these elements and the maxOccurs="1" and minOccurs="1" attributes, only one asset may be specified at a time. If you wish to do bulk creation/editing, see the Batch Operation.

Read Operation

All read operations conform to the following WSDL:


            <element name="read">  
    <complexType>  
        <sequence>  
            <element name="authentication" type="impl:authentication"></element>  
            <element name="identifier" type="impl:identifier"></element>  
        </sequence>  
    </complexType>  
</element>
            

Authentication has been discussed before, in the Authentication section.

The identifier complex type is defined in the following WSDL:


            <complexType name="identifier">  
  <sequence>  
    <choice>  
      <element maxOccurs="1" name="id" type="xsd:string"></element>  
      <element maxOccurs="1" name="path" type="impl:path"></element>  
    </choice>  
    <element maxOccurs="1" minOccurs="1" name="type" type="impl:entityTypeString"></element>  
  </sequence>  
</complexType>
            

An identifier is a composite type used to identify a single asset in Cascade CMS. It melds an ID or Path, and a type.

When using a Path as an identifer, you must use a Path type, which is a string of the path, and a Site name or Site ID:


            <complexType name="path">  
  <sequence>  
    <element maxOccurs="1" name="path" type="xsd:string"></element>  
    <choice>  
      <element maxOccurs="1" name="siteId" nillable="true" type="xsd:string"></element>  
      <element maxOccurs="1" name="siteName" nillable="true" type="xsd:string"></element>  
    </choice>  
  </sequence>  
</complexType>
            

The type is defined by the following enumeration:


            <simpleType name="entityTypeString">
    <restriction base="xsd:string">
        <enumeration value="assetfactory"/>
        <enumeration value="assetfactorycontainer"/>
        <enumeration value="block"/>
        <enumeration value="block_FEED"/>
        <enumeration value="block_INDEX"/>
        <enumeration value="block_TEXT"/>
        <enumeration value="block_XHTML_DATADEFINITION"/>
        <enumeration value="block_XML"/>
        <enumeration value="block_TWITTER_FEED"/>
        <enumeration value="connectorcontainer"/>
        <enumeration value="twitterconnector"/>
        <enumeration value="facebookconnector"/>
        <enumeration value="wordpressconnector"/>
        <enumeration value="googleanalyticsconnector"/>
        <enumeration value="contenttype"/>
        <enumeration value="contenttypecontainer"/>
        <enumeration value="destination"/>
        <enumeration value="editorconfiguration"/>
        <enumeration value="file"/>
        <enumeration value="folder"/>
        <enumeration value="group"/>
        <enumeration value="message"/>
        <enumeration value="metadataset"/>
        <enumeration value="metadatasetcontainer"/>
        <enumeration value="page"/>
        <enumeration value="pageconfigurationset"/>
        <enumeration value="pageconfiguration"/>
        <enumeration value="pageregion"/>
        <enumeration value="pageconfigurationsetcontainer"/>
        <enumeration value="publishset"/>
        <enumeration value="publishsetcontainer"/>
        <enumeration value="reference"/>
        <enumeration value="role"/>
        <enumeration value="datadefinition"/>
        <enumeration value="datadefinitioncontainer"/>
        <enumeration value="sharedfield"/>
        <enumeration value="sharedfieldcontainer"/>
        <enumeration value="format"/>
        <enumeration value="format_XSLT"/>
        <enumeration value="format_SCRIPT"/>
        <enumeration value="site"/>
        <enumeration value="sitedestinationcontainer"/>
        <enumeration value="symlink"/>
        <enumeration value="target"/>
        <enumeration value="template"/>
        <enumeration value="transport"/>
        <enumeration value="transport_fs"/>
        <enumeration value="transport_ftp"/>
        <enumeration value="transport_db"/>
        <enumeration value="transport_cloud"/>
        <enumeration value="transportcontainer"/>
        <enumeration value="user"/>
        <enumeration value="workflow"/>
        <enumeration value="workflowdefinition"/>
        <enumeration value="workflowdefinitioncontainer"/>
        <enumeration value="workflowemail"/>
        <enumeration value="workflowemailcontainer"/>
    </restriction>
</simpleType>
            

Delete Operation

The delete operation is just like the read operation in that it contains an identifier. The WSDL describing the delete operation is as follows:


            <complexType name="delete">  
  <sequence>  
    <element maxOccurs="1" minOccurs="0" name="workflowConfiguration" type="impl:workflow-configuration"></element>  
    <element maxOccurs="1" minOccurs="1" name="identifier" type="impl:identifier"></element>  
  </sequence>  
</complexType>
            

The delete operation contains workflow information and an identifier, which are discussed in the Workflow and Web Services Operations and Read Operation sections, respectively.

Publish Operation

The publish operation is very similar to the read and delete operation:


            <complexType name="publish">  
  <sequence>  
    <element name="identifier" nillable="true" type="impl:identifier"></element>  
  </sequence>  
</complexType>
            

This time the publish operation only takes an identifier and no workflow information. The identifier must reference only publishable assets: a file, folder, or page. Also, it is possible to specify a target, destination, or publish set by using the types target, destination, or publishset in the identifier. The user included in the authentication information must be of the publisher role or higher; otherwise they will not be able to publish and receive an response indicating a failure.

Batch Operation

The batch operation is a simple way of accomplishing multiple operations while only transmitting a single SOAP request/response. Here is the WSDL for the "batch" element:


            <element name="batch">  
  <complexType>  
    <sequence>  
      <element maxOccurs="1" minOccurs="1" name="authentication" type="impl:authentication"></element>  
      <element maxOccurs="unbounded" name="operation" type="impl:operation"></element>  
    </sequence>  
  </complexType>  
</element>
            

Authentication has already been discussed; what is important here is the ability to specify any number of "operation" elements, each of which map to the "operation" complex type:


            <complexType name="operation">  
  <choice>  
    <element name="create" type="impl:create"></element>  
    <element name="delete" type="impl:delete"></element>  
    <element name="edit" type="impl:edit"></element>  
    <element name="publish" type="impl:publish"></element>  
    <element name="read" type="impl:read"></element>  
  </choice>  
</complexType>
            

The operation complex type is simply an aggregate of all the other operation types available.

Here is a sample batch request:


            <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
  <SOAP-ENV:Body>  
    <m:batch xmlns:m="http://www.hannonhill.com/ws/ns/AssetOperationService">  
      <m:authentication>  
        <m:password>admin</m:password>  
        <m:username>admin</m:username>  
      </m:authentication>  
      <m:operation>  
        <m:create>  
          <m:asset>  
            <m:page>  
              <m:name>default</m:name>  
              <m:parentFolderPath>/intranet</m:parentFolderPath>  
              <m:path>/intranet/default</m:path>  
              <m:metadata>  
                <m:author>Zach Bailey</m:author>  
              </m:metadata>  
              <m:metadataSetId>ROOT</m:metadataSetId>  
              <m:shouldBePublished>true</m:shouldBePublished>  
              <m:shouldBeIndexed>true</m:shouldBeIndexed>  
              <m:xhtml><![CDATA[<p>Welcome to my page!</p>]]></m:xhtml>  
            </m:page>  
          </m:asset>  
        </m:create>  
        <m:publish>  
          <m:identifier>  
            <m:path>/intranet/default</m:path>  
            <m:type>page</m:type>  
          </m:identifier>  
        </m:publish>  
      </m:operation>  
    </m:batch>  
  </SOAP-ENV:Body>  
</SOAP-ENV:Envelope>
            

This batch request edits the /intranet/default page and then publishes those changes.

Workflow and Web Services Operations

When a user making an edit, create, or delete request does not have the role/permission to bypass workflow, it is necessary to include workflow information in the request message.


            <complexType name="workflow-configuration">  
  <sequence>  
    <element maxOccurs="1" minOccurs="1" name="workflowName" type="xsd:string"></element>  
    <choice>  
      <element maxOccurs="1" minOccurs="1" name="workflowDefinitionId" type="xsd:string"></element>  
      <element maxOccurs="1" minOccurs="1" name="workflowDefinitionPath" type="xsd:string"></element>  
    </choice>  
    <element maxOccurs="1" minOccurs="1" name="workflowComments" type="xsd:string"></element>  
    <element maxOccurs="1" minOccurs="0" name="workflowStepConfigurations" type="impl:workflow-step-configurations"></element>  
  </sequence>  
</complexType>
            

This complex type allows the user to specify what to name the workflow instance and what workflow definition to use when instantiating workflow. Additionally, the user must provide workflow comments explaining the action and any workflow step configuration.

Configuring the Workflow Steps

The workflowStepConfigurations element corresponds to the following workflow-step-configurations complex type:


            <complexType name="workflow-step-configurations">  
  <sequence>  
    <element maxOccurs="unbounded" name="workflowStepConfiguration" type="impl:workflow-step-configuration"></element>  
  </sequence>  
</complexType>
            

This complex type is just a list of workflowStepConfiguration elements which correspond to workflow-step-configuration complex types:


            <complexType name="workflow-step-configuration">  
  <sequence>  
    <element maxOccurs="1" minOccurs="1" name="stepIdentifier" type="xsd:string"></element>  
    <element maxOccurs="1" minOccurs="1" name="stepAssignment" type="xsd:string"></element>  
  </sequence>  
</complexType>
            

This allows the user to re-assign workflow steps with a given identifier (using the stepIdentifier element) to a given user or group (using the stepAssignment element). If no workflow step configurations are supplied, the workflow will be initialized with the default values for each step. If no default values are specified in the workflow definition, the user will receive an error explaining that the workflow's steps must be configured.

Transitioning Between Workflow Steps

Workflow steps can be transistions with web services using the performWorkflowTransition call.  This call requires the workflowTransitionInformation complex type:


            <complexType name="workflowTransitionInformation">  
  
    <sequence>  
  
    <!-- REQUIRED: The id of the workflow to perform the transition on -->  
  
         <element maxOccurs="1" minOccurs="1" name="workflowId" type="xsd:string"></element>  
  
    <!-- REQUIRED: The identifier of the action to transition to -->  
  
         <element maxOccurs="1" minOccurs="1" name="actionIdentifier" type="xsd:string"></element>  
  
    <!-- NOT REQUIRED: The user's comment about the transition taken -->  
  
         <element maxOccurs="1" minOccurs="0" name="transitionComment" nillable="true" type="xsd:string"></element>  
  
    </sequence>  
  
</complexType>
            

Search Operation

The search operation is defined by the following WSDL:


            <element name="search">  
  <complexType>  
    <sequence>  
      <element name="authentication" type="impl:authentication"></element>  
      <element name="searchInformation" type="impl:searchInformation"></element>  
    </sequence>  
  </complexType>  
</element>
            

This operation contains authentication information and search information. The search information complex type is defined as follows:


            <complexType name="searchInformation">  
  <sequence>  
    <!-- Option to switch between AND/OR search behavior   
         REQUIRED -->  
    <element maxOccurs="1" minOccurs="1" name="matchType" type="impl:search-match-type"></element>  
    <!-- Search field to match on an asset's name   
         NOT REQUIRED -->  
    <element maxOccurs="1" minOccurs="0" name="assetName" type="xsd:string"></element>  
    <!-- Search field to match on an asset's content   
         NOT REQUIRED -->  
    <element maxOccurs="1" minOccurs="0" name="assetContent" type="xsd:string"></element>  
    <!-- Search field to match on an asset's metadata   
         NOT REQUIRED -->  
    <element maxOccurs="1" minOccurs="0" name="assetMetadata" type="xsd:string"></element>  
    <!-- Whether or not to search block assets  
         NOT REQUIRED default: false -->  
    <element maxOccurs="1" minOccurs="0" name="searchBlocks" type="xsd:boolean"></element>  
    <!-- Whether or not to search file assets  
         NOT REQUIRED default: false -->  
    <element maxOccurs="1" minOccurs="0" name="searchFiles" type="xsd:boolean"></element>  
    <!-- Whether or not to search folder assets  
         NOT REQUIRED default: false -->  
    <element maxOccurs="1" minOccurs="0" name="searchFolders" type="xsd:boolean"></element>  
    <!-- Whether or not to search page assets  
         NOT REQUIRED default: false -->  
    <element maxOccurs="1" minOccurs="0" name="searchPages" type="xsd:boolean"></element>  
    <!-- Whether or not to search stylesheet assets  
         NOT REQUIRED default: false -->  
    <element maxOccurs="1" minOccurs="0" name="searchStylesheets" type="xsd:boolean"></element>  
    <!-- Whether or not to search symlink assets  
         NOT REQUIRED default: false -->  
    <element maxOccurs="1" minOccurs="0" name="searchSymlinks" type="xsd:boolean"></element>  
    <!-- Whether or not to search template assets  
         NOT REQUIRED default: false -->  
    <element maxOccurs="1" minOccurs="0" name="searchTemplates" type="xsd:boolean"></element>  
  </sequence>  
</complexType>
            

This search information complex type contains all the fields that one would find in the Advanced Search screen from within the Cascade CMS web interface.

When executing a  search, Cascade CMS will return a Search Result object:


            <complexType name="searchResult">  
  <complexContent>  
    <extension base="impl:operationResult">  
      <sequence>  
        <element maxOccurs="1" minOccurs="1" name="matches" type="impl:search-matches"></element>  
      </sequence>  
    </extension>  
  </complexContent>           
</complexType>
            

This complex type contains a type called "search-matches", which is an array of identifiers:


            <complexType name="search-matches">  
  <sequence>  
    <element maxOccurs="unbounded" minOccurs="0" name="match" type="impl:identifier"></element>  
  </sequence>  
</complexType>
            

Authenticate Operation

The authenticate operation relies on the same authentication type the other Asset Operations use:


            <element name="authenticate">  
  <complexType>  
    <sequence>  
      <element name="authentication" type="impl:authentication"></element>  
    </sequence>  
  </complexType>  
</element>
            

This authentication object contains a username and password element, both of which are required and are of type String.

Note - The Authenticate Operation is implemented in the Security Service, which is a different Cascade CMS Web Services Endpoint than the Endpoint used to accomplish the other operations (Asset Operation Handler). Make sure that when you are sending a request containing this operation that you are sending it to the correct endpoint (Security Service).