blob: 07c8e1979d864ad8c41951f1f34dc635fdef3894 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.model.adapters;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
/**
* Abstract adapter has basic adapter functionality and it has some
* logic to decide whether adapters are stateful or stateless.
*
* @author Michal Chmielewski (michal.chmielewski@oracle.com)
* @date Sep 15, 2006
*
*/
public class AbstractAdapter implements Adapter {
/** The event type that we will consume that indicates a context update */
static public final int CONTEXT_UPDATE_EVENT_TYPE = 101;
/** Makes sense only when adapters are statefull */
// Bugzilla 330519
// need access to this in MarkerDelegateAdapter
protected Object target = null;
/** additional context that is needed by the adapter to wrap the object */
private Object context = null;
/**
* Allow the adapter to store new context information. This
* only works if the adapter is stateful.
*
*
* @param notification the notification to process.
*/
public void notifyChanged (Notification notification) {
if (notification.getEventType() == CONTEXT_UPDATE_EVENT_TYPE && isStatefull() ) {
context = notification.getNewValue();
}
}
/**
* Return the target. This will always be null in case the
* adapter is stateless.
*
* @return the target
*/
public Notifier getTarget() {
return getTarget(target,Notifier.class);
}
/**
* Set the target element, only if the adapter is stateless.
*
* @param newTarget the target to set
*/
public void setTarget(Notifier newTarget) {
if ( isStatefull() ) {
target = newTarget;
}
}
/**
*
* @param newTarget
*/
public void setTarget (Object newTarget) {
if (isStatefull()) {
target = newTarget;
}
}
/**
* Answer true if we are an adapter for the type given
* @param type the object type to check.
* @return true if so, false if not
*/
public boolean isAdapterForType (Object type) {
Class<?> clazz = null;
// what is type ? (an interface)
if (type instanceof Class) {
clazz = (Class) type;
return clazz.isInstance(this);
}
// what else could it be ?
return false;
}
/**
* Return any context object that the adapter is holding.
* @return the context object
*/
public Object getContext () {
return context;
}
/**
* Answer if we are a stateful adapter or not.
*
* @return true if stateful, false if stateless.
*/
public boolean isStatefull () {
return IStatefullAdapter.class.isInstance(this);
}
/**
* Some adapters rely on interfaces that are stateless, where the target
* is passed as an argument to the adapter. This is not necessarily true for
* some interfaces we cannot control (like IContentProposal).
*
* @param <T> The type class
* @param obj the object which might be the adapted target
* @param clazz the class that the target must be an instance of.
* @return the target object
*/
@SuppressWarnings("unchecked")
public <T extends Object> T getTarget ( Object obj , Class<T> clazz ) {
if (obj != null) {
if (clazz.isInstance(obj)) {
return (T) obj;
}
if (target != null) {
if (clazz.isInstance(target)) {
return (T) target;
}
}
// problem !
throw new RuntimeException("Object is not of type " + clazz.getName()); //$NON-NLS-1$
}
/** Target is never set unless the object is statefull. */
if (target != null) {
if (clazz.isInstance(target)) {
return (T) target;
}
// problem !
throw new RuntimeException("Target is not of type " + clazz.getName()); //$NON-NLS-1$
}
return null;
}
}