View Javadoc

1   /*
2    * #%L
3    * Bitrepository Audit Trail Service
4    * 
5    * $Id$
6    * $HeadURL$
7    * %%
8    * Copyright (C) 2010 - 2012 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.audittrails;
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 access.AccessComponentFactory;
34  import access.getaudittrails.AuditTrailClient;
35  import org.bitrepository.audittrails.collector.AuditTrailCollector;
36  import org.bitrepository.audittrails.preserver.AuditTrailPreserver;
37  import org.bitrepository.audittrails.preserver.LocalAuditTrailPreserver;
38  import org.bitrepository.audittrails.store.AuditTrailDatabaseManager;
39  import org.bitrepository.audittrails.store.AuditTrailServiceDAO;
40  import org.bitrepository.audittrails.store.AuditTrailStore;
41  import org.bitrepository.common.settings.Settings;
42  import org.bitrepository.common.settings.XMLFileSettingsLoader;
43  import org.bitrepository.modify.ModifyComponentFactory;
44  import org.bitrepository.modify.putfile.PutFileClient;
45  import org.bitrepository.protocol.ProtocolComponentFactory;
46  import org.bitrepository.protocol.security.BasicMessageAuthenticator;
47  import org.bitrepository.protocol.security.BasicMessageSigner;
48  import org.bitrepository.protocol.security.BasicOperationAuthorizor;
49  import org.bitrepository.protocol.security.BasicSecurityManager;
50  import org.bitrepository.protocol.security.MessageAuthenticator;
51  import org.bitrepository.protocol.security.MessageSigner;
52  import org.bitrepository.protocol.security.OperationAuthorizor;
53  import org.bitrepository.protocol.security.PermissionStore;
54  import org.bitrepository.protocol.security.SecurityManager;
55  import org.bitrepository.service.ServiceSettingsProvider;
56  import org.bitrepository.service.contributor.ContributorMediator;
57  import org.bitrepository.service.contributor.SimpleContributorMediator;
58  import org.bitrepository.service.database.DatabaseManager;
59  import org.bitrepository.settings.referencesettings.ServiceType;
60  import org.slf4j.Logger;
61  import org.slf4j.LoggerFactory;
62  
63  /**
64   * Factory class for accessing the AuditTrailService 
65   */
66  public final class AuditTrailServiceFactory {
67  
68      private static Logger log = LoggerFactory.getLogger(AuditTrailServiceFactory.class);
69      /** The audit trail service. 
70       * @see #getAuditTrailService().*/
71      private static AuditTrailService auditTrailService;
72      /** The path to the directory containing the configuration files.*/
73      private static String configurationDir;
74      /** The path to the private key file.*/
75      private static String privateKeyFile;
76      
77      /** The properties file holding implementation specifics for the alarm service. */
78      private static final String CONFIGFILE = "audittrails.properties";
79      /** Property key to tell where to locate the path and filename to the private key file. */
80      private static final String PRIVATE_KEY_FILE = "org.bitrepository.audit-trail-service.privateKeyFile";
81          
82      /**
83       * Private constructor as the class is meant to be used in a static way.
84       */
85      private AuditTrailServiceFactory() { }
86      
87      /**
88       * Initialize the factory with configuration. 
89       * @param confDir String containing the path to the AuditTrailService's configuration directory
90       */
91      public static synchronized void init(String confDir) {
92          configurationDir = confDir;
93      }
94      
95      /**
96       * Factory method to retrieve AuditTrailService  
97       * @return The AuditTrailService.
98       */
99      public static synchronized AuditTrailService getAuditTrailService() {
100         if(auditTrailService == null) {
101             MessageAuthenticator authenticator;
102             MessageSigner signer;
103             OperationAuthorizor authorizer;
104             PermissionStore permissionStore;
105             SecurityManager securityManager;
106             ServiceSettingsProvider settingsLoader =
107                     new ServiceSettingsProvider(
108                             new XMLFileSettingsLoader(configurationDir), ServiceType.AUDIT_TRAIL_SERVICE);
109 
110             Settings settings = settingsLoader.getSettings();
111             try {
112                 loadProperties();
113                 permissionStore = new PermissionStore();
114                 authenticator = new BasicMessageAuthenticator(permissionStore);
115                 signer = new BasicMessageSigner();
116                 authorizer = new BasicOperationAuthorizor(permissionStore);
117                 securityManager = new BasicSecurityManager(settings.getRepositorySettings(), privateKeyFile,
118                         authenticator, signer, authorizer, permissionStore, 
119                         settings.getReferenceSettings().getAuditTrailServiceSettings().getID());
120                 
121                 ContributorMediator mediator = new SimpleContributorMediator(
122                         ProtocolComponentFactory.getInstance().getMessageBus(settings, securityManager), 
123                         settings, null);
124                 
125                 PutFileClient putClient = ModifyComponentFactory.getInstance().retrievePutClient(settings, 
126                         securityManager, "audit-trail-preserver");
127                 
128                 DatabaseManager auditTrailServiceDatabaseManager = new AuditTrailDatabaseManager(
129                         settings.getReferenceSettings().getAuditTrailServiceSettings().getAuditTrailServiceDatabase());
130                 AuditTrailStore store = new AuditTrailServiceDAO(auditTrailServiceDatabaseManager);
131                 AuditTrailClient client = AccessComponentFactory.getInstance().createAuditTrailClient(settings, 
132                         securityManager, settings.getReferenceSettings().getAuditTrailServiceSettings().getID());
133 
134                 AuditTrailCollector collector = new AuditTrailCollector(settings, client, store);
135                 AuditTrailPreserver preserver;
136                 if (settings.getReferenceSettings().getAuditTrailServiceSettings().isSetAuditTrailPreservation()) {
137                     preserver = new LocalAuditTrailPreserver(
138                             settings, store, putClient, ProtocolComponentFactory.getInstance().getFileExchange(settings));
139                     preserver.start();
140                 } else {
141                     log.info("Audit trail preservation disabled, no configuration defined.");
142                 }
143                 
144                 auditTrailService = new AuditTrailService(store, collector, mediator, settings);
145             } catch (IOException e) {
146                 throw new RuntimeException(e);
147             }
148         }
149         
150         return auditTrailService;
151     }
152     
153     /**
154      * Loads the properties.
155      * @throws IOException If any input/output issues occurs.
156      */
157     private static void loadProperties() throws IOException {
158         Properties properties = new Properties();
159         File propertiesFile = new File(configurationDir, CONFIGFILE);
160         BufferedReader propertiesReader = new BufferedReader(new FileReader(propertiesFile));
161         properties.load(propertiesReader);
162         privateKeyFile = properties.getProperty(PRIVATE_KEY_FILE);
163     }
164 }