package jpaoletti.jpm.struts.converter;
import java.io.File;
import jpaoletti.jpm.converter.ConverterException;
import jpaoletti.jpm.converter.IgnoreConvertionException;
import jpaoletti.jpm.core.PMContext;
import org.apache.commons.fileupload.FileItem;
/**
*
* class="jpaoletti.jpm.struts.converter.EditFileConverter"
*
* Properties:
*
* * mode: bytes / file
*
* * filename
*
* * not-null
*
* * measure: b(ytes) / k(bytes) / m(bytes)
*
* @author jpaoletti
*/
public class EditFileConverter extends DefaultStrutsConverter {
@Override
public Object visualize(PMContext ctx) throws ConverterException {
Object file = ctx.getFieldValue();
if (file == null) {
file = getValue(ctx.getEntityInstance(), ctx.getField());
}
final String mode = getConfig("mode", "file");
if (mode.equals("file")) {
if (file != null) {
return super.visualize("file.jsp?text=" + ((File) file).getName());
} else {
return super.visualize("file.jsp?text=" + ctx.getPresentationManager().message("file.converter.null.file.text"));
}
} else if (mode.equals("bytes")) {
final byte[] bytes = (byte[]) file;
if (file != null && bytes.length > 0) {
final String measure = getConfig("measure", "k");
String len;
switch (measure.charAt(0)) {
case 'b':
len = bytes.length + " bytes";
break;
case 'm':
len = (bytes.length / 1024 / 1024) + " Mb";
break;
case 'k':
;
default:
len = (bytes.length / 1024) + "Kb";
}
return super.visualize("file.jsp?delete=true&text=" + ctx.getPresentationManager().message("file.converter.bytes.text", len) + "&accept=" + getConfig("accept", ""));
} else {
return super.visualize("file.jsp?delete=false&text=" + ctx.getPresentationManager().message("file.converter.null.file.text") + "&accept=" + getConfig("accept", ""));
}
} else {
throw new ConverterException("file.converter.misconfigured.mode");
}
}
@Override
public Object build(PMContext ctx) throws ConverterException {
try {
if (!(ctx.getFieldValue() instanceof FileItem)) {
throw new ConverterException("file.converter.error.not.file");
}
final FileItem item = (FileItem) ctx.getFieldValue();
if (!ctx.getParameter("f_" + ctx.getField().getId() + "_delete", "false").equals("true")) {
//If not deleting and item is empty, ignore conversion to keep actual
if (item == null || item.getSize() == 0) {
throw new IgnoreConvertionException();
} else {
final String mode = getConfig("mode", "file");
if (mode.equals("file")) {
final String filename = getConfig("filename");
if (filename == null) {
throw new ConverterException("file.converter.misconfigured.filename");
}
final File file = new File(filename);
item.write(file);
return file;
} else if (mode.equals("bytes")) {
return item.get();
} else {
throw new ConverterException("file.converter.misconfigured.mode");
}
}
} else {
if (getConfig("not-null", "false").equals("true")) {
throw new ConverterException("file.converter.error.null");
} else {
return null;
}
}
} catch (IgnoreConvertionException e) {
throw e;
} catch (ConverterException e) {
throw e;
} catch (Exception e) {
throw new ConverterException("file.converter.error");
}
}
}