1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/* 2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Conditions Of Use 3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This software was developed by employees of the National Institute of 5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Standards and Technology (NIST), an agency of the Federal Government. 6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Pursuant to title 15 Untied States Code Section 105, works of NIST 7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * employees are not subject to copyright protection in the United States 8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * and are considered to be in the public domain. As a result, a formal 9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * license is not needed to use the software. 10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This software is provided by NIST as a service and is expressly 12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED 13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF 14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT 15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * AND DATA ACCURACY. NIST does not warrant or make any representations 16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * regarding the use of the software or the results thereof, including but 17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * not limited to the correctness, accuracy, reliability or usefulness of 18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * the software. 19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Permission to use this software is contingent upon your acceptance 21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * of the terms of this agreement 22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * . 24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/******************************************************************************* 27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Product of NIST/ITL Advanced Networking Technologies Division (ANTD). * 28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ******************************************************************************/ 29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpackage gov.nist.javax.sip.stack; 31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.ServerLogger; 33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.StackLogger; 34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.LogRecord; 35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.header.CallID; 36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.message.SIPMessage; 37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.io.File; 39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.io.FileWriter; 40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.io.IOException; 41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.io.PrintWriter; 42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Properties; 43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.SipStack; 45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.header.TimeStampHeader; 46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// BEGIN android-deleted 48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// import org.apache.log4j.Level; 49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// import org.apache.log4j.Logger; 50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// END android-deleted 51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/** 53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Log file wrapper class. Log messages into the message trace file and also write the log into 54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * the debug file if needed. This class keeps an XML formatted trace around for later access via 55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * RMI. The trace can be viewed with a trace viewer (see tools.traceviewerapp). 56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @version 1.2 $Revision: 1.39 $ $Date: 2009/11/11 14:00:58 $ 58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author M. Ranganathan <br/> 60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class ServerLog implements ServerLogger { 64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private boolean logContent; 66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected StackLogger stackLogger; 68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Name of the log file in which the trace is written out (default is null) 71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private String logFileName; 73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Print writer that is used to write out the log file. 76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private PrintWriter printWriter; 78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set auxililary information to log with this trace. 81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private String auxInfo; 83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private String description; 85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private String stackIpAddress; 87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private SIPTransactionStack sipStack; 89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private Properties configurationProperties; 91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public ServerLog() { 93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Debug log file. Whatever gets logged by us also makes its way into debug log. 94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private void setProperties(Properties configurationProperties) { 97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.configurationProperties = configurationProperties; 98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Set a descriptive name for the message trace logger. 99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.description = configurationProperties.getProperty("javax.sip.STACK_NAME"); 100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.stackIpAddress = configurationProperties.getProperty("javax.sip.IP_ADDRESS"); 101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.logFileName = configurationProperties.getProperty("gov.nist.javax.sip.SERVER_LOG"); 102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String logLevel = configurationProperties.getProperty("gov.nist.javax.sip.TRACE_LEVEL"); 103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String logContent = configurationProperties 104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .getProperty("gov.nist.javax.sip.LOG_MESSAGE_CONTENT"); 105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.logContent = (logContent != null && logContent.equals("true")); 107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (logLevel != null) { 109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (logLevel.equals("LOG4J")) { 110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // if TRACE_LEVEL property is specified as 111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // "LOG4J" then, set the traceLevel based on 112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // the log4j effective log level. 113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // check whether a Log4j logger name has been 115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // specified. if not, use the stack name as the default 116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // logger name. 117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // BEGIN android-deleted 119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Logger logger = Logger.getLogger(configurationProperties.getProperty( 121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang "gov.nist.javax.sip.LOG4J_LOGGER_NAME", this.description)); 122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Level level = logger.getEffectiveLevel(); 123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (level == Level.OFF) { 124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.setTraceLevel(0); 125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else if (level.isGreaterOrEqual(Level.DEBUG)) { 126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.setTraceLevel(TRACE_DEBUG); 127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else if (level.isGreaterOrEqual(Level.INFO)) { 128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.setTraceLevel(TRACE_MESSAGES); 129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else if (level.isGreaterOrEqual(Level.WARN)) { 130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.setTraceLevel(TRACE_EXCEPTION); 131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // END android-deleted 134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang try { 136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang int ll; 137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (logLevel.equals("DEBUG")) { 138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ll = TRACE_DEBUG; 139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else if (logLevel.equals("INFO")) { 140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ll = TRACE_MESSAGES; 141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else if (logLevel.equals("ERROR")) { 142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ll = TRACE_EXCEPTION; 143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else if (logLevel.equals("NONE") || logLevel.equals("OFF")) { 144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ll = TRACE_NONE; 145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ll = Integer.parseInt(logLevel); 147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.setTraceLevel(ll); 150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (NumberFormatException ex) { 151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang System.out.println("ServerLog: WARNING Bad integer " + logLevel); 152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang System.out.println("logging dislabled "); 153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.setTraceLevel(0); 154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang checkLogFile(); 158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setStackIpAddress(String ipAddress) { 162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.stackIpAddress = ipAddress; 163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // public static boolean isWebTesterCatchException=false; 166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // public static String webTesterLogFile=null; 167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * default trace level 170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected int traceLevel = TRACE_MESSAGES; 172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public synchronized void closeLogFile() { 174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (printWriter != null) { 175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang printWriter.close(); 176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang printWriter = null; 177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void checkLogFile() { 181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (logFileName == null || traceLevel < TRACE_MESSAGES) { 182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Dont create a log file if tracing is 183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // disabled. 184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return; 185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang try { 187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang File logFile = new File(logFileName); 188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (!logFile.exists()) { 189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang logFile.createNewFile(); 190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang printWriter = null; 191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Append buffer to the end of the file unless otherwise specified 193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // by the user. 194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (printWriter == null) { 195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang boolean overwrite = Boolean.valueOf( 196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang configurationProperties.getProperty( 197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang "gov.nist.javax.sip.SERVER_LOG_OVERWRITE")); 198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang FileWriter fw = new FileWriter(logFileName, !overwrite); 200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang printWriter = new PrintWriter(fw, true); 202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang printWriter.println("<!-- " 203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "Use the Trace Viewer in src/tools/tracesviewer to" 204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + " view this trace \n" 205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "Here are the stack configuration properties \n" 206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "javax.sip.IP_ADDRESS= " 207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + configurationProperties.getProperty("javax.sip.IP_ADDRESS") + "\n" 208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "javax.sip.STACK_NAME= " 209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + configurationProperties.getProperty("javax.sip.STACK_NAME") + "\n" 210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "javax.sip.ROUTER_PATH= " 211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + configurationProperties.getProperty("javax.sip.ROUTER_PATH") + "\n" 212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "javax.sip.OUTBOUND_PROXY= " 213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + configurationProperties.getProperty("javax.sip.OUTBOUND_PROXY") + "\n" 214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "-->"); 215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang printWriter.println("<description\n logDescription=\"" + description 216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "\"\n name=\"" 217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + configurationProperties.getProperty("javax.sip.STACK_NAME") 218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "\"\n auxInfo=\"" + auxInfo + "\"/>\n "); 219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (auxInfo != null) { 220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (sipStack.isLoggingEnabled()) { 222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang stackLogger 223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .logDebug("Here are the stack configuration properties \n" 224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "javax.sip.IP_ADDRESS= " 225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + configurationProperties 226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .getProperty("javax.sip.IP_ADDRESS") 227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "\n" 228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "javax.sip.ROUTER_PATH= " 229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + configurationProperties 230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .getProperty("javax.sip.ROUTER_PATH") 231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "\n" 232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "javax.sip.OUTBOUND_PROXY= " 233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + configurationProperties 234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .getProperty("javax.sip.OUTBOUND_PROXY") 235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "\n" 236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "gov.nist.javax.sip.CACHE_CLIENT_CONNECTIONS= " 237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + configurationProperties 238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .getProperty("gov.nist.javax.sip.CACHE_CLIENT_CONNECTIONS") 239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "\n" 240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "gov.nist.javax.sip.CACHE_SERVER_CONNECTIONS= " 241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + configurationProperties 242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .getProperty("gov.nist.javax.sip.CACHE_SERVER_CONNECTIONS") 243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "\n" 244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "gov.nist.javax.sip.REENTRANT_LISTENER= " 245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + configurationProperties 246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .getProperty("gov.nist.javax.sip.REENTRANT_LISTENER") 247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "gov.nist.javax.sip.THREAD_POOL_SIZE= " 248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + configurationProperties 249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .getProperty("gov.nist.javax.sip.THREAD_POOL_SIZE") 250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "\n"); 251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang stackLogger.logDebug(" ]]> "); 252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang stackLogger.logDebug("</debug>"); 253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang stackLogger.logDebug("<description\n logDescription=\"" + description 254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "\"\n name=\"" + stackIpAddress + "\"\n auxInfo=\"" + auxInfo 255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "\"/>\n "); 256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang stackLogger.logDebug("<debug>"); 257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang stackLogger.logDebug("<![CDATA[ "); 258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 259600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 260600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 261600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (sipStack.isLoggingEnabled()) { 262600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang stackLogger.logDebug("Here are the stack configuration properties \n" 263600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + configurationProperties + "\n"); 264600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang stackLogger.logDebug(" ]]>"); 265600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang stackLogger.logDebug("</debug>"); 266600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang stackLogger.logDebug("<description\n logDescription=\"" + description 267600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "\"\n name=\"" + stackIpAddress + "\" />\n"); 268600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang stackLogger.logDebug("<debug>"); 269600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang stackLogger.logDebug("<![CDATA[ "); 270600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 271600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 272600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 273600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (IOException ex) { 274600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 275600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 276600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 277600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 278600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 279600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Global check for whether to log or not. To minimize the time return false here. 280600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 281600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return true -- if logging is globally enabled and false otherwise. 282600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 283600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 284600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean needsLogging() { 285600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return logFileName != null; 286600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 287600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 288600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 289600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set the log file name 290600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 291600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param name is the name of the log file to set. 292600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 293600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setLogFileName(String name) { 294600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang logFileName = name; 295600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 296600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 297600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 298600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * return the name of the log file. 299600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 300600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getLogFileName() { 301600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return logFileName; 302600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 303600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 304600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 305600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Log a message into the log file. 306600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 307600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param message message to log into the log file. 308600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 309600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private void logMessage(String message) { 310600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // String tname = Thread.currentThread().getName(); 311600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang checkLogFile(); 312600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String logInfo = message; 313600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (printWriter != null) { 314600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang printWriter.println(logInfo); 315600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 316600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (sipStack.isLoggingEnabled()) { 317600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang stackLogger.logInfo(logInfo); 318600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 319600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 320600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 321600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 322600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private void logMessage(String message, String from, String to, boolean sender, 323600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String callId, String firstLine, String status, String tid, long time, 324600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang long timestampVal) { 325600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 326600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang LogRecord log = this.sipStack.logRecordFactory.createLogRecord(message, from, to, time, 327600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sender, firstLine, tid, callId, timestampVal); 328600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (log != null) 329600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang logMessage(log.toString()); 330600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 331600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 332600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 333600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Log a message into the log directory. 334600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 335600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param message a SIPMessage to log 336600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param from from header of the message to log into the log directory 337600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param to to header of the message to log into the log directory 338600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param sender is the server the sender 339600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param time is the time to associate with the message. 340600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 341600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void logMessage(SIPMessage message, String from, String to, boolean sender, long time) { 342600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang checkLogFile(); 343600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (message.getFirstLine() == null) 344600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return; 345600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang CallID cid = (CallID) message.getCallId(); 346600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String callId = null; 347600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (cid != null) 348600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang callId = cid.getCallId(); 349600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String firstLine = message.getFirstLine().trim(); 350600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String inputText = (logContent ? message.encode() : message.encodeMessage()); 351600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String tid = message.getTransactionId(); 352600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang TimeStampHeader tsHdr = (TimeStampHeader) message.getHeader(TimeStampHeader.NAME); 353600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang long tsval = tsHdr == null ? 0 : tsHdr.getTime(); 354600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang logMessage(inputText, from, to, sender, callId, firstLine, null, tid, time, tsval); 355600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 356600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 357600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 358600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Log a message into the log directory. 359600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 360600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param message a SIPMessage to log 361600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param from from header of the message to log into the log directory 362600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param to to header of the message to log into the log directory 363600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param status the status to log. 364600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param sender is the server the sender or receiver (true if sender). 365600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param time is the reception time. 366600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 367600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void logMessage(SIPMessage message, String from, String to, String status, 368600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang boolean sender, long time) { 369600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang checkLogFile(); 370600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang CallID cid = (CallID) message.getCallId(); 371600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String callId = null; 372600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (cid != null) 373600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang callId = cid.getCallId(); 374600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String firstLine = message.getFirstLine().trim(); 375600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String encoded = (logContent ? message.encode() : message.encodeMessage()); 376600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String tid = message.getTransactionId(); 377600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang TimeStampHeader tshdr = (TimeStampHeader) message.getHeader(TimeStampHeader.NAME); 378600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang long tsval = tshdr == null ? 0 : tshdr.getTime(); 379600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang logMessage(encoded, from, to, sender, callId, firstLine, status, tid, time, tsval); 380600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 381600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 382600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 383600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Log a message into the log directory. Time stamp associated with the message is the current 384600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * time. 385600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 386600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param message a SIPMessage to log 387600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param from from header of the message to log into the log directory 388600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param to to header of the message to log into the log directory 389600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param status the status to log. 390600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param sender is the server the sender or receiver (true if sender). 391600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 392600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void logMessage(SIPMessage message, String from, String to, String status, 393600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang boolean sender) { 394600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang logMessage(message, from, to, status, sender, System.currentTimeMillis()); 395600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 396600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 397600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 398600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Log an exception stack trace. 399600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 400600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param ex Exception to log into the log file 401600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 402600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 403600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void logException(Exception ex) { 404600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (traceLevel >= TRACE_EXCEPTION) { 405600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang checkLogFile(); 406600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ex.printStackTrace(); 407600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (printWriter != null) 408600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ex.printStackTrace(printWriter); 409600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 410600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 411600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 412600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 413600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 414600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set the trace level for the stack. 415600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 416600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param level -- the trace level to set. The following trace levels are supported: 417600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * <ul> 418600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * <li> 0 -- no tracing </li> 419600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 420600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * <li> 16 -- trace messages only </li> 421600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 422600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * <li> 32 Full tracing including debug messages. </li> 423600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 424600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * </ul> 425600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 426600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setTraceLevel(int level) { 427600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang traceLevel = level; 428600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 429600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 430600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 431600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the trace level for the stack. 432600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 433600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the trace level 434600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 435600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public int getTraceLevel() { 436600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return traceLevel; 437600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 438600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 439600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 440600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set aux information. Auxiliary information may be associated with the log file. This is 441600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * useful for remote logs. 442600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 443600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param auxInfo -- auxiliary information. 444600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 445600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setAuxInfo(String auxInfo) { 446600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.auxInfo = auxInfo; 447600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 448600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 449600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setSipStack(SipStack sipStack) { 450600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if(sipStack instanceof SIPTransactionStack) { 451600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sipStack = (SIPTransactionStack)sipStack; 452600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.stackLogger = this.sipStack.getStackLogger(); 453600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 454600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang else 455600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throw new IllegalArgumentException("sipStack must be a SIPTransactionStack"); 456600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 457600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 458600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setStackProperties(Properties stackProperties) { 459600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang setProperties(stackProperties); 460600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 461600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 462600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setLevel(int jsipLoggingLevel) { 463600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 464600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 465600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 466600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang} 467