Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3
Section
borderfalse
Column
width15%
Include Page
TUSCANY: SCA Java Subproject MenuTUSCANY:
SCA Java Subproject Menu
Include Page
TUSCANY: Java SCA Menu NewTUSCANY:
Java SCA Menu New
Column
width85%

<implementation.xquery>

Tuscany provides an implementation type to support XQuery. With this extension, the business logic can be implemented by XQuery scripts.

The XML configuration

<implementation.xquery> is declared under namespace "http://tuscany.apache.org/xmlns/sca/1.0". The location attribute specifies the XQuery script. It can be a file or resource name against the current classloader.

Code Block
    <component name="QuoteJoinComponent" xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0">
        <tuscany:implementation.xquery location="META-INF/sca/quote_join.xq" />
        <reference name="quoteCalculator" target="QuoteCalculatorComponent" />
    </component>

Some examples

Code Block
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" targetNamespace="http://quote.xquery/client"
    xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0" xmlns:xq="http://quote.xquery/client"
    name="xqueryquotewsclient">

    ...
    <component name="QuoteJoinComponent">
        <tuscany:implementation.xquery location="META-INF/sca/quote_join.xq" />
        <reference name="quoteCalculator" target="QuoteCalculatorComponent" />
    </component>

    <component name="QuoteJoinPropertiesComponent">
        <tuscany:implementation.xquery location="META-INF/sca/quote_join_properties.xq" />
        <!-- Reset the default namespace as the sub-elements under pri:priceQuote are
            unqualified -->
        <property name="priceQuoteDoc">
            <pri:priceQuote xmlns:pri="http://www.example.org/price" xmlns="">
                <customerName>Acme Inc</customerName>
                <shipAddress street="12 Springs Rd" city="Morris Plains" state="nj" zip="07960" />
                <priceRequests>
                    <priceRequest>
                        <widgetId>12</widgetId>
                        <price>1.0</price>
                    </priceRequest>
                    <priceRequest>
                        <widgetId>134</widgetId>
                        <price>34.1</price>
                    </priceRequest>
                    <priceRequest>
                        <widgetId>211</widgetId>
                        <price>10.0</price>
                    </priceRequest>
                </priceRequests>
            </pri:priceQuote>
        </property>
        <!-- Reset the default namespace as the sub-elements under ava:availQuote are
            unqualified -->

        <property name="availQuoteDoc">
            <ava:availQuote xmlns:ava="http://www.example.org/avail" xmlns="">
                <availRequest>
                    <widgetId>12</widgetId>
                    <requestedQuantity>10</requestedQuantity>
                    <quantityAvail>true</quantityAvail>
                    <shipDate>2003-03-22</shipDate>
                </availRequest>
                <availRequest>
                    <widgetId>134</widgetId>
                    <requestedQuantity>345</requestedQuantity>
                    <quantityAvail>false</quantityAvail>
                    <shipDate>BackOrder</shipDate>
                </availRequest>
                <availRequest>
                    <widgetId>211</widgetId>
                    <requestedQuantity>100</requestedQuantity>
                    <quantityAvail>true</quantityAvail>
                    <shipDate>2003-04-21</shipDate>
                </availRequest>
            </ava:availQuote>
        </property>
        <property name="taxRate">0.1</property>
        <reference name="quoteCalculator" target="QuoteCalculatorComponent" />
    </component>

    <component name="QuoteJoinExternalReferencesComponent">
        <tuscany:implementation.xquery location="META-INF/sca/quote_join_external_references.xq" />
        <reference name="quoteCalculator" target="QuoteCalculatorComponent" />
        <reference name="priceQuoteProvider" target="PriceQuoteProviderComponent" />
    </component>
    ...
</composite>

Decalre SCA services/references/properties using XQuery namespaces

Please note you can use the following syntax in the XQuery script to declare SCA services, references, and properties.

  • scaservice:java/<java_interface_name>
  • scareference:java/<java_interface_name>
  • scaproperty:xml/<namespace>:<localName>
  • scaproperty:java/<java_class_name>
Code Block
declare namespace quoteJoin="scaservice:java/xquery.quote.PropertiesQuoteJoin";

declare namespace quoteCalculator="scareference:java/xquery.quote.QuoteCalculator";

declare namespace priceQuoteDoc="scaproperty:xml/http://www.example.org/price:priceQuote";
declare namespace availQuoteDoc="scaproperty:xml/http://www.example.org/avail:availQuote";
declare namespace taxRate="scaproperty:java/java.lang.Float";

declare namespace pri="http://www.example.org/price";
declare namespace ava="http://www.example.org/avail";
declare namespace quo="http://www.example.org/quote";

declare variable $quoteCalculator external;

declare variable $priceQuoteDoc external;
declare variable $availQuoteDoc external;
declare variable $taxRate external;

declare function quoteJoin:joinPriceAndAvailQuotes() {
<quo:quote>
    <quo:name>{ data($priceQuoteDoc/pri:priceQuote/customerName) }</quo:name>
    <quo:address>{ concat($priceQuoteDoc/pri:priceQuote/shipAddress/@street , ",", 
    $priceQuoteDoc/pri:priceQuote/shipAddress/@city ,",", 
    fn:upper-case($priceQuoteDoc/pri:priceQuote/shipAddress/@state) , ",", 
    $priceQuoteDoc/pri:priceQuote/shipAddress/@zip) }</quo:address>
    {
        for $priceRequest in $priceQuoteDoc/pri:priceQuote/priceRequests/priceRequest,
            $availRequest in $availQuoteDoc/ava:availQuote/availRequest
        where data($priceRequest/widgetId) = data($availRequest/widgetId)
        return
            <quo:quoteResponse>
                <quo:widgetId>{ data($priceRequest/widgetId) }</quo:widgetId>
                <quo:unitPrice>{ data($priceRequest/price) }</quo:unitPrice>
                <quo:requestedQuantity>{ data($availRequest/requestedQuantity) }</quo:requestedQuantity>
                <quo:fillOrder>{ data($availRequest/quantityAvail) }</quo:fillOrder>
                {
                    for $shipDate in $availRequest/shipDate
                    return
                        <quo:shipDate>{ data($shipDate) }</quo:shipDate>
                }
                <quo:taxRate>{ $taxRate }</quo:taxRate>
                <quo:totalCost>{ quoteCalculator:calculateTotalPrice(
                				  $quoteCalculator,
                				  
                				  $taxRate,

                                  $availRequest/requestedQuantity,

                                  $priceRequest/price,

                                  $availRequest/quantityAvail) }</quo:totalCost>
            </quo:quoteResponse>
    }
    </quo:quote>
};