/* * 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; } }