<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
  -->

<services xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="https://ofbiz.apache.org/dtds/services.xsd">
    <description>Content Component Services</description>
    <vendor>OFBiz</vendor>

    <!-- interfaces -->
    <service name="uploadFileInterface" engine="interface">
        <description>Contains necessary parameters for all file upload requests via service event handler</description>
        <attribute name="uploadedFile" type="java.nio.ByteBuffer" mode="IN" optional="true"/>
        <attribute name="_uploadedFile_fileName" type="String" mode="IN" optional="true"/>
        <attribute name="_uploadedFile_contentType" type="String" mode="IN" optional="true"/>
    </service>

    <!-- Content services? -->
    <service name="getPublicForumMessage" engine="simple" default-entity-name="Content" auth="true"
            location="component://content/minilang/content/ContentServices.xml" invoke="getPublicForumMessage">
        <description>Get Content and resource information</description>
        <permission-service service-name="genericContentPermission" main-action="VIEW"/>
        <auto-attributes include="pk" mode="IN" optional="false"/>
        <attribute mode="OUT" name="resultData" optional="true" type="java.util.Map"/>
    </service>

    <service name="getContentAndDataResource" engine="simple" default-entity-name="Content" auth="true"
            location="component://content/minilang/content/ContentServices.xml" invoke="getContentAndDataResource">
        <description>Get Content and resource information</description>
        <permission-service service-name="genericContentPermission" main-action="VIEW"/>
        <auto-attributes include="pk" mode="IN" optional="false"/>
        <attribute mode="OUT" name="resultData" optional="true" type="java.util.Map"/>
    </service>

    <service name="getDataResource" engine="simple" default-entity-name="DataResource" auth="true"
            location="component://content/minilang/content/ContentServices.xml" invoke="getDataResource">
        <description>Get Content and resource information</description>
        <permission-service service-name="genericContentPermission" main-action="VIEW"/>
        <auto-attributes include="pk" mode="IN" optional="false"/>
        <attribute mode="OUT" name="resultData" optional="true" type="java.util.Map"/>
    </service>

    <!-- DataCategory services -->
    <service name="createDataCategory" engine="entity-auto" default-entity-name="DataCategory" auth="true" invoke="create">
        <description>Create a DataCategory</description>
        <permission-service service-name="contentManagerPermission" main-action="CREATE"/>
        <auto-attributes include="pk" mode="INOUT" optional="false"/>
        <auto-attributes include="nonpk" mode="IN" optional="true"/>
    </service>
    <service name="updateDataCategory" engine="entity-auto" default-entity-name="DataCategory" auth="true" invoke="update">
        <description>Update a DataCategory</description>
        <permission-service service-name="contentManagerPermission" main-action="UPDATE"/>
        <auto-attributes include="pk" mode="IN" optional="false"/>
        <auto-attributes include="nonpk" mode="IN" optional="true"/>
    </service>
    <service name="removeDataCategory" engine="entity-auto" default-entity-name="DataCategory" auth="true" invoke="delete">
        <description>Remove DataCategory</description>
        <permission-service service-name="contentManagerPermission" main-action="DELETE"/>
        <auto-attributes include="pk" mode="IN" optional="false"/>
    </service>

    <!-- DataResourceAttribute services -->
    <service name="createDataResourceAttribute" engine="entity-auto" default-entity-name="DataResourceAttribute" auth="true" invoke="create">
        <description>Create a DataResourceAttribute</description>
        <permission-service service-name="genericDataResourcePermission" main-action="CREATE"/>
        <auto-attributes include="pk" mode="IN" optional="false"/>
        <auto-attributes include="nonpk" mode="IN" optional="true"/>
    </service>
    <service name="updateDataResourceAttribute" engine="entity-auto" default-entity-name="DataResourceAttribute" auth="true" invoke="update">
        <description>Update a DataResourceAttribute</description>
        <permission-service service-name="genericDataResourcePermission" main-action="UPDATE"/>
        <auto-attributes include="pk" mode="IN" optional="false"/>
        <auto-attributes include="nonpk" mode="IN" optional="true"/>
    </service>
    <service name="removeDataResourceAttribute" engine="entity-auto" default-entity-name="DataResourceAttribute" auth="true" invoke="delete">
        <description>Remove DataResourceAttribute</description>
        <permission-service service-name="genericDataResourcePermission" main-action="DELETE"/>
        <auto-attributes include="pk" mode="IN" optional="false"/>
    </service>

    <!-- DataResourceRole services -->
    <service name="createDataResourceRole" engine="entity-auto" default-entity-name="DataResourceRole" auth="true" invoke="create">
        <description>Create a DataResourceRole</description>
        <permission-service service-name="genericDataResourcePermission" main-action="CREATE"/>
        <auto-attributes include="nonpk" mode="IN" optional="true"/>
        <attribute name="dataResourceId" mode="IN" type="String"/>
        <attribute name="partyId" mode="IN" type="String"/>
        <attribute name="roleTypeId" mode="IN" type="String"/>
        <attribute name="fromDate" mode="INOUT" type="Timestamp" optional="true"/>
    </service>
    <service name="updateDataResourceRole" engine="entity-auto" default-entity-name="DataResourceRole" auth="true" invoke="update">
        <description>Update a DataResourceRole</description>
        <permission-service service-name="genericDataResourcePermission" main-action="UPDATE"/>
        <auto-attributes include="pk" mode="IN" optional="false"/>
        <auto-attributes include="nonpk" mode="IN" optional="true"/>
    </service>
    <service name="removeDataResourceRole" engine="entity-auto" default-entity-name="DataResourceRole" auth="true" invoke="delete">
        <description>Remove DataResourceRole</description>
        <permission-service service-name="genericDataResourcePermission" main-action="DELETE"/>
        <auto-attributes include="pk" mode="IN" optional="false"/>
    </service>

    <!-- Generic Content Services -->
    <service name="createEmailContent" engine="simple" location="component://content/minilang/content/ContentServices.xml" invoke="createEmailContent">
        <permission-service service-name="contentManagerPermission" main-action="CREATE"/>
        <auto-attributes mode="IN" entity-name="Content" optional="true"/>
        <attribute name="subject" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingSubject"/>
            </type-validate>
        </attribute>
        <attribute name="plainBody" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingPlainBody"/>
            </type-validate>
        </attribute>
        <attribute name="htmlBody" type="String" mode="IN" optional="true" allow-html="any"/>
        <override name="contentId" mode="INOUT"/>
    </service>
    <service name="updateEmailContent" engine="simple" location="component://content/minilang/content/ContentServices.xml" invoke="updateEmailContent">
        <permission-service service-name="contentManagerPermission" main-action="UPDATE"/>
        <attribute name="subjectDataResourceId" type="String" mode="IN" optional="true"/>
        <attribute name="subject" type="String" mode="IN" optional="true"/>
        <attribute name="plainBodyDataResourceId" type="String" mode="IN" optional="true"/>
        <attribute name="plainBody" type="String" mode="IN" optional="true"/>
        <attribute name="htmlBodyDataResourceId" type="String" mode="IN" optional="true"/>
        <attribute name="htmlBody" type="String" mode="IN" optional="true" allow-html="any"/>
    </service>

    <service name="createDownloadContent" engine="simple" location="component://content/minilang/content/ContentServices.xml" invoke="createDownloadContent">
        <permission-service service-name="contentManagerPermission" main-action="CREATE"/>
        <auto-attributes mode="IN" entity-name="Content" optional="true"/>
        <attribute name="file" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingFile"/>
            </type-validate>
        </attribute>
        <override name="contentId" mode="INOUT"/>
    </service>
    <service name="updateDownloadContent" engine="simple" location="component://content/minilang/content/ContentServices.xml" invoke="updateDownloadContent">
        <permission-service service-name="contentManagerPermission" main-action="UPDATE"/>
        <attribute name="fileDataResourceId" type="String" mode="IN" optional="true"/>
        <attribute name="file" type="String" mode="IN" optional="true"/>
    </service>

    <service name="createSimpleTextContent" engine="simple" location="component://content/minilang/content/ContentServices.xml" invoke="createSimpleTextContent">
        <permission-service service-name="contentManagerPermission" main-action="CREATE"/>
        <auto-attributes mode="IN" entity-name="Content" optional="true"/>
        <attribute name="text" type="String" mode="IN" optional="false" allow-html="safe">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingText"/>
            </type-validate>
        </attribute>
        <override name="contentId" mode="INOUT"/>
    </service>
    <service name="updateSimpleTextContent" engine="simple" location="component://content/minilang/content/ContentServices.xml" invoke="updateSimpleTextContent">
        <permission-service service-name="contentManagerPermission" main-action="UPDATE"/>
        <attribute name="textDataResourceId" type="String" mode="IN" optional="true"/>
        <attribute name="text" type="String" mode="IN" optional="true" allow-html="safe"/>
    </service>

    <!-- Util -->
    <service name="findAssocContent" engine="simple"
            location="component://content/minilang/content/ContentServices.xml" invoke="findAssocContent" auth="true">
        <attribute name="contentId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute name="mapKeys" type="List" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingMapKeys"/>
            </type-validate>
        </attribute>
        <attribute name="contentAssocs" type="List" mode="OUT" optional="true"/>
    </service>

    <!-- Complex Contentservices -->

    <!-- simply use createContent and the accoc will be created too" -->
        <!--service name="createContentAndAssoc" default-entity-name="Content" engine="simple"
            location="component://content/minilang/content/ContentServices.xml" invoke="createContentAndAssoc" auth="true">
        <description>Create a Content with a ContentAssoc</description>
        <auto-attributes entity-name="Content" include="all" mode="IN" optional="true">
            <exclude field-name="contentId"/>
            <exclude field-name="contentTypeId"/>
        </auto-attributes>

        <auto-attributes entity-name="ContentAssoc" include="all" mode="IN" optional="true">
            <exclude field-name="contentIdTo"/>
            <exclude field-name="contentId"/>
        </auto-attributes>
        <attribute mode="INOUT" entity-name="Content" name="contentId" optional="true" type="String"/>
        <attribute mode="INOUT" entity-name="ContentAssoc" name="contentIdTo" optional="true" type="String"/>
        <attribute mode="INOUT" entity-name="ContentAssoc" name="contentIdFrom" optional="true" type="String"/>
        <attribute mode="IN" name="contentTypeId" optional="false" type="String"/>
    </service-->

    <service name="getAssocAndContentAndDataResourceCache" default-entity-name="ContentAssocDataResourceViewFrom"
        engine="java" location="org.apache.ofbiz.content.content.ContentServicesComplex"
        invoke="getAssocAndContentAndDataResourceCache" auth="false">
        <description>Get a ContentAssocDataResourceView</description>
        <auto-attributes entity-name="ContentAssocDataResourceViewFrom" include="all"
            mode="OUT" optional="true">
            <exclude field-name="contentIdStart"/>
        </auto-attributes>
        <attribute mode="IN" name="assocTypes" optional="true" type="List"/>
        <attribute mode="IN" name="assocTypesString" optional="true" type="String"/>
        <attribute mode="IN" name="contentTypes" optional="true" type="List"/>
        <attribute mode="IN" name="contentTypesString" optional="true" type="String"/>
        <attribute mode="IN" name="mapKey" optional="true" type="String"/>
        <attribute mode="IN" name="contentId" optional="true" type="String"/>
        <attribute mode="IN" name="direction" optional="true" type="String"/>
        <attribute mode="IN" name="fromDateStr" optional="true" type="String"/>
        <attribute mode="IN" name="thruDateStr" optional="true" type="String"/>
        <attribute mode="IN" name="fromDate" optional="true" type="Timestamp"/>
        <attribute mode="IN" name="thruDate" optional="true" type="Timestamp"/>
        <attribute name="nullThruDatesOnly" type="Boolean" mode="IN" optional="true"/>
        <attribute mode="IN" name="contentAssocPredicateId" optional="true" type="String"/>
        <attribute mode="IN" name="contentIdFrom" optional="true" type="String"/>
        <attribute mode="OUT" name="entityList" optional="true" type="List"/>
        <attribute mode="OUT" name="view" optional="true" type="org.apache.ofbiz.entity.GenericValue"/>
    </service>

    <service name="getAssocAndContentAndDataResource" default-entity-name="ContentAssocDataResourceViewFrom"
            engine="java" location="org.apache.ofbiz.content.content.ContentServicesComplex" invoke="getAssocAndContentAndDataResource" auth="false">
        <description>Get a ContentAssocDataResourceView</description>
        <auto-attributes entity-name="ContentAssocDataResourceViewFrom" include="all" mode="OUT" optional="true">
            <exclude field-name="contentIdStart"/>
        </auto-attributes>
        <attribute mode="IN" name="assocTypes" optional="true" type="List"/>
        <attribute mode="IN" name="contentTypes" optional="true" type="List"/>
        <attribute mode="IN" name="mapKey" optional="true" type="String"/>
        <attribute mode="IN" name="contentId" optional="true" type="String"/>
        <attribute mode="IN" name="direction" optional="true" type="String"/>
        <attribute mode="IN" name="fromDateStr" optional="true" type="String"/>
        <attribute mode="IN" name="thruDateStr" optional="true" type="String"/>
        <attribute mode="IN" name="fromDate" optional="true" type="Timestamp"/>
        <attribute mode="IN" name="thruDate" optional="true" type="Timestamp"/>
        <attribute name="nullThruDatesOnly" type="Boolean" mode="IN" optional="true"/>
        <attribute mode="OUT" name="entityList" optional="true" type="List"/>
    </service>

    <service name="traverseContent" auth="false" engine="java" invoke="traverseContent"
        location="org.apache.ofbiz.content.content.ContentServices">
        <description>Follow a content and return descendants</description>
        <attribute mode="IN" name="contentId" optional="false" type="String">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="fromDateStr" optional="true" type="String"/>
        <attribute mode="IN" name="thruDateStr" optional="true" type="String"/>
        <attribute mode="IN" name="followWhen" optional="true" type="String"/>
        <attribute mode="IN" name="pickWhen" optional="true" type="String"/>
        <attribute mode="IN" name="returnBeforePickWhen" optional="true" type="String"/>
        <attribute mode="IN" name="returnAfterPickWhen" optional="true" type="String"/>
        <attribute mode="IN" name="direction" optional="true" type="String"/>
        <attribute mode="OUT" name="pickList" optional="true" type="List"/>
        <attribute mode="OUT" name="nodeMap" optional="true" type="Map"/>
    </service>
    <service name="getContent" engine="java"
        location="org.apache.ofbiz.content.ContentManagementServices" invoke="getContent" auth="false">
        <description>Get Content of passed contentId</description>
        <attribute mode="IN" name="contentId" optional="true" type="String"/>
        <attribute mode="OUT" name="view" optional="true" type="org.apache.ofbiz.entity.GenericValue"/>
    </service>
    <service name="getSubContent" engine="java" location="org.apache.ofbiz.content.ContentManagementServices" invoke="getSubContent" auth="false">
        <description>Get subContent of passed contentId/mapKey or subContentId</description>
        <attribute mode="IN" name="mapKey" optional="true" type="String"/>
        <attribute mode="IN" name="contentId" optional="true" type="String"/>
        <attribute mode="IN" name="subContentId" optional="true" type="String"/>
        <attribute mode="IN" name="assocTypes" optional="true" type="List"/>
        <attribute mode="IN" name="assocTypesString" optional="true" type="String"/>
        <attribute mode="IN" name="contentTypes" optional="true" type="List"/>
        <attribute mode="IN" name="fromDate" optional="true" type="Timestamp"/>
        <attribute mode="OUT" name="view" optional="true" type="org.apache.ofbiz.entity.GenericValue"/>
        <attribute mode="OUT" name="content" optional="true" type="org.apache.ofbiz.entity.GenericValue"/>
    </service>

    <service name="persistContentAndAssoc" engine="java" transaction-timeout="7200"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="persistContentAndAssoc" auth="true">
        <description>Create a Content, DataResource and/or ContentAssoc</description>
        <permission-service service-name="genericContentPermission" main-action="CREATE"/>
        <auto-attributes entity-name="ContentDataResourceView" include="all" mode="IN" optional="true">
            <exclude field-name="contentId"/>
        </auto-attributes>
        <auto-attributes entity-name="DataResource" include="all" mode="IN" optional="true">
            <exclude field-name="dataResourceId"/>
        </auto-attributes>
        <auto-attributes entity-name="ElectronicText" include="all" mode="IN" optional="true">
            <exclude field-name="dataResourceId"/>
        </auto-attributes>
        <auto-attributes entity-name="ContentAssoc" include="all" mode="IN" optional="true">
            <exclude field-name="contentIdTo"/>
            <exclude field-name="contentId"/>
            <exclude field-name="fromDate"/>
            <exclude field-name="contentAssocTypeId"/>
        </auto-attributes>
        <auto-attributes entity-name="ContentAssocDataResourceViewTo" include="all" mode="IN" optional="true">
        </auto-attributes>
        <attribute mode="INOUT" entity-name="Content" name="contentId" optional="true" type="String"/>
        <attribute mode="INOUT" entity-name="DataResource" name="dataResourceId" optional="true" type="String"/>

        <attribute mode="INOUT" entity-name="DataResource" name="drDataResourceId" optional="true" type="String"/>
        <attribute mode="INOUT" name="caContentIdTo" optional="true" type="String"/>
        <attribute mode="INOUT" name="caContentId" optional="true" type="String"/>
        <attribute mode="INOUT" name="caContentAssocTypeId" optional="true" type="String"/>
        <attribute mode="INOUT" name="caFromDate" optional="true" type="Timestamp"/>
        <attribute mode="INOUT" name="caSequenceNum" optional="true" type="Long"/>
        <attribute mode="IN" name="ownerContentId" optional="true" type="String"/>
        <attribute mode="IN" name="rootDir" optional="true" type="String"/>
        <attribute mode="IN" name="targetOperationList" optional="true" type="List"/>
        <attribute mode="IN" name="contentPurposeList" optional="true" type="List"/>
        <!-- it was a mistake to pass in List objects because it makes it difficult to use
             the service in a request event, so I added new ones without removing lists -->
        <attribute mode="IN" name="targetOperationString" optional="true" type="String"/>
        <attribute mode="IN" name="contentPurposeString" optional="true" type="String"/>
        <attribute mode="IN" name="userLogin" optional="true" type="org.apache.ofbiz.entity.GenericValue"/>
        <attribute mode="IN" name="imageData" optional="true" type="java.nio.ByteBuffer"/>
        <attribute mode="IN" name="_imageData_contentType" optional="true" type="String"/>
        <attribute mode="IN" name="_imageData_fileName" optional="true" type="String"/>
        <attribute mode="IN" name="deactivateExisting" optional="true" type="String"/>
        <attribute mode="IN" name="forceElectronicText" optional="true" type="String"/>
        <attribute mode="IN" name="displayFailCond" optional="true" type="Boolean"/>
        <attribute mode="INOUT" name="roleTypeList" optional="true" type="List"/>
        <override name="textData" allow-html="safe"/>
    </service>

    <service name="persistDataResourceAndData" engine="java"
        transaction-timeout="7200"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="persistDataResourceAndData" auth="true">
        <description>Persist a  DataResource and data</description>
        <auto-attributes entity-name="DataResource" include="all" mode="IN" optional="true" >
            <exclude field-name="dataResourceId"/>
        </auto-attributes>
        <auto-attributes entity-name="ElectronicText" include="all" mode="IN" optional="true">
            <exclude field-name="dataResourceId"/>
        </auto-attributes>
        <attribute mode="INOUT" entity-name="Content" name="contentId" optional="true" type="String"/>
        <attribute mode="INOUT" entity-name="DataResource" name="dataResourceId" optional="true" type="String"/>

        <attribute mode="INOUT" entity-name="DataResource" name="drDataResourceId" optional="true" type="String"/>
        <attribute mode="IN" name="rootDir" optional="true" type="String"/>
        <attribute mode="IN" name="targetOperationList" optional="true" type="List"/>
        <attribute mode="IN" name="contentPurposeList" optional="true" type="List"/>
        <!-- it was a mistake to pass in List objects because it makes it difficult to use
             the service in a request event, so I added new ones without removing lists -->
        <attribute mode="IN" name="targetOperationString" optional="true" type="String"/>
        <attribute mode="IN" name="contentPurposeString" optional="true" type="String"/>
        <attribute mode="IN" name="userLogin" optional="true" type="org.apache.ofbiz.entity.GenericValue"/>
        <attribute mode="IN" name="imageData" optional="true" type="java.nio.ByteBuffer"/>
        <attribute mode="IN" name="_imageData_contentType" optional="true" type="String"/>
        <attribute mode="IN" name="_imageData_fileName" optional="true" type="String"/>
        <attribute mode="IN" name="forceElectronicText" optional="true" type="String"/>
        <attribute mode="IN" name="displayFailCond" optional="true" type="Boolean"/>
        <override name="textData" allow-html="any"/>
    </service>

    <service name="persistCompDocContent" engine="simple"
        transaction-timeout="7200"
            location="component://content/minilang/compdoc/CompDocServices.xml" invoke="persistCompDocContent" auth="true">
        <description>Persist a CompDoc DataResource and data</description>
        <implements service="persistDataResourceAndData"/>
        <attribute name="contentRevisionSeqId" type="String" mode="OUT" optional="false"/>
        <attribute name="rootContentId" type="String" mode="IN" optional="true"/>
    </service>

    <service name="persistCompDocPdf2Survey" engine="simple"
        transaction-timeout="7200"
            location="component://content/minilang/compdoc/CompDocServices.xml" invoke="persistCompDocPdf2Survey" auth="true">
        <description>Upload/save PDF, create Survey, populate Content</description>
        <implements service="persistCompDocContent"/>
        <attribute name="pdfName" type="String" mode="IN" optional="true"/>
    </service>

    <service name="persistContentWithRevision" engine="java"
        transaction-timeout="7200"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="persistContentWithRevision" auth="true">
        <implements service="persistContentAndAssoc"/>
        <attribute mode="IN" name="masterRevisionContentId" optional="false" type="String">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingMasterRevisionContentId"/>
            </type-validate>
        </attribute>
    </service>

    <service name="findContentParents" engine="java"
        transaction-timeout="7200"
            location="org.apache.ofbiz.content.content.ContentServices" invoke="findContentParents" auth="true">
        <attribute mode="IN" name="contentId" optional="false" type="String">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="contentAssocTypeId" optional="false" type="String">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentAssocTypeId"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="direction" optional="true" type="String"/>
        <attribute mode="OUT" name="parentList" optional="true" type="List"/>
    </service>

    <service name="deactivateAssocs" engine="java"
            location="org.apache.ofbiz.content.content.ContentServices" invoke="deactivateAssocs" auth="true">
        <description>Supply thruDate to all ContentAssoc that come "before" current one</description>
        <attribute mode="IN" name="contentIdTo" optional="false" type="String">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentIdTo"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="mapKey" optional="true" type="String"/>
        <attribute mode="IN" name="activeContentId" optional="true" type="String"/>
        <attribute mode="IN" name="contentId" optional="true" type="String"/>
        <attribute mode="IN" name="contentAssocTypeId" optional="false" type="String">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentAssocTypeId"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="fromDate" optional="true" type="Timestamp"/>
        <attribute mode="OUT" name="deactivatedList" optional="false" type="List"/>
    </service>

    <service name="deactivateContentAssoc" engine="java"
        transaction-timeout="7200"
            location="org.apache.ofbiz.content.content.ContentServices" invoke="deactivateContentAssoc" auth="true">
        <description>Set thruDate to now for ContentAssoc entity</description>
        <attribute mode="IN" name="contentIdTo" optional="true" type="String"/>
        <attribute mode="IN" name="contentId" optional="true" type="String"/>
        <attribute mode="IN" name="contentAssocTypeId" optional="true" type="String"/>
        <attribute mode="IN" name="fromDate" optional="true" type="Timestamp"/>
    </service>

    <service name="createArticleContent" engine="simple" transaction-timeout="300" auth="true"
            location="component://content/minilang/content/ContentServices.xml" invoke="createArticleContent">
        <description>Creates content records for a blog entry</description>
        <required-permissions join-type="AND">
            <check-permission permission="CONTENTMGR" action="_CREATE"/>
        </required-permissions>
        <implements service="createContentFromUploadedFile" optional="true"/>
        <implements service="createTextContent" optional="true"/>
        <attribute name="contentIdFrom" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentIdFrom"/>
            </type-validate>
        </attribute>
        <attribute name="pubPtContentId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingPubPtContentId"/>
            </type-validate>
        </attribute>
        <attribute name="threadContentId" type="String" mode="IN" optional="true"/>
        <attribute name="summaryData" type="String" mode="IN" optional="true"/>
    </service>
    <!-- SubContent Render Services -->
    <service name="renderSubContentAsText" engine="java"
            location="org.apache.ofbiz.content.content.ContentServices" invoke="renderSubContentAsText" auth="false">
        <description>Get the subcontent and render</description>
        <attribute mode="IN" name="contentId" optional="true" type="String"/>
        <attribute mode="IN" name="mapKey" optional="true" type="String"/>
        <attribute mode="IN" name="outWriter" optional="false" type="java.io.Writer">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingOutWriter"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="subContentId" optional="true" type="String"/>
        <attribute mode="IN" name="templateContext" optional="false" type="Map">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingTemplateContext"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="locale" optional="true" type="String"/>
        <attribute mode="IN" name="mimeTypeId" optional="true" type="String"/>
        <attribute mode="IN" name="fromDate" optional="true" type="Timestamp"/>
        <attribute mode="IN" name="subContentDataResourceView" optional="true" type="org.apache.ofbiz.entity.GenericValue"/>
        <attribute mode="OUT" name="view" optional="true" type="org.apache.ofbiz.entity.GenericValue"/>
        <attribute mode="OUT" name="textData" optional="true" type="String"/>
    </service>
    <service name="renderContentAsText" engine="java"
            location="org.apache.ofbiz.content.content.ContentServices" invoke="renderContentAsText" auth="false">
        <description>Get the subcontent and render</description>
        <attribute mode="IN" name="contentId" optional="true" type="String"/>
        <attribute mode="IN" name="outWriter" optional="true" type="java.io.Writer"/>
        <attribute mode="IN" name="templateContext" optional="true" type="Map"/>
        <attribute mode="IN" name="locale" optional="true" type="String"/>
        <attribute mode="IN" name="mimeTypeId" optional="true" type="String"/>
        <attribute mode="IN" name="subContentDataResourceView" optional="true" type="org.apache.ofbiz.entity.GenericValue"/>
        <attribute mode="OUT" name="textData" optional="true" type="String"/>
    </service>
    <service name="renderDataResourceAsText" engine="java"
            location="org.apache.ofbiz.content.data.DataServices" invoke="renderDataResourceAsText" auth="false">
        <description>Get the dataResource and render</description>
        <attribute mode="IN" name="dataResourceId" optional="false" type="String">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingDataResourceId"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="outWriter" optional="false" type="java.io.Writer">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingOutWriter"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="templateContext" optional="false" type="Map">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingTemplateContext"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="locale" optional="true" type="String"/>
        <attribute mode="IN" name="mimeTypeId" optional="true" type="String"/>
        <attribute mode="IN" name="subContentDataResourceView" optional="true" type="org.apache.ofbiz.entity.GenericValue"/>
        <attribute mode="OUT" name="textData" optional="true" type="String"/>
    </service>
    <service name="createTopic"
        auth="true" engine="simple" invoke="createTopic"
        location="component://content/minilang/content/ContentServices.xml" >
        <description>Create a TOPIC type Content </description>
        <attribute mode="IN" name="newTopicId" optional="false" type="String">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingNewTopicId"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="newTopicDescription" optional="true" type="String"/>
    </service>

    <service name="updateSiteRoles" auth="true" engine="java"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="updateSiteRoles">
        <description>Update site roles</description>
        <attribute mode="IN" name="partyId" optional="true" type="String"/>
        <attribute mode="IN" name="contentId" optional="true" type="String"/>
        <attribute mode="IN" name="blogUser" optional="true" type="String"/>
        <attribute mode="IN" name="blogAuthor" optional="true" type="String"/>
        <attribute mode="IN" name="blogEditor" optional="true" type="String"/>
        <attribute mode="IN" name="blogAdmin" optional="true" type="String"/>
        <attribute mode="IN" name="blogPublisher" optional="true" type="String"/>
        <attribute mode="IN" name="blogUserFromDate" optional="true" type="Timestamp"/>
        <attribute mode="IN" name="blogAuthorFromDate" optional="true" type="Timestamp"/>
        <attribute mode="IN" name="blogEditorFromDate" optional="true" type="Timestamp"/>
        <attribute mode="IN" name="blogAdminFromDate" optional="true" type="Timestamp"/>
        <attribute mode="IN" name="blogPublisherFromDate" optional="true" type="Timestamp"/>
    </service>

    <service name="linkContentToPubPt" engine="java"
            location="org.apache.ofbiz.content.content.ContentServices" invoke="linkContentToPubPt" auth="true" >
    <description>Attach content to publish point</description>
        <attribute mode="IN" name="contentId" optional="false" type="String">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="contentIdTo" optional="false" type="String">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentIdTo"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="publish" optional="true" type="String"/>
        <attribute mode="IN" name="statusId" optional="true" type="String"/>
        <attribute mode="IN" name="privilegeEnumId" optional="true" type="String"/>
        <attribute mode="IN" name="contentAssocTypeId" optional="true" type="String"/>
        <attribute mode="IN" name="mapKey" optional="true" type="String"/>
    </service>

    <service name="updateSiteRolesDyn" auth="true" engine="java" validate="false"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="updateSiteRolesDyn">
        <description>Update site roles</description>
        <attribute mode="IN" name="partyId" optional="true" type="String"/>
        <attribute mode="IN" name="contentId" optional="true" type="String"/>
    </service>

    <service name="updateOrRemove" engine="java"
        location="org.apache.ofbiz.content.ContentManagementServices" invoke="updateOrRemove" auth="true" validate="false">
        <description>Update or remove a child entity based on value of "action"</description>
        <attribute name="entityName" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingEntityName"/>
            </type-validate>
        </attribute>
        <attribute name="action" type="String" mode="IN" optional="true"/>
        <attribute name="pkFieldCount" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingPkFieldCount"/>
            </type-validate>
        </attribute>
        <attribute name="fieldName0" type="String" mode="IN" optional="true"/>
        <attribute name="fieldValue1" type="String" mode="IN" optional="true"/>
        <attribute name="fieldName2" type="String" mode="IN" optional="true"/>
        <attribute name="fieldValue2" type="String" mode="IN" optional="true"/>
        <attribute name="fieldName3" type="String" mode="IN" optional="true"/>
        <attribute name="fieldValue3" type="String" mode="IN" optional="true"/>
        <attribute name="fieldName1" type="String" mode="IN" optional="true"/>
        <attribute name="fieldValue0" type="String" mode="IN" optional="true"/>
    </service>

    <service name="resequence" auth="true" engine="java" validate="true" transaction-timeout="7200"
        location="org.apache.ofbiz.content.ContentManagementServices" invoke="resequence">
        <description>Reorder sequence numbers in ContentAssoc entities for a given parent id</description>
        <attribute mode="IN" name="contentIdTo" optional="false" type="String">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentIdTo"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="seqInc" optional="true" type="Integer"/>
        <attribute mode="IN" name="typeList" optional="true" type="List"/>
        <attribute mode="IN" name="contentId" optional="true" type="String"/>
        <attribute mode="IN" name="contentAssocTypeId" optional="true" type="String"/>
        <attribute mode="IN" name="dir" optional="true" type="String"/>
    </service>
    <service name="changeLeafToNode" validate="true" auth="true" engine="java" transaction-timeout="7200"
        location="org.apache.ofbiz.content.ContentManagementServices" invoke="changeLeafToNode">
        <description>Moves dataResource to separate content associated with current content so that node can have only children, no content of its own</description>
        <attribute mode="IN" name="contentId" optional="false" type="String">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="userLogin" optional="true" type="org.apache.ofbiz.entity.GenericValue"/>
    </service>

    <service name="updatePageType" auth="true" engine="java" validate="true" transaction-timeout="7200"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="updatePageType">
        <description>Change contentTypeId to OUTLINE/PAGE/SUBPAGE_NODE</description>
        <attribute mode="IN" name="contentId" optional="false" type="String">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="pageMode" optional="true" type="String"/>
    </service>

    <service name="resetToOutlineMode" auth="true" engine="java" validate="true" transaction-timeout="7200"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="resetToOutlineMode">
        <description>Set content and kids to OUTLINE_NODE</description>
        <attribute mode="IN" name="contentId" optional="false" type="String">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="pageMode" optional="true" type="String"/>
    </service>

    <service name="clearContentAssocViewCache" auth="true" engine="java" validate="true" transaction-timeout="7200"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="clearContentAssocViewCache">
        <description>Clear cache</description>
    </service>

    <service name="clearContentAssocDataResourceViewCache" auth="true" engine="java" validate="true" transaction-timeout="7200"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="clearContentAssocDataResourceViewCache">
        <description>Clear cache</description>
    </service>


    <service name="findSubNodes" auth="false" engine="java" validate="true" transaction-timeout="7200"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="findSubNodes">
        <description>Get children of content</description>
        <attribute mode="IN" name="contentId" optional="false" type="String">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute mode="OUT" name="_LIST_" optional="true" type="List"/>
    </service>

    <service name="initContentChildCounts" engine="java"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="initContentChildCounts">
        <description>Set childLeafCount and childBranchCount to appropriate values</description>
        <attribute name="content" type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContent"/>
            </type-validate>
        </attribute>
    </service>

    <service name="incrementContentChildStats" engine="java"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="incrementContentChildStats">
        <description>Set childLeafCount and childBranchCount in parent Content entities</description>
        <attribute name="contentId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute name="contentAssocTypeId" type="String" mode="IN" optional="true"/>
    </service>

    <service name="decrementContentChildStats" engine="java"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="decrementContentChildStats">
        <description>Set childLeafCount and childBranchCount in parent Content entities</description>
        <attribute name="contentId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute name="contentAssocTypeId" type="String" mode="IN" optional="true"/>
    </service>

    <service name="updateContentChildStats" engine="java" transaction-timeout="7200"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="updateContentChildStats">
        <description>Set childLeafCount and childBranchCount in passed id and those below</description>
        <attribute name="contentId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentIdTo"/>
            </type-validate>
        </attribute>
        <attribute name="contentAssocTypeId" type="String" mode="IN" optional="true"/>
    </service>

    <service name="updateImage" engine="java" transaction-timeout="7200"
            location="org.apache.ofbiz.content.data.DataServices" invoke="updateImage">
        <description>Update image</description>
        <attribute name="dataResourceId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingDataResourceId"/>
            </type-validate>
        </attribute>
        <attribute name="imageData" type="java.nio.ByteBuffer" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingImageData"/>
            </type-validate>
        </attribute>
    </service>

    <service name="createImage" engine="java" transaction-timeout="7200"
            location="org.apache.ofbiz.content.data.DataServices" invoke="createImage">
        <description>Create image</description>
        <attribute name="dataResourceId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingDataResourceId"/>
            </type-validate>
        </attribute>
        <attribute name="imageData" type="java.nio.ByteBuffer" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingImageData"/>
            </type-validate>
        </attribute>
    </service>

    <service name="updateContentSubscription" engine="java" transaction-timeout="7200" auth="true"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="updateContentSubscription">
        <description>Creates or updates ContentRole</description>
        <attribute name="partyId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingPartyId"/>
            </type-validate>
        </attribute>
        <attribute name="contentId" type="String" mode="IN" optional="true"/>
        <attribute name="useRoleTypeId" type="String" mode="IN" optional="true"/>
        <attribute name="useTimeUomId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingUseTimeUomId"/>
            </type-validate>
        </attribute>
        <attribute name="useTime" type="Integer" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingUseTime"/>
            </type-validate>
        </attribute>
    </service>
    <service name="updateContentSubscriptionByProduct" engine="java" transaction-timeout="7200" auth="true"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="updateContentSubscriptionByProduct">
        <description>Creates or updates ContentRole</description>
        <attribute name="partyId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingPartyId"/>
            </type-validate>
        </attribute>
        <attribute name="productId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingProductId"/>
            </type-validate>
        </attribute>
        <attribute name="orderCreatedDate" type="Timestamp" mode="IN" optional="true"/>
        <attribute name="quantity" type="Integer" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingQuantity"/>
            </type-validate>
        </attribute>
    </service>
    <service name="updateContentSubscriptionByOrder" engine="java" transaction-timeout="7200" auth="true"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="updateContentSubscriptionByOrder">
        <description>Creates or updates ContentRole</description>
        <attribute name="orderId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingOrderId"/>
            </type-validate>
        </attribute>
    </service>
    <service name="followNodeChildren" auth="true" engine="java" transaction-timeout="7200"
            location="org.apache.ofbiz.content.ContentManagementServices" invoke="followNodeChildren">
        <description>Descend thru content tree and execute service at each node</description>
        <attribute name="contentId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute name="serviceName" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingServiceName"/>
            </type-validate>
        </attribute>
        <attribute name="contentAssocTypeId" type="String" mode="IN" optional="true"/>
    </service>
    <service name="publishContent" auth="true" engine="java" transaction-timeout="7200"
            location="org.apache.ofbiz.content.content.ContentServices" invoke="publishContent">
        <description>Change statusId to published (CTNT_PUBLISHED)</description>
        <attribute mode="IN" name="content" optional="false" type="org.apache.ofbiz.entity.GenericValue">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContent"/>
            </type-validate>
        </attribute>
    </service>

    <!-- these three services are for use in screen widget files -->
    <service name="getPrefixedMembers" auth="false" engine="java" transaction-timeout="7200"
            location="org.apache.ofbiz.content.content.ContentServices" invoke="getPrefixedMembers">
        <description>Gets all the members of the input map that start with the prefix</description>
        <attribute mode="IN" name="mapIn" optional="true" type="java.util.Map"/>
        <attribute name="prefix" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingPrefix"/>
            </type-validate>
        </attribute>
        <attribute mode="OUT" name="mapOut" optional="true" type="java.util.Map"/>
    </service>
    <service name="splitString" auth="false" engine="java" transaction-timeout="7200"
            location="org.apache.ofbiz.content.content.ContentServices" invoke="splitString">
        <description>Splits input string </description>
        <attribute name="inputString" type="String" mode="IN" optional="true"/>
        <attribute name="delimiter" type="String" mode="IN" optional="true"/>
        <attribute mode="OUT" name="outputList" optional="true" type="java.util.List"/>
    </service>
    <service name="joinString" auth="false" engine="java" transaction-timeout="7200"
            location="org.apache.ofbiz.content.content.ContentServices" invoke="joinString">
        <description>Splits input string </description>
        <attribute name="inputList" type="java.util.List" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingInputList"/>
            </type-validate>
        </attribute>
        <attribute name="delimiter" type="String" mode="IN" optional="true"/>
        <attribute mode="OUT" name="outputString" optional="true" type="String"/>
    </service>
    <service name="urlEncodeArgs" auth="false" engine="java" transaction-timeout="7200"
            location="org.apache.ofbiz.content.content.ContentServices" invoke="urlEncodeArgs">
        <description>URL encodes map</description>
        <attribute name="mapIn" type="java.util.Map" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingMapIn"/>
            </type-validate>
        </attribute>
        <attribute mode="OUT" name="outputString" optional="true" type="String"/>
    </service>

    <!-- ================ CompDoc Requests ================= -->
    <service name="persistContentRevisionAndItem" engine="simple"
        location="component://content/minilang/compdoc/CompDocServices.xml"
        invoke="persistContentRevisionAndItem" auth="true">
        <description>Update a ContentRevision and ContentRevisionItem</description>
        <auto-attributes entity-name="ContentRevision" include="all" mode="IN" optional="true">
            <exclude field-name="contentRevisionSeqId"/>
        </auto-attributes>
        <auto-attributes entity-name="ContentRevisionItem" include="all" mode="IN" optional="true">
            <exclude field-name="contentRevisionSeqId"/>
        </auto-attributes>
        <attribute name="contentRevisionSeqId" type="String" mode="OUT" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentRevisionSeqId"/>
            </type-validate>
        </attribute>
    </service>

    <service name="prepForApproval" engine="simple"
        location="component://content/minilang/compdoc/CompDocServices.xml"
        invoke="prepForApproval" auth="true">
        <description>Set ContentApprovals for approval process</description>
        <permission-service service-name="contentManagerPermission" main-action="CREATE"/>
        <attribute name="rootContentId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingRootContentId"/>
            </type-validate>
        </attribute>
        <attribute name="rootContentRevisionSeqId" type="String" mode="OUT" optional="false"/>
    </service>

    <service name="getFinalApprovalStatus" engine="simple"
        location="component://content/minilang/compdoc/CompDocServices.xml"
        invoke="getFinalApprovalStatus" auth="true">
        <description>Set ContentApprovals for approval process</description>
        <attribute name="contentId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute name="contentRevisionSeqId" type="String" mode="INOUT" optional="true"/>
        <attribute name="approvalStatusId" type="String" mode="OUT" optional="true"/>
        <attribute name="contentApprovalList" type="List" mode="OUT" optional="true"/>
    </service>

    <service name="getApprovalsWithPermissions" engine="simple"
        location="component://content/minilang/compdoc/CompDocServices.xml"
        invoke="getApprovalsWithPermissions" auth="true" >
        <description>Get a list of ContentApprovals and permission indicators</description>
        <attribute name="rootContentId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingRootContentId"/>
            </type-validate>
        </attribute>
        <attribute name="contentRevisionSeqId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentRevisionSeqId"/>
            </type-validate>
        </attribute>
        <attribute name="userLogin" type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingUserLogin"/>
            </type-validate>
        </attribute>
        <attribute name="checkPermission" type="String" mode="IN" optional="true"/>
        <attribute name="contentApprovalList" type="List" mode="OUT" optional="true"/>
    </service>

    <service name="hasApprovalPermission" engine="simple"
        location="component://content/minilang/compdoc/CompDocServices.xml"
        invoke="hasApprovalPermission" auth="true">
        <description>Determine permission status for record</description>
        <attribute name="contentApprovalId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentApprovalId"/>
            </type-validate>
        </attribute>
        <attribute name="userLogin" type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingUserLogin"/>
            </type-validate>
        </attribute>
        <attribute name="approvalPermExists" type="String" mode="OUT" optional="true"/>
    </service>

    <service name="genCompDocInstance" engine="simple"
        location="component://content/minilang/compdoc/CompDocServices.xml"
        invoke="genCompDocInstance" auth="true">
        <description>Generate parallel CompDoc Instance tree</description>
        <attribute name="contentName" type="String" mode="IN" optional="true"/>
        <attribute name="instanceOfContentId" type="String" mode="IN" optional="true"/>
        <attribute name="rootInstanceContentId" type="String" mode="IN" optional="true"/>
        <attribute name="contentId" type="String" mode="OUT" optional="true"/>
        <attribute name="contentRevisionSeqId" type="String" mode="OUT" optional="false"/>
    </service>

    <service name="persistCompDoc" engine="simple"
        location="component://content/minilang/compdoc/CompDocServices.xml"
        invoke="persistCompDoc" auth="true">
        <description>Create a CompDoc Template entity and associated ContentRevision/Item entities</description>
        <implements service="persistContentAndAssoc"/>
        <attribute name="contentRevisionSeqId" type="String" mode="OUT" optional="false"/>
        <attribute name="rootContentId" type="String" mode="IN" optional="true"/>
    </service>

    <service name="cloneTemplateContentApprovals" engine="simple"
        location="component://content/minilang/compdoc/CompDocServices.xml"
        invoke="cloneTemplateContentApprovals" auth="true">
        <description>Bump the previous ContentApproval approvals up to current CDT</description>
        <attribute name="contentRevisionSeqId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentRevisionSeqId"/>
            </type-validate>
        </attribute>
        <attribute name="contentId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
    </service>

    <service name="cloneInstanceContentApprovals" engine="simple"
        location="component://content/minilang/compdoc/CompDocServices.xml"
        invoke="cloneInstanceContentApprovals" auth="true">
        <description>Bump the previous ContentApproval approvals up to current CDI</description>
        <attribute name="contentRevisionSeqId" type="String" mode="IN" optional="true"/>
        <attribute name="contentId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
    </service>

    <service name="checkForWaitingApprovals" engine="simple"
        location="component://content/minilang/compdoc/CompDocServices.xml"
        invoke="checkForWaitingApprovals" auth="true">
        <description>Check to see if there are any ContentApproval records awaiting this user's action</description>
        <attribute name="thisUserLogin" type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="true"/>
        <attribute name="contentApprovalList" type="List" mode="OUT" optional="true"/>
    </service>

    <service name="getMostRecentRevision" engine="simple"
        location="component://content/minilang/compdoc/CompDocServices.xml"
        invoke="getMostRecentRevision" auth="true">
        <description>Look for most recent revision for contentId</description>
        <attribute name="contentId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute name="mostRecentRevisionSeqId" type="String" mode="OUT" optional="true"/>
    </service>

    <!-- CompDoc Rendering Services  -->
    <service name="renderCompDocPdf" engine="java"
        location="org.apache.ofbiz.content.compdoc.CompDocServices"
        invoke="renderCompDocPdf" auth="true">
        <description>Convert all the CompDoc parts into PDF and concatenate and put in CMS</description>
        <attribute name="contentId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute name="contentRevisionSeqId" type="String" mode="IN" optional="true"/>
        <attribute name="webSiteId" type="String" mode="IN" optional="true"/>
        <attribute name="https" type="String" mode="IN" optional="true"/>
        <attribute name="rootDir" type="String" mode="IN" optional="true"/>
        <attribute name="locale" type="java.util.Locale" mode="IN" optional="true"/>
        <attribute name="outByteBuffer" type="java.nio.ByteBuffer" mode="OUT" optional="false"/>
    </service>
    <service name="renderContentPdf" engine="java"
        location="org.apache.ofbiz.content.compdoc.CompDocServices"
        invoke="renderContentPdf" auth="true">
        <description>Convert all the CompDoc parts into PDF and concatenate and put in CMS</description>
        <attribute name="contentId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute name="contentRevisionSeqId" type="String" mode="IN" optional="true"/>
        <attribute name="webSiteId" type="String" mode="IN" optional="true"/>
        <attribute name="https" type="String" mode="IN" optional="true"/>
        <attribute name="rootDir" type="String" mode="IN" optional="true"/>
        <attribute name="locale" type="java.util.Locale" mode="IN" optional="true"/>
        <attribute name="outByteBuffer" type="java.nio.ByteBuffer" mode="OUT" optional="false"/>
    </service>

    <!-- blog services -->
    <service name="createBlogEntry" engine="simple" auth="true"
        location="component://content/minilang/blog/BlogServices.xml" invoke="createBlogEntry">
        <description>Creates content records for a blog entry</description>
        <required-permissions join-type="AND">
            <check-permission permission="CONTENTMGR" action="_CREATE"/>
        </required-permissions>
        <implements service="uploadFileInterface" optional="true"/>
        <attribute name="blogContentId" type="String" mode="INOUT" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingBlogContentId"/>
            </type-validate>
        </attribute>
        <attribute name="contentId" type="String" mode="OUT" optional="false"/>
        <attribute name="contentName" type="String" mode="IN" optional="true"/>
        <attribute name="statusId" type="String" mode="IN" optional="true"/>
        <attribute name="description" type="String" mode="IN" optional="true"/>
        <attribute name="templateDataResourceId" type="String" mode="IN" optional="true"/>
        <attribute name="articleData" type="String" mode="IN" optional="true" allow-html="safe"/>
        <attribute name="summaryData" type="String" mode="IN" optional="true" allow-html="safe"/>
    </service>
    <service name="updateBlogEntry" engine="simple" auth="true"
        location="component://content/minilang/blog/BlogServices.xml" invoke="updateBlogEntry">
        <description>Updates content records for a blog entry</description>
        <required-permissions join-type="AND">
            <check-permission permission="CONTENTMGR" action="_UPDATE"/>
        </required-permissions>
        <implements service="uploadFileInterface" optional="true"/>
        <attribute name="blogContentId" type="String" mode="INOUT" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingBlogContentId"/>
            </type-validate>
        </attribute>
        <attribute name="contentId" type="String" mode="INOUT" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute name="contentName" type="String" mode="IN" optional="true"/>
        <attribute name="statusId" type="String" mode="IN" optional="true"/>
        <attribute name="description" type="String" mode="IN" optional="true"/>
        <attribute name="templateDataResourceId" type="String" mode="IN" optional="true"/>
        <attribute name="articleData" type="String" mode="IN" optional="true" allow-html="safe"/>
        <attribute name="summaryData" type="String" mode="IN" optional="true" allow-html="safe"/>
    </service>
    <service name="getBlogEntry" engine="simple" auth="true"
        location="component://content/minilang/blog/BlogServices.xml" invoke="getBlogEntry">
        <description>Retrieves content records for a blog entry</description>
        <attribute name="blogContentId" type="String" mode="INOUT" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingBlogContentId"/>
            </type-validate>
        </attribute>
        <attribute name="contentId" type="String" mode="INOUT" optional="true"/><!-- also used for new entries, will return with no error with empty contentId -->
        <attribute name="contentName" type="String" mode="OUT" optional="true"/>
        <attribute name="statusId" type="String" mode="OUT" optional="true"/>
        <attribute name="description" type="String" mode="OUT" optional="true"/>
        <attribute name="templateDataResourceId" type="String" mode="OUT" optional="true"/>
        <attribute name="summaryData" type="String" mode="OUT" optional="true"/>
        <attribute name="articleData" type="String" mode="OUT" optional="true"/>
        <attribute name="imageContentId" type="String" mode="OUT" optional="true"/>
        <attribute name="articleContentId" type="String" mode="OUT" optional="true"/>
        <attribute name="summaryContentId" type="String" mode="OUT" optional="true"/>
    </service>
    <service name="getOwnedOrPublishedBlogEntries" engine="simple" location="component://content/minilang/blog/BlogServices.xml" invoke="getOwnedOrPublishedBlogEntries"
         auth="true"  transaction-timeout="7200">
        <attribute type="String" mode="IN" name="contentId" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingContentId"/>
            </type-validate>
        </attribute>
        <attribute mode="IN" name="userLogin" optional="false" type="org.apache.ofbiz.entity.GenericValue">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingUserLogin"/>
            </type-validate>
        </attribute>
        <attribute mode="OUT" name="blogList" optional="true" type="List"/>
    </service>

    <!-- blog RSS services -->
    <service name="generateBlogRssFeed" engine="java" auth="false"
            location="org.apache.ofbiz.content.blog.BlogRssServices" invoke="generateBlogRssFeed">
        <description>Blog RSS Feed</description>
        <implements service="rssFeedInterface"/>
        <attribute name="blogContentId" type="String" mode="IN" optional="false">
            <type-validate>
                <fail-property resource="ContentErrorUiLabels" property="ContentRequiredFieldMissingBlogContentId"/>
            </type-validate>
        </attribute>
    </service>

    <!-- content permission services -->
    <service name="contentManagerRolePermission" engine="simple" auth="true"
            location="component://content/minilang/permission/ContentPermissionServices.xml" invoke="contentManagerRolePermission">
        <implements service="permissionInterface"/>
    </service>
    <service name="contentManagerPermission" engine="simple" auth="true"
            location="component://content/minilang/permission/ContentPermissionServices.xml" invoke="contentManagerPermission">
        <implements service="permissionInterface"/>
    </service>
    <service name="genericContentPermission" engine="simple" auth="true"
            location="component://content/minilang/permission/ContentPermissionServices.xml" invoke="genericContentPermission">
        <description>Generic Content Permission Service; Takes mainAction to determine the mode.</description>
        <implements service="permissionInterface"/>
        <attribute name="ownerContentId" type="String" mode="IN" optional="true"/>
        <attribute name="contentIdFrom" type="String" mode="IN" optional="true"/>
        <attribute name="contentIdTo" type="String" mode="IN" optional="true"/>
        <attribute name="contentId" type="String" mode="IN" optional="true"/>
        <attribute name="statusId" type="String" mode="IN" optional="true"/>
        <attribute name="contentPurposeTypeId" type="String" mode="IN" optional="true"/>
        <attribute name="contentOperationId" type="String" mode="IN" optional="true"/>
    </service>
    <service name="genericDataResourcePermission" engine="simple" auth="true"
            location="component://content/minilang/permission/DataResourcePermissionServices.xml" invoke="genericDataResourcePermission">
        <description>Generic DataResource Permission Service; Takes mainAction to determine the mode.</description>
        <implements service="permissionInterface"/>
        <attribute name="dataResourceId" type="String" mode="IN" optional="true"/>
    </service>

    <service name="createContentAlternativeUrl" engine="simple"
            location="component://content/minilang/content/ContentServices.xml" invoke="createContentAlternativeUrl" auth="true" transaction-timeout="7200">
        <description>Create Content Alternative URL</description>
        <attribute name="contentId" mode="IN" type="String" optional="true"></attribute>
        <attribute name="contentCreated" mode="OUT" type="String" optional="true"></attribute>
    </service>

    <service name="createWebPreferenceType" engine="entity-auto" default-entity-name="WebPreferenceType" auth="true" invoke="create">
        <description>Create WebPreferenceType record</description>
        <auto-attributes include="pk" mode="INOUT" optional="true"/>
        <auto-attributes include="nonpk" mode="IN" optional="true"/>
    </service>
    <service name="updateWebPreferenceType" engine="entity-auto" default-entity-name="WebPreferenceType" auth="true" invoke="update">
        <description>Update WebPreferenceType record</description>
        <auto-attributes include="pk" mode="IN"/>
        <auto-attributes include="nonpk" mode="IN" optional="true"/>
    </service>
    <service name="deleteWebPreferenceType" engine="entity-auto" default-entity-name="WebPreferenceType" auth="true" invoke="delete">
        <description>Delete ContentApproval record</description>
        <auto-attributes include="pk" mode="IN"/>
    </service>
</services>
