package open.dolphin.impl.labrcv; import java.awt.Window; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import javax.swing.TransferHandler; import open.dolphin.client.ClientContext; import open.dolphin.client.LabResultParser; import open.dolphin.delegater.LaboDelegater; import open.dolphin.infomodel.PatientLiteModel; /** * LaboTestFileTransferHandler * * @author kazushi Minagawa, Digital Globe, Inc. * */ public class NLaboTestFileTransferHandler extends TransferHandler { private final NLaboTestImporter context; public NLaboTestFileTransferHandler(NLaboTestImporter context) { this.context = context; } @Override public boolean importData(TransferHandler.TransferSupport support) { if (!canImport(support)) { return false; } try { // Drag & Drop されたファイルのリストを得る Transferable t = support.getTransferable(); java.util.List<File> files = null; if (support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { files = (java.util.List<File>)t.getTransferData(DataFlavor.javaFileListFlavor); } if (files==null || files.isEmpty()) { return false; } List<Path> labFiles = new ArrayList<>(files.size()); // 拡張子が .DAT のファイルのみ queue へ追加する for (File file : files) { if (!file.isDirectory()) { String ext = file.getName().toLowerCase(); if (ext.endsWith(".dat") || ext.endsWith(".dat2") || ext.endsWith(".hl7") || ext.endsWith(".txt") || ext.endsWith(".csv")) { labFiles.add(file.toPath()); } } } if (labFiles.size() > 0) { parseFiles(labFiles); } return true; } catch (UnsupportedFlavorException | IOException ufe) { ufe.printStackTrace(System.err); } return false; } @Override public boolean canImport(TransferHandler.TransferSupport support) { boolean canImport = true; canImport = canImport && support.isDrop(); boolean isFile = support.isDataFlavorSupported(DataFlavor.javaFileListFlavor); canImport = canImport && isFile; return canImport; } private void parseFiles(final List<Path> labFiles) { final javax.swing.SwingWorker worker = new javax.swing.SwingWorker<List<NLaboImportSummary>, Void>() { @Override protected List<NLaboImportSummary> doInBackground() throws Exception { List<NLaboImportSummary> allModules = new ArrayList<>(); for (Path lab : labFiles) { LabResultParser parse = LabParserFactory.getParser(lab.getFileName().toString()); List<NLaboImportSummary> dataList = parse.parse(lab); allModules.addAll(dataList); } if (allModules.size()>0) { List<String> idList = new ArrayList<>(allModules.size()); allModules.stream().forEach((sm) -> { idList.add(sm.getPatientId()); }); LaboDelegater laboDelegater = new LaboDelegater(); List<PatientLiteModel> pList = laboDelegater.getConstrainedPatients(idList); for (int i = 0; i < allModules.size(); i++) { NLaboImportSummary sm = allModules.get(i); PatientLiteModel pl = pList.get(i); if (pl!=null) { sm.setKarteId(pl.getPatientId()); sm.setKarteBirthday(pl.getBirthday()); sm.setKarteKanaName(pl.getKanaName()); sm.setKarteName(pl.getFullName()); sm.setKarteSex(pl.getGenderDesc()); } } } return allModules; } @Override protected void done() { try { List<NLaboImportSummary> allModules = get(); context.getTableModel().setDataProvider(allModules); } catch (InterruptedException | ExecutionException e) { String why; Throwable cause = e.getCause(); if (cause != null) { why = cause.getMessage(); } else { why = e.getMessage(); } Window parent = SwingUtilities.getWindowAncestor(context.getUI()); //String message = "パースできないファイルがあります。\n検査報告書フォーマットを確認してください。\n" + why; String fmt = ClientContext.getMyBundle(NLaboTestFileTransferHandler.class).getString("messageFormat.cannotParseFile"); MessageFormat msf = new MessageFormat(fmt); String message = msf.format(new Object[]{why}); String title = ClientContext.getMyBundle(NLaboTestFileTransferHandler.class).getString("title.optionPane.labReceiver"); JOptionPane.showMessageDialog(parent, message, ClientContext.getFrameTitle(title), JOptionPane.WARNING_MESSAGE); } } }; worker.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if (evt.getNewValue().equals(SwingWorker.StateValue.STARTED)) { context.getProgressBar().setIndeterminate(true); } else if (evt.getNewValue().equals(SwingWorker.StateValue.DONE)) { context.getProgressBar().setIndeterminate(false); context.getProgressBar().setValue(0); worker.removePropertyChangeListener(this); } } }); worker.execute(); } }