/*******************************************************************************
* Copyright (C) 2010 Robert Munteanu <robert.munteanu@gmail.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
*******************************************************************************/
package com.itsolut.mantis.tests;
import java.math.BigInteger;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.axis.configuration.FileProvider;
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.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.core.TaskRepositoryLocationFactory;
import biz.futureware.mantis.rpc.soap.client.MantisConnectLocator;
import biz.futureware.mantis.rpc.soap.client.MantisConnectPortType;
import com.google.common.collect.Maps;
import com.itsolut.mantis.core.IMantisClient;
import com.itsolut.mantis.core.IMantisClientManager;
import com.itsolut.mantis.core.MantisAttachmentHandler;
import com.itsolut.mantis.core.MantisClientFactory;
import com.itsolut.mantis.core.MantisCommentMapper;
import com.itsolut.mantis.core.MantisCorePlugin;
import com.itsolut.mantis.core.MantisRepositoryConnector;
import com.itsolut.mantis.core.MantisTaskDataHandler;
import com.itsolut.mantis.core.NoOpTracer;
import com.itsolut.mantis.core.StatusFactory;
import com.itsolut.mantis.core.exception.MantisException;
/**
* The <tt>MantisRepositoryAccessor</tt> provides test-specific methods for easy
* access to a Mantis Repository.
*
* @author Robert Munteanu
*/
public class MantisRepositoryAccessor {
private static final class InMemoryMantisClientManager implements IMantisClientManager {
private final Map<String, IMantisClient> urlToClient = Maps.newHashMap();
public synchronized IMantisClient getRepository(TaskRepository taskRepository) throws MantisException {
IMantisClient client = urlToClient.get(taskRepository.getUrl());
if ( client == null ) {
client = new MantisClientFactory(new TaskRepositoryLocationFactory(), new NoOpTracer()).createClient(taskRepository);
urlToClient.put(taskRepository.getUrl(), client);
}
return client;
}
public void onShutdown() {
// ignore
}
}
public static final IMantisClientManager clientManager = new InMemoryMantisClientManager();
public static final MantisRepositoryConnector connector;
static {
StatusFactory statusFactory = new StatusFactory();
MantisTaskDataHandler dataHandler = new MantisTaskDataHandler(clientManager, statusFactory, new MantisCommentMapper(), new NoOpTracer());
MantisAttachmentHandler attachmentHandler = new MantisAttachmentHandler(clientManager, statusFactory);
connector = new MantisRepositoryConnector(clientManager, dataHandler, attachmentHandler, statusFactory, new NoOpTracer());
}
private final String username;
private final String password;
private final String repositoryUrl;
public MantisRepositoryAccessor(String username, String password, String repositoryUrl) {
this.username = username;
this.password = password;
this.repositoryUrl = repositoryUrl;
}
private List<Integer> tasksToDelete = new ArrayList<Integer>();
private IMantisClient client;
private AbstractWebLocation location;
private MantisConnectPortType mantisConnectPort;
private TaskRepository repository;
public AbstractWebLocation getLocation() {
return location;
}
public IMantisClient getClient() {
return client;
}
public TaskRepository getRepository() {
return repository;
}
public MantisConnectPortType getMantisConnectPort() {
return mantisConnectPort;
}
public void init() throws Exception {
repository = new TaskRepository(MantisCorePlugin.REPOSITORY_KIND, repositoryUrl);
repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials(username,
password), false);
location = new TaskRepositoryLocationFactory().createWebLocation(repository);
client = clientManager.getRepository(repository);
FileProvider provider = new FileProvider(this.getClass().getClassLoader().getResourceAsStream(
"test-client-config.wsdd"));
MantisConnectLocator locator = new MantisConnectLocator(provider);
mantisConnectPort = locator.getMantisConnectPort(new URL(repositoryUrl));
}
public void registerIssueToDelete(int issueId) {
tasksToDelete.add(issueId);
}
public void unregisterIssueToDelete(int issueId ) {
tasksToDelete.remove(Integer.valueOf(issueId));
}
public void deleteIssues() throws Exception {
for (Integer taskToDelete : tasksToDelete)
mantisConnectPort.mc_issue_delete(username, password, BigInteger.valueOf(taskToDelete.intValue()));
}
}