/** * Example5.java * Property of SAP AG, Walldorf * (c) Copyright SAP AG, Walldorf, 2000. * All rights reserved. */ import com.sap.mw.jco.*; import java.util.*; /** * @version 1.0 * @author SAP AG, Walldorf */ //****************************************************************************** public class Example5 implements JCO.ServerExceptionListener, JCO.ServerStateChangedListener { //****************************************************************************** /** * Implementation of our own repository. * Just dummy extend the basic repository that comes with the JCO package */ static public class Repository extends JCO.BasicRepository implements com.sap.mw.jco.IRepository { /** * Creates a new empty repository */ public Repository(String name) { super(name); } } /** The repository we gonna be using */ protected static IRepository repository; static { repository = new Repository("TestRepository"); //------------------------------------------------------------------------------ // Add function 'STFC_CONNECTION' //------------------------------------------------------------------------------ JCO.MetaData fmeta = new JCO.MetaData("STFC_CONNECTION"); fmeta.addInfo("REQUTEXT", JCO.TYPE_CHAR, 255, 0, 0, JCO.IMPORT_PARAMETER, null); fmeta.addInfo("ECHOTEXT", JCO.TYPE_CHAR, 255, 0, 0, JCO.EXPORT_PARAMETER, null); fmeta.addInfo("RESPTEXT", JCO.TYPE_CHAR, 255, 0, 0, JCO.EXPORT_PARAMETER, null); repository.addFunctionInterfaceToCache(fmeta); //------------------------------------------------------------------------------ // Add function 'STFC_STRUCTURE' //------------------------------------------------------------------------------ fmeta = new JCO.MetaData("STFC_STRUCTURE"); fmeta.addInfo("IMPORTSTRUCT", JCO.TYPE_STRUCTURE, 144, 0, 0, JCO.IMPORT_PARAMETER, "RFCTEST"); fmeta.addInfo("ECHOSTRUCT", JCO.TYPE_STRUCTURE, 144, 0, 0, JCO.EXPORT_PARAMETER, "RFCTEST"); fmeta.addInfo("RESPTEXT", JCO.TYPE_CHAR, 255, 0, 0, JCO.EXPORT_PARAMETER, null ); fmeta.addInfo("RFCTABLE", JCO.TYPE_TABLE, 144, 0, 0, 0, "RFCTEST"); repository.addFunctionInterfaceToCache(fmeta); //------------------------------------------------------------------------------ // Add the structure RFCTEST to the structure cache //------------------------------------------------------------------------------ JCO.MetaData smeta = new JCO.MetaData("RFCTEST"); smeta.addInfo("RFCFLOAT", JCO.TYPE_FLOAT, 8, 0, 0); smeta.addInfo("RFCCHAR1", JCO.TYPE_CHAR, 1, 8, 0); smeta.addInfo("RFCINT2", JCO.TYPE_INT2, 2, 10, 0); smeta.addInfo("RFCINT1", JCO.TYPE_INT1, 1, 12, 0); smeta.addInfo("RFCICHAR4", JCO.TYPE_CHAR, 4, 13, 0); smeta.addInfo("RFCINT4", JCO.TYPE_INT, 4, 20, 0); smeta.addInfo("RFCHEX3", JCO.TYPE_BYTE, 3, 24, 0); smeta.addInfo("RFCCHAR2", JCO.TYPE_CHAR, 2, 27, 0); smeta.addInfo("RFCTIME", JCO.TYPE_TIME, 6, 29, 0); smeta.addInfo("RFRDATE", JCO.TYPE_DATE, 8, 35, 0); smeta.addInfo("RFCDATA1", JCO.TYPE_CHAR, 50,43, 0); smeta.addInfo("RFCDATA2", JCO.TYPE_CHAR, 50,93, 0); repository.addStructureDefinitionToCache(smeta); } /** * Implementation of my own server */ static public class Server extends JCO.Server { /** * Create an instance of my own server * @param gwhost the gateway host * @param gwserv the gateway service number * @param progid the program id * @param repository the repository used by the server to lookup the definitions of an inc */ public Server(String gwhost, String gwserv, String progid, IRepository repository) { super(gwhost,gwserv,progid,repository); } /** * Not really necessarry to override this function but for demonstration purposes... */ protected JCO.Function getFunction(String function_name) { JCO.Function function = super.getFunction(function_name); return function; } /** * Not really necessarry to override this method but for demonstration purposes... */ protected boolean checkAuthorization(String function_name, int authorization_mode, String authorization_partner, byte[] authorization_key) { /*Simply allow everyone to invoke the services */ return true; } /** * Overrides the default method. * Can handle only the two functions STFC_CONNECTION and STFC_STRUCTURE */ protected void handleRequest(JCO.Function function) { JCO.ParameterList input = function.getImportParameterList(); JCO.ParameterList output = function.getExportParameterList(); JCO.ParameterList tables = function.getTableParameterList(); System.out.println("handleRequest(" + function.getName() + ")"); if (function.getName().equals("STFC_CONNECTION")) { output.setValue(input.getString("REQUTEXT"),"ECHOTEXT"); output.setValue("This is a response from Example5.java","RESPTEXT"); } else if (function.getName().equals("STFC_STRUCTURE")) { JCO.Structure sin = input.getStructure("IMPORTSTRUCT"); JCO.Structure sout = (JCO.Structure)sin.clone(); try { System.out.println(sin); } catch (Exception ex) { System.out.println(ex); } output.setValue(sout,"ECHOSTRUCT"); output.setValue("This is a response from Example5.java","RESPTEXT"); }//if } } /** List of servers */ JCO.Server srv[] = new JCO.Server[2]; /** * Constructor */ public Example5() { // Yes, we're interested in server exceptions JCO.addServerExceptionListener(this); // And we also want to know when the server(s) change their states JCO.addServerStateChangedListener(this); } /** * Start the server */ public void startServers() { // Server 1 listens for incoming requests from system 1 // (Change gateway host, service, and program ID according to your needs) srv[0] = new Server("gwhost1","gwserv00","JCOSERVER01",repository); // Server 2 listens for incoming requests from system 2 // (Change gateway host, service, and program ID according to your needs) srv[1] = new Server("gwhost2","gwserv00","JCOSERVER02",repository); for (int i = 0; i < srv.length; i++) { try { srv[i].setTrace(true); srv[i].start(); } catch (Exception ex) { System.out.println("Could not start server " + srv[i].getProgID() + ":\n" + ex); }//try }//for } /** * Simply prints the text of the exception and a stack trace */ public void serverExceptionOccurred(JCO.Server server, Exception ex) { System.out.println("Exception in server " + server.getProgID() + ":\n" + ex); ex.printStackTrace(); } /** * Simply prints server state changes */ public void serverStateChangeOccurred(JCO.Server server, int old_state, int new_state) { System.out.print("Server " + server.getProgID() + " changed state from ["); if ((old_state & JCO.STATE_STOPPED ) != 0) System.out.print(" STOPPED "); if ((old_state & JCO.STATE_STARTED ) != 0) System.out.print(" STARTED "); if ((old_state & JCO.STATE_LISTENING ) != 0) System.out.print(" LISTENING "); if ((old_state & JCO.STATE_TRANSACTION) != 0) System.out.print(" TRANSACTION "); if ((old_state & JCO.STATE_BUSY ) != 0) System.out.print(" BUSY "); System.out.print("] to ["); if ((new_state & JCO.STATE_STOPPED ) != 0) System.out.print(" STOPPED "); if ((new_state & JCO.STATE_STARTED ) != 0) System.out.print(" STARTED "); if ((new_state & JCO.STATE_LISTENING ) != 0) System.out.print(" LISTENING "); if ((new_state & JCO.STATE_TRANSACTION) != 0) System.out.print(" TRANSACTION "); if ((new_state & JCO.STATE_BUSY ) != 0) System.out.print(" BUSY "); System.out.println("]"); } public static void main(String[] argv) { JCO.setTraceLevel(0); Example5 obj = new Example5(); obj.startServers(); } }