Search in sources :

Example 1 with WJDALOperations

use of com.cosylab.CDB.WJDALOperations in project ACS by ACS-Community.

the class Server method run.

public void run(String[] args) {
    String iorFileName = null;
    final Logger sharedLogger = ClientLogManager.getAcsLogManager().getLoggerForApplication(CDB_LOGGER_NAME, true);
    try {
        Properties properties = System.getProperties();
        // default is JDK ORB
        boolean useJacORB = false;
        int portNumber = Integer.parseInt(ACSPorts.getCDBPort());
        for (int i = 0; i < args.length; i++) {
            if (args[i].equals("-OAport") || args[i].equals("-OAPort")) {
                if (i < args.length - 1) {
                    portNumber = Integer.valueOf(args[++i]).intValue();
                }
            }
            if (args[i].equals("-OAIAddr")) {
                if (i < args.length - 1) {
                    properties.put("OAIAddr", args[++i]);
                }
            }
            if (args[i].equals("-orbacus")) {
                sharedLogger.log(AcsLogLevel.NOTICE, "ORBacus is no longer supported, switching to JacORB.");
                //System.err.println(
                //	"ORBacus is no longer supported, switching to JacORB.");
                useJacORB = true;
            }
            if (args[i].equals("-jacorb")) {
                useJacORB = true;
            }
            if (args[i].equals("-o")) {
                if (i < args.length - 1) {
                    iorFileName = args[++i];
                } else {
                    iorFileName = "DAL.ior";
                }
            }
        }
        if (useJacORB) {
            sharedLogger.log(AcsLogLevel.DELOUSE, "DALfs will use JacORB ORB");
            properties.put("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
            properties.put("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
            // port
            properties.put("OAPort", Integer.toString(portNumber));
            // ORB implementation name
            properties.put("jacorb.implname", "ORB");
            /*
				 * by setting the following property, the ORB will
				 * accept client requests targeted at the object with
				 * key "CDB", so more readable corbaloc URLs
				 * can be used
				 */
            properties.put("jacorb.orb.objectKeyMap.CDB", "ORB/dalPOA/CDB");
        } else {
            properties.put("com.sun.CORBA.POA.ORBPersistentServerPort", Integer.toString(portNumber));
        }
        // create and initialize the ORB
        ORB orb = ORB.init(args, properties);
        // get reference to rootpoa & activate the POAManager
        POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
        /* create a user defined poa for the naming contexts */
        org.omg.CORBA.Policy[] policies = new org.omg.CORBA.Policy[2];
        policies[0] = rootpoa.create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID);
        if (useJacORB)
            policies[1] = rootpoa.create_lifespan_policy(LifespanPolicyValue.PERSISTENT);
        else
            policies[1] = rootpoa.create_lifespan_policy(LifespanPolicyValue.TRANSIENT);
        POA dalpoa = rootpoa.create_POA("dalPOA", rootpoa.the_POAManager(), policies);
        for (int i = 0; i < policies.length; i++) policies[i].destroy();
        rootpoa.the_POAManager().activate();
        // create servant and register it with the ORB
        final WDALImpl servantDelegate = new WDALImpl(args, orb, dalpoa, sharedLogger);
        WJDALOperations topLevelServantDelegate = servantDelegate;
        if (Boolean.getBoolean(LOG_CDB_CALLS_PROPERTYNAME)) {
            // Currently we only intercept the functional IDL-defined methods, by wrapping servantDelegate.
            // If we want to also intercept the CORBA admin methods, then *servant* should be wrapped with a dynamic proxy instead.
            WJDALOperations interceptingServantDelegate = SimpleCallInterceptor.createSimpleInterceptor(WJDALOperations.class, servantDelegate, sharedLogger);
            topLevelServantDelegate = interceptingServantDelegate;
        }
        final Servant servant = new WJDALPOATie(topLevelServantDelegate);
        //create object id
        byte[] id = { 'C', 'D', 'B' };
        //activate object
        dalpoa.activate_object_with_id(id, servant);
        // get object reference from the servant
        org.omg.CORBA.Object ref = dalpoa.servant_to_reference(servant);
        jdal = JDALHelper.narrow(ref);
        // try to bind it in IOR
        if (useJacORB) {
        // nothing to do here
        } else {
            ((com.sun.corba.se.internal.Interceptors.PIORB) orb).register_initial_reference("CDB", rootpoa.servant_to_reference(servant));
        }
        // register in name service if available
        try {
            // get the root naming context
            org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
            NamingContext ncRef = NamingContextHelper.narrow(objRef);
            // Bind the object reference in naming
            NameComponent nc = new NameComponent("CDB", "");
            NameComponent[] path = { nc };
            ncRef.rebind(path, jdal);
        }// is not set at all with the ORBInitRef.NameService property
         catch (Exception e1) {
            sharedLogger.log(AcsLogLevel.NOTICE, "JDAL is NOT registered in the name service because of: " + e1);
        }
        if (Integer.getInteger("ACS.logstdout", 4) < 4) {
            sharedLogger.log(AcsLogLevel.INFO, "JDAL is listening on " + ACSPorts.getIP() + ":" + portNumber + "/CDB");
        }
        // recover (notify) clients
        if (servantDelegate instanceof Recoverer) {
            ((Recoverer) servantDelegate).recoverClients();
        }
        if (iorFileName != null) {
            // write the object reference to a file
            PrintWriter iorFile = new PrintWriter(new FileWriter(iorFileName));
            iorFile.println(orb.object_to_string(jdal));
            iorFile.close();
        }
        sharedLogger.log(AcsLogLevel.INFO, "JDAL is ready and waiting ...");
        // GCH 2006-11-13
        // Here we put also a println to be sure that the message
        // ALWAYS appears on standart output, also if the logging level 
        // is put higher than INFO.
        // This is needed because the ACS startup scripts wait for this message
        // to declare complete the startup of the CDB. 
        System.out.println("JDAL is ready and waiting ...");
        // preload cache
        new Thread(new Runnable() {

            public void run() {
                preloadCache(servantDelegate.getDALImplDelegate(), sharedLogger);
            }
        }, "preload-cache").start();
        // Init remote Logging
        try {
            ClientLogManager.getAcsLogManager().initRemoteLoggingForService(orb, true);
        } catch (Throwable t) {
            sharedLogger.log(AcsLogLevel.ERROR, "Error initializing the remote logging");
        }
        // wait for invocations from clients
        orb.run();
        sharedLogger.log(AcsLogLevel.INFO, "JDAL exiting ORB loop ...");
    } catch (Exception e) {
        sharedLogger.log(AcsLogLevel.NOTICE, "ERROR: " + e);
        e.printStackTrace(System.out);
    }
}
Also used : WJDALOperations(com.cosylab.CDB.WJDALOperations) NameComponent(org.omg.CosNaming.NameComponent) FileWriter(java.io.FileWriter) Logger(java.util.logging.Logger) Properties(java.util.Properties) NamingContext(org.omg.CosNaming.NamingContext) Servant(org.omg.PortableServer.Servant) PrintWriter(java.io.PrintWriter) POA(org.omg.PortableServer.POA) WJDALPOATie(com.cosylab.CDB.WJDALPOATie) ORB(org.omg.CORBA.ORB)

Aggregations

WJDALOperations (com.cosylab.CDB.WJDALOperations)1 WJDALPOATie (com.cosylab.CDB.WJDALPOATie)1 FileWriter (java.io.FileWriter)1 PrintWriter (java.io.PrintWriter)1 Properties (java.util.Properties)1 Logger (java.util.logging.Logger)1 ORB (org.omg.CORBA.ORB)1 NameComponent (org.omg.CosNaming.NameComponent)1 NamingContext (org.omg.CosNaming.NamingContext)1 POA (org.omg.PortableServer.POA)1 Servant (org.omg.PortableServer.Servant)1