Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 126801 Details for
Bug 248604
[plan][transport] Improve the error messages when an operation goes wrong.
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
ECFTransport with error handling + test
TransportErrorsPatch.txt (text/plain), 19.83 KB, created by
Henrik Lindberg
on 2009-02-25 21:10:54 EST
(
hide
)
Description:
ECFTransport with error handling + test
Filename:
MIME Type:
Creator:
Henrik Lindberg
Created:
2009-02-25 21:10:54 EST
Size:
19.83 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.equinox.p2.artifact.repository >Index: src/org/eclipse/equinox/internal/p2/artifact/repository/messages.properties >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/messages.properties,v >retrieving revision 1.23 >diff -u -r1.23 messages.properties >--- src/org/eclipse/equinox/internal/p2/artifact/repository/messages.properties 11 Feb 2009 18:48:51 -0000 1.23 >+++ src/org/eclipse/equinox/internal/p2/artifact/repository/messages.properties 26 Feb 2009 02:03:23 -0000 >@@ -51,4 +51,44 @@ > > exception_unsupportedAddToComposite = Cannot add descriptors to a composite repository. > exception_unsupportedGetOutputStream=Cannot write artifacts to a composite repository. >-exception_unsupportedRemoveFromComposite = Cannot remove descriptors from a composite repository. >\ No newline at end of file >+exception_unsupportedRemoveFromComposite = Cannot remove descriptors from a composite repository. >+TransportErrorTranslator_400=Bad HTTP Request: {0} >+TransportErrorTranslator_401=Authentication Failed - Unauthorized: {0} >+TransportErrorTranslator_402=HTTP Payment Required: {0} >+TransportErrorTranslator_403=HTTP Access Forbidden: {0} >+TransportErrorTranslator_404=HTTP Remote File Not Found: {0} >+TransportErrorTranslator_405=HTTP Method Not Allowed: {0} >+TransportErrorTranslator_406=HTTP Request Not Acceptable: {0} >+TransportErrorTranslator_407=HTTP Proxy Authentication Required: {0} >+TransportErrorTranslator_408=HTTP Request Timeout: {0} >+TransportErrorTranslator_409=HTTP Conflict In Request: {0} >+TransportErrorTranslator_410=HTTP Remote File Permanently Removed: {0} >+TransportErrorTranslator_411=HTTP Length Required: {0} >+TransportErrorTranslator_412=HTTP Precondition Failed: {0} >+TransportErrorTranslator_413=HTTP Requested Entity Too Large: {0} >+TransportErrorTranslator_414=HTTP Request URI Too Long: {0} >+TransportErrorTranslator_415=HTTP Unsupported Media Type: {0} >+TransportErrorTranslator_416=HTTP Requested Range Not Satisfiable: {0} >+TransportErrorTranslator_417=HTTP Expectation Failed: {0} >+TransportErrorTranslator_418=HTTP April Fool's Teapot Error: {0} >+TransportErrorTranslator_422=HTTP (WebDav) Unprocessable Entity: {0} >+TransportErrorTranslator_423=HTTP (WebDAV) Locked: {0} >+TransportErrorTranslator_424=HTTP (WebDAV) Failed Dependency: {0} >+TransportErrorTranslator_425=HTTP Unordered Collection: {0} >+TransportErrorTranslator_426=HTTP Upgrade Required: {0} >+TransportErrorTranslator_449=HTTP Retry With Response: {0} >+TransportErrorTranslator_450=HTTP Blocked By Parental Control: {0} >+TransportErrorTranslator_500=HTTP Server 'Internal Error': {0} >+TransportErrorTranslator_501=HTTP Server 'Not Implemented': {0} >+TransportErrorTranslator_502=HTTP Server 'Bad Gateway' : {0} >+TransportErrorTranslator_503=HTTP Server 'Service Unavailable': {0} >+TransportErrorTranslator_504=HTTP Server 'Gateway Timeout': {0} >+TransportErrorTranslator_505=HTTP Server 'HTTP Version Not Supported: {0} >+TransportErrorTranslator_506=HTTP Server 'Variant Also Negotiates': {0} >+TransportErrorTranslator_507=HTTP (WebDAV) 'Insufficient Storage': {0} >+TransportErrorTranslator_508=HTTP Server 'Bandwidth Limit Exceeded': {0} >+TransportErrorTranslator_510=HTTP Server 'Not Extended': {0} >+TransportErrorTranslator_MalformedReference=Malformed reference to remote file: {0} >+TransportErrorTranslator_MalformedRemoteFileReference=Malformed reference to remote file: {0} >+TransportErrorTranslator_UnknownErrorCode=HTTP Server Unknown HTTP Response Code ({0}):{1} >+TransportErrorTranslator_UnknownHost=Unknown Host: {0} >Index: src/org/eclipse/equinox/internal/p2/artifact/repository/Messages.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Messages.java,v >retrieving revision 1.19 >diff -u -r1.19 Messages.java >--- src/org/eclipse/equinox/internal/p2/artifact/repository/Messages.java 11 Feb 2009 18:48:51 -0000 1.19 >+++ src/org/eclipse/equinox/internal/p2/artifact/repository/Messages.java 26 Feb 2009 02:03:23 -0000 >@@ -54,6 +54,46 @@ > > public static String Mirroring_NO_MATCHING_DESCRIPTOR; > >+ public static String TransportErrorTranslator_400; >+ public static String TransportErrorTranslator_401; >+ public static String TransportErrorTranslator_402; >+ public static String TransportErrorTranslator_403; >+ public static String TransportErrorTranslator_404; >+ public static String TransportErrorTranslator_405; >+ public static String TransportErrorTranslator_406; >+ public static String TransportErrorTranslator_407; >+ public static String TransportErrorTranslator_408; >+ public static String TransportErrorTranslator_409; >+ public static String TransportErrorTranslator_410; >+ public static String TransportErrorTranslator_411; >+ public static String TransportErrorTranslator_412; >+ public static String TransportErrorTranslator_413; >+ public static String TransportErrorTranslator_414; >+ public static String TransportErrorTranslator_415; >+ public static String TransportErrorTranslator_416; >+ public static String TransportErrorTranslator_417; >+ public static String TransportErrorTranslator_418; >+ public static String TransportErrorTranslator_422; >+ public static String TransportErrorTranslator_423; >+ public static String TransportErrorTranslator_424; >+ public static String TransportErrorTranslator_425; >+ public static String TransportErrorTranslator_426; >+ public static String TransportErrorTranslator_449; >+ public static String TransportErrorTranslator_450; >+ public static String TransportErrorTranslator_500; >+ public static String TransportErrorTranslator_501; >+ public static String TransportErrorTranslator_502; >+ public static String TransportErrorTranslator_503; >+ public static String TransportErrorTranslator_504; >+ public static String TransportErrorTranslator_505; >+ public static String TransportErrorTranslator_506; >+ public static String TransportErrorTranslator_507; >+ public static String TransportErrorTranslator_508; >+ public static String TransportErrorTranslator_510; >+ public static String TransportErrorTranslator_MalformedRemoteFileReference; >+ public static String TransportErrorTranslator_UnknownErrorCode; >+ public static String TransportErrorTranslator_UnknownHost; >+ > static { > // initialize resource bundles > NLS.initializeMessages(BUNDLE_NAME, Messages.class); >Index: src/org/eclipse/equinox/internal/p2/artifact/repository/ECFTransport.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/ECFTransport.java,v >retrieving revision 1.28 >diff -u -r1.28 ECFTransport.java >--- src/org/eclipse/equinox/internal/p2/artifact/repository/ECFTransport.java 24 Feb 2009 01:35:35 -0000 1.28 >+++ src/org/eclipse/equinox/internal/p2/artifact/repository/ECFTransport.java 26 Feb 2009 02:03:23 -0000 >@@ -8,6 +8,7 @@ > * Contributors: > * IBM Corporation - initial API and implementation > * compeople AG (Stefan Liebig) - various ongoing maintenance >+ * henrik.lindberg@cloudsmith.com > *******************************************************************************/ > package org.eclipse.equinox.internal.p2.artifact.repository; > >@@ -15,6 +16,7 @@ > import java.net.ProtocolException; > import java.net.URLEncoder; > import org.eclipse.core.runtime.*; >+import org.eclipse.core.runtime.jobs.*; > import org.eclipse.ecf.core.security.ConnectContextFactory; > import org.eclipse.ecf.core.security.IConnectContext; > import org.eclipse.ecf.filetransfer.*; >@@ -120,13 +122,14 @@ > > public IStatus download(String url, OutputStream destination, IProgressMonitor monitor) { > try { >+ // First try without asking user > IConnectContext context = getConnectionContext(url, false); > for (int i = 0; i < LOGIN_RETRIES; i++) { > try { > return performDownload(url, destination, context, monitor); > } catch (ProtocolException e) { > if (e == ERROR_401) >- context = getConnectionContext(url, true); >+ context = getConnectionContext(url, true); // ask user > } > } > } catch (UserCancelledException e) { >@@ -153,7 +156,19 @@ > public void handleTransferEvent(IFileTransferEvent event) { > if (event instanceof IFileTransferConnectStartEvent) { > IFileTransferConnectStartEvent cse = (IFileTransferConnectStartEvent) event; >- FileTransferJob connectJob = cse.prepareConnectJob(null); >+ final FileTransferJob connectJob = cse.prepareConnectJob(null); >+ IJobChangeListener connectListener = new JobChangeAdapter() { >+ >+ public void done(IJobChangeEvent jobEvent) { >+ >+ synchronized (result) { >+ result[0] = connectJob.getResult(); >+ result.notify(); >+ } >+ >+ } >+ }; >+ connectJob.addJobChangeListener(connectListener); > cse.connectUsingJob(connectJob); > } else if (event instanceof IIncomingFileTransferReceiveStartEvent) { > IIncomingFileTransferReceiveStartEvent rse = (IIncomingFileTransferReceiveStartEvent) event; >@@ -205,9 +220,12 @@ > if (exception.getMessage() != null && (exception.getMessage().indexOf(" 401 ") != -1 || exception.getMessage().indexOf(SERVER_REDIRECT) != -1)) //$NON-NLS-1$ > throw ERROR_401; > } >- return statusOn(target, status); >+ return statusOn(target, TransportErrorTranslator.statusFromException(e, toDownload)); > } catch (FileCreateException e) { >- return statusOn(target, e.getStatus()); >+ return statusOn(target, TransportErrorTranslator.malformedReferenceStatus(e, toDownload)); >+ } catch (NumberFormatException e) { >+ // ECF Runtime exception - https://bugs.eclipse.org/bugs/show_bug.cgi?id=266140 >+ return statusOn(target, TransportErrorTranslator.malformedReferenceStatus(e, toDownload)); > } > synchronized (result) { > while (result[0] == null) { >@@ -220,8 +238,8 @@ > } > } > } >- >- return statusOn(target, result[0]); >+ // the Status in result[0] may be too generic - i.e. "Transfer Exception", translate and return >+ return statusOn(target, TransportErrorTranslator.statusFromOriginalStatus(result[0], toDownload)); > } > > /** >@@ -248,8 +266,13 @@ > } > String nodeName = IRepository.PREFERENCE_NODE + '/' + nodeKey; > ISecurePreferences prefNode = null; >- if (securePreferences.nodeExists(nodeName)) >- prefNode = securePreferences.node(nodeName); >+ try { >+ if (securePreferences.nodeExists(nodeName)) >+ prefNode = securePreferences.node(nodeName); >+ } catch (IllegalArgumentException e) { >+ // thrown when nodeName is malformed >+ return null; // not meaningful to ask for user/pwd, they can't be saved anyway. >+ } > if (!prompt) { > if (prefNode == null) > return null; >Index: src/org/eclipse/equinox/internal/p2/artifact/repository/TransportErrorTranslator.java >=================================================================== >RCS file: src/org/eclipse/equinox/internal/p2/artifact/repository/TransportErrorTranslator.java >diff -N src/org/eclipse/equinox/internal/p2/artifact/repository/TransportErrorTranslator.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/equinox/internal/p2/artifact/repository/TransportErrorTranslator.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,139 @@ >+/******************************************************************************* >+ * Copyright (c) 2009 Cloudsmith Inc. 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: >+ * Cloudsmith Inc. - initial API and implementation >+ *******************************************************************************/ >+ >+package org.eclipse.equinox.internal.p2.artifact.repository; >+ >+import java.io.FileNotFoundException; >+import java.net.UnknownHostException; >+import org.eclipse.core.runtime.IStatus; >+import org.eclipse.core.runtime.Status; >+import org.eclipse.ecf.filetransfer.IncomingFileTransferException; >+import org.eclipse.osgi.util.NLS; >+ >+/** >+ * Utility class to transform transport errors into error messages. >+ * @author henrik.lindberg@cloudsmith.com >+ * >+ */ >+public class TransportErrorTranslator { >+ >+ public static String codeToMessage(int code, String toDownload) { >+ switch (code) { >+ case 400 : >+ return NLS.bind(Messages.TransportErrorTranslator_400, toDownload); >+ case 401 : >+ return NLS.bind(Messages.TransportErrorTranslator_401, toDownload); >+ case 402 : >+ return NLS.bind(Messages.TransportErrorTranslator_402, toDownload); >+ case 403 : >+ return NLS.bind(Messages.TransportErrorTranslator_403, toDownload); >+ case 404 : >+ return NLS.bind(Messages.TransportErrorTranslator_404, toDownload); >+ case 405 : >+ return NLS.bind(Messages.TransportErrorTranslator_405, toDownload); >+ case 406 : >+ return NLS.bind(Messages.TransportErrorTranslator_406, toDownload); >+ case 407 : >+ return NLS.bind(Messages.TransportErrorTranslator_407, toDownload); >+ case 408 : >+ return NLS.bind(Messages.TransportErrorTranslator_408, toDownload); >+ case 409 : >+ return NLS.bind(Messages.TransportErrorTranslator_409, toDownload); >+ case 410 : >+ return NLS.bind(Messages.TransportErrorTranslator_410, toDownload); >+ case 411 : >+ return NLS.bind(Messages.TransportErrorTranslator_411, toDownload); >+ case 412 : >+ return NLS.bind(Messages.TransportErrorTranslator_412, toDownload); >+ case 413 : >+ return NLS.bind(Messages.TransportErrorTranslator_413, toDownload); >+ case 414 : >+ return NLS.bind(Messages.TransportErrorTranslator_414, toDownload); >+ case 415 : >+ return NLS.bind(Messages.TransportErrorTranslator_415, toDownload); >+ case 416 : >+ return NLS.bind(Messages.TransportErrorTranslator_416, toDownload); >+ case 417 : >+ return NLS.bind(Messages.TransportErrorTranslator_417, toDownload); >+ case 418 : >+ return NLS.bind(Messages.TransportErrorTranslator_418, toDownload); >+ case 422 : >+ return NLS.bind(Messages.TransportErrorTranslator_422, toDownload); >+ case 423 : >+ return NLS.bind(Messages.TransportErrorTranslator_423, toDownload); >+ case 424 : >+ return NLS.bind(Messages.TransportErrorTranslator_424, toDownload); >+ case 425 : >+ return NLS.bind(Messages.TransportErrorTranslator_425, toDownload); >+ case 426 : >+ return NLS.bind(Messages.TransportErrorTranslator_426, toDownload); >+ case 449 : >+ return NLS.bind(Messages.TransportErrorTranslator_449, toDownload); >+ case 450 : >+ return NLS.bind(Messages.TransportErrorTranslator_450, toDownload); >+ >+ case 500 : >+ return NLS.bind(Messages.TransportErrorTranslator_500, toDownload); >+ case 501 : >+ return NLS.bind(Messages.TransportErrorTranslator_501, toDownload); >+ case 502 : >+ return NLS.bind(Messages.TransportErrorTranslator_502, toDownload); >+ case 503 : >+ return NLS.bind(Messages.TransportErrorTranslator_503, toDownload); >+ case 504 : >+ return NLS.bind(Messages.TransportErrorTranslator_504, toDownload); >+ case 505 : >+ return NLS.bind(Messages.TransportErrorTranslator_505, toDownload); >+ case 506 : >+ return NLS.bind(Messages.TransportErrorTranslator_506, toDownload); >+ case 507 : >+ return NLS.bind(Messages.TransportErrorTranslator_507, toDownload); >+ case 508 : >+ return NLS.bind(Messages.TransportErrorTranslator_508, toDownload); >+ case 510 : >+ return NLS.bind(Messages.TransportErrorTranslator_510, toDownload); >+ >+ default : >+ return NLS.bind(Messages.TransportErrorTranslator_UnknownErrorCode + Integer.toString(code), toDownload); >+ } >+ } >+ >+ public static IStatus statusFromException(IncomingFileTransferException e, String toDownload) { >+ IStatus status = e.getStatus(); >+ Throwable exception = status.getException(); >+ if (exception instanceof NumberFormatException) { >+ // ECF Reports this as "can not connect" - https://bugs.eclipse.org/bugs/show_bug.cgi?id=266140 >+ return malformedReferenceStatus(e, toDownload); >+ } >+ if (e.getErrorCode() == 404 || exception instanceof FileNotFoundException) { >+ // The 404 may be specific to HTTP >+ return new Status(IStatus.ERROR, Activator.ID, codeToMessage(404, toDownload), e); >+ } >+ // Switch on error codes in the HTTP error code range >+ if (e.getErrorCode() >= 400 && e.getErrorCode() <= 600) >+ return new Status(IStatus.ERROR, Activator.ID, codeToMessage(e.getErrorCode(), toDownload), e); >+ >+ // Return original status >+ return status; >+ } >+ >+ public static IStatus statusFromOriginalStatus(IStatus original, String toDownload) { >+ Throwable t = original.getException(); >+ if (t instanceof UnknownHostException) >+ return new Status(IStatus.ERROR, Activator.ID, NLS.bind(Messages.TransportErrorTranslator_UnknownHost, toDownload), t); >+ return original; >+ } >+ >+ public static IStatus malformedReferenceStatus(Throwable t, String toDownload) { >+ return new Status(IStatus.ERROR, Activator.ID, NLS.bind(Messages.TransportErrorTranslator_MalformedRemoteFileReference, toDownload), t); >+ >+ } >+} >#P org.eclipse.equinox.p2.tests >Index: src/org/eclipse/equinox/p2/tests/artifact/repository/TransferExceptionsTest.java >=================================================================== >RCS file: src/org/eclipse/equinox/p2/tests/artifact/repository/TransferExceptionsTest.java >diff -N src/org/eclipse/equinox/p2/tests/artifact/repository/TransferExceptionsTest.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/equinox/p2/tests/artifact/repository/TransferExceptionsTest.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,56 @@ >+/******************************************************************************* >+ * Copyright (c) 2009 Cloudsmith Inc. 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: >+ * Cloudsmith Inc. - initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.equinox.p2.tests.artifact.repository; >+ >+import java.io.*; >+import org.eclipse.core.runtime.*; >+import org.eclipse.equinox.internal.p2.artifact.repository.ECFTransport; >+import org.eclipse.equinox.p2.tests.AbstractProvisioningTest; >+import org.osgi.framework.BundleException; >+ >+/** >+ * Test supposed to be used interactivly to monitor the error message output. >+ * @author henrik.lindberg@cloudsmith.com >+ * >+ */ >+public class TransferExceptionsTest extends AbstractProvisioningTest { >+ >+ public void testErrorMessages() { >+ FileOutputStream fos = null; >+ File f = null; >+ try { >+ f = File.createTempFile("TransferTest", "dummy.txt"); >+ fos = new FileOutputStream(f); >+ Platform.getBundle("org.eclipse.ecf.provider.filetransfer").start(); >+ } catch (IOException e) { >+ fail("1.0", e); >+ } catch (BundleException e) { >+ fail("1.5", e); >+ } >+ IStatus s = ECFTransport.getInstance().download("bogus!bogus", fos, new NullProgressMonitor()); >+ assertNotOK(s); >+ System.err.print(s.getMessage() + "\n"); >+ s = ECFTransport.getInstance().download("http:bogusURL", fos, new NullProgressMonitor()); >+ assertNotOK(s); >+ s = ECFTransport.getInstance().download("http://bogusURL:999999999999/", fos, new NullProgressMonitor()); >+ assertNotOK(s); >+ System.err.print(s.getMessage() + "\n"); >+ s = ECFTransport.getInstance().download("http:/bogusURL:999999999999/", fos, new NullProgressMonitor()); >+ assertNotOK(s); >+ System.err.print(s.getMessage() + "\n"); >+ s = ECFTransport.getInstance().download("http://bogus.nowhere", fos, new NullProgressMonitor()); >+ assertNotOK(s); >+ System.err.print(s.getMessage() + "\n"); >+ s = ECFTransport.getInstance().download("http://www.eclipse.org/AFileThatDoesNotExist.foo", fos, new NullProgressMonitor()); >+ assertNotOK(s); >+ System.err.print(s.getMessage() + "\n"); >+ } >+}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 248604
:
126668
| 126801