com.redhat.rhn.taskomatic.core.TaskomaticDaemon.java Source code

Java tutorial

Introduction

Here is the source code for com.redhat.rhn.taskomatic.core.TaskomaticDaemon.java

Source

/**
 * Copyright (c) 2009--2010 Red Hat, Inc.
 *
 * This software is licensed to you under the GNU General Public License,
 * version 2 (GPLv2). There is NO WARRANTY for this software, express or
 * implied, including the implied warranties of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
 * along with this software; if not, see
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
 *
 * Red Hat trademarks are not licensed under GPLv2. No permission is
 * granted to use or replicate Red Hat trademarks that are incorporated
 * in this software or its documentation.
 */
package com.redhat.rhn.taskomatic.core;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.log4j.Logger;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import redstone.xmlrpc.XmlRpcClient;

/**
 * Implementation of the Taskomatic schedule task execution system.
 * This class serves merely as an interface between the native daemon
 * library and the actual scheduler setup and running logic implemented
 * in SchedulerKernel.
 * @version $Rev$
 * @see SchedulerKernel
 */
public class TaskomaticDaemon extends BaseDaemon {

    public static final int ERR_SCHED_CREATE = -5;

    private Map masterOptionsMap = new HashMap();
    private SchedulerKernel kernel;

    /**
     * Main entry point for the native daemon
     * @param argv "Command-line" parameters
     */
    public static void main(String[] argv) {
        TaskomaticDaemon daemon = new TaskomaticDaemon();
        daemon.registerImplementation(argv);
    }

    protected Options buildOptionsList() {
        Options accum = new Options();
        createOption(accum, TaskomaticConstants.CLI_DEBUG, false, null, "turn on debug mode");
        createOption(accum, TaskomaticConstants.CLI_DAEMON, false, null, "turn on daemon mode");
        createOption(accum, TaskomaticConstants.CLI_SINGLE, false, null, "run a single task and exit");
        createOption(accum, TaskomaticConstants.CLI_HELP, false, null, "prints out help screen");
        createOption(accum, TaskomaticConstants.CLI_PIDFILE, true, "<pidfile>", "use PID file <pidfile>");
        createOption(accum, TaskomaticConstants.CLI_TASK, true, "taskname",
                "run this task (may be specified multiple times)");
        createOption(accum, TaskomaticConstants.CLI_DBURL, true, "url", "jdbcurl");
        createOption(accum, TaskomaticConstants.CLI_DBUSER, true, "username", "database username");
        createOption(accum, TaskomaticConstants.CLI_DBPASSWORD, true, "password", "database password");
        return accum;
    }

    protected int onStartup(CommandLine commandLine) {
        Logger log = Logger.getLogger(this.getClass());
        Map overrides = null;
        int retval = BaseDaemon.SUCCESS;

        //since the cobbler sync tasks rely on tomcat to be up
        //   let sleep until it is up
        while (!isTomcatUp()) {
            try {
                log.info("Tomcat is not up yet, sleeping 4 seconds");
                Thread.sleep(4000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (commandLine != null) {
            overrides = parseOverrides(commandLine);
        }
        try {
            this.kernel = new SchedulerKernel();
            Runnable r = new Runnable() {
                public void run() {
                    try {
                        kernel.startup();
                    } catch (TaskomaticException e) {
                        logMessage(BaseDaemon.LOG_FATAL, e.getMessage(), e);

                    }
                }
            };
            Thread t = new Thread(r);
            t.start();
        } catch (Throwable t) {
            logMessage(BaseDaemon.LOG_FATAL, t.getMessage(), t);
            System.exit(-1);
        }
        return retval;
    }

    protected int onShutdown(boolean breakFromUser) {
        // TODO Auto-generated method stub
        return 0;
    }

    private Map parseOverrides(CommandLine commandLine) {
        Map configOverrides = new HashMap();
        // Loop thru all possible options and let's see what we get
        for (Iterator iter = this.masterOptionsMap.keySet().iterator(); iter.hasNext();) {

            String optionName = (String) iter.next();

            if (commandLine.hasOption(optionName)) {

                // All of these options are single-value options so they're
                // grouped together here
                if (optionName.equals(TaskomaticConstants.CLI_PIDFILE)
                        || optionName.equals(TaskomaticConstants.CLI_DBURL)
                        || optionName.equals(TaskomaticConstants.CLI_DBUSER)
                        || optionName.equals(TaskomaticConstants.CLI_DBPASSWORD)) {
                    configOverrides.put(optionName, commandLine.getOptionValue(optionName));
                }

                // The presence of these options toggle them on, hence the use of
                // Boolean.TRUE
                else if (optionName.equals(TaskomaticConstants.CLI_DEBUG)
                        || optionName.equals(TaskomaticConstants.CLI_DAEMON)
                        || optionName.equals(TaskomaticConstants.CLI_SINGLE)) {
                    configOverrides.put(optionName, Boolean.TRUE);
                }

                // Possibly multi-value list of task implementations to schedule
                else if (optionName.equals(TaskomaticConstants.CLI_TASK)) {
                    String[] taskImpls = commandLine.getOptionValues(optionName);
                    if (taskImpls != null && taskImpls.length > 0) {
                        configOverrides.put(optionName, Arrays.asList(taskImpls));
                    }
                }
            }
        }
        return configOverrides;
    }

    private void createOption(Options accum, String longopt, boolean arg, String argName, String description) {
        OptionBuilder.withArgName(argName);
        OptionBuilder.withLongOpt(longopt);
        OptionBuilder.hasArg(arg);
        OptionBuilder.withDescription(description);
        Option option = OptionBuilder.create(longopt);
        accum.addOption(option);
        if (this.masterOptionsMap.get(longopt) == null) {
            this.masterOptionsMap.put(longopt, option);
        }
    }

    private boolean isTomcatUp() {
        boolean toRet = false;
        try {
            XmlRpcClient client = new XmlRpcClient("http://localhost/rpc/api", false);
            Object obj = client.invoke("api.getVersion", Collections.EMPTY_LIST);
            if (obj instanceof String) {
                toRet = true;
            }
        } catch (Exception e) {
            toRet = false;
        }
        return toRet;
    }
}