]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
cd4e052b1825a418a6c4082bbb6d67f77303cde2
[tmp/jakarta-migration.git] /
1 /**
2  *  This document is a part of the source code and related artifacts
3  *  for CollectionSpace, an open source collections management system
4  *  for museums and related institutions:
5
6  *  http://www.collectionspace.org
7  *  http://wiki.collectionspace.org
8
9  *  Copyright 2009 University of California at Berkeley
10
11  *  Licensed under the Educational Community License (ECL), Version 2.0.
12  *  You may not use this file except in compliance with this License.
13
14  *  You may obtain a copy of the ECL 2.0 License at
15
16  *  https://source.collectionspace.org/collection-space/LICENSE.txt
17
18  *  Unless required by applicable law or agreed to in writing, software
19  *  distributed under the License is distributed on an "AS IS" BASIS,
20  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21  *  See the License for the specific language governing permissions and
22  *  limitations under the License.
23  */
24 package org.collectionspace.services.common.config;
25
26 import java.io.File;
27 import java.util.Hashtable;
28 import org.collectionspace.services.common.ClientType;
29 import org.collectionspace.services.common.RepositoryClientConfigType;
30 import org.collectionspace.services.common.ServiceMain;
31 import org.collectionspace.services.common.repository.RepositoryClient;
32 import org.collectionspace.services.common.repository.RepositoryClientFactory;
33 import org.collectionspace.services.common.service.ServiceBindingType;
34 import org.collectionspace.services.common.tenant.TenantBindingType;
35 import org.collectionspace.services.common.tenant.TenantBindingConfig;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39 /**
40  * ServicesConfigReader reads service layer specific configuration
41  *
42  * $LastChangedRevision: $
43  * $LastChangedDate: $
44  */
45 public class TenantBindingConfigReader
46         extends AbstractConfigReader<TenantBindingConfig> {
47
48     final private static String CONFIG_FILE_NAME = "tenant-bindings.xml";
49     final Logger logger = LoggerFactory.getLogger(TenantBindingConfigReader.class);
50     private TenantBindingConfig tenantBindingConfig;
51     //tenant name, tenant binding
52     private Hashtable<String, TenantBindingType> tenantBindings =
53             new Hashtable<String, TenantBindingType>();
54     //tenant-qualified servicename, service binding
55     private Hashtable<String, ServiceBindingType> serviceBindings =
56             new Hashtable<String, ServiceBindingType>();
57     //tenant-qualified service, workspace
58     private Hashtable<String, String> serviceWorkspaces = new Hashtable<String, String>();
59
60     public TenantBindingConfigReader(String serverRootDir) {
61         super(serverRootDir);
62     }
63
64     @Override
65     public String getFileName() {
66         return CONFIG_FILE_NAME;
67     }
68
69     @Override
70     public void read() throws Exception {
71         String configFileName = getAbsoluteFileName(CONFIG_FILE_NAME);
72         File configFile = new File(configFileName);
73         if(!configFile.exists()){
74             String msg = "Could not find configuration file " + configFileName;
75             logger.error(msg);
76             throw new RuntimeException(msg);
77         }
78         tenantBindingConfig = (TenantBindingConfig) parse(configFile, TenantBindingConfig.class);
79         for(TenantBindingType tenantBinding : tenantBindingConfig.getTenantBinding()){
80             tenantBindings.put(tenantBinding.getId(), tenantBinding);
81             readServiceBindings(tenantBinding);
82             if(logger.isDebugEnabled()){
83                 logger.debug("read() added tenant id=" + tenantBinding.getId() +
84                         " name=" + tenantBinding.getName());
85             }
86         }
87     }
88
89     private void readServiceBindings(TenantBindingType tenantBinding) throws Exception {
90         for(ServiceBindingType serviceBinding : tenantBinding.getServiceBindings()){
91             String key = getTenantQualifiedServiceName(tenantBinding.getId(),
92                     serviceBinding.getName());
93             serviceBindings.put(key, serviceBinding);
94             if(logger.isDebugEnabled()){
95                 logger.debug("readServiceBindings() added service " +
96                         " name=" + key +
97                         " workspace=" + serviceBinding.getName());
98             }
99         }
100     }
101
102     /**
103      * retrieveWorkspaceIds is called at initialization time to retrieve
104      * workspace ids of all the tenants
105      * @throws Exception
106      */
107     public void retrieveAllWorkspaceIds() throws Exception {
108         for(TenantBindingType tenantBinding : tenantBindings.values()){
109             retrieveWorkspaceIds(tenantBinding);
110         }
111     }
112
113     /**
114      * retrieveWorkspaceIds retrieves workspace ids for services used by
115      * the given tenant
116      * @param tenantBinding
117      * @throws Exception
118      */
119     public void retrieveWorkspaceIds(TenantBindingType tenantBinding) throws Exception {
120         Hashtable<String, String> workspaceIds = new Hashtable<String, String>();
121         ServiceMain svcMain = ServiceMain.getInstance();
122         RepositoryClientConfigType rclientConfig = svcMain.getServicesConfigReader().getConfiguration().getRepositoryClient();
123         ClientType clientType = svcMain.getClientType();
124         if(clientType.equals(ClientType.JAVA) &&
125                 rclientConfig.getName().equalsIgnoreCase("nuxeo-java")){
126             //FIXME only one repository client is recognized
127             workspaceIds = svcMain.getNuxeoConnector().retrieveWorkspaceIds(
128                     tenantBinding.getRepositoryDomain());
129         }
130         //verify if workspace exists for each service in the tenant binding
131         for(ServiceBindingType serviceBinding : tenantBinding.getServiceBindings()){
132             String serviceName = serviceBinding.getName();
133             RepositoryClient repositoryClient = getRepositoryClient(
134                     serviceBinding.getRepositoryClient());
135             String workspaceId = null;
136             //workspace name is service name by convention
137             String workspace = serviceBinding.getName().toLowerCase();
138             if(clientType.equals(ClientType.JAVA)){
139                 workspaceId = workspaceIds.get(workspace);
140                 if(workspaceId == null){
141                     logger.warn("failed to retrieve workspace id for " + workspace +
142                             " trying to create a new workspace...");
143                     workspaceId = repositoryClient.createWorkspace(
144                             tenantBinding.getRepositoryDomain(),
145                             serviceBinding.getName());
146                     if(workspaceId == null){
147                         logger.warn("failed to create workspace for " + workspace);
148                         continue;
149                     }
150                 }
151             }else{
152                 workspaceId = serviceBinding.getRepositoryWorkspaceId();
153                 if(workspaceId == null || "".equals(workspaceId)){
154                     logger.error("could not find workspace id for " + workspace);
155                     //FIXME: should we throw an exception here?
156                     continue;
157                 }
158             }
159             String tenantService = getTenantQualifiedServiceName(tenantBinding.getId(), serviceName);
160             serviceWorkspaces.put(tenantService, workspaceId);
161             if(logger.isDebugEnabled()){
162                 logger.debug("retrieved workspace id=" + workspaceId +
163                         " service=" + serviceName +
164                         " workspace=" + workspace);
165             }
166         }
167     }
168
169     @Override
170     public TenantBindingConfig getConfiguration() {
171         return tenantBindingConfig;
172     }
173
174     /**
175      * getTenantBinding gets tenant binding for given tenant
176      * @param tenantId
177      * @return
178      */
179     public TenantBindingType getTenantBinding(
180             String tenantId) {
181         return tenantBindings.get(tenantId);
182     }
183
184     /**
185      * getServiceBinding gets service binding for given tenant for a given service
186      * @param tenantId
187      * @param serviceName
188      * @return
189      */
190     public ServiceBindingType getServiceBinding(
191             String tenantId, String serviceName) {
192         String key = getTenantQualifiedServiceName(tenantId, serviceName);
193         return serviceBindings.get(key);
194     }
195
196     /**
197      * getWorkspaceId retrieves workspace id for given tenant for given service
198      * @param tenantId
199      * @param serviceName
200      * @return
201      */
202     public String getWorkspaceId(String tenantId, String serviceName) {
203         String tenantService = getTenantQualifiedServiceName(tenantId, serviceName);
204         return serviceWorkspaces.get(tenantService);
205     }
206
207     public static String getTenantQualifiedServiceName(
208             String tenantId, String serviceName) {
209         return tenantId + "." + serviceName.toLowerCase();
210     }
211
212     private RepositoryClient getRepositoryClient(String clientName) {
213         return RepositoryClientFactory.getInstance().getClient(clientName);
214     }
215 }