package com.sun.deploy.util;
import java.awt.Component;
import java.io.PrintStream;
import java.io.File;
import java.io.FileFilter;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Arrays;
import com.sun.deploy.resources.ResourceManager;
import com.sun.deploy.config.Config;
import java.util.StringTokenizer;
import com.sun.deploy.ui.UIFactory;
public class Trace {
private static boolean _bAutomationOn = false;
private static final ArrayList queue = new ArrayList();
private static final ArrayList listenersList = new ArrayList();
private static HashSet traceLevelList = new HashSet();
private static PrintStream psOut = new PrintStream(new TracePrintStream());
private static PrintStream psErr = new PrintStream(new TracePrintStream());
private Trace() {}
static {
traceLevelList.add(TraceLevel.DEFAULT);
Thread traceMsgQueueThread = new Thread(new TraceMsgQueueChecker(), "traceMsgQueueThread");
traceMsgQueueThread.setDaemon(true);
traceMsgQueueThread.start();
}
public static void redirectStdioStderr()
{
System.setOut(psOut);
System.setErr(psErr);
}
private static class TraceMsgQueueChecker implements Runnable {
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException ie) {}
while (true) {
TraceMessage tm = null;
synchronized(queue) {
if (queue.isEmpty()) {
try {
queue.wait();
} catch (InterruptedException ie) {
ie.printStackTrace();
}
} else {
tm = (TraceMessage)queue.remove(0);
}
}
if (tm != null) {
firePrintlnEvent(tm);
}
}
}
}
public static void flush() {
while (true) {
synchronized(queue) {
if (queue.isEmpty()) {
return;
}
}
try {
Thread.sleep(200);
} catch (InterruptedException e) { }
}
}
public static boolean isEnabled()
{
return (traceLevelList.size() > 1);
}
public static void setInitialTraceLevel() {
String initTraceLevel = Config.getProperty(Config.TRACE_LEVEL_KEY);
setInitialTraceLevel(initTraceLevel);
}
public static void setInitialTraceLevel(String initTraceLevel) {
if (initTraceLevel != null && initTraceLevel.equals("") == false) {
StringTokenizer st = new StringTokenizer(initTraceLevel, "|");
while (st.hasMoreTokens()) {
String option = (String) st.nextToken();
if (option.equalsIgnoreCase("all")) {
setBasicTrace(true);
setCacheTrace(true);
setNetTrace(true);
setTempTrace(true);
setSecurityTrace(true);
setExtTrace(true);
setLiveConnectTrace(true);
break;
} else if (option.equalsIgnoreCase("basic")) {
setBasicTrace(true);
} else if (option.equalsIgnoreCase("cache")) {
setCacheTrace(true);
} else if (option.equalsIgnoreCase("net")) {
setNetTrace(true);
} else if (option.equalsIgnoreCase("temp")) {
setTempTrace(true);
} else if (option.equalsIgnoreCase("security")) {
setSecurityTrace(true);
} else if (option.equalsIgnoreCase("ext")) {
setExtTrace(true);
} else if (option.equalsIgnoreCase("liveconnect")) {
setLiveConnectTrace(true);
}
}
}
}
public static void setBasicTrace(boolean trace)
{
if (trace) {
traceLevelList.add(TraceLevel.BASIC);
} else {
traceLevelList.remove(TraceLevel.BASIC);
}
}
public static void setNetTrace(boolean trace)
{
if (trace) {
traceLevelList.add(TraceLevel.NETWORK);
} else {
traceLevelList.remove(TraceLevel.NETWORK);
}
}
public static void setCacheTrace(boolean trace)
{
if (trace) {
traceLevelList.add(TraceLevel.CACHE);
} else {
traceLevelList.remove(TraceLevel.CACHE);
}
}
public static void setTempTrace(boolean trace)
{
if (trace) {
traceLevelList.add(TraceLevel.TEMP);
} else {
traceLevelList.remove(TraceLevel.TEMP);
}
}
public static void setSecurityTrace(boolean trace)
{
if (trace) {
traceLevelList.add(TraceLevel.SECURITY);
} else {
traceLevelList.remove(TraceLevel.SECURITY);
}
}
public static void setExtTrace(boolean trace)
{
if (trace) {
traceLevelList.add(TraceLevel.EXTENSIONS);
} else {
traceLevelList.remove(TraceLevel.EXTENSIONS);
}
}
public static void setLiveConnectTrace(boolean trace)
{
if (trace) {
traceLevelList.add(TraceLevel.LIVECONNECT);
} else {
traceLevelList.remove(TraceLevel.LIVECONNECT);
}
}
public static boolean isAutomationEnabled()
{
return _bAutomationOn;
}
public static void enableAutomation(boolean bAutomation)
{
_bAutomationOn = bAutomation;
}
private static void enQueue(TraceMessage tm) {
synchronized(queue) {
queue.add(tm);
queue.notifyAll();
}
}
public static boolean isTraceLevelEnabled(TraceLevel level) {
return traceLevelList.contains(level);
}
public static void print(String message, TraceLevel traceLevel) {
if (traceLevelList.contains(traceLevel)) {
TraceMessage tm = new TraceMessage(traceLevel, message);
enQueue(tm);
}
}
public static void println(String message, TraceLevel traceLevel) {
if (traceLevelList.contains(traceLevel)) {
TraceMessage tm = new TraceMessage(traceLevel, message, true);
enQueue(tm);
}
}
public static void println(String message) {
println(message, TraceLevel.DEFAULT);
}
public static void print(String message) {
print(message, TraceLevel.DEFAULT);
}
public static void msgPrintln(String resource, Object[] params, TraceLevel traceLevel)
{
if (traceLevelList.contains(traceLevel))
{
String message = ResourceManager.getMessage(resource);
String output = MessageFormat.format(message, params);
TraceMessage tm = new TraceMessage(traceLevel, output, true);
enQueue(tm);
}
}
public static void msgPrintln(String resource, Object[] params) {
msgPrintln(resource, params, TraceLevel.DEFAULT);
}
public static void msgPrintln(String resource) {
msgPrintln(resource, null, TraceLevel.BASIC);
}
public static void addTraceListener(TraceListener tl) {
synchronized(listenersList) {
if (!listenersList.contains(tl)) {
listenersList.add(tl);
}
}
}
public static void removeTraceListener(TraceListener tl) {
synchronized(listenersList) {
int index = listenersList.indexOf(tl);
if (index != -1) {
listenersList.remove(index);
}
}
}
public static void resetTraceLevel() {
traceLevelList.clear();
traceLevelList.add(TraceLevel.DEFAULT);
}
static void firePrintlnEvent(TraceMessage tm) {
TraceListener tl = null;
synchronized(listenersList) {
for (int i = 0; i < listenersList.size(); i++) {
tl = (TraceListener)listenersList.get(i);
tl.print(tm.getMessage());
}
}
}
public static void ignoredException(Exception e) {
Trace.ignored(e);
}
public static void ignored(Throwable t) {
if (traceLevelList.size() > 1) {
t.printStackTrace();
}
}
public static void printException(Throwable e)
{
printException(null, e);
}
public static void printException(Component parentComponent, Throwable e)
{
printException(parentComponent, e,
null,
null);
}
public static void printException(Throwable e, String desc, String caption)
{
printException(null, e, desc, caption);
}
public static void printException(Component parentComponent, Throwable e, String desc, String caption)
{
printException(parentComponent, e, desc, caption, true);
}
public static void printException(Component parentComponent, Throwable e,
String desc, String caption, boolean show)
{
println("Ignored exception: "+e);
if (show && isAutomationEnabled() == false)
{
if (desc == null)
desc = ResourceManager.getMessage("dialogfactory.general_error");
UIFactory.showExceptionDialog(parentComponent, e, desc, caption);
}
}
public static void netPrintln(String msg)
{
println(msg, TraceLevel.NETWORK);
}
public static void msgNetPrintln(String resource)
{
msgPrintln(resource, null, TraceLevel.NETWORK);
}
public static void msgNetPrintln(String resource, Object[] params)
{
msgPrintln(resource, params, TraceLevel.NETWORK);
}
public static void netPrintException(Throwable e)
{
printException(null, e, ResourceManager.getMessage("dialogfactory.net_error"), null, false);
}
public static void netPrintException(Throwable e, String desc, String caption)
{
printException(null, e, desc, caption, false);
}
public static void securityPrintln(String msg)
{
println(msg, TraceLevel.SECURITY);
}
public static void msgSecurityPrintln(String resource)
{
msgPrintln(resource, null, TraceLevel.SECURITY);
}
public static void msgSecurityPrintln(String resource, Object[] params)
{
msgPrintln(resource, params, TraceLevel.SECURITY);
}
public static void securityPrintException(Throwable e)
{
printException(null, e, ResourceManager.getMessage("dialogfactory.security_error"), null, true);
}
public static void securityPrintException(Throwable e, String desc, String caption)
{
printException(null, e, desc, caption, true);
}
public static void extPrintln(String msg)
{
println(msg, TraceLevel.EXTENSIONS);
}
public static void msgExtPrintln(String resource)
{
msgPrintln(resource, null, TraceLevel.EXTENSIONS);
}
public static void msgExtPrintln(String resource, Object[] params)
{
msgPrintln(resource, params, TraceLevel.EXTENSIONS);
}
public static void extPrintException(Throwable e)
{
printException(null, e, ResourceManager.getMessage("dialogfactory.ext_error"), null, true);
}
public static void extPrintException(Throwable e, String desc, String caption)
{
printException(null, e, desc, caption, true);
}
public static void liveConnectPrintln(String msg)
{
println(msg, TraceLevel.LIVECONNECT);
}
public static void msgLiveConnectPrintln(String resource)
{
msgPrintln(resource, null, TraceLevel.LIVECONNECT);
}
public static void msgLiveConnectPrintln(String resource, Object[] params)
{
msgPrintln(resource, params, TraceLevel.LIVECONNECT);
}
public static void liveConnectPrintException(Throwable e)
{
printException(null, e, null, null, false);
}
public static File createTempFile(final String prefix, final String suffix,
File directory)
{
try {
final File[] files = directory.listFiles(new FileFilter() {
public boolean accept(File pathname) {
String filename = pathname.getName();
return filename.startsWith(prefix) &&
filename.endsWith(suffix);
}
});
int iMaxNumOfFiles = Config.getIntProperty(Config.MAX_NUM_FILES_KEY);
if ((iMaxNumOfFiles > 0) && (files.length >= iMaxNumOfFiles)) {
final int numOfFiles = files.length;
long[] modifiedTimeArray = new long[numOfFiles];
for (int i=0; i < numOfFiles; i++) {
modifiedTimeArray[i]=files[i].lastModified();
}
Arrays.sort(modifiedTimeArray);
for (int i=0; i < modifiedTimeArray.length-iMaxNumOfFiles+1; i++) {
files[i].delete();
}
}
return File.createTempFile(prefix, suffix, directory);
} catch (Exception ioe) {
Trace.ignored(ioe);
}
return null;
}
}