001//
002// $RCSfile: Execute.java,v $
003// $Revision: 1.3 $
004// $Date: 2014/03/21 21:18:22 $
005//
006//      Copyright 2014 Cloud Software Group, Inc. ALL RIGHTS RESERVED. 
007//      Cloud Software Group, Inc. Confidential Information
008//
009package com.tibco.xp.runtime;
010
011import com.tibco.cep.util.ResourceManager;
012import com.tibco.cep.container.standalone.BEMain;
013import com.tibco.cep.container.standalone.ClassPathReporter.ClassPathReportHandler;
014import com.tibco.cep.kernel.service.logging.Level;
015import com.tibco.cep.kernel.service.logging.LogManager;
016import com.tibco.cep.kernel.service.logging.LogManagerFactory;
017import com.tibco.cep.kernel.service.logging.Logger;
018import com.tibco.cep.repo.DeployedProject;
019import com.tibco.cep.runtime.service.ServiceRegistry;
020import com.tibco.cep.runtime.service.basic.ShutdownWatcher;
021import com.tibco.cep.runtime.service.debug.DebuggerService;
022import com.tibco.cep.runtime.session.RuleServiceProviderManager;
023import com.tibco.cep.runtime.util.SystemProperty;
024
025/**
026 * Execute the rules engine
027 */
028public class Execute extends BEMain
029{
030    private Execute(String [ ] args)
031    {
032        super(args);
033    }
034
035    /**
036     * Main entry point
037     * 
038     * @param args
039     *            User provided arguments
040     */
041    public static void main(final String[] args)
042    {
043        //
044        // Register shutdown watcher
045        //
046        ServiceRegistry registry = ServiceRegistry.getSingletonServiceRegistry();
047        assert registry != null;
048        registry.initBasic();
049        registry.initShutdownWatcher();
050        ShutdownWatcher shutdownWatcher = registry.getShutdownWatcher();
051
052        //
053        // Start the rules engine
054        //
055        try
056        {
057            new Execute(args).startRulesEngine(args);
058        }
059        catch (Throwable e)
060        {
061            LogManager logManager = LogManagerFactory.getLogManager();
062            if (logManager != null)
063            {
064                logManager.getLogger(ServiceProvider.LOGGING_MODULE_NAME).log(
065                        Level.FATAL, e, e.getMessage());
066            }
067            else
068            {
069                e.printStackTrace();
070            }
071            shutdownWatcher.exitSystem(-1);
072        }
073    }
074
075    //
076    // Start the rules engine
077    //
078    private void startRulesEngine(final String [ ] args) throws Exception
079    {
080        //
081        //  Add shutdown hook for rules engine
082        //
083        RuleServiceProviderManager.addShutdownHook();
084
085        //
086        // Create rule service provider
087        //
088        BexRuleServiceProvider rsp = BexRuleServiceProvider.getInstance(env);
089
090        //
091        // Load resource bundle
092        //
093        ResourceManager manager = ResourceManager.getInstance();
094        manager.addResourceBundle("com.tibco.cep.container.messages", rsp.getLocale());
095
096        //
097        // Log start-up message
098        //
099        Logger logger = rsp.getLogger(ServiceProvider.LOGGING_MODULE_NAME);
100        assert logger != null;
101        logger.log(Level.INFO, printPrologue(args));
102
103        //
104        // Initialize and validate the project
105        //
106        rsp.initProject();
107
108        DeployedProject project = rsp.getProject();
109        assert project != null : rsp;
110
111        if (project.isCacheEnabled() == false)
112        {
113            String message = "Cache not enabled in project "
114                    + project.getName() + ".";
115            logger.log(Level.FATAL, message);
116            throw new RuntimeError(message);
117        }
118
119        if (RuleServiceProviderManager.isConfigAsCacheServer(rsp.getProperties()) == true)
120        {
121            String message = "Project " + rsp.getProject().getName()
122                    + " cannot be configured as a cache server.";
123            logger.log(Level.FATAL, message);
124            throw new RuntimeError(message);
125        }
126        
127        //
128        //  Start the rule service provider
129        //
130        rsp.start();
131
132        //
133        // Set up class path reporter MBean
134        //
135        try
136        {
137            new ClassPathReportHandler().registerSelf();
138        }
139        catch (Exception e)
140        {
141            logger.log(Level.WARN, e, "Class path reporter MBean failed.  Initialization continuing.  MBean will be unavailable.");
142        }
143
144        //
145        // Start debugger if enabled
146        //
147        if (System.getProperty(
148                SystemProperty.DEBUGGER_SERVICE_ENABLED.getPropertyName(),
149                Boolean.FALSE.toString()).trim()
150                .equalsIgnoreCase(Boolean.TRUE.toString()))
151        {
152            logger.log(Level.INFO, "Starting debugger service...");
153
154            DebuggerService debuggerService = DebuggerService.getInstance();
155            debuggerService.init(null, rsp);
156            debuggerService.start();
157
158            logger.log(Level.INFO, "Debugger service started.");
159        }
160
161        //
162        // Wait for JVM termination
163        //
164        awaitUntilJVMTerminates();
165    }
166}