/* * 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 com.sun.jini.outrigger; import java.rmi.MarshalledObject; import net.jini.core.event.RemoteEventListener; import net.jini.space.InternalSpaceException; import net.jini.id.Uuid; import net.jini.security.ProxyPreparer; /** * Subclass of EventRegistrationWatcher for transactional * event registrations. */ class TransactableEventWatcher extends EventRegistrationWatcher implements Transactable { /** The listener that should be notified of matches */ private final RemoteEventListener listener; /** * The transaction (represented as a <code>Txn</code>) this * event registration is associated with. */ private final Txn txn; /** * Create a new <code>TransactableEventWatcher</code>. * @param timestamp the value that is used * to sort <code>TransitionWatcher</code>s. * @param startOrdinal the highest ordinal associated * with operations that are considered to have occurred * before the operation associated with this watcher. * @param cookie The unique identifier associated * with this watcher. Must not be <code>null</code>. * @param handback The handback object that * should be sent along with event * notifications to the the listener. * @param eventID The event ID for event type * represented by this object. * @param listener The object to notify of * matches. * @param txn The transaction this registration is * associated with. * @throws NullPointerException if the <code>cookie</code>, * <code>listener</code>, or <code>txn</code> arguments are * <code>null</code>. */ TransactableEventWatcher(long timestamp, long startOrdinal, Uuid cookie, MarshalledObject handback, long eventID, RemoteEventListener listener, Txn txn) { super(timestamp, startOrdinal, cookie, handback, eventID); if (listener == null) throw new NullPointerException("listener must be non-null"); if (txn == null) throw new NullPointerException("txn must be non-null"); this.listener = listener; this.txn = txn; } boolean isInterested(EntryTransition transition, long ordinal) { // If it is not a new entry we don't care if (!transition.isNewEntry()) return false; // If it occurred before our registration we don't care if (ordinal <= startOrdinal) return false; final TransactableMgr transitionTxn = transition.getTxn(); // We care if the transition under the null transaction or ours. return (transitionTxn == null) || (transitionTxn == txn); } RemoteEventListener getListener(ProxyPreparer preparer) { return listener; } /** * Just need to terminate this registration and return * <code>NOTCHANGED</code>. */ public int prepare(TransactableMgr mgr, OutriggerServerImpl space) { cancel(); return NOTCHANGED; } /** * This should never happen since we always return * <code>NOTCHANGED</code> from <code>prepare</code>. */ public void commit(TransactableMgr mgr, OutriggerServerImpl space) { throw new InternalSpaceException ("committing a TransactableRegistrationWatcher"); } /** * Just need to terminate this registration. */ public void abort(TransactableMgr mgr, OutriggerServerImpl space) { // prepare does the right thing, and should forever prepare(mgr, space); } }