org.wso2.carbon.cloud.gateway.agent.CGAgentUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.carbon.cloud.gateway.agent.CGAgentUtils.java

Source

/*
 * Copyright WSO2, Inc. (http://wso2.com)
 *
 * 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.wso2.carbon.cloud.gateway.agent;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNode;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.util.SynapseBinaryDataSource;
import org.wso2.carbon.authenticator.stub.LoginAuthenticationExceptionException;
import org.wso2.carbon.cloud.gateway.agent.client.AuthenticationClient;
import org.wso2.carbon.cloud.gateway.common.CGConstant;
import org.wso2.carbon.cloud.gateway.common.CGException;
import org.wso2.carbon.cloud.gateway.common.CGServerBean;
import org.wso2.carbon.cloud.gateway.common.CGUtils;
import org.wso2.carbon.core.util.CryptoException;
import org.wso2.carbon.core.util.CryptoUtil;
import org.wso2.carbon.registry.api.Collection;
import org.wso2.carbon.registry.api.RegistryException;
import org.wso2.carbon.registry.api.Resource;
import org.wso2.carbon.registry.core.jdbc.utils.Transaction;

import javax.activation.DataHandler;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.SocketException;
import java.net.URL;
import java.net.URLConnection;
import java.rmi.RemoteException;

public class CGAgentUtils {

    private static Log log = LogFactory.getLog(CGAgentUtils.class);

    /**
     * Prevents this utility class being instantiated.
     */
    private CGAgentUtils() {
    }

    /**
     * Returns the session cookie given the admin credentials
     *
     * @param serverUrl  the server url
     * @param userName   user name
     * @param password   password
     * @param domainName Domain Name
     * @param hostName   host name of the remote server
     * @return the session cookie
     * @throws java.net.SocketException throws in case of a socket exception
     * @throws org.wso2.carbon.authenticator.stub.LoginAuthenticationExceptionException
     *                                  throws in case of a authentication failure
     * @throws java.rmi.RemoteException throws in case of a connection failure
     */
    public static String getSessionCookie(String serverUrl, String userName, String password, String domainName,
            String hostName) throws SocketException, RemoteException, LoginAuthenticationExceptionException {
        AuthenticationClient authClient = new AuthenticationClient();
        return authClient.getSessionCookie(serverUrl, userName, password, hostName, domainName);
    }

    /**
     * Create the {@link org.wso2.carbon.cloud.gateway.common.CGServerBean} from the registry resource
     *
     * @param resource the csg server meta information collection
     * @return the CSGServer bean created from the meta information
     * @throws org.wso2.carbon.cloud.gateway.common.CGException
     *          throws in case of an error
     */
    public static CGServerBean getCGServerBean(Resource resource) throws CGException {
        CGServerBean bean = new CGServerBean();
        try {
            bean.setHost(resource.getProperty(CGConstant.CG_SERVER_HOST));
            bean.setName(resource.getProperty(CGConstant.CG_SERVER_NAME));
            bean.setUserName(resource.getProperty(CGConstant.CG_SERVER_USER_NAME));
            bean.setPort(resource.getProperty(CGConstant.CG_SERVER_PORT));
            bean.setDomainName(resource.getProperty(CGConstant.CG_SERVER_DOMAIN_NAME));

            CryptoUtil cryptoUtil = CryptoUtil.getDefaultCryptoUtil();
            String plainPassWord = new String(
                    cryptoUtil.base64DecodeAndDecrypt(resource.getProperty(CGConstant.CG_SERVER_PASS_WORD)));
            bean.setPassWord(plainPassWord);

            return bean;
        } catch (CryptoException e) {
            throw new CGException("Could not get the CG server information from the resource: " + resource, e);
        }
    }

    /**
     * Persist the server into registry
     *
     * @param registry  registry instance
     * @param csgServer csg server instance
     * @throws org.wso2.carbon.cloud.gateway.common.CGException throws in case of an error
     */
    public static void persistServer(org.wso2.carbon.registry.core.Registry registry, CGServerBean csgServer)
            throws CGException {
        boolean isTransactionAlreadyStarted = Transaction.isStarted();
        boolean isTransactionSuccess = true;
        try {
            if (!isTransactionAlreadyStarted) {
                // start a transaction only if we are not in one.
                registry.beginTransaction();
            }

            Collection collection = registry.newCollection();
            if (!registry.resourceExists(CGConstant.REGISTRY_CG_RESOURCE_PATH)) {
                registry.put(CGConstant.REGISTRY_CG_RESOURCE_PATH, collection);
                if (!registry.resourceExists(CGConstant.REGISTRY_SERVER_RESOURCE_PATH)) {
                    registry.put(CGConstant.REGISTRY_SERVER_RESOURCE_PATH, collection);
                }
            }

            Resource resource = registry.newResource();
            resource.addProperty(CGConstant.CG_SERVER_NAME, csgServer.getName());
            resource.addProperty(CGConstant.CG_SERVER_HOST, csgServer.getHost());
            resource.addProperty(CGConstant.CG_SERVER_USER_NAME, csgServer.getUserName());
            resource.addProperty(CGConstant.CG_SERVER_PORT, csgServer.getPort());
            resource.addProperty(CGConstant.CG_SERVER_DOMAIN_NAME, csgServer.getDomainName());

            CryptoUtil cryptoUtil = CryptoUtil.getDefaultCryptoUtil();
            resource.addProperty(CGConstant.CG_SERVER_PASS_WORD,
                    cryptoUtil.encryptAndBase64Encode(csgServer.getPassWord().getBytes()));

            registry.put(CGConstant.REGISTRY_SERVER_RESOURCE_PATH + "/" + csgServer.getName(), resource);

        } catch (Exception e) {
            isTransactionSuccess = false;
            throw new CGException("Error occurred while saving the content into registry", e);
        } finally {
            if (!isTransactionAlreadyStarted) {
                try {
                    if (isTransactionSuccess) {
                        // commit the transaction since we started it.
                        registry.commitTransaction();
                    } else {
                        registry.rollbackTransaction();
                    }
                } catch (RegistryException re) {
                    log.error("Error occurred while trying to rollback or commit the transaction", re);
                }
            }

        }
    }

    /**
     * Check if we have a client axis2.xml ( for example in ESB)
     *
     * @return true if we have client axis2.xml, false otherwise
     */
    public static boolean isClientAxis2XMLExists() {
        File f = new File(CGConstant.CLIENT_AXIS2_XML);
        return f.exists();
    }

    public static OMNode getOMElementFromURI(String wsdlURI) throws CGException {
        if (wsdlURI == null || "null".equals(wsdlURI)) {
            throw new CGException("Can't create URI from a null value");
        }
        URL url;
        try {
            url = new URL(wsdlURI);
        } catch (MalformedURLException e) {
            throw new CGException("Invalid URI reference '" + wsdlURI + "'", e);
        }
        URLConnection connection;
        connection = getURLConnection(url);
        if (connection == null) {
            throw new CGException("Cannot create a URLConnection for given URL : " + url);
        }
        connection.setReadTimeout(getReadTimeout());
        connection.setConnectTimeout(getConnectTimeout());
        connection.setRequestProperty("Connection", "close"); // if http is being used
        InputStream inStream = null;

        try {
            inStream = connection.getInputStream();
            StAXOMBuilder builder = new StAXOMBuilder(inStream);
            OMElement doc = builder.getDocumentElement();
            doc.build();
            return doc;
        } catch (Exception e) {
            if (log.isDebugEnabled()) {
                log.debug("Reading as XML failed due to ", e);
            }
            return readNonXML(url);
        } finally {
            try {
                if (inStream != null) {
                    inStream.close();
                }
            } catch (IOException e) {
                log.warn("Error while closing the input stream to: " + url, e);
            }
        }
    }

    private static int getReadTimeout() {
        return Integer.parseInt(
                CGUtils.getStringProperty(CGConstant.READTIMEOUT, String.valueOf(CGConstant.DEFAULT_READTIMEOUT)));

    }

    private static int getConnectTimeout() {
        return Integer.parseInt(CGUtils.getStringProperty(CGConstant.CONNECTTIMEOUT,
                String.valueOf(CGConstant.DEFAULT_CONNECTTIMEOUT)));
    }

    private static OMNode readNonXML(URL url) throws CGException {

        try {
            // Open a new connection
            URLConnection newConnection = getURLConnection(url);
            if (newConnection == null) {
                if (log.isDebugEnabled()) {
                    log.debug("Cannot create a URLConnection for given URL : " + url);
                }
                return null;
            }

            BufferedInputStream newInputStream = new BufferedInputStream(newConnection.getInputStream());

            OMFactory omFactory = OMAbstractFactory.getOMFactory();
            return omFactory.createOMText(
                    new DataHandler(new SynapseBinaryDataSource(newInputStream, newConnection.getContentType())),
                    true);

        } catch (IOException e) {
            throw new CGException("Error when getting a stream from resource's content", e);
        }
    }

    private static URLConnection getURLConnection(URL url) throws CGException {
        URLConnection connection;
        if (url.getProtocol().equalsIgnoreCase("https")) {
            String msg = "Connecting through doesn't support";
            log.error(msg);
            throw new CGException(msg);
        } else {
            try {
                connection = url.openConnection();
            } catch (IOException e) {
                throw new CGException("Could not open the URL connection", e);
            }
        }
        connection.setReadTimeout(getReadTimeout());
        connection.setConnectTimeout(getConnectTimeout());
        connection.setRequestProperty("Connection", "close"); // if http is being used
        return connection;
    }

    public static OMElement getWSDLElement(String wsdlLocation) throws CGException {
        OMNode wsdNode = getOMElementFromURI(wsdlLocation);
        OMElement wsdlElement;
        if (wsdNode instanceof OMElement) {
            wsdlElement = (OMElement) wsdNode;
            String asString = wsdlElement.toString();
        } else {
            throw new CGException("Invalid instance type detected when parsing the WSDL '" + wsdlLocation
                    + "'. Required OMElement type!");
        }
        return wsdlElement;
    }
}