Mooving expired doc to new folder

package com.space.archiveprocess;

import java.io.StringReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.security.permission.PermissionChecker;
import com.liferay.portal.security.permission.PermissionCheckerFactoryUtil;
import com.liferay.portal.security.permission.PermissionThreadLocal;
import com.liferay.portal.service.CompanyLocalServiceUtil;
import com.liferay.portal.service.GroupLocalServiceUtil;
import com.liferay.portal.service.ServiceContext;
import com.liferay.portal.service.UserLocalServiceUtil;
import com.liferay.portlet.documentlibrary.NoSuchFolderException;
import com.liferay.portlet.documentlibrary.model.DLFileEntry;
import com.liferay.portlet.documentlibrary.model.DLFileEntryMetadata;
import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
import com.liferay.portlet.documentlibrary.model.DLFolder;
import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
import com.liferay.portlet.documentlibrary.service.DLFileEntryMetadataLocalServiceUtil;
import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalServiceUtil;
import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
import com.liferay.portlet.dynamicdatamapping.model.DDMContent;
import com.liferay.portlet.dynamicdatamapping.service.DDMContentLocalServiceUtil;

public class MoveArchiveDocuments {
    private long archiveFolderId;
    private long spaceGroupId;
    private List<DLFileEntry> spaceDocList;
    private Map<Long,String> spaceArchiveDocList;
    private List<DLFileEntryMetadata> docMetadata;
    private Map<String,Object> docMetadataMap = new HashMap<String, Object>();
    private Date today = new Date();
    
    private final String[] documentsTypes = {"Bulletin","Fact Sheet","Marketing Banner","Merchandising Aid",
            "Price File","Price Sheet","Price Survey","Product Catalog","Product Guide","Rebate","Tech Bulletin"};
    private List<Long> expiredDoumentList = new ArrayList<Long>();
    
    private static final Log LOGGER = LogFactoryUtil.getLog(MoveArchiveDocuments.class);
    public void processArchiveOperation(){
        try{
            spaceGroupId = GroupLocalServiceUtil.getGroup(CompanyLocalServiceUtil.getCompanyByMx("alliance1.com").getCompanyId(), "SPACE").getGroupId();
            archiveFolderId = DLFolderLocalServiceUtil.getFolder(spaceGroupId, 0L, "Archive").getFolderId();
            //LOGGER.info("Archive Folder ID::: "+archiveFolderId);    
            collectExpiredFileEntries();
            
        }catch(Exception e){
            LOGGER.error("Exception in processArchiveOperation Method::: "+e);
        }
    }
    
    public void collectExpiredFileEntries(){    
        try{            
            spaceDocList = DLFileEntryLocalServiceUtil.getGroupFileEntries(spaceGroupId,
                    0, DLFileEntryLocalServiceUtil.getGroupFileEntriesCount(spaceGroupId));
            LOGGER.info("SPACE DOCUMENT List Count:"+spaceDocList.size());
            for(DLFileEntry spaceDoc:spaceDocList){
                docMetadata = DLFileEntryMetadataLocalServiceUtil.getFileVersionFileEntryMetadatas(spaceDoc.getFileVersion().getFileVersionId());
                
                for(DLFileEntryMetadata fileMedata:docMetadata){
                    long docStorageId = fileMedata.getDDMStorageId();
                    DDMContent docContent = DDMContentLocalServiceUtil.getContent(docStorageId);
                    String docContentXML = docContent.getXml();
                    
                    Date expiryDate = getDocExpirationDate(docContentXML);
                    if(expiryDate!=null){
                        if(expiryDate.before(today)){
                            DLFileEntryType dLFileEntryType = DLFileEntryTypeLocalServiceUtil.getFileEntryType(fileMedata.getFileEntryTypeId());
                            String documentTypeName = dLFileEntryType.getName();
                            if(Arrays.asList(documentsTypes).contains(documentTypeName)){
                                expiredDoumentList.add(spaceDoc.getFileEntryId());
                            }
                        }
                    }
                }                
            }
        }catch(Exception e){
            LOGGER.error("Exception in collectExpiredFileEntries Method::: "+e);
        }
        
        moveExpiredDocumentToArchive(expiredDoumentList);
    }
    
    public void moveExpiredDocumentToArchive(List<Long> expiredDoumentList){
        System.out.println(expiredDoumentList.size());
        int i = 0;
        try{
            for(long expiredDoumentId :expiredDoumentList){
                DLFileEntry dLFileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(expiredDoumentId);
                Boolean hasArchived = (Boolean) dLFileEntry.getExpandoBridge().getAttribute("archived");
                System.out.println(hasArchived+" "+dLFileEntry.getTitle());
                if(hasArchived == null || hasArchived == false){
                    DLFolder dlFolder  = dLFileEntry.getFolder();
                    long repositeryId = dlFolder.getRepositoryId();
                    String parentFolderName ="";
                    if(!dlFolder.getName().equals("Archive"))
                        parentFolderName = dlFolder.getName();
                    while(dlFolder.getParentFolderId() != 0){
                        dlFolder = dlFolder.getParentFolder();
                        if(!dlFolder.getName().equals("Archive"))
                            parentFolderName = dlFolder.getName()+">"+parentFolderName;                    
                    }
                    long targetFolderId = getFolderId(parentFolderName);
                    dLFileEntry.setFolderId(targetFolderId);
                    dLFileEntry.setRepositoryId(repositeryId);
                    PermissionChecker permissionChecker =PermissionCheckerFactoryUtil.create(UserLocalServiceUtil.getUser(dlFolder.getUserId()));
                    PermissionThreadLocal.setPermissionChecker(permissionChecker);
                    dLFileEntry.getExpandoBridge().setAttribute("archived",true);
                    DLFileEntryLocalServiceUtil.updateDLFileEntry(dLFileEntry, true);    
                    System.out.println(i+"  "+dLFileEntry.getTitle()+" moved to "+targetFolderId+" "+parentFolderName);
                    i++;
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    public long getFolderId(String folders) {
        DLFolder folder = null;
        try {
            folder = DLFolderLocalServiceUtil.getFolder(spaceGroupId, 0, "Archive");
            StringTokenizer tokenizer = new StringTokenizer(folders, ">");
            while(tokenizer.hasMoreTokens()){
                String folderName = tokenizer.nextToken();
                try{                
                    folder = DLFolderLocalServiceUtil.getFolder(spaceGroupId, folder.getFolderId(), folderName);
                }catch(NoSuchFolderException e){
                    folder = DLFolderLocalServiceUtil.addFolder(folder.getUserId(), spaceGroupId,
                            folder.getRepositoryId(), folder.getMountPoint(),
                            folder.getFolderId(),folderName, "Expired documents", new ServiceContext());
                }
            }
        } catch (Exception e) {
            LOGGER.warn(e.getMessage());
        }
        return folder.getFolderId();
    }
    
    public Date getDocExpirationDate(String contentXML){
        Date timeStampDate = null;
        try{            
            DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            InputSource is = new InputSource();
            is.setCharacterStream(new StringReader(contentXML));
            
            Document doc = db.parse(is);
            NodeList nodes = doc.getElementsByTagName("root");
            for (int rootNode = 0; rootNode < nodes.getLength(); rootNode++){
                Node rootSubNode = nodes.item(rootNode);
                if(rootSubNode.getNodeType()==Node.ELEMENT_NODE){
                    Element dynElement = (Element) rootSubNode;
                    NodeList dynNodeList = dynElement.getElementsByTagName("dynamic-element");
                    for (int dynSubNodeList = 0; dynSubNodeList < dynNodeList.getLength(); dynSubNodeList++){
                        Element line = (Element) dynNodeList.item(0);
                        if(line.getAttribute("name").equalsIgnoreCase("expirationdate")){
                            long docTimeStamp = Long.parseLong(line.getTextContent().trim());
                            timeStampDate = new Date(docTimeStamp);
                        }
                    }                    
                }
            }            
        }catch(Exception docExpirationException){
            LOGGER.error("Exception during Expiration Date Conversion::: "+docExpirationException);
        }
        return timeStampDate;
    }
}