| /******************************************************************************* |
| * 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; |
| |
| |
| |
| } |
| |
| } |