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.workspaces.events; 017 018import java.util.Collection; 019import java.util.HashMap; 020import java.util.List; 021import java.util.Locale; 022import java.util.Map; 023 024import javax.jcr.Node; 025import javax.jcr.RepositoryException; 026 027import org.apache.avalon.framework.context.Context; 028import org.apache.avalon.framework.context.ContextException; 029import org.apache.avalon.framework.context.Contextualizable; 030import org.apache.avalon.framework.service.ServiceException; 031import org.apache.avalon.framework.service.ServiceManager; 032import org.apache.cocoon.components.ContextHelper; 033import org.apache.cocoon.environment.Request; 034import org.apache.commons.lang3.ArrayUtils; 035 036import org.ametys.cms.ObservationConstants; 037import org.ametys.cms.repository.Content; 038import org.ametys.core.observation.Event; 039import org.ametys.core.observation.ObservationManager; 040import org.ametys.core.user.CurrentUserProvider; 041import org.ametys.plugins.workspaces.WorkspacesConstants; 042import org.ametys.plugins.workspaces.project.ProjectManager; 043import org.ametys.plugins.workspaces.project.objects.Project; 044import org.ametys.web.repository.content.WebContent; 045import org.ametys.web.repository.page.ModifiablePage; 046import org.ametys.web.repository.page.Page; 047 048/** 049 * Observer for storing event on page updated 050 */ 051public class UpdatePageOnContentValidatedObserver extends AbstractWorkspacesEventsObserver implements Contextualizable 052{ 053 private ProjectManager _projectManager; 054 private Context _context; 055 private ObservationManager _observationManager; 056 private CurrentUserProvider _currentUserProvider; 057 058 @Override 059 public void service(ServiceManager serviceManager) throws ServiceException 060 { 061 super.service(serviceManager); 062 063 _projectManager = (ProjectManager) serviceManager.lookup(ProjectManager.ROLE); 064 _observationManager = (ObservationManager) serviceManager.lookup(ObservationManager.ROLE); 065 _currentUserProvider = (CurrentUserProvider) serviceManager.lookup(CurrentUserProvider.ROLE); 066 } 067 068 069 public void contextualize(Context context) throws ContextException 070 { 071 _context = context; 072 } 073 074 public boolean supports(Event event) 075 { 076 return event.getId().equals(ObservationConstants.EVENT_CONTENT_MODIFIED); 077 } 078 079 public void observe(Event event, Map<String, Object> transientVars) throws Exception 080 { 081 Content content = (Content) event.getArguments().get(ObservationConstants.ARGS_CONTENT); 082 String[] cTypes = content.getTypes(); 083 if (ArrayUtils.contains(cTypes, WorkspacesConstants.EDITIONFO_CONTENT_TYPE) && content instanceof WebContent) 084 { 085 Project project = _getProject(); 086 087 if (project != null) 088 { 089 _updateContentPage(content, project); 090 } 091 } 092 } 093 094 095 private void _updateContentPage(Content content, Project project) 096 { 097 Collection<Page> referencingPages = ((WebContent) content).getReferencingPages(); 098 for (Page page : referencingPages) 099 { 100 Map<String, Object> eventParams = new HashMap<>(); 101 eventParams.put(org.ametys.web.ObservationConstants.ARGS_PAGE, page); 102 eventParams.put(org.ametys.plugins.workspaces.ObservationConstants.ARGS_PROJECT, project); 103 104 String pageTitle = page.getTitle(); 105 String contentTitle = content.getTitle(new Locale(page.getSitemapName())); 106 if (pageTitle != null && pageTitle.equals(contentTitle)) 107 { 108 _observationManager.notify(new Event(org.ametys.plugins.workspaces.ObservationConstants.EVENT_EDITIONFO_UPDATED, _currentUserProvider.getUser(), eventParams)); 109 } 110 else if (page instanceof ModifiablePage) 111 { 112 ((ModifiablePage) page).setTitle(contentTitle); 113 ((ModifiablePage) page).saveChanges(); 114 115 eventParams.put(org.ametys.plugins.workspaces.ObservationConstants.ARGS_PAGE_OLD_NAME, pageTitle); 116 _observationManager.notify(new Event(org.ametys.plugins.workspaces.ObservationConstants.EVENT_EDITIONFO_RENAMED, _currentUserProvider.getUser(), eventParams)); 117 } 118 } 119 } 120 121 private Project _getProject() 122 { 123 Request request = ContextHelper.getRequest(_context); 124 String siteName = (String) request.getAttribute("siteName"); 125 List<String> projects = _projectManager.getProjectsForSite(siteName); 126 if (projects.size() > 0) 127 { 128 return _projectManager.getProject(projects.get(0)); 129 } 130 return null; 131 } 132 133 134 /** 135 * Store the event 136 * @param event The event 137 * @param project The project. Can be null 138 * @throws RepositoryException if failed to store event 139 */ 140 @Override 141 protected void storeEvent(Event event, Project project, Map<String, Object> transientVars) throws RepositoryException 142 { 143 if (project != null) 144 { 145 Map<String, Object> eventArguments = getEventParameters(event, project); 146 147 eventArguments.put("projectName", project.getName()); 148 eventArguments.put("projectTitle", project.getTitle()); 149 150 Node eventNode = _eventTypeExtensionPoint.addEvent(org.ametys.plugins.workspaces.ObservationConstants.EVENT_EDITIONFO_UPDATED, eventArguments, project); 151 152 if (transientVars != null) 153 { 154 transientVars.put(NODE_ID_EVENT_TRANSIENT_VAR, eventNode.getIdentifier()); 155 } 156 } 157 } 158 159 160}