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 }