org.tnc.doctrack.behaviours.docTrackBehaviours.java Source code

Java tutorial

Introduction

Here is the source code for org.tnc.doctrack.behaviours.docTrackBehaviours.java

Source

/*
 * Copyright (C) 2005-2012 Alfresco Software Limited.
 *
 * This file is part of Alfresco
 *
 * Alfresco is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Alfresco is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
 */
package org.tnc.doctrack.behaviours;

import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

import org.alfresco.model.ContentModel;
import org.alfresco.repo.content.ContentServicePolicies;
import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.action.ActionService;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.namespace.QName;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
import org.tnc.doctrack.qr.QRCode;

import com.google.zxing.Result;

/**
 * This class contains the behaviour behind the 'mdt:QRInfoAspect' aspect.
 * <p>
 * Every time tha this aspect is applied, the ZXING qr try to find the qr string to indentify QR text.
 * 
 * 
 * 
 * @author Marcello Modica
 * @author Giorgio Draghetti
 */
public class docTrackBehaviours
        implements ContentServicePolicies.OnContentUpdatePolicy, NodeServicePolicies.OnAddAspectPolicy,
        ContentServicePolicies.OnContentReadPolicy, NodeServicePolicies.OnCreateNodePolicy,
        NodeServicePolicies.OnUpdateNodePolicy, NodeServicePolicies.OnDeleteNodePolicy {

    private static Log logger = LogFactory.getLog(docTrackBehaviours.class);

    public static PolicyComponent policyComponent;
    public static NodeService nodeService;
    public static ContentService contentService;
    public static SearchService searchService;
    public static FileFolderService fileFolderService;
    public static SiteService siteService;
    public static ActionService actionService;
    public static ServiceRegistry serviceRegistry;
    public static StoreRef storeRef = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore");

    /* Aspect names */
    public static final QName ASPECT_docTrackAspect = QName
            .createQName("http://www.tipinoncomuni.com/model/doctrack/1.0", "docTrackAspect");

    /* Property names */
    public static final QName PROP_QRS = QName.createQName("http://www.tipinoncomuni.com/model/doctrack/1.0",
            "QRS");
    /* Property names */
    public static final QName PROP_zxingError = QName.createQName("http://www.tipinoncomuni.com/model/doctrack/1.0",
            "zxingError");

    /**
     * Spring initilaise method used to register the policy behaviours
     */

    public void init() {
        System.out.println("TNC - DocTrack - Behaviours AMP class loading....");
        if (logger.isDebugEnabled())
            logger.debug("TNC - DocTrack - Initializing policy logger behavior");
        docTrackBehaviours.policyComponent.bindClassBehaviour(NodeServicePolicies.OnAddAspectPolicy.QNAME,
                ASPECT_docTrackAspect, new JavaBehaviour(this, "onAddAspect", NotificationFrequency.FIRST_EVENT));
        System.out.println("TNC - DocTrack - OnAddAspectPolicy Behaviours with Aspect docTrackAspect loaded");
        System.out.println("DocTrack - Behaviours binding finished....");
    }

    /**
     * onAddAspect policy behavior.
     * <p>
     * Sets the count started date to the date/time at which the QRInfoAspect aspect was
     * first applied.
     * 
     * @param nodeRef           the node reference
     * @param aspectTypeQName   the qname of the aspect being applied
     */
    public ArrayList<Serializable> QRs = new ArrayList<Serializable>();

    public void onAddAspect(NodeRef nodeRef, QName aspectTypeQName) {
        System.out.println("TNC - DocTrack - OnAddAspectPolicy Fired  -  " + " NodeRef: " + nodeRef.getId()
                + "  -  Aspect: " + aspectTypeQName.getLocalName());
        ContentReader reader = null;
        InputStream is = null;

        if (fileFolderService.getFileInfo(nodeRef).isFolder() == false) {
            reader = contentService.getReader(nodeRef, ContentModel.PROP_CONTENT);
            is = reader.getContentInputStream();
        }

        com.google.zxing.Result[] qr = null;
        QRs.clear();
        if (aspectTypeQName.getLocalName().equals(ASPECT_docTrackAspect.getLocalName())) {
            System.out.println("TNC - DocTrack - Aspect docTrackAspect applied - behaviours fired");
            try {
                System.out.println("TNC - DocTrack - Start QR engine finder....");
                System.out.println("TNC - DocTrack - Extract image from file content for QR searching");
                qr = extractQRfromPDF(is);
                if (QRs != null) {
                    if (QRs.size() > 0) {
                        System.out.println("TNC - DocTrack - find QR codes : '" + StringUtils.join(QRs, ";")
                                + "' Try to put content in referred node properties.");
                        //Set QRInfoString to QR code value.   
                        Map<QName, Serializable> map = new HashMap<QName, Serializable>();
                        map.put(PROP_QRS, QRs);
                        docTrackBehaviours.nodeService.addProperties(nodeRef, map);

                    }
                }
            } catch (Exception e) {
                // Simply skip the QR extraction if error occurs.
                System.out.println(
                        "TNC - DocTrack - (QRReaderOnBehaviourException) Error with exception on QR reading inside behaviours. "
                                + e.toString());
                e.printStackTrace();
                try {
                    System.out.println(
                            "TNC - DocTrack - (QRReaderOnBehaviourException) Error on QR procedure. Set zxingError properties to : "
                                    + e.toString());
                    docTrackBehaviours.nodeService.setProperty(nodeRef, PROP_zxingError, e.toString());
                } catch (Exception f) {
                    System.out.println(
                            "TNC - DocTrack - (QRReaderOnBehaviourException) [SEVERE ERROR] Error on QR procedure. Something went wrong. We need to delete arrived content for security reason.");
                    f.printStackTrace();
                    fileFolderService.delete(nodeRef);
                }

            }
        }
    }

    public void onContentUpdate(NodeRef nodeRef, boolean flag) {
        System.out.println("TNC - DocTrack  - Content update policy fired");
        if (logger.isDebugEnabled())
            logger.debug("Content update policy fired");
    }

    public void onContentRead(NodeRef nodeRef) {
        System.out.println("TNC - DocTrack  - Content read policy fired");

        if (logger.isDebugEnabled())
            logger.debug("Content read policy fired");
    }

    public void onUpdateNode(NodeRef nodeRef) {
        System.out.println("TNC - DocTrack  - Node update policy fired");
        if (logger.isDebugEnabled())
            logger.debug("Node update policy fired");
    }

    public void onCreateNode(ChildAssociationRef childAssocRef) {
        System.out.println("TNC - DocTrack  - Node create policy fired");
        if (logger.isDebugEnabled())
            logger.debug("Node create policy fired");
    }

    private Result[] extractQRfromPDF(InputStream PDF) throws Exception {
        System.out.println("TNC - DocTrack  - extractQRfromPDF starting....");
        //Initialize variable for QR decoding.

        PDDocument document = null;
        String password = "";
        String prefix = null;
        boolean addKey = false;
        Result[] QR = null;
        try {
            //read PDF document 
            document = PDDocument.loadNonSeq(PDF, null, password);
            //Check permission to PDF
            AccessPermission ap = document.getCurrentAccessPermission();
            if (!ap.canExtractContent()) {
                System.out.println(
                        "TNC - DocTrack  Error - extractQRfromPDF - You do not have permission to extract images from PDF.");
                throw new IOException(
                        "TNC - DocTrack  Error - extractQRfromPDF - You do not have permission to extract images from PDF.");
            }
            //Iterate throw the PDF pages. 
            List<?> pages = document.getDocumentCatalog().getAllPages();
            Iterator<?> iter = pages.iterator();
            while (iter.hasNext()) {
                PDPage page = (PDPage) iter.next();
                PDResources resources = page.getResources();
                // extract all XObjectImages which are part of the page resources
                System.out.println("TNC - DocTrack  - extractQRfromPDF - Try to process image and find QR code");
                QR = processResources(resources, prefix, addKey);
            }

        } finally {
            if ((document != null)) {
                try {
                    document.close();
                } catch (Exception e) {

                }

            }
        }
        System.out.println("TNC - DocTrack  - extractQRfromPDF finished. QR code string : " + QR);
        return QR;
    }

    private com.google.zxing.Result[] processResources(PDResources resources, String prefix, boolean addKey)
            throws Exception {
        //Find QR in image passed as resources
        System.out.println("TNC - DocTrack  - extractQRfromPDF - processResources. Starting.... ");
        com.google.zxing.Result[] results = null;
        if (resources == null) {
            return null;
        }
        Map<String, PDXObject> xobjects = resources.getXObjects();
        if (xobjects != null) {
            Iterator<String> xobjectIter = xobjects.keySet().iterator();

            while (xobjectIter.hasNext()) {
                String key = xobjectIter.next();
                PDXObject xobject = xobjects.get(key);
                // write the images
                if (xobject instanceof PDXObjectImage) {
                    PDXObjectImage image = (PDXObjectImage) xobject;
                    System.out.println(
                            " TNC - DocTrack  - extractQRfromPDF - processResources - Read image object from PDF file and extract it.");
                    System.out.println(
                            " TNC - DocTrack  - extractQRfromPDF - processResources - Write image on disk for check and debug. Filename qrImageInPDF");
                    System.out.println(
                            " TNC - DocTrack  - extractQRfromPDF - processResources - Extracted Image format - Suffix: "
                                    + image.getSuffix() + " Height: " + image.getHeight() + " Widht: "
                                    + image.getWidth());
                    image.write2file("qrImageInPDF_" + UUID.randomUUID().toString());

                    results = org.tnc.doctrack.qr.QRCode.readQRCode(image.getRGBImage());
                    for (Result r : results) {
                        System.out.println("TNC - DocTrack  - extractQRfromPDF - code discovered: " + r.getText());
                        //Set<String> set = new HashSet<String>();
                        //set.add(r.getText());
                        //if (logger.isDebugEnabled()) System.out.println("TNC - DocTrack  - extractQRfromPDF - QRs arralist: " + r.getText());
                        QRs.add(r.getText()); //= new ArrayList<String>(set);

                    }

                }
                // maybe there are more images embedded in a form object
                else if (xobject instanceof PDXObjectForm) {
                    PDXObjectForm xObjectForm = (PDXObjectForm) xobject;
                    PDResources formResources = xObjectForm.getResources();
                    processResources(formResources, prefix, addKey);
                }

            }
        }
        return results;
    }

    public void onDeleteNode(ChildAssociationRef childAssocRef, boolean isNodeArchived) {
        System.out.println("TNC - DocTrack  - Node delete policy fired");
        if (logger.isDebugEnabled())
            logger.debug("Node delete policy fired");
    }

    /**
     * Sets the policy component
     * 
     * @param policyComponent   the policy component
     */
    public void setPolicyComponent(PolicyComponent policyComponent) {
        docTrackBehaviours.policyComponent = policyComponent;
    }

    /** 
    * Sets the node service 
    * 
    * @param nodeService   the node service
    */
    public void setNodeService(NodeService nodeService) {
        docTrackBehaviours.nodeService = nodeService;
    }

    /** 
     * Sets the content service 
     * 
     * @param nodeService   the node service
     */
    public void setContentService(ContentService contentService) {
        docTrackBehaviours.contentService = contentService;
    }

    /** 
     * Sets the node service 
     * 
     * @param nodeService   the node service
     */
    public void setSearchService(SearchService searchService) {
        docTrackBehaviours.searchService = searchService;
    }

    public void setFileFolderService(FileFolderService fileFolderService) {
        docTrackBehaviours.fileFolderService = fileFolderService;
    }

    public void setSiteService(SiteService siteService) {
        docTrackBehaviours.siteService = siteService;
    }

    public void setServiceRegistry(ServiceRegistry serviceRegistry) {
        docTrackBehaviours.serviceRegistry = serviceRegistry;
    }

    public void setActionService(ActionService actionService) {
        docTrackBehaviours.actionService = actionService;
    }
}