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 javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class XActionXmlSerializer { private static final Log logger = LogFactory.getLog(XActionXmlSerializer.class); public XActionXmlSerializer() { } public String getXActionResponseStatusFromXml(String strXml) throws XmlSerializerException { XActionResponseParserHandler h = null; try { h = parseXActionResponseXml(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.getErrorMsg(); } private XActionResponseParserHandler parseXActionResponseXml(String strXml) throws SAXException, IOException, ParserConfigurationException { SAXParser parser = XmlSerializerUtil.getSAXParserFactory().newSAXParser(); XActionResponseParserHandler h = new XActionResponseParserHandler(); // 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; } /** * Sample error document: * <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> * <SOAP-ENV:Body> * <SOAP-ENV:Fault> * <SOAP-ENV:faultcode> * <SOAP-ENV:Subcode> * <SOAP-ENV:Value><![CDATA[Error: SolutionEngine.ERROR_0007 - Action sequence execution failed (org.pentaho.core.solution.SolutionEngine)]]></SOAP-ENV:Value> * </SOAP-ENV:Subcode> * </SOAP-ENV:faultcode> * <SOAP-ENV:faultactor>SOAP-ENV:Server</SOAP-ENV:faultactor> * <SOAP-ENV:faultstring> * <SOAP-ENV:Text xml:lang="en_US"><![CDATA[Error: SolutionEngine.ERROR_0007 - Action sequence execution failed (org.pentaho.core.solution.SolutionEngine)]]></SOAP-ENV:Text> * </SOAP-ENV:faultstring> * <SOAP-ENV:Detail> * <message name="trace"><![CDATA[Debug: Starting execute of admin/xx/clear_mondrian_data_cache.xactionxxxx (org.pentaho.core.solution.SolutionEngine)]]></message> * <message name="trace"><![CDATA[Debug: Getting runtime context and data (org.pentaho.core.solution.SolutionEngine)]]></message> * <message name="trace"><![CDATA[Debug: Loading action sequence definition file (org.pentaho.core.solution.SolutionEngine)]]></message> * <message name="trace"><![CDATA[Error: SolutionEngine.ERROR_0007 - Action sequence execution failed (org.pentaho.core.solution.SolutionEngine)]]></message> * </SOAP-ENV:Detail> * </SOAP-ENV:Fault> * </SOAP-ENV:Body> * </SOAP-ENV:Envelope> * * @author Steven Barkdull * */ private static class XActionResponseParserHandler extends DefaultHandler { public String currentText = null; private boolean foundFaultStr = false; private String errorMsg = null; public XActionResponseParserHandler() { } /** * if null, no error detected * @return */ public String getErrorMsg() { return errorMsg; } 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("SOAP-ENV:Text")) { //$NON-NLS-1$ if (foundFaultStr) { errorMsg = currentText; } } else if (qName.equals("SOAP-ENV:faultstring")) { //$NON-NLS-1$ foundFaultStr = false; } } public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equals("SOAP-ENV:faultstring")) { //$NON-NLS-1$ foundFaultStr = true; } } } /** * Complete hack, we can only get back html from the service, so lets look * at the html and try to find the error string. * * @param strXml * @return */ public String getPublishStatusFromXml(String strXml) { String errorMsg = null; int startIdx = strXml.indexOf("PentahoSystem.ERROR"); //$NON-NLS-1$ int endIdx = strXml.indexOf("\n", startIdx); //$NON-NLS-1$ if (-1 != startIdx) { errorMsg = strXml.substring(startIdx, endIdx - 1); } return errorMsg; } }