Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Automated tests #30

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 18 additions & 12 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -67,18 +67,6 @@
<version>${nexus.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.sonatype.nexus</groupId>
<artifactId>nexus-plugin-testsupport</artifactId>
<version>${nexus.version}</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.sonatype.nexus</groupId>
<artifactId>nexus-rest-api</artifactId>
Expand Down Expand Up @@ -146,6 +134,24 @@
<artifactId>lombok</artifactId>
<version>1.16.4</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

/**
Expand All @@ -36,26 +36,24 @@
public class ReplicationPluginConfiguration {
@XmlElement(name = "server")
@XmlElementWrapper(name = "servers")
private final Set<NexusServer> servers = new HashSet<>();
private final Set<NexusServer> servers = new LinkedHashSet<>();
@Getter
@NonNull
@XmlAttribute(name = "myUrl")
private String myUrl;
@Getter
@XmlAttribute(name = "requestsQueueSize")
private Integer requestsQueueSize = 500;
@XmlAttribute(name = "requestsSendingThreadsCount")
private Integer requestsSendingThreadsCount = 1;
@XmlAttribute(name = "queueDumpFileName")
@NonNull
private String queueDumpFileName;

public void addServer(NexusServer server) {
servers.add(server);
}

public Integer getRequestsQueueSize() {
return requestsQueueSize;
}

public String getQueueDumpFileName() {
return queueDumpFileName;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
import com.griddynamics.cd.nrp.internal.model.config.NexusServer;
import com.griddynamics.cd.nrp.internal.uploading.ArtifactUpdateApiClient;
import com.griddynamics.cd.nrp.internal.uploading.ConfigurationsManager;
import com.griddynamics.cd.nrp.internal.uploading.impl.factories.AsyncWebResourceBuilderFactory;
import com.griddynamics.cd.nrp.internal.uploading.impl.factories.FileBlockingQueueFactory;
import com.sun.jersey.api.client.AsyncWebResource;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.GenericType;
Expand Down Expand Up @@ -66,25 +68,21 @@ public class ArtifactUpdateApiClientImpl extends ComponentSupport implements Art
* Provides access to the plugin configurations
*/
private final ConfigurationsManager configurationsManager;

private final FileBlockingQueueFactory fileBlockingQueueFactory;
private final AsyncWebResourceBuilderFactory asyncWebResourceBuilderFactory;
/**
* ExecutorService shares between clients. All treads are created in the same executor
*/
private final ExecutorService jerseyHttpClientExecutor;
private final FileBlockingQueue fileBlockingQueue;

@Inject
public ArtifactUpdateApiClientImpl(ConfigurationsManager configurationsManager) {
public ArtifactUpdateApiClientImpl(ConfigurationsManager configurationsManager,
FileBlockingQueueFactory fileBlockingQueueFactory,
AsyncWebResourceBuilderFactory asyncWebResourceBuilderFactory) {
this.configurationsManager = configurationsManager;
this.fileBlockingQueueFactory = fileBlockingQueueFactory;
this.asyncWebResourceBuilderFactory = asyncWebResourceBuilderFactory;
this.fileBlockingQueue = initFileBlockingQueue(configurationsManager.getConfiguration());
this.jerseyHttpClientExecutor = new ThreadPoolExecutor(
configurationsManager.getConfiguration().getRequestsSendingThreadsCount(),
configurationsManager.getConfiguration().getRequestsSendingThreadsCount(),
30,
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(
configurationsManager.getConfiguration().getRequestsQueueSize())
);
initBackgroundWorkers(configurationsManager.getConfiguration());
}

Expand All @@ -110,11 +108,8 @@ public void run() {
}

private FileBlockingQueue initFileBlockingQueue(ReplicationPluginConfiguration replicationPluginConfiguration) {
BlockingQueue<ArtifactMetaInfo> blockingQueue =
new LinkedBlockingQueue<>(replicationPluginConfiguration.getRequestsQueueSize());
String queueFileName = replicationPluginConfiguration.getQueueDumpFileName();
FileBlockingQueue retVal = new FileBlockingQueue(blockingQueue,
queueFileName);
FileBlockingQueue retVal = fileBlockingQueueFactory.getFileBlockingQueue();
try {
File queueFile = new File(queueFileName);
if (queueFile.exists()) {
Expand Down Expand Up @@ -147,7 +142,9 @@ public void offerRequest(ArtifactMetaInfo artifactMetaInfo) {
*/
public void sendRequest(ArtifactMetaInfo metaInfo) {
for (NexusServer server : configurationsManager.getConfiguration().getServers()) {
AsyncWebResource.Builder service = getService(server.getUrl(), server.getUser(), server.getPassword());
AsyncWebResource.Builder service =
asyncWebResourceBuilderFactory.getAsyncWebResourceBuilder(
server.getUrl(), server.getUser(), server.getPassword());
try {
service.post(new ITypeListener<RestResponse>() {
@Override
Expand Down Expand Up @@ -180,42 +177,4 @@ public GenericType<RestResponse> getGenericType() {
}
}

/**
* Returns jersey HTTP resource to access to the remote replication servers
*
* @param nexusUrl URL of the remote server
* @param login Username on the remote server
* @param password User's password
* @return Jersey HTTP client
*/
private AsyncWebResource.Builder getService(String nexusUrl, String login, String password) {
Client client = getClient(login, password);
client.setExecutorService(jerseyHttpClientExecutor);
AsyncWebResource webResource = client.asyncResource(UriBuilder.fromUri(nexusUrl).build());
webResource = webResource.path("service").path("local").path("artifact").path("maven").path("update");
return webResource.accept(MediaType.APPLICATION_XML_TYPE)
.type(MediaType.APPLICATION_XML_TYPE);
}

/**
* Creates jersey HTTP client
*
* @param login Username on the remote server
* @param password User's password
* @return HTTP client
*/
private Client getClient(String login, String password) {
ClientConfig config = new DefaultClientConfig();
config.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, 1000);
config.getProperties().put(ClientConfig.PROPERTY_READ_TIMEOUT, 2000);
Client client = Client.create(config);
client.setExecutorService(jerseyHttpClientExecutor);
if (login != null && !login.isEmpty() && password != null) {
log.debug("Creating HTTP client with authorized HTTPBasicAuthFilter.");
client.addFilter(new HTTPBasicAuthFilter(login, password));
} else {
log.debug("Creating HTTP client with anonymous HTTPBasicAuthFilter.");
}
return client;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public ConfigurationsManagerImpl(NexusConfiguration nexusConfiguration) {
@PostConstruct
public void init() {
log.trace("Initializing plugin configurations");
reloadConfigurations();
reloadConfigurations(CONFIG_FILENAME);
}

/**
Expand All @@ -78,7 +78,7 @@ public ReplicationPluginConfiguration getConfiguration() {
if (config == null) {
synchronized (this) {
if (config == null) {
reloadConfigurations();
reloadConfigurations(CONFIG_FILENAME);
}
}
}
Expand All @@ -89,8 +89,8 @@ public ReplicationPluginConfiguration getConfiguration() {
* Reloads {@link ConfigurationsManagerImpl#config}
* from XML plugin configurations file
*/
public void reloadConfigurations() {
File file = getConfigurationFile();
public void reloadConfigurations(String filename) {
File file = getConfigurationFile(filename);
try {
JAXBContext jaxbContext = JAXBContext.newInstance(ReplicationPluginConfiguration.class);

Expand All @@ -104,7 +104,7 @@ public void reloadConfigurations() {
/**
* Returns plugin configurations XML file
*/
private File getConfigurationFile() {
return new File(nexusConfiguration.getConfigurationDirectory(), CONFIG_FILENAME);
private File getConfigurationFile(String filename) {
return new File(nexusConfiguration.getConfigurationDirectory(), filename);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.griddynamics.cd.nrp.internal.uploading.impl.factories;

import com.sun.jersey.api.client.AsyncWebResource;
import com.sun.jersey.api.client.Client;

import javax.inject.Inject;
import javax.inject.Singleton;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;

@Singleton
public class AsyncWebResourceBuilderFactory {

private final JerseyClientFactory jerseyClientFactory;

@Inject
public AsyncWebResourceBuilderFactory(JerseyClientFactory jerseyClientFactory) {
this.jerseyClientFactory = jerseyClientFactory;
}


/**
* Returns jersey HTTP resource to access to the remote replication servers
*
* @param nexusUrl URL of the remote server
* @param login Username on the remote server
* @param password User's password
* @return Jersey HTTP client
*/
public AsyncWebResource.Builder getAsyncWebResourceBuilder(String nexusUrl, String login, String password) {
Client client = jerseyClientFactory.getClient(login, password);
AsyncWebResource webResource = client.asyncResource(UriBuilder.fromUri(nexusUrl).build());
webResource = webResource.path("service").path("local").path("artifact").path("maven").path("update");
return webResource.accept(MediaType.APPLICATION_XML_TYPE)
.type(MediaType.APPLICATION_XML_TYPE);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.griddynamics.cd.nrp.internal.uploading.impl.factories;

import com.griddynamics.cd.nrp.internal.model.api.ArtifactMetaInfo;
import com.griddynamics.cd.nrp.internal.uploading.ConfigurationsManager;
import com.griddynamics.cd.nrp.internal.uploading.impl.FileBlockingQueue;

import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

@Singleton
public class FileBlockingQueueFactory {

private final ConfigurationsManager configurationsManager;

@Inject
public FileBlockingQueueFactory(ConfigurationsManager configurationsManager) {
this.configurationsManager = configurationsManager;
}

public FileBlockingQueue getFileBlockingQueue() {
BlockingQueue<ArtifactMetaInfo> blockingQueue =
new LinkedBlockingQueue<>(configurationsManager.
getConfiguration().getRequestsQueueSize());
String blockingQueueDumpFileName = configurationsManager.getConfiguration().getQueueDumpFileName();

return new FileBlockingQueue(blockingQueue,
blockingQueueDumpFileName);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.griddynamics.cd.nrp.internal.uploading.impl.factories;

import com.griddynamics.cd.nrp.internal.uploading.ConfigurationsManager;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

@Singleton
public class JerseyClientFactory {

private Logger log = LoggerFactory.getLogger(JerseyClientFactory.class);

private final ExecutorService executorService;

@Inject
public JerseyClientFactory(ConfigurationsManager configurationsManager) {
this.executorService = new ThreadPoolExecutor(
configurationsManager.getConfiguration().getRequestsSendingThreadsCount(),
configurationsManager.getConfiguration().getRequestsSendingThreadsCount(),
30,
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(
configurationsManager.getConfiguration().getRequestsQueueSize()));
}

public Client getClient(String login, String password) {
ClientConfig config = new DefaultClientConfig();
config.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, 1000);
config.getProperties().put(ClientConfig.PROPERTY_READ_TIMEOUT, 2000);
Client client = Client.create(config);
client.setExecutorService(executorService);
if (login != null && !login.isEmpty() && password != null) {
log.debug("Creating HTTP client with authorized HTTPBasicAuthFilter.");
client.addFilter(new HTTPBasicAuthFilter(login, password));
} else {
log.debug("Creating HTTP client with anonymous HTTPBasicAuthFilter.");
}
return client;
}

}
Loading