<?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> |