org.pentaho.pac.server.biplatformproxy.xmlserializer.SchedulerXmlSerializer.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.pac.server.biplatformproxy.xmlserializer.SchedulerXmlSerializer.java

Source

/*
 * This program is free software; you can redistribute it and/or modify it under the 
 * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software 
 * Foundation.
 *
 * You should have received a copy of the GNU Lesser General Public License along with this 
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html 
 * or from the Free Software Foundation, Inc., 
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * Copyright 2008 - 2009 Pentaho Corporation.  All rights reserved.
*/
package org.pentaho.pac.server.biplatformproxy.xmlserializer;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.pentaho.pac.client.scheduler.model.Schedule;
import org.pentaho.pac.common.SchedulerServiceException;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SchedulerXmlSerializer {

    private static final Log logger = LogFactory.getLog(SchedulerXmlSerializer.class);

    public SchedulerXmlSerializer() {

    }

    public Map<String, Schedule> getSchedulesFromXml(String strXml) throws XmlSerializerException {
        JobsParserHandler h = null;
        try {
            h = parseJobNamesXml(strXml);
        } catch (SAXException e) {
            logger.error(e.getMessage());
            throw new XmlSerializerException(e.getMessage());
        } catch (IOException e) {
            logger.error(e.getMessage());
            throw new XmlSerializerException(e.getMessage());
        } catch (ParserConfigurationException e) {
            logger.error(e.getMessage());
            throw new XmlSerializerException(e.getMessage());
        }
        return h.schedules;
    }

    private JobsParserHandler parseJobNamesXml(String strXml)
            throws SAXException, IOException, ParserConfigurationException {
        SAXParser parser = XmlSerializerUtil.getSAXParserFactory().newSAXParser();
        JobsParserHandler h = new JobsParserHandler();
        // TODO sbarkdull, need to set encoding
        //      String encoding = CleanXmlHelper.getEncoding( strXml );
        //      InputStream is = new ByteArrayInputStream( strXml.getBytes( encoding ) );
        InputStream is = new ByteArrayInputStream(strXml.getBytes("UTF-8")); //$NON-NLS-1$

        parser.parse(is, h);
        return h;
    }

    private static class JobsParserHandler extends DefaultHandler {

        public String currentText = null;
        public boolean isGetJobNames = false;
        public Map<String, Schedule> schedules = new HashMap<String, Schedule>();
        private Schedule currentSchedule = null;

        public JobsParserHandler() {
        }

        public void characters(char[] ch, int startIdx, int length) {
            currentText = String.valueOf(ch, startIdx, length);
        }

        public void endElement(String uri, String localName, String qName) throws SAXException {
            if (qName.equals("job")) { //$NON-NLS-1$
            } else if (qName.equals("description")) { //$NON-NLS-1$
                currentSchedule.setDescription(currentText);
            } else {
            }
        }

        public void startElement(String uri, String localName, String qName, Attributes attributes)
                throws SAXException {
            if (qName.equals("getJobNames")) { //$NON-NLS-1$
                isGetJobNames = true;
            } else if (qName.equals("job")) { //$NON-NLS-1$

                currentSchedule = new Schedule();
                String val = attributes.getValue("triggerName"); //$NON-NLS-1$
                currentSchedule.setTriggerName(val);
                val = attributes.getValue("triggerGroup"); //$NON-NLS-1$
                currentSchedule.setTriggerGroup(val);
                val = attributes.getValue("triggerState"); //$NON-NLS-1$
                currentSchedule.setTriggerState(XmlSerializerUtil.triggerInt2Name(val));
                val = attributes.getValue("nextFireTime"); //$NON-NLS-1$
                currentSchedule.setNextFireTime(val);
                val = attributes.getValue("prevFireTime"); //$NON-NLS-1$
                currentSchedule.setPrevFireTime(val);
                val = attributes.getValue("jobName"); //$NON-NLS-1$
                currentSchedule.setJobName(val);
                val = attributes.getValue("jobGroup"); //$NON-NLS-1$
                currentSchedule.setJobGroup(val);
                val = attributes.getValue("start-date-time"); //$NON-NLS-1$
                if (val != null) {
                    currentSchedule.setStartDate(Long.parseLong(val));
                }
                val = attributes.getValue("end-date-time"); //$NON-NLS-1$
                if (val != null) {
                    currentSchedule.setEndDate(Long.parseLong(val));
                }
                // actionsList will only have ONE action
                val = attributes.getValue("actionRefs"); //$NON-NLS-1$
                List<String> l = new ArrayList<String>();
                l.add(val);
                currentSchedule.setActionsList(l);

                val = attributes.getValue("cron-string"); //$NON-NLS-1$
                if (null != val) {
                    currentSchedule.setCronString(val);
                }
                val = attributes.getValue("repeat-time-millisecs"); //$NON-NLS-1$
                if (null != val) {
                    currentSchedule.setRepeatInterval(val);
                }
                assert currentSchedule.getJobName() != null : "Error, job name cannot be null."; //$NON-NLS-1$
                schedules.put(currentSchedule.getJobName(), currentSchedule);
            } else if (qName.equals("description")) { //$NON-NLS-1$
            } else {
            }
        }
    }

    public boolean getSchedulerStatusFromXml(String strXml) {
        return strXml.contains("Running"); //$NON-NLS-1$
    }

    public void detectSchedulerExceptionInXml(String strXml) throws SchedulerServiceException {

        SchedulerExceptionParserHandler exceptionHandler;
        try {
            exceptionHandler = parseSchedulerExceptionXml(strXml);
        } catch (SAXException e) {
            logger.error(e.getMessage());
            throw new SchedulerServiceException(e.getMessage());
        } catch (IOException e) {
            logger.error(e.getMessage());
            throw new SchedulerServiceException(e.getMessage());
        } catch (ParserConfigurationException e) {
            logger.error(e.getMessage());
            throw new SchedulerServiceException(e.getMessage());
        }
        if (null != exceptionHandler.exceptionMessage) {
            throw new SchedulerServiceException(exceptionHandler.exceptionMessage);
        }
    }

    /**
     * 
     * @param strXml
     * @return
     * @throws SAXException
     * @throws IOException
     * @throws ParserConfigurationException
     */
    private SchedulerExceptionParserHandler parseSchedulerExceptionXml(String strXml)
            throws SAXException, IOException, ParserConfigurationException {
        SAXParser parser = XmlSerializerUtil.getSAXParserFactory().newSAXParser();
        SchedulerExceptionParserHandler h = new SchedulerExceptionParserHandler();
        // TODO sbarkdull, need to set encoding
        //      String encoding = CleanXmlHelper.getEncoding( strXml );
        //      InputStream is = new ByteArrayInputStream( strXml.getBytes( encoding ) );
        InputStream is = new ByteArrayInputStream(strXml.getBytes("UTF-8")); //$NON-NLS-1$

        parser.parse(is, h);
        return h;
    }

    /**
     * <?xml version="1.0" encoding="UTF-8"?>
     * <schedulerResults>
     *   <error
     *     msg="Failed to execute job ff. Job with that name does not exist in scheduler. ff" />
     * </schedulerResults>
     * @author Steven Barkdull
     *
     */
    private static class SchedulerExceptionParserHandler extends DefaultHandler {

        public String exceptionMessage = null;
        private boolean isSchedulerResults = false;

        public SchedulerExceptionParserHandler() {
        }

        public void characters(char[] ch, int startIdx, int length) {
            // no-op
        }

        public void endElement(String uri, String localName, String qName) throws SAXException {
            if (qName.equals("schedulerResults")) { //$NON-NLS-1$
                isSchedulerResults = false;
            }
        }

        public void startElement(String uri, String localName, String qName, Attributes attributes)
                throws SAXException {
            if (qName.equals("schedulerResults")) { //$NON-NLS-1$
                isSchedulerResults = true;
            } else if (qName.equals("error")) { //$NON-NLS-1$
                if (isSchedulerResults) {
                    exceptionMessage = attributes.getValue("msg");//$NON-NLS-1$
                }
            }
        }
    }
}