001/* 002 * Copyright 2017 Anyware Services 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.ametys.plugins.odfsync.apogee; 017 018import java.util.HashSet; 019import java.util.List; 020import java.util.Optional; 021import java.util.Set; 022 023import org.apache.avalon.framework.service.ServiceException; 024import org.apache.avalon.framework.service.ServiceManager; 025import org.apache.cocoon.components.ContextHelper; 026import org.apache.cocoon.environment.Request; 027import org.quartz.JobDetail; 028import org.quartz.JobExecutionContext; 029 030import org.ametys.cms.repository.Content; 031import org.ametys.cms.repository.ModifiableContent; 032import org.ametys.core.schedule.Schedulable; 033import org.ametys.core.schedule.progression.ContainerProgressionTracker; 034import org.ametys.core.schedule.progression.SimpleProgressionTracker; 035import org.ametys.odf.ODFHelper; 036import org.ametys.odf.catalog.Catalog; 037import org.ametys.odf.catalog.CatalogsManager; 038import org.ametys.odf.cdmfr.CDMFRHandler; 039import org.ametys.odf.program.ProgramFactory; 040import org.ametys.plugins.core.impl.schedule.AbstractStaticSchedulable; 041import org.ametys.plugins.core.schedule.Scheduler; 042import org.ametys.plugins.odfsync.apogee.scc.ApogeeSynchronizableContentsCollectionHelper; 043import org.ametys.plugins.repository.AmetysObjectIterable; 044import org.ametys.runtime.i18n.I18nizableText; 045 046/** 047 * A {@link Schedulable} job which synchronizes Apogee collections. 048 */ 049public class ApogeeSchedulable extends AbstractStaticSchedulable 050{ 051 private ODFHelper _odfHelper; 052 private ApogeeSynchronizableContentsCollectionHelper _apogeeSCCHelper; 053 private CatalogsManager _catalogsManager; 054 private CDMFRHandler _cdmfrHandler; 055 056 @Override 057 public void service(ServiceManager manager) throws ServiceException 058 { 059 super.service(manager); 060 _odfHelper = (ODFHelper) manager.lookup(ODFHelper.ROLE); 061 _apogeeSCCHelper = (ApogeeSynchronizableContentsCollectionHelper) manager.lookup(ApogeeSynchronizableContentsCollectionHelper.ROLE); 062 _catalogsManager = (CatalogsManager) manager.lookup(CatalogsManager.ROLE); 063 _cdmfrHandler = (CDMFRHandler) manager.lookup(CDMFRHandler.ROLE); 064 } 065 066 @Override 067 public void execute(JobExecutionContext context, ContainerProgressionTracker progressionTracker) throws Exception 068 { 069 long begin = System.currentTimeMillis(); 070 Request request = ContextHelper.getRequest(_context); 071 072 try 073 { 074 _cdmfrHandler.suspendCDMFRObserver(); 075 076 // Save handle contents 077 request.setAttribute(ApogeeSynchronizableContentsCollectionHelper.HANDLED_CONTENTS, new HashSet<>()); 078 079 synchronizeCollections(context, progressionTracker); 080 } 081 catch (Exception ex) 082 { 083 getLogger().error("The global synchronization have failed.", ex); 084 } 085 finally 086 { 087 @SuppressWarnings("unchecked") 088 Set<String> handledContents = (Set<String>) request.getAttribute(ApogeeSynchronizableContentsCollectionHelper.HANDLED_CONTENTS); 089 _cdmfrHandler.unsuspendCDMFRObserver(handledContents); 090 request.removeAttribute(ApogeeSynchronizableContentsCollectionHelper.HANDLED_CONTENTS); 091 092 if (getLogger().isInfoEnabled()) 093 { 094 getLogger().info("Global synchronization ended in {} ms", System.currentTimeMillis() - begin); 095 } 096 } 097 } 098 099 /** 100 * Synchronize all contents with Apogee SCC starting from programs. 101 * @param context The execution context 102 * @param progressionTracker The progression tracker 103 */ 104 protected void synchronizeCollections(JobExecutionContext context, ContainerProgressionTracker progressionTracker) 105 { 106 String catalog = Optional.of(context) 107 .map(JobExecutionContext::getJobDetail) 108 .map(JobDetail::getJobDataMap) 109 .map(map -> map.getString(Scheduler.PARAM_VALUES_PREFIX + "catalog")) 110 .map(_catalogsManager::getCatalog) 111 .map(Catalog::getName) 112 .orElseGet(_catalogsManager::getDefaultCatalogName); 113 114 AmetysObjectIterable<Content> programs = _odfHelper.getProgramItems(ProgramFactory.PROGRAM_CONTENT_TYPE, null, catalog, null); 115 116 for (Content program : programs) 117 { 118 progressionTracker.addSimpleStep(program.getId(), new I18nizableText("plugin.odf-sync", "PLUGINS_ODF_SYNC_GLOBAL_SYNCHRONIZATION_SCHEDULER_PROGRAM_SYNC_STEP_LABEL", List.of(program.getTitle()))); 119 } 120 121 for (Content program : programs) 122 { 123 _apogeeSCCHelper.synchronizeContent((ModifiableContent) program, getLogger()); 124 ((SimpleProgressionTracker) progressionTracker.getStep(program.getId())).increment(); 125 } 126 } 127}