/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.api.impl;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openmrs.api.APIException;
import org.openmrs.api.SerializationService;
import org.openmrs.api.context.Context;
import org.openmrs.serialization.OpenmrsSerializer;
import org.openmrs.serialization.SerializationException;
import org.openmrs.util.OpenmrsConstants;
import org.springframework.transaction.annotation.Transactional;
/**
* Contains methods for retrieving registered OpenmrsSerializer instances, and for
* persisting/retrieving/deleting objects using serialization
*/
@Transactional
public class SerializationServiceImpl extends BaseOpenmrsService implements SerializationService {
public Log log = LogFactory.getLog(this.getClass());
//***** Properties (set by spring)
private static Map<Class<? extends OpenmrsSerializer>, OpenmrsSerializer> serializerMap;
//***** Service method implementations *****
/**
* @see org.openmrs.api.SerializationService#getSerializer(java.lang.Class)
*/
public OpenmrsSerializer getSerializer(Class<? extends OpenmrsSerializer> serializationClass) {
if (serializerMap != null) {
return serializerMap.get(serializationClass);
}
return null;
}
/**
* @see org.openmrs.api.SerializationService#getDefaultSerializer()
*/
public OpenmrsSerializer getDefaultSerializer() {
String prop = Context.getAdministrationService().getGlobalProperty(
OpenmrsConstants.GLOBAL_PROPERTY_DEFAULT_SERIALIZER);
try {
Class<?> clazz = Context.loadClass(prop);
if (clazz != null && OpenmrsSerializer.class.isAssignableFrom(clazz)) {
return (OpenmrsSerializer) clazz.newInstance();
}
}
catch (Exception e) {
log.warn("No default serializer specified - trying first serializer found.");
}
if (serializerMap != null && !serializerMap.isEmpty()) {
return serializerMap.values().iterator().next();
}
return null;
}
/**
* @see org.openmrs.api.SerializationService#serialize(java.lang.Object, java.lang.Class)
*/
public String serialize(Object o, Class<? extends OpenmrsSerializer> clazz) throws SerializationException {
// Get appropriate OpenmrsSerializer implementation
OpenmrsSerializer serializer = getSerializer(clazz);
if (serializer == null) {
throw new SerializationException("OpenmrsSerializer of class <" + clazz + "> not found.");
}
// Attempt to Serialize the object
try {
return serializer.serialize(o);
}
catch (Throwable t) {
throw new SerializationException("An error occurred during serialization of object <" + o + ">", t);
}
}
/**
* @see org.openmrs.api.SerializationService#deserialize(java.lang.String, java.lang.Class,
* java.lang.Class)
*/
public <T extends Object> T deserialize(String serializedObject, Class<? extends T> objectClass,
Class<? extends OpenmrsSerializer> serializerClass) throws SerializationException {
// Get appropriate OpenmrsSerializer implementation
OpenmrsSerializer serializer = getSerializer(serializerClass);
if (serializer == null) {
throw new APIException("OpenmrsSerializer of class <" + serializerClass + "> not found.");
}
// Attempt to Deserialize the object
try {
return (T) serializer.deserialize(serializedObject, objectClass);
}
catch (Throwable t) {
String msg = "An error occurred during deserialization of data <" + serializedObject + ">";
throw new SerializationException(msg, t);
}
}
//***** Property access *****
/**
* @return the serializers
*/
public List<? extends OpenmrsSerializer> getSerializers() {
if (serializerMap == null) {
serializerMap = new LinkedHashMap<Class<? extends OpenmrsSerializer>, OpenmrsSerializer>();
}
return new ArrayList<OpenmrsSerializer>(serializerMap.values());
}
/**
* @param serializers the serializers to set
* @should not reset serializers list when called multiple times
*/
public void setSerializers(List<? extends OpenmrsSerializer> serializers) {
if (serializers == null || serializerMap == null) {
serializerMap = new LinkedHashMap<Class<? extends OpenmrsSerializer>, OpenmrsSerializer>();
}
if (serializers != null) {
for (OpenmrsSerializer s : serializers) {
serializerMap.put(s.getClass(), s);
}
}
}
}