View Javadoc

1   /*
2    * #%L
3    * bitrepository-access-client
4    * *
5    * $Id$
6    * $HeadURL$
7    * %%
8    * Copyright (C) 2010 - 2011 The State and University Library, The Royal Library and The State Archives, Denmark
9    * %%
10   * This program is free software: you can redistribute it and/or modify
11   * it under the terms of the GNU Lesser General Public License as 
12   * published by the Free Software Foundation, either version 2.1 of the 
13   * License, or (at your option) any later version.
14   * 
15   * This program is distributed in the hope that it will be useful,
16   * but WITHOUT ANY WARRANTY; without even the implied warranty of
17   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18   * GNU General Lesser Public License for more details.
19   * 
20   * You should have received a copy of the GNU General Lesser Public 
21   * License along with this program.  If not, see
22   * <http://www.gnu.org/licenses/lgpl-2.1.html>.
23   * #L%
24   */
25  package org.bitrepository.alarm;
26  
27  import java.io.BufferedReader;
28  import java.io.File;
29  import java.io.FileReader;
30  import java.io.IOException;
31  import java.util.Properties;
32  
33  import org.bitrepository.alarm.handling.handlers.AlarmStorer;
34  import org.bitrepository.alarm.store.AlarmDatabaseManager;
35  import org.bitrepository.alarm.store.AlarmServiceDAO;
36  import org.bitrepository.alarm.store.AlarmStore;
37  import org.bitrepository.common.settings.Settings;
38  import org.bitrepository.common.settings.XMLFileSettingsLoader;
39  import org.bitrepository.protocol.ProtocolComponentFactory;
40  import org.bitrepository.protocol.messagebus.MessageBus;
41  import org.bitrepository.protocol.security.BasicMessageAuthenticator;
42  import org.bitrepository.protocol.security.BasicMessageSigner;
43  import org.bitrepository.protocol.security.BasicOperationAuthorizor;
44  import org.bitrepository.protocol.security.BasicSecurityManager;
45  import org.bitrepository.protocol.security.MessageAuthenticator;
46  import org.bitrepository.protocol.security.MessageSigner;
47  import org.bitrepository.protocol.security.OperationAuthorizor;
48  import org.bitrepository.protocol.security.PermissionStore;
49  import org.bitrepository.protocol.security.SecurityManager;
50  import org.bitrepository.service.ServiceSettingsProvider;
51  import org.bitrepository.service.contributor.ContributorMediator;
52  import org.bitrepository.service.contributor.SimpleContributorMediator;
53  import org.bitrepository.service.database.DatabaseManager;
54  import org.bitrepository.settings.referencesettings.ServiceType;
55  
56  /**
57   * Class for launching an alarm service.
58   */
59  public class AlarmServiceFactory {
60      /** The alarm service. 
61       * @see #getAlarmService().*/
62      private static AlarmService alarmService;
63      /** The path to the directory containing the configuration files.*/
64      private static String configurationDir;
65      /** The path to the private key file.*/
66      private static String privateKeyFile;
67      
68      /** The properties file holding implementation specifics for the alarm service. */
69      private static final String CONFIGFILE = "alarmservice.properties";
70      /** Property key to tell where to locate the path and filename to the private key file. */
71      private static final String PRIVATE_KEY_FILE = "org.bitrepository.alarm-service.privateKeyFile";
72          
73      /**
74       * Private constructor as the class is meant to be used in a static way.
75       */
76      private AlarmServiceFactory() { }
77      
78      /**
79       * Initialize the factory with configuration. 
80       * @param confDir String containing the path to the AlarmService's configuration directory
81       */
82      public static synchronized void init(String confDir) {
83          configurationDir = confDir;
84      }
85      
86      /**
87       * Factory method to retrieve AlarmService  
88       * @return The AlarmService.
89       */
90      public static synchronized AlarmService getAlarmService() {
91          if(alarmService == null) {
92              MessageAuthenticator authenticator;
93              MessageSigner signer;
94              OperationAuthorizor authorizer;
95              PermissionStore permissionStore;
96              SecurityManager securityManager;
97              ServiceSettingsProvider settingsLoader =
98                      new ServiceSettingsProvider(new XMLFileSettingsLoader(configurationDir), ServiceType.ALARM_SERVICE);
99  
100             Settings settings = settingsLoader.getSettings();
101             try {
102                 loadProperties();
103                 permissionStore = new PermissionStore();
104                 authenticator = new BasicMessageAuthenticator(permissionStore);
105                 signer = new BasicMessageSigner();
106                 authorizer = new BasicOperationAuthorizor(permissionStore);
107                 securityManager = new BasicSecurityManager(settings.getRepositorySettings(), privateKeyFile,
108                         authenticator, signer, authorizer, permissionStore, 
109                         settings.getReferenceSettings().getAlarmServiceSettings().getID());
110                 
111                 MessageBus messageBus = ProtocolComponentFactory.getInstance().getMessageBus(settings, 
112                         securityManager);
113                 ContributorMediator contributorMediator = new SimpleContributorMediator(messageBus, settings, null);
114                 
115                 DatabaseManager alarmDatabaseManager = new AlarmDatabaseManager(
116                         settings.getReferenceSettings().getAlarmServiceSettings().getAlarmServiceDatabase());
117                 AlarmStore store = new AlarmServiceDAO(alarmDatabaseManager);
118                 alarmService = new BasicAlarmService(messageBus, settings, store, contributorMediator);
119                 
120                 // Add the default handler for putting the alarms into the database.
121                 alarmService.addHandler(new AlarmStorer(store));
122             } catch (IOException e) {
123                 throw new RuntimeException(e);
124             }
125         }
126         
127         return alarmService;
128     }
129     
130     /**
131      * Loads the properties.
132      * @throws IOException If any input/output issues occurs.
133      */
134     private static void loadProperties() throws IOException {
135         Properties properties = new Properties();
136         File propertiesFile = new File(configurationDir, CONFIGFILE);
137         BufferedReader propertiesReader = new BufferedReader(new FileReader(propertiesFile));
138         properties.load(propertiesReader);
139         privateKeyFile = properties.getProperty(PRIVATE_KEY_FILE);
140     }
141 }