SocketHandler.java revision adc854b798c1cfe3bfd4c27d68d5cee38ca617da
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 Project 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util.logging; 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.Socket; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.BufferedOutputStream; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.logging.internal.nls.Messages; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A handler that writes log messages to a socket connection. 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This handler reads the following properties from the log manager to 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * initialize itself: 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>java.util.logging.ConsoleHandler.level specifies the logging level, 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * defaults to {@code Level.ALL} if this property is not found or has an invalid 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * value. 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>java.util.logging.SocketHandler.filter specifies the name of the filter 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * class to be associated with this handler, defaults to {@code null} if this 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * property is not found or has an invalid value. 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>java.util.logging.SocketHandler.formatter specifies the name of the 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * formatter class to be associated with this handler, defaults to 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code java.util.logging.XMLFormatter} if this property is not found or has 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * an invalid value. 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>java.util.logging.SocketHandler.encoding specifies the encoding this 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * handler will use to encode log messages, defaults to {@code null} if this 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * property is not found or has an invalid value. 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>java.util.logging.SocketHandler.host specifies the name of the host that 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this handler should connect to. There's no default value for this property. 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>java.util.logging.SocketHandler.encoding specifies the port number that 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this handler should connect to. There's no default value for this property. 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This handler buffers the outgoing messages, but flushes each time a log 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * record has been published. 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class is not thread-safe. 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class SocketHandler extends StreamHandler { 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // default level 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final String DEFAULT_LEVEL = "ALL"; //$NON-NLS-1$ 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // default formatter 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final String DEFAULT_FORMATTER = "java.util.logging.XMLFormatter"; //$NON-NLS-1$ 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // the socket connection 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Socket socket; 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a {@code SocketHandler} object using the properties read by 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the log manager, including the host name and port number. Default 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * formatting uses the XMLFormatter class and level is set to ALL. 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if failed to connect to the specified host and port. 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the host name or port number is illegal. 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a security manager determines that the caller does not 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * have the required permission to control this handler. 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public SocketHandler() throws IOException { 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(DEFAULT_LEVEL, null, DEFAULT_FORMATTER, null); 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project initSocket(LogManager.getLogManager().getProperty( 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "java.util.logging.SocketHandler.host"), LogManager //$NON-NLS-1$ 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getLogManager().getProperty( 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "java.util.logging.SocketHandler.port")); //$NON-NLS-1$ 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a {@code SocketHandler} object using the specified host name 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and port number together with other properties read by the log manager. 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Default formatting uses the XMLFormatter class and level is set to ALL. 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param host 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the host name 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param port 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port number 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if failed to connect to the specified host and port. 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the host name or port number is illegal. 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a security manager determines that the caller does not 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * have the required permission to control this handler. 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public SocketHandler(String host, int port) throws IOException { 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(DEFAULT_LEVEL, null, DEFAULT_FORMATTER, null); 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project initSocket(host, String.valueOf(port)); 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Initialize the socket connection and prepare the output stream 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void initSocket(String host, String port) throws IOException { 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // check the validity of the host name 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (null == host || "".equals(host)) { //$NON-NLS-1$ 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // logging.C=Illegal host argument. 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Messages.getString("logging.C")); //$NON-NLS-1$ 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // check the validity of the port number 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int p = 0; 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project p = Integer.parseInt(port); 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (NumberFormatException e) { 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // logging.D=Illegal port argument. 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Messages.getString("logging.D")); //$NON-NLS-1$ 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (p <= 0) { 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // logging.D=Illegal port argument. 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Messages.getString("logging.D")); //$NON-NLS-1$ 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // establish the network connection 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.socket = new Socket(host, p); 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // logging.E=Failed to establish the network connection. 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project getErrorManager().error(Messages.getString("logging.E"), e, //$NON-NLS-1$ 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ErrorManager.OPEN_FAILURE); 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw e; 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-modified 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.internalSetOutputStream(new BufferedOutputStream(this.socket 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getOutputStream(), 8192)); 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-modified 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Closes this handler. The network connection to the host is also closed. 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a security manager determines that the caller does not 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * have the required permission to control this handler. 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void close() { 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.close(); 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (null != this.socket) { 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.socket.close(); 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.socket = null; 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // logging.F=Exception occurred when closing the socket handler. 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project getErrorManager().error(Messages.getString("logging.F"), e, //$NON-NLS-1$ 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ErrorManager.CLOSE_FAILURE); 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Logs a record if necessary. A flush operation will be done afterwards. 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param record 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the log record to be logged. 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void publish(LogRecord record) { 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.publish(record); 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.flush(); 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 182