net.sf.jasperreports.olap.xmla.JRXmlaQueryExecuter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jasperreports Show documentation
Show all versions of jasperreports Show documentation
Free Java Reporting Library
/*
* JasperReports - Free Java Reporting Library.
* Copyright (C) 2001 - 2023 Cloud Software Group, Inc. All rights reserved.
* http://www.jaspersoft.com
*
* Unless you have purchased a commercial license agreement from Jaspersoft,
* the following license terms apply:
*
* This program is part of JasperReports.
*
* JasperReports is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* JasperReports 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with JasperReports. If not, see .
*/
package net.sf.jasperreports.olap.xmla;
import java.io.StringWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPFault;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRDataset;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.JRValueParameter;
import net.sf.jasperreports.engine.JasperReportsContext;
import net.sf.jasperreports.engine.query.JRAbstractQueryExecuter;
import net.sf.jasperreports.olap.JRMdxQueryExecuterFactory;
import net.sf.jasperreports.olap.JROlapDataSource;
import net.sf.jasperreports.olap.result.JROlapResult;
/**
* @author Michael Gunther (m.guenther at users.sourceforge.net)
* @author Lucian Chirita ([email protected])
* @author swood
*/
public class JRXmlaQueryExecuter extends JRAbstractQueryExecuter
{
private static final Log log = LogFactory.getLog(JRXmlaQueryExecuter.class);
public static final String EXCEPTION_MESSAGE_KEY_XMLA_CANNOT_RETRIEVE_ELEMENT = "data.olap.xmla.cannot.retrieve.element";
public static final String EXCEPTION_MESSAGE_KEY_MESSAGE_CALL_FAILED = "data.olap.xmla.message.call.failed";
public static final String EXCEPTION_MESSAGE_KEY_XMLA_NO_LEVEL_NAME = "data.olap.xmla.no.level.name";
public static final String EXCEPTION_MESSAGE_KEY_XMLA_NULL_ELEMENT = "data.olap.xmla.null.element";
private static final String SLICER_AXIS_NAME = "SlicerAxis";
private static final String MDD_URI = "urn:schemas-microsoft-com:xml-analysis:mddataset";
private static final String XMLA_URI = "urn:schemas-microsoft-com:xml-analysis";
private static final String LEVEL_UNIQUE_NAME_PATTERN_DEFINITION = "\\[[^\\]]+\\]\\.\\[([^\\]]+)\\]";
private static final Pattern LEVEL_UNIQUE_NAME_PATTERN = Pattern.compile(LEVEL_UNIQUE_NAME_PATTERN_DEFINITION);
private static final int LEVEL_UNIQUE_NAME_PATTERN_NAME_GROUP = 1;
private static final String HIERARCHY_LEVEL_UNIQUE_NAME_PATTERN_DEFINITION = LEVEL_UNIQUE_NAME_PATTERN_DEFINITION + "\\.\\[([^\\]]+)\\]";
private static final Pattern HIERARCHY_LEVEL_UNIQUE_NAME_PATTERN = Pattern.compile(HIERARCHY_LEVEL_UNIQUE_NAME_PATTERN_DEFINITION);
private static final int HIERARCHY_LEVEL_UNIQUE_NAME_PATTERN_NAME_GROUP = 2;
private SOAPFactory sf;
private SOAPConnection connection;
private JRXmlaResult xmlaResult;
/**
*
*/
public JRXmlaQueryExecuter(
JasperReportsContext jasperReportsContext,
JRDataset dataset,
Map parametersMap
)
{
super(jasperReportsContext, dataset, parametersMap);
parseQuery();
}
@Override
protected String getCanonicalQueryLanguage()
{
return JRMdxQueryExecuterFactory.CANONICAL_LANGUAGE;
}
@Override
protected String getParameterReplacement(String parameterName)
{
return String.valueOf(getParameterValue(parameterName));
}
public JROlapResult getResult()
{
try
{
this.sf = SOAPFactory.newInstance();
this.connection = createSOAPConnection();
SOAPMessage queryMessage = createQueryMessage();
URL soapURL = new URL(getSoapUrl());
SOAPMessage resultMessage = executeQuery(queryMessage, soapURL);
xmlaResult = new JRXmlaResult();
parseResult(resultMessage);
}
catch (MalformedURLException | SOAPException e)
{
throw new JRRuntimeException(e);
}
return xmlaResult;
}
@Override
public JRDataSource createDatasource() throws JRException
{
getResult();
return new JROlapDataSource(dataset, xmlaResult);
}
protected String getSoapUrl() throws MalformedURLException
{
String soapUrl;
String xmlaUrl = (String) getParameterValue(JRXmlaQueryExecuterFactory.PARAMETER_XMLA_URL);
String user = (String) getParameterValue(JRXmlaQueryExecuterFactory.PARAMETER_XMLA_USER, true);
if (user == null || user.length() == 0)
{
soapUrl = xmlaUrl;
}
else
{
URL url = new URL(xmlaUrl);
soapUrl = url.getProtocol() + "://" + user;
String password = (String) getParameterValue(JRXmlaQueryExecuterFactory.PARAMETER_XMLA_PASSWORD, true);
if (password != null && password.length() > 0)
{
soapUrl += ":" + password;
}
soapUrl += "@" + url.getHost();
if (url.getPort() != -1)
{
soapUrl += ":" + url.getPort();
}
soapUrl += url.getPath();
}
return soapUrl;
}
@Override
public boolean cancelQuery() throws JRException
{
return false;
}
@Override
public void close()
{
if (connection != null)
{
try
{
connection.close();
}
catch (SOAPException e)
{
throw new JRRuntimeException(e);
}
connection = null;
}
}
protected SOAPConnection createSOAPConnection()
{
try
{
SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
return scf.createConnection();
}
catch (UnsupportedOperationException | SOAPException e)
{
throw new JRRuntimeException(e);
}
}
protected SOAPMessage createQueryMessage()
{
String queryStr = getQueryString();
if (log.isDebugEnabled())
{
log.debug("MDX query: " + queryStr);
}
try
{
MessageFactory mf = MessageFactory.newInstance();
SOAPMessage message = mf.createMessage();
MimeHeaders mh = message.getMimeHeaders();
mh.setHeader("SOAPAction", "\"urn:schemas-microsoft-com:xml-analysis:Execute\"");
SOAPPart soapPart = message.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPBody body = envelope.getBody();
Name nEx = envelope.createName("Execute", "", XMLA_URI);
SOAPElement eEx = body.addChildElement(nEx);
// add the parameters
// COMMAND parameter
//
// queryStr
//
Name nCom = envelope.createName("Command", "", XMLA_URI);
SOAPElement eCommand = eEx.addChildElement(nCom);
Name nSta = envelope.createName("Statement", "", XMLA_URI);
SOAPElement eStatement = eCommand.addChildElement(nSta);
eStatement.addTextNode(queryStr);
//
//
// dataSource
// catalog
// Multidimensional
// TupleFormat
//
//
Map paraList = new HashMap<>();
String datasource = (String) getParameterValue(JRXmlaQueryExecuterFactory.PARAMETER_XMLA_DATASOURCE);
paraList.put("DataSourceInfo", datasource);
String catalog = (String) getParameterValue(JRXmlaQueryExecuterFactory.PARAMETER_XMLA_CATALOG);
paraList.put("Catalog", catalog);
paraList.put("Format", "Multidimensional");
paraList.put("AxisFormat", "TupleFormat");
addParameterList(envelope, eEx, "Properties", "PropertyList", paraList);
message.saveChanges();
if (log.isDebugEnabled())
{
log.debug("XML/A query message: \n" + prettyPrintSOAP(message.getSOAPPart().getEnvelope()));
}
return message;
}
catch (SOAPException e)
{
throw new JRRuntimeException(e);
}
}
protected void addParameterList(SOAPEnvelope envelope, SOAPElement eParent, String typeName, String listName, Map params) throws SOAPException
{
Name nPara = envelope.createName(typeName, "", XMLA_URI);
SOAPElement eType = eParent.addChildElement(nPara);
nPara = envelope.createName(listName, "", XMLA_URI);
SOAPElement eList = eType.addChildElement(nPara);
if (params == null)
{
return;
}
for (Iterator> entryIt = params.entrySet().iterator(); entryIt.hasNext();)
{
Map.Entry entry = entryIt.next();
String tag = entry.getKey();
String value = entry.getValue();
nPara = envelope.createName(tag, "", XMLA_URI);
SOAPElement eTag = eList.addChildElement(nPara);
eTag.addTextNode(value);
}
}
/**
* Sends the SOAP Message over the connection and returns the
* Result-SOAP-Message
*
* @return Reply-Message
*/
protected SOAPMessage executeQuery(SOAPMessage message, URL url)
{
try
{
return connection.call(message, url);
}
catch (SOAPException e)
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_MESSAGE_CALL_FAILED,
(Object[])null,
e);
}
}
/**
* Parses the result-Message into this class's structure
*
* @param reply
* The reply-Message from the Server
*/
protected void parseResult(SOAPMessage reply) throws SOAPException
{
SOAPPart soapPart = reply.getSOAPPart();
SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
SOAPBody soapBody = soapEnvelope.getBody();
SOAPElement eElement = null;
if (log.isDebugEnabled())
{
log.debug("XML/A result envelope: " + prettyPrintSOAP(soapEnvelope));
}
SOAPFault fault = soapBody.getFault();
if (fault != null)
{
handleResultFault(fault);
}
Name eName = soapEnvelope.createName("ExecuteResponse", "", XMLA_URI);
// Get the ExecuteResponse-Node
Iterator responseElements = soapBody.getChildElements(eName);
if (responseElements.hasNext())
{
Object eObj = responseElements.next();
if (eObj == null)
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_XMLA_NULL_ELEMENT,
new Object[]{"ExecuteResponse"});
}
eElement = (SOAPElement) eObj;
}
else
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_XMLA_CANNOT_RETRIEVE_ELEMENT,
new Object[]{"ExecuteResponse"});
}
// Get the return-Node
Name rName = soapEnvelope.createName("return", "", XMLA_URI);
Iterator returnElements = eElement.getChildElements(rName);
SOAPElement returnElement = null;
if (returnElements.hasNext())
{
Object eObj = returnElements.next();
if (eObj == null)
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_XMLA_NULL_ELEMENT,
new Object[]{"return"});
}
returnElement = (SOAPElement) eObj;
}
else
{
// Should be old-Microsoft XMLA-SDK. Try without m-prefix
Name rName2 = soapEnvelope.createName("return", "", "");
returnElements = eElement.getChildElements(rName2);
if (returnElements.hasNext())
{
Object eObj = returnElements.next();
if (eObj == null)
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_XMLA_NULL_ELEMENT,
new Object[]{"return"});
}
returnElement = (SOAPElement) eObj;
}
else
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_XMLA_CANNOT_RETRIEVE_ELEMENT,
new Object[]{"return"});
}
}
// Get the root-Node
Name rootName = soapEnvelope.createName("root", "", MDD_URI);
SOAPElement rootElement = null;
Iterator rootElements = returnElement.getChildElements(rootName);
if (rootElements.hasNext())
{
Object eObj = rootElements.next();
if (eObj == null)
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_XMLA_NULL_ELEMENT,
new Object[]{"root"});
}
rootElement = (SOAPElement) eObj;
}
else
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_XMLA_CANNOT_RETRIEVE_ELEMENT,
new Object[]{"root"});
}
// Get the OlapInfo-Node
Name olapInfoName = soapEnvelope.createName("OlapInfo", "", MDD_URI);
SOAPElement olapInfoElement = null;
Iterator olapInfoElements = rootElement.getChildElements(olapInfoName);
if (olapInfoElements.hasNext())
{
Object eObj = olapInfoElements.next();
if (eObj == null)
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_XMLA_NULL_ELEMENT,
new Object[]{"OlapInfo"});
}
olapInfoElement = (SOAPElement) eObj;
}
else
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_XMLA_CANNOT_RETRIEVE_ELEMENT,
new Object[]{"OlapInfo"});
}
parseOLAPInfoElement(olapInfoElement);
// Get the Axes Element
Name axesName = soapEnvelope.createName("Axes", "", MDD_URI);
SOAPElement axesElement = null;
Iterator axesElements = rootElement.getChildElements(axesName);
if (axesElements.hasNext())
{
Object eObj = axesElements.next();
if (eObj == null)
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_XMLA_NULL_ELEMENT,
new Object[]{"Axes"});
}
axesElement = (SOAPElement) eObj;
}
else
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_XMLA_CANNOT_RETRIEVE_ELEMENT,
new Object[]{"Axes"});
}
parseAxesElement(axesElement);
// Get the CellData Element
Name cellDataName = soapEnvelope.createName("CellData", "", MDD_URI);
SOAPElement cellDataElement = null;
Iterator cellDataElements = rootElement.getChildElements(cellDataName);
if (cellDataElements.hasNext())
{
Object eObj = cellDataElements.next();
if (eObj == null)
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_XMLA_NULL_ELEMENT,
new Object[]{"CellData"});
}
cellDataElement = (SOAPElement) eObj;
}
else
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_XMLA_CANNOT_RETRIEVE_ELEMENT,
new Object[]{"CellData"});
}
parseCellDataElement(cellDataElement);
}
protected void handleResultFault(SOAPFault fault)
{
StringBuilder errorMsg = new StringBuilder();
errorMsg.append("XML/A fault: ");
String faultString = fault.getFaultString();
if (faultString != null)
{
errorMsg.append(faultString);
errorMsg.append("; ");
}
String faultActor = fault.getFaultActor();
if (faultActor != null)
{
errorMsg.append("Actor: ");
errorMsg.append(faultActor);
errorMsg.append("; ");
}
String faultCode = fault.getFaultCode();
if (faultCode != null)
{
errorMsg.append("Code: ");
errorMsg.append(faultCode);
errorMsg.append("; ");
}
throw new JRRuntimeException(errorMsg.toString());
}
protected void parseOLAPInfoElement(SOAPElement olapInfoElement) throws SOAPException
{
// CubeInfo-Element is not needed
// Get the AxesInfo-Node
Name axesInfoName = sf.createName("AxesInfo", "", MDD_URI);
SOAPElement axesElement = null;
Iterator axesInfoElements = olapInfoElement.getChildElements(axesInfoName);
if (axesInfoElements.hasNext())
{
Object axesObj = axesInfoElements.next();
if (axesObj == null)
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_XMLA_NULL_ELEMENT,
new Object[]{"AxesInfo"});
}
axesElement = (SOAPElement) axesObj;
}
else
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_XMLA_CANNOT_RETRIEVE_ELEMENT,
new Object[]{"AxesInfo"});
}
parseAxesInfoElement(axesElement);
// CellInfo is not needed
}
protected void parseAxesInfoElement(SOAPElement axesInfoElement) throws SOAPException
{
// Cycle over AxisInfo-Elements
Name axisInfoName = sf.createName("AxisInfo", "", MDD_URI);
Iterator itAxis = axesInfoElement.getChildElements(axisInfoName);
while (itAxis.hasNext())
{
SOAPElement axisElement = (SOAPElement) itAxis.next();
Name name = sf.createName("name");
String axisName = axisElement.getAttributeValue(name);
if (axisName.equals(SLICER_AXIS_NAME))
{
continue;
}
JRXmlaResultAxis axis = new JRXmlaResultAxis(axisName);
xmlaResult.addAxis(axis);
if (log.isDebugEnabled())
{
log.debug("adding axis: " + axis.getAxisName());
}
// retrieve the hierarchies by
name = sf.createName("HierarchyInfo", "", MDD_URI);
Iterator itHierInfo = axisElement.getChildElements(name);
while (itHierInfo.hasNext())
{
SOAPElement eHierInfo = (SOAPElement) itHierInfo.next();
handleHierInfo(axis, eHierInfo);
}
}
}
protected void parseAxesElement(SOAPElement axesElement) throws SOAPException
{
// Cycle over Axis-Elements
Name aName = sf.createName("Axis", "", MDD_URI);
Iterator itAxis = axesElement.getChildElements(aName);
while (itAxis.hasNext())
{
SOAPElement axisElement = (SOAPElement) itAxis.next();
Name name = sf.createName("name");
String axisName = axisElement.getAttributeValue(name);
if (axisName.equals(SLICER_AXIS_NAME))
{
continue;
}
// LookUp for the Axis
JRXmlaResultAxis axis = xmlaResult.getAxisByName(axisName);
// retrieve the tuples by
name = sf.createName("Tuples", "", MDD_URI);
Iterator itTuples = axisElement.getChildElements(name);
if (itTuples.hasNext())
{
SOAPElement eTuples = (SOAPElement) itTuples.next();
handleTuplesElement(axis, eTuples);
}
}
}
protected void parseCellDataElement(SOAPElement cellDataElement) throws SOAPException
{
Name name = sf.createName("Cell", "", MDD_URI);
Iterator itCells = cellDataElement.getChildElements(name);
while (itCells.hasNext())
{
SOAPElement cellElement = (SOAPElement) itCells.next();
Name errorName = sf.createName("Error", "", MDD_URI);
Iterator errorElems = cellElement.getChildElements(errorName);
if (errorElems.hasNext())
{
handleCellErrors(errorElems);
}
Name ordinalName = sf.createName("CellOrdinal");
String cellOrdinal = cellElement.getAttributeValue(ordinalName);
Object value = null;
Iterator valueElements = cellElement.getChildElements(sf.createName("Value", "", MDD_URI));
if (valueElements.hasNext())
{
SOAPElement valueElement = (SOAPElement) valueElements.next();
String valueType = valueElement.getAttribute("xsi:type");
if (valueType.equals("xsd:int"))
{
value = Long.valueOf(valueElement.getValue());
}
else if (
valueType.equals("xsd:double")
|| valueType.equals("xsd:decimal")
)
{
value = Double.valueOf(valueElement.getValue());
}
else
{
value = valueElement.getValue();
}
}
String fmtValue = "";
Iterator fmtValueElements = cellElement.getChildElements(sf.createName("FmtValue", "", MDD_URI));
if (fmtValueElements.hasNext())
{
SOAPElement fmtValueElement = ((SOAPElement) fmtValueElements.next());
fmtValue = fmtValueElement.getValue();
}
int pos = Integer.parseInt(cellOrdinal);
JRXmlaCell cell = new JRXmlaCell(value, fmtValue);
xmlaResult.setCell(cell, pos);
}
}
protected void handleCellErrors(Iterator errorElems) throws SOAPException
{
SOAPElement errorElem = (SOAPElement) errorElems.next();
StringBuilder errorMsg = new StringBuilder();
errorMsg.append("Cell error: ");
Iterator descriptionElems = errorElem.getChildElements(sf.createName("Description", "", MDD_URI));
if (descriptionElems.hasNext())
{
SOAPElement descrElem = (SOAPElement) descriptionElems.next();
errorMsg.append(descrElem.getValue());
errorMsg.append("; ");
}
Iterator sourceElems = errorElem.getChildElements(sf.createName("Source", "", MDD_URI));
if (sourceElems.hasNext())
{
SOAPElement sourceElem = (SOAPElement) sourceElems.next();
errorMsg.append("Source: ");
errorMsg.append(sourceElem.getValue());
errorMsg.append("; ");
}
Iterator codeElems = errorElem.getChildElements(sf.createName("ErrorCode", "", MDD_URI));
if (codeElems.hasNext())
{
SOAPElement codeElem = (SOAPElement) codeElems.next();
errorMsg.append("Code: ");
errorMsg.append(codeElem.getValue());
errorMsg.append("; ");
}
throw new JRRuntimeException(errorMsg.toString());
}
protected void handleHierInfo(JRXmlaResultAxis axis, SOAPElement hierInfoElement) throws SOAPException
{
Name name = sf.createName("name");
String dimName = hierInfoElement.getAttributeValue(name); // Get the Dimension Name
if (log.isDebugEnabled())
{
log.debug("Adding hierarchy: " + dimName);
}
JRXmlaHierarchy hier = new JRXmlaHierarchy(dimName);
axis.addHierarchy(hier);
}
protected void handleTuplesElement(JRXmlaResultAxis axis, SOAPElement tuplesElement) throws SOAPException
{
Name tName = sf.createName("Tuple", "", MDD_URI);
for (Iterator itTuple = tuplesElement.getChildElements(tName); itTuple.hasNext();)
{
SOAPElement eTuple = (SOAPElement) itTuple.next();
handleTupleElement(axis, eTuple);
}
}
protected void handleTupleElement(JRXmlaResultAxis axis, SOAPElement tupleElement) throws SOAPException
{
JRXmlaMemberTuple tuple = new JRXmlaMemberTuple(axis.getHierarchiesOnAxis().length);
Name memName = sf.createName("Member", "", MDD_URI);
Iterator itMember = tupleElement.getChildElements(memName);
int memNum = 0;
while (itMember.hasNext())
{
SOAPElement memElement = (SOAPElement) itMember.next();
Name name = sf.createName("Hierarchy", "", "");
String hierName = memElement.getAttributeValue(name);
String uName = "";
Iterator uNameElements = memElement.getChildElements(sf.createName("UName", "", MDD_URI));
if (uNameElements.hasNext())
{
uName = ((SOAPElement) uNameElements.next()).getValue();
}
String caption = "";
Iterator captionElements = memElement.getChildElements(sf.createName("Caption", "", MDD_URI));
if (captionElements.hasNext())
{
caption = ((SOAPElement) captionElements.next()).getValue();
}
String lName = "";
Iterator lNameElements = memElement.getChildElements(sf.createName("LName", "", MDD_URI));
if (lNameElements.hasNext())
{
String levelUniqueName = ((SOAPElement) lNameElements.next()).getValue();
Matcher matcher = LEVEL_UNIQUE_NAME_PATTERN.matcher(levelUniqueName);
if (matcher.matches())
{
lName = matcher.group(LEVEL_UNIQUE_NAME_PATTERN_NAME_GROUP);
}
else
{
matcher = HIERARCHY_LEVEL_UNIQUE_NAME_PATTERN.matcher(levelUniqueName);
if (matcher.matches())
{
lName = matcher.group(HIERARCHY_LEVEL_UNIQUE_NAME_PATTERN_NAME_GROUP);
}
else
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_XMLA_NO_LEVEL_NAME,
new Object[]{levelUniqueName});
}
}
}
int lNum = 0;
Iterator lNumElements = memElement.getChildElements(sf.createName("LNum", "", MDD_URI));
if (lNumElements.hasNext())
{
lNum = Integer.parseInt(((SOAPElement) lNumElements.next()).getValue());
}
JRXmlaMember member = new JRXmlaMember(caption, uName, hierName, lName, lNum);
if (log.isDebugEnabled())
{
log.debug("Adding member: axis - " + axis.getAxisName() + " hierName - " + hierName + " lName - " + lName + " uName - " + uName);
}
tuple.setMember(memNum++, member);
}
axis.addTuple(tuple);
}
protected String prettyPrintSOAP(SOAPElement element)
{
final StringWriter sw = new StringWriter();
try
{
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
transformer.transform(
new DOMSource(element),
new StreamResult(sw));
}
catch (TransformerException e)
{
throw new JRRuntimeException(e);
}
return sw.toString();
}
}