Java tutorial
/* * Copyright 2001-2004 The Apache Software Foundation. * * 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.apache.axis.client; import org.apache.axis.AxisFault; import org.apache.axis.EngineConfiguration; import org.apache.axis.components.logger.LogFactory; import org.apache.axis.deployment.wsdd.WSDDConstants; import org.apache.axis.message.SOAPBodyElement; import org.apache.axis.utils.Messages; import org.apache.axis.utils.Options; import org.apache.axis.utils.StringUtils; import org.apache.commons.logging.Log; import javax.xml.rpc.ServiceException; import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.InputStream; import java.net.URL; import java.util.Vector; /** * An admin client object that can be used both from the command line * and programmatically. * * @author Rob Jellinghaus (robj@unrealities.com) * @author Doug Davis (dug@us.ibm.com) * @author Simeon Simeonov (simeons@macromedia.com) */ public class AdminClient { protected static Log log = LogFactory.getLog(AdminClient.class.getName()); private static ThreadLocal defaultConfiguration = new ThreadLocal(); /** * If the user calls this with an EngineConfiguration object, all * AdminClients on this thread will use that EngineConfiguration * rather than the default one. This is primarily to enable the * deployment of custom transports and handlers. * * @param config the EngineConfiguration which should be used */ public static void setDefaultConfiguration(EngineConfiguration config) { defaultConfiguration.set(config); } private static String getUsageInfo() { String lSep = System.getProperty("line.separator"); StringBuffer msg = new StringBuffer(); // 26 is the # of lines in resources.properties msg.append(Messages.getMessage("acUsage00")).append(lSep); msg.append(Messages.getMessage("acUsage01")).append(lSep); msg.append(Messages.getMessage("acUsage02")).append(lSep); msg.append(Messages.getMessage("acUsage03")).append(lSep); msg.append(Messages.getMessage("acUsage04")).append(lSep); msg.append(Messages.getMessage("acUsage05")).append(lSep); msg.append(Messages.getMessage("acUsage06")).append(lSep); msg.append(Messages.getMessage("acUsage07")).append(lSep); msg.append(Messages.getMessage("acUsage08")).append(lSep); msg.append(Messages.getMessage("acUsage09")).append(lSep); msg.append(Messages.getMessage("acUsage10")).append(lSep); msg.append(Messages.getMessage("acUsage11")).append(lSep); msg.append(Messages.getMessage("acUsage12")).append(lSep); msg.append(Messages.getMessage("acUsage13")).append(lSep); msg.append(Messages.getMessage("acUsage14")).append(lSep); msg.append(Messages.getMessage("acUsage15")).append(lSep); msg.append(Messages.getMessage("acUsage16")).append(lSep); msg.append(Messages.getMessage("acUsage17")).append(lSep); msg.append(Messages.getMessage("acUsage18")).append(lSep); msg.append(Messages.getMessage("acUsage19")).append(lSep); msg.append(Messages.getMessage("acUsage20")).append(lSep); msg.append(Messages.getMessage("acUsage21")).append(lSep); msg.append(Messages.getMessage("acUsage22")).append(lSep); msg.append(Messages.getMessage("acUsage23")).append(lSep); msg.append(Messages.getMessage("acUsage24")).append(lSep); msg.append(Messages.getMessage("acUsage25")).append(lSep); msg.append(Messages.getMessage("acUsage26")).append(lSep); return msg.toString(); } /** * the object that represents our call */ protected Call call; /** * Construct an admin client w/o a logger. * If the client cannot create a call object, then it does not throw an exception. * Instead it prints a message to {@link System.err}. * This is for 'historical reasons' */ public AdminClient() { try { initAdminClient(); } catch (ServiceException e) { System.err.println(Messages.getMessage("couldntCall00") + ": " + e); call = null; } } /** * this is a somwhat contrived variant constructor, one that throws an exception * if things go wrong. * @param ignored */ public AdminClient(boolean ignored) throws ServiceException { initAdminClient(); } /** * core initialisation routine * * @throws ServiceException */ private void initAdminClient() throws ServiceException { // Initialize our Service - allow the user to override the // default configuration with a thread-local version (see // setDefaultConfiguration() above) EngineConfiguration config = (EngineConfiguration) defaultConfiguration.get(); Service service; if (config != null) { service = new Service(config); } else { service = new Service(); } call = (Call) service.createCall(); } /** * External access to our <code>Call</code< object. * This will be null if the non-excepting constructor was used * and the construction failed. * @return the <code>Call</code> object this instance uses */ public Call getCall() { return call; } /** * process the options then run a list call * @param opts * @return * @throws Exception */ public String list(Options opts) throws Exception { processOpts(opts); return list(); } /** * send a list command * @return the response from the call * @throws Exception */ public String list() throws Exception { log.debug(Messages.getMessage("doList00")); String str = "<m:list xmlns:m=\"" + WSDDConstants.URI_WSDD + "\"/>"; ByteArrayInputStream input = new ByteArrayInputStream(str.getBytes()); return process(input); } /** * process the command line ops, then send a quit command * @param opts * @return * @throws Exception */ public String quit(Options opts) throws Exception { processOpts(opts); return quit(); } /** * root element of the undeploy request */ protected static final String ROOT_UNDEPLOY = WSDDConstants.QNAME_UNDEPLOY.getLocalPart(); /** * make a quit command * @return * @throws Exception */ public String quit() throws Exception { log.debug(Messages.getMessage("doQuit00")); String str = "<m:quit xmlns:m=\"" + WSDDConstants.URI_WSDD + "\"/>"; ByteArrayInputStream input = new ByteArrayInputStream(str.getBytes()); return process(input); } /** * undeploy a handler * @param handlerName name of the handler to undeploy * @return * @throws Exception */ public String undeployHandler(String handlerName) throws Exception { log.debug(Messages.getMessage("doQuit00")); String str = "<m:" + ROOT_UNDEPLOY + " xmlns:m=\"" + WSDDConstants.URI_WSDD + "\">" + "<handler name=\"" + handlerName + "\"/>" + "</m:" + ROOT_UNDEPLOY + ">"; ByteArrayInputStream input = new ByteArrayInputStream(str.getBytes()); return process(input); } /** * undeploy a service * @param serviceName name of service * @return * @throws Exception */ public String undeployService(String serviceName) throws Exception { log.debug(Messages.getMessage("doQuit00")); String str = "<m:" + ROOT_UNDEPLOY + " xmlns:m=\"" + WSDDConstants.URI_WSDD + "\">" + "<service name=\"" + serviceName + "\"/>" + "</m:" + ROOT_UNDEPLOY + ">"; ByteArrayInputStream input = new ByteArrayInputStream(str.getBytes()); return process(input); } /** * <p>Processes a set of administration commands.</p> * <p>The following commands are available:</p> * <ul> * <li><code>-l<i>url</i></code> sets the AxisServlet URL</li> * <li><code>-h<i>hostName</i></code> sets the AxisServlet host</li> * <li><code>-p<i>portNumber</i></code> sets the AxisServlet port</li> * <li><code>-s<i>servletPath</i></code> sets the path to the * AxisServlet</li> * <li><code>-f<i>fileName</i></code> specifies that a simple file * protocol should be used</li> * <li><code>-u<i>username</i></code> sets the username</li> * <li><code>-w<i>password</i></code> sets the password</li> * <li><code>-d</code> sets the debug flag (for instance, -ddd would * set it to 3)</li> * <li><code>-t<i>name</i></code> sets the transport chain touse</li> * <li><code>list</code> will list the currently deployed services</li> * <li><code>quit</code> will quit (???)</li> * <li><code>passwd <i>value</i></code> changes the admin password</li> * <li><code><i>xmlConfigFile</i></code> deploys or undeploys * Axis components and web services</li> * </ul> * <p>If <code>-l</code> or <code>-h -p -s</code> are not set, the * AdminClient will invoke * <code>http://localhost:8080/axis/servlet/AxisServlet</code>.</p> * * @param args Commands to process * @return XML result or null in case of failure. In the case of multiple * commands, the XML results will be concatenated, separated by \n * @exception Exception Could be an IO exception, an AxisFault or something else */ public String process(String[] args) throws Exception { StringBuffer sb = new StringBuffer(); Options opts = new Options(args); opts.setDefaultURL("http://localhost:8080/axis/services/AdminService"); if (opts.isFlagSet('d') > 0) { // Set logger properties... !!! } args = opts.getRemainingArgs(); if (args == null || opts.isFlagSet('?') > 0) { System.out.println( Messages.getMessage("usage00", "AdminClient [Options] [list | <deployment-descriptor-files>]")); System.out.println(""); System.out.println(getUsageInfo()); return null; } for (int i = 0; i < args.length; i++) { InputStream input = null; if (args[i].equals("list")) sb.append(list(opts)); else if (args[i].equals("quit")) sb.append(quit(opts)); else if (args[i].equals("passwd")) { System.out.println(Messages.getMessage("changePwd00")); if (args[i + 1] == null) { System.err.println(Messages.getMessage("needPwd00")); return null; } String str = "<m:passwd xmlns:m=\"http://xml.apache.org/axis/wsdd/\">"; str += args[i + 1]; str += "</m:passwd>"; input = new ByteArrayInputStream(str.getBytes()); i++; sb.append(process(opts, input)); } else { if (args[i].indexOf(java.io.File.pathSeparatorChar) == -1) { System.out.println(Messages.getMessage("processFile00", args[i])); sb.append(process(opts, args[i])); } else { java.util.StringTokenizer tokenizer = null; tokenizer = new java.util.StringTokenizer(args[i], java.io.File.pathSeparator); while (tokenizer.hasMoreTokens()) { String file = tokenizer.nextToken(); System.out.println(Messages.getMessage("processFile00", file)); sb.append(process(opts, file)); if (tokenizer.hasMoreTokens()) sb.append("\n"); } } } } return sb.toString(); } /** * go from the (parsed) command line to setting properties on our call object. * @param opts * @throws Exception if call==null */ public void processOpts(Options opts) throws Exception { if (call == null) { throw new Exception(Messages.getMessage("nullCall00")); } URL address = new URL(opts.getURL()); setTargetEndpointAddress(address); setLogin(opts.getUser(), opts.getPassword()); String tName = opts.isValueSet('t'); setTransport(tName); } /** * set the username and password * requires that call!=null * @param user username * @param password password */ public void setLogin(String user, String password) { call.setUsername(user); call.setPassword(password); } /** * set the URL to deploy to * requires that call!=null * @param address */ public void setTargetEndpointAddress(URL address) { call.setTargetEndpointAddress(address); } /** * set the transport to deploy with. * requires that call!=null * @param transportName a null or empty value does not trigger a setting */ public void setTransport(String transportName) { if (transportName != null && !transportName.equals("")) { call.setProperty(Call.TRANSPORT_NAME, transportName); } } public String process(InputStream input) throws Exception { return process(null, input); } public String process(URL xmlURL) throws Exception { return process(null, xmlURL.openStream()); } /** * process an XML file containing a pre-prepared admin message * @param xmlFile file to load * @return * @throws Exception */ public String process(String xmlFile) throws Exception { FileInputStream in = new FileInputStream(xmlFile); String result = process(null, in); return result; } public String process(Options opts, String xmlFile) throws Exception { processOpts(opts); return process(xmlFile); } /** * submit the input stream's contents to the endpoint, return the results as a string. * The input stream is always closed after the call, whether the request worked or not * @param opts options -can be null * @param input -input stream for request * @return * @throws Exception if the call was null * @throws AxisFault if the invocation returned an empty response */ public String process(Options opts, InputStream input) throws Exception { try { if (call == null) { //validate that the call is not null throw new Exception(Messages.getMessage("nullCall00")); } if (opts != null) { //process options if supplied processOpts(opts); } call.setUseSOAPAction(true); call.setSOAPActionURI("urn:AdminService"); Vector result = null; Object[] params = new Object[] { new SOAPBodyElement(input) }; result = (Vector) call.invoke(params); if (result == null || result.isEmpty()) { throw new AxisFault(Messages.getMessage("nullResponse00")); } SOAPBodyElement body = (SOAPBodyElement) result.elementAt(0); return body.toString(); } finally { input.close(); } } /** * Creates in instance of <code>AdminClient</code> and * invokes <code>process(args)</code>. * <p>Diagnostic output goes to <code>log.info</code>.</p> * @param args Commands to process */ public static void main(String[] args) { try { AdminClient admin = new AdminClient(); String result = admin.process(args); if (result != null) { System.out.println(StringUtils.unescapeNumericChar(result)); } else { System.exit(1); } } catch (AxisFault ae) { System.err.println(Messages.getMessage("exception00") + " " + ae.dumpToString()); System.exit(1); } catch (Exception e) { System.err.println(Messages.getMessage("exception00") + " " + e.getMessage()); System.exit(1); } } }