/*
* 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.RemoteException;
import net.jini.core.entry.Entry;
import net.jini.core.entry.UnusableEntryException;
import net.jini.core.lease.Lease;
import net.jini.id.Uuid;
import net.jini.space.MatchSet;
/**
* Outrigger's implementation of <code>MatchSet</code>.
* Outrigger's implementation of the <code>JavaSpace05.contents</code>
* method returns objects of this type. Created with an initial set of
* entries from the match set and supports pre-fetching whenever it
* needs additional entries. <code>RemoteException</code>s encountered
* when making a remote call to fetch the next batch of entries from
* the space generally do not invalidate the proxy or the match set.
* <p>
* Note, there is no way to serialize or otherwise copy instances of
* this class so the default equals implementation should suffice.
*/
class MatchSetProxy implements MatchSet {
/** The remote server this proxy works with. */
final private OutriggerServer space;
/** ID of the associated query (and lease) */
final private Uuid uuid;
/** Lease assocated with this query */
final private Lease lease;
/** Last batch fetched from server */
private EntryRep[] reps;
/** Last rep returned */
private EntryRep lastRepReturned;
/** Current index into reps */
private int i;
/** True if reps[i] could not be unpacked */
private boolean unpackFailure = true;
MatchSetProxy(MatchSetData inital, SpaceProxy2 parent, OutriggerServer space) {
uuid = inital.uuid;
this.space = space;
if (uuid != null)
lease = parent.newLease(uuid, inital.intialLeaseDuration);
else
lease = null;
reps = inital.reps;
i=0;
}
public Lease getLease() {
return lease;
}
public Entry next() throws RemoteException, UnusableEntryException {
if (i >= reps.length) {
// Fetch another batch
i = 0;
reps = space.nextBatch(uuid, lastRepReturned.id());
}
if (reps[i] == null)
return null;
unpackFailure = true;
lastRepReturned = reps[i++];
final Entry rslt = lastRepReturned.entry();
unpackFailure = false;
return rslt;
}
public Entry getSnapshot() {
if (unpackFailure)
throw new IllegalStateException(
"getSnapshot - need successful next call first");
return new SnapshotRep(lastRepReturned);
}
public String toString() {
return getClass().getName() + " for " + uuid +
" (through " + space + ")";
}
}