Java tutorial
/* * RHQ Management Platform * Copyright (C) 2005-2012 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package web.kz.rhq.modules.plugins.jbossas7; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Authenticator; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.SocketTimeoutException; import java.net.URL; import java.util.StringTokenizer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.DeserializationConfig; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.SerializationConfig; import org.rhq.core.util.stream.StreamUtil; import web.kz.rhq.modules.plugins.jbossas7.json.ComplexResult; import web.kz.rhq.modules.plugins.jbossas7.json.Operation; import web.kz.rhq.modules.plugins.jbossas7.json.Result; /** * Provide management connections to an AS7 instance and reading/writing data from/to it. * * @author Heiko W. Rupp */ public class ASConnection { public static final String MANAGEMENT = "/management"; private static final String FAILURE_DESCRIPTION = "\"failure-description\""; // This is a variable on purpose, so devs can switch it on in the debugger or in the agent public static boolean verbose = false; private static final int HTTP_TEMPORARY_REDIRECT = 307; private final Log log = LogFactory.getLog(ASConnection.class); private URL url; private String urlString; private ObjectMapper mapper; private Authenticator passwordAuthenticator; private String host; private int port; /** * Construct an ASConnection object. The real "physical" connection is done in {@link #executeRaw(Operation)}. * * @param host Host of the DomainController or standalone server * @param port Port of the JSON api. * @param user user needed for authentication * @param password password needed for authentication */ public ASConnection(String host, int port, String user, String password) { if (host == null) { throw new IllegalArgumentException("Management host cannot be null."); } if (port <= 0 || port > 65535) { throw new IllegalArgumentException("Invalid port: " + port); } this.host = host; this.port = port; try { url = new URL("http", host, port, MANAGEMENT); urlString = url.toString(); } catch (MalformedURLException e) { throw new IllegalArgumentException(e.getMessage()); } passwordAuthenticator = new AS7Authenticator(user, password); Authenticator.setDefault(passwordAuthenticator); // read system property "as7plugin.verbose" verbose = Boolean.getBoolean("as7plugin.verbose"); mapper = new ObjectMapper(); mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); } // When no management users have been configured, a 307 (Temporary Redirect) response will be returned, and // when authorization has failed due to an invalid username or password, a 401 (Unauthorized) response will be // returned. private boolean isAuthorizationFailureResponse(int responseCode) { return responseCode == HttpURLConnection.HTTP_UNAUTHORIZED || responseCode == HTTP_TEMPORARY_REDIRECT; } private String getResponseMessage(HttpURLConnection conn) throws IOException { String responseMessage = conn.getResponseMessage(); if ((responseMessage == null) && (conn.getResponseCode() == HTTP_TEMPORARY_REDIRECT)) { responseMessage = "Temporary Redirect"; } return responseMessage; } /** Method parses Operation.getAddress().getPath() for invalid spaces in the path passed in. * * @param path Operation.getAddress().getPath() value. * @return boolean indicating invalid spaces found. */ private boolean containsSpaces(String path) { boolean includesSpaces = false; StringTokenizer components = new StringTokenizer(path, " "); if (components.countTokens() > 1) { includesSpaces = true; } return includesSpaces; } /** * Execute the passed Operation and return its Result. Depending on <i>isComplex</i> * the return type is a simple Result or a ComplexResult * * @param op Operation to execute * @param isComplex should a complex result be returned? * @param timeoutSec * @return ComplexResult of the execution */ public String getHost() { return host; } public int getPort() { return port; } }