⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmla_soap.java

📁 OLAP 的客户端代码
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
      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 + -