/**
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.brixcms.jcr.base.event;
import org.brixcms.jcr.base.action.AbstractActionHandler;
import javax.jcr.Item;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.lock.Lock;
import javax.jcr.version.Version;
import java.util.ArrayList;
import java.util.List;
public class ChangeLogActionHandler extends AbstractActionHandler {
private final ChangeLog changeLog;
private final Session session;
private List<Event> events = null;
private List<EventsListener> eventsListeners = new ArrayList<EventsListener>();
public ChangeLogActionHandler(ChangeLog changeLog, Session session) {
this.changeLog = changeLog;
this.session = session;
}
@Override
public void afterItemRefresh(Item item, boolean keepChanges) throws RepositoryException {
if (keepChanges == false) {
discardEvents(item);
}
}
private void discardEvents(Item item) throws RepositoryException {
discardEvents(item.getPath());
}
@Override
public void afterItemSave(Item item) throws RepositoryException {
if (events != null && !events.isEmpty()) {
for (EventsListener l : eventsListeners) {
l.handleEventsAfterSave(session, item, events);
}
}
events = null;
}
@Override
public void afterNodeAdd(Node node) throws RepositoryException {
changeLog.addEvent(new AddNodeEvent(node));
}
@Override
public void afterNodeAddMixin(Node node, String mixin) throws RepositoryException {
changeLog.addEvent(new ChangeNodeMixinsEvent(node));
}
@Override
public void afterNodeCancelMerge(Node node, Version version) throws RepositoryException {
discardEvents(node);
}
@Override
public void afterNodeCheckin(Node node, Version version) throws RepositoryException {
}
@Override
public void afterNodeCheckout(Node node) throws RepositoryException {
}
@Override
public void afterNodeChildNodesOrderChange(Node node) throws RepositoryException {
changeLog.addEvent(new ChangeChildNodesOrderEvent(node));
}
@Override
public void afterNodeDoneMerge(Node node, Version version) throws RepositoryException {
discardEvents(node);
}
@Override
public void afterNodeLock(Node node, boolean isDeep, boolean isSessionScoped, Lock lock) throws RepositoryException {
}
@Override
public void afterNodeRemoveMixin(Node node, String mixin) throws RepositoryException {
}
@Override
public void afterNodeRestoreVersion(Node node) throws RepositoryException {
discardEvents(node);
}
@Override
public void afterNodeUnlock(Node node) throws RepositoryException {
}
@Override
public void afterNodeUpdate(Node node) throws RepositoryException {
discardEvents(node);
}
@Override
public void afterPropertyRemove(Node node, String propertyName) throws RepositoryException {
changeLog.addEvent(new RemovePropertyEvent(node, propertyName));
}
@Override
public void afterPropertySet(Property property) throws RepositoryException {
changeLog.addEvent(new SetPropertyEvent(property));
}
@Override
public void afterSessionImportXML(String parentAbsPath) throws RepositoryException {
discardEvents(parentAbsPath);
}
private void discardEvents(String path) throws RepositoryException {
changeLog.removeAndGetAffectedEvents(path);
}
@Override
public void afterSessionNodeMove(String sourcePath, String destinationPath) throws RepositoryException {
Node node = (Node) session.getItem(destinationPath);
changeLog.addEvent(new MoveNodeEvent(node, sourcePath));
}
@Override
public void afterSessionRefresh(boolean keepChanges) throws RepositoryException {
if (!keepChanges) {
discardEvents((String) null);
}
}
@Override
public void afterSessionSave() throws RepositoryException {
if (events != null && !events.isEmpty()) {
for (EventsListener l : eventsListeners) {
l.handleEventsAfterSave(session, null, events);
}
}
events = null;
}
@Override
public void afterWorkspaceClone(String srcWorkspace, String srcAbsPath, String destAbsPath)
throws RepositoryException {
discardEvents(destAbsPath);
}
@Override
public void afterWorkspaceCopy(String srcAbsPath, String destAbsPath) throws RepositoryException {
discardEvents(destAbsPath);
}
@Override
public void afterWorkspaceCopy(String srcWorkspace, String srcAbsPath, String destAbsPath)
throws RepositoryException {
discardEvents(destAbsPath);
}
@Override
public void afterWorkspaceImportXML(String parentAbsPath) throws RepositoryException {
discardEvents(parentAbsPath);
}
@Override
public void afterWorkspaceMove(String srcAbsPath, String destAbsPath) throws RepositoryException {
discardEvents(destAbsPath);
}
@Override
public void beforeItemRefresh(Item item, boolean keepChanges) throws RepositoryException {
}
@Override
public void beforeItemSave(Item item) throws RepositoryException {
events = changeLog.removeAndGetAffectedEvents(item.getPath());
if (events != null && !events.isEmpty()) {
for (EventsListener l : eventsListeners) {
l.handleEventsBeforeSave(session, item, events);
}
}
}
@Override
public void beforeNodeAdd(Node parent, String name, String primaryType) throws RepositoryException {
}
@Override
public void beforeNodeAddMixin(Node node, String mixin) throws RepositoryException {
}
@Override
public void beforeNodeCancelMerge(Node node, Version version) throws RepositoryException {
}
@Override
public void beforeNodeCheckin(Node node) throws RepositoryException {
}
@Override
public void beforeNodeCheckout(Node node) throws RepositoryException {
}
@Override
public void beforeNodeChildNodesOrderChange(Node node) throws RepositoryException {
}
@Override
public void beforeNodeDoneMerge(Node node, Version version) throws RepositoryException {
}
@Override
public void beforeNodeLock(Node node, boolean isDeep, boolean isSessionScoped) throws RepositoryException {
}
@Override
public void beforeNodeRemove(Node node) throws RepositoryException {
changeLog.addEvent(new BeforeRemoveNodeEvent(node));
}
@Override
public void beforeNodeRemoveMixin(Node node, String mixin) throws RepositoryException {
}
@Override
public void beforeNodeRestoreVersion(Node node) throws RepositoryException {
}
@Override
public void beforeNodeUnlock(Node node) throws RepositoryException {
}
@Override
public void beforeNodeUpdate(Node node) throws RepositoryException {
}
@Override
public void beforePropertyRemove(Node node, String propertyName) throws RepositoryException {
}
@Override
public void beforePropertySet(Node node, String propertyName) throws RepositoryException {
}
@Override
public void beforeSessionImportXML(String parentAbsPath) throws RepositoryException {
}
@Override
public void beforeSessionNodeMove(String sourcePath, String destinationPath) throws RepositoryException {
}
@Override
public void beforeSessionRefresh(boolean keepChanges) throws RepositoryException {
}
@Override
public void beforeSessionSave() throws RepositoryException {
events = changeLog.removeAndGetAffectedEvents(null);
if (events != null && !events.isEmpty()) {
for (EventsListener l : eventsListeners) {
l.handleEventsBeforeSave(session, null, events);
}
}
}
@Override
public void beforeWorkspaceClone(String srcWorkspace, String srcAbsPath, String destAbsPath)
throws RepositoryException {
}
@Override
public void beforeWorkspaceCopy(String srcAbsPath, String destAbsPath) throws RepositoryException {
}
@Override
public void beforeWorkspaceCopy(String srcWorkspace, String srcAbsPath, String destAbsPath)
throws RepositoryException {
}
@Override
public void beforeWorkspaceImportXML(String parentAbsPath) throws RepositoryException {
}
@Override
public void beforeWorkspaceMove(String srcAbsPath, String destAbsPath) throws RepositoryException {
}
public int getPriority() {
return Integer.MIN_VALUE;
}
public void registerEventsListener(EventsListener listener) {
eventsListeners.add(listener);
}
}