<?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 name="groovy-trigger" repeatCount="500" repeatInterval="1000" startDelay="2000" />
       </quartz:trigger>
    </quartz:endpoint>

    <scripting:endpoint service="b:receiver" endpoint="endpoint" 
                        script="document-name:myscript"
                        disableOutput="true"
                        language="groovy" />
	
    <bean id="myscript" class="org.apache.servicemix.document.impl.spring.SpringDocumentFactory">
      <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;
        </value>
      </property>
    </bean>

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

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

</beans>
