ilscipio/scipio-erp

View on GitHub
applications/content/servicedef/services.xml

Summary

Maintainability
Test Coverage
<?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="http://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/script/org/ofbiz/content/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="getSubContentWithPermCheck" engine="simple"  auth="true"
            location="component://content/script/org/ofbiz/content/content/ContentServices.xml" invoke="getSubContentWithPermCheck">
        <description>Get Content and resource information</description>
        <permission-service service-name="genericContentPermission" main-action="VIEW"/>
        <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="true" type="String"/>
        <attribute mode="IN" name="mapKey" optional="true" type="String"/>
        <attribute mode="IN" name="mainAction" optional="true" type="String"/>
        <attribute mode="IN" name="contentOperationId" optional="true" type="String"/>
        <attribute mode="IN" name="useCache" optional="true" type="Boolean"/>
        <attribute mode="IN" name="filterByDate" optional="true" type="Boolean"/>
        <attribute mode="OUT" name="subContentList" optional="true" type="java.util.List"/>
    </service>

    <service name="getSubSubContentWithPermCheck" engine="simple"  auth="true"
            location="component://content/script/org/ofbiz/content/content/ContentServices.xml" invoke="getSubSubContentWithPermCheck">
        <description>Get Content associated with Content</description>
        <implements service="getSubContentWithPermCheck"/>
        <attribute mode="IN" name="subContentAssocTypeId" optional="true" type="String"/>
        <attribute mode="IN" name="subMapKey" optional="true" type="String"/>
        <attribute mode="OUT" name="subSubContentList" optional="true" type="java.util.List"/>
    </service>

    <service name="getContentAndDataResource" engine="simple" default-entity-name="Content" auth="true"
            location="component://content/script/org/ofbiz/content/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/script/org/ofbiz/content/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="simple" default-entity-name="DataCategory" auth="true"
            location="component://content/script/org/ofbiz/content/data/DataServices.xml" invoke="updateDataCategory">
        <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="simple" default-entity-name="DataCategory" auth="true"
            location="component://content/script/org/ofbiz/content/data/DataServices.xml" invoke="removeDataCategory">
        <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="simple" default-entity-name="DataResourceAttribute" auth="true"
            location="component://content/script/org/ofbiz/content/data/DataServices.xml" invoke="createDataResourceAttribute">
        <description>Create a DataResourceAttribute</description>
        <permission-service service-name="genericDataResourcePermission" main-action="CREATE"/>
        <auto-attributes include="pk" mode="IN" optional="true"/>
        <auto-attributes include="nonpk" mode="IN" optional="true"/>
    </service>
    <service name="updateDataResourceAttribute" engine="simple" default-entity-name="DataResourceAttribute" auth="true"
            location="component://content/script/org/ofbiz/content/data/DataServices.xml" invoke="updateDataResourceAttribute">
        <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="simple" default-entity-name="DataResourceAttribute" auth="true"
            location="component://content/script/org/ofbiz/content/data/DataServices.xml" invoke="removeDataResourceAttribute">
        <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="simple" default-entity-name="DataResourceRole" auth="true"
            location="component://content/script/org/ofbiz/content/data/DataServices.xml" invoke="createDataResourceRole">
        <description>Create a DataResourceRole</description>
        <permission-service service-name="genericDataResourcePermission" main-action="CREATE"/>
        <auto-attributes include="pk" mode="IN" optional="true"/>
        <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="simple" default-entity-name="DataResourceRole" auth="true"
            location="component://content/script/org/ofbiz/content/data/DataServices.xml" invoke="updateDataResourceRole">
        <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="simple" default-entity-name="DataResourceRole" auth="true"
            location="component://content/script/org/ofbiz/content/data/DataServices.xml" invoke="removeDataResourceRole">
        <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/script/org/ofbiz/content/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/script/org/ofbiz/content/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/script/org/ofbiz/content/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/script/org/ofbiz/content/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/script/org/ofbiz/content/content/ContentServices.xml" invoke="createSimpleTextContent">
        <permission-service service-name="contentManagerPermission" main-action="CREATE"/>
        <auto-attributes mode="IN" entity-name="Content" optional="true"/>
        <auto-attributes mode="IN" entity-name="DataResource" prefix="dr" optional="true"/><!-- SCIPIO: 3.0.0: Added -->
        <attribute name="text" type="String" mode="IN" optional="false" allow-html="any">
            <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/script/org/ofbiz/content/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="any"/>
    </service>

    <!-- Util -->
    <service name="findAssocContent" engine="simple"
            location="component://content/script/org/ofbiz/content/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/script/org/ofbiz/content/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.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.ofbiz.entity.GenericValue"/>
    </service>

    <service name="getAssocAndContentAndDataResource" default-entity-name="ContentAssocDataResourceViewFrom"
            engine="java" location="org.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.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.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.ofbiz.entity.GenericValue"/>
    </service>
    <service name="getSubContent" engine="java" location="org.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.ofbiz.entity.GenericValue"/>
        <attribute mode="OUT" name="content" optional="true" type="org.ofbiz.entity.GenericValue"/>
    </service>

    <service name="persistContentAndAssoc" engine="java" transaction-timeout="7200"
            location="org.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.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="any"/>
    </service>

    <service name="persistDataResourceAndData" engine="java"
        transaction-timeout="7200"
            location="org.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.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/script/org/ofbiz/content/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/script/org/ofbiz/content/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.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.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.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.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/script/org/ofbiz/content/content/ContentServices.xml" invoke="createArticleContent">
        <description>Creates content records for a blog entry</description>
        <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.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.ofbiz.entity.GenericValue"/>
        <attribute mode="OUT" name="view" optional="true" type="org.ofbiz.entity.GenericValue"/>
        <attribute mode="OUT" name="textData" optional="true" type="String"/>
    </service>
    <service name="renderContentAsText" engine="java"
            location="org.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.ofbiz.entity.GenericValue"/>
        <attribute mode="OUT" name="textData" optional="true" type="String"/>
    </service>
    <service name="renderDataResourceAsText" engine="java"
            location="org.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.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/script/org/ofbiz/content/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.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.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.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.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.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.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.ofbiz.entity.GenericValue"/>
    </service>

    <service name="updatePageType" auth="true" engine="java" validate="true" transaction-timeout="7200"
            location="org.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.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.ofbiz.content.ContentManagementServices" invoke="clearContentAssocViewCache">
        <description>Clear cache</description>
    </service>

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


    <service name="findSubNodes" auth="false" engine="java" validate="true" transaction-timeout="7200"
            location="org.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.ofbiz.content.ContentManagementServices" invoke="initContentChildCounts">
        <description>Set childLeafCount and childBranchCount to appropriate values</description>
        <attribute name="content" type="org.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.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.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.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.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.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.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.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.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.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.ofbiz.content.content.ContentServices" invoke="publishContent">
        <description>Change statusId to published (CTNT_PUBLISHED)</description>
        <attribute mode="IN" name="content" optional="false" type="org.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.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.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.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.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/script/org/ofbiz/content/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/script/org/ofbiz/content/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/script/org/ofbiz/content/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/script/org/ofbiz/content/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.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/script/org/ofbiz/content/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.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/script/org/ofbiz/content/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/script/org/ofbiz/content/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/script/org/ofbiz/content/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/script/org/ofbiz/content/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/script/org/ofbiz/content/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.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/script/org/ofbiz/content/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>

    <!-- Open Office Services -->
    <service name="convertDocumentByteBuffer" auth="false" engine="java" transaction-timeout="7200"
        location="org.ofbiz.content.openoffice.OpenOfficeServices" invoke="convertDocumentByteBuffer">
        <description>Use OpenOffice to convert between document types</description>
        <attribute name="oooHost" type="String" mode="IN" optional="true"/>
        <attribute name="oooPort" type="String" mode="IN" optional="true"/>
        <attribute name="inputMimeType" type="String" mode="IN" optional="true"/>
        <attribute name="outputMimeType" type="String" mode="IN" optional="true"/>
        <attribute name="inByteBuffer" type="java.nio.ByteBuffer" mode="IN" optional="false"/>
        <attribute name="outByteBuffer" type="java.nio.ByteBuffer" mode="OUT" optional="false"/>
    </service>
    <service name="convertDocument" auth="false" engine="java" transaction-timeout="7200"
            location="org.ofbiz.content.openoffice.OpenOfficeServices" invoke="convertDocument">
        <description>Use OpenOffice to convert between document types</description>
        <attribute name="oooHost" type="String" mode="IN" optional="true"/>
        <attribute name="oooPort" type="String" mode="IN" optional="true"/>
        <attribute name="filenameFrom" type="String" mode="IN" optional="false"/>
        <attribute name="filenameTo" type="String" mode="IN" optional="false"/>
        <attribute name="convertFilterName" type="String" mode="IN" optional="true"/>
    </service>
    <service name="convertDocumentFileToFile" auth="false" engine="java" transaction-timeout="7200"
            location="org.ofbiz.content.openoffice.OpenOfficeServices" invoke="convertDocumentFileToFile">
        <description>Use OpenOffice to convert between document types</description>
        <attribute name="oooHost" type="String" mode="IN" optional="true"/>
        <attribute name="oooPort" type="String" mode="IN" optional="true"/>
        <attribute name="filenameFrom" type="String" mode="IN" optional="false"/>
        <attribute name="filenameTo" type="String" mode="IN" optional="false"/>
        <attribute name="inputMimeType" type="String" mode="IN" optional="true"/>
        <attribute name="outputMimeType" type="String" mode="IN" optional="true"/>
    </service>
    <service name="compareDocuments" auth="false" engine="java" transaction-timeout="7200"
            location="org.ofbiz.content.openoffice.OpenOfficeServices" invoke="compareDocuments">
        <description>Use OpenOffice to compare two documents</description>
        <attribute name="oooHost" type="String" mode="IN" optional="true"/>
        <attribute name="oooPort" type="String" mode="IN" optional="true"/>
        <attribute name="filenameFrom" type="String" mode="IN" optional="false"/>
        <attribute name="filenameOriginal" type="String" mode="IN" optional="false"/>
        <attribute name="filenameOut" type="String" mode="IN" optional="false"/>
    </service>

    <!-- CompDoc Rendering Services  -->
    <service name="renderCompDocPdf" engine="java"
        location="org.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.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/script/org/ofbiz/content/blog/BlogServices.xml" invoke="createBlogEntry">
        <description>Creates content records for a blog entry</description>
        <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="none"/>
        <attribute name="summaryData" type="String" mode="IN" optional="true" allow-html="none"/>
    </service>
    <service name="updateBlogEntry" engine="simple" auth="true"
        location="component://content/script/org/ofbiz/content/blog/BlogServices.xml" invoke="updateBlogEntry">
        <description>Updates content records for a blog entry</description>
        <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="none"/>
        <attribute name="summaryData" type="String" mode="IN" optional="true" allow-html="none"/>
    </service>
    <service name="getBlogEntry" engine="simple" auth="true"
        location="component://content/script/org/ofbiz/content/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/script/org/ofbiz/content/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.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.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>

    <!-- eca helper services -->
    <service name="checkContentAssocIds" engine="simple"
            location="component://content/script/org/ofbiz/content/content/ContentServices.xml" invoke="checkContentAssocIds">
        <description>Fixes the ContentAssoc IDs based on passed parameters</description>
        <attribute name="contentIdFrom" type="String" mode="INOUT" optional="true"/>
        <attribute name="contentIdTo" type="String" mode="INOUT" optional="true"/>
        <attribute name="contentId" type="String" mode="INOUT" optional="true"/>
    </service>

    <!-- content permission services -->
    <service name="contentManagerRolePermission" engine="simple" auth="true"
            location="component://content/script/org/ofbiz/content/permission/ContentPermissionServices.xml" invoke="contentManagerRolePermission">
        <implements service="permissionInterface"/>
    </service>
    <service name="contentManagerPermission" engine="simple" auth="true"
            location="component://content/script/org/ofbiz/content/permission/ContentPermissionServices.xml" invoke="contentManagerPermission">
        <implements service="permissionInterface"/>
    </service>
    <service name="genericContentPermission" engine="simple" auth="true"
            location="component://content/script/org/ofbiz/content/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/script/org/ofbiz/content/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/script/org/ofbiz/content/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>

    <!-- SCIPIO: 2017-12-06: MOVED here from component://product/servicedef/services.xml (DEV NOTE: exception; did not belong there at all) -->
    <service name="createSimpleTextContentForAlternateLocale" engine="java" location="org.ofbiz.content.content.LocalizedContentServices$CreateSimpleTextContentForAlternateLocale" invoke="exec">
        <auto-attributes mode="IN" entity-name="Content" optional="true"/>
        <auto-attributes mode="IN" entity-name="DataResource" include="nonpk" optional="true" prefix="dr"/><!-- SCIPIO: 3.0.0: Added -->
        <attribute name="mainContentId" type="String" mode="IN" optional="false"/>
        <attribute name="text" type="String" mode="IN" optional="false" allow-html="any"/>
        <override name="localeString" optional="false"/>
        <override name="contentId" mode="INOUT"/>
    </service>
    <service name="updateSimpleTextContentForAlternateLocale" engine="java" location="org.ofbiz.content.content.LocalizedContentServices$UpdateSimpleTextContentForAlternateLocale" invoke="exec">
        <description>SCIPIO: Updates ALTERNATE_LOCALE simple text content by contentId (added 2017-10-26)</description>
        <auto-attributes mode="IN" entity-name="Content" include="pk" optional="false"/>
        <auto-attributes mode="IN" entity-name="Content" include="nonpk" optional="true"/>
        <attribute name="mainContentId" type="String" mode="IN" optional="false"/>
        <attribute name="text" type="String" mode="IN" optional="false" allow-html="any"/>
        <override name="localeString" optional="false"/>
    </service>
    <service name="deleteSimpleTextContentForAlternateLocale" engine="java" location="org.ofbiz.content.content.LocalizedContentServices$DeleteSimpleTextContentForAlternateLocale" invoke="exec">
        <description>SCIPIO: Deletes ALTERNATE_LOCALE simple text content by contentId (added 2017-10-26)</description>
        <auto-attributes mode="IN" entity-name="Content" include="pk" optional="false"/>
        <attribute name="mainContentId" type="String" mode="IN" optional="false"/>
    </service>
    <service name="createUpdateSimpleTextContentForAlternateLocale" engine="java" location="org.ofbiz.content.content.LocalizedContentServices$CreateUpdateSimpleTextContentForAlternateLocale" invoke="exec">
        <description>SCIPIO: Creates or updates simple text content for alternate locale
            - supports either explicit contentId or relying on localeString to find record to update (added 2017-10-26)
            - WARN: For high-level operation, use replaceContentLocalizedSimpleTexts</description>
        <auto-attributes mode="IN" entity-name="Content" optional="true"/>
        <auto-attributes mode="IN" entity-name="DataResource" include="nonpk" optional="true" prefix="dr"/><!-- SCIPIO: 3.0.0: Added -->
        <attribute name="mainContentId" type="String" mode="INOUT" optional="true"/>
        <attribute name="createMainContent" type="Boolean" mode="IN" optional="true" default-value="true"/>
        <attribute name="text" type="String" mode="IN" optional="false" allow-html="any"/>
        <override name="localeString" optional="false"/>
        <override name="contentId" mode="INOUT"/>
    </service>
    
    <service name="replaceContentLocalizedSimpleTexts" engine="java" location="org.ofbiz.content.content.LocalizedContentServices" invoke="replaceContentLocalizedSimpleTexts">
        <description>SCIPIO: Intelligently creates, updates and deletes simple text contents for alternate locale
            NOTE: This service will create and update the Main Content record as needed, but it cannot delete the main Content record (see allContentEmpty flag).</description>
        <attribute name="mainContentId" type="String" mode="INOUT" optional="true"/>
        <attribute name="entries" type="List" mode="IN" optional="true">
            <description>Lists of maps, each map supporting the keys: localeString, textData, and optional contentId.
                If strictContent is false, when contentId is omitted, an associated alt locale content having the matching localeString is located and updated,
                unless; if true, then entries with no contentId are assumed to be new records. 
                The first entry of each list is assumed to be the main content record.</description>
        </attribute>
        <attribute name="newContentFields" type="Map" mode="IN" optional="true">
            <description>Common fields for new Content records (overrides defaults)</description>
        </attribute>
        <attribute name="newDataResourceFields" type="Map" mode="IN" optional="true">
            <description>Common fields for new DataResource records (overrides defaults)</description>
        </attribute>
        <!-- TODO?: if needed; always false for now (ignores contentIds)
        <attribute name="strictContent" type="Boolean" mode="IN" optional="true" default-value="false">
            <description>If true, contentFields entries having no contentId are assumed to be new records; 
                if false (default) they are matched by localeString and created, updated or removed as needed.</description>
        </attribute>-->
        <attribute name="allContentEmpty" type="Boolean" mode="OUT" optional="true">
            <description>If the replacements result in a single empty main Content record,
                this will be set to true, indicating that the caller may delete main Content and associations
                if desired (this service cannot delete the associations to the main Content record)</description>
        </attribute>
    </service>
    
    <!-- SCIPIO: DEV NOTE: This is the target of the @stcLocField macro code.
        See org.ofbiz.content.content.LocalizedContentWorker for helper methods. -->
    <service name="replaceEntityContentLocalizedSimpleTextsInterface" engine="interface">
        <description>SCIPIO: Interface for simple text content for alternate locale intelligent create/update/delete services linked to a major entity (ProductContent, ProductCategoryContent, etc.)</description>
        <attribute name="contentFields" type="Map" mode="IN" optional="true" string-map-prefix="contentFields_">
            <description>Map of content type IDs to lists of maps, each map supporting the keys: localeString, textData, and optional contentId.
                If strictContent is false, when contentId is omitted, an associated alt locale content having the matching localeString is located and updated; 
                if true, then entries with no contentId are assumed to be new records. 
                The first entry of each list is assumed to be the main content record (for ProductContent assoc).
                The list-of-maps may also be represented by special strings to allow submit over request parameters, following
                the implementation provided by org.ofbiz.content.content.LocalizedContentWorker#parseLocalizedSimpleTextContentFieldParams</description>
        </attribute>
        <!-- TODO?: if needed; always false for now (ignores contentIds)
        <attribute name="strictContent" type="boolean" mode="IN" optional="true" default-value="false">
            <description>If true, contentFields entries having no contentId are assumed to be new records; 
                if false (default) they are matched by localeString and created, updated or removed as needed.</description>
        </attribute>-->
        <attribute name="mainContentDelete" type="Boolean" mode="IN" optional="true" default-value="true">
            <description>If true (default), if no text content is passed at all, the main content record may be deleted.
                NOTE: This will only delete the main record if its alt locale records also contain
                    no text; otherwise it is essential even if empty because the alt texts are linked to it.</description>
        </attribute>
    </service>

    <service name="prewarmContentCacheFromDb" engine="java" max-retry="2" semaphore-sleep="10"
             location="com.ilscipio.scipio.cms.content.CmsPageServices" invoke="prewarmContentCacheFromDb" auth="true" transaction-timeout="600000" log="quiet">
        <description>Prewarms the cache - runs after restart and on a full cache clear. Fetches Urls from Website entity. Useful to increase firstload performance</description>
    </service>

    <service name="prewarmContentCacheByUrl" engine="java"
             location="com.ilscipio.scipio.cms.content.CmsPageServices" invoke="prewarmContentCacheByUrl" auth="true" transaction-timeout="600000" log="quiet">
        <description>Prewarms the cache. Fetches a range of urls.</description>
        <attribute name="urls" type="java.util.List" mode="IN"  optional="true"/>
        <attribute name="url" type="String" mode="IN"  optional="true"/>
    </service>
</services>