L.S.,

You have to do a channel.send(exchange) after you set the status to
DONE.  In a JBI InOnly exchange, the Active exchange is first sent to
your bean and then that bean is responsible for sending back the DONE
exchange once its work is done.  The file endpoint will only delete
the file if it receives a DONE exchange back (that way, we can ensure
that all the processing was done successfully before we go ahead and
delete the file).

Regards,

Gert Vanthienen
------------------------
Open Source SOA: http://fusesource.com
Blog: http://gertvanthienen.blogspot.com/



2009/12/1 atr <[email protected]>:
>
> Hello.
>
> Thanks for your answer.
> Unfortunately, I tryed your recommendation in my Java-Bean-Code and did not
> solve the problem in this way.
> I added a "Done"-Status to my two beans as you can see below. Is the
> position and the way right?
>
> Her comes my code with the change (at the end of method "process"):
> ===============================================
> package de.mmsdresden.sportscheck.beans;
>
> import java.io.ByteArrayInputStream;
> import java.io.File;
> import java.io.FileNotFoundException;
> import java.io.IOException;
> import java.util.HashMap;
> import java.util.LinkedList;
> import java.util.List;
> import java.util.Map;
> import java.util.Properties;
>
> import javax.annotation.PostConstruct;
> import javax.annotation.Resource;
> import javax.jbi.component.ComponentContext;
> import javax.jbi.messaging.DeliveryChannel;
> import javax.jbi.messaging.ExchangeStatus;
> import javax.jbi.messaging.InOnly;
> import javax.jbi.messaging.MessageExchange;
> import javax.jbi.messaging.MessagingException;
> import javax.jbi.messaging.NormalizedMessage;
> import javax.jbi.messaging.MessageExchange.Role;
> import javax.xml.transform.TransformerConfigurationException;
> import javax.xml.transform.TransformerException;
> import javax.xml.transform.stream.StreamResult;
> import javax.xml.transform.stream.StreamSource;
>
> import org.apache.commons.logging.Log;
> import org.apache.commons.logging.LogFactory;
> import org.apache.servicemix.MessageExchangeListener;
> import org.apache.servicemix.client.ServiceMixClientFacade;
> import org.apache.servicemix.components.util.DefaultFileMarshaler;
> import org.apache.servicemix.jbi.api.Destination;
> import org.apache.servicemix.jbi.api.ServiceMixClient;
> import org.jdom.Document;
> import org.jdom.Element;
> import org.jdom.JDOMException;
> import org.jdom.input.SAXBuilder;
> import org.jdom.output.XMLOutputter;
> import org.milyn.payload.JavaResult;
> import org.xml.sax.SAXException;
>
> import de.mmsdresden.sportscheck.pojos.orders.bfs.output.BFSBusinessCase;
> import de.mmsdresden.sportscheck.pojos.orders.demandware.input.Order;
> import de.mmsdresden.sportscheck.utils.FileNameUtils;
> import de.mmsdresden.sportscheck.utils.Mail;
> import de.mmsdresden.sportscheck.utils.MessageExchangeCache;
> import de.mmsdresden.sportscheck.utils.MessageExchangeCacheImpl;
> import de.mmsdresden.sportscheck.utils.OrderTransformator;
> import de.mmsdresden.sportscheck.utils.ServiceMixUtils;
> import de.mmsdresden.sportscheck.utils.SmooksWrapper;
> import de.mmsdresden.sportscheck.utils.XMLUtils;
> import de.mmsdresden.sportscheck.utils.properties.PropertyLoader;
> import
> de.mmsdresden.sportscheck.utils.properties.factories.FilenamePropertyFactory;
> import
> de.mmsdresden.sportscheck.utils.properties.factories.MailPropertyFactory;
>
> /**
>  * DW -> BFS Order Mapping
>  *
>  * @author Andreas Trappe
>  * @author Andreas Lutz
>  * @since 13.07.2009
>  */
>
> public class OrderBean implements MessageExchangeListener {
>        /**
>         * @see javax.jbi.messaging.DeliveryChannel
>         */
>       �...@resource
>        private DeliveryChannel channel;
>
>        /**
>         * @see javax.jbi.component.ComponentContext
>         */
>       �...@resource
>        private ComponentContext context;
>
>        /**
>         * @see org.apache.servicemix.client.ServiceMixClient
>         */
>        private ServiceMixClient client;
>
>        private Destination fileoutProduction;
>
>        private Destination fileoutTest;
>
>        private static Log LOGGER = LogFactory.getLog(OrderBean.class);
>
>        private static final String SERVICE_NAMESPACE =
> "service:http://sportscheck.com/services/orders/";;
>
>        private static final String FILEOUT_PRODUCTION_ENDPOINT = 
> SERVICE_NAMESPACE
> + "OrdersOutProduction";
>
>        private static final String FILEOUT_TEST_ENDPOINT = SERVICE_NAMESPACE +
> "OrdersOutTest";
>
>        private static final String SMOOKS_ORDER_INPUT_CONF =
> "smooks_conf/orders_dmware_input.xml";
>
>        private static final String SMOOKS_ORDER_OUTPUT_CONF =
> "smooks_conf/orders_bfs_output.xml";
>
>        private MessageExchangeCache exchangeCache = new
> MessageExchangeCacheImpl();
>
>        private PropertyLoader propsFilename = null;
>
>        private String fileInName;
>
>        private String fileOutName;
>
>        private static final String PROPERTIES_PATH_TEST =
> "baur.import.test.orders";
>
>        private static final String PROPERTIES_PATH_PRODUCTION =
> "baur.import.production.orders";
>
>        private static final String DEFAULT_XSL_PATH = "sportscheck_conf/XSL/";
>
>        private static final String DW_XSL = "DW/dw_orders.xsl";
>
>        private static String GLOBAL_ERROR;
>
>        private static String GLOBAL_PROCESS_INVALID_FILES;
>
>        static javax.xml.transform.TransformerFactory factory =
> javax.xml.transform.TransformerFactory.newInstance();
>
>        // some Mail constants //
>        private static String MAIL_SENDMAIL;
>
>        private static String MAIL_SENDER;
>
>        private static String MAIL_RECEIVERS;
>
>        private static String[] MAIL_RECEIVERS_ARRAY;
>
>        private static Mail MAIL;
>
>        private static PropertyLoader props = null;
>        static {
>                try {
>                        props = new MailPropertyFactory().getImplementation();
>                } catch (FileNotFoundException e) {
>                        LOGGER.error(e);
>                } catch (IOException e) {
>                        LOGGER.error(e);
>                }
>                GLOBAL_PROCESS_INVALID_FILES =
> props.getValue("global.processInvalidFiles");
>                MAIL = new Mail();
>                MAIL.setSmtpHost(props.getValue("smtp_host"), 
> props.getValue("smtp_user"),
> props.getValue("smtp_pass"));
>                MAIL_SENDMAIL =
> props.getValue("esb.orders.validateGeneratedXML.invalid.sendmail");
>        }
>
>        /**
>         * This init method checks that the needed artifacts are initialized
>         *
>         * @throws IOException
>         * @throws FileNotFoundException
>         * @throws MessagingException
>         */
>       �...@postconstruct
>        public void init() throws FileNotFoundException, IOException,
> MessagingException {
>                if (this.context == null || this.channel == null) {
>                        throw new IllegalStateException("Bean not 
> initialized");
>                }
>                this.propsFilename = new 
> FilenamePropertyFactory().getImplementation();
>                this.fileOutName = this.propsFilename.getValue("orders");
>
>                /*
>                 * Create client to get the destination (where to send the 
> files)
>                 */
>                this.client = new ServiceMixClientFacade(this.context);
>
>                this.fileoutProduction =
> this.client.createDestination(FILEOUT_PRODUCTION_ENDPOINT);
>                this.fileoutTest = 
> this.client.createDestination(FILEOUT_TEST_ENDPOINT);
>
>                LOGGER.info("-----------------------------------------------");
>                LOGGER.info("--------- Order mapping initialized -----------");
>                LOGGER.info("-----------------------------------------------");
>                LOGGER.info("-> For more informations turn on debug logging.");
>        }
>
>        /*
>         * (non-Javadoc)
>         *
>         * @see
>         * 
> org.apache.servicemix.MessageExchangeListener#onMessageExchange(javax
>         * .jbi.messaging.MessageExchange)
>         */
>        public synchronized void onMessageExchange(MessageExchange exchange) 
> throws
> MessagingException {
>                LOGGER.debug("Received Exchange: " + exchange.getExchangeId());
>
>                if (exchange.getRole().equals(Role.CONSUMER)) {
>                        if 
> (this.exchangeCache.containsKey(exchange.getExchangeId())) {
>                                boolean done = true;
>                                boolean error = false;
>                                LOGGER.debug("Exchange has status: " + 
> exchange.getStatus());
>                                if 
> (exchange.getStatus().equals(ExchangeStatus.ACTIVE))
>                                        done = false;
>                                if 
> (exchange.getStatus().equals(ExchangeStatus.ERROR))
>                                        error = true;
>                                if (done && !error) {
>                                        LOGGER.debug("Setting exchange: " + 
> exchange.getExchangeId() + " to
> DONE!");
>                                        ServiceMixUtils.sendMessage(exchange, 
> ExchangeStatus.DONE,
> this.channel);
>                                        
> this.exchangeCache.removeFromCache(exchange.getExchangeId());
>                                }
>                        }
>                } else {
>                        try {
>                                process(exchange);
>                        } catch (IOException e) {
>                                LOGGER.error(e);
>                        } catch (SAXException e) {
>                                LOGGER.error(e);
>                        } catch (TransformerException e) {
>                                LOGGER.error(e);
>                        }
>                }
>                LOGGER.debug("Exchanges in cache: " + 
> this.exchangeCache.size());
>        }
>
>        private void process(MessageExchange exchange) throws 
> TransformerException,
> IOException, SAXException, MessagingException {
>                // process message //
>                InOnly inExchange = (InOnly) exchange;
>                NormalizedMessage message = inExchange.getInMessage();
>                String filePath = (String)
> message.getProperty(DefaultFileMarshaler.FILE_PATH_PROPERTY);
>                this.fileInName = (String)
> message.getProperty(DefaultFileMarshaler.FILE_NAME_PROPERTY);
>                StreamSource content = 
> ServiceMixUtils.getMessagePayload(message);
>                LOGGER.info("Processing Exchange Message, with file name " + 
> fileInName);
>
>                // fix DW XML (Smooks only works with unique tag-ids) //
>                LOGGER.info("Fixing DW XML file ...");
>                content = fixedXML(content);
>
>                // get XML into JAVA //
>                LOGGER.info("Mapping XML to Java ...");
>                List<Order> in_orders = xmlTojava(content);
>
>                // process JAVA with business logic
>                LOGGER.info("Processing Java to Java ...");
>                LinkedList<BFSBusinessCase> transformedOrders = 
> javaTojava(in_orders);
>
>                // create XML from JAVA //
>                LOGGER.info("Creating XML from Java ...");
>                StreamResult out = javaToxml(transformedOrders);
>
>                // validate generated xml //
>                LOGGER.info("Validating generated XML ...");
>                boolean isvalid = validate(filePath, out);
>                if (!isvalid && MAIL_SENDMAIL.equals("1")) {
>                        sendErrorMail(filePath);
>                }
>
>                // ouput XML //
>                if (isvalid || (!isvalid && 
> GLOBAL_PROCESS_INVALID_FILES.equals("1")))
>                        outputToFile(filePath, out);
>
>                // Done //
>                exchange.setStatus(ExchangeStatus.DONE);
>                LOGGER.info("Done processing exchange message ...");
>        }
>
>        private StreamSource fixedXML(StreamSource content) throws IOException,
> TransformerConfigurationException, FileNotFoundException {
>                SAXBuilder sb = new SAXBuilder();
>                try {
>                        Document doc = sb.build(content.getInputStream());
>                        Element root = doc.getRootElement();
>                        Element transformed = XMLUtils.modifyXML(root,
> System.getProperty("user.dir") + File.separator + DEFAULT_XSL_PATH +
> DW_XSL);
>
>                        XMLOutputter xo = new XMLOutputter();
>                        // xo.output(transformed, new 
> FileWriter("c:\\test.xml"));
>                        return new StreamSource(new
> ByteArrayInputStream(xo.outputString(transformed).getBytes()));
>
>                } catch (JDOMException e) {
>                        LOGGER.error("Error parsing XML JDOM - " + e);
>                        return null;
>                }
>        }
>
>        private StreamResult javaToxml(LinkedList<BFSBusinessCase>
> transformedOrders) throws IOException, SAXException {
>                SmooksWrapper xmlMapper = SmooksWrapper.getInstance();
>                Map<String, Object> outObjects = new HashMap<String, Object>();
>                outObjects.put("transformedOrders", transformedOrders);
>                StreamResult out = 
> xmlMapper.mapJavaToXML(SMOOKS_ORDER_OUTPUT_CONF,
> outObjects);
>                return out;
>        }
>
>        private LinkedList<BFSBusinessCase> javaTojava(List<Order> in_orders) {
>                OrderTransformator transformer = new 
> OrderTransformator(in_orders, true,
> fileInName);
>                transformer.transform();
>                LinkedList<BFSBusinessCase> transformedOrders = 
> transformer.getResult();
>                return transformedOrders;
>        }
>
>       �...@suppresswarnings("unchecked")
>        private List<Order> xmlTojava(StreamSource content) throws IOException,
> SAXException {
>                SmooksWrapper xmlMapper = SmooksWrapper.getInstance();
>                JavaResult result = 
> xmlMapper.mapXMLtoJava(SMOOKS_ORDER_INPUT_CONF,
> content);
>                List<Order> in_orders = (LinkedList<Order>) 
> result.getBean("orders");
>                return in_orders;
>        }
>
>        private boolean validate(String filePath, StreamResult out) {
>                String path = null;
>                if (ServiceMixUtils.isTestDir(filePath))
>                        path = PROPERTIES_PATH_TEST;
>                else
>                        path = PROPERTIES_PATH_PRODUCTION;
>                try {
>                        XMLUtils.validateXML(out.getOutputStream(), path);
>                } catch (Exception e) {
>                        LOGGER.error("Exception: " + e);
>                        GLOBAL_ERROR = e.getMessage();
>                        return false;
>                }
>                return true;
>        }
>
>        private void sendErrorMail(String filePath) {
>                MAIL_SENDER =
> props.getValue("esb.orders.validateGeneratedXML.invalid.sender");
>                MAIL_RECEIVERS =
> props.getValue("esb.orders.validateGeneratedXML.invalid.receivers");
>                // split receivers //
>                if (MAIL_RECEIVERS.indexOf("|") > -1) {
>                        MAIL_RECEIVERS_ARRAY = MAIL_RECEIVERS.split("\\|");
>                } else {
>                        MAIL_RECEIVERS_ARRAY = new String[1];
>                        MAIL_RECEIVERS_ARRAY[0] = new String(MAIL_RECEIVERS);
>                }
>                MAIL.setContent(MAIL_SENDER, "Error while validating generated 
> Baur order
> file");
>                MAIL.addRecipients(MAIL_RECEIVERS_ARRAY);
>                MAIL.addText("Error validating " + filePath + ":");
>                MAIL.addText(GLOBAL_ERROR);
>                if (!MAIL.sendMail()) {
>                        LOGGER.error("Could not sent mail.\r\n Error: " + 
> MAIL.lastError);
>                }
>        }
>
>        private void outputToFile(String filePath, StreamResult out) throws
> MessagingException, IOException {
>                LOGGER.info("Saving XML to Filesystem ...");
>
>                MessageExchange[] exchanges = null;
>
>                if (ServiceMixUtils.isTestDir(filePath)) {
>                        exchanges = new MessageExchange[1];
>
>                        // fileout test copy //
>                        Properties fileOutProps = new Properties();
>                        String fileOutTotal =
> FileNameUtils.getOutFilenameWithUniqueKey(this.fileOutName, fileInName,
> ".xml");
>                        
> fileOutProps.put(DefaultFileMarshaler.FILE_NAME_PROPERTY, fileOutTotal);
>                        exchanges[0] = 
> ServiceMixUtils.sendMessage(this.fileoutTest, out,
> fileOutProps, this.client);
>                        LOGGER.debug("Exchange created: " + 
> exchanges[0].getExchangeId() + ",
> with file name " + fileOutTotal);
>
>                } else {
>                        exchanges = new MessageExchange[1];
>
>                        // fileout production copy //
>                        Properties fileOutProps = new Properties();
>                        String fileOutTotal =
> FileNameUtils.getOutFilenameWithUniqueKey(this.fileOutName, fileInName,
> ".xml");
>                        
> fileOutProps.put(DefaultFileMarshaler.FILE_NAME_PROPERTY, fileOutTotal);
>                        exchanges[0] = 
> ServiceMixUtils.sendMessage(this.fileoutProduction, out,
> fileOutProps, this.client);
>                        LOGGER.debug("Exchange created - Production file: " +
> exchanges[0].getExchangeId() + ", with file name " + fileOutTotal);
>                }
>        }
> }
>
>
>
>
>
> Gert Vanthienen wrote:
>>
>> L.S.,
>>
>> Perhaps I'm missing something in that code snippet, but I don't see
>> the place in the bean's code where the incoming exchange is being
>> answered with a DONE.  The exchanges that being sent from the
>> component seem to be handled OK.
>>
>> You should probably be looking for a missing DONE exchange for the
>> InOnly exchanges that are sent by the static-recipient-list to the
>> orderBean and archiveBean.
>>
>> Regards,
>>
>> Gert Vanthienen
>> ------------------------
>> Open Source SOA: http://fusesource.com
>> Blog: http://gertvanthienen.blogspot.com/
>>
>>
>>
>> 2009/11/30 atr <[email protected]>:
>>>
>>> Hello.
>>>
>>> I have a problem with a file:poller based transformation: My incoming
>>> file
>>> won't be deleted while processing.
>>> Why the file will not be deleted?
>>> I use Servicemix 3.3.. Below you'll find my configurations and also my
>>> transformation Java-Bean.
>>> I have no errors in my log file and the transformation is done well.
>>>
>>> By the way, I have migrated from Servicemix 3.2.2 to Version 3.3 and
>>> changed
>>> in the xbean.xml-Heead the version of XSD-Schema for servicemix-file and
>>> servicemix-eip. But this change does not solve the problem.
>>>
>>> Her you find my code:
>>>
>>> File-Poller-XBean
>>> ==============================================
>>> ==============================================
>>> <beans xmlns:file="http://servicemix.apache.org/file/1.0";
>>>       xmlns:sportscheck="http://sportscheck.com/services/orders";
>>>       xmlns="http://www.springframework.org/schema/beans";
>>>       xmlns:xsi="http://http://www.w3.org/2001/XMLSchema-instance";
>>>       xsi:schemaLocation="http://servicemix.apache.org/file/1.0
>>> http://servicemix.apache.org/schema/servicemix-file-2008.01.xsd
>>>       http://www.springframework.org/schema/beans
>>> http://www.springframework.org/schema/beans/spring-beans-2.0.xsd";>
>>>
>>>
>>>        <file:poller service="sportscheck:OrdersInProduction"
>>>                endpoint="endpoint"
>>>                targetService="sportscheck:eip"
>>>                file="${demandware.export.production.orders}"
>>>                recursive="true"
>>>                period="${orders.dw.export.210.filepoller}"
>>>                filter="#XMLFilter"
>>>                deleteFile="true">
>>>        </file:poller>
>>>
>>>        <file:sender service="sportscheck:OrdersOutProduction"
>>>                endpoint="endpoint"
>>>                directory="${baur.import.production.orders}">
>>>        </file:sender>
>>>
>>>  <file:poller service="sportscheck:OrdersInTest"
>>>                endpoint="endpoint"
>>>                targetService="sportscheck:eip"
>>>                file="${demandware.export.test.orders}"
>>>                recursive="true"
>>>                period="${orders.dw.export.210.filepoller}"
>>>                filter="#XMLFilter">
>>>        </file:poller>
>>>
>>>  <file:sender service="sportscheck:OrdersOutTest"
>>>                endpoint="endpoint"
>>>                directory="${baur.import.test.orders}">
>>>        </file:sender>
>>>
>>>    <file:sender service="sportscheck:archive"
>>>        endpoint="endpoint"
>>>        directory="${archive.orders}">
>>>    </file:sender>
>>>  <bean id="propertyConfigurer"
>>> class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
>>>      <property name="locations">
>>>      <list>
>>>         <value>classpath:pathes.properties</value>
>>>         <value>classpath:my.properties</value>
>>>        </list>
>>>      </property>
>>>        </bean>
>>>
>>>        <bean id="XMLFilter"
>>> class="de.mmsdresden.sportscheck.utils.RecursiveFileFilter">
>>>                <constructor-arg value=".xml" />
>>>        </bean>
>>> </beans>
>>>
>>>
>>> EIP-XBean
>>> ==============================================
>>> ==============================================
>>> <beans xmlns:eip="http://servicemix.apache.org/eip/1.0";
>>>       xmlns:sportscheck="http://sportscheck.com/services/orders";
>>>       xmlns="http://www.springframework.org/schema/beans";
>>>       xmlns:xsi="http://http://www.w3.org/2001/XMLSchema-instance";
>>>       xsi:schemaLocation="http://servicemix.apache.org/eip/1.0
>>>
>>> http://servicemix.apache.org/schema/servicemix-bean-2008.01.xsd
>>>                           http://www.springframework.org/schema/beans
>>>
>>> http://www.springframework.org/schema/beans/spring-beans-2.0.xsd";>
>>>
>>>        <eip:static-recipient-list service="sportscheck:eip"
>>> endpoint="endpoint">
>>>                <eip:recipients>
>>>                        <eip:exchange-target
>>> service="sportscheck:orderBean"
>>> />
>>>                        <eip:exchange-target
>>> service="sportscheck:archiveBean" />
>>>                </eip:recipients>
>>>        </eip:static-recipient-list>
>>>
>>> </beans>
>>>
>>>
>>> Bean-XBean
>>> ==============================================
>>> ==============================================
>>> <beans xmlns="http://www.springframework.org/schema/beans";
>>>       xmlns:bean="http://servicemix.apache.org/bean/1.0";
>>>       xmlns:sportscheck="http://sportscheck.com/services/orders";
>>>       xmlns:xsi="http://http://www.w3.org/2001/XMLSchema-instance";
>>>       xsi:schemaLocation="http://servicemix.apache.org/bean/1.0
>>> http://servicemix.apache.org/schema/servicemix-bean-2008.01.xsd
>>>       http://www.springframework.org/schema/beans
>>> http://www.springframework.org/schema/beans/spring-beans-2.0.xsd";>
>>>
>>>        <bean:endpoint service="sportscheck:orderBean"
>>>                endpoint="endpoint" bean="#OrderBean" />
>>>
>>>        <bean id="OrderBean"
>>> class="de.mmsdresden.sportscheck.beans.OrderBean" />
>>>
>>>        <bean:endpoint service="sportscheck:archiveBean"
>>>                endpoint="endpoint" bean="#ArchiveBean" />
>>>
>>>        <bean id="ArchiveBean"
>>> class="de.mmsdresden.sportscheck.beans.ArchiveBean" />
>>>
>>> </beans>
>>>
>>>
>>> Java-Bean
>>> ==============================================
>>> ==============================================
>>> package de.mmsdresden.sportscheck.beans;
>>>
>>> import java.io.ByteArrayInputStream;
>>> import java.io.File;
>>> import java.io.FileNotFoundException;
>>> import java.io.IOException;
>>> import java.util.HashMap;
>>> import java.util.LinkedList;
>>> import java.util.List;
>>> import java.util.Map;
>>> import java.util.Properties;
>>>
>>> import javax.annotation.PostConstruct;
>>> import javax.annotation.Resource;
>>> import javax.jbi.component.ComponentContext;
>>> import javax.jbi.messaging.DeliveryChannel;
>>> import javax.jbi.messaging.ExchangeStatus;
>>> import javax.jbi.messaging.InOnly;
>>> import javax.jbi.messaging.MessageExchange;
>>> import javax.jbi.messaging.MessagingException;
>>> import javax.jbi.messaging.NormalizedMessage;
>>> import javax.jbi.messaging.MessageExchange.Role;
>>> import javax.xml.transform.TransformerConfigurationException;
>>> import javax.xml.transform.TransformerException;
>>> import javax.xml.transform.stream.StreamResult;
>>> import javax.xml.transform.stream.StreamSource;
>>>
>>> import org.apache.commons.logging.Log;
>>> import org.apache.commons.logging.LogFactory;
>>> import org.apache.servicemix.MessageExchangeListener;
>>> import org.apache.servicemix.client.ServiceMixClientFacade;
>>> import org.apache.servicemix.components.util.DefaultFileMarshaler;
>>> import org.apache.servicemix.jbi.api.Destination;
>>> import org.apache.servicemix.jbi.api.ServiceMixClient;
>>> import org.jdom.Document;
>>> import org.jdom.Element;
>>> import org.jdom.JDOMException;
>>> import org.jdom.input.SAXBuilder;
>>> import org.jdom.output.XMLOutputter;
>>> import org.milyn.payload.JavaResult;
>>> import org.xml.sax.SAXException;
>>>
>>> import de.mmsdresden.sportscheck.pojos.orders.bfs.output.BFSBusinessCase;
>>> import de.mmsdresden.sportscheck.pojos.orders.demandware.input.Order;
>>> import de.mmsdresden.sportscheck.utils.FileNameUtils;
>>> import de.mmsdresden.sportscheck.utils.Mail;
>>> import de.mmsdresden.sportscheck.utils.MessageExchangeCache;
>>> import de.mmsdresden.sportscheck.utils.MessageExchangeCacheImpl;
>>> import de.mmsdresden.sportscheck.utils.OrderTransformator;
>>> import de.mmsdresden.sportscheck.utils.ServiceMixUtils;
>>> import de.mmsdresden.sportscheck.utils.SmooksWrapper;
>>> import de.mmsdresden.sportscheck.utils.XMLUtils;
>>> import de.mmsdresden.sportscheck.utils.properties.PropertyLoader;
>>> import
>>> de.mmsdresden.sportscheck.utils.properties.factories.FilenamePropertyFactory;
>>> import
>>> de.mmsdresden.sportscheck.utils.properties.factories.MailPropertyFactory;
>>>
>>> /**
>>>  * DW -> BFS Order Mapping
>>>  *
>>>  * @author Andreas Trappe
>>>  * @author Andreas Lutz
>>>  * @since 13.07.2009
>>>  */
>>>
>>> public class OrderBean implements MessageExchangeListener {
>>>        /**
>>>         * @see javax.jbi.messaging.DeliveryChannel
>>>         */
>>>       �...@resource
>>>        private DeliveryChannel channel;
>>>
>>>        /**
>>>         * @see javax.jbi.component.ComponentContext
>>>         */
>>>       �...@resource
>>>        private ComponentContext context;
>>>
>>>        /**
>>>         * @see org.apache.servicemix.client.ServiceMixClient
>>>         */
>>>        private ServiceMixClient client;
>>>
>>>        private Destination fileoutProduction;
>>>
>>>        private Destination fileoutTest;
>>>
>>>        private static Log LOGGER = LogFactory.getLog(OrderBean.class);
>>>
>>>        private static final String SERVICE_NAMESPACE =
>>> "service:http://sportscheck.com/services/orders/";;
>>>
>>>        private static final String FILEOUT_PRODUCTION_ENDPOINT =
>>> SERVICE_NAMESPACE + "OrdersOutProduction";
>>>
>>>        private static final String FILEOUT_TEST_ENDPOINT =
>>> SERVICE_NAMESPACE + "OrdersOutTest";
>>>
>>>        private static final String SMOOKS_ORDER_INPUT_CONF =
>>> "smooks_conf/orders_dmware_input.xml";
>>>
>>>        private static final String SMOOKS_ORDER_OUTPUT_CONF =
>>> "smooks_conf/orders_bfs_output.xml";
>>>
>>>        private MessageExchangeCache exchangeCache = new
>>> MessageExchangeCacheImpl();
>>>
>>>        private PropertyLoader propsFilename = null;
>>>
>>>        private String fileInName;
>>>
>>>        private String fileOutName;
>>>
>>>        private static final String PROPERTIES_PATH_TEST =
>>> "baur.import.test.orders";
>>>
>>>        private static final String PROPERTIES_PATH_PRODUCTION =
>>> "baur.import.production.orders";
>>>
>>>        private static final String DEFAULT_XSL_PATH =
>>> "sportscheck_conf/XSL/";
>>>
>>>        private static final String DW_XSL = "DW/dw_orders.xsl";
>>>
>>>        private static String GLOBAL_ERROR;
>>>
>>>        private static String GLOBAL_PROCESS_INVALID_FILES;
>>>
>>>        static javax.xml.transform.TransformerFactory factory =
>>> javax.xml.transform.TransformerFactory.newInstance();
>>>
>>>        // some Mail constants //
>>>        private static String MAIL_SENDMAIL;
>>>
>>>        private static String MAIL_SENDER;
>>>
>>>        private static String MAIL_RECEIVERS;
>>>
>>>        private static String[] MAIL_RECEIVERS_ARRAY;
>>>
>>>        private static Mail MAIL;
>>>
>>>        private static PropertyLoader props = null;
>>>        static {
>>>                try {
>>>                        props = new
>>> MailPropertyFactory().getImplementation();
>>>                } catch (FileNotFoundException e) {
>>>                        LOGGER.error(e);
>>>                } catch (IOException e) {
>>>                        LOGGER.error(e);
>>>                }
>>>                GLOBAL_PROCESS_INVALID_FILES =
>>> props.getValue("global.processInvalidFiles");
>>>                MAIL = new Mail();
>>>                MAIL.setSmtpHost(props.getValue("smtp_host"),
>>> props.getValue("smtp_user"), props.getValue("smtp_pass"));
>>>                MAIL_SENDMAIL =
>>> props.getValue("esb.orders.validateGeneratedXML.invalid.sendmail");
>>>        }
>>>
>>>        /**
>>>         * This init method checks that the needed artifacts are
>>> initialized
>>>         *
>>>         * @throws IOException
>>>         * @throws FileNotFoundException
>>>         * @throws MessagingException
>>>         */
>>>       �...@postconstruct
>>>        public void init() throws FileNotFoundException, IOException,
>>> MessagingException {
>>>                if (this.context == null || this.channel == null) {
>>>                        throw new IllegalStateException("Bean not
>>> initialized");
>>>                }
>>>                this.propsFilename = new
>>> FilenamePropertyFactory().getImplementation();
>>>                this.fileOutName = this.propsFilename.getValue("orders");
>>>
>>>                /*
>>>                 * Create client to get the destination (where to send the
>>> files)
>>>                 */
>>>                this.client = new ServiceMixClientFacade(this.context);
>>>
>>>                this.fileoutProduction =
>>> this.client.createDestination(FILEOUT_PRODUCTION_ENDPOINT);
>>>                this.fileoutTest =
>>> this.client.createDestination(FILEOUT_TEST_ENDPOINT);
>>>
>>>
>>> LOGGER.info("-----------------------------------------------");
>>>                LOGGER.info("--------- Order mapping initialized
>>> -----------");
>>>
>>> LOGGER.info("-----------------------------------------------");
>>>                LOGGER.info("-> For more informations turn on debug
>>> logging.");
>>>        }
>>>
>>>        /*
>>>         * (non-Javadoc)
>>>         *
>>>         * @see
>>>         *
>>> org.apache.servicemix.MessageExchangeListener#onMessageExchange(javax
>>>         * .jbi.messaging.MessageExchange)
>>>         */
>>>        public synchronized void onMessageExchange(MessageExchange
>>> exchange)
>>> throws MessagingException {
>>>                LOGGER.debug("Received Exchange: " +
>>> exchange.getExchangeId());
>>>
>>>                if (exchange.getRole().equals(Role.CONSUMER)) {
>>>                        if
>>> (this.exchangeCache.containsKey(exchange.getExchangeId())) {
>>>                                boolean done = true;
>>>                                boolean error = false;
>>>                                LOGGER.debug("Exchange has status: " +
>>> exchange.getStatus());
>>>                                if
>>> (exchange.getStatus().equals(ExchangeStatus.ACTIVE))
>>>                                        done = false;
>>>                                if
>>> (exchange.getStatus().equals(ExchangeStatus.ERROR))
>>>                                        error = true;
>>>                                if (done && !error) {
>>>                                        LOGGER.debug("Setting exchange: "
>>> +
>>> exchange.getExchangeId() + " to DONE!");
>>>
>>> ServiceMixUtils.sendMessage(exchange, ExchangeStatus.DONE, this.channel);
>>>
>>> this.exchangeCache.removeFromCache(exchange.getExchangeId());
>>>                                }
>>>                        }
>>>                } else {
>>>                        try {
>>>                                process(exchange);
>>>                        } catch (IOException e) {
>>>                                LOGGER.error(e);
>>>                        } catch (SAXException e) {
>>>                                LOGGER.error(e);
>>>                        } catch (TransformerException e) {
>>>                                LOGGER.error(e);
>>>                        }
>>>                }
>>>                LOGGER.debug("Exchanges in cache: " +
>>> this.exchangeCache.size());
>>>        }
>>>
>>>        private void process(MessageExchange exchange) throws
>>> TransformerException, IOException, SAXException, MessagingException {
>>>                // process message //
>>>                InOnly inExchange = (InOnly) exchange;
>>>                NormalizedMessage message = inExchange.getInMessage();
>>>                String filePath = (String)
>>> message.getProperty(DefaultFileMarshaler.FILE_PATH_PROPERTY);
>>>                this.fileInName = (String)
>>> message.getProperty(DefaultFileMarshaler.FILE_NAME_PROPERTY);
>>>                StreamSource content =
>>> ServiceMixUtils.getMessagePayload(message);
>>>                LOGGER.info("Processing Exchange Message, with file name "
>>> +
>>> fileInName);
>>>
>>>                // fix DW XML (Smooks only works with unique tag-ids) //
>>>                LOGGER.info("Fixing DW XML file ...");
>>>                content = fixedXML(content);
>>>
>>>                // get XML into JAVA //
>>>                LOGGER.info("Mapping XML to Java ...");
>>>                List<Order> in_orders = xmlTojava(content);
>>>
>>>                // process JAVA with business logic
>>>                LOGGER.info("Processing Java to Java ...");
>>>                LinkedList<BFSBusinessCase> transformedOrders =
>>> javaTojava(in_orders);
>>>
>>>                // create XML from JAVA //
>>>                LOGGER.info("Creating XML from Java ...");
>>>                StreamResult out = javaToxml(transformedOrders);
>>>
>>>                // validate generated xml //
>>>                LOGGER.info("Validating generated XML ...");
>>>                boolean isvalid = validate(filePath, out);
>>>                if (!isvalid && MAIL_SENDMAIL.equals("1")) {
>>>                        sendErrorMail(filePath);
>>>                }
>>>
>>>                // ouput XML //
>>>                if (isvalid || (!isvalid &&
>>> GLOBAL_PROCESS_INVALID_FILES.equals("1")))
>>>                        outputToFile(filePath, out);
>>>
>>>                // Done //
>>>                LOGGER.info("Done processing exchange message ...");
>>>        }
>>>
>>>        private StreamSource fixedXML(StreamSource content) throws
>>> IOException, TransformerConfigurationException, FileNotFoundException {
>>>                SAXBuilder sb = new SAXBuilder();
>>>                try {
>>>                        Document doc = sb.build(content.getInputStream());
>>>                        Element root = doc.getRootElement();
>>>                        Element transformed = XMLUtils.modifyXML(root,
>>> System.getProperty("user.dir") + File.separator + DEFAULT_XSL_PATH +
>>> DW_XSL);
>>>
>>>                        XMLOutputter xo = new XMLOutputter();
>>>                        // xo.output(transformed, new
>>> FileWriter("c:\\test.xml"));
>>>                        return new StreamSource(new
>>> ByteArrayInputStream(xo.outputString(transformed).getBytes()));
>>>
>>>                } catch (JDOMException e) {
>>>                        LOGGER.error("Error parsing XML JDOM - " + e);
>>>                        return null;
>>>                }
>>>        }
>>>
>>>        private StreamResult javaToxml(LinkedList<BFSBusinessCase>
>>> transformedOrders) throws IOException, SAXException {
>>>                SmooksWrapper xmlMapper = SmooksWrapper.getInstance();
>>>                Map<String, Object> outObjects = new HashMap<String,
>>> Object>();
>>>                outObjects.put("transformedOrders", transformedOrders);
>>>                StreamResult out =
>>> xmlMapper.mapJavaToXML(SMOOKS_ORDER_OUTPUT_CONF, outObjects);
>>>                return out;
>>>        }
>>>
>>>        private LinkedList<BFSBusinessCase> javaTojava(List<Order>
>>> in_orders) {
>>>                OrderTransformator transformer = new
>>> OrderTransformator(in_orders, true, fileInName);
>>>                transformer.transform();
>>>                LinkedList<BFSBusinessCase> transformedOrders =
>>> transformer.getResult();
>>>                return transformedOrders;
>>>        }
>>>
>>>       �...@suppresswarnings("unchecked")
>>>        private List<Order> xmlTojava(StreamSource content) throws
>>> IOException, SAXException {
>>>                SmooksWrapper xmlMapper = SmooksWrapper.getInstance();
>>>                JavaResult result =
>>> xmlMapper.mapXMLtoJava(SMOOKS_ORDER_INPUT_CONF, content);
>>>                List<Order> in_orders = (LinkedList<Order>)
>>> result.getBean("orders");
>>>                return in_orders;
>>>        }
>>>
>>>        private boolean validate(String filePath, StreamResult out) {
>>>                String path = null;
>>>                if (ServiceMixUtils.isTestDir(filePath))
>>>                        path = PROPERTIES_PATH_TEST;
>>>                else
>>>                        path = PROPERTIES_PATH_PRODUCTION;
>>>                try {
>>>                        XMLUtils.validateXML(out.getOutputStream(), path);
>>>                } catch (Exception e) {
>>>                        LOGGER.error("Exception: " + e);
>>>                        GLOBAL_ERROR = e.getMessage();
>>>                        return false;
>>>                }
>>>                return true;
>>>        }
>>>
>>>        private void sendErrorMail(String filePath) {
>>>                MAIL_SENDER =
>>> props.getValue("esb.orders.validateGeneratedXML.invalid.sender");
>>>                MAIL_RECEIVERS =
>>> props.getValue("esb.orders.validateGeneratedXML.invalid.receivers");
>>>                // split receivers //
>>>                if (MAIL_RECEIVERS.indexOf("|") > -1) {
>>>                        MAIL_RECEIVERS_ARRAY =
>>> MAIL_RECEIVERS.split("\\|");
>>>                } else {
>>>                        MAIL_RECEIVERS_ARRAY = new String[1];
>>>                        MAIL_RECEIVERS_ARRAY[0] = new
>>> String(MAIL_RECEIVERS);
>>>                }
>>>                MAIL.setContent(MAIL_SENDER, "Error while validating
>>> generated Baur order file");
>>>                MAIL.addRecipients(MAIL_RECEIVERS_ARRAY);
>>>                MAIL.addText("Error validating " + filePath + ":");
>>>                MAIL.addText(GLOBAL_ERROR);
>>>                if (!MAIL.sendMail()) {
>>>                        LOGGER.error("Could not sent mail.\r\n Error: " +
>>> MAIL.lastError);
>>>                }
>>>        }
>>>
>>>        private void outputToFile(String filePath, StreamResult out)
>>> throws
>>> MessagingException, IOException {
>>>                LOGGER.info("Saving XML to Filesystem ...");
>>>
>>>                MessageExchange[] exchanges = null;
>>>
>>>                if (ServiceMixUtils.isTestDir(filePath)) {
>>>                        exchanges = new MessageExchange[1];
>>>
>>>                        // fileout test copy //
>>>                        Properties fileOutProps = new Properties();
>>>                        String fileOutTotal =
>>> FileNameUtils.getOutFilenameWithUniqueKey(this.fileOutName, fileInName,
>>> ".xml");
>>>
>>> fileOutProps.put(DefaultFileMarshaler.FILE_NAME_PROPERTY, fileOutTotal);
>>>                        exchanges[0] =
>>> ServiceMixUtils.sendMessage(this.fileoutTest, out, fileOutProps,
>>> this.client);
>>>                        LOGGER.debug("Exchange created: " +
>>> exchanges[0].getExchangeId() + ", with file name " + fileOutTotal);
>>>
>>>                } else {
>>>                        exchanges = new MessageExchange[1];
>>>
>>>                        // fileout production copy //
>>>                        Properties fileOutProps = new Properties();
>>>                        String fileOutTotal =
>>> FileNameUtils.getOutFilenameWithUniqueKey(this.fileOutName, fileInName,
>>> ".xml");
>>>
>>> fileOutProps.put(DefaultFileMarshaler.FILE_NAME_PROPERTY, fileOutTotal);
>>>                        exchanges[0] =
>>> ServiceMixUtils.sendMessage(this.fileoutProduction, out, fileOutProps,
>>> this.client);
>>>                        LOGGER.debug("Exchange created - Production file:
>>> "
>>> + exchanges[0].getExchangeId() + ", with file name " + fileOutTotal);
>>>                }
>>>        }
>>> }
>>> --
>>> View this message in context:
>>> http://old.nabble.com/%3Cfile%3Apolller%3E-does-not-delete-files-after-processing-tp26574819p26574819.html
>>> Sent from the ServiceMix - User mailing list archive at Nabble.com.
>>>
>>>
>>
>>
>> -----
>> ---
>> Gert Vanthienen
>> http://gertvanthienen.blogspot.com
>>
>
> --
> View this message in context: 
> http://old.nabble.com/%3Cfile%3Apolller%3E-does-not-delete-files-after-processing-tp26574819p26588207.html
> Sent from the ServiceMix - User mailing list archive at Nabble.com.
>
>

Reply via email to