blob: d118e50201ca430c560a6dd54ee554a9ac62c4ed [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 Frank Becker 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:
* Frank Becker - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.bugzilla.rest.core;
import java.util.Map;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.commons.core.operations.IOperationMonitor;
import org.eclipse.mylyn.commons.repositories.core.RepositoryLocation;
import org.eclipse.mylyn.internal.bugzilla.rest.core.response.data.ErrorResponse;
import org.eclipse.mylyn.internal.bugzilla.rest.core.response.data.Field;
import org.eclipse.mylyn.internal.bugzilla.rest.core.response.data.FieldResponse;
import org.eclipse.mylyn.internal.bugzilla.rest.core.response.data.Named;
import org.eclipse.mylyn.internal.bugzilla.rest.core.response.data.ParameterResponse;
import org.eclipse.mylyn.internal.bugzilla.rest.core.response.data.Product;
import org.eclipse.mylyn.internal.bugzilla.rest.core.response.data.ProductResponse;
import org.eclipse.mylyn.internal.bugzilla.rest.core.response.data.RestResponse;
import org.eclipse.mylyn.internal.bugzilla.rest.core.response.data.VersionResponse;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.gson.reflect.TypeToken;
public class BugzillaRestClient {
private final BugzillaRestHttpClient client;
public BugzillaRestClient(RepositoryLocation location) {
client = new BugzillaRestHttpClient(location);
}
public BugzillaRestHttpClient getClient() {
return client;
}
public BugzillaRestVersion getVersion(IOperationMonitor monitor) throws BugzillaRestException {
VersionResponse versionResponse = new BugzillaRestUnauthenticatedGetRequest<VersionResponse>(client, "/version",
new TypeToken<VersionResponse>() {
}).run(monitor);
return new BugzillaRestVersion(versionResponse.getVersion());
}
public boolean validate(IOperationMonitor monitor) throws BugzillaRestException {
ErrorResponse validateResponse = new BugzillaRestValidateRequest(client).run(monitor);
return validateResponse.isError() && validateResponse.getCode() == 32614;
}
public BugzillaRestConfiguration getConfiguration(TaskRepository repository, IOperationMonitor monitor) {
try {
BugzillaRestConfiguration config = new BugzillaRestConfiguration(repository.getUrl());
config.setFields(getFields(monitor));
config.setProducts(getProducts(monitor));
ParameterResponse parameterResponse = getParameters(monitor);
config.setParameters(parameterResponse != null ? parameterResponse.getParameters() : null);
return config;
} catch (Exception e) {
StatusHandler
.log(new Status(IStatus.ERROR, BugzillaRestCore.ID_PLUGIN, "Could not get the Configuration", e)); //$NON-NLS-1$
return null;
}
}
public <R extends RestResponse<E>, E extends Named> Map<String, E> retrieveItems(IOperationMonitor monitor,
String path, TypeToken typeToken) throws BugzillaRestException {
R response = new BugzillaRestAuthenticatedGetRequest<R>(client, path, typeToken).run(monitor);
E[] members = response.getArray();
return Maps.uniqueIndex(Lists.newArrayList(members), new Function<E, String>() {
public String apply(E input) {
return input.getName();
};
});
}
private Map<String, Field> getFields(IOperationMonitor monitor) throws BugzillaRestException {
return retrieveItems(monitor, "/field/bug?", new TypeToken<FieldResponse>() {
});
}
private Map<String, Product> getProducts(IOperationMonitor monitor) throws BugzillaRestException {
return retrieveItems(monitor, "/product?type=accessible", new TypeToken<ProductResponse>() { //$NON-NLS-1$
});
}
public ParameterResponse getParameters(IOperationMonitor monitor) throws BugzillaRestException {
return new BugzillaRestAuthenticatedGetRequest<ParameterResponse>(client, "/parameters?",
new TypeToken<ParameterResponse>() {
}).run(monitor);
}
}