/*
* 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.mahalo;
import com.sun.jini.logging.Levels;
import net.jini.core.transaction.*;
import net.jini.core.transaction.server.*;
import net.jini.security.ProxyPreparer;
import java.io.Serializable;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Sun Microsystems, Inc.
*
*/
class ParticipantHandle implements Serializable, TransactionConstants {
static final long serialVersionUID = -1776073824495304317L;
/**
* Cached reference to prepared participant.
*/
private transient TransactionParticipant preparedPart;
/**
* @serial
*/
private StorableObject storedpart;
/**
* @serial
*/
private long crashcount = 0;
/**
* @serial
*/
private int prepstate;
/** Logger for persistence related messages */
private static final Logger persistenceLogger =
TxnManagerImpl.persistenceLogger;
/**
* Create a new node that is equivalent to that node
*/
ParticipantHandle(TransactionParticipant preparedPart,
long crashcount)
throws RemoteException
{
if (preparedPart == null)
throw new NullPointerException(
"TransactionParticipant argument cannot be null");
try {
storedpart = new StorableObject(preparedPart);
this.preparedPart = preparedPart;
this.crashcount = crashcount;
} catch (RemoteException re) {
if (persistenceLogger.isLoggable(Level.WARNING)) {
persistenceLogger.log(Level.WARNING,
"Cannot store the TransactionParticipant", re);
}
}
this.prepstate = ACTIVE;
}
long getCrashCount() {
return crashcount;
}
synchronized TransactionParticipant getPreParedParticipant() {
return preparedPart;
}
// Only called by service initialization code
void restoreTransientState(ProxyPreparer recoveredListenerPreparer)
throws RemoteException
{
if (recoveredListenerPreparer == null)
throw new NullPointerException(
"Preparer argument cannot be null");
/*
* ProxyPreparation potentially make remote calls. So,
* need to make sure that locks aren't being held across this
* invocation.
*/
preparedPart = (TransactionParticipant)
recoveredListenerPreparer.prepareProxy(storedpart.get());
}
StorableObject getStoredPart() {
return storedpart;
}
synchronized void setPrepState(int state) {
switch (state) {
case PREPARED:
case NOTCHANGED:
case COMMITTED:
case ABORTED:
break;
default:
throw new IllegalArgumentException("ParticipantHandle: " +
"setPrepState: cannot set to " +
com.sun.jini.constants.TxnConstants.getName(state));
}
this.prepstate = state;
}
synchronized int getPrepState() {
return prepstate;
}
boolean compareTo(ParticipantHandle other) {
if (storedpart != null)
return storedpart.equals(other);
else if (other == null)
return false;
return false;
}
/**
* Return the <code>hashCode</code> of the
* embedded <code>TransactionParticipant</code>.
*/
public int hashCode() {
return preparedPart.hashCode();
}
public boolean equals(Object that) {
if (this == that)
return true;
if (that == null)
return false;
if (that.getClass() != getClass())
return false;
ParticipantHandle h = (ParticipantHandle)that;
return preparedPart.equals(h.preparedPart);
}
}