/*******************************************************************************
* Copyright (c) 2009, 2010 Tasktop Technologies 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:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.oslc.core.client;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethodBase;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.PutMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.mylyn.commons.net.AbstractWebLocation;
import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
import org.eclipse.mylyn.commons.net.AuthenticationType;
import org.eclipse.mylyn.commons.net.Policy;
import org.eclipse.mylyn.commons.net.WebUtil;
import org.eclipse.mylyn.internal.oslc.core.IOslcCoreConstants;
import org.eclipse.mylyn.internal.oslc.core.OslcCreationDialogDescriptor;
import org.eclipse.mylyn.internal.oslc.core.OslcSelectionDialogDescriptor;
import org.eclipse.mylyn.internal.oslc.core.OslcServiceDescriptor;
import org.eclipse.mylyn.internal.oslc.core.OslcServiceFactory;
import org.eclipse.mylyn.internal.oslc.core.OslcServiceProvider;
import org.eclipse.mylyn.internal.oslc.core.OslcServiceProviderCatalog;
import org.eclipse.mylyn.internal.oslc.core.ServiceHome;
import org.eclipse.mylyn.internal.oslc.core.cm.AbstractChangeRequest;
import org.eclipse.mylyn.tasks.core.RepositoryResponse;
import org.eclipse.mylyn.tasks.core.RepositoryResponse.ResponseKind;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.filter.ElementFilter;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
/**
* Base class from which to implement an OSLC client
*
* @author Robert Elves
*/
public abstract class AbstractOslcClient {
private static final String UTF_8 = "UTF-8"; //$NON-NLS-1$
protected final AbstractWebLocation location;
protected final HttpClient httpClient;
protected final OslcServiceDescriptor configuration;
public AbstractOslcClient(AbstractWebLocation location, OslcServiceDescriptor data) {
this.location = location;
this.httpClient = createHttpClient();
this.configuration = data;
configureHttpCredentials(location);
}
protected void configureHttpCredentials(AbstractWebLocation location) {
AuthScope authScope = new AuthScope(WebUtil.getHost(location.getUrl()), WebUtil.getPort(location.getUrl()),
null, AuthScope.ANY_SCHEME);
AuthenticationCredentials credentials = location.getCredentials(AuthenticationType.REPOSITORY);
if (credentialsValid(credentials)) {
Credentials creds = WebUtil.getHttpClientCredentials(credentials, WebUtil.getHost(location.getUrl()));
httpClient.getState().setCredentials(authScope, creds);
this.httpClient.getParams().setAuthenticationPreemptive(true);
} else {
httpClient.getState().clearCredentials();
}
}
protected boolean credentialsValid(AuthenticationCredentials credentials) {
return credentials != null && credentials.getUserName().length() > 0;
}
protected HttpClient createHttpClient() {
HttpClient httpClient = new HttpClient();
httpClient.setHttpConnectionManager(WebUtil.getConnectionManager());
httpClient.getParams().setCookiePolicy(CookiePolicy.RFC_2109);
// See: https://jazz.net/jazz/web/projects/Rational%20Team%20Concert#action=com.ibm.team.workitem.viewWorkItem&id=85127\
// Added to support fix session cookie issue when talking to tomcat
httpClient.getParams().setParameter("http.protocol.single-cookie-header", true); //$NON-NLS-1$
WebUtil.configureHttpClient(httpClient, getUserAgent());
return httpClient;
}
/**
* Return your unique connector identifier i.e. com.mycompany.myconnector
*/
public abstract String getUserAgent();
/**
* Exposed at connector level via IOslcCoreConnector.getAvailableServices()
*/
public List<OslcServiceProvider> getAvailableServices(String url, IProgressMonitor monitor) throws CoreException {
RequestHandler<List<OslcServiceProvider>> handler = new RequestHandler<List<OslcServiceProvider>>(
"Requesting Available Services") { //$NON-NLS-1$
@Override
public List<OslcServiceProvider> run(HttpMethodBase method, IProgressMonitor monitor) throws CoreException {
try {
final List<OslcServiceProvider> result = new ArrayList<OslcServiceProvider>();
parseServices(method.getResponseBodyAsStream(), result, monitor);
return result;
} catch (IOException e) {
throw new CoreException(new Status(IStatus.ERROR, IOslcCoreConstants.ID_PLUGIN,
"Network error occurred retrieving available services: " + e.getMessage(), e)); //$NON-NLS-1$
}
}
};
return executeMethod(createGetMethod(url), handler, monitor);
}
protected Document getDocumentFromMethod(HttpMethodBase method) throws CoreException {
try {
return getDocumentFromStream(method.getResponseBodyAsStream());
} catch (IOException e) {
throw new CoreException(new Status(IStatus.ERROR, IOslcCoreConstants.ID_PLUGIN,
"Network error obtaining response from server: " + e.getMessage(), e)); //$NON-NLS-1$
}
}
protected Document getDocumentFromStream(InputStream inStream) throws CoreException {
SAXBuilder builder = new SAXBuilder();
builder.setExpandEntities(false);
try {
return builder.build(inStream);
} catch (JDOMException e) {
throw new CoreException(new Status(IStatus.ERROR, IOslcCoreConstants.ID_PLUGIN,
"Error parsing response: " + e.getMessage(), e)); //$NON-NLS-1$
} catch (IOException e) {
throw new CoreException(new Status(IStatus.ERROR, IOslcCoreConstants.ID_PLUGIN,
"Network error parsing response: " + e.getMessage(), e)); //$NON-NLS-1$
}
}
/**
* public for testing
*/
public void parseServices(InputStream inStream, Collection<OslcServiceProvider> providers, IProgressMonitor monitor)
throws CoreException {
Document doc = getDocumentFromStream(inStream);
Iterator<?> itr = doc.getDescendants(new ElementFilter(IOslcCoreConstants.ELEMENT_SERVICE_PROVIDER_CATALOG));
while (itr.hasNext()) {
Element element = (Element) itr.next();
if (element != doc.getRootElement()) {
Attribute attrAbout = element.getAttribute(IOslcCoreConstants.ATTRIBUTE_ABOUT,
IOslcCoreConstants.NAMESPACE_RDF);
String title = element.getChild(IOslcCoreConstants.ELEMENT_TITLE, IOslcCoreConstants.NAMESPACE_DC)
.getText();
if (attrAbout != null && attrAbout.getValue().length() > 0) {
providers.add(new OslcServiceProviderCatalog(title, attrAbout.getValue()));
}
}
}
itr = doc.getDescendants(new ElementFilter(IOslcCoreConstants.ELEMENT_SERVICE_PROVIDER));
while (itr.hasNext()) {
Element element = (Element) itr.next();
String title = element.getChild(IOslcCoreConstants.ELEMENT_TITLE, IOslcCoreConstants.NAMESPACE_DC)
.getText();
Element service = element.getChild(IOslcCoreConstants.ELEMENT_SERVICES,
IOslcCoreConstants.NAMESPACE_OSLC_DISCOVERY_1_0);
if (service != null) {
String resource = service.getAttributeValue(IOslcCoreConstants.ATTRIBUTE_RESOURCE,
IOslcCoreConstants.NAMESPACE_RDF);
providers.add(new OslcServiceProvider(title, resource));
}
}
}
/**
* Retrieve a service descriptor for the given service provider. Exposed at connector level by
* IOslcConnector.getServiceDescriptor()
*
* @throws CoreException
*/
public OslcServiceDescriptor getServiceDescriptor(OslcServiceProvider provider, IProgressMonitor monitor)
throws CoreException {
OslcServiceDescriptor configuration = new OslcServiceDescriptor(provider.getUrl());
downloadServiceDescriptor(configuration, monitor);
return configuration;
}
/**
* Populate the provided configuration with new data from the remote repository.
*/
protected void downloadServiceDescriptor(final OslcServiceDescriptor config, IProgressMonitor monitor)
throws CoreException {
RequestHandler<OslcServiceDescriptor> handler = new RequestHandler<OslcServiceDescriptor>(
"Retrieving Service Descriptor") { //$NON-NLS-1$
@Override
public OslcServiceDescriptor run(HttpMethodBase method, IProgressMonitor monitor) throws CoreException,
IOException {
config.clear();
parseServiceDescriptor(method.getResponseBodyAsStream(), config, monitor);
return config;
}
};
executeMethod(createGetMethod(config.getAboutUrl()), handler, monitor);
}
/**
* public for testing
*/
public void parseServiceDescriptor(InputStream inStream, OslcServiceDescriptor config, IProgressMonitor monitor)
throws CoreException {
Document doc = getDocumentFromStream(inStream);
Iterator<?> itr = doc.getDescendants(new ElementFilter(IOslcCoreConstants.ELEMENT_TITLE,
IOslcCoreConstants.NAMESPACE_DC));
if (itr.hasNext()) {
Element element = (Element) itr.next();
config.setTitle(element.getText());
}
itr = doc.getDescendants(new ElementFilter(IOslcCoreConstants.ELEMENT_DESCRIPTION,
IOslcCoreConstants.NAMESPACE_DC));
if (itr.hasNext()) {
Element element = (Element) itr.next();
config.setDescription(element.getText());
}
itr = doc.getDescendants(new ElementFilter(IOslcCoreConstants.ELEMENT_CREATIONDIALOG,
IOslcCoreConstants.NAMESPACE_OSLC_CM_1_0));
while (itr.hasNext()) {
boolean isDefault = false;
Element element = (Element) itr.next();
String label = element.getChild(IOslcCoreConstants.ELEMENT_TITLE, IOslcCoreConstants.NAMESPACE_DC)
.getText();
String url = element.getChild(IOslcCoreConstants.ELEMENT_URL, IOslcCoreConstants.NAMESPACE_OSLC_CM_1_0)
.getText();
Attribute attrDefault = element.getAttribute(IOslcCoreConstants.ATTRIBUTE_DEFAULT,
IOslcCoreConstants.NAMESPACE_OSLC_CM_1_0);
if (attrDefault != null && attrDefault.getValue().equals("true")) { //$NON-NLS-1$
isDefault = true;
}
OslcCreationDialogDescriptor recordType = new OslcCreationDialogDescriptor(label, url);
config.addCreationDialog(recordType);
if (isDefault) {
config.setDefaultCreationDialog(recordType);
}
}
itr = doc.getDescendants(new ElementFilter(IOslcCoreConstants.ELEMENT_SIMPLEQUERY));
if (itr.hasNext()) {
Element element = (Element) itr.next();
String url = element.getChild(IOslcCoreConstants.ELEMENT_URL, IOslcCoreConstants.NAMESPACE_OSLC_CM_1_0)
.getText();
if (url != null) {
config.setSimpleQueryUrl(url);
}
}
itr = doc.getDescendants(new ElementFilter(IOslcCoreConstants.ELEMENT_FACTORY));
while (itr.hasNext()) {
boolean isDefault = false;
Element element = (Element) itr.next();
String title = element.getChild(IOslcCoreConstants.ELEMENT_TITLE, IOslcCoreConstants.NAMESPACE_DC)
.getText();
String url = element.getChild(IOslcCoreConstants.ELEMENT_URL, IOslcCoreConstants.NAMESPACE_OSLC_CM_1_0)
.getText();
Attribute attrDefault = element.getAttribute(IOslcCoreConstants.ATTRIBUTE_DEFAULT,
IOslcCoreConstants.NAMESPACE_OSLC_CM_1_0);
if (attrDefault != null && attrDefault.getValue().equals("true")) { //$NON-NLS-1$
isDefault = true;
}
OslcServiceFactory factory = new OslcServiceFactory(title, url);
if (isDefault) {
config.setDefaultFactory(factory);
}
config.addServiceFactory(factory);
}
itr = doc.getDescendants(new ElementFilter(IOslcCoreConstants.ELEMENT_HOME));
if (itr.hasNext()) {
Element element = (Element) itr.next();
Element childTitle = element.getChild(IOslcCoreConstants.ELEMENT_TITLE, IOslcCoreConstants.NAMESPACE_DC);
Element childUrl = element.getChild(IOslcCoreConstants.ELEMENT_URL,
IOslcCoreConstants.NAMESPACE_OSLC_CM_1_0);
if (childTitle != null && childTitle.getText().length() > 0 && childUrl != null
&& childUrl.getText().length() > 0) {
ServiceHome home = new ServiceHome(childTitle.getText(), childUrl.getText());
config.setHome(home);
}
}
itr = doc.getDescendants(new ElementFilter(IOslcCoreConstants.ELEMENT_SELECTIONDIALOG));
if (itr.hasNext()) {
Element element = (Element) itr.next();
Element childTitle = element.getChild(IOslcCoreConstants.ELEMENT_TITLE, IOslcCoreConstants.NAMESPACE_DC);
Element childUrl = element.getChild(IOslcCoreConstants.ELEMENT_URL,
IOslcCoreConstants.NAMESPACE_OSLC_CM_1_0);
if (childTitle != null && childTitle.getText().length() > 0 && childUrl != null
&& childUrl.getText().length() > 0) {
OslcSelectionDialogDescriptor selection = new OslcSelectionDialogDescriptor(childTitle.getText(),
childUrl.getText());
String isDefault = element.getAttributeValue(IOslcCoreConstants.ATTRIBUTE_DEFAULT,
IOslcCoreConstants.NAMESPACE_OSLC_CM_1_0);
if (isDefault != null) {
selection.setDefault(isDefault.equals("true")); //$NON-NLS-1$
}
String hintHeight = element.getAttributeValue(IOslcCoreConstants.ATTRIBUTE_HINTHEIGHT,
IOslcCoreConstants.NAMESPACE_OSLC_CM_1_0);
if (hintHeight != null) {
selection.setHintHeight(hintHeight);
}
String hintWidth = element.getAttributeValue(IOslcCoreConstants.ATTRIBUTE_HINTWIDTH,
IOslcCoreConstants.NAMESPACE_OSLC_CM_1_0);
if (hintWidth != null) {
selection.setHintWidth(hintWidth);
}
String label = element.getChildText(IOslcCoreConstants.ELEMENT_LABEL,
IOslcCoreConstants.NAMESPACE_OSLC_CM_1_0);
if (label != null) {
selection.setLabel(label);
}
config.addSelectionDialog(selection);
}
}
}
protected OslcServiceDescriptor getConfiguration(IProgressMonitor monitor) throws CoreException {
monitor = Policy.monitorFor(monitor);
if (configuration.getFactories().isEmpty()) {
updateRepositoryConfiguration(new SubProgressMonitor(monitor, 1));
}
return configuration;
}
public Collection<AbstractChangeRequest> performQuery(String query, IProgressMonitor monitor) throws CoreException {
try {
query = URLEncoder.encode(query, "UTF-8"); //$NON-NLS-1$
} catch (UnsupportedEncodingException e) {
query = URLEncoder.encode(query);
}
final String requestUrl = getConfiguration(monitor).getSimpleQueryUrl() + "?oslc_cm.query=" + query; //$NON-NLS-1$
RequestHandler<Collection<AbstractChangeRequest>> handler = new RequestHandler<Collection<AbstractChangeRequest>>(
"Performing Query") { //$NON-NLS-1$
@Override
public Collection<AbstractChangeRequest> run(HttpMethodBase method, IProgressMonitor monitor)
throws CoreException, IOException {
Collection<AbstractChangeRequest> result = new ArrayList<AbstractChangeRequest>();
parseQueryResponse(method.getResponseBodyAsStream(), result, monitor);
return result;
}
};
return executeMethod(createGetMethod(requestUrl), handler, monitor);
}
// TODO: Handle pagination
public void parseQueryResponse(InputStream inStream, Collection<AbstractChangeRequest> requests,
IProgressMonitor monitor) throws CoreException {
Document doc = getDocumentFromStream(inStream);
Iterator<?> itr = doc.getDescendants(new ElementFilter(IOslcCoreConstants.ELEMENT_CHANGEREQUEST,
IOslcCoreConstants.NAMESPACE_OSLC_CM_1_0));
while (itr.hasNext()) {
Element element = (Element) itr.next();
String title = element.getChildText(IOslcCoreConstants.ELEMENT_TITLE, IOslcCoreConstants.NAMESPACE_DC);
String id = element.getChildText(IOslcCoreConstants.ELEMENT_IDENTIFIER, IOslcCoreConstants.NAMESPACE_DC);
if (title != null && id != null) {
AbstractChangeRequest request = createChangeRequest(id, title);
request.setType(element.getChildText(IOslcCoreConstants.ELEMENT_TYPE, IOslcCoreConstants.NAMESPACE_DC));
request.setDescription(element.getChildText(IOslcCoreConstants.ELEMENT_DESCRIPTION,
IOslcCoreConstants.NAMESPACE_DC));
request.setSubject(element.getChildText(IOslcCoreConstants.ELEMENT_SUBJECT,
IOslcCoreConstants.NAMESPACE_DC));
request.setCreator(element.getChildText(IOslcCoreConstants.ELEMENT_CREATOR,
IOslcCoreConstants.NAMESPACE_DC));
request.setModified(element.getChildText(IOslcCoreConstants.ELEMENT_MODIFIED,
IOslcCoreConstants.NAMESPACE_DC));
requests.add(request);
}
}
}
protected abstract AbstractChangeRequest createChangeRequest(String id, String title);
/**
* Updates this clients 'repository configuration'. If old types were in use (locally cached) and still exist they
* are re-read from repository.
*/
public void updateRepositoryConfiguration(IProgressMonitor monitor) throws CoreException {
configuration.clear();
downloadServiceDescriptor(configuration, monitor);
}
public abstract TaskData getTaskData(final String encodedTaskId, TaskAttributeMapper mapper,
IProgressMonitor monitor) throws CoreException;
public abstract RepositoryResponse putTaskData(TaskData taskData, Set<TaskAttribute> oldValues,
IProgressMonitor monitor) throws CoreException;
public RepositoryResponse postTaskData(TaskData taskData, IProgressMonitor monitor) throws CoreException {
Element root = new Element(IOslcCoreConstants.ELEMENT_CHANGEREQUEST, IOslcCoreConstants.NAMESPACE_OSLC_CM_1_0);
final Document doc = new Document(root);
TaskAttribute attribute = taskData.getRoot().getMappedAttribute(IOslcCoreConstants.ELEMENT_TITLE);
if (attribute != null) {
// TODO: Store namespace on attribute
Element e = new Element(attribute.getId(), IOslcCoreConstants.NAMESPACE_DC);
e.setText(attribute.getValue());
root.addContent(e);
}
attribute = taskData.getRoot().getMappedAttribute(IOslcCoreConstants.ELEMENT_DESCRIPTION);
if (attribute != null) {
Element e = new Element(attribute.getId(), IOslcCoreConstants.NAMESPACE_DC);
e.setText(attribute.getValue());
root.addContent(e);
}
attribute = taskData.getRoot().getMappedAttribute(IOslcCoreConstants.ELEMENT_TYPE);
if (attribute != null) {
Element e = new Element(attribute.getId(), IOslcCoreConstants.NAMESPACE_DC);
e.setText(attribute.getValue());
root.addContent(e);
}
attribute = taskData.getRoot().getMappedAttribute(IOslcCoreConstants.ELEMENT_SUBJECT);
if (attribute != null) {
Element e = new Element(attribute.getId(), IOslcCoreConstants.NAMESPACE_DC);
e.setText(attribute.getValue());
root.addContent(e);
}
// For RTC Tests
attribute = taskData.getRoot().getMappedAttribute("filedAgainst"); //$NON-NLS-1$
if (attribute != null) {
Element e = new Element(attribute.getId(), IOslcCoreConstants.NAMESPACE_RTC_CM_1_0);
e.setText(attribute.getValue());
root.addContent(e);
}
PostMethod method = createPostMethod(getConfiguration(monitor).getDefaultFactory().getUrl());
method.setRequestHeader("Accept", "application/x-oslc-cm-change-request+xml"); //$NON-NLS-1$ //$NON-NLS-2$
method.setRequestHeader("Content-Type", "application/x-oslc-cm-change-request+xml"); //$NON-NLS-1$ //$NON-NLS-2$
XMLOutputter out = new XMLOutputter(Format.getCompactFormat());
try {
method.setRequestEntity(new StringRequestEntity(out.outputString(doc),
IOslcCoreConstants.CONTENT_TYPE_CHANGE_REQUEST, UTF_8));
} catch (UnsupportedEncodingException e1) {
throw new CoreException(new Status(IStatus.ERROR, IOslcCoreConstants.ID_PLUGIN,
"Error creating new change request: " + e1.getMessage(), e1)); //$NON-NLS-1$
}
RequestHandler<RepositoryResponse> handler = new RequestHandler<RepositoryResponse>("Creating") { //$NON-NLS-1$
@Override
public RepositoryResponse run(HttpMethodBase method, IProgressMonitor monitor) throws CoreException {
Header header = method.getResponseHeader("Location"); //$NON-NLS-1$
if (header != null && header.getValue() != null) {
String location = header.getValue();
// TODO: delegate extraction of 'task id' to protected method and add to repository response
return new RepositoryResponse(ResponseKind.TASK_CREATED, location);
}
return null;
}
};
return executeMethod(method, handler, monitor);
}
protected GetMethod createGetMethod(String requestPath) {
GetMethod method = new GetMethod(getRequestPath(requestPath));
method.setFollowRedirects(true);
method.setDoAuthentication(true);
// application/xml is returned by oslc servers by default (but some may not play nice)
method.setRequestHeader("Accept", "application/xml"); //$NON-NLS-1$ //$NON-NLS-2$
return method;
}
protected PostMethod createPostMethod(String requestPath) {
PostMethod method = new PostMethod(getRequestPath(requestPath));
method.setFollowRedirects(false);
method.setDoAuthentication(true);
// this.entity = getRequestEntity(method);
// if (pairs != null) {
// method.setRequestBody(pairs);
// } else if (entity != null) {
// method.setRequestEntity(entity);
// } else {
// StatusHandler.log(new Status(IStatus.WARNING, IOslcCoreConstants.ID_PLUGIN,
// "Request body or entity missing upon post."));
// }
return method;
}
protected PutMethod createPutMethod(String requestPath) {
PutMethod method = new PutMethod(getRequestPath(requestPath));
method.setFollowRedirects(false);
method.setDoAuthentication(true);
return method;
}
protected <T> T executeMethod(HttpMethodBase method, RequestHandler<T> handler, IProgressMonitor monitor)
throws CoreException {
monitor = Policy.monitorFor(monitor);
try {
monitor.beginTask(handler.getRequestName(), IProgressMonitor.UNKNOWN);
HostConfiguration hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, monitor);
int code = WebUtil.execute(httpClient, hostConfiguration, method, monitor);
handleReturnCode(code, method);
return handler.run(method, monitor);
} catch (IOException e) {
throw new CoreException(new Status(IStatus.WARNING, IOslcCoreConstants.ID_PLUGIN,
"An unexpected network error has occurred: " + e.getMessage(), e)); //$NON-NLS-1$
} finally {
if (method != null) {
WebUtil.releaseConnection(method, monitor);
}
monitor.done();
}
}
public String getRequestPath(String repositoryUrl) {
if (repositoryUrl.startsWith("./")) { //$NON-NLS-1$
return WebUtil.getRequestPath(location.getUrl()) + repositoryUrl.substring(1);
} else if (repositoryUrl.startsWith("/")) { //$NON-NLS-1$
return WebUtil.getRequestPath(location.getUrl()) + repositoryUrl;
}
return WebUtil.getRequestPath(repositoryUrl);
}
protected void handleReturnCode(int code, HttpMethodBase method) throws CoreException {
try {
if (code == java.net.HttpURLConnection.HTTP_OK) {
return;// Status.OK_STATUS;
} else if (code == java.net.HttpURLConnection.HTTP_MOVED_TEMP
|| code == java.net.HttpURLConnection.HTTP_CREATED) {
// A new resource created...
return;// Status.OK_STATUS;
} else if (code == java.net.HttpURLConnection.HTTP_UNAUTHORIZED
|| code == java.net.HttpURLConnection.HTTP_FORBIDDEN) {
throw new CoreException(new Status(IStatus.ERROR, IOslcCoreConstants.ID_PLUGIN,
"Unable to log into server, ensure repository credentials are correct.")); //$NON-NLS-1$
} else if (code == java.net.HttpURLConnection.HTTP_PRECON_FAILED) {
// Mid-air collision
throw new CoreException(new Status(IStatus.ERROR, IOslcCoreConstants.ID_PLUGIN,
"Mid-air collision occurred.")); //$NON-NLS-1$
} else if (code == java.net.HttpURLConnection.HTTP_CONFLICT) {
throw new CoreException(new Status(IStatus.ERROR, IOslcCoreConstants.ID_PLUGIN, "A conflict occurred.")); //$NON-NLS-1$
} else {
throw new CoreException(new Status(IStatus.ERROR, IOslcCoreConstants.ID_PLUGIN,
"Unknown error occurred. Http Code: " + code + " Request: " + method.getURI() + " Response: " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ method.getResponseBodyAsString()));
}
} catch (URIException e) {
throw new CoreException(new Status(IStatus.ERROR, IOslcCoreConstants.ID_PLUGIN, "Network Error: " //$NON-NLS-1$
+ e.getMessage()));
} catch (IOException e) {
throw new CoreException(new Status(IStatus.ERROR, IOslcCoreConstants.ID_PLUGIN, "Network Error: " //$NON-NLS-1$
+ e.getMessage()));
}
}
public abstract class RequestHandler<T> {
private final String requestName;
public RequestHandler(String requestName) {
this.requestName = requestName;
}
public abstract T run(HttpMethodBase method, IProgressMonitor monitor) throws CoreException, IOException;
public String getRequestName() {
return requestName;
}
}
}