| /******************************************************************************* |
| * Copyright (c) 1997-2007 by ProSyst Software GmbH |
| * http://www.prosyst.com |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * ProSyst Software GmbH - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.equinox.internal.ip.impl; |
| |
| import java.io.*; |
| import java.net.HttpURLConnection; |
| import java.net.URL; |
| import java.util.Dictionary; |
| import org.osgi.service.log.LogService; |
| import org.osgi.service.provisioning.ProvisioningService; |
| |
| /** |
| * Simple debug class for provisioning agent bundle. |
| * |
| * @author Avgustin Marinov |
| * @author Pavlin Dobrev |
| * @version 1.0 |
| */ |
| |
| public class Log { |
| |
| /** |
| * Property for workaround the J9 2.0 problem with Content-Length, the |
| * content length is not set if property is "true" |
| */ |
| public static boolean j9workAround; |
| |
| /** If debug mode is on. */ |
| public static boolean debug; |
| /** If debug mode is on. */ |
| public static boolean remoteDebug; |
| /** If to send trace */ |
| public static boolean sendTrace; |
| |
| /** Message that trace is not send */ |
| public static byte[] NO_TRACE = "NoTrace".getBytes(); |
| |
| /** Reference to provisioning service */ |
| public static ProvisioningService prvSrv; |
| |
| /** Log stream to receive logged messages. */ |
| private static PrintStream logStream; |
| |
| /** org.eclipse.equinox.internal.util.ref.Log class to receive logged messages */ |
| public static org.eclipse.equinox.internal.util.ref.Log log; |
| |
| static { |
| try { |
| String logFile = ProvisioningAgent.bc.getProperty("equinox.provisioning.provisioning.logfile"); |
| if (logFile != null && (logFile = logFile.trim()).length() != 0) { |
| File log = new File(logFile); |
| log = log.isDirectory() ? new File(log, "log.txt") : log; |
| logStream = new PrintStream(new FileOutputStream(log), true); |
| } |
| } catch (Exception e) { |
| logStream = null; |
| } |
| } |
| |
| /** |
| * Dumps a debug string |
| * |
| * @param obj |
| * a debug string |
| */ |
| public static void debug(String obj) { |
| String message = "[PROVISIONING] " + obj; |
| if (debug && logStream != null) { |
| logStream.println(message); |
| } else if (log != null) { |
| log.debug(message, null); |
| } |
| } |
| |
| /** |
| * Dumps a debug exception |
| * |
| * @param e |
| * a debugged Throwable |
| */ |
| public static void debug(Throwable e) { |
| debug(null, e, remoteDebug); |
| } |
| |
| /** |
| * Dumps an exception if debug mode is enabled |
| * |
| * @param e |
| * the exception to dump |
| */ |
| public static void debug(String message, Throwable e) { |
| debug(message, e, remoteDebug); |
| } |
| |
| private static void debug(String message, Throwable e, boolean sendRemote) { |
| if (debug && logStream != null) { |
| logStream.println("[PROVISIONING] " + message); |
| e.printStackTrace(logStream); |
| } else if (log != null) { |
| log.debug(message, e); |
| } |
| if (sendRemote && e != null && (e.getMessage() == null || e.getMessage().indexOf("Error from Backend") == -1)) { |
| log(message, e); |
| } |
| } |
| |
| /** |
| * Logs an exception |
| * |
| * @param e |
| * the exception |
| */ |
| private static void log(String message, Throwable e) { |
| debug("Log exception remotely."); |
| String logUrl = null; |
| try { |
| ProvisioningService prvSrv = Log.prvSrv; |
| if (prvSrv != null) { |
| Dictionary info = prvSrv.getInformation(); |
| if (info != null) { |
| logUrl = (String) info.get("equinox.provisioning.prv.log"); |
| if (logUrl != null) { |
| debug("Log url = " + logUrl); |
| HttpURLConnection conn = (HttpURLConnection) new URL(logUrl).openConnection(); |
| conn.setRequestMethod("POST"); |
| conn.setRequestProperty("Connection", "close"); |
| conn.setRequestProperty(ProvisioningService.PROVISIONING_SPID, info.get(ProvisioningService.PROVISIONING_SPID) + ""); |
| conn.setRequestProperty("msg", (message != null ? message + ": " : "") + e.getMessage()); |
| conn.setRequestProperty("lvl", LogService.LOG_ERROR + ""); |
| |
| OutputStream os = new ByteArrayOutputStream(); |
| if (sendTrace) { |
| e.printStackTrace(new PrintStream(os)); |
| } else { |
| os.write(NO_TRACE); |
| } |
| byte[] stackTrace = ((ByteArrayOutputStream) os).toByteArray(); |
| if (!j9workAround) { |
| conn.setRequestProperty("Content-Length", stackTrace.length + ""); |
| } |
| |
| conn.setDoOutput(true); |
| conn.setDoInput(true); |
| conn.setUseCaches(false); |
| conn.connect(); |
| |
| os = conn.getOutputStream(); |
| os.write(stackTrace); |
| os.flush(); |
| |
| InputStream is = conn.getInputStream(); |
| while (is.read() != -1) { |
| } |
| } |
| } |
| } |
| } catch (Throwable t) { |
| debug("Error while logging remotely to url \"" + logUrl + '"', t, false); |
| } |
| } |
| } |