/* * Hibernate, Relational Persistence for Idiomatic Java * * Copyright (c) 2010, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.hibernate.engine.jdbc.internal.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import org.hibernate.HibernateException; /** * Basic support for building proxy handlers. * * @author Steve Ebersole */ public abstract class AbstractProxyHandler implements InvocationHandler { private boolean valid = true; private final int hashCode; public AbstractProxyHandler(int hashCode) { this.hashCode = hashCode; } protected abstract Object continueInvocation(Object proxy, Method method, Object[] args) throws Throwable; public String toString() { return super.toString() + "[valid=" + valid + "]"; } public final int hashCode() { return hashCode; } protected final boolean isValid() { return valid; } protected final void invalidate() { valid = false; } protected final void errorIfInvalid() { if ( !isValid() ) { throw new HibernateException( "proxy handle is no longer valid" ); } } public final Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName(); // basic Object methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ( "toString".equals( methodName ) ) { return this.toString(); } if ( "hashCode".equals( methodName ) ) { return this.hashCode(); } if ( "equals".equals( methodName ) ) { return this.equals( args[0] ); } return continueInvocation( proxy, method, args ); } }