/* * #%L * Alfresco Records Management Module * %% * Copyright (C) 2005 - 2016 Alfresco Software Limited * %% * License rights for this program may be obtained from Alfresco Software, Ltd. * pursuant to a written agreement and any use of this program without such an * agreement is prohibited. * #L% */ package org.alfresco.bm.dataload.rm.site; import static org.alfresco.bm.data.DataCreationState.Created; import static org.alfresco.bm.data.DataCreationState.Failed; import static org.alfresco.bm.data.DataCreationState.Scheduled; import static org.alfresco.bm.dataload.rm.site.PrepareRMSite.FIELD_ONLY_DB_LOAD; import static org.alfresco.bm.dataload.rm.site.PrepareRMSite.FIELD_SITE_ID; import static org.alfresco.bm.dataload.rm.site.PrepareRMSite.FIELD_SITE_MANAGER; import static org.alfresco.bm.dataload.rm.site.PrepareRMSite.RM_SITE_DESC; import static org.alfresco.bm.dataload.rm.site.PrepareRMSite.RM_SITE_TITLE; import static org.alfresco.rest.rm.community.model.site.RMSiteCompliance.STANDARD; import static org.alfresco.rest.rm.community.util.ParameterCheck.mandatoryObject; import static org.apache.commons.lang3.StringUtils.isBlank; import com.mongodb.DBObject; import org.alfresco.bm.cm.FileFolderService; import org.alfresco.bm.cm.FolderData; import org.alfresco.bm.event.AbstractEventProcessor; import org.alfresco.bm.event.Event; import org.alfresco.bm.event.EventResult; import org.alfresco.bm.restapi.RestAPIFactory; import org.alfresco.bm.site.SiteData; import org.alfresco.bm.site.SiteDataService; import org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponent; import org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias; import org.alfresco.rest.rm.community.model.site.RMSite; import org.alfresco.rest.rm.community.requests.RMSiteAPI; import org.springframework.beans.factory.annotation.Autowired; /** * RM Site creation event * * @author Tuna Aksoy * @since 1.0 */ public class CreateRMSite extends AbstractEventProcessor { @Autowired private RestAPIFactory restAPIFactory; @Autowired private SiteDataService siteDataService; @Autowired private FileFolderService fileFolderService; public static final String PATH_SNIPPET_SITES = "Sites"; public static final String PATH_SNIPPET_FILE_PLAN = "documentLibrary"; public static final String PATH_SNIPPET_UNFILED_RECORD_CONTAINER = "Unfiled Records"; public static final String PATH_SNIPPET_TRANSFER_CONTAINER = "Transfers"; public static final String PATH_SNIPPET_HOLD_CONTAINER = "Holds"; public static final String DEFAULT_EVENT_NAME_SITE_CREATED = "rmSiteCreated"; private String eventNameSiteCreated = DEFAULT_EVENT_NAME_SITE_CREATED; /** * Override the {@link #DEFAULT_EVENT_NAME_SITE_CREATED default} event name when the site is created */ public void setEventNameSiteCreated(String eventNameSiteCreated) { this.eventNameSiteCreated = eventNameSiteCreated; } @Override public EventResult processEvent(Event event) throws Exception { mandatoryObject("event", event); DBObject dataObj = (DBObject) event.getData(); if (dataObj == null) { throw new IllegalStateException("This processor requires data object with fields '" + FIELD_SITE_ID + ", " + FIELD_SITE_MANAGER + "'."); } String siteId = (String) dataObj.get(FIELD_SITE_ID); String siteManager = (String) dataObj.get(FIELD_SITE_MANAGER); Boolean onlyLoadInDb = (Boolean) dataObj.get(FIELD_ONLY_DB_LOAD); if (isBlank(siteId) || isBlank(siteManager)) { return new EventResult("Requests data not complete for site creation: " + dataObj, false); } SiteData site = siteDataService.getSite(siteId); if (site == null) { return new EventResult("Site has been removed: " + siteId, false); } if (site.getCreationState() == Created) { return new EventResult("RM Site already exists in DB: " + site, false); } if (site.getCreationState() != Created && site.getCreationState() != Scheduled) { return new EventResult("Site state has changed: " + site, false); } // Start by marking them as failures in order to handle all eventualities siteDataService.setSiteCreationState(siteId, null, Failed); siteDataService.setSiteMemberCreationState(siteId, siteManager, Failed); String msg = null; try { RMSiteAPI rmSiteAPI = restAPIFactory.getRMSiteAPI(siteManager); String guid = null; if (onlyLoadInDb == null) { RMSite siteModel = RMSite.builder().compliance(STANDARD).build(); siteModel.setTitle(RM_SITE_TITLE); siteModel.setDescription(RM_SITE_DESC); RMSite rmSite = rmSiteAPI.createRMSite(siteModel); guid = rmSite.getGuid(); msg = "Created site: " + siteId + " Site creator: " + siteManager; } else { RMSite alreadyCreatedRMSite = rmSiteAPI.getSite(); guid = alreadyCreatedRMSite.getGuid(); msg = "RM site already exists, just loading it in the DB."; } // Mark the site. siteDataService.setSiteCreationState(siteId, guid, Created); siteDataService.setSiteMemberCreationState(siteId, siteManager, Created); // while (!restAPIFactory.getRMSiteAPI(siteManager).existsRMSite()) { // continue; // } loadSpecialContainersInDB(siteId, siteManager); event = new Event(eventNameSiteCreated, null); } catch (Exception e) { // The creation failed throw e; } if (logger.isDebugEnabled()) { logger.debug(msg); } return new EventResult(msg, event); } private void loadSpecialContainersInDB(String siteId, String siteManager) throws Exception { FilePlanComponent filePlanComponent = restAPIFactory.getFilePlanComponentAPI(siteManager) .getFilePlanComponent(FilePlanComponentAlias.FILE_PLAN_ALIAS.toString()); FolderData filePlan = new FolderData( filePlanComponent.getId(), // already unique "", "/" + PATH_SNIPPET_SITES + "/" + siteId + "/" + PATH_SNIPPET_FILE_PLAN, 0L, 0L); fileFolderService.createNewFolder(filePlan); //add Unfiled record container filePlanComponent = restAPIFactory.getFilePlanComponentAPI(siteManager) .getFilePlanComponent(FilePlanComponentAlias.UNFILED_RECORDS_CONTAINER_ALIAS.toString()); FolderData unfiledRecordContainer = new FolderData( filePlanComponent.getId(), // already unique "unfiled", "/" + PATH_SNIPPET_SITES + "/" + siteId + "/" + PATH_SNIPPET_FILE_PLAN + "/" + PATH_SNIPPET_UNFILED_RECORD_CONTAINER, 0L, 0L); fileFolderService.createNewFolder(unfiledRecordContainer); //add Transfer container filePlanComponent = restAPIFactory.getFilePlanComponentAPI(siteManager) .getFilePlanComponent(FilePlanComponentAlias.TRANSFERS_ALIAS.toString()); FolderData transferContainer = new FolderData( filePlanComponent.getId(), // already unique "transfers", "/" + PATH_SNIPPET_SITES + "/" + siteId + "/" + PATH_SNIPPET_FILE_PLAN + "/" + PATH_SNIPPET_TRANSFER_CONTAINER, 0L, 0L); fileFolderService.createNewFolder(transferContainer); //add Hold container filePlanComponent = restAPIFactory.getFilePlanComponentAPI(siteManager) .getFilePlanComponent(FilePlanComponentAlias.HOLDS_ALIAS.toString()); FolderData holdContainer = new FolderData( filePlanComponent.getId(), // already unique "holds", "/" + PATH_SNIPPET_SITES + "/" + siteId + "/" + PATH_SNIPPET_FILE_PLAN + "/" + PATH_SNIPPET_HOLD_CONTAINER, 0L, 0L); fileFolderService.createNewFolder(holdContainer); } }