/**
* 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.obs.handler;
import java.io.File;
import java.io.IOException;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openmrs.Obs;
import org.openmrs.api.context.Context;
import org.openmrs.obs.ComplexData;
import org.openmrs.util.OpenmrsConstants;
import org.openmrs.util.OpenmrsUtil;
/**
* Abstract handler for some convenience methods Files are stored in the location specified by the
* global property: "obs.complex_obs_dir"
*
* @since 1.5
*/
public class AbstractHandler {
public static final Log log = LogFactory.getLog(TextHandler.class);
protected NumberFormat nf;
protected SimpleDateFormat longfmt;
/**
* Constructor initializes formats for alternative file names to protect from unintentionally
* overwriting existing files.
*/
public AbstractHandler() {
nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(0);
nf.setMinimumIntegerDigits(2);
longfmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
}
/**
* Returns a {@link File} for the given obs complex data to be written to. The output file
* location is determined off of the {@link OpenmrsConstants#GLOBAL_PROPERTY_COMPLEX_OBS_DIR}
* and the file name is determined off the current obs.getComplexData().getTitle().
*
* @param obs the Obs with a non-null complex data on it
* @return File that the complex data should be written to
*/
public File getOutputFileToWrite(Obs obs) throws IOException {
// Get the title and remove the extension.
String t = obs.getComplexData().getTitle();
String extension = getExtension(t);
String title = obs.getComplexData().getTitle().replace("." + extension, "");
File dir = OpenmrsUtil.getDirectoryInApplicationDataDirectory(Context.getAdministrationService().getGlobalProperty(
OpenmrsConstants.GLOBAL_PROPERTY_COMPLEX_OBS_DIR));
File outputfile = null;
// Get the output stream
if (null == title) {
String now = longfmt.format(new Date());
outputfile = new File(dir, now);
} else {
outputfile = new File(dir, title + "." + extension);
// outputfile = new File(dir, title);
}
int i = 0;
String tmp = null;
// If the Obs does not exist, but the File does, append a two-digit
// count number to the filename and save it.
while (obs.getObsId() == null && outputfile.exists() && i < 100) {
tmp = null;
// Remove the extension from the filename.
tmp = new String(outputfile.getAbsolutePath().replace("." + extension, ""));
outputfile = null;
// Append two-digit count number to the filename.
String filename = (i < 1) ? tmp + "_" + nf.format(Integer.valueOf(++i)) : tmp.replace(nf.format(Integer
.valueOf(i)), nf.format(Integer.valueOf(++i)));
// Append the extension to the filename.
outputfile = new File(filename + "." + extension);
}
return outputfile;
}
/**
* Get the extension for a given filename. <br/>
* If given "asdf.jpg", will return "jpg". <br/>
* If given "asdf", will return "asdf". <br/>
*
* @param filename
* @return the filepart after the period in the given filename
*/
public String getExtension(String filename) {
String[] filenameParts = filename.split("\\.");
log.debug("titles length: " + filenameParts.length);
String extension = (filenameParts.length < 2) ? filenameParts[0] : filenameParts[filenameParts.length - 1];
extension = (null != extension && !"".equals(extension)) ? extension : "raw";
return extension;
}
/**
* @see org.openmrs.obs.ComplexObsHandler#getObs(Obs, String)
*/
public Obs getObs(Obs obs, String view) {
File file = TextHandler.getComplexDataFile(obs);
log.debug("value complex: " + obs.getValueComplex());
log.debug("file path: " + file.getAbsolutePath());
ComplexData complexData = null;
try {
complexData = new ComplexData(file.getName(), OpenmrsUtil.getFileAsBytes(file));
}
catch (IOException e) {
log.error("Trying to read file: " + file.getAbsolutePath(), e);
}
obs.setComplexData(complexData);
return obs;
}
/**
* @see org.openmrs.obs.ComplexObsHandler#purgeComplexData(org.openmrs.Obs)
*/
public boolean purgeComplexData(Obs obs) {
File file = getComplexDataFile(obs);
if (file.exists() && file.delete()) {
obs.setComplexData(null);
// obs.setValueComplex(null);
return true;
}
log.warn("Could not delete complex data object for obsId=" + obs.getObsId() + " located at "
+ file.getAbsolutePath());
return false;
}
/**
* Convenience method to create and return a file for the stored ComplexData.data Object
*
* @param obs
* @return File object
*/
public static File getComplexDataFile(Obs obs) {
String[] names = obs.getValueComplex().split("\\|");
String filename = names.length < 2 ? names[0] : names[names.length - 1];
File dir = OpenmrsUtil.getDirectoryInApplicationDataDirectory(Context.getAdministrationService().getGlobalProperty(
OpenmrsConstants.GLOBAL_PROPERTY_COMPLEX_OBS_DIR));
return new File(dir, filename);
}
}