/*******************************************************************************
* Copyright (c) 2011-2016 Medevit OG, Medelexis AG
* 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:
* Marco Descher, initial API and implementaion
* Lucia Amman, bug fixes and improvements
* Sponsors: M. + P. Richter
*******************************************************************************/
package at.medevit.elexis.gdt.tools;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ui.statushandlers.StatusManager;
import at.medevit.elexis.gdt.Activator;
import at.medevit.elexis.gdt.constants.GDTConstants;
import at.medevit.elexis.gdt.constants.GDTPreferenceConstants;
import at.medevit.elexis.gdt.interfaces.IGDTCommunicationPartner;
import at.medevit.elexis.gdt.messages.GDTSatzNachricht;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.ui.util.Log;
public class GDTFileHelper {
private static Log logger = Log.get(GDTFileHelper.class.getName());
static DecimalFormat threePlaces = new DecimalFormat("000");
/**
* Identifies a file being a GDT Satznachricht or not
*
* @param file
* @return boolean if file contains a SatzNachricht
*/
public static boolean containsSatzNachricht(File file){
try {
List<String> contents = FileUtils.readLines(file);
if (contents.size() == 0)
return false;
if (contents.get(0).substring(3, 7).equalsIgnoreCase("8000"))
return true;
} catch (IOException e) {
return false;
}
return false;
}
public static <U extends GDTSatzNachricht> boolean writeGDTSatzNachricht(U gdtSatzNachricht,
IGDTCommunicationPartner cp){
String[] outLines = gdtSatzNachricht.getMessage();
String zeichensatz = GDTConstants.getCharsetStringByInt(cp.getOutgoingDefaultCharset());
String directory = cp.getOutgoingDirectory();
String outgoingFileName = determineOutgoingFileName(cp);
try {
File destination = new File(directory + File.separatorChar + outgoingFileName);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < outLines.length; i++) {
sb.append(outLines[i]);
}
FileUtils.writeStringToFile(destination, sb.toString(), zeichensatz);
} catch (IOException e) {
String message = "GDT: Fehler beim Schreiben der Ausgangsdatei " + outgoingFileName;
Status status = new Status(IStatus.WARNING, Activator.PLUGIN_ID, message, e);
StatusManager.getManager().handle(status, StatusManager.SHOW);
logger.log(e, message, Log.WARNINGS);
return false;
}
return true;
}
public static String determineOutgoingFileName(IGDTCommunicationPartner cp){
String directory = cp.getOutgoingDirectory();
String filenameHeader =
cp.getShortIDReceiver()
+ CoreHub.localCfg.get(GDTPreferenceConstants.CFG_GDT_FILETRANSFER_SHORTNAME,
GDTConstants.GDT_SHORT_ID_DEFAULT);
String filename = null;
if (cp.getRequiredFileType().equalsIgnoreCase(GDTConstants.GDT_FILETRANSFER_TYP_FEST)) {
if (cp.getFixedCommmunicationFileName() != null) {
filename = cp.getFixedCommmunicationFileName();
} else {
filename = filenameHeader + ".GDT";
}
} else if (cp.getRequiredFileType().equalsIgnoreCase(
GDTConstants.GDT_FILETRANSFER_TYPE_HOCHZAEHLEND)) {
int counter = 0;
while (true) {
filename = filenameHeader + "." + threePlaces.format(counter);
File file = new File(directory + File.separatorChar + filename);
if (file.exists()) {
counter++;
} else {
break;
}
}
} else {
logger.log("Invalid file transfer type returned, neither fest nor hochzaehlend!",
Log.ERRORS);
}
return filename;
}
}