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

Java tutorial

Introduction

Here is the source code for org.pentaho.pac.server.biplatformproxy.xmlserializer.XActionXmlSerializer.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 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;
    }

}