Java tutorial
/* * 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$ } } } } }