org.apache.cayenne.util.EventUtil Maven / Gradle / Ivy
/*****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.cayenne.util;
import org.apache.cayenne.DataChannel;
import org.apache.cayenne.DataChannelListener;
import org.apache.cayenne.event.EventManager;
import org.apache.cayenne.event.EventSubject;
import org.apache.cayenne.graph.GraphEvent;
/**
* Contains access stack events related utility methods.
*
* @since 1.2
*/
public class EventUtil {
static final EventSubject[] CHANNEL_SUBJECTS = new EventSubject[] {
DataChannel.GRAPH_CHANGED_SUBJECT, DataChannel.GRAPH_FLUSHED_SUBJECT,
DataChannel.GRAPH_ROLLEDBACK_SUBJECT
};
/**
* Utility method that sets up a GraphChangeListener to be notified when DataChannel
* posts an event.
*
* @return false if an DataChannel doesn't have an EventManager and therefore does not
* support events.
*/
public static boolean listenForChannelEvents(
DataChannel channel,
DataChannelListener listener) {
EventManager manager = channel.getEventManager();
if (manager == null) {
return false;
}
listenForSubjects(manager, listener, channel, CHANNEL_SUBJECTS);
return true;
}
/**
* Listen for events from all channels that use a given EventManager.
*/
public static boolean listenForChannelEvents(
EventManager manager,
DataChannelListener listener) {
if (manager == null) {
return false;
}
listenForSubjects(manager, listener, null, CHANNEL_SUBJECTS);
return true;
}
/**
* Registers GraphEventListener for multiple subjects at once.
*/
static void listenForSubjects(
EventManager manager,
DataChannelListener listener,
Object sender,
EventSubject[] subjects) {
for (EventSubject subject : subjects) {
// assume that subject name and listener method name match
String fqSubject = subject.getSubjectName();
String method = fqSubject.substring(fqSubject.lastIndexOf('/') + 1);
// use non-blocking listeners for multi-threaded EM; blocking for single
// threaded...
if (manager.isSingleThreaded()) {
manager.addListener(listener, method, GraphEvent.class, subject, sender);
}
else {
manager.addNonBlockingListener(
listener,
method,
GraphEvent.class,
subject,
sender);
}
}
}
// not for instantiation
private EventUtil() {
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy