package ch.elexis.global_inbox; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.data.services.GlobalServiceDescriptors; import ch.elexis.core.data.services.IDocumentManager; import ch.elexis.core.data.util.Extensions; import ch.elexis.core.ui.text.GenericDocument; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.core.ui.util.viewers.CommonContentProviderAdapter; import ch.elexis.data.Patient; import ch.elexis.data.Query; import ch.rgw.tools.ExHandler; import ch.rgw.tools.TimeTool; public class InboxContentProvider extends CommonContentProviderAdapter { private static Logger log = LoggerFactory.getLogger(InboxContentProvider.class); ArrayList<File> files = new ArrayList<File>(); InboxView view; LoadJob loader; public void setView(InboxView view){ this.view = view; } @Override public void dispose(){ super.dispose(); } public IStatus reload(){ return loader.run(null); } public InboxContentProvider(){ loader = new LoadJob(); loader.schedule(1000); } @Override public Object[] getElements(Object inputElement){ return files == null ? null : files.toArray(); } Pattern patMatch = Pattern.compile("([0-9]+)_(.+)"); private void addFiles(List<File> list, File dir){ File[] contents = dir.listFiles(); for (File file : contents) { if (file.isDirectory()) { addFiles(list, file); } else { Matcher matcher = patMatch.matcher(file.getName()); if (matcher.matches()) { String num = matcher.group(1); String nam = matcher.group(2); List<Patient> lPat = new Query(Patient.class, Patient.FLD_PATID, num).execute(); if (lPat.size() == 1) { Patient pat = lPat.get(0); String cat = Activator.getDefault().getCategory(file); if (cat.equals("-") || cat.equals("??")) { cat = null; } IDocumentManager dm = (IDocumentManager) Extensions .findBestService(GlobalServiceDescriptors.DOCUMENT_MANAGEMENT); try { long heapSize = Runtime.getRuntime().totalMemory(); long length = file.length(); if(length>=heapSize) { log.warn("Skipping "+file.getAbsolutePath()+" as bigger than heap size. (#3652)"); continue; } GenericDocument fd = new GenericDocument(pat, nam, cat, file, new TimeTool().toString(TimeTool.DATE_GER), "", null); file.delete(); dm.addDocument(fd); Activator.getDefault().getContentProvider().reload(); return; } catch (Exception ex) { ExHandler.handle(ex); SWTHelper.alert(Messages.InboxView_error, ex.getMessage()); } } } list.add(file); } } } class LoadJob extends Job { public LoadJob(){ super("GlobalInbox"); //$NON-NLS-1$ setPriority(DECORATE); setUser(false); setSystem(true); } @Override protected IStatus run(IProgressMonitor monitor){ String filepath = CoreHub.localCfg.get(Preferences.PREF_DIR, null); File dir = null; if (filepath == null) { filepath = Preferences.PREF_DIR_DEFAULT; CoreHub.localCfg.set(Preferences.PREF_DIR, Preferences.PREF_DIR_DEFAULT); } dir = new File(filepath); if (!dir.isDirectory()) { if (view != null) { return Status.CANCEL_STATUS; } else { return Status.OK_STATUS; } } Object dm = Extensions.findBestService(GlobalServiceDescriptors.DOCUMENT_MANAGEMENT); if (dm == null) { log.warn("No document management service found."); return Status.OK_STATUS; } IDocumentManager documentManager = (IDocumentManager) dm; String[] cats = documentManager.getCategories(); if (cats != null) { for (String cat : cats) { File subdir = new File(dir, cat); if (!subdir.exists()) { subdir.mkdirs(); } } } files.clear(); addFiles(files, dir); if (view != null) { view.reload(); } schedule(120000L); return Status.OK_STATUS; } } }