📄 xmla_soap.java
字号:
walker = getDiscoverRoot(envelope, walker);
if (walker == null) {
throw new OlapException("Discover result has no DiscoverResponse/return/root element");
}
walker = getDiscoverRow(envelope, walker);
if (walker == null) {
throw new OlapException("Discover result has no DiscoverResponse/return/root/row element");
}
/* Name nProviderName = envelope.createName("ProviderName", "", ROWS_URI);
SOAPElement eProviderName = selectSingleNode(e, nProviderName);
if (eProviderName == null) {
throw new OlapException("Discover result has no DiscoverResponse/return/root/row/ProviderName element");
}
value = eProviderName.getValue();
*/
String value = null;
Iterator it = walker.getChildElements();
while (it.hasNext()) {
Object o = it.next();
if (!(o instanceof SOAPElement))
continue; //bypass text nodes
SOAPElement e2 = (SOAPElement) o;
String nameString = e2.getElementName().getLocalName();
if (nameString.equals("ProviderName")) {
value = e2.getValue();
logger.debug("Found ProviderName with value: " + value);
break;
}
}
if (value == null || value.trim().length() == 0) {
throw new OlapException("Discover result has empty DiscoverResponse/return/root/row/ProviderName element");
}
return determineProvider("Provider=" + value);
}
private SOAPElement getDiscoverReturn(SOAPEnvelope envelope, SOAPElement e) throws OlapException, SOAPException {
Name nReturn;
if (provider == PROVIDER_MICROSOFT) {
nReturn = envelope.createName("return", "m", XMLA_URI); // Microsoft
} else {
nReturn = envelope.createName("return", "", XMLA_URI); // SAP or Mondrian
}
SOAPElement eReturn = selectSingleNode(e, nReturn);
if (eReturn == null) {
// old Microsoft XMLA SDK 1.0 does not have "m" prefix - try
nReturn = envelope.createName("return", "", ""); // old Microsoft
eReturn = selectSingleNode(e, nReturn);
if (eReturn == null)
throw new OlapException("Discover result has no return element");
}
return eReturn;
}
private SOAPElement getDiscoverRoot(SOAPEnvelope envelope, SOAPElement e) throws OlapException, SOAPException {
Name nRoot = envelope.createName("root", "", ROWS_URI);
SOAPElement eRoot = selectSingleNode(e, nRoot);
if (eRoot == null) { throw new OlapException("Discover result has no root element"); }
return eRoot;
}
private SOAPElement getDiscoverRow(SOAPEnvelope envelope, SOAPElement e) throws OlapException, SOAPException {
Name nRow = envelope.createName("row", "", ROWS_URI);
SOAPElement eRow = selectSingleNode(e, nRow);
if (eRow == null) { throw new OlapException("Discover result has no row element"); }
return eRow;
}
/**
* discover
* @param request
* @param url
* @param restrictions
* @param properties
* @param rh
* @throws OlapException
*/
private void discover(String request, URL url, Map restrictions, Map properties, Rowhandler rh)
throws OlapException {
try {
SOAPConnection connection = scf.createConnection();
SOAPMessage msg = mf.createMessage();
MimeHeaders mh = msg.getMimeHeaders();
mh.setHeader("SOAPAction", "\"urn:schemas-microsoft-com:xml-analysis:Discover\"");
SOAPPart soapPart = msg.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPBody body = envelope.getBody();
Name nDiscover = envelope
.createName("Discover", "", "urn:schemas-microsoft-com:xml-analysis");
SOAPElement eDiscover = body.addChildElement(nDiscover);
Name nPara = envelope.createName("RequestType");
SOAPElement eRequestType = eDiscover.addChildElement(nPara);
eRequestType.addTextNode(request);
// add the parameters
if (restrictions != null)
addParameterList(envelope, eDiscover, "Restrictions", "RestrictionList", restrictions);
addParameterList(envelope, eDiscover, "Properties", "PropertyList", properties);
msg.saveChanges();
if (logger.isDebugEnabled()) {
logger.debug("Discover Request for " + request);
logSoapMsg(msg);
}
// run the call
SOAPMessage reply = connection.call(msg, url);
if (logger.isDebugEnabled()) {
logger.debug("Discover Response for " + request);
logSoapMsg(reply);
}
errorCheck(reply);
SOAPElement eRoot = findDiscoverRoot(reply);
Name nRow = envelope.createName("row", "", ROWS_URI); // SAP
Iterator itRow = eRoot.getChildElements(nRow);
RowLoop: while (itRow.hasNext()) {
SOAPElement eRow = (SOAPElement) itRow.next();
rh.handleRow(eRow, envelope);
} // RowLoop
connection.close();
} catch (UnsupportedOperationException e) {
throw new OlapException(e);
} catch (SOAPException e) {
throw new OlapException(e);
}
}
/**
* add a list of Restrictions/Properties ...
*/
private 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;
Iterator it = params.keySet().iterator();
while (it.hasNext()) {
String tag = (String) it.next();
String value = (String) params.get(tag);
nPara = envelope.createName(tag, "", XMLA_URI);
SOAPElement eTag = eList.addChildElement(nPara);
eTag.addTextNode(value);
}
}
// error check
private void errorCheck(SOAPMessage reply) throws SOAPException, OlapException {
String[] strings = new String[4];
if (soapFault(reply, strings)) {
String faultString = "Soap Fault code=" + strings[0] + " fault string=" + strings[1]
+ " fault actor=" + strings[2];
if (strings[3] != null)
faultString += "\ndetail:" + strings[3];
throw new OlapException(faultString);
}
}
/**
* @param contextNode
* @param childPath
* @return
*/
private SOAPElement selectSingleNode(SOAPElement contextNode, Name childName) {
Iterator it = contextNode.getChildElements(childName);
if (it.hasNext())
return (SOAPElement) it.next();
else
return null;
}
/**
* locate "root" in DisoverResponse
*/
private SOAPElement findDiscoverRoot(SOAPMessage reply) throws SOAPException, OlapException {
SOAPPart sp = reply.getSOAPPart();
SOAPEnvelope envelope = sp.getEnvelope();
SOAPBody body = envelope.getBody();
Name childName;
SOAPElement eResponse = null;
if (provider == 0) {
// unknown provider - recognize by prefix of DiscoverResponse
Iterator itBody = body.getChildElements();
while (itBody.hasNext()) {
Node n = (Node) itBody.next();
if (!(n instanceof SOAPElement))
continue;
Name name = ((SOAPElement) n).getElementName();
if (name.getLocalName().equals("DiscoverResponse")) {
eResponse = (SOAPElement) n;
provider = getProviderFromDiscoverResponse(envelope, eResponse);
/* if ("m".equals(name.getPrefix()))
provider = PROVIDER_MICROSOFT;
// Microsoft has prefix "m"
else
provider = PROVIDER_SAP; // SAP has no prefix
*/ break;
}
}
if (eResponse == null) {
throw new OlapException("Discover result has no DiscoverResponse element");
}
} else {
if (provider == PROVIDER_MICROSOFT) {
// Microsoft
childName = envelope.createName("DiscoverResponse", "m", XMLA_URI);
} else if (provider == PROVIDER_SAP || provider == PROVIDER_MONDRIAN) {
// SAP or Mondrian
childName = envelope.createName("DiscoverResponse", "", XMLA_URI);
} else {
throw new IllegalArgumentException("no a valid provider specification");
}
eResponse = selectSingleNode(body, childName);
if (eResponse == null) {
throw new OlapException("Discover result has no DiscoverResponse element");
}
}
SOAPElement eReturn = getDiscoverReturn(envelope, eResponse);
if (eReturn == null)
throw new OlapException("Discover result has no return element");
SOAPElement eRoot = getDiscoverRoot(envelope, eReturn);
if (eRoot == null)
throw new OlapException("Discover result has no root element");
return eRoot;
}
/**
* log the reply message
*/
private void logSoapMsg(SOAPMessage msg) {
/*
OutputStream os = null;
try {
os = new FileOutputStream("c:\\x\\SoapReturn.txt", true);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
try {
msg.writeTo(os);
} catch (SOAPException e2) {
e2.printStackTrace();
} catch (IOException e2) {
e2.printStackTrace();
}
*/
// Document source, do a transform.
try {
Writer writer = new StringWriter();
TransformerFactory tFact = TransformerFactory.newInstance();
Transformer transformer = tFact.newTransformer();
Source src = msg.getSOAPPart().getContent();
StreamResult result = new StreamResult(writer);
transformer.transform(src, result);
logger.debug(writer.toString());
} catch (Exception e) {
// no big problen - just for debugging
logger.error("?", e);
}
}
/**
* check SOAP reply for Error, return fault Code
* @param reply the message to check
* @param aReturn ArrayList containing faultcode,faultstring,faultactor
*/
private boolean soapFault(SOAPMessage reply, String[] faults) throws SOAPException {
SOAPPart sp = reply.getSOAPPart();
SOAPEnvelope envelope = sp.getEnvelope();
SOAPBody body = envelope.getBody();
if (!body.hasFault())
return false;
SOAPFault fault = body.getFault();
faults[0] = fault.getFaultCode();
faults[1] = fault.getFaultString();
faults[2] = fault.getFaultActor();
//probably not neccessary with Microsoft;
Detail detail = fault.getDetail();
if (detail == null)
return true;
String detailMsg = "";
Iterator it = detail.getDetailEntries();
for (; it.hasNext();) {
DetailEntry det = (DetailEntry) it.next();
Iterator ita = det.getAllAttributes();
for (boolean cont = false; ita.hasNext(); cont = true) {
Name name = (Name) ita.next();
if (cont)
detailMsg += "; ";
detailMsg += name.getLocalName();
detailMsg += " = ";
detailMsg += det.getAttributeValue(name);
}
}
faults[3] = detailMsg;
return true;
}
/**
* locate "root" in ExecuteResponse
*/
private SOAPElement findExecRoot(SOAPMessage reply) throws SOAPException, OlapException {
SOAPPart sp = reply.getSOAPPart();
SOAPEnvelope envelope = sp.getEnvelope();
SOAPBody body = envelope.getBody();
Name name;
if (provider == PROVIDER_SAP) {
name = envelope.createName("ExecuteResponse", "", XMLA_URI);
// SAP
} else {
name = envelope.createName("ExecuteResponse", "m", XMLA_URI);
// Microsoft
}
SOAPElement eResponse = selectSingleNode(body, name);
if (eResponse == null)
throw new OlapException("Excecute result has no ExecuteResponse element");
if (provider == PROVIDER_SAP) {
name = envelope.createName("return", "", XMLA_URI);
// SAP
} else {
// Microsoft
// name = envelope.createName("return", "", ""); // old
name = envelope.createName("return", "m", XMLA_URI);
}
SOAPElement eReturn = selectSingleNode(eResponse, name);
if (eReturn == null) {
// old Microsoft XMLA SDK 1.0 does not have "m" prefix - try
name = envelope.createName("return", "", ""); // old Microsoft
eReturn = selectSingleNode(eResponse, name);
if (eReturn == null)
throw new OlapException("Excecute result has no ExecuteResponse element");
}
name = envelope.createName("root", "", MDD_URI);
SOAPElement eRoot = selectSingleNode(eReturn, name);
if (eRoot == null) { throw new OlapException("Excecute result has no root element"); }
return eRoot;
}
// dsf
private SOAPElement findDrillExecRoot(SOAPMessage reply) throws SOAPException, OlapException {
// the root for drillthrough is ROWS_URI
SOAPPart sp = reply.getSOAPPart();
SOAPEnvelope envelope = sp.getEnvelope();
SOAPBody body = envelope.getBody();
Name name;
if (provider == PROVIDER_SAP) {
name = envelope.createName("ExecuteResponse", "", XMLA_URI);
// SAP
} else {
name = envelope.createName("ExecuteResponse", "m", XMLA_URI);
// Microsoft
}
SOAPElement eResponse = selectSingleNode(body, name);
if (eResponse == null) {
throw new OlapException("Excecute result has no ExecuteResponse element");
}
if (provider == PROVIDER_SAP) {
name = envelope.createName("return", "", XMLA_URI);
// SAP
} else {
// Microsoft
// name = envelope.createName("return", "", ""); // old
name = envelope.createName("return", "m", XMLA_URI);
}
SOAPElement eReturn = selectSingleNode(eResponse, name);
if (eReturn == null) {
throw new OlapException("Excecute result has no return element");
}
name = envelope.createName("root", "", ROWS_URI);
SOAPElement eRoot = selectSingleNode(eReturn, name);
if (eRoot == null) {
throw new OlapException("Excecute result has no root element");
}
return eRoot;
}
} // End XMLA_SOAP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -