package ch.elexis.core.ui.commands;
import java.io.File;
import java.io.FileInputStream;
import java.util.List;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.ui.dialogs.TextTemplateImportConflictDialog;
import ch.elexis.core.ui.text.ITextPlugin;
import ch.elexis.core.ui.text.MimeTypeUtil;
import ch.elexis.core.ui.views.textsystem.TextTemplateView;
import ch.elexis.core.ui.views.textsystem.model.TextTemplate;
import ch.elexis.data.Brief;
import ch.elexis.data.Mandant;
import ch.elexis.data.Query;
import ch.rgw.tools.ExHandler;
public class ImportTemplatesCommand extends AbstractHandler {
private static Logger logger = LoggerFactory.getLogger(ImportTemplatesCommand.class);
private String mandantId = null;
@Override
public Object execute(ExecutionEvent event) throws ExecutionException{
Mandant mandant = ElexisEventDispatcher.getSelectedMandator();
if (mandant == null) {
return null;
}
mandantId = mandant.getId();
IWorkbenchPage activePage =
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
TextTemplateView ttView = (TextTemplateView) activePage.findView(TextTemplateView.ID);
ITextPlugin plugin = ttView.getActiveTextPlugin();
if (plugin == null) {
logger.warn("No TextPlugin found - skipping text template import");
return null;
}
try {
String mimeType = plugin.getMimeType();
FileDialog fdl = new FileDialog(UiDesk.getTopShell(), SWT.MULTI);
fdl.setFilterExtensions(new String[] {
MimeTypeUtil.getExtensions(mimeType)
});
fdl.setFilterNames(new String[] {
MimeTypeUtil.getPrettyPrintName(mimeType)
});
fdl.open();
String[] fileNames = fdl.getFileNames();
String filterPath = fdl.getFilterPath() + File.separator;
if (fileNames.length > 0) {
for (String filename : fileNames) {
File file = new File(filterPath + filename);
if (file.exists()) {
String name = filename.substring(0, filename.lastIndexOf('.'));
TextTemplate sysTemplate = matchesRequiredSystemTemplate(
ttView.getRequiredTextTemplates(), name, mimeType);
// check existence of same template
List<Brief> equivalentTemplates =
findExistingEquivalentTemplates(sysTemplate != null, name, mimeType);
boolean replaceExisting = false;
if (equivalentTemplates != null && !equivalentTemplates.isEmpty()) {
TextTemplateImportConflictDialog ttiConflictDialog =
new TextTemplateImportConflictDialog(UiDesk.getTopShell(), name);
ttiConflictDialog.open();
if (ttiConflictDialog.doSkipTemplate()) {
continue;
} else if (ttiConflictDialog.doChangeTemplateName()) {
name = ttiConflictDialog.getNewName();
} else {
replaceExisting = true;
}
}
// perform the actual import
FileInputStream fis = new FileInputStream(file);
byte[] contentToStore = new byte[(int) file.length()];
fis.read(contentToStore);
fis.close();
if (replaceExisting) {
// only switch template content
if (equivalentTemplates instanceof List) {
equivalentTemplates.get(0).save(contentToStore, mimeType);
} else {
logger.error(
"Invalid state: equivalentTemplates is " + equivalentTemplates);
}
} else {
Brief template =
new Brief(name, null, CoreHub.actUser, null, null, Brief.TEMPLATE);
template.save(contentToStore, mimeType);
// add general form tempalte
if (sysTemplate == null) {
template.setAdressat(mandant.getId());
TextTemplate tt = new TextTemplate(name, "", mimeType);
tt.addFormTemplateReference(template);
ttView.update(tt);
} else {
// add system template
sysTemplate.addSystemTemplateReference(template);
ttView.update(sysTemplate);
}
}
}
}
}
} catch (Throwable ex) {
ExHandler.handle(ex);
logger.error("Error during import of text templates", ex);
}
return null;
}
private TextTemplate matchesRequiredSystemTemplate(List<TextTemplate> reqTextTemplates,
String name, String mimeType){
for (TextTemplate sysTemplate : reqTextTemplates) {
// same name and mimetype as required text template
if (sysTemplate.getName().equals(name) && sysTemplate.getMimeType().equals(mimeType)) {
if (MessageDialog.openQuestion(UiDesk.getTopShell(), "Systemvorlage",
"Soll " + name + " als Systemvorlage importiert werden?")) {
return sysTemplate;
}
return null;
}
}
return null;
}
private List<Brief> findExistingEquivalentTemplates(boolean isSysTemplate, String name,
String mimeType){
Query<Brief> qbe = new Query<Brief>(Brief.class);
qbe.add(Brief.FLD_SUBJECT, Query.EQUALS, name);
qbe.add(Brief.FLD_MIME_TYPE, Query.EQUALS, mimeType);
qbe.add(Brief.FLD_TYPE, Query.EQUALS, Brief.TEMPLATE);
// treat as system template
if (isSysTemplate) {
qbe.addToken(Brief.FLD_DESTINATION_ID + " is NULL");
} else {
// treat as form template
qbe.add(Brief.FLD_DESTINATION_ID, Query.EQUALS, mandantId);
}
return qbe.execute();
}
}