Package org.globus.workspace.remoting.admin.client

Source Code of org.globus.workspace.remoting.admin.client.RMIConfig

/**
* Copyright 1999-2010 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
*/

package org.globus.workspace.remoting.admin.client;

import com.google.gson.Gson;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.varia.NullAppender;
import org.globus.workspace.remoting.RemotingClient;
import org.nimbustools.api.brain.NimbusHomePathResolver;

import java.io.*;
import java.rmi.NotBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Properties;

/**
* This class handles the basic configuration for an RMI connection
*/
public class RMIConfig {

    protected static final Log logger =
            LogFactory.getLog(RMIConfig.class.getName());

    public static final int EXIT_OK = 0;
    public static final int EXIT_PARAMETER_PROBLEM = 1;
    public static final int EXIT_EXECUTION_PROBLEM = 2;
    public static final int EXIT_UNKNOWN_PROBLEM = 3;

    private static final String PROP_SOCKET_DIR = "socket.dir";

    protected final Gson gson = new Gson();
    protected Reporter reporter;
    protected OutputStream outStream;
    protected Properties properties;
    protected String configPath;

    private File socketDirectory;
    private String bindingName;


    protected void setupDebug(String args[]) {
        boolean isDebug = false;
        final String debugFlag = "--" + Opts.DEBUG_LONG;
        for (String arg : args) {
            if (debugFlag.equals(arg)) {
                isDebug = true;
                break;
            }
        }

        if (isDebug) {

            final PatternLayout layout = new PatternLayout("%C{1}:%L - %m%n");
            final ConsoleAppender consoleAppender = new ConsoleAppender(layout, "System.err");
            BasicConfigurator.configure(consoleAppender);

            logger.info("Debug mode enabled");
        }
        else {
            BasicConfigurator.configure(new NullAppender());
        }
    }

    protected void loadConfig(String bindingDir) throws ParameterProblem, ExecutionProblem {
        if(configPath == null)
            throw new ParameterProblem("Config path is invalid.");

        final File configFile = new File(configPath);
        logger.debug("Loading config file: " + configFile.getAbsolutePath());

        if (!configFile.canRead()) {
            throw new ParameterProblem(
                    "Specified config file path does not exist or is not readable: " +
                            configFile.getAbsolutePath());
        }

        final Properties props = new Properties();
        this.properties = props;
        try {
            FileInputStream inputStream = null;
            try {
                inputStream = new FileInputStream(configFile);
                props.load(inputStream);
            } finally {
                if (inputStream != null) {
                    inputStream.close();
                }
            }
        }
        catch (IOException e) {
            logger.debug("Caught error reading config file " + configFile.getAbsolutePath(), e);
            throw new ParameterProblem("Failed to load config file: " +
                    configFile.getAbsolutePath() + ": " + e.getMessage(), e);
        }

        final String sockDir = props.getProperty(PROP_SOCKET_DIR);
        if (sockDir == null) {
            throw new ExecutionProblem("Configuration file is missing "+
                    PROP_SOCKET_DIR + " entry: " + configFile.getAbsolutePath());
        }

        final NimbusHomePathResolver resolver = new NimbusHomePathResolver();
        String path = resolver.resolvePath(sockDir);
        if (path == null) {
            path = sockDir;
        }
        this.socketDirectory = new File(path);

        final String binding = props.getProperty(bindingDir);
        if (binding == null) {
            throw new ExecutionProblem("Configuration file is missing " +
                    bindingDir + " entry: "+
                    configFile.getAbsolutePath());
        }
        this.bindingName = binding;
    }

    protected Remote setupRemoting() throws ExecutionProblem {

        final RemotingClient client = new RemotingClient();
        client.setSocketDirectory(this.socketDirectory);

        try {
            client.initialize();
        }
        catch (RemoteException e) {
            handleRemoteException(e);
        }

        try {
            final Remote remote = client.lookup(this.bindingName);
            logger.debug("Found remote object " + remote.toString());
            return remote;
        }
        catch (RemoteException e) {
            handleRemoteException(e);
            return null;
        }
        catch (NotBoundException e) {
            throw new ExecutionProblem("Failed to bind to object '" +
                    this.bindingName +
                    "'. There may be a configuration problem between the "+
                    "client and service. Error: "+ e.getMessage(), e);
        }
    }

    protected static String[] parseFields(String fieldsString, AdminEnum action)
            throws ParameterProblem {
        final String[] fieldsArray = fieldsString.trim().split("\\s*,\\s*");
        if (fieldsArray.length == 0) {
            throw new ParameterProblem("Report fields list is empty");
        }

        for (String field : fieldsArray) {
            boolean found = false;
            for (String actionField : action.fields()) {
                if (field.equals(actionField)) {
                    found = true;
                    break;
                }
            }
            if (!found) {
                throw new ParameterProblem("Report field '"+ field +
                        "' is not allowed for this action. Allowed fields are: " +
                        csvString(action.fields()));
            }
        }

        return fieldsArray;
    }

    protected String getHelpText(InputStream input) {
        InputStream is = null;
        BufferedInputStream bis = null;
        try {
            is = input;
            if (is == null) {
                return "";
            }

            bis = new BufferedInputStream(is);
            StringBuilder sb = new StringBuilder();
            byte[] chars = new byte[1024];
            int bytesRead;
            while( (bytesRead = bis.read(chars)) > -1){
                sb.append(new String(chars, 0, bytesRead));
            }
            return sb.toString();

        } catch (IOException e) {
            logger.error("Error reading help text", e);
            return "";
        } finally {
            try {
            if (bis != null) {
                bis.close();
            }

            if (is != null) {
                is.close();
            }
            } catch (IOException e) {
                logger.error("Error reading help text", e);
            }
        }
    }

    private static String csvString(String[] fields) {
        final StringBuilder sb = new StringBuilder();
        for (String f : fields) {
            if (sb.length() != 0) {
                sb.append(", ");
            }
            sb.append(f);
        }
        return sb.toString();
    }

    protected void handleRemoteException(RemoteException e) throws ExecutionProblem {
        throw new ExecutionProblem(
                "Failed to connect to Nimbus service over domain sockets. "+
                "Is the service running?\n\nSocket directory: " +
                this.socketDirectory.getAbsolutePath() + "\n\nError: " +
                e.getMessage(), e);
    }
}
TOP

Related Classes of org.globus.workspace.remoting.admin.client.RMIConfig

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.