| <?xml version='1.0'?> |
| <!-- |
| *************************************************************** |
| * 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. |
| *************************************************************** |
| --> |
| |
| <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
| xmlns:u="http://uima.apache.org/resourceSpecifier" |
| xmlns:f="http://uima.apache.org/uimaEE/xslt/functions" |
| xmlns:fn="http://www.w3.org/2005/xpath-functions" |
| xmlns:xs="http://www.w3.org/2001/XMLSchema" |
| xmlns:i="http://uima.apache.org/uimaEE/xslt/internal" |
| xmlns:x1="org.apache.uima.aae.deploymentDescriptor.XsltImportByName" |
| xmlns:x2="org.apache.uima.aae.deploymentDescriptor.XsltGUIDgenerator" |
| xmlns:saxon="http://saxon.sf.net/" |
| version='2.0' |
| exclude-result-prefixes="u f fn xs i x1 x2 saxon"> |
| |
| <!-- note: XSLT 2.0 required --> |
| <!-- Changes |
| 6/30/2007 support remote primitive cas multipliers |
| 7/12/2007 support remote brokers for TCP replies based on new XML parm |
| 7/18/2007 change async defaulting to only default to true if there are delegates |
| 9/xx/2007 add support for CPP run as separate process for top level, and env vars |
| 10/01/2007 modify above to need new config param to enable |
| 10/02/2007 make default action for getMeta if not specified be terminate |
| 10/2x/2007 Add new attribute to set default CAS Fs Heap Size for the pools |
| 10/25/2007 Add new listener containers for inputs that enable separate thread for getMeta calls |
| 11/02/2007 Impl defaulting of casPool, and add initialFsHeapSize to both Java and C++ versions |
| 11/12/2007 For Reply Qs running with external broker which is the same as the top-level external |
| broker for the service, add temp queue, refer to it using destination Resolver in the |
| listener containers, and plug those listener containers into endpoints of the delegates. |
| 12/10/2007 support 2 initialFsHeapSize values - one for C++ and one for Java |
| 12/10/2007 change logic for temp q - do whenever reply q is remote |
| 12/10/2007 add check for inconsistency - disallow remote delegate specifying |
| vm://localhost as the brokerURL broker |
| 11/xx/2007 NOT YET DONE rename pool elements for consistency between cas multiplier and main cas pool |
| further updates moved to SVN comments |
| --> |
| |
| <!--============================================================--> |
| <!--| Input: Deployment Descriptor |--> |
| <!--| Additional inputs: for each service descriptor, there is|--> |
| <!--| an associated top-level aggregate descriptor. |--> |
| <!--| |--> |
| <!--| Defaulting: The Deployment descriptor is processed |--> |
| <!--| to insert defaults |--> |
| <!--| During this process, for each service descriptor, |--> |
| <!--| the associated top-level aggregate descriptor is |--> |
| <!--| read in, and for each delegate, |--> |
| <!--| the import element is read in |--> |
| <!--| |--> |
| <!--| Resolving relative paths |--> |
| <!--| During pass 1 - putting in defaults, the relative |--> |
| <!--| paths are resolved, and any information from the |--> |
| <!--| UIMA descriptor is saved in the defaulted tree. |--> |
| <!--| |--> |
| <!--| Relative and absolute paths are supported |--> |
| <!--| Paths with back slashes are converted to / |--> |
| <!--| Relative paths are concatenated when nesting |--> |
| <!--| When processing the resulting Spring XML file, |--> |
| <!--| Spring resolves relative to the working directory. |--> |
| <!--| |--> |
| <!--| To catch errors, elements are verified by looking for |--> |
| <!--| for misspelled/misplaced elements and attributes |--> |
| <!--| |--> |
| <!--============================================================--> |
| |
| <xsl:output method="xml" indent="yes" |
| doctype-public="-//Spring//DTD BEAN//EN" |
| doctype-system="http://www.springframework.org/dtd/spring-beans.dtd" |
| /> |
| |
| <xsl:param name="useRelativePaths"/> |
| |
| <!--xsl:param name="noTempQueues" select="()"/--> <!-- not used anymore --> |
| |
| <xsl:variable name="document-uri" select="document-uri(.)"/> |
| |
| <xsl:variable name="guid" select="x2:getGUID()"/> |
| |
| <!-- collect unique instances of queue brokers where we need generate |
| a broker factory. |
| |
| obsolete ->> Jira UIMA-1288 Omit vm://localBroker ones - those use a common factory for this node |
| Include remotes if the replyQueue is "remote" |
| |
| --> |
| <xsl:variable name="uniqueInputQueueBrokers"> |
| <!--xsl:for-each-group group-by="@brokerURL" |
| select="$ddd//u:inputQueue |
| [ @brokerURL ne 'vm://localBroker' and |
| not(ancestor::u:delegates and not(starts-with(@brokerURL, 'http://'))) |
| ]"> |
| <xsl:sequence select="."/> |
| </xsl:for-each-group--> |
| |
| <!-- inputQueue elements occur at the top and within remote delegates |
| get the unique set of elements |
| The code for the first select used to include this "and" clause |
| and |
| (not(ancestor::u:delegates) or |
| (../u:replyQueue/@location eq 'remote')) |
| --> |
| <xsl:for-each-group group-by="@brokerURL" |
| select="$ddd//u:inputQueue |
| [ @brokerURL ne 'vm://localhost' ]"> |
| <!--xsl:message select="('*** ', ..)"/--> |
| <xsl:sequence select="."/> |
| </xsl:for-each-group> |
| </xsl:variable> |
| |
| <!--xsl:variable name="topLevelInputQueueBroker" |
| select="$ddd/u:analysisEngineDeploymentDescription/u:deployment/u:service/u:inputQueue/@brokerURL"/--> |
| |
| <!--============================================================--> |
| <!--= Error Configuration Details are sharable =--> |
| <!--============================================================--> |
| <xsl:function name="f:ecdKey"> |
| <xsl:param name="node"/> |
| <xsl:sequence select="concat( |
| if ($node/@maxRetries) then concat('_Rtry_', $node/@maxRetries) else '', |
| if ($node/@continueOnRetryFailure) then concat('_Continue_', $node/@continueOnRetryFailure) else '', |
| if ($node/@thresholdCount) then concat('_TCnt_', $node/@thresholdCount) else '', |
| if ($node/@thresholdWindow) then concat('_TWndw_', $node/@thresholdWindow) else '', |
| if ($node/@thresholdAction) then concat('_Action_', $node/@thresholdAction) else '', |
| if ($node/@errorAction) then concat('_Action_', $node/@errorAction) else '', |
| if ($node/@additionalErrorAction) then concat('_Action_', $node/@additionalErrorAction) else '')"/> |
| </xsl:function> |
| |
| <xsl:variable name="uniqueErrorConfigDetails"> |
| <xsl:for-each-group group-by="f:ecdKey(.)" |
| select="$ddd//(u:getMetadataErrors|u:processCasErrors|u:collectionProcessCompleteErrors)"> |
| <xsl:sequence select="."/> |
| </xsl:for-each-group> |
| </xsl:variable> |
| |
| <xsl:template name="generateErrorConfigDetails"> |
| <xsl:sequence select="$nl"/> |
| <xsl:sequence select="f:generateBlockComment(' E r r o r D e t a i l s ', 3)"/> |
| |
| <xsl:for-each select="$uniqueErrorConfigDetails/*"> |
| |
| <bean id="{f:getErrorConfigDetailID(.)}" |
| class="org.apache.uima.aae.error.Threshold" singleton="true"> |
| |
| <xsl:if test="@maxRetries"> |
| <property name="maxRetries" value="{@maxRetries}"/> |
| </xsl:if> |
| |
| <xsl:if test="@continueOnRetryFailure"> |
| <property name="continueOnRetryFailure" value="{@continueOnRetryFailure}"/> |
| </xsl:if> |
| |
| <xsl:if test="@thresholdCount"> |
| <property name="threshold" value="{@thresholdCount}"/> |
| </xsl:if> |
| |
| <xsl:if test="@thresholdWindow"> |
| <property name="window" value="{@thresholdWindow}"/> |
| </xsl:if> |
| |
| <xsl:if test="@errorAction | @thresholdAction | @additionalErrorAction"> |
| <property name="action" value="{concat(@errorAction, @thresholdAction, @additionalErrorAction)}"/> |
| </xsl:if> |
| |
| </bean> |
| <xsl:sequence select="$nl2"/> |
| </xsl:for-each> |
| </xsl:template> |
| |
| <xsl:function name="f:getErrorConfigDetailID"> |
| <xsl:param name="errorNode"/> |
| <xsl:sequence select="concat('errorConfig_', f:ecdKey($errorNode))"/> |
| </xsl:function> |
| |
| <!-- |
| select="$ddd/u:analysisEngineDeploymentDescription/ |
| u:deployment[@protocol='jms' and @provider='activemq']/ |
| u:service/ |
| u:inputQueue[@brokerURL ne 'vm://localBroker']"> |
| |
| |
| |
| <xsl:variable name="iqs"> |
| |
| <xsl:sequence select= |
| "$ddd/u:analysisEngineDeploymentDescription/ |
| u:deployment[@protocol='jms' and @provider='activemq']/ |
| u:service/ |
| u:inputQueue[@brokerURL ne 'vm://localBroker']"/> |
| |
| </xsl:variable> |
| <xsl:if test="$iqs"> |
| <xsl:for-each-group group-by="@brokerURL" select="$iqs/u:inputQueue"> |
| <xsl:sequence select="."/> |
| </xsl:for-each-group> |
| </xsl:if> |
| --> |
| |
| |
| <!--============================================================--> |
| <!-- Top level match --> |
| <!--============================================================--> |
| <xsl:template match="u:analysisEngineDeploymentDescription"> |
| <!--xsl:message select="'debugging - verify version'"/--> |
| <xsl:sequence select="f:generateBlockComment( |
| ('Generated from', $document-uri, format-dateTime(current-dateTime(), '[D1] [MNn], [Y], [h]:[m]:[s] [PN]')), 1)"/> |
| <xsl:apply-templates select="$ddd/u:analysisEngineDeploymentDescription/u:deployment"/> |
| </xsl:template> |
| |
| <xsl:template match="u:deployment[@protocol='jms' and @provider='activemq']"> |
| <beans> |
| <xsl:if test="u:service[@i:isTopLvlCpp eq 'no']"> |
| <xsl:call-template name="generateStandardBeans"/> |
| </xsl:if> |
| <!--xsl:apply-templates select="u:applications"/--> |
| <xsl:apply-templates select="u:service"/> |
| </beans> |
| </xsl:template> |
| |
| <!--============================================================--> |
| <!--= applications =--> |
| <!--============================================================--> |
| <xsl:template match="u:application/u:inputQueue"> |
| <!-- output something to specify where the application sends messages to --> |
| </xsl:template> |
| |
| <!--============================================================--> |
| <!--= service =--> |
| <!--============================================================--> |
| <xsl:template match="u:service"> |
| <!--xsl:message select="'*** uri '"/> |
| <xsl:message select="document-uri(u:topDescriptor/u:import/@location)"/--> |
| |
| <xsl:variable name="iqn" select="concat('top_level_input_queue_service_',position())"/> |
| |
| <xsl:if test="@i:isTopLvlCpp eq 'no'"> |
| <xsl:sequence select="$nl"/> |
| <xsl:comment select="'input queue for service'"/><xsl:sequence select="concat($nl,' ')"/> |
| <bean id="{$iqn}" |
| class="org.apache.activemq.command.ActiveMQQueue"> |
| <constructor-arg index="0" value="{u:inputQueue/@endpoint}"/> |
| </bean> |
| </xsl:if> |
| |
| <xsl:if test="u:analysisEngine/u:casMultiplier"> |
| <xsl:sequence select="$nl"/> |
| <xsl:sequence select="f:generateBlockComment( |
| ('Second Input Q needed for top-level CAS Multiplers', |
| 'Used to have the client signal completion', |
| 'of the processing of a CAS', |
| 'generated by the Cas Multiplier'), 3)"/> |
| <bean id="{concat($iqn,'__CasSync')}" class="org.apache.activemq.command.ActiveMQQueue"> |
| <constructor-arg index="0" value="{concat(u:inputQueue/@endpoint, '__CasSync')}"/> |
| </bean> |
| </xsl:if> |
| |
| <xsl:apply-templates > |
| <xsl:with-param tunnel="yes" name="input_q_ID" select="$iqn"/> |
| <xsl:with-param tunnel="yes" name="inputQueueFactoryID" select="f:getQbrokerID(u:inputQueue)"/> |
| </xsl:apply-templates> |
| </xsl:template> |
| |
| <!--============================================================--> |
| <!--= Aggregate Analysis Engine (async=yes) =--> |
| <!--============================================================--> |
| <xsl:template match="u:analysisEngine[@async eq 'true']"> |
| <xsl:param tunnel="yes" name="input_q_ID"/> |
| <xsl:param tunnel="yes" name="inputQueueFactoryID"/> |
| |
| <!--xsl:message select="'*** Async AA'"/> |
| <xsl:message select="."/--> |
| |
| <xsl:variable name="AEdescription" |
| select="i:local_ae_descriptor/(u:analysisEngineDescription|u:casConsumerDescription|u:taeDescription)"/> |
| |
| <xsl:sequence |
| select="f:generateBlockComment( |
| concat('Async Aggregate: ', f:getAeNameUnique(.)),3)"/> |
| |
| <xsl:variable name="uniq" select="f:getUnique(.)"/> |
| |
| <xsl:variable name="aeNameUnique" select="f:getAeNameUnique(.)"/> |
| <xsl:variable name="ctlrID" select="f:getControllerID(.)"/> |
| <!--concat('asAggr_ctlr_', $aeNameUnique)"/>--> |
| <xsl:variable name="delegateMapID" |
| select="concat('delegate_map_', $aeNameUnique)"/> |
| |
| <xsl:variable name="flowControllerPath"> |
| <xsl:choose> |
| <xsl:when test="i:flowController"> |
| <!--xsl:message select="'Custom flow controller being used'"/> |
| <xsl:message select="."/--> |
| <xsl:sequence select="string(i:flowController/@file_path)"/> |
| </xsl:when> |
| <xsl:when |
| test="$AEdescription/u:analysisEngineMetaData/u:flowConstraints/u:fixedFlow"> |
| <xsl:sequence |
| select="'*importByName:org.apache.uima.flow.FixedFlowController'"/> |
| </xsl:when> |
| <xsl:when |
| test="$AEdescription/u:analysisEngineMetaData/u:flowConstraints/u:capabilityLanguageFlow"> |
| <xsl:sequence |
| select="'*importByName:org/apache/uima/flow/CapabilityLanguageFlowController'"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:message select="'*** Internal error, i:local_ae_descriptor'"/> |
| <xsl:message select="i:local_ae_descriptor"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| |
| <!--xsl:message select="concat('Flow controller for ', $aeNameUnique, ' is ', $flowControllerPath)"/--> |
| <!-- removed lazy init: lazy-init="{if (parent::u:service) then 'true' else 'false'}" --> |
| <bean id="{$ctlrID}" |
| class="org.apache.uima.aae.controller.AggregateAnalysisEngineController_impl" |
| init-method="initialize"> |
| <!-- parent controller --> |
| <xsl:choose> |
| <xsl:when test="parent::u:delegates"> |
| <constructor-arg index="0" |
| ref="{f:getControllerID(ancestor::u:analysisEngine[1])}"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <constructor-arg index="0"><null/></constructor-arg> |
| </xsl:otherwise> |
| </xsl:choose> |
| <constructor-arg index="1" value="{@key}"/> |
| <constructor-arg index="2" value="{i:local_ae_descriptor/@file_path}"/> |
| <constructor-arg index="3" ref="casManager"/> |
| <constructor-arg index="4" ref="inProcessCache"/> |
| <constructor-arg index="5" ref="{$delegateMapID}"/> |
| |
| <!-- output channels needed if top level component - to return values to invoker |
| or if one or more delegates is remote - to send to the remote --> |
| <xsl:if test="parent::u:service or u:delegates/u:remoteAnalysisEngine"> |
| <property name="outputChannel" ref="{f:getOutputChannelID(.)}"/> |
| </xsl:if> |
| <property name="serviceEndpointName" value="{$input_q_ID}"/> |
| |
| <property name="controllerBeanName" value="{$ctlrID}"/> |
| <property name="errorHandlerChain" ref="{f:getErrorHandlerChainID(.)}"/> |
| <property name="flowControllerDescriptor" value="{$flowControllerPath}"/> |
| </bean> |
| |
| <!-- only generate aggregate input message handlers for top level - |
| others using internal queuing mechanisms --> |
| <xsl:if test="parent::u:service"> |
| <xsl:call-template name="generateMsgHandlerChain"> |
| <xsl:with-param name="aeNode" select="."/> |
| <xsl:with-param name="kind" select="'aggregate_input'"/> |
| </xsl:call-template> |
| </xsl:if> |
| |
| <!-- only generate return message handlers if one or more of the |
| delegates are remote |
| All remotes share this one message handler chain --> |
| |
| <xsl:if test="u:delegates/u:remoteAnalysisEngine"> |
| <xsl:call-template name="generateMsgHandlerChain"> |
| <xsl:with-param name="aeNode" select="."/> |
| <xsl:with-param name="kind" select="'aggregate_return'"/> |
| </xsl:call-template> |
| </xsl:if> |
| |
| <xsl:sequence |
| select="f:generateLineComment('Create the endpoints + output channels, one per delegate', 3)"/> |
| |
| <xsl:variable name="remoteDelegates" |
| select="u:delegates/u:remoteAnalysisEngine"/> |
| <xsl:variable name="analysisEngine" select="."/> |
| |
| |
| <!-- iterate over AE descriptor to get accurate position info for all delegates --> |
| <xsl:for-each |
| select="$AEdescription/u:delegateAnalysisEngineSpecifiers/u:delegateAnalysisEngine"> |
| |
| |
| <!-- these next 2 vars are the same, except the remoteAnalysisEngine is not-empty if it is remote --> |
| <xsl:variable name="remoteAnalysisEngine" |
| select="$remoteDelegates[@key eq current()/@key]"/> |
| <xsl:variable name="aeDelegate" |
| select="$analysisEngine/u:delegates/*[@key eq current()/@key]"/> |
| <!--xsl:message select="('*** key is', @key)"/> |
| <xsl:message select="$AEdescription/u:delegateAnalysisEngineSpecifiers/u:delegateAnalysisEngine"/> |
| <xsl:message select="$analysisEngine/u:delegates"/> |
| <xsl:message select="'*** remote delegate'"/> |
| <xsl:message select="$remoteAnalysisEngine"/> |
| <xsl:message select="'*** ae delegate'"/> |
| <xsl:message select="$aeDelegate"/--> |
| |
| <xsl:sequence |
| select="f:generateLineComment(( |
| '====================================', |
| @key, |
| ' ** Delegate Endpoint **', |
| '====================================' |
| ), 3)"/> |
| <xsl:variable name="endpointID" |
| select="f:getEndpointName(@key, concat($uniq, '.', position()))"/> |
| <bean id="{$endpointID}" |
| class="org.apache.uima.aae.controller.Endpoint_impl"> |
| |
| <xsl:sequence select="f:generateLineComment('Broker URI', 5)"/> |
| <xsl:variable name="brokerURL"> |
| <xsl:choose> |
| <xsl:when test="$remoteAnalysisEngine"> |
| <xsl:sequence |
| select="string($remoteAnalysisEngine/u:inputQueue/@brokerURL)"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:sequence select="'vm://localhost'"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| <property name="serverURI" value="{$brokerURL}"/> |
| |
| <xsl:sequence |
| select="f:generateLineComment('Delegate key name or remote queue name', 5)"/> |
| <property name="endpoint" |
| value="{if ($remoteAnalysisEngine) then $remoteAnalysisEngine/u:inputQueue/@endpoint |
| else f:getInternalInputQueueName($aeDelegate)}"/> |
| |
| <xsl:if test="$remoteAnalysisEngine"> |
| <xsl:sequence |
| select="f:generateLineComment('Queue name used for replies, on the remote broker',5)"/> |
| <property name="replyToEndpoint" |
| value="{f:getRemoteReturnQueueName($analysisEngine, $remoteAnalysisEngine)}"/> |
| </xsl:if> |
| |
| <!--xsl:message select="'aeDelegates'"/> |
| <xsl:message select="count($aeDelegate/ancestor-or-self::node() |
| [u:errorConfiguration/u:errorHandling/u:timeout[@event eq 'metadataRequest']][1] |
| /u:errorConfiguration/u:errorHandling/u:timeout[@event eq 'metadataRequest'] |
| ) |
| "/> |
| <xsl:message select="'aeDelegates'"/--> |
| |
| <xsl:if test="$remoteAnalysisEngine/u:casMultiplier/@poolSize"> |
| <property name="shadowCasPoolSize" value="{$remoteAnalysisEngine/u:casMultiplier/@poolSize}"/> |
| </xsl:if> |
| <xsl:if test="$remoteAnalysisEngine/u:casMultiplier/@initialFsHeapSize"> |
| <property name="initialFsHeapSize" value="{$remoteAnalysisEngine/u:casMultiplier/@initialFsHeapSize}"/> |
| </xsl:if> |
| |
| <!-- jira UIMA-1245 --> |
| <xsl:if test="$aeDelegate/u:casMultiplier/@processParentLast"> |
| <property name="processParentLast" value="{$aeDelegate/u:casMultiplier/@processParentLast}"/> |
| </xsl:if> |
| |
| <xsl:sequence select="f:generateLineComment('Timeouts', 5)"/> |
| <property name="metadataRequestTimeout" |
| value="{$aeDelegate/ancestor-or-self::node() |
| [u:asyncAggregateErrorConfiguration/u:getMetadataErrors/@timeout][1] |
| /u:asyncAggregateErrorConfiguration/u:getMetadataErrors/@timeout}"/> |
| <property name="processRequestTimeout" |
| value="{$aeDelegate/ancestor-or-self::node() |
| [u:asyncAggregateErrorConfiguration/u:processCasErrors/@timeout][1] |
| /u:asyncAggregateErrorConfiguration/u:processCasErrors/@timeout}"/> |
| <property name="collectionProcessCompleteTimeout" |
| value="{$aeDelegate/ancestor-or-self::node() |
| [u:asyncAggregateErrorConfiguration/u:collectionProcessCompleteErrors/@timeout][1] |
| /u:asyncAggregateErrorConfiguration/u:collectionProcessCompleteErrors/@timeout}"/> |
| <xsl:if test="$remoteAnalysisEngine"> |
| <property name="serializer" |
| value="{$remoteAnalysisEngine/u:serializer/@method}"/> |
| </xsl:if> |
| |
| <xsl:if test="$remoteAnalysisEngine"> |
| <property name="tempReplyDestination" value="true"/> |
| </xsl:if> |
| |
| <xsl:if test="not($remoteAnalysisEngine)"> |
| <xsl:choose> |
| <xsl:when test="$aeDelegate[@async eq 'true']"> |
| <property name="concurrentRequestConsumers" value="{$aeDelegate/@inputQueueScaleout}"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <property name="concurrentRequestConsumers" value="{$aeDelegate/u:scaleout/@numberOfInstances}"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| |
| <property name="concurrentReplyConsumers" value="{$aeDelegate/@internalReplyQueueScaleout}"/> |
| </xsl:if> |
| <!-- |
| <xsl:variable name="msgListenerContainerID" |
| select="concat('asAggr_return_msgLsnrCntnr_', $aeNameUnique, |
| if ($remoteAnalysisEngine/@key) then concat('_', $remoteAnalysisEngine/@key) else '')"/> |
| <property name="listenerContainer" ref="{$msgListenerContainerID}"/> |
| </xsl:if--> |
| </bean> |
| |
| |
| </xsl:for-each> |
| |
| <!-- only generate input channels (and listeners) for top level - |
| others using internal queuing mechanisms --> |
| <xsl:if test="parent::u:service"> |
| <xsl:call-template name="generateInputChannel"> |
| <xsl:with-param name="aeNameUnique" select="$aeNameUnique"/> |
| <xsl:with-param name="q_ID" select="$input_q_ID"/> |
| <xsl:with-param name="q_endpointName" select="$input_q_ID"/> |
| <xsl:with-param name="queueFactoryID" select="$inputQueueFactoryID"/> |
| <xsl:with-param name="inputOrReturn" select="'input'"/> |
| <xsl:with-param name="kind" select="'asAggr'"/> |
| <!-- used as 1st part of ctlr name --> |
| <xsl:with-param name="msgHandlerChainID" |
| select="f:getMetaMsgHandlerID(., 'aggregate_input')"/> |
| <xsl:with-param name="nbrConcurrentConsumers" select="string(@inputQueueScaleout)"/> |
| <xsl:with-param name="remote" select="()"/> |
| <xsl:with-param name="poolingTaskExecutor" select="()"/> |
| </xsl:call-template> |
| </xsl:if> |
| |
| <xsl:variable name="return_q_ID" select="f:getLocalReturnQueueEndpointID(.)"/> |
| |
| <!-- this next test seems strange, I think it always returns true. |
| the test "starts-with(@brokerURL, '/')" would seem always to be false |
| The net effect is that the return queue for async aggr is always generated --> |
| |
| <!-- test changed: no common return input channel and listeners are used |
| anymore - they were used only for co-located delegates, which now |
| use an internal mechanism --> |
| |
| |
| <!-- removed with change to JavaQ for local Q --> |
| <!-- other reply queues (for remotes) are "remote" --> |
| <!--xsl:sequence |
| select="f:generateLineComment('return queue for async aggregate', 3)"/> |
| <bean id="{$return_q_ID}" class="org.apache.activemq.command.ActiveMQQueue"> |
| <constructor-arg index="0" value="{$return_q_ID}"/> |
| </bean--> |
| |
| <!--xsl:call-template name="generateInputChannel"> |
| <xsl:with-param name="aeNameUnique" select="$aeNameUnique"/> |
| <xsl:with-param name="q_ID" select="$return_q_ID"/> |
| <xsl:with-param name="q_endpointName" select="$return_q_ID"/> |
| <xsl:with-param name="queueFactoryID" select="'controllerJmsFactory'"/> |
| <xsl:with-param name="inputOrReturn" select="'return'"/> |
| <xsl:with-param name="kind" select="'asAggr'"/--> |
| <!-- used as 1st part of ctlr name --> |
| <!--xsl:with-param name="msgHandlerChainID" |
| select="f:getMetaMsgHandlerID($analysisEngine, 'aggregate_return')"/> |
| <xsl:with-param name="nbrConcurrentConsumers" select="string(@internalReplyQueueScaleout)"/> |
| <xsl:with-param name="remote" select="()"/> |
| <xsl:with-param name="poolingTaskExecutor" select="()"/> |
| </xsl:call-template--> |
| |
| |
| <!-- we iterate over all the delegates in order to have the right value for position() --> |
| <xsl:for-each select="u:delegates/*"> |
| <xsl:if test="self::u:remoteAnalysisEngine"> |
| <!--xsl:message select="('delegate', .)"/--> |
| <xsl:variable name="returnQ_ID" select="f:getRemoteReturnQueueID($analysisEngine, .)"/> |
| <xsl:variable name="returnQ_ID_GUID" select="f:getRemoteReturnQueueName($analysisEngine, .)"/> |
| |
| <!--xsl:if test="not(f:isRmtTempQ(.))"--> |
| <xsl:sequence |
| select="f:generateLineComment(('return queue for http or tcp remote service', 'on remote broker'), 3)"/> |
| <bean id="{$returnQ_ID}" class="org.apache.activemq.command.ActiveMQQueue"> |
| <constructor-arg index="0" value="{$returnQ_ID_GUID}"/> |
| </bean> |
| <!--/xsl:if--> |
| |
| <xsl:variable name="brokerID" select="f:getQbrokerID(u:inputQueue)"/> |
| <!--xsl:message select="('generating input channel for remote reply queue', u:remoteAnalysisEngine/@key)"/--> |
| <xsl:call-template name="generateInputChannel"> |
| <xsl:with-param name="aeNameUnique" select="$aeNameUnique"/> |
| <xsl:with-param name="q_ID" select="$returnQ_ID"/> |
| <!-- if tempQ, use endpoint bean id instead of endpoint name in next parm --> |
| <!--xsl:with-param name="q_endpointName" |
| select="if (f:isRmtTempQ(.)) then f:getEndpointName(@key, concat($uniq, '.', position())) |
| else $returnQ_ID_GUID"/--> |
| <xsl:with-param name="q_endpointName" |
| select="f:getEndpointName(@key, concat($uniq, '.', position()))"/> |
| <xsl:with-param name="queueFactoryID" select="$brokerID"/> |
| <xsl:with-param name="inputOrReturn" select="'return'"/> |
| <xsl:with-param name="kind" select="'asAggr'"/> |
| <!-- used as 1st part of ctlr name --> |
| <xsl:with-param name="msgHandlerChainID" |
| select="f:getProcessResponseHandlerID($analysisEngine, 'aggregate_return')"/> |
| <xsl:with-param name="nbrConcurrentConsumers" |
| select="@remoteReplyQueueScaleout"/> |
| <xsl:with-param name="remote" select="."/> |
| <xsl:with-param name="poolingTaskExecutor" select="()"/> |
| </xsl:call-template> |
| </xsl:if> |
| </xsl:for-each> |
| |
| <xsl:variable name="origin_q_name" |
| select="if (parent::u:service) then parent::u:service/u:inputQueue/@endpoint |
| else f:getInternalInputQueueName(.)"/> |
| <!--xsl:message select="'*** origin_q_name: '"/> |
| <xsl:message select="$origin_q_name"/--> |
| |
| <!-- skip generating output channel for internal reply queues |
| because internal reply queues no longer used |
| Still need this for returning values from top level component to invoker, or |
| for sending value to remotes --> |
| <xsl:if test="parent::u:service or u:delegates/u:remoteAnalysisEngine"> |
| <xsl:call-template name="generateOutputChannel"> |
| <xsl:with-param name="aeNode" select="."/> |
| <xsl:with-param name="origin_q_name" select="$origin_q_name"/> |
| <xsl:with-param name="return_q_ID" select="$return_q_ID"/> |
| <xsl:with-param name="kind" select="'asAggr'"/> |
| </xsl:call-template> |
| </xsl:if> |
| |
| <xsl:sequence select="f:generateLineComment('map for delegate keys', 3)"/> |
| <bean id="{$delegateMapID}" class="java.util.HashMap" singleton="true"> |
| <constructor-arg> |
| <map> |
| <xsl:for-each |
| select="$AEdescription/u:delegateAnalysisEngineSpecifiers/u:delegateAnalysisEngine"> |
| <entry key="{@key}"> |
| <ref |
| bean="{f:getEndpointName(@key, concat($uniq, '.', position()))}"/> |
| </entry> |
| </xsl:for-each> |
| </map> |
| </constructor-arg> |
| </bean> |
| <xsl:sequence select="$nl2"/> |
| |
| <xsl:call-template name="generateErrorChainForAggr"/> |
| <xsl:apply-templates select="u:delegates"/> |
| </xsl:template> |
| |
| |
| <!--============================================================--> |
| <!--= Primitive or Sync Aggregate Analysis Engine (async=false) =--> |
| <!--============================================================--> |
| <xsl:template match="u:analysisEngine[@async=('false', 'no')]"> |
| <xsl:param tunnel="yes" name="input_q_ID"/> |
| <xsl:param tunnel="yes" name="inputQueueFactoryID"/> |
| <xsl:variable name="AEdescription" select="i:local_ae_descriptor/(u:analysisEngineDescription|u:casConsumerDescription|u:taeDescription)"/> |
| |
| <xsl:sequence select="f:generateBlockComment( |
| (concat('Primitive or non-Async Aggr: ', f:getSimpleAeName(.)) |
| ),3)"/> |
| |
| <xsl:variable name="uniq" select="f:getUnique(.)"/> |
| |
| <xsl:variable name="aeNameUnique" select="f:getAeNameUnique(.)"/> |
| <xsl:variable name="ctlrID" select="f:getControllerID(.)"/> |
| |
| <xsl:if test="self::u:analysisEngine"> <!-- ?? seems to always be true ... --> |
| <!-- no error handler chain for primitives - use built-in one instead --> |
| <!-- xsl:variable name="errorHandlerChainID" select="f:getErrorHandlerChainID(.)"/ --> |
| <xsl:choose> |
| <xsl:when test="../../u:service[@i:isTopLvlCpp eq 'yes']"> |
| <!-- create bean to do placeholder substitution Jira UIMA-1288 --> |
| <bean id="placeholderSubstitution" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> |
| <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> |
| </bean> |
| <bean id="{$ctlrID}" |
| class="org.apache.uima.aae.controller.UimacppServiceController"> |
| |
| <xsl:sequence select="f:generateLineComment('path to top level descriptor', 5)"/> |
| <constructor-arg index="0" value="{i:local_ae_descriptor/@file_path}"/> |
| |
| <xsl:sequence select="f:generateLineComment('input q name', 5)"/> |
| <constructor-arg index="1" value="{../u:inputQueue/@endpoint}"/> |
| |
| <xsl:sequence select="f:generateLineComment('input q BrokerURL', 5)"/> |
| <constructor-arg index="2" value="{../u:inputQueue/@brokerURL}"/> |
| |
| <xsl:sequence select="f:generateLineComment('scaleout number of instances', 5)"/> |
| <constructor-arg index="3" value="{u:scaleout/@numberOfInstances}"/> |
| |
| <xsl:sequence select="f:generateLineComment('prefetch limit', 5)"/> |
| <constructor-arg index="4" value="{../u:inputQueue/@prefetch}"/> |
| |
| <xsl:sequence select="f:generateLineComment('Env Vars map', 5)"/> |
| <constructor-arg index="5"> |
| <map> |
| <xsl:for-each select="../u:environmentVariables/u:environmentVariable"> |
| <entry key="{@name}"><value><xsl:sequence select="text()"/></value></entry> |
| </xsl:for-each> |
| </map> |
| </constructor-arg> |
| |
| <xsl:sequence select="f:generateLineComment('Process CAS Error Threshold', 5)"/> |
| <constructor-arg index="6" value="{u:asyncPrimitiveErrorConfiguration/u:processCasErrors/@thresholdCount}"/> |
| |
| <xsl:sequence select="f:generateLineComment('PprocessCas Error Window', 5)"/> |
| <constructor-arg index="7" value="{u:asyncPrimitiveErrorConfiguration/u:processCasErrors/@thresholdWindow}"/> |
| |
| <xsl:sequence select="f:generateLineComment('Terminate on CPC Error', 5)"/> |
| <constructor-arg index="8" value="{if ('terminate' eq |
| string(u:asyncPrimitiveErrorConfiguration/u:collectionProcessCompleteErrors/@additionalErrorAction)) |
| then 'true' else 'false'}"/> |
| |
| <xsl:variable name="initialHeapSize" select="if (../../u:casPool/@initialFsHeapSize eq 'defaultFsHeapSize') |
| then '40000' else ../../u:casPool/@initialFsHeapSize"/> |
| <constructor-arg index="9" value="{$initialHeapSize}"/> |
| |
| </bean> |
| </xsl:when> |
| <xsl:otherwise> |
| <!-- removed lazy init: lazy-init="{if (parent::u:service) then 'true' else 'false'}" --> |
| <bean id="{$ctlrID}" |
| class="org.apache.uima.aae.controller.PrimitiveAnalysisEngineController_impl" |
| init-method="initialize"> |
| <!-- parent controller --> |
| <xsl:choose> |
| <xsl:when test="parent::u:delegates"> |
| <constructor-arg index="0" ref="{f:getControllerID(ancestor::u:analysisEngine[1])}"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <constructor-arg index="0"><null/></constructor-arg> |
| </xsl:otherwise> |
| </xsl:choose> |
| <xsl:sequence select="f:generateLineComment('Key name', 5)"/> |
| <constructor-arg index="1" value="{@key}"/> |
| <constructor-arg index="2" value="{i:local_ae_descriptor/@file_path}"/> |
| <constructor-arg index="3" ref="casManager"/> |
| <constructor-arg index="4" ref="inProcessCache"/> |
| |
| <!-- This parameter is ignored --> |
| <xsl:sequence select="f:generateLineComment('this parameter is ignored', 5)"/> |
| <constructor-arg index="5" value="10"/> |
| <!--xsl:message select="'*** Scaleout'"/> |
| <xsl:message select="."/--> |
| <xsl:sequence select="f:generateLineComment('scaleout number of instances', 5)"/> |
| <constructor-arg index="6" value="{u:scaleout/@numberOfInstances}"/> |
| <xsl:if test="u:casMultiplier/@poolSize"> |
| <xsl:sequence select="f:generateLineComment('CAS Multiplier poolSize', 5)"/> |
| <constructor-arg index="7" value="{u:casMultiplier/@poolSize}"/> |
| </xsl:if> |
| <xsl:if test="u:casMultiplier/@initialFsHeapSize"> |
| <xsl:sequence select="f:generateLineComment('CAS Multiplier initial heap size', 5)"/> |
| <constructor-arg index="8" value="{u:casMultiplier/@initialFsHeapSize}"/> |
| </xsl:if> |
| |
| <xsl:if test="parent::u:service"> |
| <property name="outputChannel" ref="{f:getOutputChannelID(.)}"/> |
| </xsl:if> |
| <xsl:if test="parent::u:service"> |
| <property name="errorHandlerChain" ref="{f:getErrorHandlerChainID(.)}"/> |
| </xsl:if> |
| </bean> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:if> |
| |
| <!-- next logic is true for lower levels in an aggregate as well as top level not CPP --> |
| <xsl:if test="not(../../u:service[@i:isTopLvlCpp eq 'yes'])"> |
| <xsl:variable name="poolingTaskExecutorID" select="f:getPoolingTaskExecutorID(.)"/> |
| <!--xsl:variable name="scaleoutPlus" select= |
| "if (parent::u:service and u:casMultiplier) then |
| number(u:scaleout/@numberOfInstances) + 1 else |
| number(u:scaleout/@numberOfInstances) + 0"/--> |
| |
| <!-- removed when java q added for local --> |
| <!-- only generate ThreadPoolTaskExecutor for top level primitives --> |
| <xsl:if test="parent::u:service"> |
| <xsl:sequence select="f:generateLineComment('ThreadPool Task Executor',3)"/> |
| <bean id="{$poolingTaskExecutorID}" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> |
| <property name="corePoolSize" value="{u:scaleout/@numberOfInstances}" /> |
| <property name="maxPoolSize" value="{u:scaleout/@numberOfInstances}" /> |
| <property name="queueCapacity" value="{u:scaleout/@numberOfInstances}" /> |
| </bean> |
| </xsl:if> |
| |
| <!-- only generate input message handlers and input channels for top level - |
| others using internal queuing mechanisms --> |
| <xsl:if test="parent::u:service"> |
| <xsl:call-template name="generateMsgHandlerChain"> |
| <xsl:with-param name="aeNode" select="."/> |
| <xsl:with-param name="kind" select="'primitive'"/> |
| </xsl:call-template> |
| |
| |
| <xsl:call-template name="generateInputChannel"> |
| <xsl:with-param name="aeNameUnique" select="$aeNameUnique"/> |
| <xsl:with-param name="q_ID" select="$input_q_ID"/> |
| <xsl:with-param name="q_endpointName" select="$input_q_ID"/> |
| <xsl:with-param name="queueFactoryID" select="$inputQueueFactoryID"/> |
| <xsl:with-param name="inputOrReturn" select="'input'"/> |
| <xsl:with-param name="kind" select="'primitive'"/> <!-- used in ctrl id name --> |
| <xsl:with-param name="msgHandlerChainID" select="f:getMetaMsgHandlerID(., 'primitive')"/> |
| <xsl:with-param name="nbrConcurrentConsumers" select="u:scaleout/@numberOfInstances"/> |
| <xsl:with-param name="remote" select="()"/> |
| <xsl:with-param name="poolingTaskExecutor" select="$poolingTaskExecutorID"/> |
| </xsl:call-template> |
| |
| </xsl:if> |
| |
| <!-- next to be commented out due to design change summer 2008 --> |
| <!--xsl:if test="parent::u:service and u:casMultiplier"> |
| <xsl:call-template name="generateCMSyncInputChannel"> |
| <xsl:with-param name="aeNameUnique" select="$aeNameUnique"/> |
| <xsl:with-param name="q_ID" select="$input_q_ID"/> |
| <xsl:with-param name="queueFactoryID" select="$inputQueueFactoryID"/> |
| <xsl:with-param name="inputOrReturn" select="'input'"/> |
| <xsl:with-param name="kind" select="'primitive'"/--> <!-- used in ctrl id name --> |
| <!--xsl:with-param name="msgHandlerChainID" select="f:getMetaMsgHandlerID(., 'primitive')"/> |
| <xsl:with-param name="nbrConcurrentConsumers" select="u:scaleout/@numberOfInstances"/> |
| <xsl:with-param name="remote" select="()"/> |
| <xsl:with-param name="poolingTaskExecutor" select="$poolingTaskExecutorID"/> |
| </xsl:call-template> |
| </xsl:if--> |
| |
| |
| <xsl:variable name="origin_q_name" select= |
| "if (parent::u:service) then parent::u:service/u:inputQueue/@endpoint |
| else f:getInternalInputQueueName(.)"/> |
| <!--xsl:message select="'*** origin_q_name: '"/> |
| <xsl:message select="$origin_q_name"/--> |
| |
| <!-- skip generating output channel for internal reply queues |
| because internal reply queues no longer used --> |
| <xsl:if test="parent::u:service"> |
| <xsl:call-template name="generateOutputChannel"> |
| <xsl:with-param name="aeNode" select="."/> |
| <xsl:with-param name="origin_q_name" select="$origin_q_name"/> |
| <xsl:with-param name="kind" select="'primitive'"/> |
| </xsl:call-template> |
| </xsl:if> |
| |
| <!-- next call is called for all primitives, but only does something |
| for top level primitives --> |
| <xsl:call-template name="generateErrorChainForTop"/> |
| </xsl:if> |
| |
| </xsl:template> |
| |
| <!--============================================================--> |
| <!--= Remote Analysis Engine =--> |
| <!--============================================================--> |
| <xsl:template match="u:remoteAnalysisEngine"> |
| <xsl:param tunnel="yes" name="input_q_ID"/> |
| <xsl:param tunnel="yes" name="inputQueueFactoryID"/> |
| </xsl:template> |
| |
| <!--======================================--> |
| <!--= generateErrorChainForAggr =--> |
| <!--= Context = aggr Analysis Engine =--> |
| <!--= containing delegates =--> |
| <!--======================================--> |
| <xsl:template name="generateErrorChainForAggr"> |
| <xsl:variable name="aec" select="u:delegates/(u:analysisEngine | u:remoteAnalysisEngine)/u:asyncAggregateErrorConfiguration"/> |
| |
| <xsl:sequence select="f:generateBlockComment('Delegate ErrorHandlers', 3)"/> |
| <xsl:call-template name="generateErrorHandler"> |
| <xsl:with-param name="node" select="$aec/u:getMetadataErrors"/> |
| <xsl:with-param name="kind" select="'GetMetaErrorHandler'"/> |
| </xsl:call-template> |
| |
| <xsl:call-template name="generateErrorHandler"> |
| <xsl:with-param name="node" select="$aec/u:processCasErrors"/> |
| <xsl:with-param name="kind" select="'ProcessCasErrorHandler'"/> |
| </xsl:call-template> |
| |
| <xsl:call-template name="generateErrorHandler"> |
| <xsl:with-param name="node" select="$aec/u:collectionProcessCompleteErrors"/> |
| <xsl:with-param name="kind" select="'CpcErrorHandler'"/> |
| </xsl:call-template> |
| |
| <xsl:call-template name="generateErrorHandlerChain"> |
| <xsl:with-param name="aec" select="$aec"/> |
| </xsl:call-template> |
| |
| </xsl:template> |
| |
| <xsl:template name="generateErrorHandlerChain"> |
| <xsl:param name="aec"/> |
| <xsl:sequence select="f:generateBlockComment(( |
| ' Error Handler Chain ' |
| ), 3)"/> |
| <bean id="{f:getErrorHandlerChainID(.)}" |
| class="org.apache.uima.aae.error.ErrorHandlerChain"> |
| <constructor-arg> |
| <list> |
| |
| <xsl:if test="$aec/u:getMetadataErrors"> |
| <ref local="{f:getErrorHandlerID(($aec/u:getMetadataErrors)[1])}"/> |
| </xsl:if> |
| |
| <xsl:if test="$aec/u:processCasErrors"> |
| <ref local="{f:getErrorHandlerID(($aec/u:processCasErrors)[1])}"/> |
| </xsl:if> |
| |
| <xsl:if test="$aec/u:collectionProcessCompleteErrors"> |
| <ref local="{f:getErrorHandlerID(($aec/u:collectionProcessCompleteErrors)[1])}"/> |
| </xsl:if> |
| |
| </list> |
| </constructor-arg> |
| </bean> |
| </xsl:template> |
| |
| <!--======================================--> |
| <!--= generateErrorChainForTop =--> |
| <!--= Context = top Analysis Engine =--> |
| <!--= if Top is async aggr, the config =--> |
| <!--= is done within the error chain =--> |
| <!--= for that aggr. =--> |
| <!--= else is done here =--> |
| <!--= context-node is analysisEngine =--> |
| <!--======================================--> |
| |
| <xsl:template name="generateErrorChainForTop"> |
| <xsl:variable name="aec" select="u:asyncPrimitiveErrorConfiguration"/> |
| <xsl:if test="@async eq 'false' and ($aec/u:processCasErrors or $aec/u:collectionProcessCompleteErrors)"> |
| <!--xsl:message select="'*generating err handler chain'"/--> |
| <xsl:if test="$aec/u:processCasErrors"> |
| <bean id="{f:getErrorHandlerID(($aec/u:processCasErrors)[1])}" class="org.apache.uima.aae.error.handler.ProcessCasErrorHandler"> |
| <constructor-arg> |
| <map> <entry key=""> <ref bean="{f:getErrorConfigDetailID($aec/u:processCasErrors)}"/> </entry> </map> |
| </constructor-arg> |
| </bean> |
| </xsl:if> |
| |
| <xsl:if test="$aec/u:collectionProcessCompleteErrors"> |
| <bean id="{f:getErrorHandlerID(($aec/u:collectionProcessCompleteErrors)[1])}" class="org.apache.uima.aae.error.handler.CpcErrorHandler"> |
| <constructor-arg> |
| <map> <entry key=""> <ref bean="{f:getErrorConfigDetailID($aec/u:collectionProcessCompleteErrors)}"/> </entry> </map> |
| </constructor-arg> |
| </bean> |
| </xsl:if> |
| |
| <xsl:call-template name="generateErrorHandlerChain"> |
| <xsl:with-param name="aec" select="$aec"/> |
| </xsl:call-template> |
| |
| </xsl:if> |
| </xsl:template> |
| |
| |
| <xsl:template name="generateErrorHandler"> |
| <xsl:param name="node"/> |
| <xsl:param name="kind"/> |
| <!--xsl:message select="('*** Generating keymaps for error handler given node set:', $node, '***end')"/--> |
| <xsl:if test="$node"> |
| <bean id="{f:getErrorHandlerID($node[1])}" class="org.apache.uima.aae.error.handler.{$kind}"> |
| <constructor-arg> |
| <map> |
| <xsl:for-each select="$node"> |
| <entry key="{../../@key}"> <ref bean="{f:getErrorConfigDetailID(.)}"/> </entry> |
| </xsl:for-each> |
| <!-- aec <- asyncAggrErrConfig <- ae or rmtae <- delegate <- ae <- service --> |
| <xsl:variable name="topEc" select= |
| "$node[1]/../../../parent::u:analysisEngine[parent::u:service]/u:asyncPrimitiveErrorConfiguration"/> |
| <!-- ec is error spec matching the error class being worked on --> |
| <xsl:variable name="ec" select="$topEc/node()[node-name(.) eq node-name($node[1])]"/> |
| <xsl:if test="$ec"> |
| <!--xsl:message select="('*** found top level - inserting null key ref')"/--> |
| <entry key=""> <ref bean="{f:getErrorConfigDetailID($ec)}"/> </entry> |
| </xsl:if> |
| </map> |
| </constructor-arg> |
| </bean> |
| <xsl:sequence select="$nl2"/> |
| </xsl:if> |
| </xsl:template> |
| |
| <!-- errorKindNode is the <processCasErrors> etc. node --> |
| |
| <xsl:function name="f:getErrorHandlerID"> |
| <xsl:param name="errorKindNode"/> |
| <xsl:variable name="en" select="string(node-name($errorKindNode))"/> |
| <!-- next substring drops u: in front and Errors in the back --> |
| <xsl:variable name="kind" select="substring($en, 3, string-length($en)-6)"/> |
| <!-- if $errorKindNode is contained in an AS aggregate, go up to that aggregate --> |
| <!-- if $errorKindNode is at the top level, skip the uniqifier --> |
| |
| <xsl:variable name="uniq" select="if ($errorKindNode/../../parent::u:service) then '' else f:getUnique($errorKindNode/../../..)"/> |
| <xsl:sequence select="concat('err_hndlr_',$kind,'_',$uniq)"/> |
| </xsl:function> |
| |
| |
| <!--==========================================--> |
| <!-- Generate an input or return Channel --> |
| <!--==========================================--> |
| <xsl:template name="generateInputChannel"> |
| <xsl:param name="aeNameUnique"/> |
| <xsl:param name="q_ID"/> <!-- this is a descriptor-unique bean id of the input (or ret) q endpoint --> |
| <xsl:param name="q_endpointName"/> <!-- for temp return q this is endpoint bean id --> |
| <xsl:param name="queueFactoryID"/> |
| <xsl:param name="inputOrReturn"/> <!-- input or return --> |
| <xsl:param name="kind"/> <!-- either primitive or asAggr, used as 1st part of ctlr name --> |
| <xsl:param name="msgHandlerChainID"/> |
| <xsl:param name="nbrConcurrentConsumers"/> |
| <xsl:param name="remote"/> <!-- is () unless a remote return queue --> |
| <xsl:param name="poolingTaskExecutor"/> |
| |
| <xsl:variable name="ctlrID" select="concat($kind, '_ctlr_', $aeNameUnique)"/> |
| <xsl:variable name="q_listenerID" select="concat($kind, '_', $inputOrReturn, '_q_listenerID_',$aeNameUnique, |
| if ($remote) then concat('_', $remote/@key) else '')"/> |
| <xsl:variable name="msgListenerContainerID" |
| select="concat($kind, '_', $inputOrReturn, '_msgLsnrCntnr_', $aeNameUnique, |
| if ($remote) then concat('_', $remote/@key) else '')"/> |
| |
| |
| <xsl:sequence select="f:generateLineComment(( |
| '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', |
| concat('JMS msg listener for ', $inputOrReturn, ' queue for:'), |
| $q_ID, |
| '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'),3)"/> |
| <bean id="{$q_listenerID}" |
| class="org.apache.uima.adapter.jms.activemq.JmsInputChannel"> |
| <property name="messageHandler" ref="{$msgHandlerChainID}"/> |
| <!--property name="endpointName" value="{if (f:isRmtTempQ($remote)) then '' else $q_endpointName}"/--> |
| <property name="endpointName" value="{if ($remote[self::u:remoteAnalysisEngine]) then '' else $q_endpointName}"/> |
| <property name="controller" ref="{$ctlrID}"/> |
| <xsl:if test="$inputOrReturn eq 'input'"> |
| <property name="listenerContainer" ref="{$msgListenerContainerID}"/> |
| </xsl:if> |
| </bean> |
| |
| |
| <xsl:sequence select="f:generateLineComment(( |
| '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', |
| concat('JMS msg listener container for ', $inputOrReturn, ' queue for:'), |
| $q_ID, |
| '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'),3)"/> |
| <bean id="{$msgListenerContainerID}" |
| class="org.apache.uima.adapter.jms.activemq.UimaDefaultMessageListenerContainer"> |
| |
| <xsl:if test="$poolingTaskExecutor"> |
| <xsl:sequence select="f:generateLineComment('Connect to pooling task executor for primitive',5)"/> |
| <property name="taskExecutor" ref="{$poolingTaskExecutor}"/> |
| </xsl:if> |
| |
| <xsl:sequence select="f:generateLineComment('Define number of JMS Consumers',5)"/> |
| <property name="concurrentConsumers" value="{$nbrConcurrentConsumers}"/> |
| |
| <xsl:sequence select="f:generateLineComment(concat($inputOrReturn, ' Queue'), 5)"/> |
| <xsl:choose> |
| <xsl:when test="$remote[self::u:remoteAnalysisEngine]"> |
| <property name="destinationResolver" ref="{f:getDestinationResolverID($aeNameUnique, $remote/@key)}"/> |
| <property name="destinationName" value="" /> |
| <property name="targetEndpoint" ref="{$q_endpointName}" /> |
| <xsl:sequence select="f:generateLineComment('POJO to delegate JMS Messages to', 5)"/> |
| <property name="messageListener" ref="{$q_listenerID}"/> |
| <property name="connectionFactory" ref="{$queueFactoryID}-reply"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <property name="destination" ref="{$q_ID}"/> |
| <xsl:sequence select="f:generateLineComment('POJO to delegate JMS Messages to', 5)"/> |
| <property name="messageListener" ref="{$q_listenerID}"/> |
| <property name="connectionFactory" ref="{$queueFactoryID}"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| |
| <xsl:if test="$inputOrReturn eq 'input'"> |
| <property name="messageSelector" value="Command=2000 OR Command=2002" /> <!-- Process or CPC request --> |
| </xsl:if> |
| </bean> |
| |
| <xsl:if test="$remote[self::u:remoteAnalysisEngine]"> |
| <xsl:sequence select="f:generateLineComment(( |
| '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', |
| concat('Destination Resolver for ',$remote/@key), |
| $q_ID, |
| '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'),3)"/> |
| <bean id="{f:getDestinationResolverID($aeNameUnique, $remote/@key)}" |
| class="org.apache.uima.adapter.jms.activemq.TempDestinationResolver" |
| singleton="false"> |
| <property name="connectionFactory" ref="{$queueFactoryID}-reply"/> |
| </bean> |
| </xsl:if> |
| |
| <xsl:if test="$inputOrReturn eq 'input'"> |
| <xsl:sequence select="f:generateLineComment(( |
| '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', |
| concat('GetMeta JMS msg listener container for ', $inputOrReturn, ' queue for:'), |
| $q_ID, |
| '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'),3)"/> |
| <bean id="{concat($msgListenerContainerID, '_getMeta')}" |
| class="org.apache.uima.adapter.jms.activemq.UimaDefaultMessageListenerContainer"> |
| |
| <!-- next commented out to have this bean use a different pool than the other one |
| because the other one has each thread "pinned" to a particular instance of |
| an analysis engine (so the ae always runs on the same thread, as required by |
| some impls (like python?) --> |
| <!--xsl:if test="$poolingTaskExecutor"> |
| <xsl:sequence select="f:generateLineComment('Connect to pooling task executor for primitive',5)"/> |
| <property name="taskExecutor" ref="{$poolingTaskExecutor}"/> |
| </xsl:if--> |
| |
| <xsl:sequence select="f:generateLineComment('Define number of JMS Consumers',5)"/> |
| <property name="concurrentConsumers" value="1"/> |
| |
| <xsl:sequence select="f:generateLineComment(concat($inputOrReturn, ' Queue'), 5)"/> |
| <property name="destination" ref="{$q_ID}"/> |
| |
| <xsl:sequence select="f:generateLineComment('POJO to delegate JMS Messages to', 5)"/> |
| <property name="messageListener" ref="{$q_listenerID}"/> |
| |
| <property name="connectionFactory" ref="{$queueFactoryID}"/> |
| <property name="messageSelector" value="Command=2001" /> <!-- getMeta request --> |
| </bean> |
| </xsl:if> |
| |
| </xsl:template> |
| |
| <!--================================================--> |
| <!-- Generate a Cas Multiplier Sync input Channel --> |
| <!--================================================--> |
| |
| <!-- note: NO LONGER USED as of UIMA-1019 design change --> |
| <!--xsl:template name="generateCMSyncInputChannel"> |
| <xsl:param name="aeNameUnique"/> |
| <xsl:param name="q_ID"/--> <!-- this is a descriptor-unique bean id of the input (or ret) q endpoint --> |
| <!--xsl:param name="queueFactoryID"/> |
| <xsl:param name="inputOrReturn"/--> <!-- input or return --> |
| <!--xsl:param name="kind"/--> <!-- either primitive or asAggr, used as 1st part of ctlr name --> |
| <!--xsl:param name="msgHandlerChainID"/> |
| <xsl:param name="nbrConcurrentConsumers"/> |
| <xsl:param name="remote"/--> <!-- is always () --> |
| <!--xsl:param name="poolingTaskExecutor"/> |
| |
| <xsl:variable name="q_listenerID" select="concat($kind, '_', $inputOrReturn, '_q_listenerID_',$aeNameUnique, |
| if ($remote) then concat('_', $remote/@key) else '')"/> |
| <xsl:variable name="msgListenerContainerID" select="concat($kind, '_', $inputOrReturn, '_msgLsnrCntnr_', $aeNameUnique, |
| if ($remote) then concat('_', $remote/@key) else '','__CasSync')"/> |
| |
| |
| <xsl:sequence select="f:generateLineComment(( |
| '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', |
| 'JMS msg listener container for ', |
| 'second listener handling messages from the throttle queue.', |
| 'This Q holds requests to free CAS Multiplier CASes', |
| 'back to the CM CAS Pool.', |
| concat($q_ID, '__CasSync'), |
| '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'),3)"/> |
| <bean id="{$msgListenerContainerID}" |
| class="org.apache.uima.adapter.jms.activemq.UimaDefaultMessageListenerContainer"--> |
| |
| <!-- next commented out - because pool instances are "pinned" to particular ae engine instances --> |
| <!--xsl:if test="$poolingTaskExecutor"> |
| <xsl:sequence select="f:generateLineComment('Connect to pooling task executor for primitive',5)"/> |
| <property name="taskExecutor" ref="{$poolingTaskExecutor}"/> |
| </xsl:if--> |
| |
| <!--xsl:sequence select="f:generateLineComment('Define number of JMS Consumers',5)"/> |
| <property name="concurrentConsumers" value="{$nbrConcurrentConsumers}"/> |
| |
| <xsl:sequence select="f:generateLineComment(concat($inputOrReturn, ' Queue'), 5)"/> |
| <property name="destination" ref="{concat($q_ID,'__CasSync')}"/> |
| |
| <xsl:sequence select="f:generateLineComment('POJO to delegate JMS Messages to', 5)"/> |
| <property name="messageListener" ref="{$q_listenerID}"/> |
| |
| <property name="connectionFactory" ref="{$queueFactoryID}"/> |
| </bean> |
| </xsl:template--> |
| |
| <!--==========================================--> |
| <!-- Generate an output Channel --> |
| <!--==========================================--> |
| <xsl:template name="generateOutputChannel"> |
| <xsl:param name="aeNode"/> |
| <xsl:param name="origin_q_name"/> |
| <xsl:param name="return_q_ID"/> |
| <xsl:param name="kind"/> |
| |
| <xsl:sequence select="f:generateLineComment(( |
| '==================================', |
| 'OutputChannel - for flows out of ', |
| 'this component, both to delegates', |
| '(if aggr) and back up to sender', |
| '==================================' |
| ), 3)"/> |
| |
| <bean id="{f:getOutputChannelID($aeNode)}" |
| class="org.apache.uima.adapter.jms.activemq.JmsOutputChannel" init-method="initialize"> |
| <property name="serviceInputEndpoint" value="{$origin_q_name}"/> |
| <property name="controller" ref="{f:getControllerID($aeNode)}" /> |
| <xsl:if test="$kind = 'asAggr'"> |
| <property name="controllerInputEndpoint" value="{$return_q_ID}" /> |
| </xsl:if> |
| </bean> |
| </xsl:template> |
| |
| <!-- ========================================================================= --> |
| <!-- async input: meta, processRequest --> |
| <!-- async internal: meta, processRequest, processResponse because used to --> |
| <!-- send to co-located delegates --> |
| <!-- primitive: meta, processRequest --> |
| <!-- ========================================================================= --> |
| <xsl:template name="generateMsgHandlerChain"> |
| <xsl:param name="aeNode"/> |
| <xsl:param name="kind"/> |
| <xsl:sequence select="$nl"/> |
| <xsl:sequence select="f:generateBlockComment( |
| (concat(' M E S S A G E H A N D L E R: ', $kind), |
| concat(' for controller: ', f:getControllerID($aeNode))), 3)"/> |
| |
| <xsl:sequence select="concat($nl,' ')"/> |
| |
| <!-- either generate "return" msg handlers or "receiving requests" msg handlers --> |
| <xsl:if test="$kind ne 'aggregate_return'"> |
| <bean id="{f:getMetaMsgHandlerID($aeNode, $kind)}" |
| class="org.apache.uima.aae.handler.input.MetadataRequestHandler_impl"> |
| <!-- Define handlers name --> |
| <constructor-arg index="0" value="MetadataRequestHandler"/> |
| <property name="controller" ref="{f:getControllerID($aeNode)}"/> |
| <!-- Link to the next handler in the chain --> |
| <property name="delegate" ref="{f:getProcessRequestHandlerID($aeNode, $kind)}"/> |
| </bean> |
| |
| <xsl:sequence select="$nl2"/> |
| <bean id="{f:getProcessRequestHandlerID($aeNode, $kind)}" class="org.apache.uima.aae.handler.input.ProcessRequestHandler_impl" > |
| <!-- Define handlers name --> |
| <constructor-arg index="0" value="ProcessRequestHandler"/> |
| <property name="controller" ref="{f:getControllerID($aeNode)}" /> |
| <!-- Link to the next handler in the chain --> |
| <!--xsl:if test="$kind eq 'aggregate_return'"> |
| <property name="delegate" ref="{f:getProcessResponseHandlerID($aeNode, $kind)}" /> |
| </xsl:if--> |
| </bean> |
| </xsl:if> |
| |
| <xsl:if test="$kind eq 'aggregate_return'"> |
| |
| <xsl:sequence select="$nl2"/> |
| <bean id="{f:getProcessResponseHandlerID($aeNode, 'aggregate_return')}" |
| class="org.apache.uima.aae.handler.input.ProcessResponseHandler" > |
| <!-- Define handlers name --> |
| <constructor-arg index="0" value="ProcessResponseHandler"/> |
| <property name="controller" ref="{f:getControllerID($aeNode)}" /> |
| <property name="delegate" ref="{f:getMetaMsgHandlerID($aeNode, concat($kind, '_response'))}" /> |
| </bean> |
| |
| <xsl:sequence select="$nl2"/> |
| <bean id="{f:getMetaMsgHandlerID($aeNode, concat($kind, '_response'))}" |
| class="org.apache.uima.aae.handler.input.MetadataResponseHandler_impl"> |
| <!-- Define handlers name --> |
| <constructor-arg index="0" value="MetadataResponseHandler"/> |
| <property name="controller" ref="{f:getControllerID($aeNode)}" /> |
| <property name="delegate" ref="{f:getProcessRequestHandlerID($aeNode, $kind)}" /> |
| </bean> |
| |
| <xsl:sequence select="$nl2"/> |
| <!-- the reason there is a ProcessRequest handler in the return queue is because |
| this is how Cas Multiplier things are handled --> |
| <bean id="{f:getProcessRequestHandlerID($aeNode, $kind)}" class="org.apache.uima.aae.handler.input.ProcessRequestHandler_impl" > |
| <!-- Define handlers name --> |
| <constructor-arg index="0" value="ProcessRequestHandler"/> |
| <property name="controller" ref="{f:getControllerID($aeNode)}" /> |
| </bean> |
| |
| </xsl:if> |
| |
| </xsl:template> |
| <!--============================================================--> |
| <!-- Standard Beans =--> |
| <!--============================================================--> |
| <xsl:template name="generateStandardBeans"> |
| |
| |
| <!-- no longer true need an internal broker if any of the following are true --> |
| <!-- A service is async = true (implies aggregate) |
| or The service specifies its input queue as "vm:..." |
| --> |
| |
| <!-- only generate for inputq = localhost. async=true handled with Java queue --> |
| <!-- removed: boolean(u:service/u:analysisEngine[@async eq 'true']) or --> |
| <!-- next removed per Jira UIMA-1288 |
| <xsl:if |
| test="boolean(u:service/u:inputQueue[@brokerURL='vm://localhost'])"> |
| |
| <xsl:sequence select="f:generateLineComment('connection factory for co-located things',3)"/> |
| <bean id="controllerJmsFactory" |
| class="org.apache.activemq.ActiveMQConnectionFactory" |
| depends-on="brokerDeployerService"> |
| <property name="brokerURL" value="vm://localhost"/> |
| <property name="prefetchPolicy" ref="prefetchPolicy"/> |
| </bean> |
| </xsl:if> |
| --> |
| |
| <!-- no longer for async=true, only for inputq = localhost --> |
| <!-- next removed per Jira UIMA-1288 |
| <xsl:if test="boolean(u:service/u:inputQueue[@brokerURL='vm://localhost'])"> |
| <xsl:sequence select="f:generateLineComment('Deploys a co-located broker',3)"/> |
| <bean id="brokerDeployerService" class="org.apache.uima.adapter.jms.activemq.BrokerDeployer"> |
| <constructor-arg index="0" value="{1000 * 1024 * 1024}"/> |
| </bean> |
| |
| </xsl:if> |
| --> |
| <!-- |
| <xsl:message select="$uniqueInputQueueBrokers"/> |
| <xsl:message select="name($uniqueInputQueueBrokers/u:inputQueue)"/> |
| <xsl:message>*** unique Input Queue Brokers ***</xsl:message> |
| <xsl:message select="name($uniqueInputQueueBrokers/holder) = ''"/> |
| |
| <xsl:message>*** end unique Input Queue Brokers ***</xsl:message> --> |
| |
| <!-- all input queues except the vm://localBroker one --> |
| <xsl:for-each select="$uniqueInputQueueBrokers/u:inputQueue"> |
| <xsl:sequence select="f:generateLineComment( |
| ('Factory for specific external queue broker:', |
| @brokerURL),3)"/> |
| <bean id="{f:getQbrokerID(.)}" |
| class="org.apache.activemq.ActiveMQConnectionFactory"> |
| <property name="brokerURL" value="{@brokerURL}"/> |
| <property name="prefetchPolicy" ref="prefetchPolicy"/> |
| </bean> |
| </xsl:for-each> |
| |
| <!-- all input queues except the vm://localBroker one --> |
| <xsl:for-each select="$uniqueInputQueueBrokers/u:inputQueue"> |
| <xsl:sequence select="f:generateLineComment( |
| ('Factory for specific external queue broker:', |
| @brokerURL),3)"/> |
| <bean id="{f:getQbrokerID(.)}-reply" |
| class="org.apache.activemq.ActiveMQConnectionFactory"> |
| <property name="brokerURL" value="{@brokerURL}"/> |
| <property name="prefetchPolicy" ref="prefetchPolicy-reply"/> |
| </bean> |
| </xsl:for-each> |
| |
| <!-- Creates an instance of the ResourceManager --> |
| <xsl:sequence select="f:generateLineComment('Creates an instance of the ResourceManager',3)"/> |
| <bean id="resourceManager" class="org.apache.uima.aae.UimaClassFactory" |
| factory-method="produceResourceManager" singleton="true"/> |
| |
| <!-- Creates an instance of the CasManager --> |
| <xsl:sequence select="f:generateLineComment('Creates an instance of the CasManager',3)"/> |
| <bean id="casManager" class="org.apache.uima.aae.AsynchAECasManager_impl" singleton="true" > |
| <constructor-arg index="0" ref="resourceManager"/> |
| <xsl:sequence select="f:generateLineComment('Defines how many CASes will be in the CAS pool',5)"/> |
| <property name="casPoolSize" value="{u:casPool/@numberOfCASes}" /> |
| <xsl:if test="u:casPool/@initialFsHeapSize"> |
| <xsl:sequence select="f:generateLineComment('Initial heap size for CASes',5)"/> |
| <property name="initialFsHeapSize" value="{if (u:casPool/@initialFsHeapSize eq 'defaultFsHeapSize') |
| then '2000000' |
| else u:casPool/@initialFsHeapSize}" /> |
| </xsl:if> |
| </bean> |
| |
| <!-- create bean to do placeholder substitution Jira UIMA-1288 --> |
| <bean id="placeholderSubstitution" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> |
| <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> |
| </bean> |
| |
| <!-- Creates a Shared Cache --> |
| <xsl:sequence select="f:generateLineComment('Creates a Shared Cache',3)"/> |
| <bean id="inProcessCache" class="org.apache.uima.aae.InProcessCache" /> |
| |
| <xsl:sequence select="f:generateLineComment('Create prefetch policy', 3)"/> |
| |
| <bean id="prefetchPolicy" class="org.apache.activemq.ActiveMQPrefetchPolicy"> |
| <property name="queuePrefetch" |
| value="{u:service/u:inputQueue/@prefetch}"/> |
| </bean> |
| |
| <bean id="prefetchPolicy-reply" class="org.apache.activemq.ActiveMQPrefetchPolicy"> |
| <property name="queuePrefetch" |
| value="1"/> |
| </bean> |
| |
| <xsl:call-template name="generateErrorConfigDetails"/> |
| </xsl:template> |
| |
| |
| <xsl:template match="u:delegates"> |
| |
| <xsl:variable name="aggrNode" select="parent::node()"/> |
| |
| <!--xsl:message select="' *** in delegates ***'"/--> |
| |
| <xsl:for-each select="u:analysisEngine"> |
| |
| <xsl:variable name="iqn" select="f:getInternalInputQueueName(.)"/> |
| |
| <!-- no longer generate internal input queues - switched to using Java queues |
| <xsl:sequence select="f:generateLineComment(( |
| '~~~~~~~~~~~~~~~~~~~~~~~~~~~', |
| 'Internal Input Queue for', |
| @key, |
| '~~~~~~~~~~~~~~~~~~~~~~~~~~~'), 3)"/> |
| <bean id="{$iqn}" |
| class="org.apache.activemq.command.ActiveMQQueue"> |
| <constructor-arg index="0" value="{$iqn}"/> |
| </bean> |
| --> |
| |
| <xsl:apply-templates select="."> |
| <xsl:with-param tunnel="yes" name="input_q_ID" select="$iqn"/> |
| <xsl:with-param tunnel="yes" name="inputQueueFactoryID" select="'controllerJmsFactory'"/> |
| </xsl:apply-templates> |
| </xsl:for-each> |
| |
| <xsl:apply-templates select="u:remoteAnalysisEngine"/> |
| |
| </xsl:template> |
| |
| <!--============================================================--> |
| <!-- do nothing template - if not here, get the value=--> |
| <!-- outputted by default =--> |
| <!--============================================================--> |
| |
| <xsl:template match="u:environmentVariable"/> |
| |
| <!--============================================================--> |
| <!-- pass 1 - put in defaults =--> |
| <!--============================================================--> |
| |
| <!-- ddd = deployment descriptor with defaults --> |
| <xsl:variable name="ddd"> |
| <!-- <xsl:message>Applying defaults to</xsl:message> |
| <xsl:message select="."/> --> |
| <xsl:sequence select="f:validateDeploymentDescriptor(u:analysisEngineDeploymentDescription)"/> |
| <xsl:variable name="result"> |
| <xsl:apply-templates mode="addDefaults" select="u:analysisEngineDeploymentDescription"/> |
| </xsl:variable> |
| <!--xsl:message select="'start of default output'"/> |
| <xsl:message select="$result"/> |
| <xsl:message select="'end of default output'"/--> |
| <xsl:sequence select="$result"/> |
| </xsl:variable> |
| |
| <xsl:template mode="addDefaults" match= |
| "u:analysisEngineDeploymentDescription| |
| u:topDescriptor| |
| u:import| |
| u:name| |
| u:description| |
| u:version| |
| u:vendor| |
| u:casManagement| |
| u:errorHandling| |
| u:timeout| |
| u:exception| |
| u:userErrorHandler| |
| u:userErrorHandlerSpec |
| "> |
| <!--xsl:sequence select="f:validate(.)"/--> |
| <xsl:copy> |
| <xsl:copy-of select='@*'/> |
| <xsl:apply-templates mode="addDefaults"/> |
| </xsl:copy> |
| </xsl:template> |
| |
| <xsl:template mode="addDefaults" match="u:deployment[@protocol='jms' and @provider='activemq']" > |
| <!--xsl:sequence select="f:validate(.)"/--> |
| <u:deployment protocol="jms" provider="activemq"> |
| <xsl:choose> |
| <xsl:when test="not(u:casPool)"> |
| <xsl:choose> |
| <xsl:when test= "u:service/u:analysisEngine[(not(@async)) or (@async = ('no', 'false'))]/u:scaleout/@numberOfInstances"> |
| <u:casPool numberOfCASes="{u:service/u:analysisEngine[(not(@async)) or (@async = ('no', 'false'))]/u:scaleout/@numberOfInstances}" |
| initialFsHeapSize="defaultFsHeapSize"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <u:casPool numberOfCASes="1" initialFsHeapSize="defaultFsHeapSize"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:when> |
| |
| <xsl:otherwise> |
| <!-- casPool argument provided. verify that the number of instances is >= scaleout if scaleout is present --> |
| <!-- DONE later in this defaulting code - also handle case where not all parameters were specified --> |
| </xsl:otherwise> |
| </xsl:choose> |
| <xsl:apply-templates mode="addDefaults"/> |
| </u:deployment> |
| </xsl:template> |
| |
| <!-- allow old services for now --> |
| <xsl:template mode="addDefaults" match="u:services"> |
| <!--xsl:sequence select="f:validate(.)"/--> |
| <xsl:apply-templates mode="addDefaults"> |
| <!-- keyPath is the list of keys with / inbetween, from the associated AE descriptor expansion, |
| for delegates, used to identify a particular one in case of errors --> |
| <xsl:with-param name="keyPath" tunnel="yes" select="''"/> |
| </xsl:apply-templates> |
| </xsl:template> |
| |
| <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> |
| <!-- D E F A U L T: --> |
| <!-- <casPool> --> |
| <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> |
| <xsl:template mode="addDefaults" match="u:casPool"> |
| |
| <!-- UIMA-1666 |
| if it's an non-async primitive at the top level which is scaled out, |
| if the scaleout != the caspool size, give a warning message and force the caspool size to be the scaleout |
| --> |
| <xsl:variable name="isTopLvlSync" as="xs:boolean" select= |
| "if (../u:service/u:analysisEngine[(not(@async)) or (@async = ('no', 'false'))]) then fn:true() else fn:false()"/> |
| |
| <xsl:variable name="nbrInstances" select="../u:service/u:analysisEngine/u:scaleout/@numberOfInstances"/> |
| |
| <xsl:variable name="casPoolSize" as="xs:integer"> |
| <xsl:choose> |
| <xsl:when test="$isTopLvlSync and |
| $nbrInstances and |
| ./@numberOfCASes and |
| ($nbrInstances ne ./@numberOfCASes)"> |
| <xsl:sequence select="f:msgWithLineNumber( |
| 'WARN', |
| ('Top level Async Primitive specifies a scaleout of', $nbrInstances, |
| ', but also specifies a Cas Pool size of', ./@numberOfCASes, |
| '. The Cas Pool size is being forced to be the same as the scaleout.'), |
| .)"/> |
| <xsl:sequence select="$nbrInstances"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:sequence select="if (./@numberOfCASes) then ./@numberOfCASes else '1'"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| |
| <u:casPool numberOfCASes="{$casPoolSize}" |
| initialFsHeapSize="{if (./@initialFsHeapSize) then ./@initialFsHeapSize else 'defaultFsHeapSize'}"/> |
| </xsl:template> |
| |
| <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> |
| <!-- D E F A U L T: --> |
| <!-- <service> --> |
| <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> |
| <xsl:template mode="addDefaults" match="u:service"> |
| <!--xsl:sequence select="f:validate(.)"/--> |
| <xsl:variable name="ae_descriptor" select="f:getImport(u:topDescriptor/u:import)"/> |
| <!--xsl:message select="'*** top descriptor'"/> |
| <xsl:message select="$ae_descriptor"/--> |
| |
| <xsl:variable name="isTopLvlCpp" as="xs:string" |
| select="if (f:isCPP($ae_descriptor) and |
| (u:custom/@name eq 'run_top_level_CPP_service_as_separate_process')) |
| then 'yes' else 'no'"/> |
| <u:service i:isTopLvlCpp="{$isTopLvlCpp}"> |
| |
| <xsl:for-each select="u:custom"> |
| <xsl:copy-of select="."/> |
| </xsl:for-each> |
| |
| <xsl:choose> |
| <xsl:when test="u:inputQueue"> |
| <xsl:if test="not(starts-with(u:inputQueue/@brokerURL, 'tcp://')) and |
| not(starts-with(u:inputQueue/@brokerURL, '${')) and |
| @brokerURL"> |
| <xsl:sequence select="f:msgWithLineNumber( |
| 'ERROR', |
| 'top level input Queue broker protocol must be tcp:// for a top level C++ component', |
| .)"/> |
| </xsl:if> |
| <xsl:apply-templates mode="addDefaults" select="u:inputQueue"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:sequence select="f:msgWithLineNumber( |
| 'ERROR', |
| 'top level service element must have an inputQueue element', |
| .)"/> |
| <!--xsl:message select="'ERROR: top level service element must have an inputQueue element'"/--> |
| </xsl:otherwise> |
| </xsl:choose> |
| |
| <!--xsl:copy-of select="u:topDescriptor"/ not used in pass 2 --> |
| <xsl:if test="not(u:topDescriptor/u:import/(@location|@name))"> |
| <xsl:sequence select="f:msgWithLineNumber( |
| 'ERROR', |
| ('Service', string(u:inputQueue/@endpoint), 'missing required topDescriptor element'), |
| .)"/> |
| |
| <!--xsl:message select= |
| "concat('ERROR: Service ', u:inputQueue/@endpoint, ' missing required topDescriptor element')"/--> |
| </xsl:if> |
| |
| <xsl:choose> |
| <xsl:when test="$isTopLvlCpp eq 'yes'"> |
| <xsl:copy-of select="u:environmentVariables"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:if test="u:environmentVariables"> |
| <xsl:sequence select="f:msgWithLineNumber( |
| 'ERROR', |
| ('Service element contains an environmentVariables element,', $nl, |
| 'but the referenced top-level descriptor isn''t a C++ component'), |
| .)"/> |
| </xsl:if> |
| </xsl:otherwise> |
| </xsl:choose> |
| |
| <xsl:variable name="generatedAE"> |
| <!-- wrap the intended fragment in a service so that later, other code can |
| test the parent to see it is the top level one --> |
| <u:service> |
| <u:analysisEngine key="{u:inputQueue/(@endpoint|@queueName)}" async="false"/> |
| </u:service> |
| </xsl:variable> |
| |
| <!--xsl:message select="'*** u:service/* '"/> |
| <xsl:message select="."/--> |
| <xsl:variable name="topLevelAe" |
| select="if (u:analysisEngine) then u:analysisEngine else $generatedAE/u:service/u:analysisEngine"/> |
| |
| <!--xsl:message select="'top descriptor/import'"/> |
| <xsl:message select="u:topDescriptor/u:import"/--> |
| <xsl:variable name="aePath" select="f:fixupPath(u:topDescriptor/u:import, '.')"/> |
| <xsl:apply-templates mode="addDefaults" select="$topLevelAe"> |
| <xsl:with-param name="defaultErrorConfig" tunnel="yes" select="'topAe'"/> |
| <xsl:with-param name="local_ae_descriptor" tunnel="yes" select="$ae_descriptor"/> |
| <xsl:with-param tunnel="yes" name="local_ae_descriptor_file_path" select="$aePath"/> |
| </xsl:apply-templates> |
| |
| </u:service> |
| </xsl:template> |
| |
| <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> |
| <!-- D E F A U L T: --> |
| <!-- <inputQueue> --> |
| <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> |
| <xsl:template mode="addDefaults" match="u:inputQueue"> |
| <!--xsl:sequence select="f:validate(.)"/--> |
| |
| <!--xsl:message select="'*** defaulting inputqueue'"/> |
| <xsl:message select="@brokerURL"/--> |
| <xsl:if test="not(@endpoint or @queueName)"> |
| <xsl:sequence select="f:msgWithLineNumber('ERROR', 'missing endpoint name in inputQueue element', .)"/> |
| <!--xsl:message select="'ERROR: missing endpoint name in inputQueue element'"/--> |
| <xsl:message select="."/> |
| </xsl:if> |
| <xsl:if test="@brokerURL eq 'vm://localhost'"> |
| <xsl:sequence select="f:msgWithLineNumber( |
| 'ERROR', |
| 'broker protocol of vm://localhost not supported', |
| .)"/> |
| </xsl:if> |
| <xsl:choose> |
| <xsl:when test="../../u:remoteAnalysisEngine"> |
| <xsl:choose> |
| <xsl:when test="not(@brokerURL)"> |
| <!-- no longer an error - see UIMA-1288 --> |
| <!--xsl:sequence select="f:msgWithLineNumber( |
| 'ERROR', |
| 'remote input Queue broker protocol must be specified', |
| .)"/--> |
| <u:inputQueue brokerURL="{'${defaultBrokerURL}'}" |
| endpoint="{if (@endpoint) then @endpoint |
| else if (@queueName) then @queueName |
| else ''}" |
| prefetch="{if (@prefetch) then @prefetch else '0'}"/> |
| </xsl:when> |
| <xsl:when test="starts-with(@brokerURL, 'vm://')"> |
| <xsl:sequence select="f:msgWithLineNumber( |
| 'ERROR', |
| 'remote input Queue broker protocol cannot be a vm://... protocol', |
| .)"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <u:inputQueue brokerURL="{@brokerURL}" |
| endpoint="{if (@endpoint) then @endpoint |
| else if (@queueName) then @queueName |
| else ''}" |
| prefetch="{if (@prefetch) then @prefetch else '0'}"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:when> |
| <xsl:otherwise> |
| <u:inputQueue brokerURL="{if (@brokerURL) then @brokerURL else '${defaultBrokerURL}'}" |
| endpoint="{if (@endpoint) then @endpoint |
| else if (@queueName) then @queueName |
| else ''}" |
| prefetch="{if (@prefetch) then @prefetch else '0'}"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:template> |
| |
| <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> |
| <!-- D E F A U L T: --> |
| <!-- <analysisEngine> --> |
| <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> |
| |
| <xsl:template mode="addDefaults" match="u:analysisEngine"> |
| <xsl:param tunnel="yes" name="local_ae_descriptor"/> |
| <xsl:param tunnel="yes" name="defaultErrorConfig"/> |
| <xsl:param tunnel="yes" name="local_ae_descriptor_file_path"/> |
| <xsl:param tunnel="yes" name="keyPath"/> |
| |
| <!--xsl:message select="'******************start local ae descriptor'"/> |
| <xsl:message select="$local_ae_descriptor"/> |
| <xsl:message select="'******************end local ae descriptor'"/--> |
| |
| <!--xsl:sequence select="f:validate(.)"/--> |
| <xsl:variable name="key" as="xs:string"> |
| <xsl:choose> |
| <xsl:when test="@key"> |
| <xsl:sequence select="@key"/> |
| </xsl:when> |
| <xsl:when test="parent::u:service"> |
| <!-- |
| <xsl:message select="'*** top key'"/> |
| <xsl:message select="parent::node()/u:topDescriptor/u:import/@location"/> --> |
| <xsl:sequence select="parent::u:service/u:inputQueue/(@endpoint|@queueName)"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:sequence select="f:msgWithLineNumber( |
| 'ERROR', 'required key name missing in delegate', .)"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| |
| <!--xsl:message select="'key is'"/> |
| <xsl:message select="$key"/ --> |
| |
| <xsl:if test="@async = ('yes', 'no')"> |
| <xsl:sequence select="f:msgWithLineNumber('WARNING', |
| ('deployment descriptor for analysisEngine:', $keyPath, |
| 'specifies', @async, ' but the async value should be true or false'), |
| .)"/> |
| </xsl:if> |
| |
| <xsl:variable name="async"> |
| <xsl:choose> |
| <xsl:when test="(string(@async) = ('yes','true')) and |
| not(f:isAggr($local_ae_descriptor))"> |
| <xsl:sequence select="f:msgWithLineNumber('ERROR', |
| ('deployment descriptor for analysisEngine:', $keyPath, |
| 'specifies async="true" but the analysis engine is a primitive'), |
| .)"/> |
| <xsl:value-of select="'false'"/> |
| </xsl:when> |
| <xsl:when test="(string(@async) = ('yes','true')) and |
| f:isCPP($local_ae_descriptor)"> |
| <xsl:sequence select="f:msgWithLineNumber('ERROR', |
| ('deployment descriptor for analysisEngine:', $keyPath, |
| 'specifies async=''true''; but this isn''t supported for CPP components'), |
| .)"/> |
| <xsl:value-of select="'false'"/> |
| </xsl:when> |
| <xsl:when test="not(string(@async) = ('yes', 'no', 'true', 'false', ''))"> |
| <xsl:sequence select="f:msgWithLineNumber('ERROR', |
| ('deployment descriptor for analysisEngine:', $keyPath, |
| 'specifies', concat('async="', string(@async), |
| '", but only true or false are allowed as values.')), |
| .)"/> |
| <xsl:value-of select="if (f:isAggr($local_ae_descriptor)) then 'true' else 'false'"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:sequence select= |
| "if (@async) then if (string(@async) = ('yes', 'true')) then 'true' else 'false' |
| else if (u:delegates and not(f:isCPP($local_ae_descriptor))) then 'true' else 'false'"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| |
| <xsl:if test="(string($async) = ('false', 'no')) and u:delegates"> |
| <xsl:sequence select="f:msgWithLineNumber('ERROR', |
| ('deployment descriptor for analysisEngine:', $keyPath, |
| 'specifies false for the async attribute, but contains a delegates element, which is not allowed in this case.'), .)"/> |
| </xsl:if> |
| |
| <!--xsl:sequence select="f:msgWithLineNumber('INFO', |
| ('deployment descriptor for AE:', $key, |
| 'has delegate?', if (u:delegates) then 'true' else 'false', |
| 'async is:', $async), .)"/--> |
| |
| |
| <xsl:variable name="internalReplyQueueScaleout" as="xs:string"> |
| <!-- next choose commentted out because it disallowed internal reply q scaleout |
| for primitives - but this could be needed for primitives which are |
| CAS multipliers --> |
| <!--xsl:choose> |
| <xsl:when test="(string($async) = 'false') and @internalReplyQueueScaleout"> |
| <xsl:sequence select="f:msgWithLineNumber('WARN', |
| ('deployment descriptor for analysisEngine:', $key, |
| 'specifies', concat('internalReplyQueueScaleout="', string(@internalReplyQueueScaleout), |
| '", this is ignored for async="false" analysisEngine specifications.')), |
| .)"/> |
| <xsl:value-of select="'1'"/> |
| </xsl:when> |
| <xsl:otherwise--> |
| <xsl:sequence select="if (@internalReplyQueueScaleout) then @internalReplyQueueScaleout else '1'"/> |
| <!--/xsl:otherwise> |
| </xsl:choose--> |
| </xsl:variable> |
| |
| <xsl:variable name="inputQueueScaleout" as="xs:string"> |
| <xsl:choose> |
| <xsl:when test="(string($async) = 'false') and @inputQueueScaleout"> |
| <xsl:sequence select="f:msgWithLineNumber('WARN', |
| ('deployment descriptor for analysisEngine:', $keyPath, |
| 'specifies', concat('inputQueueScaleout="', string(@inputQueueScaleout), |
| '", this is ignored for async="false" analysisEngine specifications.'), |
| 'Use the scaleout numberOfInstances=xx element instead for this, for primitives.'), |
| .)"/> |
| <xsl:value-of select="'1'"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:sequence select="if (@inputQueueScaleout) then @inputQueueScaleout else '1'"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| |
| <u:analysisEngine key="{$key}" async="{$async}" |
| internalReplyQueueScaleout="{$internalReplyQueueScaleout}" |
| inputQueueScaleout ="{$inputQueueScaleout}"> |
| |
| <i:local_ae_descriptor file_path="{$local_ae_descriptor_file_path[1]}"> |
| <!--xsl:message select="'local_ae_descriptor'"/> |
| <xsl:message select="$local_ae_descriptor"/--> |
| <xsl:sequence select="$local_ae_descriptor"/> |
| </i:local_ae_descriptor> |
| |
| <!--xsl:apply-templates mode="addDefaults" select="u:casMultiplier"/--> |
| <xsl:choose> |
| <xsl:when test="(string($local_ae_descriptor/*/u:analysisEngineMetaData/u:operationalProperties/u:outputsNewCASes) eq 'true') |
| or $local_ae_descriptor/u:collectionReaderDescription"> |
| <!--xsl:if test="u:casMultiplier"> |
| <xsl:sequence select="f:validate(u:casMultiplier)"/> |
| </xsl:if--> |
| <xsl:choose> |
| <xsl:when test="u:casMultiplier"> |
| <xsl:if test="(string($async) eq 'true') and |
| (u:casMultiplier/@poolSize or |
| u:casMultiplier/@initialFsHeapSize)"> |
| <xsl:sequence select="f:msgWithLineNumber('WARNING', |
| ('casMultiplier settings for poolSize (', u:casMultiplier/@poolSize, |
| ') and initialFsHeapSize (', u:casMultiplier/@initialFsHeapSize, ')', |
| $nl, 'will be ignored', |
| 'for the analysisEngine with key=', $keyPath, $nl, |
| 'because the pool specs are set using the contained delegate cas multiplier specification.' |
| ), |
| .)"/> |
| </xsl:if> |
| <xsl:if test="parent::u:service and u:casMultiplier/@processParentLast"> |
| <xsl:sequence select="f:msgWithLineNumber('WARNING', |
| ('casMultiplier settings for processParentLast will be ignored', |
| 'for the top-level analysisEngine with key=', $key, $nl, |
| 'To specify this value for the top level,', |
| 'specify it on the containing (remote) aggregate for this service.' |
| ), |
| .)"/> |
| </xsl:if> |
| |
| <!-- the above conditionally printed warnings |
| The below generates the properly defaulted element --> |
| <xsl:choose> |
| <xsl:when test="(string($async) eq 'true') and not(parent::u:service)"> |
| <u:casMultiplier |
| processParentLast="{if (u:casMultiplier/@processParentLast) then u:casMultiplier/@processParentLast else 'false'}" |
| /> |
| </xsl:when> |
| <!-- top level async: no cas multiplier settings are used |
| size etc from contained CM; |
| processParentLast not applicable for top level - |
| uses (remote) containing aggregate's setting, if any |
| |
| However the casMultiplier element is generated so that |
| a Second Input Q is built for messages from remote cas |
| Multipliers, at the top level --> |
| <xsl:when test="string($async) eq 'true'"> |
| <u:casMultiplier/> |
| </xsl:when> |
| |
| <!-- case async = false and not top level --> |
| <xsl:when test="not(parent::u:service)"> |
| <u:casMultiplier poolSize="{if (u:casMultiplier/@poolSize) then u:casMultiplier/@poolSize else '1'}" |
| initialFsHeapSize="{if (u:casMultiplier/@initialFsHeapSize) then u:casMultiplier/@initialFsHeapSize else '2000000'}" |
| processParentLast="{if (u:casMultiplier/@processParentLast) then u:casMultiplier/@processParentLast else 'false'}" |
| /> |
| </xsl:when> |
| <!-- case async = false, top level --> |
| <xsl:otherwise> |
| <u:casMultiplier poolSize="{if (u:casMultiplier/@poolSize) then u:casMultiplier/@poolSize else '1'}" |
| initialFsHeapSize="{if (u:casMultiplier/@initialFsHeapSize) then u:casMultiplier/@initialFsHeapSize else '2000000'}" |
| /> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:when> |
| |
| <!-- after this point, have a cas multiplier, without a <casMultiplier> element --> |
| |
| |
| <!-- async true, not top level --> |
| <xsl:when test="(string($async) eq 'true') and |
| (not(parent::u:service))"> |
| <xsl:sequence select="f:msgWithLineNumber('WARN', |
| ('Deployment descriptor for analysisEngine:', $keyPath, |
| 'is for a non-top-level CAS Multiplier (or Collection Reader wrapped as a CAS Multiplier).', $nl, |
| 'However, the <casMultiplier> element is missing.', $nl, |
| 'The <casMultiplier> element is only used here for specifying the processParentLast attribute.', $nl, |
| 'Defaulting to a processParentLast to false for this case, to', |
| 'let the parent flow with its chlidren.'), |
| .)"/> |
| <u:casMultiplier processParentLast="false"/> |
| </xsl:when> |
| |
| <!-- async true top level - no cas multiplier settings are used |
| size etc from contained CM; |
| processParentLast not applicable for top level - |
| uses (remote) containing aggregate's setting, if any |
| |
| However the casMultiplier element is generated so that |
| a Second Input Q is built for messages from remote cas |
| Multipliers, at the top level --> |
| <xsl:when test="(string($async) eq 'true') and |
| (parent::u:service)"> |
| <u:casMultiplier/> |
| </xsl:when> |
| |
| <!-- async = false, and not top level --> |
| <xsl:when test="not(parent::u:service)"> |
| <xsl:sequence select="f:msgWithLineNumber('WARN', |
| ('Deployment descriptor for analysisEngine:', $key, $keyPath, |
| ' is for a synchronous CAS Multiplier (not top level) (or Collection Reader wrapped as a CAS Multiplier).', $nl, |
| 'However, the <casMultiplier> element is missing.', $nl, |
| 'Defaulting to a poolSize of 1, initialFsHeapSize of 2,000,000.', $nl, |
| 'Defaulting to a processParentLast to false for this case, to', |
| 'let the parent flow with its chlidren.'), |
| .)"/> |
| <u:casMultiplier poolSize="1" initialFsHeapSize="2000000" processParentLast="false"/> |
| </xsl:when> |
| |
| <!--xsl:when test="u:casMultiplier/@poolSize"> |
| <xsl:copy-of select="u:casMultiplier"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:sequence select="f:msgWithLineNumber('ERROR', |
| ('deployment descriptor for analysisEngine:', $key, |
| 'is for a CAS Multiplier (or Collection Reader wrapped as a CAS Multiplier), but no pool size is specified'), |
| .)"/> |
| <u:casMultiplier poolSize="1" initialFsHeapSize="2000000"/> |
| </xsl:otherwise--> |
| </xsl:choose> |
| </xsl:when> |
| <xsl:otherwise> <!-- is not a cas multiplier --> |
| <xsl:if test="u:casMultiplier"> |
| <xsl:sequence select="f:msgWithLineNumber('ERROR', |
| ('deployment descriptor for analysisEngine:', $keyPath, |
| 'specifies a casMultiplier element, but the analysisEngine is not a CAS multiplier'), |
| .)"/> |
| </xsl:if> |
| </xsl:otherwise> |
| </xsl:choose> |
| |
| <!-- xsl:message select="('parent of ae:', parent::u:service)"/--> |
| <xsl:choose> |
| <xsl:when test="parent::u:service"> |
| <xsl:choose> |
| <xsl:when test="u:asyncPrimitiveErrorConfiguration"> |
| <xsl:apply-templates mode="addDefaults" select="u:asyncPrimitiveErrorConfiguration"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:variable name="primErr"> |
| <u:asyncPrimitiveErrorConfiguration/> |
| </xsl:variable> |
| <xsl:apply-templates mode="addDefaults" select="$primErr"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:choose> |
| <xsl:when test="u:asyncAggregateErrorConfiguration"> |
| <xsl:apply-templates mode="addDefaults" select="u:asyncAggregateErrorConfiguration"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:variable name="aggrErr"> |
| <u:asyncAggregateErrorConfiguration/> |
| </xsl:variable> |
| <xsl:apply-templates mode="addDefaults" select="$aggrErr"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:otherwise> |
| </xsl:choose> |
| |
| <xsl:if test="$async eq 'true'"> |
| <xsl:if test="$local_ae_descriptor/*/u:flowController"> |
| <!--xsl:message select="$local_ae_descriptor"/> |
| <xsl:message select="f:fixupPath($local_ae_descriptor/*/u:flowController/u:import, $local_ae_descriptor_file_path[2])[1]"/--> |
| <i:flowController file_path="{f:fixupPath($local_ae_descriptor/*/u:flowController/u:import, $local_ae_descriptor_file_path[2])[1]}"/> |
| </xsl:if> |
| <!--xsl:message select="'*** u:ae w delegates/* '"/> |
| <xsl:message select="."/--> |
| |
| <!--xsl:sequence select="f:validate(u:delegates)"/--> |
| |
| <xsl:call-template name="defaultDelegates"> |
| <xsl:with-param name="ddDelegates" select="u:delegates/*"/> |
| </xsl:call-template> |
| </xsl:if> |
| |
| <xsl:if test="$async = ('false', 'no')"> |
| <xsl:choose> |
| <xsl:when test="u:scaleout"> |
| <!--xsl:message select="'*** defaulting scaleout'"/> |
| <xsl:message select="u:scaleout"/--> |
| <u:scaleout numberOfInstances="{if (u:scaleout/@numberOfInstances) then u:scaleout/@numberOfInstances else 1}"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <u:scaleout numberOfInstances="1"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:if> |
| </u:analysisEngine> |
| </xsl:template> |
| |
| <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> |
| <!-- D E F A U L T: --> |
| <!-- <delegates> --> |
| <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> |
| <xsl:template name="defaultDelegates"> |
| <xsl:param name="ddDelegates"/> <!-- analysisEngine(s) or remoteAnalysisEngine(s) --> |
| <xsl:param tunnel="yes" name="defaultErrorConfig"/> |
| <xsl:param tunnel="yes" name="local_ae_descriptor"/> |
| <xsl:param tunnel="yes" name="local_ae_descriptor_file_path"/> |
| <xsl:param tunnel="yes" name="keyPath"/> |
| |
| <xsl:variable name="nextLevelDefaultErrorConfig" select= |
| "if ($defaultErrorConfig eq 'topAe') then 'topDelegate' else 'none'"/> |
| |
| <xsl:variable name="delegatesFromLocalAeDescriptor" select= |
| "$local_ae_descriptor/(u:analysisEngineDescription|u:taeDescription)/u:delegateAnalysisEngineSpecifiers/u:delegateAnalysisEngine"/> |
| |
| <xsl:for-each select="$ddDelegates"> |
| <xsl:if test="not($delegatesFromLocalAeDescriptor[@key = current()/@key])"> |
| <xsl:sequence select="f:msgWithLineNumber('ERROR', |
| ('The delegate in the deployment descriptor with', @key, ' does not match any delegates in the referenced descriptor'), |
| .)"/> |
| </xsl:if> |
| |
| </xsl:for-each> |
| |
| <!-- next limitation lifted for 2.3.0 |
| <xsl:if test="count($ddDelegates[self::u:remoteAnalysisEngine[u:casMultiplier]]) > 1"> |
| <xsl:sequence select="f:msgWithLineNumber('ERROR', |
| ('More than one remote delegate is a CAS Multiplier. This implementation only supports having one'), |
| .)"/> |
| </xsl:if> |
| --> |
| |
| <u:delegates> |
| <xsl:for-each select="$delegatesFromLocalAeDescriptor"> |
| |
| <xsl:variable name="delegateAE" select="f:getDelegatePart($local_ae_descriptor, @key)"/> |
| <!--sl:message select="('*** debug delegate from localAE:', @key)"/--> |
| <!--xsl:message select="$ddDelegates"/--> |
| <xsl:variable name="aeOrRemote" as="node()"> |
| <xsl:choose> |
| <xsl:when test="$ddDelegates[string(@key) = string(current()/@key)]"> |
| <xsl:sequence select="$ddDelegates[string(@key) eq string(current()/@key)]"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <!-- next line commented out - |
| Wrong logic |
| If a deployment descriptor doesn't have a analysisEngine or remoteAnalysisEngine |
| for a delegate, make the default for this always be asynch = false |
| --> |
| <!-- u:analysisEngine key="{@key}" async="{if (f:isAggr($delegateAE)) then 'true' else 'false'}"/--> |
| <u:analysisEngine key="{@key}" async="false"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| |
| <!--xsl:message select="concat( |
| '*** aeOrRemote defaulting, errorConfig Flag is ', $nextLevelDefaultErrorConfig)"/--> |
| <!--xsl:message select="$aeOrRemote"/--> |
| |
| <xsl:variable name="aePath" select="f:fixupPath(u:import, $local_ae_descriptor_file_path[2])"/> |
| |
| <xsl:apply-templates mode="addDefaults" select="$aeOrRemote"> |
| <xsl:with-param tunnel="yes" name="defaultErrorConfig" select="$nextLevelDefaultErrorConfig"/> |
| <xsl:with-param tunnel="yes" name="local_ae_descriptor" select="$delegateAE"/> |
| <xsl:with-param tunnel="yes" name="local_ae_descriptor_file_path" select="$aePath"/> |
| <xsl:with-param tunnel="yes" name="keyPath" select="if ($keyPath eq '') then @key else concat($keyPath, '/', @key)"/> |
| </xsl:apply-templates> |
| </xsl:for-each> |
| </u:delegates> |
| </xsl:template> |
| |
| <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> |
| <!-- D E F A U L T: --> |
| <!-- <u:asyncPrimitiveErrorConfiguration> --> |
| <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> |
| <xsl:template mode="addDefaults" match="u:asyncPrimitiveErrorConfiguration"> |
| <u:asyncPrimitiveErrorConfiguration> |
| <xsl:choose> |
| <xsl:when test="u:processCasErrors"> |
| <xsl:if test="u:processCasErrors/@thresholdCount and u:processCasErrors/@thresholdWindow"> |
| <xsl:if test="(u:processCasErrors/@thresholdWindow ne '0') and |
| ((u:processCasErrors/@thresholdCount cast as xs:integer) gt (u:processCasErrors/@thresholdWindow cast as xs:integer))"> |
| <xsl:sequence select="f:msgWithLineNumber('ERROR', |
| ('The', u:processCasErrors/@thresholdWindow, ' must be either 0, or larger than the', u:processCasErrors/@thresholdCount), |
| .)"/> |
| </xsl:if> |
| </xsl:if> |
| |
| <u:processCasErrors |
| thresholdCount= "{if (u:processCasErrors/@thresholdCount) then u:processCasErrors/@thresholdCount else 0}" |
| thresholdWindow="{if (u:processCasErrors/@thresholdWindow) then u:processCasErrors/@thresholdWindow else 0}" |
| thresholdAction="{if (u:processCasErrors/@thresholdAction) then u:processCasErrors/@thresholdAction else ''}" |
| /> |
| </xsl:when> |
| <xsl:otherwise> |
| <u:processCasErrors thresholdCount="0" thresholdWindow="0" thresholdAction=""/> |
| </xsl:otherwise> |
| </xsl:choose> |
| |
| <xsl:choose> |
| <xsl:when test="u:collectionProcessCompleteErrors"> |
| <u:collectionProcessCompleteErrors |
| additionalErrorAction="{if (u:collectionProcessCompleteErrors/@additionalErrorAction) |
| then u:collectionProcessCompleteErrors/@additionalErrorAction |
| else ''}" |
| /> |
| </xsl:when> |
| <xsl:otherwise> |
| <u:collectionProcessCompleteErrors additionalErrorAction=""/> |
| </xsl:otherwise> |
| </xsl:choose> |
| |
| </u:asyncPrimitiveErrorConfiguration> |
| </xsl:template> |
| |
| <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> |
| <!-- D E F A U L T: --> |
| <!-- <u:asyncAggregateErrorConfiguration> --> |
| <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> |
| <xsl:template mode="addDefaults" match="u:asyncAggregateErrorConfiguration"> |
| <u:asyncAggregateErrorConfiguration> |
| <xsl:choose> |
| <xsl:when test="u:getMetadataErrors"> |
| <u:getMetadataErrors |
| maxRetries= "{if (u:getMetadataErrors/@maxRetries) then u:getMetadataErrors/@maxRetries else 0}" |
| timeout= "{if (u:getMetadataErrors/@timeout) then u:getMetadataErrors/@timeout else 60000}" |
| errorAction="{if (u:getMetadataErrors/@errorAction) then u:getMetadataErrors/@errorAction else 'terminate'}" |
| /> |
| </xsl:when> |
| <xsl:otherwise> |
| <u:getMetadataErrors maxRetries="0" timeout="60000" errorAction="terminate"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| |
| <xsl:choose> |
| <xsl:when test="u:processCasErrors"> |
| <xsl:if test="u:processCasErrors/@thresholdCount and u:processCasErrors/@thresholdWindow"> |
| <!--xsl:message select="('*** Running test', 'gt 9', ('100' cast as xs:integer) gt ('9' cast as xs:integer), 'more' )"/--> |
| <xsl:if test="(u:processCasErrors/@thresholdWindow ne '0') and |
| ((u:processCasErrors/@thresholdCount cast as xs:integer) gt (u:processCasErrors/@thresholdWindow cast as xs:integer))"> |
| <xsl:sequence select="f:msgWithLineNumber('ERROR', |
| ('The', u:processCasErrors/@thresholdWindow, ' must be either 0, or larger than the', u:processCasErrors/@thresholdCount), |
| .)"/> |
| </xsl:if> |
| </xsl:if> |
| <u:processCasErrors |
| maxRetries= "{if (u:processCasErrors/@maxRetries) then u:processCasErrors/@maxRetries else 0}" |
| timeout= "{if (u:processCasErrors/@timeout) then u:processCasErrors/@timeout else 0}" |
| continueOnRetryFailure= |
| "{if (u:processCasErrors/@continueOnRetryFailure) then u:processCasErrors/@continueOnRetryFailure |
| else 'false'}" |
| thresholdCount= "{if (u:processCasErrors/@thresholdCount) then u:processCasErrors/@thresholdCount else 0}" |
| thresholdWindow="{if (u:processCasErrors/@thresholdWindow) then u:processCasErrors/@thresholdWindow else 0}" |
| thresholdAction="{if (u:processCasErrors/@thresholdAction) then u:processCasErrors/@thresholdAction else ''}" |
| /> |
| </xsl:when> |
| <xsl:otherwise> |
| <u:processCasErrors maxRetries="0" timeout="0" continueOnRetryFailure="false" |
| thresholdCount="0" thresholdWindow="0" thresholdAction=""/> |
| </xsl:otherwise> |
| </xsl:choose> |
| |
| <xsl:choose> |
| <xsl:when test="u:collectionProcessCompleteErrors"> |
| <u:collectionProcessCompleteErrors |
| timeout="{if (u:collectionProcessCompleteErrors/@timeout) then u:collectionProcessCompleteErrors/@timeout |
| else 0}" |
| additionalErrorAction="{if (u:collectionProcessCompleteErrors/@additionalErrorAction) |
| then u:collectionProcessCompleteErrors/@additionalErrorAction |
| else ''}" |
| /> |
| </xsl:when> |
| <xsl:otherwise> |
| <u:collectionProcessCompleteErrors timeout="0" additionalErrorAction=""/> |
| </xsl:otherwise> |
| </xsl:choose> |
| |
| </u:asyncAggregateErrorConfiguration> |
| </xsl:template> |
| |
| <!-- |
| <xsl:template mode="addDefaults" match="u:errorConfiguration"> |
| <xsl:param tunnel="yes" name="defaultErrorConfig"/> |
| |
| = |
| <xsl:variable name="errorHandling" select="u:errorHandling"/> |
| <xsl:choose> |
| <xsl:when test="$defaultErrorConfig eq 'topAe'"> |
| <xsl:sequence select="f:msgWithLineNumber('WARNING', 'errorConfiguration at top level not supported', .)"/> |
| <!- -xsl:message select="'*** WARNING errorConfiguration at top level not supported'"/- -> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:choose> |
| <xsl:when test="u:import"> |
| <xsl:apply-templates mode="addDefaults" select="f:getImport(u:import)"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <u:errorConfiguration> |
| <u:casManagement enableRevert="false"/> |
| <u:errorHandling> |
| <xsl:for-each select="('metadataRequest', 'processRequest', 'collectionProcessingCompleteRequest')"> |
| <xsl:call-template name="defaultTimeout"> |
| <xsl:with-param name="timeoutNodes" select="$errorHandling/u:timeout"/> |
| <xsl:with-param name="eventKind" select="."/> |
| </xsl:call-template> |
| </xsl:for-each> |
| <xsl:call-template name="defaultException"> |
| <xsl:with-param name="exceptionNodes" select="$errorHandling/u:exception"/> |
| </xsl:call-template> |
| <xsl:copy-of select="$errorHandling/u:userErrorHandler"/> |
| </u:errorHandling> |
| </u:errorConfiguration> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:template> |
| |
| <xsl:template name="defaultTimeout"> |
| <xsl:param tunnel="yes" name="defaultErrorConfig"/> |
| <xsl:param name="timeoutNodes"/> |
| <xsl:param name="eventKind"/> |
| |
| <xsl:choose> |
| <xsl:when test="$timeoutNodes[@event eq $eventKind]"> |
| |
| <xsl:copy-of select="$timeoutNodes[@event eq $eventKind]"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:if test="$defaultErrorConfig eq 'topDelegate'"> |
| <u:timeout event="{$eventKind}" |
| milliseconds="0" |
| threshold="0" |
| action="{'DropCas'}"/> |
| </xsl:if> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:template> |
| |
| <xsl:template name="defaultException"> |
| <xsl:param tunnel="yes" name="defaultErrorConfig"/> |
| <xsl:param name="exceptionNodes"/> |
| |
| <xsl:choose> |
| <xsl:when test="$exceptionNodes"> |
| <xsl:for-each select="$exceptionNodes/u:exception"> |
| <xsl:copy-of select="."/> |
| </xsl:for-each> |
| |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:if test="$defaultErrorConfig eq 'topDelegate'"> |
| <u:exception event="" threshold="1" action="DropCas"/> |
| </xsl:if> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:template--> |
| |
| <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> |
| <!-- D E F A U L T: --> |
| <!-- <remoteAnalysisEngine> --> |
| <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> |
| <xsl:template mode="addDefaults" match="u:remoteDelegate|u:remoteAnalysisEngine"> |
| <xsl:param tunnel="yes" name="defaultErrorConfig"/> |
| <!--xsl:message select="'*** remote delegate defaulting pass 1 called '"/--> |
| <!--xsl:sequence select="f:validate(.)"/--> |
| |
| <xsl:variable name="remoteReplyQueueScaleout" as="xs:string" |
| select="if (@remoteReplyQueueScaleout) then @remoteReplyQueueScaleout else '1'"/> |
| |
| <u:remoteAnalysisEngine key="{@key}" remoteReplyQueueScaleout="{$remoteReplyQueueScaleout}"> |
| <xsl:if test="u:casMultiplier"> |
| <u:casMultiplier poolSize="{if (u:casMultiplier/@poolSize) then u:casMultiplier/@poolSize else '1'}" |
| initialFsHeapSize="{if (u:casMultiplier/@initialFsHeapSize) then u:casMultiplier/@initialFsHeapSize else '2000000'}" |
| processParentLast="{if (u:casMultiplier/@processParentLast) then u:casMultiplier/@processParentLast else 'false'}" |
| /> |
| </xsl:if> |
| <xsl:variable name="tmp"> |
| <xsl:apply-templates mode="addDefaults" select="u:inputQueue"/> |
| </xsl:variable> |
| <!--xsl:message select="'*** remote delegate input q'"/> |
| <xsl:message select="u:inputQueue"/--> |
| <xsl:sequence select="$tmp"/> |
| |
| <xsl:choose> |
| <xsl:when test="u:replyQueue"> |
| <xsl:sequence select="f:msgWithLineNumber('WARNING', |
| ('replyQueue element no longer used - all reply queues are remote for remote delegates'), u:replyQueue)"/> |
| <!--xsl:if test="not(u:replyQueue/@location = ('local', 'remote')) and u:replyQueue/@location"> |
| <xsl:sequence select="f:msgWithLineNumber('ERROR', |
| ('replyQueue location attribute, ', u:replyQueue/@location, ', must have a value of either ''local'' or ''remote'''), u:replyQueue)"/> |
| </xsl:if> |
| <xsl:if test="(u:replyQueue/@location eq 'local') and |
| starts-with($tmp/u:inputQueue/@brokerURL, 'http://')"> |
| <xsl:sequence select="f:msgWithLineNumber('ERROR', |
| '''local'' replyQueue location is not supported for ''http://'' style connections', u:replyQueue)"/> |
| </xsl:if> |
| <xsl:if test="(u:replyQueue/@location eq 'local')"> |
| <xsl:sequence select="f:msgWithLineNumber('ERROR', |
| '''local'' replyQueue location is no longer supported and will be forcedto remote', u:replyQueue)"/> |
| </xsl:if--> |
| <!--u:replyQueue location="{if (u:replyQueue/@location) then u:replyQueue/@location else |
| if (starts-with($tmp/u:inputQueue/@brokerURL, 'http://')) then 'remote' else 'local'}"/--> |
| <!--u:replyQueue location="remote" concurrentConsumers= |
| "{if (u:replyQueue/@concurrentConsumers) then u:replyQueue/@concurrentConsumers else '1'}"/--> |
| </xsl:when> |
| <xsl:otherwise> |
| <!--u:replyQueue location="remote" concurrentConsumers="1"/--> |
| <!--u:replyQueue location="{ |
| if (starts-with($tmp/u:inputQueue/@brokerURL, 'http://')) then 'remote' else 'local'}"/--> |
| <!--xsl:message select="('*** replyQueue', |
| if (starts-with($tmp/u:inputQueue/@brokerURL, 'http://')) then 'remote' else 'local')"/--> |
| </xsl:otherwise> |
| </xsl:choose> |
| |
| <xsl:choose> |
| <xsl:when test="u:serializer"> |
| <xsl:copy-of select="u:serializer"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <u:serializer method="xmi"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| |
| <xsl:choose> |
| <xsl:when test="u:asyncAggregateErrorConfiguration"> |
| <xsl:apply-templates mode="addDefaults" select="u:asyncAggregateErrorConfiguration"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:variable name="rmtErr"> |
| <u:asyncAggregateErrorConfiguration/> |
| </xsl:variable> |
| <xsl:apply-templates mode="addDefaults" select="$rmtErr"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| |
| <!--xsl:choose> |
| <xsl:when test="not(u:errorConfiguration) and ($defaultErrorConfig eq 'topDelegate')"> |
| <xsl:variable name="errorConfigElement"> |
| <u:errorConfiguration/> |
| </xsl:variable> |
| <xsl:apply-templates mode="addDefaults" select="$errorConfigElement"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:apply-templates mode="addDefaults" select="u:errorConfiguration"/> |
| </xsl:otherwise> |
| </xsl:choose--> |
| </u:remoteAnalysisEngine> |
| </xsl:template> |
| |
| <!--============================================================--> |
| <!-- Subroutines and Utilities =--> |
| <!--============================================================--> |
| |
| <!--============================================================--> |
| <!--| Functions |--> |
| <!--============================================================--> |
| |
| <xsl:function name="f:getImport"> |
| <xsl:param name="importNode"/> |
| <xsl:choose> |
| <xsl:when test="$importNode/@location"> |
| <xsl:sequence select="document($importNode/@location)"/> |
| </xsl:when> |
| <xsl:when test="$importNode/@name"> |
| <xsl:sequence select="document(x1:resolveByName($importNode/@name))"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:sequence select= |
| "f:msgWithLineNumber('ERROR', 'import missing location or name attribute', $importNode)"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:function> |
| |
| |
| <xsl:function name="f:fixupPath"> |
| <xsl:param name="node"/> <!-- node has location or name attribute --> |
| <xsl:param name="relBase"/> |
| <!--xsl:message select="'*** fixup path'"/> |
| <xsl:message select="$node"/> |
| <xsl:message select="$relBase"/--> |
| |
| <xsl:choose> |
| <xsl:when test="$node/@location"> |
| <!-- some paths start with file: |
| strip that out if found, so the subsequent logic for |
| detecting "absolute" paths works --> |
| <xsl:variable name="relOrAbsPath" select= |
| "if (starts-with($node/@location, 'file:')) then |
| substring($node/@location, 6) else $node/@location"/> |
| <!--xsl:variable name="relOrAbsPath" select="$node/@location"/--> |
| <xsl:variable name="fwdSlashes" select="replace(string($relOrAbsPath), '\\', '/')"/> |
| <xsl:variable name="isAbsPath" select="matches($fwdSlashes, '^/|^.:')"/> |
| <!--xsl:message select="concat('relOrAbsPath = ',string($relOrAbsPath))"/--> |
| <xsl:choose> |
| <xsl:when test="$isAbsPath"> |
| <xsl:sequence select="($fwdSlashes, $fwdSlashes)"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:variable name="relBaseDir" select="replace(string($relBase), '/[^/]*?\.[xX][mM][lL]', '')"/> |
| <xsl:variable name="relPath" select="concat($relBaseDir, '/', $fwdSlashes)"/> |
| <xsl:choose> |
| <xsl:when test="$useRelativePaths"> |
| <xsl:sequence select="($relPath, $relPath)"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:variable name="absPath" select="resolve-uri($relPath, $document-uri)"/> |
| <xsl:sequence select="($absPath, $absPath)"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:when> |
| <xsl:when test="$node/@name"> |
| <xsl:sequence select="(concat('*importByName:', $node/@name), x1:resolveByName($node/@name))"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:sequence select= |
| "f:msgWithLineNumber('ERROR', 'import element missing name or location attribute', $node)"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:function> |
| |
| <!--xsl:function name="f:isRmtTempQ"> |
| <xsl:param name="rmtNode"/--> |
| <!--xsl:message select="not($noTempQueues) and |
| ($rmtNode/u:replyQueue/@location eq 'remote') and |
| ($topLevelInputQueueBroker ne 'vm://localhost') and |
| ($rmtNode/u:inputQueue/@brokerURL eq $topLevelInputQueueBroker)"/--> |
| <!--xsl:sequence select="not($noTempQueues) and |
| ($rmtNode/u:replyQueue/@location eq 'remote')"/> |
| </xsl:function--> |
| |
| <xsl:function name="f:isAggr"> |
| <xsl:param name="aeNode"/> |
| <xsl:sequence select="$aeNode/(u:analysisEngineDescription|u:taeDescription)/u:primitive[text() eq 'false']"/> |
| </xsl:function> |
| |
| <xsl:function name="f:isCPP"> |
| <xsl:param name="aeNode"/> |
| <xsl:sequence select="$aeNode/*/u:frameworkImplementation[text() eq 'org.apache.uima.cpp']"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getUserHandlerDispatcherID"> |
| <xsl:param name="node"/> |
| <xsl:sequence select="concat('usrHdlr_dispatcher', f:getAeNameUnique($node))"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getTimeoutHandlerID"> |
| <xsl:param name="node"/> |
| <xsl:sequence select="concat('tmOutHdlr_', f:getAeNameUnique($node))"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getExceptionHandlerID"> |
| <xsl:param name="node"/> |
| <xsl:sequence select="concat('excptnHdlr_', f:getAeNameUnique($node))"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getUserErrorHandlerID"> |
| <xsl:param name="errorHandlerNode"/> |
| <xsl:sequence select="concat( |
| 'user_error_handler_', |
| f:getAeNameUnique($errorHandlerNode), |
| '.', |
| $errorHandlerNode/position())"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getTimeoutThresholdsID"> |
| <xsl:param name="delegateNode"/> |
| <xsl:variable name="nodeHavingTimeoutThresholdsElement" |
| select="$delegateNode/ancestor-or-self::*[u:errorConfiguration/u:errorHandling/u:timeout][1]"/> |
| <xsl:sequence select="concat('timeout_thresholdsActions_', |
| f:getAeNameUnique($nodeHavingTimeoutThresholdsElement))"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getExceptionThresholdsID"> |
| <xsl:param name="delegateNode"/> |
| <xsl:variable name="nodeHavingExceptionThresholdsElement" |
| select="$delegateNode/ancestor-or-self::*[u:errorConfiguration/u:errorHandling/u:exception][1]"/> |
| <xsl:sequence select="concat('exception_thresholdsActions_', |
| f:getAeNameUnique($nodeHavingExceptionThresholdsElement))"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getUserErrorHandlerThresholdsID"> |
| <xsl:param name="delegateNode"/> |
| <xsl:variable name="nodeHavingUserErrorHandlerThresholdsElement" |
| select="$delegateNode/ancestor-or-self::*[u:errorConfiguration/u:errorHandling/u:userErrorHandler/userErrorHandlerSpec][1]"/> |
| <xsl:sequence select="concat('userErrorHandler_thresholdsActions_', |
| f:getAeNameUnique($nodeHavingUserErrorHandlerThresholdsElement))"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getThresholdActionID"> |
| <xsl:param name="node"/> |
| <xsl:variable name="taKey" select="concat('t', $node/@threshold, 'a', $node/@action)"/> |
| <xsl:sequence select="concat('threshold_action_', $taKey)"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getControllerID"> |
| <xsl:param name="aeNode"/> |
| <xsl:choose> |
| <xsl:when test="$aeNode/self::u:analysisEngine[@async eq 'true']"> |
| <xsl:sequence select="concat('asAggr_ctlr_', f:getAeNameUnique($aeNode))"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:sequence select="concat('primitive_ctlr_', f:getAeNameUnique($aeNode))"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:function> |
| |
| <xsl:function name="f:getPoolingTaskExecutorID"> |
| <xsl:param name="aeNode"/> |
| <xsl:sequence select="concat('pooling_', f:getAeNameUnique($aeNode))"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getMetaMsgHandlerID"> |
| <xsl:param name="aeNode"/> |
| <xsl:param name="kind"/> |
| <xsl:sequence select="concat($kind, '_metaMsgHandler_', f:getAeNameUnique($aeNode))"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getProcessRequestHandlerID"> |
| <xsl:param name="aeNode"/> |
| <xsl:param name="kind"/> |
| <xsl:sequence select="concat($kind, '_processRequestHandler_', f:getAeNameUnique($aeNode))"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getProcessResponseHandlerID"> |
| <xsl:param name="aeNode"/> |
| <xsl:param name="kind"/> |
| <xsl:sequence select="concat($kind, '_processResponseHandler_', f:getAeNameUnique($aeNode))"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getDestinationResolverID"> |
| <xsl:param name="aeNameUnique"/> |
| <xsl:param name="key"/> |
| <xsl:sequence select="concat('destinationResolver_', $aeNameUnique, '_', $key)"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getAeNameUnique"> |
| <xsl:param name="aeNode"/> |
| <xsl:if test="not($aeNode)"> |
| <xsl:sequence select="f:msgWithLineNumber('ERROR', 'empty node passed to f:getAeNameUnique', $aeNode)"/> |
| </xsl:if> |
| <xsl:sequence select="concat(f:getSimpleAeName($aeNode),'_', f:getUnique($aeNode))"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getUnique"> |
| <xsl:param name="node"/> |
| <xsl:variable name="aeNode" select="$node/ancestor-or-self::node()[self::u:analysisEngine|self::u:remoteAnalysisEngine][1]"/> |
| <xsl:number level="multiple" count="u:remoteAnalysisEngine|u:analysisEngine" format="1.1" select="$aeNode"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getSimpleAeName"> |
| <xsl:param name="node"/> |
| <!-- <xsl:param tunnel="yes" name="topKey"/> --> |
| <xsl:variable name="nearestKey" select= |
| "$node/ancestor-or-self::node()[@key][1]"/> |
| <!-- <xsl:message select="'*** Tracing getSimpleAeName'"/> |
| <xsl:message select="$node/ancestor-or-self::node()[@key][1]"/> |
| <xsl:message select="'nearest key var is: '"/> |
| <xsl:message select="$nearestKey"/> |
| <xsl:message select="'end of nearest key'"/> --> |
| <xsl:choose> |
| <xsl:when test="$nearestKey"> |
| <xsl:sequence select="f:createValidName(string($nearestKey/@key))"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <!--xsl:message select="'nearest key was false, using topkey'"/--> |
| <!-- <xsl:sequence select="$topKey"/> --> |
| <!--xsl:sequence select="f:getSimpleNameFromParentKeyOrEndpoint($node/ancestor::u:service/u:inputQueue/(@endpoint|@queueName))"/--> |
| <xsl:sequence select="f:msgWithLineNumber( |
| 'ERROR', |
| ('Missing key name on', node-name($node)), |
| $node)"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:function> |
| |
| <xsl:function name="f:createValidName"> |
| <xsl:param name="inputName"/> |
| <xsl:variable name="u"> |
| <xsl:choose> |
| <xsl:when test="starts-with($inputName, '${')"> |
| <xsl:sequence select= |
| "replace(replace($inputName, '\$\{', ''), '\}', '')"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:sequence select= |
| "replace( |
| replace( |
| replace( |
| replace( |
| replace( |
| replace( |
| replace( $inputName,'\?.*', '') |
| ,',','_cm_') |
| ,':','_c_') |
| ,'//','_ss_') |
| ,'/', '_s_') |
| ,'\(','_op_') |
| ,'\)','_cp_') |
| "/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| |
| <xsl:sequence select="$u"/> |
| </xsl:function> |
| |
| |
| <xsl:function name="f:getQbrokerID"> |
| <xsl:param name="inputQueue"/> |
| <!-- xsl:variable name="u"> |
| <xsl:choose> |
| <xsl:when test="starts-with($inputQueue/@brokerURL, '${')"> |
| <xsl:sequence select= |
| "replace(replace($inputQueue/@brokerURL, '\$\{', ''), '\}', '')"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:sequence select= |
| "replace( |
| replace( |
| replace( |
| replace( |
| replace( |
| replace( |
| replace( $inputQueue/@brokerURL,'\?.*', '') |
| ,',','_cm_') |
| ,':','_c_') |
| ,'//','_ss_') |
| ,'/', '_s_') |
| ,'\(','_op_') |
| ,'\)','_cp_') |
| "/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable--> |
| |
| <xsl:sequence select="concat('qBroker_',f:createValidName($inputQueue/@brokerURL))"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getEndpointName"> |
| <xsl:param name="containerKeyName" as="xs:string"/> <!-- key name of containing delegate --> |
| <xsl:param name="uniq"/> |
| <!-- xsl:message select="'*** Tracing GetEndpointName'"/ --> |
| |
| <xsl:sequence select="concat('endpt_', $containerKeyName, '_', $uniq)"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getOutputChannelID"> |
| <xsl:param name="aeNode"/> |
| <xsl:sequence select="concat('outChnl_', f:getAeNameUnique($aeNode))"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getInternalInputQueueName"> |
| <xsl:param name="delegateNode"/> |
| <xsl:sequence select="concat('inQ_',f:getAeNameUnique($delegateNode))"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getLocalReturnQueueEndpointID"> |
| <xsl:param name="aeNode"/> |
| <xsl:sequence select="concat('asynAggr_retQ_', f:getAeNameUnique($aeNode))"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getRemoteReturnQueueID"> |
| <xsl:param name="aeNode"/> |
| <xsl:param name="remoteDelegate"/> |
| <xsl:sequence select="concat('rmtRtrnQ_', f:getAeNameUnique($aeNode), |
| '_', $remoteDelegate/@key)"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getRemoteReturnQueueName"> |
| <xsl:param name="aeNode"/> |
| <xsl:param name="remoteDelegate"/> |
| <xsl:sequence select="concat(f:getRemoteReturnQueueID($aeNode, $remoteDelegate), '_', $guid)"/> |
| </xsl:function> |
| |
| <xsl:function name="f:getDelegatePart"> |
| <xsl:param name="local_ae_descriptor"/> |
| <xsl:param name="key"/> |
| <!-- xsl:message select="'*** local ae descriptor'"/> |
| <xsl:message select="$local_ae_descriptor"/> |
| <xsl:message select="$key"/> |
| <xsl:message select="$local_ae_descriptor/(u:analysisEngineDescription|u:casConsumerDescription|u:taeDescription)/u:delegateAnalysisEngineSpecifiers/u:delegateAnalysisEngine[@key eq string($key)]"/> |
| <xsl:message select="'*** end local ae descriptor'"/ --> |
| <xsl:variable name="result" select= |
| "f:resolveImport($local_ae_descriptor/(u:analysisEngineDescription|u:taeDescription)/u:delegateAnalysisEngineSpecifiers/u:delegateAnalysisEngine[@key=$key])"/> |
| <xsl:if test="not($result)"> |
| <xsl:sequence select="f:msgWithLineNumber( |
| 'ERROR', |
| ('ERROR cannot load delegate descriptor with key', $key), |
| $local_ae_descriptor)"/> |
| </xsl:if> |
| <xsl:sequence select="$result"/> |
| </xsl:function> |
| |
| <xsl:function name="f:resolveImport"> |
| <xsl:param name="nodeset"/> |
| <xsl:choose> |
| <xsl:when test="$nodeset/u:import"> |
| <xsl:sequence select="f:getImport($nodeset/u:import)"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <!--xsl:message select="'*** This nodeset didnt have an import '"/> |
| <xsl:message select="$nodeset"/--> |
| <xsl:sequence select="$nodeset"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:function> |
| |
| <xsl:function name="f:getTimeoutClass"> |
| <xsl:param name="timeout"/> |
| <xsl:choose> |
| <xsl:when test="$timeout/@event eq 'metadataRequest'"> |
| <xsl:sequence select="'MetadataRequestTimeoutCount'"/> |
| </xsl:when> |
| <xsl:when test="$timeout/@event eq 'processRequest'"> |
| <xsl:sequence select="'ProcessRequestTimeoutCount'"/> |
| </xsl:when> |
| <xsl:when test="$timeout/@event eq 'collectionProcessingCompleteRequest'"> |
| <xsl:sequence select="'CollectionProcessingCompleteTimeoutCount'"/> |
| </xsl:when> |
| </xsl:choose> |
| </xsl:function> |
| |
| <xsl:function name="f:getErrorHandlerChainID"> |
| <xsl:param name="node"/> |
| <!-- xsl:message select="' *** ancestor test ErrorConfig *** '"/> |
| <xsl:message select="$node/parent::node()"/ --> |
| |
| <!--xsl:variable name="firstContainingNodeWithErrorConfig" select= |
| "if ($node/ancestor-or-self::u:analysisEngine[u:delegates/*/u:errorConfiguration]) |
| then $node/ancestor-or-self::u:analysisEngine[u:delegates/*/u:errorConfiguration][1] |
| else $node/ancestor-or-self::node()[u:errorConfiguration][1]"/--> |
| <!--xsl:message select="'*** first containing node with error config parent'"/> |
| <xsl:message select="$firstContainingNodeWithErrorConfig/parent::node()"/ --> |
| <xsl:sequence select= |
| "concat('err_hdlr_chn_', f:getAeNameUnique($node))"/> |
| </xsl:function> |
| <!--============================================================--> |
| <!-- Comment Generation =--> |
| <!--============================================================--> |
| <xsl:variable name="nl" select="'
'"/> |
| <xsl:variable name="quote" select="'"'"/> |
| <xsl:variable name="nl2" select="'

'"/> |
| <xsl:variable name="commentBorder" select= |
| "'=================================================================================='"/> |
| <xsl:variable name="blanks" select= |
| "' '"/> |
| <xsl:function name="f:generateBlockComment"> |
| <xsl:param name="comment"/> |
| <xsl:param name="spaces"/> |
| <xsl:call-template name="commentGenerate"> |
| <xsl:with-param name="comment" select="$comment"/> |
| <xsl:with-param name="spaces" select="$spaces"/> |
| </xsl:call-template> |
| </xsl:function> |
| |
| <xsl:function name="f:generateLineComment"> |
| <xsl:param name="comment"/> |
| <xsl:param name="spaces"/> |
| <xsl:call-template name="commentGenerateLine"> |
| <xsl:with-param name="comment" select="$comment"/> |
| <xsl:with-param name="spaces" select="$spaces"/> |
| </xsl:call-template> |
| </xsl:function> |
| |
| <xsl:template name="commentGenerate"> |
| <xsl:param name="comment"/> |
| <xsl:param name="spaces"/> |
| <xsl:variable name="maxLength" select="max((20, 2 + max(for $s in $comment return string-length(string($s)))))"/> |
| |
| <xsl:sequence select="$nl"/> |
| <xsl:comment select="substring($commentBorder,1,$maxLength)"/> |
| <xsl:sequence select="$nl"/> |
| <xsl:value-of select="substring($blanks,1,$spaces)"/> |
| <xsl:for-each select="$comment"> |
| <xsl:comment select="concat(' ', ., substring($blanks, 1, $maxLength - (string-length(string(.)) + 1)))"/> |
| <xsl:sequence select="$nl"/> |
| <xsl:value-of select="substring($blanks,1,$spaces)"/> |
| </xsl:for-each> |
| <xsl:comment select="substring($commentBorder,1,$maxLength)"/> |
| <xsl:sequence select="$nl"/> |
| <xsl:value-of select="substring($blanks,1,$spaces)"/> |
| </xsl:template> |
| |
| <xsl:template name="commentGenerateLine"> |
| <xsl:param name="comment"/> |
| <xsl:param name="spaces"/> |
| <xsl:sequence select="$nl2"/> |
| <xsl:value-of select="substring($blanks,1,$spaces)"/> |
| <xsl:variable name="maxLength" select="max((20, 2 + max(for $s in $comment return string-length(string($s)))))"/> |
| <xsl:for-each select="$comment"> |
| <xsl:variable name="stretched" select="f:stretchComment(., $maxLength)"/> |
| <xsl:variable name="comment2" select="f:evenLengthString($stretched)"/> |
| <xsl:variable name="padLength" select= |
| "(max((0, $maxLength - string-length($comment2)))) div 2"/> |
| <xsl:variable name="c" select="substring($blanks, 1, $padLength)"/> |
| <xsl:comment select="concat($c, $comment2, $c)"/> |
| <xsl:sequence select="$nl"/> |
| <xsl:value-of select="substring($blanks,1,$spaces)"/> |
| </xsl:for-each> |
| </xsl:template> |
| |
| <xsl:variable name="lotsOfTildes" |
| select="'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'"/> |
| <xsl:function name="f:stretchComment"> |
| <xsl:param name="s"/> |
| <xsl:param name="length" /> |
| <xsl:sequence select= |
| "if (starts-with($s, '~~~~~~~~~~')) then substring($lotsOfTildes, 1, min(($length, string-length($lotsOfTildes)))) |
| else $s"/> |
| </xsl:function> |
| |
| <xsl:function name="f:evenLengthString"> |
| <xsl:param name="s"/> |
| <xsl:choose> |
| <xsl:when test="(string-length($s) mod 2) = 1"> |
| <xsl:sequence select="concat($s, ' ')"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:sequence select="$s"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:function> |
| |
| <!--============================================================--> |
| <!-- validation =--> |
| <!--============================================================--> |
| |
| <xsl:variable name="validDeploymentDescriptorDefinition"> |
| <u:analysisEngineDeploymentDescription> |
| <u:name i:maxone=""/> |
| <u:description i:maxone=""/> |
| <u:version i:maxone=""/> |
| <u:vendor i:maxone=""/> |
| <u:deployment i:maxone="" i:required="" protocol="" provider=""> |
| <u:casPool i:maxone="" numberOfCASes="" initialFsHeapSize=""/> |
| |
| <u:service i:required=""> |
| <u:custom name="" value=""/> |
| <u:inputQueue i:maxone="" i:required="" brokerURL="" endpoint="" queueName="" prefetch=""/> |
| <u:topDescriptor i:maxone="" i:required=""> |
| <u:import i:maxone="" i:required="" location="" name=""/> |
| </u:topDescriptor> |
| <u:environmentVariables i:maxone=""> |
| <u:environmentVariable name=""/> |
| </u:environmentVariables> |
| <u:analysisEngine i:maxone="" key="" async="" |
| internalReplyQueueScaleout="" |
| inputQueueScaleout=""> |
| <u:scaleout i:maxone="" numberOfInstances=""/> |
| <!-- top level cas multiplier can't specify processParentLast --> |
| <u:casMultiplier i:maxone="" poolSize="" initialFsHeapSize=""/> |
| <u:asyncPrimitiveErrorConfiguration i:maxone=""> |
| <u:processCasErrors i:maxone="" |
| thresholdCount="" thresholdWindow="" thresholdAction=""/> |
| <u:collectionProcessCompleteErrors i:maxone="" additionalErrorAction=""/> |
| </u:asyncPrimitiveErrorConfiguration> |
| <u:asyncAggregateErrorConfiguration i:maxone=""> |
| <u:getMetadataErrors i:maxone="" maxRetries="" timeout="" errorAction=""/> |
| <u:processCasErrors i:maxone="" maxRetries="" timeout="" continueOnRetryFailure="" |
| thresholdCount="" thresholdWindow="" thresholdAction=""/> |
| <u:collectionProcessCompleteErrors i:maxone="" timeout="" additionalErrorAction=""/> |
| </u:asyncAggregateErrorConfiguration> |
| <u:delegates i:maxone=""> |
| <u:analysisEngine/> |
| <u:remoteAnalysisEngine key="" remoteReplyQueueScaleout=""> |
| <u:casMultiplier i:maxone="" poolSize="" initialFsHeapSize="" processParentLast=""/> |
| <u:inputQueue i:maxone="" i:required="" brokerURL="" endpoint="" queueName=""/> |
| <u:replyQueue i:maxone="" location=""/> |
| <u:serializer i:maxone="" method=""/> |
| <u:asyncAggregateErrorConfiguration i:maxone=""> |
| <u:getMetadataErrors i:maxone="" maxRetries="" timeout="" errorAction=""/> |
| <u:processCasErrors i:maxone="" maxRetries="" timeout="" continueOnRetryFailure="" |
| thresholdCount="" thresholdWindow="" thresholdAction=""/> |
| <u:collectionProcessCompleteErrors i:maxone="" timeout="" additionalErrorAction=""/> |
| </u:asyncAggregateErrorConfiguration> |
| </u:remoteAnalysisEngine> |
| </u:delegates> |
| </u:analysisEngine> |
| </u:service> |
| </u:deployment> |
| </u:analysisEngineDeploymentDescription> |
| </xsl:variable> |
| |
| <xsl:key name="validElement" match="*" use="node-name(.)"/> |
| |
| <xsl:function name="f:validateDeploymentDescriptor"> |
| <xsl:param name="top"/> |
| <xsl:if test="not($top)"> |
| <xsl:message select="('*** ERROR: The top level item is not an analysisEngineDeploymentDescription')"/> |
| </xsl:if> |
| <xsl:sequence select="f:validateDDNodeAndChildren($top)"/> |
| </xsl:function> |
| |
| <xsl:function name="f:validateDDNodeAndChildren"> |
| <xsl:param name="node"/> |
| <!--xsl:message select="('validating:', node-name($node))"/--> |
| <xsl:variable name="node2" as="node()"> |
| <xsl:choose> |
| <xsl:when test="$node/u:errorConfiguration/u:import"> |
| <xsl:sequence select="f:getImport($node/u:errorConfiguration/u:import)"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:sequence select="$node"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| <!--xsl:message select="('validating2:', node-name($node2))"/--> |
| <xsl:sequence select="f:validate($node2)"/> |
| <xsl:for-each select="$node2/*"> |
| <xsl:sequence select="f:validateDDNodeAndChildren(.)"/> |
| </xsl:for-each> |
| </xsl:function> |
| |
| <xsl:function name="f:validate"> |
| <xsl:param name="node"/> |
| <xsl:variable name="p" select="key('validElement', node-name($node), $validDeploymentDescriptorDefinition)"/> |
| |
| <xsl:for-each select="$node/attribute::*"> |
| <xsl:if test="not(node-name(.) = $p/attribute::*/node-name(.))"> |
| <xsl:sequence select="f:msgWithLineNumber('ERROR', |
| ('following element has an unknown attribute: ', node-name(.)), $node)"/> |
| <xsl:message select="$node"/> |
| </xsl:if> |
| </xsl:for-each> |
| |
| <xsl:for-each select="$p/*[@i:maxone]"> |
| <xsl:if test="1 < count($node/*[node-name(.) eq node-name(current())])"> |
| <xsl:sequence select="f:msgWithLineNumber( |
| 'ERROR', |
| (concat('"', node-name(.), '"'), |
| 'occurs more than once within', |
| concat('"', node-name($node), '",'), |
| 'but may occur a maximum of 1 time in this context' |
| ), |
| $node)"/> |
| <!--xsl:message select="$node"/--> |
| </xsl:if> |
| </xsl:for-each> |
| |
| <xsl:for-each select="$p/*[@i:required]"> |
| <xsl:if test="not($node/*[node-name(.) eq node-name(current())])"> |
| <xsl:sequence select="f:msgWithLineNumber( |
| 'ERROR', |
| (concat('"', node-name($node), '"'), |
| 'in this context must contain the element', |
| concat('"', node-name(.), '";'), |
| 'but that element is missing' |
| ), |
| $node)"/> |
| </xsl:if> |
| </xsl:for-each> |
| |
| <xsl:if test="$node/u:inputQueue/@queueName"> |
| <xsl:sequence select="f:msgWithLineNumber( |
| 'WARNING', |
| (concat($quote,'queueName',$quote), |
| 'attribute was used in an inputQueue element; it has been changed to', concat($quote, 'endpoint', $quote)), |
| $node)"/> |
| </xsl:if> |
| |
| <xsl:for-each select="$node/*"> |
| <!--xsl:message select="('node-name:',node-name(.))"/--> |
| <xsl:if test="not(node-name(.) = $p/*/node-name(.))"> |
| <xsl:message select="f:msgWithLineNumber('ERROR', |
| ('The element', node-name(.), 'cannot be contained in the element', node-name($node)), |
| $node)"/> |
| <!--xsl:message select="'*** p/*/node-name(.)'"/> |
| <xsl:message select="$p/*/node-name(.)"/--> |
| </xsl:if> |
| </xsl:for-each> |
| |
| <xsl:for-each select="$node/u:errorConfiguration/u:errorHandling/u:timeout"> |
| <xsl:if test="not(string(@event) = |
| ('processRequest', 'metadataRequest', 'collectionProcessingCompleteRequest'))"> |
| <xsl:message select="f:msgWithLineNumber( |
| 'ERROR', |
| ('This timeout element needs to specify an event which is one of', |
| 'processRequest, metadataRequest, or collectionProcessingCompleteRequest'), |
| $node/u:errorConfiguration/u:errorHandling)"/> |
| </xsl:if> |
| </xsl:for-each> |
| </xsl:function> |
| |
| <xsl:function name="f:msgWithLineNumber"> |
| <xsl:param name="kind"/> |
| <xsl:param name="msg"/> <!-- can be multi-element sequence --> |
| <xsl:param name="node"/> |
| <xsl:message> |
| *** <xsl:sequence select="concat($kind,':')"/> line-number: <xsl:sequence select="saxon:line-number($node)"/> |
| <xsl:sequence select="$msg"/> |
| </xsl:message> |
| </xsl:function> |
| </xsl:stylesheet> |