SocketHandler.java revision b748a9b827665a8b19d60af4b419503b45e74329
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util.logging; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.BufferedOutputStream; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 229a0fbe99031759393563ee69ac4640f66f182686Jesse Wilsonimport java.net.Socket; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.logging.internal.nls.Messages; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A handler that writes log messages to a socket connection. 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This handler reads the following properties from the log manager to 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * initialize itself: 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>java.util.logging.ConsoleHandler.level specifies the logging level, 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * defaults to {@code Level.ALL} if this property is not found or has an invalid 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * value. 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>java.util.logging.SocketHandler.filter specifies the name of the filter 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * class to be associated with this handler, defaults to {@code null} if this 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * property is not found or has an invalid value. 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>java.util.logging.SocketHandler.formatter specifies the name of the 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * formatter class to be associated with this handler, defaults to 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code java.util.logging.XMLFormatter} if this property is not found or has 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * an invalid value. 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>java.util.logging.SocketHandler.encoding specifies the encoding this 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * handler will use to encode log messages, defaults to {@code null} if this 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * property is not found or has an invalid value. 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>java.util.logging.SocketHandler.host specifies the name of the host that 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this handler should connect to. There's no default value for this property. 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>java.util.logging.SocketHandler.encoding specifies the port number that 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this handler should connect to. There's no default value for this property. 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This handler buffers the outgoing messages, but flushes each time a log 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * record has been published. 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class is not thread-safe. 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class SocketHandler extends StreamHandler { 579a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // default level 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final String DEFAULT_LEVEL = "ALL"; //$NON-NLS-1$ 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // default formatter 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final String DEFAULT_FORMATTER = "java.util.logging.XMLFormatter"; //$NON-NLS-1$ 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // the socket connection 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Socket socket; 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a {@code SocketHandler} object using the properties read by 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the log manager, including the host name and port number. Default 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * formatting uses the XMLFormatter class and level is set to ALL. 719a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson * 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if failed to connect to the specified host and port. 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the host name or port number is illegal. 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a security manager determines that the caller does not 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * have the required permission to control this handler. 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public SocketHandler() throws IOException { 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(DEFAULT_LEVEL, null, DEFAULT_FORMATTER, null); 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project initSocket(LogManager.getLogManager().getProperty( 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "java.util.logging.SocketHandler.host"), LogManager //$NON-NLS-1$ 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getLogManager().getProperty( 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "java.util.logging.SocketHandler.port")); //$NON-NLS-1$ 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a {@code SocketHandler} object using the specified host name 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and port number together with other properties read by the log manager. 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Default formatting uses the XMLFormatter class and level is set to ALL. 929a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson * 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param host 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the host name 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param port 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port number 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if failed to connect to the specified host and port. 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the host name or port number is illegal. 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a security manager determines that the caller does not 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * have the required permission to control this handler. 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public SocketHandler(String host, int port) throws IOException { 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(DEFAULT_LEVEL, null, DEFAULT_FORMATTER, null); 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project initSocket(host, String.valueOf(port)); 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Initialize the socket connection and prepare the output stream 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void initSocket(String host, String port) throws IOException { 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // check the validity of the host name 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (null == host || "".equals(host)) { //$NON-NLS-1$ 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // logging.C=Illegal host argument. 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Messages.getString("logging.C")); //$NON-NLS-1$ 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // check the validity of the port number 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int p = 0; 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project p = Integer.parseInt(port); 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (NumberFormatException e) { 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // logging.D=Illegal port argument. 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Messages.getString("logging.D")); //$NON-NLS-1$ 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (p <= 0) { 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // logging.D=Illegal port argument. 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Messages.getString("logging.D")); //$NON-NLS-1$ 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // establish the network connection 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.socket = new Socket(host, p); 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // logging.E=Failed to establish the network connection. 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project getErrorManager().error(Messages.getString("logging.E"), e, //$NON-NLS-1$ 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ErrorManager.OPEN_FAILURE); 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw e; 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 138b748a9b827665a8b19d60af4b419503b45e74329Elliott Hughes super.internalSetOutputStream(new BufferedOutputStream(this.socket.getOutputStream())); 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Closes this handler. The network connection to the host is also closed. 1439a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson * 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a security manager determines that the caller does not 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * have the required permission to control this handler. 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void close() { 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.close(); 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (null != this.socket) { 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.socket.close(); 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.socket = null; 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // logging.F=Exception occurred when closing the socket handler. 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project getErrorManager().error(Messages.getString("logging.F"), e, //$NON-NLS-1$ 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ErrorManager.CLOSE_FAILURE); 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Logs a record if necessary. A flush operation will be done afterwards. 1659a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson * 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param record 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the log record to be logged. 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void publish(LogRecord record) { 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.publish(record); 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.flush(); 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 175