Object[][] data = null;
int columnCount = 0;
int rowCount = 0;
SOAPConnection connection = null;
SOAPMessage reply = null;
try {
connection = scf.createConnection();
SOAPMessage msg = mf.createMessage();
MimeHeaders mh = msg.getMimeHeaders();
mh.setHeader( "SOAPAction", XMLABaseComponent.EXECUTE_ACTION ); //$NON-NLS-1$
SOAPPart soapPart = msg.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.setEncodingStyle( XMLABaseComponent.ENCODING_STYLE );
SOAPBody body = envelope.getBody();
Name nEx = envelope.createName( "Execute", "", XMLABaseComponent.XMLA_URI ); //$NON-NLS-1$//$NON-NLS-2$
SOAPElement eEx = body.addChildElement( nEx );
eEx.setEncodingStyle( XMLABaseComponent.ENCODING_STYLE );
// add the parameters
// COMMAND parameter
// <Command>
// <Statement>select [Measures].members on Columns from
// Sales</Statement>
// </Command>
Name nCom = envelope.createName( "Command", "", XMLABaseComponent.XMLA_URI ); //$NON-NLS-1$ //$NON-NLS-2$
SOAPElement eCommand = eEx.addChildElement( nCom );
Name nSta = envelope.createName( "Statement", "", XMLABaseComponent.XMLA_URI ); //$NON-NLS-1$ //$NON-NLS-2$
SOAPElement eStatement = eCommand.addChildElement( nSta );
eStatement.addTextNode( query );
// <Properties>
// <PropertyList>
// <DataSourceInfo>Provider=MSOLAP;Data
// Source=local</DataSourceInfo>
// <Catalog>Foodmart 2000</Catalog>
// <Format>Multidimensional</Format>
// <AxisFormat>TupleFormat</AxisFormat> oder "ClusterFormat"
// </PropertyList>
// </Properties>
Map paraList = new HashMap();
paraList.put( "DataSourceInfo", dataSource ); //$NON-NLS-1$
paraList.put( "Catalog", catalog ); //$NON-NLS-1$
paraList.put( "Format", "Multidimensional" ); //$NON-NLS-1$ //$NON-NLS-2$
paraList.put( "AxisFormat", "TupleFormat" ); //$NON-NLS-1$ //$NON-NLS-2$
addParameterList( envelope, eEx, "Properties", "PropertyList", paraList ); //$NON-NLS-1$ //$NON-NLS-2$
msg.saveChanges();
debug( "Request for Execute" ); //$NON-NLS-1$
logSoapMsg( msg );
// run the call
reply = connection.call( msg, url );
debug( "Reply from Execute" ); //$NON-NLS-1$
logSoapMsg( reply );
// error check
errorCheck( reply );
// process the reply
SOAPElement eRoot = findExecRoot( reply );
// for each axis, get the positions (tuples)
Name name = envelope.createName( "Axes", "", XMLABaseComponent.MDD_URI ); //$NON-NLS-1$ //$NON-NLS-2$
SOAPElement eAxes = selectSingleNode( eRoot, name );
if ( eAxes == null ) {
throw new XMLAException( "Excecute result has no Axes element" ); //$NON-NLS-1$
}
name = envelope.createName( "Axis", "", XMLABaseComponent.MDD_URI ); //$NON-NLS-1$ //$NON-NLS-2$
Iterator itAxis = eAxes.getChildElements( name );
AxisLoop:
for ( int iOrdinal = 0; itAxis.hasNext(); ) {
SOAPElement eAxis = (SOAPElement) itAxis.next();
name = envelope.createName( "name" ); //$NON-NLS-1$
String axisName = eAxis.getAttributeValue( name );
int axisOrdinal;
if ( axisName.equals( "SlicerAxis" ) ) { //$NON-NLS-1$
continue;
} else {
axisOrdinal = iOrdinal++;
}
name = envelope.createName( "Tuples", "", XMLABaseComponent.MDD_URI ); //$NON-NLS-1$//$NON-NLS-2$
SOAPElement eTuples = selectSingleNode( eAxis, name );
if ( eTuples == null ) {
continue AxisLoop; // what else?
}
name = envelope.createName( "Tuple", "", XMLABaseComponent.MDD_URI ); //$NON-NLS-1$//$NON-NLS-2$
Iterator itTuple = eTuples.getChildElements( name );
// loop over tuples
int positionOrdinal = 0;
while ( itTuple.hasNext() ) { // TupleLoop
SOAPElement eTuple = (SOAPElement) itTuple.next();
if ( ( axisOrdinal == XMLABaseComponent.AXIS_COLUMNS ) && ( columnHeaders == null ) ) {
columnCount = getChildCount( envelope, eTuples, "Tuple" ); //$NON-NLS-1$
columnHeaders = new Object[ getChildCount( envelope, eTuple, "Member" ) ][ columnCount ]; //$NON-NLS-1$
} else if ( ( axisOrdinal == XMLABaseComponent.AXIS_ROWS ) && ( rowHeaders == null ) ) {
rowCount = getChildCount( envelope, eTuples, "Tuple" ); //$NON-NLS-1$
rowHeaders = new Object[ rowCount ][ getChildCount( envelope, eTuple, "Member" ) ]; //$NON-NLS-1$
}
int index = 0;
name = envelope.createName( "Member", "", XMLABaseComponent.MDD_URI ); //$NON-NLS-1$//$NON-NLS-2$
Iterator itMember = eTuple.getChildElements( name );
while ( itMember.hasNext() ) { // MemberLoop
SOAPElement eMem = (SOAPElement) itMember.next();
// loop over children nodes
String caption = null;
Iterator it = eMem.getChildElements();
InnerLoop:
while ( it.hasNext() ) {
Node n = (Node) it.next();
if ( !( n instanceof SOAPElement ) ) {
continue InnerLoop;
}
SOAPElement el = (SOAPElement) n;
String enam = el.getElementName().getLocalName();
if ( enam.equals( "Caption" ) ) { //$NON-NLS-1$
caption = el.getValue();
}
}
if ( axisOrdinal == XMLABaseComponent.AXIS_COLUMNS ) {
columnHeaders[ index ][ positionOrdinal ] = caption;
} else if ( axisOrdinal == XMLABaseComponent.AXIS_ROWS ) {
rowHeaders[ positionOrdinal ][ index ] = caption;
}
++index;
} // MemberLoop
++positionOrdinal;
} // TupleLoop
} // AxisLoop
data = new Object[ rowCount ][ columnCount ];
// loop over cells in result set
name = envelope.createName( "CellData", "", XMLABaseComponent.MDD_URI ); //$NON-NLS-1$//$NON-NLS-2$
SOAPElement eCellData = selectSingleNode( eRoot, name );
name = envelope.createName( "Cell", "", XMLABaseComponent.MDD_URI ); //$NON-NLS-1$//$NON-NLS-2$
Iterator itSoapCell = eCellData.getChildElements( name );
while ( itSoapCell.hasNext() ) { // CellLoop
SOAPElement eCell = (SOAPElement) itSoapCell.next();
name = envelope.createName( "CellOrdinal", "", "" ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
String cellOrdinal = eCell.getAttributeValue( name );
int ordinal = Integer.parseInt( cellOrdinal );
name = envelope.createName( "Value", "", XMLABaseComponent.MDD_URI ); //$NON-NLS-1$//$NON-NLS-2$
Object value = selectSingleNode( eCell, name ).getValue();
int rowLoc = ordinal / columnCount;
int columnLoc = ordinal % columnCount;
data[ rowLoc ][ columnLoc ] = value;
} // CellLoop
MemoryResultSet resultSet = new MemoryResultSet();
MemoryMetaData metaData = new MemoryMetaData( columnHeaders, rowHeaders );
resultSet.setMetaData( metaData );
for ( Object[] element : data ) {
resultSet.addRow( element );
}
rSet = resultSet;
if ( resultSet != null ) {
if ( getResultOutputName() != null ) {
setOutputValue( getResultOutputName(), resultSet );
}
return true;
}
return false;
} catch ( SOAPException se ) {
throw new XMLAException( se );
} finally {
if ( connection != null ) {
try {
connection.close();
} catch ( SOAPException e ) {
// log and ignore
error( "?", e ); //$NON-NLS-1$
}
}