/*******************************************************************************
* Copyright (c) 2006-2016, G. Weirich and Elexis
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* G. Weirich - initial implementation
* <office@medevit.at> - Share a common base
*******************************************************************************/
package ch.elexis.omnivore.data;
import static ch.elexis.omnivore.Constants.CATEGORY_MIMETYPE;
import static ch.elexis.omnivore.Constants.DEFAULT_CATEGORY;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.program.Program;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.lowagie.text.Document;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.pdf.PdfWriter;
import ch.elexis.core.constants.StringConstants;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.data.interfaces.text.IOpaqueDocument;
import ch.elexis.core.exceptions.ElexisException;
import ch.elexis.core.exceptions.PersistenceException;
import ch.elexis.core.ui.util.Log;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.data.Patient;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Query;
import ch.elexis.omnivore.dialog.FileImportDialog;
import ch.rgw.io.FileTool;
import ch.rgw.tools.ExHandler;
import ch.rgw.tools.JdbcLink;
import ch.rgw.tools.StringTool;
import ch.rgw.tools.TimeTool;
import ch.rgw.tools.VersionInfo;
public class DocHandle extends PersistentObject implements IOpaqueDocument {
private static Logger log = LoggerFactory.getLogger(DocHandle.class);
private TimeTool toStringTool = new TimeTool();
public static final String FLD_CAT = "Cat"; //$NON-NLS-1$
public static final String FLD_TITLE = "Titel"; //$NON-NLS-1$
public static final String FLD_MIMETYPE = "Mimetype"; //$NON-NLS-1$
public static final String FLD_DOC = "Doc"; //$NON-NLS-1$
public static final String FLD_PATH = "Path"; //$NON-NLS-1$
public static final String FLD_KEYWORDS = "Keywords"; //$NON-NLS-1$
public static final String FLD_PATID = "PatID"; //$NON-NLS-1$
public static final String FLD_CREATION_DATE = "CreationDate"; //$NON-NLS-1$
public static final String TABLENAME = "CH_ELEXIS_OMNIVORE_DATA"; //$NON-NLS-1$
public static final String DBVERSION = "2.0.4"; //$NON-NLS-1$
protected static final String VERSION = "1";
//@formatter:off
public static final String createDB =
"CREATE TABLE " + TABLENAME + " ("
+ "ID VARCHAR(25) primary key,"
+ "lastupdate BIGINT,"
+ "deleted CHAR(1) default '0',"
+ "PatID VARCHAR(25),"
+ "Datum CHAR(8),"
+ "CreationDate CHAR(8),"
+ "Category VARCHAR(80) default null,"
+ "Title VARCHAR(255),"
+ "Mimetype VARCHAR(255),"
+ "Keywords VARCHAR(255),"
+ "Path VARCHAR(255),"
+ "Doc BLOB);"
+ "CREATE INDEX OMN1 ON " + TABLENAME + " (PatID);"
+ "CREATE INDEX OMN2 ON " + TABLENAME + " (Keywords);"
+ "CREATE INDEX OMN3 ON " + TABLENAME + " (Category);"
+ "CREATE INDEX OMN4 ON " + TABLENAME + " (Mimetype);"
+ "CREATE INDEX OMN5 ON " + TABLENAME + " (deleted);"
+ "CREATE INDEX OMN6 ON " + TABLENAME + " (Title);"
+ "INSERT INTO " + TABLENAME + " (ID, TITLE) VALUES ('1','"+ DBVERSION + "');";
//@formatter:on
public static final String upd120 = "ALTER TABLE " + TABLENAME //$NON-NLS-1$
+ " MODIFY Mimetype VARCHAR(255);" + "ALTER TABLE " + TABLENAME //$NON-NLS-1$ //$NON-NLS-2$
+ " MODIFY Keywords VARCHAR(255);" + "ALTER TABLE " + TABLENAME //$NON-NLS-1$ //$NON-NLS-2$
+ " Modify Path VARCHAR(255);"; //$NON-NLS-1$
public static final String upd200 = "ALTER TABLE " + TABLENAME //$NON-NLS-1$
+ " ADD Category VARCHAR(80) default null;" //$NON-NLS-1$
+ "CREATE INDEX OMN3 ON " + TABLENAME + " (Category);" //$NON-NLS-1$ //$NON-NLS-2$
+ "ALTER TABLE " + TABLENAME + " MODIFY Title VARCHAR(255);"; //$NON-NLS-1$ //$NON-NLS-2$
public static final String upd201 = "ALTER TABLE " + TABLENAME //$NON-NLS-1$
+ " ADD lastupdate BIGINT default 0;"; //$NON-NLS-1$
public static final String upd202 = "CREATE INDEX OMN4 ON " + TABLENAME //$NON-NLS-1$
+ " (Mimetype);"; //$NON-NLS-1$
public static final String upd203 = "CREATE INDEX OMN5 ON " + TABLENAME //$NON-NLS-1$
+ " (deleted);" + "CREATE INDEX OMN6 ON " + TABLENAME + " (Title);"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
public static final String upd204 = "ALTER TABLE " + TABLENAME + " ADD CreationDate CHAR(8);";//$NON-NLS-1$
private static List<DocHandle> main_categories = null;
static {
addMapping(TABLENAME, FLD_PATID, FLD_CAT + "=Category", DATE_COMPOUND, //$NON-NLS-1$
FLD_CREATION_DATE + "=S:D:" + FLD_CREATION_DATE, FLD_TITLE + "=Title", FLD_KEYWORDS,
FLD_PATH, FLD_DOC, FLD_MIMETYPE);
DocHandle start = load(StringConstants.ONE);
if (!tableExists(TABLENAME)) {
init();
} else {
VersionInfo vi = new VersionInfo(start.get(FLD_TITLE));
if (vi.isOlder(DBVERSION)) {
if (vi.isOlder("1.1.0")) { //$NON-NLS-1$
getConnection().exec("ALTER TABLE " + TABLENAME //$NON-NLS-1$
+ " ADD deleted CHAR(1) default '0';"); //$NON-NLS-1$
}
if (vi.isOlder("1.2.0")) { //$NON-NLS-1$
createOrModifyTable(upd120);
}
if (vi.isOlder("2.0.0")) { //$NON-NLS-1$
createOrModifyTable(upd200);
}
if (vi.isOlder("2.0.1")) { //$NON-NLS-1$
createOrModifyTable(upd201);
}
if (vi.isOlder("2.0.2")) { //$NON-NLS-1$
createOrModifyTable(upd202);
}
if (vi.isOlder("2.0.3")) { //$NON-NLS-1$
createOrModifyTable(upd203);
}
if (vi.isOlder("2.0.4")) {
createOrModifyTable(upd204);
}
start.set(FLD_TITLE, DBVERSION);
}
}
}
public DocHandle(IOpaqueDocument doc) throws ElexisException{
create(doc.getGUID());
String category = doc.getCategory();
if (category == null || category.length() < 1) {
category = DocHandle.getDefaultCategory().getCategoryName();
} else {
DocHandle.ensureCategoryAvailability(category);
}
set(new String[] {
FLD_CAT, FLD_PATID, FLD_DATE, FLD_CREATION_DATE, FLD_TITLE, FLD_KEYWORDS, FLD_MIMETYPE
}, category, doc.getPatient().getId(), doc.getCreationDate(), doc.getCreationDate(),
doc.getTitle(), doc.getKeywords(), doc.getMimeType());
store(doc.getContentsAsBytes());
}
public DocHandle(String category, byte[] doc, Patient pat, String title, String mime,
String keyw){
this(category, doc, pat, new Date(), title, mime, keyw);
}
public DocHandle(String category, byte[] doc, Patient pat, Date creationDate, String title,
String mime, String keyw){
if ((doc == null) || (doc.length == 0)) {
SWTHelper.showError(Messages.DocHandle_readErrorCaption,
Messages.DocHandle_readErrorText);
return;
}
create(null);
if (category == null || category.length() < 1) {
category = DocHandle.getDefaultCategory().getCategoryName();
} else {
DocHandle.ensureCategoryAvailability(category);
}
if (creationDate == null) {
creationDate = new Date();
}
if (category == null || category.length() == 0) {
set(new String[] {
FLD_PATID, FLD_DATE, FLD_CREATION_DATE, FLD_TITLE, FLD_KEYWORDS, FLD_MIMETYPE
}, pat.getId(), new TimeTool().toString(TimeTool.DATE_GER),
new TimeTool(creationDate).toString(TimeTool.DATE_COMPACT), title, keyw, mime);
} else {
set(new String[] {
FLD_CAT, FLD_PATID, FLD_DATE, FLD_CREATION_DATE, FLD_TITLE, FLD_KEYWORDS,
FLD_MIMETYPE
}, category, pat.getId(), new TimeTool().toString(TimeTool.DATE_GER),
new TimeTool(creationDate).toString(TimeTool.DATE_COMPACT), title, keyw, mime);
}
store(doc);
}
@Override
protected String getTableName(){
return TABLENAME;
}
protected DocHandle(String id){
super(id);
}
protected DocHandle(){}
/**
* We need a default category as a fallback for invalid or not defined categories.
*
* @return the default category in case no other category is defined
*/
public static DocHandle getDefaultCategory(){
Query<DocHandle> qbe = new Query<DocHandle>(DocHandle.class);
qbe.add(FLD_MIMETYPE, Query.EQUALS, CATEGORY_MIMETYPE);
qbe.add(FLD_TITLE, Query.EQUALS, DEFAULT_CATEGORY);
List<DocHandle> qre = qbe.execute();
if (qre.size() < 1) {
addMainCategory(DEFAULT_CATEGORY);
return DocHandle.getDefaultCategory();
}
return qre.get(0);
}
/**
* Ensure that a certain requested category is available in the system. If the category is
* already here, nothing happens, else it is created
*
* @param categoryName
* the respective category name
*/
public static void ensureCategoryAvailability(String categoryName){
List<DocHandle> ldh = getMainCategories();
boolean found = false;
for (DocHandle dh : ldh) {
if (dh.get(FLD_TITLE).equalsIgnoreCase(categoryName)
|| dh.get(FLD_CAT).equalsIgnoreCase(categoryName)) {
found = true;
continue;
}
}
if (found) {
return;
} else {
DocHandle.addMainCategory(categoryName);
}
}
public static List<String> getMainCategoryNames(){
List<DocHandle> dox = getMainCategories();
ArrayList<String> ret = new ArrayList<String>(dox.size());
for (DocHandle doch : dox) {
ret.add(doch.get(FLD_TITLE));
}
return ret;
}
public static List<DocHandle> getMainCategories(){
if (main_categories == null) {
Query<DocHandle> qbe = new Query<DocHandle>(DocHandle.class);
qbe.add(FLD_MIMETYPE, Query.EQUALS, CATEGORY_MIMETYPE);
main_categories = qbe.execute();
}
return main_categories;
}
public static void addMainCategory(String name){
if (findCategory(name) == null) {
DocHandle dh = new DocHandle();
dh.create(null);
dh.set(new String[] {
FLD_TITLE, FLD_CAT, FLD_MIMETYPE
}, name, name, CATEGORY_MIMETYPE);
main_categories = null;
}
}
private static String findCategory(String name){
List<DocHandle> categories = getMainCategories();
for (DocHandle docHandle : categories) {
String catName = docHandle.getCategoryName().toLowerCase();
if (catName.equals(name.toLowerCase())) {
return docHandle.getCategory();
}
}
return null;
}
public static void renameCategory(String old, String newn){
String oldname = old.trim();
String newName = newn.trim();
if (findCategory(newName) == null) {
getConnection().exec("update CH_ELEXIS_OMNIVORE_DATA set Category="
+ JdbcLink.wrap(newName) + " where Category= " + JdbcLink.wrap(oldname));
getConnection().exec("update CH_ELEXIS_OMNIVORE_DATA set Title="
+ JdbcLink.wrap(newName) + " where Title=" + JdbcLink.wrap(oldname)
+ " and mimetype=" + JdbcLink.wrap("text/category"));
main_categories = null;
} else {
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
MessageDialog.openWarning(shell, Messages.Dochandle_errorCatNameAlreadyTaken,
MessageFormat.format(Messages.DocHandle_errorCatNameAlreadyTakenMsg, newName));
}
clearCache();
}
public static void removeCategory(String name, String destName){
getConnection().exec("update CH_ELEXIS_OMNIVORE_DATA set Category="
+ JdbcLink.wrap(destName) + " where Category= " + JdbcLink.wrap(name));
getConnection().exec("update CH_ELEXIS_OMNIVORE_DATA set deleted='1' where Title="
+ JdbcLink.wrap(name) + " AND mimetype=" + JdbcLink.wrap("text/category"));
main_categories = null;
}
/**
* Tabelle neu erstellen
*/
public static void init(){
createOrModifyTable(createDB);
}
public static DocHandle load(String id){
return new DocHandle(id);
}
private void store(byte[] doc){
try {
storeContent(doc);
} catch (PersistenceException e) {
SWTHelper.showError(Messages.DocHandle_writeErrorCaption,
Messages.DocHandle_writeErrorText + "; " + e.getMessage());
delete();
} catch (ElexisException e) {
ExHandler.handle(e);
SWTHelper.showError(Messages.DocHandle_73, Messages.DocHandle_writeErrorHeading,
MessageFormat.format(Messages.DocHandle_writeErrorText2 + e.getCause(),
e.getMessage()));
delete();
}
}
public void storeContent(byte[] doc) throws PersistenceException, ElexisException{
File file = getStorageFile(false);
if (file == null) {
setBinary(FLD_DOC, doc);
} else {
try (BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(file))) {
bout.write(doc);
}
catch (Exception e) {
throw new ElexisException(file.getAbsolutePath(), e);
}
}
}
/**
* If force is set or the preference Preferences.STOREFS is true a new File object is created.
* Else the file is a BLOB in the db and null is returned.
*
* The path of the new file will be: Preferences.BASEPATH/PatientCode/
*
* The name of the new file will be: PersistentObjectId.FileExtension
*
* @param force
* access to the file system
* @return File to read from, or write to, or null
*/
public File getStorageFile(boolean force){
if (force || Preferences.storeInFilesystem()) {
String pathname = Preferences.getBasepath();
if (pathname != null) {
File dir = new File(pathname);
if (dir.isDirectory()) {
Patient pat = Patient.load(get(FLD_PATID));
File subdir = new File(dir, pat.getPatCode());
if (!subdir.exists()) {
subdir.mkdir();
}
File file = new File(subdir, getId() + "." //$NON-NLS-1$
+ FileTool.getExtension(get(FLD_MIMETYPE)));
return file;
}
}
if (Preferences.storeInFilesystem()) {
configError();
}
}
return null;
}
public String getCategoryName(){
return checkNull(get(FLD_CAT));
}
public boolean isCategory(){
return get(FLD_MIMETYPE).equals(CATEGORY_MIMETYPE);
}
public DocHandle getCategoryDH(){
String name = getCategoryName();
if (!StringTool.isNothing(name)) {
List<DocHandle> ret = new Query<DocHandle>(DocHandle.class, FLD_TITLE, name).execute();
if (ret != null && ret.size() > 0) {
return ret.get(0);
}
}
return null;
}
public List<DocHandle> getMembers(Patient pat){
Query<DocHandle> qbe = new Query<DocHandle>(DocHandle.class, FLD_CAT, get(FLD_TITLE));
if (pat != null) {
qbe.add(FLD_PATID, Query.EQUALS, pat.getId());
}
return qbe.execute();
}
@Override
public String getLabel(){
StringBuilder sb = new StringBuilder();
// avoid adding only a space - causes trouble in renaming of categories
String date = get(FLD_DATE);
if (date != null && !date.isEmpty()) {
sb.append(get(FLD_DATE));
sb.append(StringConstants.SPACE);
}
sb.append(get(FLD_TITLE));
return sb.toString();
}
public String getTitle(){
return get(FLD_TITLE);
}
public String getKeywords(){
return get(FLD_KEYWORDS);
}
public String getDate(){
toStringTool.set(get(FLD_DATE));
return toStringTool.toString(TimeTool.DATE_GER);
}
public void setDate(Date d){
TimeTool tt = new TimeTool();
tt.setTime(d);
set(FLD_DATE, tt.toString(TimeTool.DATE_COMPACT));
}
@Override
public String getCreationDate(){
toStringTool.set(get(FLD_CREATION_DATE));
return toStringTool.toString(TimeTool.DATE_GER);
}
public void setCreationDate(Date d){
TimeTool tt = new TimeTool();
tt.setTime(d);
set(FLD_CREATION_DATE, tt.toString(TimeTool.DATE_COMPACT));
}
public byte[] getContents(){
byte[] ret = getBinary(FLD_DOC);
if (ret == null) {
File file = getStorageFile(true);
if (file != null) {
try {
byte[] bytes = Files.readAllBytes(Paths.get(file.toURI()));
// if we stored the file in the file system but decided
// later to store it in the
// database: copy the file from the file system to the
// database
if (!Preferences.storeInFilesystem()) {
try {
setBinary(FLD_DOC, bytes);
} catch (PersistenceException pe) {
SWTHelper.showError(Messages.DocHandle_readErrorCaption,
Messages.DocHandle_importErrorText + "; " + pe.getMessage());
}
}
return bytes;
} catch (Exception ex) {
ExHandler.handle(ex);
SWTHelper.showError(Messages.DocHandle_readErrorHeading,
Messages.DocHandle_importError2,
MessageFormat.format(Messages.DocHandle_importErrorText2 + ex.getMessage(),
file.getAbsolutePath()));
}
}
}
return ret;
}
public void execute(){
try {
String ext = StringConstants.SPACE; //""; //$NON-NLS-1$
File temp = createTemporaryFile(null);
Program proggie = Program.findProgram(ext);
if (proggie != null) {
proggie.execute(temp.getAbsolutePath());
} else {
if (Program.launch(temp.getAbsolutePath()) == false) {
Runtime.getRuntime().exec(temp.getAbsolutePath());
}
}
} catch (Exception ex) {
ExHandler.handle(ex);
SWTHelper.showError(Messages.DocHandle_runErrorHeading, ex.getMessage());
}
}
/**
* create a temporary file
*
* @return temporary file
*/
public File createTemporaryFile(String title){
String ext = "";
String typname = get(FLD_MIMETYPE);
int r = typname.lastIndexOf('.');
if (r == -1) {
typname = get(FLD_TITLE);
r = typname.lastIndexOf('.');
}
if (r != -1)
ext = typname.substring(r + 1);
// use title if given
StringBuffer config_temp_filename = new StringBuffer();
if (title != null && !title.isEmpty()) {
config_temp_filename.append(title);
}
File temp = null;
try {
if (config_temp_filename.length() > 0) {
File uniquetemp =
File.createTempFile(config_temp_filename.toString() + "_", "." + ext); //$NON-NLS-1$ //$NON-NLS-2$
String temp_pathname = uniquetemp.getParent();
uniquetemp.delete();
log.debug(temp_pathname);
log.debug(config_temp_filename + "." + ext);
temp = new File(temp_pathname, config_temp_filename + "." + ext);
temp.createNewFile();
} else {
temp = File.createTempFile("omni_", "_vore." + ext);
}
temp.deleteOnExit();
byte[] b = getContents(); // getBinary(FLD_DOC);
if (b == null) {
SWTHelper.showError(Messages.DocHandle_readErrorCaption2,
Messages.DocHandle_loadErrorText);
return temp;
}
try (FileOutputStream fos = new FileOutputStream(temp)) {
fos.write(b);
}
} catch (FileNotFoundException e) {
log.debug("File not found " + e, Log.WARNINGS);
} catch (IOException e) {
log.debug("Error creating file " + e, Log.WARNINGS);
}
return temp;
}
public String getMimetype(){
return get(FLD_MIMETYPE);
}
public boolean storeExternal(String filename){
byte[] b = getContents();
if (b == null) {
SWTHelper.showError(Messages.DocHandle_readErrorCaption2,
Messages.DocHandle_couldNotLoadError);
return false;
}
try (FileOutputStream fos = new FileOutputStream(filename)) {
fos.write(b);
return true;
} catch (IOException ios) {
ExHandler.handle(ios);
SWTHelper.showError(Messages.DocHandle_writeErrorCaption2,
Messages.DocHandle_writeErrorCaption2, ios.getMessage());
return false;
}
}
public static List<DocHandle> assimilate(List<ImageData> images){
List<DocHandle> ret = new ArrayList<DocHandle>();
FileImportDialog fid = new FileImportDialog(Messages.DocHandle_scannedImageDialogCaption);
if (fid.open() == Dialog.OK) {
try {
Document pdf = new Document(PageSize.A4);
pdf.setMargins(0, 0, 0, 0);
ByteArrayOutputStream baos = new ByteArrayOutputStream(100000);
PdfWriter.getInstance(pdf, baos);
pdf.open();
ImageLoader il = new ImageLoader();
for (int i = 0; i < images.size(); i++) {
ImageData[] id = new ImageData[] {
images.get(i)
};
il.data = id;
ByteArrayOutputStream bimg = new ByteArrayOutputStream();
il.save(bimg, SWT.IMAGE_PNG);
Image image = Image.getInstance(bimg.toByteArray());
int width = id[0].width;
int height = id[0].height;
// 210mm = 8.27 In = 595 px bei 72dpi
// 297mm = 11.69 In = 841 px
if ((width > 595) || (height > 841)) {
image.scaleToFit(595, 841);
}
pdf.add(image);
}
pdf.close();
DocHandle docHandle = new DocHandle(fid.category, baos.toByteArray(),
ElexisEventDispatcher.getSelectedPatient(), fid.originDate, fid.title,
"image.pdf", fid.keywords); //$NON-NLS-1$
ret.add(docHandle);
} catch (Exception ex) {
ExHandler.handle(ex);
SWTHelper.showError(Messages.DocHandle_readError,
Messages.DocHandle_readErrorText2);
}
}
return ret;
}
public static DocHandle assimilate(String f){
Patient act = ElexisEventDispatcher.getSelectedPatient();
if (act == null) {
SWTHelper.showError(Messages.DocHandle_noPatientSelected,
Messages.DocHandle_pleaseSelectPatient);
return null;
}
File file = new File(f);
if (!file.canRead()) {
SWTHelper.showError(Messages.DocHandle_cantReadCaption,
MessageFormat.format(Messages.DocHandle_cantReadText, f));
return null;
}
// can't import complete directory
if (file.isDirectory()) {
SWTHelper.showError(Messages.DocHandle_importErrorDirectory,
Messages.DocHandle_importErrorDirectoryText);
return null;
}
FileImportDialog fid = new FileImportDialog(file.getName());
if (fid.open() == Dialog.OK) {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
ByteArrayOutputStream baos = new ByteArrayOutputStream();) {
int in;
while ((in = bis.read()) != -1) {
baos.write(in);
}
String nam = file.getName();
if (nam.length() > 255) {
SWTHelper.showError(Messages.DocHandle_readErrorCaption3,
Messages.DocHandle_fileNameTooLong);
return null;
}
String category = fid.category;
if (category == null || category.length() == 0) {
category = DocHandle.getDefaultCategory().getCategoryName();
}
DocHandle dh = new DocHandle(category, baos.toByteArray(), act, fid.originDate,
fid.title, file.getName(), fid.keywords);
if (Preferences.getDateModifiable()) {
dh.setDate(fid.saveDate);
dh.setCreationDate(fid.originDate);
}
return dh;
} catch (Exception ex) {
ExHandler.handle(ex);
SWTHelper.showError(Messages.DocHandle_readErrorCaption3,
Messages.DocHandle_readErrorText2);
}
}
return null;
}
public static DocHandle assimilate(String f, String selectedCategory){
Patient act = ElexisEventDispatcher.getSelectedPatient();
if (act == null) {
SWTHelper.showError(Messages.DocHandle_noPatientSelected,
Messages.DocHandle_pleaseSelectPatient);
return null;
}
File file = new File(f);
if (!file.canRead()) {
SWTHelper.showError(Messages.DocHandle_cantReadCaption,
MessageFormat.format(Messages.DocHandle_cantReadMessage, f));
return null;
}
// can't import complete directory
if (file.isDirectory()) {
SWTHelper.showError(Messages.DocHandle_importErrorDirectory,
Messages.DocHandle_importErrorDirectoryText);
return null;
}
Integer maxOmnivoreFilenameLength = Preferences.getOmnivoreMax_Filename_Length();
String nam = file.getName();
if (nam.length() > maxOmnivoreFilenameLength) {
SWTHelper.showError(Messages.DocHandle_importErrorCaption, MessageFormat
.format(Messages.DocHandle_importErrorMessage, maxOmnivoreFilenameLength));
return null;
}
FileImportDialog fid;
if (selectedCategory == null) {
fid = new FileImportDialog(file.getName());
} else {
fid = new FileImportDialog(file.getName(), selectedCategory);
}
DocHandle dh = null;
if (fid.open() == Dialog.OK) {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
int in;
while ((in = bis.read()) != -1) {
baos.write(in);
}
String fileName = file.getName();
if (fileName.length() > 255) {
SWTHelper.showError(Messages.DocHandle_readErrorCaption,
Messages.DocHandle_fileNameTooLong);
return null;
}
String category = fid.category;
if (category == null || category.length() == 0) {
category = DocHandle.getDefaultCategory().getCategoryName();
}
dh = new DocHandle(category, baos.toByteArray(), act, fid.title.trim(),
file.getName(), fid.keywords.trim());
} catch (Exception ex) {
ExHandler.handle(ex);
SWTHelper.showError(Messages.DocHandle_importErrorCaption,
Messages.DocHandle_importErrorMessage2);
return null;
}
try {
for (Integer i = 0; i < Preferences.getOmnivorenRulesForAutoArchiving(); i++) {
String SrcPattern = Preferences.getOmnivoreRuleForAutoArchivingSrcPattern(i);
String DestDir = Preferences.getOmnivoreRuleForAutoArchivingDestDir(i);
if ((SrcPattern != null) && (DestDir != null)
&& ((SrcPattern != "" || DestDir != ""))) {
log.debug("Automatic archiving found matching rule #" + (i + 1)
+ " (1-based index):");
log.debug("file.getAbsolutePath(): " + file.getAbsolutePath());
log.debug("Pattern: " + SrcPattern);
log.debug("DestDir: " + DestDir);
if (file.getAbsolutePath().contains(SrcPattern)) {
log.debug("SrcPattern found in file.getAbsolutePath()" + i);
if (DestDir == "") {
log.debug(
"DestDir is empty. No more rules will be evaluated for this file. Returning.");
return dh;
}
File newFile = new File(DestDir);
if (newFile.isDirectory()) {
log.debug("DestDir is a directory. Adding file.getName()...");
newFile = new File(DestDir + File.separatorChar + file.getName());
}
if (newFile.isDirectory()) {
log.debug("NewFile.isDirectory==true; renaming not attempted");
SWTHelper.showError(Messages.DocHandle_MoveErrorCaption,
MessageFormat.format(Messages.DocHandle_MoveErrorDestIsDir,
DestDir, file.getName()));
} else {
if (newFile.isFile()) {
log.debug("NewFile.isFile==true; renaming not attempted");
SWTHelper.showError(Messages.DocHandle_MoveErrorCaption,
MessageFormat.format(Messages.DocHandle_MoveErrorDestIsFile,
DestDir, file.getName()));
} else {
log.debug(
"renaming incoming file to: " + newFile.getAbsolutePath());
if (Files.move(file.toPath(), newFile.toPath(),
REPLACE_EXISTING) != null) {
log.debug("renaming ok");
} else {
log.debug("renaming attempted, but returned false.");
log.debug(
"However, I may probably have observed this after successful moves?! So I won't show an error dialog here. js");
log.debug(
"So I won't show an error dialog here; if a real exception occured, that would suffice to trigger it.");
// SWTHelper.showError(Messages.DocHandleMoveErrorCaption,Messages.DocHandleMoveError);
}
}
}
break;
}
}
}
} catch (Throwable throwable) {
ExHandler.handle(throwable);
SWTHelper.showError(Messages.DocHandle_MoveErrorCaption,
Messages.DocHandle_MoveError);
}
}
return dh;
}
private void configError(){
SWTHelper.showError("config error", Messages.DocHandle_configErrorCaption, //$NON-NLS-1$
Messages.DocHandle_configErrorText);
}
// IDocument
@Override
public String getCategory(){
return getCategoryName();
}
@Override
public String getMimeType(){
return checkNull(get(FLD_MIMETYPE));
}
@Override
public Patient getPatient(){
return Patient.load(get(FLD_PATID));
}
@Override
public InputStream getContentsAsStream() throws ElexisException{
return new ByteArrayInputStream(getContents());
}
@Override
public byte[] getContentsAsBytes() throws ElexisException{
return getContents();
}
@Override
public String getGUID(){
return getId();
}
/**
* Move the DocHandle from the db to the file system and delete the BLOB afterwards.
*/
public boolean exportToFileSystem(){
byte[] doc = getBinary(FLD_DOC);
// return true if doc is already on file system
if (doc == null)
return true;
File file = getStorageFile(true);
try (BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(file))) {
bout.write(doc);
setBinary(FLD_DOC, null);
} catch (IOException ios) {
ExHandler.handle(ios);
SWTHelper.showError(Messages.DocHandle_writeErrorCaption2,
Messages.DocHandle_writeErrorCaption2, ios.getMessage());
return false;
}
return true;
}
}