Camel
  1. Camel
  2. CAMEL-5815

camel-spring-ws - Support for WS-Addressing Action

    Details

    • Type: New Feature New Feature
    • Status: Open
    • Priority: Major Major
    • Resolution: Unresolved
    • Affects Version/s: 2.11.0
    • Fix Version/s: 2.11.0
    • Component/s: camel-spring-ws
    • Labels:
    • Patch Info:
      Patch Available
    • Estimated Complexity:
      Advanced

      Description

      The camel spring-ws consumer doesn't currently support the WS-Addressing Action and camel cannot dispatch such a message properly. There is only one workaround available using a xpath, which is not a very straight forward solution.

      Based on my previous experience with the patch for attachments and headers I would like to implement this functionality.

      Please let me know if you have any comments or ideas that are left.

      In the solution I would like to implement a new universal endpoint mapping key:

      action

      which will act as the same as the key soapaction but it will add also a possibility to retrieve action from soap wsa:action header instead of current http SOAPAction.

      BTW: Are there any ideas how should be supported wsa:replyTo inside the camel-spring-ws or how should be supported other attributes of WS-Addressing?

      Cheers,
      Andrej

      1. camel-spring-ws-2.11.patch
        50 kB
        Andrej Zachar
      2. camel-spring-ws-replyTo-usingCamelAgain.patch
        55 kB
        Andrej Zachar
      3. camel-spring-ws-replyTo-usingCamelAgain.patch
        55 kB
        Andrej Zachar
      4. camel-spring-ws-trunk-WS-Addressing-Support-IncludingTets.patch
        136 kB
        Andrej Zachar
      5. documentation-spring-ws2.docx
        266 kB
        Andrej Zachar

        Activity

        Hide
        Claus Ibsen added a comment -

        Andrey,

        This sounds good. I have given your wiki account karma to assign tickets.

        Show
        Claus Ibsen added a comment - Andrey, This sounds good. I have given your wiki account karma to assign tickets.
        Hide
        Andrej Zachar added a comment -

        Hello Claus,
        thank you for your answer.

        Does it means that I can commit into SVN directly or I should provide you my patch into this thread? Actually I have a basic solution ready including tests. So I can create patch against 2.10.1 branch.

        Best regards,
        Andrej

        Show
        Andrej Zachar added a comment - Hello Claus, thank you for your answer. Does it means that I can commit into SVN directly or I should provide you my patch into this thread? Actually I have a basic solution ready including tests. So I can create patch against 2.10.1 branch. Best regards, Andrej
        Hide
        Christian Müller added a comment -

        Andrej, please attach your patch. One of the committers will take care of it.

        Show
        Christian Müller added a comment - Andrej, please attach your patch. One of the committers will take care of it.
        Hide
        Claus Ibsen added a comment -

        Andrej, no you are not there yet.

        See this page and read about how to become a committer etc
        http://camel.apache.org/contributing.html

        You JIRA account can just assign tickets, so we can see that you are working on this more easily. As you seem keen on helping with the spring-ws component. And after that possible other tickets etc.

        Also if you want to help with documentation then read this page about the need for signing an ICLA
        http://camel.apache.org/how-do-i-edit-the-website.html

        That would be lovely as you can then improve the spring-ws docs, and also the other parts.

        Show
        Claus Ibsen added a comment - Andrej, no you are not there yet. See this page and read about how to become a committer etc http://camel.apache.org/contributing.html You JIRA account can just assign tickets, so we can see that you are working on this more easily. As you seem keen on helping with the spring-ws component. And after that possible other tickets etc. Also if you want to help with documentation then read this page about the need for signing an ICLA http://camel.apache.org/how-do-i-edit-the-website.html That would be lovely as you can then improve the spring-ws docs, and also the other parts.
        Hide
        Claus Ibsen added a comment -

        We apply patches on trunk, and then backport to previous branches. So your attached patch should be applied on trunk first, and then we backport that to the 2.10 branch. Though as the difference between trunk and 2.10 branch of spring-ws probably is identical, then your work against 2.10 should be fairly easy to apply on trunk.

        Show
        Claus Ibsen added a comment - We apply patches on trunk, and then backport to previous branches. So your attached patch should be applied on trunk first, and then we backport that to the 2.10 branch. Though as the difference between trunk and 2.10 branch of spring-ws probably is identical, then your work against 2.10 should be fairly easy to apply on trunk.
        Hide
        Andrej Zachar added a comment - - edited

        Hello Claus,
        I am sending you my first implementation of the WS-Addressing consuming.
        The patch add supported following routes uri definitions:

        <from uri="spring-ws:action:<your wsa action>?endpointMapping=#wsaEndpointMapping"/>
        <from uri="spring-ws:action:<your wsa action>:<your wsa to>?endpointMapping=#wsaEndpointMapping"/>
        <from uri="spring-ws:to:<your wsa to address>?endpointMapping=#wsaEndpointMapping"/>
        <form uri="spring-ws:to:<your wsa to address>:<your wsa action>?endpointMapping=#wsaEndpointMapping"/>

        If you need to specify reply action for response or fault response you can use similar params to spring ws's @Action, e.g. the output and the fault action. This will cause to generate a response using the WS-Adressing with the explicit stated actions other wise is default response action used as the same as in spring ws impl.

        <route>
        <from
        uri="spring-ws:action:http://www.stockquotes.edu/WSAddresingActionReply?outputAction=http://myOuputAction&amp;faultAction=http://myFaultAction&amp;endpointMapping=#wsaEndpointMapping" />
        <to uri="mock:testOutputAndFault" />
        </route>
        The fault and output params are in this patch supported for spring-ws:action, for spring-ws:to action i will impl. them soon.

        In the examples above I am using the wsaEndpointMapping, which is a brand new implementation of EndpointMapping for action and to préfixes. Impl. is based and extends spring ws addressing classes to avoid duplicities. Also are supported actors and roles.

        <bean id="wsaEndpointMapping"
        class="org.apache.camel.component.spring.ws.bean.WSACamelEndpointMapping">
        <property name="messageSender"> <!-- for replyTo -->
        <!--here is used only sample in memory sender, but it could be mail for instance or http sender.
        I think at this point should be here a class that manage reply using camel. For example it would be nice to specify here
        <to uri="direct:sendMail"> instead of the raw mail impl. of WebServiceMessageSender. This needs to be clarified with the comunity.
        -->
        <bean
        class="net.javacrumbs.springws.test.helper.InMemoryWebServiceMessageSender" />
        </property>
        </bean>

        You can also specify the sender in order to support wsa replyTo. This functionality is still under the conceptual development and It would be nice to discuss it with you.

        Anyway I think the first part of work (consuming) is done and I am looking forward to hear about your comments.
        Tests are essential part of the patch. Documentation will be delivered at the end of impl. - it depends on our father discussion.

        The patch is created against the trunk.

        PS: I have created eclipse project using maven but -Psetup.eclipse did not prepare a formatter. Could you suggest what to do in order to get your code formatter? Thanks.

        Your camel's rider,
        Andrej

        Show
        Andrej Zachar added a comment - - edited Hello Claus, I am sending you my first implementation of the WS-Addressing consuming. The patch add supported following routes uri definitions: <from uri="spring-ws:action:<your wsa action>?endpointMapping=#wsaEndpointMapping"/> <from uri="spring-ws:action:<your wsa action>:<your wsa to>?endpointMapping=#wsaEndpointMapping"/> <from uri="spring-ws:to:<your wsa to address>?endpointMapping=#wsaEndpointMapping"/> <form uri="spring-ws:to:<your wsa to address>:<your wsa action>?endpointMapping=#wsaEndpointMapping"/> If you need to specify reply action for response or fault response you can use similar params to spring ws's @Action, e.g. the output and the fault action. This will cause to generate a response using the WS-Adressing with the explicit stated actions other wise is default response action used as the same as in spring ws impl. <route> <from uri="spring-ws:action: http://www.stockquotes.edu/WSAddresingActionReply?outputAction=http://myOuputAction&amp;faultAction=http://myFaultAction&amp;endpointMapping=#wsaEndpointMapping " /> <to uri="mock:testOutputAndFault" /> </route> The fault and output params are in this patch supported for spring-ws:action, for spring-ws:to action i will impl. them soon. In the examples above I am using the wsaEndpointMapping, which is a brand new implementation of EndpointMapping for action and to préfixes. Impl. is based and extends spring ws addressing classes to avoid duplicities. Also are supported actors and roles. <bean id="wsaEndpointMapping" class="org.apache.camel.component.spring.ws.bean.WSACamelEndpointMapping"> <property name="messageSender"> <!-- for replyTo --> <!--here is used only sample in memory sender, but it could be mail for instance or http sender. I think at this point should be here a class that manage reply using camel. For example it would be nice to specify here <to uri="direct:sendMail"> instead of the raw mail impl. of WebServiceMessageSender. This needs to be clarified with the comunity. --> <bean class="net.javacrumbs.springws.test.helper.InMemoryWebServiceMessageSender" /> </property> </bean> You can also specify the sender in order to support wsa replyTo. This functionality is still under the conceptual development and It would be nice to discuss it with you. Anyway I think the first part of work (consuming) is done and I am looking forward to hear about your comments. Tests are essential part of the patch. Documentation will be delivered at the end of impl. - it depends on our father discussion. The patch is created against the trunk. PS: I have created eclipse project using maven but -Psetup.eclipse did not prepare a formatter. Could you suggest what to do in order to get your code formatter? Thanks. Your camel's rider, Andrej
        Hide
        Claus Ibsen added a comment -

        Hi Andrej

        You can run the code checking, as shown here (Building with checkstyle)
        http://camel.apache.org/building.html

        Then it reports if there is problem. And then you can fix that.
        And if so then please fix and add another patch.

        I dont use Eclipse so i dont know about any pre setup code style.

        Show
        Claus Ibsen added a comment - Hi Andrej You can run the code checking, as shown here (Building with checkstyle) http://camel.apache.org/building.html Then it reports if there is problem. And then you can fix that. And if so then please fix and add another patch. I dont use Eclipse so i dont know about any pre setup code style.
        Hide
        Andrej Zachar added a comment -

        Hello Claus,
        I have done this several times, but still the formatter is not there. Are you sure, it is there?

        Best regards,
        Andrej

        Show
        Andrej Zachar added a comment - Hello Claus, I have done this several times, but still the formatter is not there. Are you sure, it is there? Best regards, Andrej
        Hide
        Andrej Zachar added a comment -

        Hello Claus,
        I have found the answer - http://camel.465427.n5.nabble.com/Procedure-to-format-AND-checkstyle-in-Eclipse-according-to-Camel-rules-td470833.html. Everything is located in trunk/etc/eclipse. I am wondering why the command mvn eclipse:eclipse (if you have checked out only one component spring-ws) cannot setup formater and other templates. I thought that maven will download all dependencies... Anyway I imported all common settings and formaters manually and I have cleaned check style errors too. So next patch will be nicer

        Show
        Andrej Zachar added a comment - Hello Claus, I have found the answer - http://camel.465427.n5.nabble.com/Procedure-to-format-AND-checkstyle-in-Eclipse-according-to-Camel-rules-td470833.html . Everything is located in trunk/etc/eclipse. I am wondering why the command mvn eclipse:eclipse (if you have checked out only one component spring-ws) cannot setup formater and other templates. I thought that maven will download all dependencies... Anyway I imported all common settings and formaters manually and I have cleaned check style errors too. So next patch will be nicer
        Hide
        Claus Ibsen added a comment -

        Good, looking forward to the next patch.

        Show
        Claus Ibsen added a comment - Good, looking forward to the next patch.
        Hide
        Andrej Zachar added a comment - - edited

        Hello!
        I am sending you the complete WS-Addressing implementation for the producer and consumer including tests and source code checkstyle fixes. The patch can be found at https://issues.apache.org/jira/secure/attachment/12555926/camel-spring-ws-trunk-WS-Addressing-Support-IncludingTets.patch

        This patch also provide implementation for the producer, where you can provide replyTo and faultTo WS-Addressing params.

        For example you can type this:

        <to
        uri="spring-ws:http://google.com?wsAddressingAction=http://turnOnWSA.com&amp;replyTo=http://reply.to&amp;faultTo=http://fault.to&amp;webServiceTemplate=#webServiceTemplate&amp;endpointMapping=#endpointMapping" />

        Also i have added support for the actorOrRole+ultimateReceiver for the default and WSA endpoint.

        I am looking forward to hear from you.

        In the mean time I try to prepare a complete documentation for your wiki.

        Best regards,
        Andrej

        Show
        Andrej Zachar added a comment - - edited Hello! I am sending you the complete WS-Addressing implementation for the producer and consumer including tests and source code checkstyle fixes. The patch can be found at https://issues.apache.org/jira/secure/attachment/12555926/camel-spring-ws-trunk-WS-Addressing-Support-IncludingTets.patch This patch also provide implementation for the producer, where you can provide replyTo and faultTo WS-Addressing params. For example you can type this: <to uri="spring-ws: http://google.com?wsAddressingAction=http://turnOnWSA.com&amp;replyTo=http://reply.to&amp;faultTo=http://fault.to&amp;webServiceTemplate=#webServiceTemplate&amp;endpointMapping=#endpointMapping " /> Also i have added support for the actorOrRole+ultimateReceiver for the default and WSA endpoint. I am looking forward to hear from you. In the mean time I try to prepare a complete documentation for your wiki. Best regards, Andrej
        Hide
        Claus Ibsen added a comment -

        Willem do have time to look at this patch and if so apply to trunk?

        Show
        Claus Ibsen added a comment - Willem do have time to look at this patch and if so apply to trunk?
        Hide
        Willem Jiang added a comment -

        @Andrej
        I just have a quick look of your big patch, I found there are some tests are ignored.
        What's your plan about these test cases?

        BTW, I have a question of the WSA producer (client), how did you implement the ultimate receiver?
        For the spring-ws the server is leveraging the MessageDispatcher which could be a servlet to receive the message, you may need to find way to mapping the message to the producer from the ultimate receiver.

        Show
        Willem Jiang added a comment - @Andrej I just have a quick look of your big patch, I found there are some tests are ignored. What's your plan about these test cases? BTW, I have a question of the WSA producer (client), how did you implement the ultimate receiver? For the spring-ws the server is leveraging the MessageDispatcher which could be a servlet to receive the message, you may need to find way to mapping the message to the producer from the ultimate receiver.
        Hide
        Willem Jiang added a comment -

        @Claus,

        I will take care of the patch tomorrow.

        Show
        Willem Jiang added a comment - @Claus, I will take care of the patch tomorrow.
        Hide
        Andrej Zachar added a comment -

        Hello Willem,
        well, initially I did not expect that this patch would grow into this size. Actually I have done more, but I didn't want to include it, it would be may be too much to process at the beginning. So once you are done, I will send you some additional features regarding wsa:replyTo response sender within a camel route. But if you want it now, I can send it

        Ad 1)
        The ultimate receiver and actors+roles are done exactly like in Spring WS, e.g. AbstractAddressingEndpointMapping.
        So my new endpoint WSACamelEndpointMapping has this functionality out-of-box, because it is inherited from the spring-ws's AbstractAddressingEndpointMapping.

        The classical CamelEndpointMapping has the ultimate receiver and actorsOrRoles propagated into
        SoapEndpointInvocationChain(endpoint, interceptors, actorsOrRoles, isUltimateReceiver);

        That is all what was done regarding ultimate receiver and actors+roles.

        Ad 2) Because I am working by TDD, I have done tests but a corresponding functionality is still not developed. Initially I though that I will do it, but I found some problems on the way that did not allow me to do it. If you want I can discuss it with you, but for now, feel free to remove them!

        I hope I have answered your questions.

        Cheers,
        Andrej

        Show
        Andrej Zachar added a comment - Hello Willem, well, initially I did not expect that this patch would grow into this size. Actually I have done more, but I didn't want to include it, it would be may be too much to process at the beginning. So once you are done, I will send you some additional features regarding wsa:replyTo response sender within a camel route. But if you want it now, I can send it Ad 1) The ultimate receiver and actors+roles are done exactly like in Spring WS, e.g. AbstractAddressingEndpointMapping. So my new endpoint WSACamelEndpointMapping has this functionality out-of-box, because it is inherited from the spring-ws's AbstractAddressingEndpointMapping. The classical CamelEndpointMapping has the ultimate receiver and actorsOrRoles propagated into SoapEndpointInvocationChain(endpoint, interceptors, actorsOrRoles, isUltimateReceiver); That is all what was done regarding ultimate receiver and actors+roles. Ad 2) Because I am working by TDD, I have done tests but a corresponding functionality is still not developed. Initially I though that I will do it, but I found some problems on the way that did not allow me to do it. If you want I can discuss it with you, but for now, feel free to remove them! I hope I have answered your questions. Cheers, Andrej
        Hide
        Willem Jiang added a comment -

        Hi Andrej

        As we are not plan to release the Camel 2.11.0 at the end of this year. I think we could have some time to enhance this feature this month. I will try to commit the patch today.

        If you are using git, you can do the commit in some small step, and attache them to the sub issue. It could make me more easier to digest the patches

        Cheers,

        Willem

        Show
        Willem Jiang added a comment - Hi Andrej As we are not plan to release the Camel 2.11.0 at the end of this year. I think we could have some time to enhance this feature this month. I will try to commit the patch today. If you are using git, you can do the commit in some small step, and attache them to the sub issue. It could make me more easier to digest the patches Cheers, Willem
        Hide
        Willem Jiang added a comment -

        Applied the camel-spring-ws-trunk-WS-Addressing-Support-IncludingTets.patch with thanks to Andrej.

        Show
        Willem Jiang added a comment - Applied the camel-spring-ws-trunk-WS-Addressing-Support-IncludingTets.patch with thanks to Andrej.
        Hide
        Andrej Zachar added a comment - - edited

        Hello Willem and Claus!
        thanks for your quick integration!

        As I said I have ready the last patch containing an initial proposal of the reply to solution using the camel channel again.

        Image the sample situation:

        1. Sent from the client a WSA message with the param wsa:replyTo="mailto:andrej@chocolatejar.eu" to the server

        2. On the server the camel spring-ws component somehow resolve the message, prepare an answer by route processing and than

        3. before replying back to the client with a response you can reply by the definition of WSA to a different location, e.g. using reply To you can specify to delivery message by email instead of http response.

        Here we go: what if I want to prepare the reply message by a camel route again ? or use camel mail component to responde?

        That's why I created the initial solution for this problem using custom messageSender, e.g. CamelDirectSender like this:

        <bean id="camelDirectMessageSender" class="org.apache.camel.component.spring.ws.bean.CamelDirectSender">
        <property name="camelContext" ref="camelContext" />
        </bean>

        <route>
        <from uri="spring-ws:to:http://sender-camel.com?messageSender=#camelDirectMessageSender&amp;endpointMapping=#wsaEndpointMapping" />
        <to uri="okResponse" />
        </route>

        <route>
        <from uri="direct:andrej@chocolatejar.eu" />
        .... you can process the reply to as you wish, for example using other component camel:mail:.....
        </route>

        Please let me know, what do you think about this solution.

        In the patch, you can find test CamelDirectSender (CamelDirectSenderTest-context.xml) that shows more how to use it

        Your camel rider,
        Andrej

        Show
        Andrej Zachar added a comment - - edited Hello Willem and Claus! thanks for your quick integration! As I said I have ready the last patch containing an initial proposal of the reply to solution using the camel channel again. Image the sample situation: 1. Sent from the client a WSA message with the param wsa:replyTo="mailto:andrej@chocolatejar.eu" to the server 2. On the server the camel spring-ws component somehow resolve the message, prepare an answer by route processing and than 3. before replying back to the client with a response you can reply by the definition of WSA to a different location, e.g. using reply To you can specify to delivery message by email instead of http response. Here we go: what if I want to prepare the reply message by a camel route again ? or use camel mail component to responde? That's why I created the initial solution for this problem using custom messageSender, e.g. CamelDirectSender like this: <bean id="camelDirectMessageSender" class="org.apache.camel.component.spring.ws.bean.CamelDirectSender"> <property name="camelContext" ref="camelContext" /> </bean> <route> <from uri="spring-ws:to: http://sender-camel.com?messageSender=#camelDirectMessageSender&amp;endpointMapping=#wsaEndpointMapping " /> <to uri="okResponse" /> </route> <route> <from uri="direct: andrej@chocolatejar.eu " /> .... you can process the reply to as you wish, for example using other component camel:mail:..... </route> Please let me know, what do you think about this solution. In the patch, you can find test CamelDirectSender (CamelDirectSenderTest-context.xml) that shows more how to use it Your camel rider, Andrej
        Hide
        Andrej Zachar added a comment -

        PS: @Willem I try to make next changes using git if needed.

        Show
        Andrej Zachar added a comment - PS: @Willem I try to make next changes using git if needed.
        Hide
        Andrej Zachar added a comment -

        PS2: This a related issue in Spring-WS that allows us to create CamelDirectSender, https://jira.springsource.org/browse/SWS-817

        Show
        Andrej Zachar added a comment - PS2: This a related issue in Spring-WS that allows us to create CamelDirectSender, https://jira.springsource.org/browse/SWS-817
        Hide
        Willem Jiang added a comment -

        Hi Andrej,

        The solution you provided sounds good to me. I just apply the patch into the trunk.

        Willem

        Show
        Willem Jiang added a comment - Hi Andrej, The solution you provided sounds good to me. I just apply the patch into the trunk. Willem
        Hide
        Claus Ibsen added a comment -

        Can we get some documentation added to
        http://camel.apache.org/spring-web-services.html

        This is missing!

        Show
        Claus Ibsen added a comment - Can we get some documentation added to http://camel.apache.org/spring-web-services.html This is missing!
        Hide
        Andrej Zachar added a comment -

        Hello Clause,
        I had created it a long time ago, but because of some legal issues related to publishing via apache wiki it was not resolved.

        Here is missing documentation:

        I hope you will get it!

        Best regards,
        Andrej

        Show
        Andrej Zachar added a comment - Hello Clause, I had created it a long time ago, but because of some legal issues related to publishing via apache wiki it was not resolved. Here is missing documentation: I hope you will get it! Best regards, Andrej
        Hide
        Claus Ibsen added a comment -

        Andrej

        Unfortunately I can't see the docs. Can you attach the docs as a file attachment to this JIRA? Then we can accept that and include in the docs.

        Show
        Claus Ibsen added a comment - Andrej Unfortunately I can't see the docs. Can you attach the docs as a file attachment to this JIRA? Then we can accept that and include in the docs.
        Hide
        Christian Müller added a comment -

        Andrej Zachar: I would like to close this issue, but we need the WIKI updated before. Do you have a change to provide the needed documentation?

        Show
        Christian Müller added a comment - Andrej Zachar : I would like to close this issue, but we need the WIKI updated before. Do you have a change to provide the needed documentation?
        Hide
        Babak Vahdat added a comment -

        Just to let you know that on master branch I replaced the hacked version of:

        org.springframework.ws.soap.addressing.server.AbstractAddressingEndpointMapping
        

        with the original one as https://jira.springsource.org/browse/SWS-817 has been already resolved in Spring Web Services 2.1.3. The commit is:

        https://git-wip-us.apache.org/repos/asf?p=camel.git;a=commit;h=7edb7679

        Show
        Babak Vahdat added a comment - Just to let you know that on master branch I replaced the hacked version of: org.springframework.ws.soap.addressing.server.AbstractAddressingEndpointMapping with the original one as https://jira.springsource.org/browse/SWS-817 has been already resolved in Spring Web Services 2.1.3. The commit is: https://git-wip-us.apache.org/repos/asf?p=camel.git;a=commit;h=7edb7679
        Hide
        Andrej Zachar added a comment -

        Thank you!

        Show
        Andrej Zachar added a comment - Thank you!
        Hide
        Claus Ibsen added a comment -

        Thanks for the documentation.

        Do you mind attaching the documentation in a friendly format so we can add it to the Camel wiki documentation at
        http://camel.apache.org/spring-web-services.html

        eg take a look at that link, and see what should be added.
        And then you can attach a .txt file to this JIRA with the new additions.

        The word document seems your own work. What we need is documentation we can add to the existing Camel documentation.

        Show
        Claus Ibsen added a comment - Thanks for the documentation. Do you mind attaching the documentation in a friendly format so we can add it to the Camel wiki documentation at http://camel.apache.org/spring-web-services.html eg take a look at that link, and see what should be added. And then you can attach a .txt file to this JIRA with the new additions. The word document seems your own work. What we need is documentation we can add to the existing Camel documentation.

          People

          • Assignee:
            Willem Jiang
            Reporter:
            Andrej Zachar
          • Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

            • Created:
              Updated:

              Time Tracking

              Estimated:
              Original Estimate - 120h
              120h
              Remaining:
              Remaining Estimate - 120h
              120h
              Logged:
              Time Spent - Not Specified
              Not Specified

                Development