package com.sap.mw.jco.jra.examples;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import javax.naming.*;
import javax.resource.cci.*;

public class VeriClientServlet extends HttpServlet
{
  private static final String CONTENT_TYPE = "text/html";
  private String prefix = "eis/";
  private String appServerName = "an unknown Application Server";
  private String contextFactory = "";

  /**Initialize global variables*/

  public void init() throws ServletException
  {
  }
  /**Process the HTTP Get request*/
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
  {
      Context ctx = null;
      ConnectionFactory connectionfactory = null;
      Connection connection = null;
      RecordFactory recordfactory = null;
      Interaction interaction = null;

      response.setContentType(CONTENT_TYPE);
      PrintWriter out = response.getWriter();
      out.println("<html>");
      out.println("<head><title>VeriClientServlet</title></head>");
      out.println("<body>");
      out.println("<p>SAPJRA TestSuite.</p>");
      out.println("Date:" + new Date());

      try
      {
        //obtain the initial JNDI context
        ctx = new InitialContext();
      }
      catch (Exception e)
      {
        out.println("<p>Can't get context."+e.toString()+"</p>");
        out.println("</body></html>");
        return;
      }

      // compartibility adjustments
      try
      {
          contextFactory = (String)ctx.getEnvironment().get("java.naming.factory.initial");

          if (contextFactory != null) this.adjustServer(contextFactory);
          out.println("<br><br>Your application is running on "+appServerName);

      }//try
      catch (Exception ex)
      {
          out.println("<br>Can't adjust jndi name for SAPJRAFactory.");
          out.println(ex);
          return;

      }//catch


      // look up for ConnectinFactory
      try
      {
          connectionfactory = (ConnectionFactory)ctx.lookup(prefix+"SAPJRAFactory");

      }//try
      catch (Exception ex)
      {
          out.println("<br>Can't look up " +prefix+"SAPJRAFactory.");
          out.println(ex);
          return;

      }//catch

      // get Connection
      try
      {
          connection = connectionfactory.getConnection();
          out.println("<br><br>connection to "+  connection.getMetaData().getEISProductName()    +
                                  ", "+  connection.getMetaData().getEISProductVersion() +
                                  " with user \""+connection.getMetaData().getUserName() +
                                  "\" created<br>");
      }//try
      catch (Exception ex)
      {
          out.println("<br>Can't create connection .");
          System.out.println(ex);
          return;
      }//catch

      boolean status = false;
      try
      {

          // get RecordFactory
          recordfactory = connectionfactory.getRecordFactory();

          // create Interaction
          interaction = connection.createInteraction();

          // ************** call STFC_CONNECTION *******************************
          out.print("<br>Call function STFC_CONNECTION........");
          status = test_STFC_CONNECTION(recordfactory, interaction);
          out.println(status ? "OK" : "ERROR");

          // ************** call STFC_STRUCTURE *******************************
          out.print("<br>Call function STFC_STRUCTURE.........");
          status = test_STFC_STRUCTURE(recordfactory, interaction);
          out.println(status ? "OK" : "ERROR");

          // release interaction
          interaction.close();

      }
      catch(Exception e)
      {
          out.println("<br>Can't call function .");
          out.println(e);
          return;
      }
      finally
      {
          if (connection != null)
          {
              try
              {
                  connection.close();
              }
              catch(Exception e)
              {
                  out.println("Can't close connection .");
                  out.println(e);
              }
          }
      }
      out.println("</body></html>");
  }

  private void adjustServer(String contextFactory)
  {
      if (contextFactory.equals("com.inqmy.services.jndi.InitialContextFactoryImpl"))
      {
          prefix = "EISConnections/";
          appServerName = "Inqmy Application Server / SAP J2EE 620";
      }
      else if (contextFactory.equals("com.sap.engine.services.jndi.InitialContextFactoryImpl"))
      {
          prefix = "java:comp/env/eis/";
          appServerName = "SAP J2EE Engine 630";
      }

      else if (contextFactory.equals("com.sun.enterprise.naming.SerialInitContextFactory"))
      {
          appServerName = "SUN Reference Implementation 1.3.X";
      }

  }

  private boolean test_STFC_CONNECTION(RecordFactory recordFactory, Interaction interaction) throws javax.resource.ResourceException
  {
      boolean status = false;
      MappedRecord input = recordFactory.createMappedRecord("STFC_CONNECTION");
      String inputString = "call STFC_CONNECTION";

      // set input-parameters
      input.put("REQUTEXT", inputString);

      // call function and create output
      MappedRecord output = (MappedRecord) interaction.execute(null, input);
      String outputString = (String) output.get("ECHOTEXT");

      status = inputString.equals(outputString);

      return status;
  }

  private boolean test_STFC_STRUCTURE(RecordFactory recordFactory, Interaction interaction) throws javax.resource.ResourceException, java.sql.SQLException
  {
      boolean status = true;
      int rows = 5;
      MappedRecord input = recordFactory.createMappedRecord("STFC_STRUCTURE");

      MappedRecord importstruct = (MappedRecord)input.get("IMPORTSTRUCT");
      importstruct.put("RFCFLOAT","1.23456");
      importstruct.put("RFCCHAR1","A");
      importstruct.put("RFCINT2", "12345");
      importstruct.put("RFCINT1", "123");
      importstruct.put("RFCCHAR4","ABCD");
      importstruct.put("RFCINT4", "1234567890");
      byte [] b = {(byte)0xf7, (byte)0xf7, (byte)0xf7};
      importstruct.put("RFCHEX3", b);
      importstruct.put("RFCCHAR2","AB");
      importstruct.put("RFCTIME", "032559");
      importstruct.put("RFCDATE", "2001-08-24");
      importstruct.put("RFCDATA1", "This is Comment of field of type RFCDATA1");
      importstruct.put("RFCDATA2", "This is Comment of field of type RFCDATA2");

      ResultSet rfctable = (ResultSet)input.get("RFCTABLE");
      for (int i = 0; i < rows; i++) {

          rfctable.moveToInsertRow();

          rfctable.updateFloat("RFCFLOAT",(float)1.6);
          rfctable.updateString("RFCCHAR1","Y");
          rfctable.updateInt("RFCINT2", 260 + i);
          rfctable.updateShort("RFCINT1", (short)i);
          rfctable.updateString("RFCCHAR4","EFGH"+i);
          rfctable.updateLong("RFCINT4", Long.parseLong("987654321")); // 8 byte long is not supported by R/3
          rfctable.updateBytes("RFCHEX3", b);
          rfctable.updateObject("RFCCHAR2","AB");
          rfctable.updateTime("RFCTIME", new java.sql.Time(System.currentTimeMillis()));
          rfctable.updateDate("RFCDATE",new java.sql.Date(System.currentTimeMillis()));
          rfctable.updateString("RFCDATA1", "This is Comment of field of type RFCDATA1");

          rfctable.insertRow();
      }

      // call function and create output
      MappedRecord output = (MappedRecord) interaction.execute(null, input);
      MappedRecord echostruct = (MappedRecord) output.get("ECHOSTRUCT");

      Iterator iterator = importstruct.entrySet().iterator();
      while (status && iterator.hasNext())
      {

          String key = ((Map.Entry)iterator.next()).getKey().toString();
          if (!key.equals("RFCHEX3"))
              status = (importstruct.get(key)).equals(echostruct.get(key));
          else
              status = java.util.Arrays.equals((byte[])echostruct.get("RFCHEX3"), (byte[])importstruct.get("RFCHEX3"));
      }
      return status;
  }

  /**Clean up resources*/
  public void destroy()
  {
  }
}