001 package org.kuali.rice.ksb.api.registry; 002 003 import java.io.Serializable; 004 import java.util.Collection; 005 006 import javax.xml.bind.annotation.XmlAccessType; 007 import javax.xml.bind.annotation.XmlAccessorType; 008 import javax.xml.bind.annotation.XmlAnyElement; 009 import javax.xml.bind.annotation.XmlElement; 010 import javax.xml.bind.annotation.XmlRootElement; 011 import javax.xml.bind.annotation.XmlType; 012 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 013 import javax.xml.namespace.QName; 014 015 import org.apache.commons.lang.StringUtils; 016 import org.apache.commons.lang.builder.EqualsBuilder; 017 import org.apache.commons.lang.builder.HashCodeBuilder; 018 import org.apache.commons.lang.builder.ToStringBuilder; 019 import org.kuali.rice.core.api.CoreConstants; 020 import org.kuali.rice.core.api.mo.ModelBuilder; 021 import org.kuali.rice.core.api.mo.ModelObjectComplete; 022 import org.kuali.rice.core.util.jaxb.QNameAsStringAdapter; 023 import org.w3c.dom.Element; 024 025 /** 026 * Immutable implementation of the {@link ServiceInfoContract} interface. 027 * Includes standard configuration information about a service that has been 028 * published to the service registry. 029 * 030 * @author Kuali Rice Team (rice.collab@kuali.org) 031 * 032 */ 033 @XmlRootElement(name = ServiceInfo.Constants.ROOT_ELEMENT_NAME) 034 @XmlAccessorType(XmlAccessType.NONE) 035 @XmlType(name = ServiceInfo.Constants.TYPE_NAME, propOrder = { 036 ServiceInfo.Elements.SERVICE_ID, 037 ServiceInfo.Elements.SERVICE_NAME, 038 ServiceInfo.Elements.ENDPOINT_URL, 039 ServiceInfo.Elements.INSTANCE_ID, 040 ServiceInfo.Elements.APPLICATION_ID, 041 ServiceInfo.Elements.SERVER_IP_ADDRESS, 042 ServiceInfo.Elements.TYPE, 043 ServiceInfo.Elements.SERVICE_VERSION, 044 ServiceInfo.Elements.STATUS, 045 ServiceInfo.Elements.SERVICE_DESCRIPTOR_ID, 046 ServiceInfo.Elements.CHECKSUM, 047 CoreConstants.CommonElements.VERSION_NUMBER, 048 CoreConstants.CommonElements.FUTURE_ELEMENTS 049 }) 050 public final class ServiceInfo implements ModelObjectComplete, ServiceInfoContract { 051 052 private static final long serialVersionUID = 4793306414624564991L; 053 054 @XmlElement(name = Elements.SERVICE_ID, required = false) 055 private final String serviceId; 056 057 @XmlJavaTypeAdapter(QNameAsStringAdapter.class) 058 @XmlElement(name = Elements.SERVICE_NAME, required = true) 059 private final QName serviceName; 060 061 @XmlElement(name = Elements.ENDPOINT_URL, required = true) 062 private final String endpointUrl; 063 064 @XmlElement(name = Elements.INSTANCE_ID, required = true) 065 private final String instanceId; 066 067 @XmlElement(name = Elements.APPLICATION_ID, required = true) 068 private final String applicationId; 069 070 @XmlElement(name = Elements.SERVER_IP_ADDRESS, required = true) 071 private final String serverIpAddress; 072 073 @XmlElement(name = Elements.TYPE, required = true) 074 private final String type; 075 076 @XmlElement(name = Elements.SERVICE_VERSION, required = true) 077 private final String serviceVersion; 078 079 @XmlJavaTypeAdapter(ServiceEndpointStatus.Adapter.class) 080 @XmlElement(name = Elements.STATUS, required = true) 081 private final String status; 082 083 @XmlElement(name = Elements.SERVICE_DESCRIPTOR_ID, required = false) 084 private final String serviceDescriptorId; 085 086 @XmlElement(name = Elements.CHECKSUM, required = true) 087 private final String checksum; 088 089 @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false) 090 private final Long versionNumber; 091 092 @SuppressWarnings("unused") 093 @XmlAnyElement 094 private final Collection<Element> _futureElements = null; 095 096 /** 097 * Private constructor used only by JAXB. 098 * 099 */ 100 private ServiceInfo() { 101 this.serviceId = null; 102 this.serviceName = null; 103 this.endpointUrl = null; 104 this.instanceId = null; 105 this.applicationId = null; 106 this.serverIpAddress = null; 107 this.type = null; 108 this.serviceVersion = null; 109 this.status = null; 110 this.serviceDescriptorId = null; 111 this.checksum = null; 112 this.versionNumber = null; 113 } 114 115 private ServiceInfo(Builder builder) { 116 this.serviceId = builder.getServiceId(); 117 this.serviceName = builder.getServiceName(); 118 this.endpointUrl = builder.getEndpointUrl(); 119 this.instanceId = builder.getInstanceId(); 120 this.applicationId = builder.getApplicationId(); 121 this.serverIpAddress = builder.getServerIpAddress(); 122 this.type = builder.getType(); 123 this.serviceVersion = builder.getServiceVersion(); 124 ServiceEndpointStatus builderStatus = builder.getStatus(); 125 this.status = builderStatus == null ? null : builderStatus.getCode(); 126 this.serviceDescriptorId = builder.getServiceDescriptorId(); 127 this.checksum = builder.getChecksum(); 128 this.versionNumber = builder.getVersionNumber(); 129 } 130 131 @Override 132 public String getServiceId() { 133 return this.serviceId; 134 } 135 136 @Override 137 public QName getServiceName() { 138 return this.serviceName; 139 } 140 141 @Override 142 public String getEndpointUrl() { 143 return this.endpointUrl; 144 } 145 146 @Override 147 public String getInstanceId() { 148 return this.instanceId; 149 } 150 151 @Override 152 public String getApplicationId() { 153 return this.applicationId; 154 } 155 156 @Override 157 public String getServerIpAddress() { 158 return this.serverIpAddress; 159 } 160 161 @Override 162 public String getType() { 163 return this.type; 164 } 165 166 @Override 167 public String getServiceVersion() { 168 return this.serviceVersion; 169 } 170 171 @Override 172 public ServiceEndpointStatus getStatus() { 173 return ServiceEndpointStatus.fromCode(this.status); 174 } 175 176 @Override 177 public String getServiceDescriptorId() { 178 return this.serviceDescriptorId; 179 } 180 181 @Override 182 public String getChecksum() { 183 return this.checksum; 184 } 185 186 @Override 187 public Long getVersionNumber() { 188 return this.versionNumber; 189 } 190 191 @Override 192 public int hashCode() { 193 return HashCodeBuilder.reflectionHashCode(this, Constants.HASH_CODE_EQUALS_EXCLUDE); 194 } 195 196 @Override 197 public boolean equals(Object object) { 198 return EqualsBuilder.reflectionEquals(object, this, Constants.HASH_CODE_EQUALS_EXCLUDE); 199 } 200 201 @Override 202 public String toString() { 203 return ToStringBuilder.reflectionToString(this); 204 } 205 206 /** 207 * A builder which can be used to construct {@link ServiceInfo} instances. 208 * Enforces the constraints of the {@link ServiceInfoContract}. 209 */ 210 public final static class Builder 211 implements Serializable, ModelBuilder, ServiceInfoContract 212 { 213 214 private static final long serialVersionUID = 4424090938369742940L; 215 216 private String serviceId; 217 private QName serviceName; 218 private String endpointUrl; 219 private String instanceId; 220 private String applicationId; 221 private String serverIpAddress; 222 private String type; 223 private String serviceVersion; 224 private ServiceEndpointStatus status; 225 private String serviceDescriptorId; 226 private String checksum; 227 private Long versionNumber; 228 229 private Builder() {} 230 231 public static Builder create() { 232 return new Builder(); 233 } 234 235 public static Builder create(ServiceInfoContract contract) { 236 if (contract == null) { 237 throw new IllegalArgumentException("contract was null"); 238 } 239 Builder builder = create(); 240 builder.setServiceId(contract.getServiceId()); 241 builder.setServiceName(contract.getServiceName()); 242 builder.setEndpointUrl(contract.getEndpointUrl()); 243 builder.setInstanceId(contract.getInstanceId()); 244 builder.setApplicationId(contract.getApplicationId()); 245 builder.setServerIpAddress(contract.getServerIpAddress()); 246 builder.setType(contract.getType()); 247 builder.setServiceVersion(contract.getServiceVersion()); 248 builder.setStatus(contract.getStatus()); 249 builder.setServiceDescriptorId(contract.getServiceDescriptorId()); 250 builder.setChecksum(contract.getChecksum()); 251 builder.setVersionNumber(contract.getVersionNumber()); 252 return builder; 253 } 254 255 public ServiceInfo build() { 256 validateAll(); 257 return new ServiceInfo(this); 258 } 259 260 @Override 261 public String getServiceId() { 262 return this.serviceId; 263 } 264 265 @Override 266 public QName getServiceName() { 267 return this.serviceName; 268 } 269 270 @Override 271 public String getEndpointUrl() { 272 return this.endpointUrl; 273 } 274 275 @Override 276 public String getInstanceId() { 277 return this.instanceId; 278 } 279 280 @Override 281 public String getApplicationId() { 282 return this.applicationId; 283 } 284 285 @Override 286 public String getServerIpAddress() { 287 return this.serverIpAddress; 288 } 289 290 @Override 291 public String getType() { 292 return this.type; 293 } 294 295 @Override 296 public String getServiceVersion() { 297 return this.serviceVersion; 298 } 299 300 @Override 301 public ServiceEndpointStatus getStatus() { 302 return this.status; 303 } 304 305 @Override 306 public String getServiceDescriptorId() { 307 return this.serviceDescriptorId; 308 } 309 310 @Override 311 public String getChecksum() { 312 return this.checksum; 313 } 314 315 @Override 316 public Long getVersionNumber() { 317 return this.versionNumber; 318 } 319 320 public void setServiceId(String serviceId) { 321 this.serviceId = serviceId; 322 } 323 324 public void setServiceName(QName serviceName) { 325 validateServiceName(serviceName); 326 this.serviceName = serviceName; 327 } 328 329 public void setEndpointUrl(String endpointUrl) { 330 validateEndpointUrl(endpointUrl); 331 this.endpointUrl = endpointUrl; 332 } 333 334 public void setInstanceId(String instanceId) { 335 validateInstanceId(instanceId); 336 this.instanceId = instanceId; 337 } 338 339 public void setApplicationId(String applicationId) { 340 validateApplicationId(applicationId); 341 this.applicationId = applicationId; 342 } 343 344 public void setServerIpAddress(String serverIpAddress) { 345 validateServerIpAddress(serverIpAddress); 346 this.serverIpAddress = serverIpAddress; 347 } 348 349 public void setType(String type) { 350 validateType(type); 351 this.type = type; 352 } 353 354 public void setServiceVersion(String serviceVersion) { 355 validateServiceVersion(serviceVersion); 356 this.serviceVersion = serviceVersion; 357 } 358 359 public void setStatus(ServiceEndpointStatus status) { 360 validateStatus(status); 361 this.status = status; 362 } 363 364 public void setServiceDescriptorId(String serviceDescriptorId) { 365 this.serviceDescriptorId = serviceDescriptorId; 366 } 367 368 public void setChecksum(String checksum) { 369 validateChecksum(checksum); 370 this.checksum = checksum; 371 } 372 373 public void setVersionNumber(Long versionNumber) { 374 this.versionNumber = versionNumber; 375 } 376 377 private void assertNotNull(String name, Object object) { 378 if (object == null) { 379 throw new IllegalArgumentException(name + " was null"); 380 } 381 } 382 383 private void assertNotBlank(String name, String value) { 384 assertNotNull(name, value); 385 if (StringUtils.isBlank(value)) { 386 throw new IllegalArgumentException(name + " was blank"); 387 } 388 } 389 390 private void validateServiceName(QName serviceName) { 391 assertNotNull("serviceName", serviceName); 392 } 393 394 private void validateEndpointUrl(String endpointUrl) { 395 assertNotBlank("endpointUrl", endpointUrl); 396 } 397 398 private void validateInstanceId(String instanceId) { 399 assertNotBlank("instanceId", instanceId); 400 } 401 402 private void validateApplicationId(String applicationId) { 403 assertNotBlank("applicationId", applicationId); 404 } 405 406 private void validateServerIpAddress(String serverIpAddress) { 407 assertNotBlank("serverIpAddress", serverIpAddress); 408 } 409 410 private void validateType(String type) { 411 assertNotBlank("type", type); 412 } 413 414 private void validateServiceVersion(String serviceVersion) { 415 assertNotBlank("serviceVersion", serviceVersion); 416 } 417 418 private void validateStatus(ServiceEndpointStatus status) { 419 assertNotNull("status", status); 420 } 421 422 private void validateChecksum(String checksum) { 423 assertNotBlank("checksum", checksum); 424 } 425 426 private void validateAll() { 427 validateServiceName(serviceName); 428 validateEndpointUrl(endpointUrl); 429 validateInstanceId(instanceId); 430 validateApplicationId(applicationId); 431 validateServerIpAddress(serverIpAddress); 432 validateType(type); 433 validateServiceVersion(serviceVersion); 434 validateStatus(status); 435 validateChecksum(checksum); 436 } 437 438 } 439 440 441 /** 442 * Defines some internal constants used on this class. 443 * 444 */ 445 static class Constants { 446 447 final static String ROOT_ELEMENT_NAME = "serviceInfo"; 448 final static String TYPE_NAME = "ServiceInfoType"; 449 final static String[] HASH_CODE_EQUALS_EXCLUDE = new String[] {CoreConstants.CommonElements.FUTURE_ELEMENTS }; 450 451 } 452 453 454 /** 455 * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML. 456 * 457 */ 458 static class Elements { 459 460 final static String SERVICE_ID = "serviceId"; 461 final static String SERVICE_NAME = "serviceName"; 462 final static String ENDPOINT_URL = "endpointUrl"; 463 final static String INSTANCE_ID = "instanceId"; 464 final static String APPLICATION_ID = "applicationId"; 465 final static String SERVER_IP_ADDRESS = "serverIpAddress"; 466 final static String TYPE = "type"; 467 final static String SERVICE_VERSION = "serviceVersion"; 468 final static String STATUS = "status"; 469 final static String SERVICE_DESCRIPTOR_ID = "serviceDescriptorId"; 470 final static String CHECKSUM = "checksum"; 471 472 } 473 474 } 475