001 /** 002 * Copyright 2005-2014 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.rice.ksb.impl.registry; 017 018 import java.util.ArrayList; 019 import java.util.Collections; 020 import java.util.List; 021 022 import javax.xml.namespace.QName; 023 024 import org.apache.commons.lang.StringUtils; 025 import org.kuali.rice.core.api.exception.RiceIllegalArgumentException; 026 import org.kuali.rice.ksb.api.registry.RemoveAndPublishResult; 027 import org.kuali.rice.ksb.api.registry.ServiceDescriptor; 028 import org.kuali.rice.ksb.api.registry.ServiceEndpoint; 029 import org.kuali.rice.ksb.api.registry.ServiceEndpointStatus; 030 import org.kuali.rice.ksb.api.registry.ServiceInfo; 031 import org.kuali.rice.ksb.api.registry.ServiceRegistry; 032 033 /** 034 * Reference implementation of the {@link ServiceRegistry} which is backed by a 035 * data access object that handles reading and writing data related to registry 036 * entries from a backend datastore. 037 * 038 * <p>In order for this class to function properly, a valid {@link ServiceRegistryDao} 039 * must be injected into it via the {@link #setServiceRegistryDao(ServiceRegistryDao)} 040 * method. 041 * 042 * @author Kuali Rice Team (rice.collab@kuali.org) 043 * 044 */ 045 public class ServiceRegistryImpl implements ServiceRegistry { 046 047 private ServiceRegistryDao serviceRegistryDao; 048 049 @Override 050 public List<ServiceInfo> getOnlineServicesByName(QName serviceName) 051 throws RiceIllegalArgumentException { 052 if (serviceName == null) { 053 throw new RiceIllegalArgumentException("serviceName cannot be null"); 054 } 055 List<ServiceInfoBo> serviceInfoBos = serviceRegistryDao.getOnlineServiceInfosByName(serviceName); 056 return convertServiceInfoBoList(serviceInfoBos); 057 } 058 059 @Override 060 public List<ServiceInfo> getAllOnlineServices() { 061 List<ServiceInfoBo> serviceInfoBos = serviceRegistryDao.getAllOnlineServiceInfos(); 062 return convertServiceInfoBoList(serviceInfoBos); 063 } 064 065 @Override 066 public List<ServiceInfo> getAllServices() { 067 List<ServiceInfoBo> serviceInfoBos = serviceRegistryDao.getAllServiceInfos(); 068 return convertServiceInfoBoList(serviceInfoBos); 069 } 070 071 @Override 072 public List<ServiceInfo> getAllServicesForInstance(String instanceId) throws RiceIllegalArgumentException { 073 if (StringUtils.isBlank(instanceId)) { 074 throw new RiceIllegalArgumentException("instanceId cannot be blank"); 075 } 076 List<ServiceInfoBo> serviceInfoBos = serviceRegistryDao.getAllServiceInfosForInstance(instanceId); 077 return convertServiceInfoBoList(serviceInfoBos); 078 } 079 080 @Override 081 public List<ServiceInfo> getAllServicesForApplication(String applicationId) throws RiceIllegalArgumentException { 082 if (StringUtils.isBlank(applicationId)) { 083 throw new RiceIllegalArgumentException("applicationId cannot be blank"); 084 } 085 List<ServiceInfoBo> serviceInfoBos = serviceRegistryDao.getAllServiceInfosForApplication(applicationId); 086 return convertServiceInfoBoList(serviceInfoBos); 087 } 088 089 @Override 090 public ServiceDescriptor getServiceDescriptor(String serviceDescriptorId) 091 throws RiceIllegalArgumentException { 092 if (StringUtils.isBlank(serviceDescriptorId)) { 093 throw new RiceIllegalArgumentException("serviceDescriptorId cannot be blank"); 094 } 095 ServiceDescriptorBo serviceDescriptorBo = serviceRegistryDao.getServiceDescriptor(serviceDescriptorId); 096 return ServiceDescriptorBo.to(serviceDescriptorBo); 097 } 098 099 @Override 100 public List<ServiceDescriptor> getServiceDescriptors(List<String> serviceDescriptorIds) 101 throws RiceIllegalArgumentException { 102 if (serviceDescriptorIds == null) { 103 throw new RiceIllegalArgumentException("serviceDescriptorIds cannot be null"); 104 } 105 List<ServiceDescriptor> serviceDescriptors = new ArrayList<ServiceDescriptor>(); 106 for (String serviceDescriptorId : serviceDescriptorIds) { 107 ServiceDescriptor serviceDescriptor = getServiceDescriptor(serviceDescriptorId); 108 if (serviceDescriptor != null) { 109 serviceDescriptors.add(serviceDescriptor); 110 } 111 } 112 return Collections.unmodifiableList(serviceDescriptors); 113 } 114 115 @Override 116 public ServiceEndpoint publishService(ServiceEndpoint serviceEndpoint) 117 throws RiceIllegalArgumentException { 118 if (serviceEndpoint == null) { 119 throw new RiceIllegalArgumentException("serviceEndpoint cannot be null"); 120 } 121 ServiceDescriptor serviceDescriptor = serviceEndpoint.getDescriptor(); 122 ServiceDescriptorBo serviceDescriptorBo = ServiceDescriptorBo.from(serviceDescriptor); 123 ServiceInfo serviceInfo = serviceEndpoint.getInfo(); 124 ServiceInfoBo serviceInfoBo = ServiceInfoBo.from(serviceInfo); 125 serviceDescriptorBo = serviceRegistryDao.saveServiceDescriptor(serviceDescriptorBo); 126 serviceInfoBo.setServiceDescriptorId(serviceDescriptorBo.getId()); 127 serviceRegistryDao.saveServiceInfo(serviceInfoBo); 128 129 130 return ServiceEndpoint.Builder.create(ServiceInfo.Builder.create(serviceInfoBo), 131 ServiceDescriptor.Builder.create(serviceDescriptorBo)).build(); 132 } 133 134 @Override 135 public List<ServiceEndpoint> publishServices(List<ServiceEndpoint> serviceEndpoints) 136 throws RiceIllegalArgumentException { 137 if (serviceEndpoints == null) { 138 throw new RiceIllegalArgumentException("serviceEndpoints cannot be null"); 139 } 140 List<ServiceEndpoint> publishedEndpoints = new ArrayList<ServiceEndpoint>(); 141 for (ServiceEndpoint serviceEndpoint : serviceEndpoints) { 142 publishedEndpoints.add(publishService(serviceEndpoint)); 143 } 144 return publishedEndpoints; 145 } 146 147 @Override 148 public ServiceEndpoint removeServiceEndpoint(String serviceId) 149 throws RiceIllegalArgumentException { 150 if (StringUtils.isBlank(serviceId)) { 151 throw new RiceIllegalArgumentException("serviceId cannot be blank"); 152 } 153 ServiceInfoBo serviceInfoBo = serviceRegistryDao.getServiceInfo(serviceId); 154 if (serviceInfoBo != null) { 155 ServiceDescriptorBo serviceDescriptorBo = serviceRegistryDao.getServiceDescriptor(serviceInfoBo.getServiceDescriptorId()); 156 ServiceEndpoint endpointPriorRemoval = ServiceEndpoint.Builder.create(ServiceInfo.Builder.create(serviceInfoBo), 157 ServiceDescriptor.Builder.create(serviceDescriptorBo)).build(); 158 serviceRegistryDao.removeServiceInfo(serviceInfoBo.getServiceId()); 159 serviceRegistryDao.removeServiceDescriptor(serviceInfoBo.getServiceDescriptorId()); 160 return endpointPriorRemoval; 161 } 162 return null; 163 } 164 165 @Override 166 public List<ServiceEndpoint> removeServiceEndpoints(List<String> serviceIds) 167 throws RiceIllegalArgumentException { 168 if (serviceIds == null) { 169 throw new RiceIllegalArgumentException("serviceIds canot be null"); 170 } 171 List<ServiceEndpoint> servicesRemoved = new ArrayList<ServiceEndpoint>(); 172 for (String serviceId : serviceIds) { 173 servicesRemoved.add(removeServiceEndpoint(serviceId)); 174 } 175 return servicesRemoved; 176 } 177 178 @Override 179 public RemoveAndPublishResult removeAndPublish(List<String> removeServiceIds, 180 List<ServiceEndpoint> publishServiceEndpoints) { 181 List<ServiceEndpoint> servicesRemoved = new ArrayList<ServiceEndpoint>(); 182 List<ServiceEndpoint> servicesPublished = new ArrayList<ServiceEndpoint>(); 183 if (removeServiceIds != null && !removeServiceIds.isEmpty()) { 184 servicesRemoved = removeServiceEndpoints(removeServiceIds); 185 } 186 if (publishServiceEndpoints != null && !publishServiceEndpoints.isEmpty()) { 187 servicesPublished = publishServices(publishServiceEndpoints); 188 } 189 return RemoveAndPublishResult.create(servicesRemoved, servicesPublished); 190 } 191 192 @Override 193 public boolean updateStatus(String serviceId, ServiceEndpointStatus status) throws RiceIllegalArgumentException { 194 if (StringUtils.isBlank(serviceId)) { 195 throw new RiceIllegalArgumentException("serviceId cannot be blank"); 196 } 197 if (status == null) { 198 throw new RiceIllegalArgumentException("status cannot be null"); 199 } 200 return serviceRegistryDao.updateStatus(serviceId, status.getCode()); 201 } 202 203 @Override 204 public List<String> updateStatuses(List<String> serviceIds, ServiceEndpointStatus status) throws RiceIllegalArgumentException { 205 if (serviceIds == null) { 206 throw new RiceIllegalArgumentException("serviceIds canot be null"); 207 } 208 if (status == null) { 209 throw new RiceIllegalArgumentException("status cannot be null"); 210 } 211 List<String> updatedServiceIds = new ArrayList<String>(); 212 for (String serviceId : serviceIds) { 213 if (updateStatus(serviceId, status)) { 214 updatedServiceIds.add(serviceId); 215 } 216 } 217 return Collections.unmodifiableList(updatedServiceIds); 218 } 219 220 @Override 221 public void takeInstanceOffline(String instanceId) 222 throws RiceIllegalArgumentException { 223 if (StringUtils.isBlank(instanceId)) { 224 throw new RiceIllegalArgumentException("instanceId cannot be blank"); 225 } 226 serviceRegistryDao.updateStatusForInstanceId(instanceId, ServiceEndpointStatus.OFFLINE.getCode()); 227 } 228 229 private List<ServiceInfo> convertServiceInfoBoList(List<ServiceInfoBo> serviceInfoBos) { 230 List<ServiceInfo> serviceInfos = new ArrayList<ServiceInfo>(); 231 if (serviceInfoBos != null) { 232 for (ServiceInfoBo serviceInfoBo : serviceInfoBos) { 233 serviceInfos.add(ServiceInfoBo.to(serviceInfoBo)); 234 } 235 } else { 236 return Collections.emptyList(); 237 } 238 return Collections.unmodifiableList(serviceInfos); 239 } 240 241 public void setServiceRegistryDao(ServiceRegistryDao serviceRegistryDao) { 242 this.serviceRegistryDao = serviceRegistryDao; 243 } 244 245 }