/**
* 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;
import org.brixcms.jcr.api.JcrNode;
import org.brixcms.jcr.api.JcrSession;
import org.brixcms.jcr.base.wrapper.WrapperAccessor;
import org.brixcms.jcr.exception.JcrException;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.observation.Event;
import javax.jcr.observation.EventIterator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class EventUtil {
private final static List<SaveEventListener> listeners = Collections
.synchronizedList(new ArrayList<SaveEventListener>());
public static void raiseSaveEvent(Node node) {
try {
JcrSession session = JcrSession.Wrapper.wrap(node.getSession(), null);
JcrNode wrapped = JcrNode.Wrapper.wrap(node, session);
raiseSaveEvent(wrapped);
} catch (RepositoryException e) {
throw new JcrException(e);
}
}
public static void raiseSaveEvent(JcrNode node) {
Event event = new EventImpl(node);
synchronized (listeners) {
for (SaveEventListener listener : listeners) {
listener.onEvent(new Iterator(event));
}
}
}
public static void registerSaveEventListener(SaveEventListener listener) {
listeners.add(listener);
}
/**
* Ensure that calling checkin and save on nodes within the session raises the save event.
*
* @param session
* @return
*/
public static BrixSession wrapSession(Session session) {
return WrapperAccessor.wrap(session);
}
public static Session unwrapSession(Session session) {
return WrapperAccessor.unwrap(session);
}
private static class Iterator implements EventIterator {
private Event event;
public Iterator(Event event) {
this.event = event;
}
public Event nextEvent() {
Event res = event;
event = null;
return res;
}
public long getPosition() {
return 0;
}
public long getSize() {
return -1;
}
public void skip(long skipNum) {
}
public boolean hasNext() {
return event != null;
}
public Object next() {
return nextEvent();
}
public void remove() {
throw new UnsupportedOperationException();
}
}
private static class EventImpl implements SaveEvent {
private final JcrNode node;
private long timestamp = System.currentTimeMillis();
public EventImpl(JcrNode node) {
this.node = node;
}
public JcrNode getNode() {
return node;
}
public String getPath() throws RepositoryException {
return node.getPath();
}
public int getType() {
return SaveEvent.NODE_SAVE;
}
public String getUserID() {
return node.getSession().getUserID();
}
public long getDate() throws RepositoryException {
return timestamp;
}
public String getIdentifier() throws RepositoryException {
return node.getIdentifier();
}
public Map<?, ?> getInfo() throws RepositoryException {
throw new UnsupportedOperationException();
}
public String getUserData() throws RepositoryException {
throw new UnsupportedOperationException();
}
}
;
}