/*
 * Olap_10.java
 *
 * Copyright 2004-2006 by SAP AG. All Rights Reserved.
 * SAP, R/3, mySAP, mySAP.com, xApps, xApp, SAP NetWeaver, and other SAP 
 * products and services mentioned herein as well as their respective logos 
 * are trademarks or registered trademarks of SAP AG in Germany and in several 
 * other countries all over the world. All other product and service names 
 * mentioned are the trademarks of their respective companies. Data contained 
 * in this document serves informational purposes only. National product 
 * specifications may vary.
 *
 * These materials are subject to change without notice. These materials are 
 * provided by SAP AG and its affiliated companies ("SAP Group") for 
 * informational purposes only, without representation or warranty of any kind, 
 * and SAP Group shall not be liable for errors or omissions with respect to 
 * the materials. The only warranties for SAP Group products and services are 
 * those that are set forth in the express warranty statements accompanying 
 * such products and services, if any. Nothing herein should be construed as 
 * constituting an additional warranty.
 */
package com.sap.ip.bi.sdk.samples;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sap.exception.IBaseException;
import com.sap.ip.bi.sdk.dac.connector.IBIConnection;
import com.sap.ip.bi.sdk.dac.connector.IBIOlap;
import com.sap.ip.bi.sdk.dac.olap.query.IBICommandProcessor;
import com.sap.ip.bi.sdk.dac.olap.query.main.IBIQuery;
import com.sap.ip.bi.sdk.dac.olap.query.types.IBIRelationalOperatorTypeEnum;
import com.sap.ip.bi.sdk.dac.olap.query.types.IBISapRangeSignTypeEnum;
import com.sap.ip.bi.sdk.dac.olap.query.var.IBISapMemberVariable;
import com.sap.ip.bi.sdk.samples.servlet.MinimalServletContainer;

/**
 * SAP variable retrieval and editing -
 *
 * Illustrates retrieval of and effect of editing an SAP variable. Sets a 
 * value for an optional SAP variable, renders the result of the default query 
 * into a table, searches for a specific optional SAP variable using the OLAP 
 * object finder, changes its value, and then re-renders the result into a 
 * new table for comparison.
 * 
 * View the HTML rendered by this servlet in the following file:
 * [SDK archive]/docs/examples/olap_10.result.html
 *
 * @author  SAP
 * @version 3.50 SP2
 * @since 3.50 SP2
 */
public class Olap_10 extends HttpServlet {
  private static final String CONTENT_TYPE = "text/html";

  public void init(ServletConfig config) throws ServletException {
    super.init(config);
  }

  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

    response.setContentType(CONTENT_TYPE);
    PrintWriter out = response.getWriter();

    out.println(Helpers.getDocTypeDefinition());
    out.println("<html>");
    out.println("<head><title>Olap_10</title>");
    out.println(Helpers.getStyleSheetDefinition());
    out.println("</head><body>");

    try {
      // ********************************************************
      // Connect to data source
      // ********************************************************
      IBIConnection connection = Helpers.connectToXMLADatasource(out);

      // ********************************************************
      // Get OLAP interface and Retrieve metadata.
      // ********************************************************
      IBIOlap olap = connection.getOlap();

      Helpers.SampleMetaDataBW sampleMetaData =
        Helpers.getSampleMetaDataBW(connection);

      // ********************************************************
      // Create query and get command processor.
      // ********************************************************
      IBIQuery query = olap.createQuery(sampleMetaData.cube2);
      IBICommandProcessor commandProcessor = query.getCommandProcessor();

      // ********************************************************
      // find variable [0D_SA_OR]
      // ********************************************************
      IBISapMemberVariable variable = (IBISapMemberVariable) 
        olap.getObjectFinder().findSAPVariableFirst(
          sampleMetaData.cube2, "[0D_SA_OR]");

      // ********************************************************
      // set variable sales organization [0D_SA_OR] to 
      // value New York
      // ********************************************************
      commandProcessor.clearSapVariableValue(variable);
      commandProcessor.addSapVariableValue(
        variable,
        IBISapRangeSignTypeEnum.INCLUDING,
        IBIRelationalOperatorTypeEnum.EQUAL,
        sampleMetaData.salesOrgNewYork2, 
        null);

      // ********************************************************
      // render the result set 
      // ********************************************************
      Helpers.renderQueryAndDataset(out, query);

      // ********************************************************
      // set variable sales organization [0D_SA_OR] to 
      // value San Francisco
      // ********************************************************
      commandProcessor.clearSapVariableValue(variable);
      commandProcessor.addSapVariableValue(
        variable,
        IBISapRangeSignTypeEnum.INCLUDING,
        IBIRelationalOperatorTypeEnum.EQUAL,
        sampleMetaData.salesOrgSanFrancisco2, 
        null);

      // ********************************************************
      // render the result set again
      // ********************************************************
      Helpers.renderQueryAndDataset(out, query);
    }

    // Catch errors
    catch (Exception e) {
      // $JL-EXC$
      e.printStackTrace();
      if (e instanceof IBaseException)
        out.println(
          "Error: " + ((IBaseException) e).getNestedLocalizedMessage());
      else
        out.println("Error: " + e.getMessage());
    }

    out.println("</body>");
    out.println("</html>");
  }

  public void destroy() {
  }

  public static void main(String[] args) {

    if (args.length == 1) {
      MinimalServletContainer.executeServlet(new Olap_10(), args[0]);
    } else {
      MinimalServletContainer.executeServlet(new Olap_10(), System.out);
    }
  }

}