<!--
  ~ 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.
  -->

<service provider="xsd:anyprovider" style="xsd:anyURI" contextPath="xsd:anycontextPath">
    <!-- these are Service Parameters -->
    <parameter name="para1" locked="xsd:true">10</parameter>
    <parameter name="para2">Colombo</parameter>

    <!--  Service TypeMapping -->
    <typeMapping>Type mappping should come here</typeMapping>
    <beanMapping>bean mappping should come here</beanMapping>


    <handler name="h1" class="org.apache.axis2.engine.registry.SpeakingHandler">
        <order before="anyBefireURI" after="anyafterURI" phase="anyhase" phaseFirst="true" phaseLast="false"/>
        <parameter name="para8" locked="xsd:true">123</parameter>
        <parameter name="para9" locked="xsd:true">456</parameter>
        <parameter name="para10" locked="xsd:true">789</parameter>
    </handler>


    <InFlow>
        <handler name="h2" ref="h1"/>
        <handler name="h3" ref="h1"/>
    </InFlow>

    <OutFlow>
        <handler name="h3" class="org.apache.axis2.engine.registry.SpeakingHandler">
            <order before="anyBefireURI" after="anyafterURI" phase="anyhase" phaseFirst="true" phaseLast="false"/>
            <parameter name="para8" locked="xsd:true">123</parameter>
            <parameter name="para9" locked="xsd:true">456</parameter>
            <parameter name="para10" locked="xsd:true">789</parameter>
        </handler>
    </OutFlow>

    <InFaultFlow>
        <handler name="h4" class="Hander.class">
            <order before="anyBefireURI" after="anyafterURI" phase="anyhase" phaseFirst="true" phaseLast="false"/>
            <parameter name="para8" locked="xsd:true">123</parameter>
            <parameter name="para9" locked="xsd:true">456</parameter>
            <parameter name="para10" locked="xsd:true">789</parameter>
        </handler>
        <handler name="h5" class="Hander.class">
            <order before="anyBefireURI" after="anyafterURI" phase="anyhase" phaseFirst="true" phaseLast="false"/>
            <parameter name="para8" locked="xsd:true">123</parameter>
            <parameter name="para9" locked="xsd:true">456</parameter>
            <parameter name="para10" locked="xsd:true">789</parameter>
        </handler>

        <handler name="Handername" class="Hander.class">
            <order phase="anyhase" phaseFirst="true" phaseLast="false"/>
            <parameter name="para8" locked="xsd:true">123</parameter>
            <parameter name="para9" locked="xsd:true">456</parameter>
            <parameter name="para10" locked="xsd:true">789</parameter>
        </handler>
    </InFaultFlow>


    <operation name="opname" qname="opqname" style="anyStyle" use="anyUse">
        <module ref="uri">
            <parameter name="para3" locked="xsd:true">10</parameter>
            <parameter name="para4">LSF</parameter>
        </module>

        <InFlow>
            <handler ref="anyRef" name="Handername" class="Hander.class">
                <order before="anyBefireURI" after="anyafterURI" phase="anyhase" phaseFirst="true" phaseLast="false"/>
                <parameter name="para8" locked="xsd:true">123</parameter>
                <parameter name="para9" locked="xsd:true">456</parameter>
                <parameter name="para10" locked="xsd:true">789</parameter>
            </handler>

            <handler ref="anyRef">
                <order before="anyBefireURI" after="anyafterURI" phase="anyhase" phaseFirst="true" phaseLast="false"/>

                <parameter name="para8" locked="xsd:true">123</parameter>
                <parameter name="para9" locked="xsd:true">456</parameter>
                <parameter name="para10" locked="xsd:true">789</parameter>
            </handler>

        </InFlow>
        <OutFlow>
            <handler ref="anyRef" name="Handername" class="Hander.class">
                <order before="anyBefireURI" after="anyafterURI" phase="anyhase" phaseFirst="true" phaseLast="false"/>
                <parameter name="para8" locked="xsd:true">123</parameter>
                <parameter name="para9" locked="xsd:true">456</parameter>
                <parameter name="para10" locked="xsd:true">789</parameter>
            </handler>
            <handler ref="anyRef">
                <order before="anyBefireURI" after="anyafterURI" phase="anyhase" phaseFirst="true" phaseLast="false"/>

                <parameter name="para8" locked="xsd:true">123</parameter>
                <parameter name="para9" locked="xsd:true">456</parameter>
                <parameter name="para10" locked="xsd:true">789</parameter>

            </handler>
        </OutFlow>
        <InFaultFlow>
            <handler ref="anyRef" name="Handername" class="Hander.class">
                <order before="anyBefireURI" after="anyafterURI" phase="anyhase" phaseFirst="true" phaseLast="false"/>
                <parameter name="para8" locked="xsd:true">123</parameter>
                <parameter name="para9" locked="xsd:true">456</parameter>
                <parameter name="para10" locked="xsd:true">789</parameter>
            </handler>
            <handler ref="anyRef">
                <order before="anyBefireURI" after="anyafterURI" phase="anyhase" phaseFirst="true" phaseLast="false"/>

                <parameter name="para8" locked="xsd:true">123</parameter>
                <parameter name="para9" locked="xsd:true">456</parameter>
                <parameter name="para10" locked="xsd:true">789</parameter>

            </handler>
        </InFaultFlow>
    </operation>
    <service ref="xsd:anyServiceRef"/>
</service>