package org.limewire.core.impl.support;
import java.io.PrintWriter;
import java.io.StringWriter;
/**
* This class maintains protected constants and variables for
* <tt>LocalServletInfo</tt> and <tt>LocalClientInfo</tt>,
* the classes that contain the data for the client machine
* reporting the bug. This class simply ensures that they are
* using the same values. It also handles generating a bug
* report string, so that both classes will create bug reports
* that are exactly alike.
*/
//2345678|012345678|012345678|012345678|012345678|012345678|012345678|012345678|
abstract class LocalAbstractInfo {
/**
* Constant for the LimeWire version.
*/
protected static final String LIMEWIRE_VERSION = "1";
protected String _limewireVersion;
/**
* Constant for the Java version.
*/
protected static final String JAVA_VERSION = "2";
protected String _javaVersion;
/**
* Constant for the OS.
*/
protected static final String OS = "3";
protected String _os;
/**
* Constant for the OS version.
*/
protected static final String OS_VERSION = "4";
protected String _osVersion;
/**
* Constant for the architecture.
*/
protected static final String ARCHITECTURE = "5";
protected String _architecture;
/**
* Constant for the free memory.
*/
protected static final String FREE_MEMORY = "6";
protected String _freeMemory;
/**
* Constant for the total memory.
*/
protected static final String TOTAL_MEMORY = "7";
protected String _totalMemory;
/**
* Constant for the exception to report.
*/
protected static final String BUG = "8";
protected String _bug;
/**
* Constant for the current thread name.
*/
protected static final String CURRENT_THREAD = "9";
protected String _currentThread;
/**
* Constant for the Properties object.
*/
protected static final String PROPS = "10";
protected String _props;
/**
* Constant for the uptime.
*/
protected static final String UPTIME = "11";
protected String _upTime;
/**
* Constant for the connection status.
*/
protected static final String CONNECTED = "12";
protected String _connected;
/**
* Constant for the number of ultrapeer -> ultrapeer connections.
*/
protected static final String UP_TO_UP = "13";
protected String _upToUp;
/**
* Constant for the number of up -> leaf connections.
*/
protected static final String UP_TO_LEAF = "14";
protected String _upToLeaf;
/**
* Constant for the number of leaf -> up connections.
*/
protected static final String LEAF_TO_UP = "15";
protected String _leafToUp;
/**
* Constant for the number of old connections.
*/
protected static final String OLD_CONNECTIONS = "16";
protected String _oldConnections;
/**
* Constant for ultrapeer status.
*/
protected static final String ULTRAPEER = "17";
protected String _ultrapeer;
/**
* Constant for leaf status.
*/
protected static final String LEAF = "18";
protected String _leaf;
/**
* Constant for the number of active uploads.
*/
protected static final String ACTIVE_UPLOADS = "19";
protected String _activeUploads;
/**
* Constant for the number of queued uploads.
*/
protected static final String QUEUED_UPLOADS = "20";
protected String _queuedUploads;
/**
* Constant for the number of active downloads.
*/
protected static final String ACTIVE_DOWNLOADS = "21";
protected String _activeDownloads;
/**
* Constant for the number of http downloaders.
*/
protected static final String HTTP_DOWNLOADERS = "22";
protected String _httpDownloaders;
/**
* Constant for the number of waiting downloaders.
*/
protected static final String WAITING_DOWNLOADERS = "23";
protected String _waitingDownloaders;
/**
* Constant for whether or not incoming has been accepted.
*/
protected static final String ACCEPTED_INCOMING = "24";
protected String _acceptedIncoming;
/**
* Constant for the number of shared files.
*/
protected static final String SHARED_FILES = "25";
protected String _sharedFiles;
/**
* Constant for the other active threads.
*/
protected static final String OTHER_THREADS = "26";
protected String _otherThreads;
/**
* Constant for the detail message.
*/
protected static final String DETAIL = "27";
protected String _detail;
/**
* Constant for an underlying bug, if any.
*/
protected static final String OTHER_BUG = "28";
protected String _otherBug;
/**
* Constant for the java vendor.
*/
protected static final String JAVA_VENDOR = "29";
protected String _javaVendor;
/**
* Constant for the total amount of active threads.
*/
protected static final String THREAD_COUNT = "30";
protected String _threadCount;
/**
* Constant for the exception's name.
*/
protected static final String BUG_NAME = "31";
protected String _bugName;
/**
* Constant for guess capability.
*/
protected static final String GUESS_CAPABLE = "32";
protected String _guessCapable;
protected static final String SOLICITED_CAPABLE = "33";
protected String _solicitedCapable;
protected static final String LATEST_SIMPP = "34";
protected String _latestSIMPP;
// protected static final String IP_STABLE = "35";
// protected String _ipStable;
protected static final String PORT_STABLE = "36";
protected String _portStable;
protected static final String CAN_DO_FWT = "37";
protected String _canDoFWT;
protected static final String LAST_REPORTED_PORT = "38";
protected String _lastReportedPort;
protected static final String EXTERNAL_PORT = "39";
protected String _externalPort;
protected static final String RECEIVED_IP_PONG = "40";
protected String _receivedIpPong;
protected static final String FATAL_ERROR = "41";
protected String _fatalError;
protected static final String RESPONSE_SIZE = "42";
protected String _responseSize;
protected static final String CT_SIZE = "43";
protected String _creationCacheSize;
protected static final String VF_VERIFY_SIZE = "44";
protected String _vfVerifyingSize;
protected static final String VF_BYTE_SIZE = "45";
protected String _vfByteSize;
protected static final String BB_BYTE_SIZE = "46";
protected String _bbSize;
protected static final String VF_QUEUE_SIZE = "47";
protected String _vfQueueSize;
protected static final String WAITING_SOCKETS = "48";
protected String _waitingSockets;
protected static final String PENDING_TIMEOUTS = "49";
protected String _pendingTimeouts;
protected static final String PEAK_THREADS = "50";
protected String _peakThreads;
protected static final String SP2_WORKAROUNDS = "51";
protected String _sp2Workarounds;
protected static final String LOAD_AVERAGE = "52";
protected String _loadAverage;
protected static final String PENDING_GCOBJ = "53";
protected String _pendingObjects;
protected static final String SETTINGS_FREE_SPACE = "54";
protected String _settingsFreeSpace;
protected static final String INCOMPLETES_FREE_SPACE = "55";
protected String _incompleteFreeSpace;
protected static final String DOWNLOAD_FREE_SPACE = "56";
protected String _downloadFreeSpace;
protected static final String HEAP_USAGE = "57";
protected String _heapUsage;
protected static final String NON_HEAP_USAGE = "58";
protected String _nonHeapUsage;
protected static final String SLOT_MANAGER = "59";
protected String _slotManager;
protected static final String NUM_SELECTS = "60";
protected String _numSelects;
protected static final String NUM_IMMEDIATE_SELECTS = "61";
protected String _numImmediateSelects;
protected static final String AVG_SELECT_TIME = "62";
protected String _avgSelectTime;
protected static final String USER_COMMENTS = "63";
protected String _userComments = "";
/**
* Constant for the number of managed files.
*/
protected static final String MANAGED_FILES = "64";
protected String _managedFiles;
/**
* Constant for the number of remote files that
* have been mounted as a result of a friend browse.
*/
protected static final String FRIEND_FILES = "65";
protected String _friendFiles;
/**
* sets the variable _userComments value to the comments user entered
* @param comments is the comment user entered
*/
public void addUserComments(String comments) {
_userComments = comments;
}
/**
* Returns this bug as a bug report.
*/
public String toBugReport() {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
pw.println("LimeWire version " + _limewireVersion);
pw.println("Java version " + _javaVersion + " from " + _javaVendor);
pw.println(_os + " v. " + _osVersion + " on " + _architecture);
pw.println("Free/total memory: " + _freeMemory + "/" + _totalMemory);
pw.println();
if(isFatalError()) {
pw.println("FATAL ERROR!");
pw.println();
}
pw.println(_bug);
pw.println();
if( _detail != null ) {
pw.println("Detail: " + _detail);
pw.println();
}
pw.println("-- listing session information --");
pw.println("Current thread: " + _currentThread);
pw.println("Active Threads: " + _threadCount);
append(pw, "Uptime", _upTime);
append(pw, "Is Connected", _connected);
append(pw, "Number of Ultrapeer -> Ultrapeer Connections", _upToUp);
append(pw, "Number of Ultrapeer -> Leaf Connections", _upToLeaf);
append(pw, "Number of Leaf -> Ultrapeer Connections", _leafToUp);
append(pw, "Number of Old Connections", _oldConnections);
append(pw, "Acting as Ultrapeer", _ultrapeer);
append(pw, "Acting as Shielded Leaf", _leaf);
append(pw, "Number of Active Uploads", _activeUploads);
append(pw, "Number of Queued Uploads", _queuedUploads);
append(pw, "Number of Active Managed Downloads", _activeDownloads);
append(pw, "Number of Active HTTP Downloaders", _httpDownloaders);
append(pw, "Number of Waiting Downloads", _waitingDownloaders);
append(pw, "Received incoming this session", _acceptedIncoming);
append(pw, "Number of Managed Files", _managedFiles);
append(pw, "Number of Mounted Friend Files", _friendFiles);
append(pw, "Number of Shared Files", _sharedFiles);
append(pw, "Guess Capable", _guessCapable);
append(pw, "Received Solicited UDP",_solicitedCapable);
append(pw, "SIMPP version",_latestSIMPP);
append(pw, "Port Stable", _portStable);
append(pw, "FWT Capable", _canDoFWT);
append(pw, "Last Reported Port",_lastReportedPort);
append(pw, "External Port", _externalPort);
append(pw, "IP Pongs Received",_receivedIpPong);
append(pw, "Number of Content Response URNs", _responseSize);
append(pw, "Number of CreationTimeCache URNs", _creationCacheSize);
append(pw, "VF Byte Cache Size", _vfByteSize);
append(pw, "VF Verify Cache Size", _vfVerifyingSize);
append(pw, "VF Queue Size", _vfQueueSize);
append(pw, "ByteBuffer Cache Size", _bbSize);
append(pw, "Number of Waiting Sockets", _waitingSockets);
append(pw, "Number of Pending Timeouts", _pendingTimeouts);
append(pw, "Peak Number of Thread", _peakThreads);
append(pw, "Number of SP2 Workarounds", _sp2Workarounds);
append(pw, "System Load Avg", _loadAverage);
append(pw, "Objects Pending GC", _pendingObjects);
append(pw, "Free Space In Settings", _settingsFreeSpace);
append(pw, "Free Space In Incomplete", _incompleteFreeSpace);
append(pw, "Free Space In Downloads", _downloadFreeSpace);
append(pw, "Heap Memory Usage", _heapUsage);
append(pw, "Non-Heap Memory Usage", _nonHeapUsage);
append(pw, "SlotManager dump:", _slotManager);
append(pw, "Number of select calls", _numSelects);
append(pw, "Number of immediate selects", _numImmediateSelects);
append(pw, "Average time in select",_avgSelectTime);
pw.println();
if( _otherThreads != null ) {
pw.println("-- listing threads --");
pw.println(_otherThreads);
pw.println();
}
pw.println(_props);
//if user entered any comments
if(!_userComments.equals("")) {
pw.println();
pw.println("**************** Comments from the user ****************\n" + _userComments);
}
pw.flush();
return sw.toString();
}
/**
* Appends 'k: v' to pw if v is non null.
*/
private void append(PrintWriter pw, final String k, final String v) {
if( v != null ) {
pw.println(k + ": " + v);
}
}
/**
* Returns the parsed version of the stack trace, without the message
* between the exception and the stack trace.
*/
public final String getParsedBug() {
int colon = _bug.indexOf(':');
// If no ':', just use the bug as we read it.
if(colon == -1)
return _bug;
// If we did find a colon, ensure that it isn't within
// the file:line part. If so, return the normal bug.
if( colon - 4 >= 0 && _bug.substring(colon - 4, colon).equals("java"))
return _bug;
int ntat = _bug.indexOf("\n\tat", colon);
// If no \n\tat, just use the bug as we read it.
if(ntat == -1)
return _bug;
//Now that we know where the message begins and where the message ends
//put the bug back together without the message.
final String parsedBug = _bug.substring(0, colon) +
_bug.substring(ntat);
return parsedBug;
}
/**
* Prints the bug's name. This is used primarily in generating the
* servlet log.
*
* @return a <tt>String</tt> containing the bug's name.
*/
@Override
public String toString() {
return _bugName;
}
/**
* Determines if this was a fatal error.
*/
public boolean isFatalError() {
return _fatalError != null && _fatalError.equalsIgnoreCase("true");
}
}