Skip to content
This repository has been archived by the owner on May 26, 2020. It is now read-only.

Commit

Permalink
Add Server permit
Browse files Browse the repository at this point in the history
  • Loading branch information
Pradeep Thomas committed Oct 11, 2016
1 parent 60b04bb commit 307a5d3
Show file tree
Hide file tree
Showing 9 changed files with 611 additions and 140 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package uk.gov.justice.artemis;

import java.util.Set;
import java.util.function.Supplier;

import org.apache.activemq.artemis.core.security.CheckType;
import org.apache.activemq.artemis.core.security.Role;
import org.apache.activemq.artemis.jms.server.embedded.EmbeddedJMS;
import org.apache.activemq.artemis.spi.core.security.ActiveMQSecurityManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class EmbeddedArtemisInitializer {

private static final Logger LOG = LoggerFactory.getLogger(EmbeddedArtemisInitializer.class);

private EmbeddedArtemisInitializer() {}

public static EmbeddedJMS initialize(final EmbeddedJMS jmsServer){
jmsServer.setConfigResourcePath("broker.xml");
// override the security manager to cater for multiple test configurations
// users and passwords
jmsServer.setSecurityManager(getSecurityManager());
return jmsServer;
}

public static void checkLoggers() {
// ensure that the loggers are in the classpath and loaded
org.apache.activemq.artemis.core.server.ActiveMQServerLogger.class.getCanonicalName();
org.apache.activemq.artemis.core.server.ActiveMQServerLogger_$logger.class
.getCanonicalName();
}

public static ActiveMQSecurityManager getSecurityManager() {

return new ActiveMQSecurityManager() {
@Override
public boolean validateUser(final String user, final String password) {
return true;
}

@Override
public boolean validateUserAndRole(final String user, final String password,
final Set<Role> roles, final CheckType checkType) {
return true;
}
};
}


}
102 changes: 28 additions & 74 deletions src/main/java/uk/gov/justice/artemis/EmbeddedArtemisServer.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
package uk.gov.justice.artemis;

import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Semaphore;
import static uk.gov.justice.artemis.EmbeddedArtemisInitializer.initialize;

import org.apache.activemq.artemis.core.security.CheckType;
import org.apache.activemq.artemis.core.security.Role;
import org.apache.activemq.artemis.jms.server.embedded.EmbeddedJMS;
import org.apache.activemq.artemis.spi.core.security.ActiveMQSecurityManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -16,19 +11,18 @@
* An embedded Artemis server that should be used only for testing.
*
*/
public final class EmbeddedArtemisServer {
public class EmbeddedArtemisServer {

private static final Logger LOG = LoggerFactory.getLogger(EmbeddedArtemisServer.class);

static {
Runtime.getRuntime().addShutdownHook(getShutDownHook());
}

private static EmbeddedJMS jmsServer;
private static EmbeddedJMSServer jmsServer =
new EmbeddedJMSServer().setJmsServer(initialize(new EmbeddedJMS()));

private static final Semaphore serverPermit = new Semaphore(1, true);

private static volatile boolean initialised;
private static ServerPermit serverPermit = new ServerPermit();

private EmbeddedArtemisServer() {}

Expand All @@ -43,32 +37,8 @@ public static void main(String args[]) throws Exception {
* @throws Exception
*/
public static final void startServer() throws Exception {

serverPermit.acquire();
try {

if (initialised) {
return;
}

checkLoggers();

if (Objects.isNull(jmsServer)) {
setJmsServer(new EmbeddedJMS());
}

jmsServer.setConfigResourcePath("broker.xml");

// override the security manager to cater for multiple test configurations
// users and passwords
jmsServer.setSecurityManager(getSecurityManager());

try (final ServerPermit sp = serverPermit.acquire()) {
jmsServer.start();

initialised = true;

} finally {
serverPermit.release();
}
}

Expand All @@ -77,55 +47,39 @@ public static final void startServer() throws Exception {
*
* @throws Exception
*/
public static final void stopServer() throws Exception {
serverPermit.acquire();
try {
if (initialised) {
jmsServer.stop();
initialised = false;
}
} finally {
serverPermit.release();
public static final boolean stopServer() {
try (final ServerPermit sp = serverPermit.acquire()) {
return jmsServer.stop();
} catch (Exception e) {
LOG.error("EmbeddedArtemisServer", e);
}
return false;
}

public static EmbeddedJMS getJmsServer() {
public static Thread getShutDownHook() {

return new Thread(() -> {
stopServer();
}, "EmbeddedArtemisServerRuntimeHook");
}

public static EmbeddedJMSServer getJmsServer() {
return jmsServer;
}

public static void setJmsServer(final EmbeddedJMS jmsServer) {
public static void setJmsServer(EmbeddedJMSServer jmsServer) {
EmbeddedArtemisServer.jmsServer = jmsServer;
}

private static void checkLoggers() {
// ensure that the loggers are in the classpath and loaded
org.apache.activemq.artemis.core.server.ActiveMQServerLogger.class.getCanonicalName();
org.apache.activemq.artemis.core.server.ActiveMQServerLogger_$logger.class
.getCanonicalName();

public static void setEmbeddedJms(EmbeddedJMS embeddedJms) {
jmsServer.setJmsServer(embeddedJms);
}

private static ActiveMQSecurityManager getSecurityManager() {
return new ActiveMQSecurityManager() {
@Override
public boolean validateUser(final String user, final String password) {
return true;
}

@Override
public boolean validateUserAndRole(final String user, final String password,
final Set<Role> roles, final CheckType checkType) {
return true;
}
};
public static ServerPermit getServerPermit() {
return serverPermit;
}

private static Thread getShutDownHook() {
return new Thread(() -> {
try {
stopServer();
} catch (Exception e) {
LOG.error("EmbeddedArtemisServerRuntimeHook", e);
}
}, "EmbeddedArtemisServerRuntimeHook");
public static void setServerPermit(ServerPermit serverPermit) {
EmbeddedArtemisServer.serverPermit = serverPermit;
}
}
51 changes: 51 additions & 0 deletions src/main/java/uk/gov/justice/artemis/EmbeddedJMSServer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package uk.gov.justice.artemis;

import org.apache.activemq.artemis.jms.server.embedded.EmbeddedJMS;

public class EmbeddedJMSServer {

private EmbeddedJMS jmsServer;

private volatile boolean initialised;

public void start() throws Exception {

if (initialised) {
return;
}

jmsServer.start();

initialised = true;
}

public boolean stop() throws Exception {

if (initialised) {

jmsServer.stop();

initialised = false;
}

return initialised;
}

public EmbeddedJMS getJmsServer() {
return jmsServer;
}

public EmbeddedJMSServer setJmsServer(EmbeddedJMS jmsServer) {
this.jmsServer = jmsServer;
return this;
}

public boolean isInitialised() {
return initialised;
}

public void setInitialised(boolean initialised) {
this.initialised = initialised;
}

}
36 changes: 36 additions & 0 deletions src/main/java/uk/gov/justice/artemis/ServerPermit.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package uk.gov.justice.artemis;

import java.util.concurrent.Semaphore;

/**
*
* Permit for starting and stopping the Artemis Server
*
*/
public class ServerPermit implements AutoCloseable {

private Semaphore semaphore;

public ServerPermit() {
semaphore = new Semaphore(1, true);
}

public ServerPermit acquire() throws InterruptedException {
semaphore.acquire();
return this;
}

@Override
public void close() throws Exception {
semaphore.release();
}

public Semaphore getSemaphore() {
return semaphore;
}

public ServerPermit setSemaphore(Semaphore semaphore) {
this.semaphore = semaphore;
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package uk.gov.justice.artemis;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.doThrow;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.util.Collections;
import java.util.function.Supplier;

import org.apache.activemq.artemis.core.security.CheckType;
import org.apache.activemq.artemis.spi.core.security.ActiveMQSecurityManager;
import org.junit.Test;

public class EmbeddedArtemisInitializerTest {


@Test
public void shouldTestActiveMQSecurityManagerAlwaysTrue() {
ActiveMQSecurityManager activeMQSecurityManager =
EmbeddedArtemisInitializer.getSecurityManager();
assertNotNull(activeMQSecurityManager);
assertTrue(activeMQSecurityManager.validateUser("user", "password"));
assertTrue(activeMQSecurityManager.validateUserAndRole("user", "password",
Collections.emptySet(), CheckType.SEND));
}

@Test
public void shouldTestPrivateConstructor()
throws InstantiationException, IllegalAccessException, IllegalArgumentException,
InvocationTargetException, NoSuchMethodException, SecurityException {
Constructor<EmbeddedArtemisInitializer> constructor =
EmbeddedArtemisInitializer.class.getDeclaredConstructor();
assertTrue(Modifier.isPrivate(constructor.getModifiers()));
constructor.setAccessible(true);
// to improve code coverage
constructor.newInstance();
}

@Test
public void shouldTestLoggersClassesAreAvailable(){
EmbeddedArtemisInitializer.checkLoggers();
}

}
Loading

0 comments on commit 307a5d3

Please sign in to comment.