blob: 0a1570fa3d85755f705fbac18c086ab0c15eb19f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 The Eclipse Foundation and others.
* 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:
* The Eclipse Foundation - initial API and implementation
*******************************************************************************/
package org.eclipse.epp.internal.mpc.core;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.ConnectException;
import java.net.NoRouteToHostException;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import org.apache.http.ConnectionClosedException;
import org.apache.http.NoHttpResponseException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.osgi.util.NLS;
/**
* @author David Green
*/
public class MarketplaceClientCore {
public static final String BUNDLE_ID = "org.eclipse.epp.mpc.core"; //$NON-NLS-1$
private static final String STREAM_CLOSED_MESSAGE = "Stream closed"; //$NON-NLS-1$
private static final String PIPE_CLOSED_MESSAGE = "Pipe closed"; //$NON-NLS-1$
private static final String PIPE_BROKEN_MESSAGE = "Pipe broken"; //$NON-NLS-1$
public static ILog getLog() {
return Platform.getLog(MarketplaceClientCorePlugin.getBundle());
}
public static void error(String message, Throwable exception) {
if (message == null) {
message = NLS.bind(Messages.MarketplaceClientCore_unexpectedException, exception.getMessage());
}
IStatus status;
if (exception != null) {
status = computeStatus(exception, message);
} else {
status = new Status(IStatus.ERROR, BUNDLE_ID, IStatus.ERROR, message, exception);
}
getLog().log(status);
}
public static void error(Throwable exception) {
error(null, exception);
}
public static IStatus computeStatus(Throwable e, String message) {
Throwable cause = e;
if (e instanceof InvocationTargetException) {
cause = e.getCause();
}
IStatus statusCause = computeWellknownProblemStatus(e);
if (statusCause == null) {
if (cause instanceof CoreException) {
statusCause = ((CoreException) cause).getStatus();
} else {
statusCause = new Status(IStatus.ERROR, BUNDLE_ID, cause.getMessage(), cause);
}
}
if (message == null || "".equals(message.trim())) { //$NON-NLS-1$
message = statusCause.getMessage();
} else if (statusCause.getMessage() != null && !"".equals(statusCause.getMessage().trim())) { //$NON-NLS-1$
message = NLS.bind(Messages.MarketplaceClientCore_message_message2, message, statusCause.getMessage());
}
IStatus status = new MultiStatus(BUNDLE_ID, 0, new IStatus[] { statusCause }, message, cause);
return status;
}
public static IStatus computeWellknownProblemStatus(Throwable exception) {
IStatus status = null;
while (exception != null) {
if (exception instanceof FileNotFoundException) {
// exception message is the URL
status = new Status(IStatus.ERROR, BUNDLE_ID,
NLS.bind(Messages.MarketplaceClientCore_notFound, exception.getMessage()), exception);
break;
}
// name resolution didn't work - possibly offline...
if (exception instanceof UnknownHostException) {
status = new Status(IStatus.ERROR, BUNDLE_ID,
NLS.bind(Messages.MarketplaceClientCore_unknownHost, exception.getMessage()), exception);
break;
}
// could be a previously resolved name, but now unreachable because we're offline...
if (exception instanceof NoRouteToHostException) {
status = new Status(IStatus.ERROR, BUNDLE_ID,
NLS.bind(Messages.MarketplaceClientCore_unknownHost, exception.getMessage()), exception);
break;
}
// some oddly configured networks throw timeouts instead of DNS or routing errors
if (exception instanceof ConnectException) {
status = createConnectionProblemStatus(exception);
break;
}
// no specific details on this one, but could still point to network issues
if (exception instanceof SocketException) {
status = createConnectionProblemStatus(exception);
break;
}
if (exception instanceof SocketTimeoutException) {
status = createConnectionProblemStatus(exception);
break;
}
if (exception instanceof NoHttpResponseException) {
status = createConnectionProblemStatus(exception);
break;
}
if (exception instanceof ConnectionClosedException) {
status = createConnectionProblemStatus(exception);
break;
}
if (exception instanceof CoreException) {
IStatus exceptionStatus = ((CoreException) exception).getStatus();
if (MarketplaceClientCore.BUNDLE_ID.equals(exceptionStatus.getPlugin())
&& exceptionStatus.getCode() == 503) {
//received service unavailable error from P2 transport
status = new Status(IStatus.ERROR, BUNDLE_ID, exceptionStatus.getMessage(), exception);
break;
}
}
Throwable cause = exception.getCause();
if (cause != exception) {
exception = cause;
} else {
break;
}
}
return status;
}
public static IStatus createConnectionProblemStatus(Throwable exception) {
IStatus status = new Status(IStatus.ERROR, BUNDLE_ID,
NLS.bind(Messages.MarketplaceClientCore_connectionProblem, exception.getMessage()), exception);
return status;
}
public static boolean isStreamClosedException(Throwable exception) {
return isIOExceptionWithMessage(exception, STREAM_CLOSED_MESSAGE);
}
public static boolean isPipeClosedException(Throwable exception) {
return isIOExceptionWithMessage(exception, PIPE_CLOSED_MESSAGE);
}
public static boolean isPipeBrokenException(Throwable exception) {
return isIOExceptionWithMessage(exception, PIPE_BROKEN_MESSAGE);
}
public static boolean isFailedDownloadException(Throwable exception) {
return isStreamClosedException(exception) || isPipeClosedException(exception)
|| isPipeBrokenException(exception);
}
private static boolean isIOExceptionWithMessage(Throwable exception, String message) {
while (exception != null) {
if (exception instanceof IOException) {
IOException ioException = (IOException) exception;
return message.equals(ioException.getMessage());
}
Throwable cause = exception.getCause();
if (cause != exception) {
exception = cause;
} else {
break;
}
}
return false;
}
}