<?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.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;
        </value>
      </property>
    </bean>

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

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

</beans>
