View Javadoc
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 }