1 package ejava.examples.jms10.jmsmechanics; 2 3 import java.io.File; 4 import java.util.Arrays; 5 import java.util.HashMap; 6 import java.util.Map; 7 import java.util.Set; 8 9 import org.apache.activemq.artemis.core.config.impl.SecurityConfiguration; 10 import org.apache.activemq.artemis.jms.server.embedded.EmbeddedJMS; 11 import org.apache.activemq.artemis.spi.core.security.ActiveMQSecurityManager; 12 import org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoader; 13 import org.slf4j.Logger; 14 import org.slf4j.LoggerFactory; 15 16 public class ArtemisServer { 17 private static final Logger logger = LoggerFactory.getLogger(ArtemisServer.class); 18 public static final String DEFAULT_BASEDIR="target/test-classes"; 19 public static final String DEFAULT_USERS_FILE="users.properties"; 20 public static final String DEFAULT_ROLES_FILE="roles.properties"; 21 public static final String DONE_FILE="STOP_ME"; 22 23 static ArtemisServer instance = null; 24 private SecurityConfiguration securityConfig = new SecurityConfiguration(); 25 private Map<String, String> options = new HashMap<>(); 26 private String usersFile=DEFAULT_USERS_FILE; 27 private String rolesFile=DEFAULT_ROLES_FILE; 28 private EmbeddedJMS server; 29 private File doneFile; 30 31 ArtemisServer() { 32 setBaseDir(DEFAULT_BASEDIR); 33 } 34 35 public void setBaseDir(String baseDir) { 36 options.put("baseDir", baseDir); 37 } 38 public void setUsersFile(String usersFile) { 39 this.usersFile = usersFile; 40 } 41 public void setRolesFile(String rolesFile) { 42 this.rolesFile = rolesFile; 43 } 44 45 protected void init() { 46 server = new EmbeddedJMS(); 47 48 PropertiesLoader propLoader = new PropertiesLoader(); 49 propLoader.init(options); 50 propLoader.load("users", usersFile, options) 51 .getProps() 52 .forEach((user,password)->{ 53 securityConfig.addUser((String)user, (String)password); 54 logger.info("{}={}", user, password); 55 }); 56 propLoader.load("roles", rolesFile, options) 57 .invertedPropertiesValuesMap() 58 .forEach((user,roles)-> { 59 ((Set<String>)roles).forEach(role->{ 60 securityConfig.addRole(user, role); 61 logger.info("user {} => {} role", user, role); 62 }); 63 }); 64 65 @SuppressWarnings("deprecation") 66 ActiveMQSecurityManager security = new org.apache.activemq.artemis.spi.core.security.ActiveMQSecurityManagerImpl(securityConfig); 67 server.setSecurityManager(security); 68 69 doneFile = new File(options.get("baseDir") + File.separatorChar + DONE_FILE); 70 if (doneFile.exists()) { 71 doneFile.delete(); 72 } 73 } 74 75 public void addUser(String user, String password) { 76 securityConfig.addUser(user, password); 77 } 78 79 public void addRole(String user, String role) { 80 securityConfig.addRole(user, role); 81 } 82 83 public void start() throws Exception { 84 if (server==null) { 85 init(); 86 } 87 server.start(); 88 } 89 90 public void stop() throws Exception { 91 if (server!=null) { 92 server.stop(); 93 } 94 } 95 96 public boolean isDone() { 97 return doneFile.exists(); 98 } 99 100 101 public static void main(String args[]) { 102 boolean noExit=false; 103 try { 104 System.out.print("Artemis args:"); 105 Arrays.asList(args).forEach(a->System.out.print(a + " ")); 106 System.out.println(); 107 final ArtemisServer server = new ArtemisServer(); 108 for (int i=0; i<args.length; i++) { 109 if ("-baseDir".equals(args[i])) { 110 server.setBaseDir(args[++i]); 111 } 112 else if ("-users".equals(args[i])) { 113 server.setUsersFile(args[++i]); 114 } 115 else if ("-roles".equals(args[i])) { 116 server.setRolesFile(args[++i]); 117 } 118 else if ("-noExit".equals(args[i])) { 119 noExit=true; 120 } 121 } 122 server.start(); 123 for(boolean done=false;!done;) { 124 done=server.isDone(); 125 logger.debug("waiting for done file: {}", ArtemisServer.DONE_FILE); 126 Thread.sleep(1000); 127 } 128 server.stop(); 129 } 130 catch (Exception ex) { 131 logger.error("",ex); 132 if (noExit) { 133 throw new RuntimeException("error in publisher", ex); 134 } 135 System.exit(-1); 136 } 137 } 138 }