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;
}
}


