<!--
  ~  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.
  -->

<synapse xmlns="http://ws.apache.org/ns/synapse">

    <!-- attaching service level WS-Security policies to proxy services -->
    <definitions>
        <set-property name="proxy_wsdl"
                      src="file:repository/conf/sample/resources/proxy/sample_proxy_1.wsdl"/>
    </definitions>

    <proxies>
        <proxy name="StockQuoteProxy" transports="http">
            <wsdl key="proxy_wsdl"/>
        </proxy>
    </proxies>

    <rules>
        <in>
            <send>
                <endpoint address="jms:/SimpleStockQuoteService?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&amp;java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&amp;java.naming.provider.url=tcp://localhost:61616"/>
            </send>
        </in>
        <out>
            <send/>
        </out>
    </rules>

</synapse>