Package pl.net.bluesoft.rnd.pt.ext.filescapture

Source Code of pl.net.bluesoft.rnd.pt.ext.filescapture.FilesChecker

package pl.net.bluesoft.rnd.pt.ext.filescapture;

import pl.net.bluesoft.rnd.processtool.ProcessToolContext;
import pl.net.bluesoft.rnd.processtool.bpm.ProcessToolBpmSession;
import pl.net.bluesoft.rnd.processtool.model.*;
import pl.net.bluesoft.rnd.processtool.model.config.ProcessStateAction;
import pl.net.bluesoft.rnd.pt.ext.filescapture.model.FilesCheckerConfiguration;
import pl.net.bluesoft.rnd.pt.ext.filescapture.model.FilesCheckerRuleConfiguration;
import pl.net.bluesoft.rnd.pt.utils.cmis.CmisAtomSessionFacade;
import pl.net.bluesoft.util.lang.StringUtil;

import javax.activation.MimetypesFileTypeMap;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;

import static pl.net.bluesoft.util.lang.FormatUtil.nvl;
import static pl.net.bluesoft.util.lang.StringUtil.hasText;

/**
* Created by Agata Taraszkiewicz
*/
public class FilesChecker {

    private static final Logger logger = Logger.getLogger(FilesChecker.class.getName());

    private ProcessToolContext context;

    public FilesChecker(ProcessToolContext context) {
        this.context = context;
    }

    public void run() {
        List<FilesCheckerConfiguration> configs = context.getHibernateSession().createCriteria(FilesCheckerConfiguration.class).list();
        for (FilesCheckerConfiguration cfg : configs) {
            try {
                execute(cfg);
            } catch (Exception e) {
                logger.log(Level.SEVERE, e.getMessage(), e);
            }
        }
    }

    private void execute(FilesCheckerConfiguration cfg) throws Exception {
        ProcessToolBpmSession toolBpmSession = context.getProcessToolSessionFactory().createSession(
                new UserData(cfg.getAutomaticUser(), cfg.getAutomaticUser(), cfg.getAutomaticUser()),
                new HashSet());


        File file = new File(cfg.getFilesProperties());

        if (file.isDirectory()) {
            String[] dirList = file.list();
            if (dirList != null) {
                processDirs(dirList, cfg, toolBpmSession);
            }
        }
    }

    private void processDirs(String[] dirList, FilesCheckerConfiguration cfg, ProcessToolBpmSession toolBpmSession) throws IOException {
        for (int i = 0; i < dirList.length; ++i) {
            File dir = new File(cfg.getFilesProperties()+ "/" + dirList[i]);
            if (!dir.isDirectory()) {
                dir.delete();
            } else {
                File finish = new File(dir.getAbsolutePath() + "/.finish");
                if (finish.exists()) {
                    processFiles(dir, cfg, toolBpmSession);
                }
            }
        }
    }

    private void processFiles(File dir, FilesCheckerConfiguration cfg, ProcessToolBpmSession toolBpmSession) throws IOException {

        for (FilesCheckerRuleConfiguration rule : cfg.getRules()) {
            ProcessInstance existingPi = null;
            if (hasText(rule.getProcessIdSubjectLookupRegexp())) {
                Matcher m = java.util.regex.Pattern.compile(rule.getProcessIdSubjectLookupRegexp()).matcher(dir.getName());
                if (m.matches()) {
                    String processId = m.group(1);
                    existingPi = nvl(
                            context.getProcessInstanceDAO().getProcessInstanceByExternalId(processId),
                            context.getProcessInstanceDAO().getProcessInstanceByInternalId(processId));
                    if (existingPi != null) {
                        logger.fine("Found existing process for " + processId + ", ID: " + existingPi.getInternalId());
                    }
                }
            }
            if (existingPi != null && hasText(rule.getRunningProcessActionName())) {
                Collection<BpmTask> taskList = toolBpmSession.findProcessTasks(existingPi, context);
                for (BpmTask t : taskList) {
                    if (!hasText(rule.getProcessTaskName()) || rule.getProcessTaskName().equalsIgnoreCase(t.getTaskName())) {
                        Set<ProcessStateAction> actions = context.getProcessDefinitionDAO().getProcessStateConfiguration(t).getActions();
                        for (ProcessStateAction a : actions) {
                            if (rule.getRunningProcessActionName().equals(a.getBpmName())) {
                                toolBpmSession.performAction(a, t, context);
                                logger.info("Performed action " + rule.getId() + " on matched process id: " + existingPi.getInternalId());
                                break;
                            }
                        }
                    }
                }

            }
            if (existingPi != null && hasText(rule.getRepositoryAtomUrl())) {
                CmisAtomSessionFacade sessionFacade = new CmisAtomSessionFacade(rule.getRepositoryUser(),
                        rule.getRepositoryPassword(),
                        rule.getRepositoryAtomUrl(),
                        rule.getRepositoryId());
                String folderId = null;

                for (ProcessInstanceAttribute at : existingPi.getProcessAttributes()) {
                    if (at instanceof ProcessInstanceSimpleAttribute) {
                        ProcessInstanceSimpleAttribute pisa = (ProcessInstanceSimpleAttribute) at;
                        if (pisa.getKey().equals(rule.getFolderAttributeName())) {
                            folderId = pisa.getValue();
                            break;
                        }
                    }
                }
                org.apache.chemistry.opencmis.client.api.Folder mainFolder;
                if (folderId == null) {
                    mainFolder = sessionFacade.createFolderIfNecessary(nvl(rule.getNewFolderPrefix(), "") +
                            existingPi.getInternalId(), rule.getRootFolderPath());
                    if (StringUtil.hasText(rule.getSubFolder()))
                        mainFolder = sessionFacade.createFolderIfNecessary(rule.getSubFolder(), mainFolder.getPath());
//                    folderId = mainFolder.getId();
                } else {
                    mainFolder = sessionFacade.getFolderById(folderId);
                }
                for (int i = 0; i < dir.list().length; ++i) {
                    String fileName = dir.list()[i];
                    if (!fileName.equals(".finish")) {
                        File file = new File(dir.getAbsolutePath() + "/" + fileName);
                        String mimeType = new MimetypesFileTypeMap().getContentType(file);
                        InputStream is = new FileInputStream(file);
                        try {
              long length = file.length();
              if (length > Integer.MAX_VALUE) {
                throw new IOException("Could not completely read file " + file.getName());
              }
              byte[] bytes = new byte[(int) length];
              int offset = 0;
              int numRead = 0;
              while (offset < bytes.length
                  && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
                offset += numRead;
              }
              if (offset < bytes.length) {
                throw new IOException("Could not completely read file " + file.getName());
              }
              sessionFacade.uploadDocument(file.getName(), mainFolder, bytes, mimeType, null);
            }
            finally {
                          is.close();
              file.delete();
            }
                    }
                }
            }
        }
    }
}
TOP

Related Classes of pl.net.bluesoft.rnd.pt.ext.filescapture.FilesChecker

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.