<?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.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:quartz="http://servicemix.apache.org/quartz/1.0"
       xmlns:scripting="http://servicemix.apache.org/scripting/1.0"
       xmlns:camel="http://activemq.apache.org/camel/schema/spring"
       xmlns:osgi="http://www.springframework.org/schema/osgi"
       xmlns:b="http://servicemix.apache.org/examples/groovy"
       xsi:schemaLocation="
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/util  http://www.springframework.org/schema/util/spring-util.xsd
         http://www.springframework.org/schema/osgi  http://www.springframework.org/schema/osgi/spring-osgi.xsd
         http://www.springframework.org/schema/osgi-compendium   http://www.springframework.org/schema/osgi-compendium/spring-osgi-compendium.xsd
         http://servicemix.apache.org/quartz/1.0     http://servicemix.apache.org/quartz/1.0/servicemix-quartz.xsd
         http://servicemix.apache.org/scripting/1.0  http://servicemix.apache.org/scripting/1.0/servicemix-scripting.xsd
         http://activemq.apache.org/camel/schema/spring  http://activemq.apache.org/camel/schema/spring/camel-spring.xsd
         http://www.springframework.org/schema/osgi  http://www.springframework.org/schema/osgi/spring-osgi.xsd">

    <quartz:endpoint service="b:service" endpoint="endpoint" targetService="b:receiver">
       <quartz:trigger>
          <quartz:simple repeatCount="500" repeatInterval="1000" startDelay="2000" />
       </quartz:trigger>
    </quartz:endpoint>

    <scripting:endpoint service="b:receiver" endpoint="endpoint" 
                        script="document-name:myscript"
                        language="groovy" />
	
    <bean id="myscript" class="org.apache.servicemix.document.factory.DocumentFactory">
      <property name="repository" ref="repository" />
      <property name="document">
        <value>
           import javax.jbi.messaging.MessageExchange;
           import javax.jbi.messaging.NormalizedMessage;
           import org.apache.servicemix.jbi.jaxp.StringSource;
           import org.apache.servicemix.jbi.jaxp.SourceTransformer;

           println "Starting JSR-223 groovy processor";

           println exchange;       
           def inputMessage = new SourceTransformer().toString(inMessage.getContent());
           println "Hello, I got an input message " + inputMessage;
           NormalizedMessage out = exchange.createMessage();
           out.setContent(new StringSource("&lt;response>" + bindings.get("answerGroovy") + "&lt;/response>"));
           exchange.setMessage(out, "out");
           println exchange;

           println "Stopping JSR-223 groovy processor";
        </value>
      </property>
    </bean>

    <osgi:reference id="repository" interface="org.apache.servicemix.document.DocumentRepository" />

    <bean class="org.apache.servicemix.common.osgi.EndpointExporter" />

</beans>
