/** * Copyright (c) 6 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 - Initial API and implementation */ package org.eclipse.emf.codegen.ecore.generator; import org.eclipse.emf.codegen.ecore.generator.Generator; import org.eclipse.emf.codegen.ecore.generator.GeneratorAdapter; import org.eclipse.emf.codegen.ecore.generator.GeneratorAdapterFactory; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl; /** * A base <code>GeneratorAdapterFactory</code> implementation. Classes that extend this implementation need only * implement {@link #createAdapter(Notifier)} and {@link #dispose()}. * * <p>An alternate approach to implementing <code>GeneratorAdapterFactory</code> is to extend the adapter factory * generated for a package. <code>GeneratorAdapterFactory</code>'s overrides of {@link #isFactoryForType(Object)} and * {@link #adapt(Notifier, Object)} should be duplicated in classes that take such an approach. * * @since 2.2.0 */ public abstract class AbstractGeneratorAdapterFactory extends AdapterFactoryImpl implements GeneratorAdapterFactory { protected Generator generator; public AbstractGeneratorAdapterFactory() { super(); } /** * Returns <code>true</code> when the type is <code>GeneratorAdapter.class</code>. */ @Override public boolean isFactoryForType(Object type) { return type == GeneratorAdapter.class; } /** * Does an {@link org.eclipse.emf.common.notify.impl.AdapterFactoryImpl#adapt(Notifier, Object) adapt(Notifier, Object)}, * substituting <code>this</code> for the given <code>type</code>. This substitution is necessary because each of many * generator adapter factories can have its own generator adapter on a single object. */ @Override public Adapter adapt(Notifier target, Object type) { return super.adapt(target, this); } /** * Calls {@link #createAdapter(Notifier)} to create an adapter for the given <code>Notifier</code> and sets its * {@link GeneratorAdapter#setAdapterFactory(GeneratorAdapterFactory) adapter factory} to <code>this</code>. */ @Override protected Adapter createAdapter(Notifier target, Object type) { Adapter adapter = createAdapter(target); if (adapter != null) { ((GeneratorAdapter)adapter).setAdapterFactory(this); } return adapter; } /** * Override this to create the adapter for a <code>Notifier</code>. The adapter must implement * <code>GeneratorAdapter</code>. */ @Override protected abstract Adapter createAdapter(Notifier target); /** * There's no general way to check if a non-<code>Notifier</code> already has an adapter associated with it, but in * cases where there is a way, override this method and do it here. This method parallels * {@link #adapt(Notifier, Object)} for plain Java objects, and is not usually needed when dealing only with * <code>EObject</code>s. */ @Override protected Object resolve(Object object, Object type) { return createAdapter(object, type); } /** * Calls {@link #createAdapter(Object)} to create an adapter for the given object and sets its * {@link GeneratorAdapter#setAdapterFactory(GeneratorAdapterFactory) adapter factory} to <code>this</code>. This * method parallels {@link #createAdapter(Notifier, Object)} for plain Java objects, and is not usually needed when * dealing only with <code>EObject</code>s. */ protected Object createAdapter(Object object, Object type) { GeneratorAdapter adapter = createAdapter(object); if (adapter != null) { adapter.setAdapterFactory(this); } return adapter; } /** * The given object is returned if it is, itself, a <code>GeneratorAdapter</code>. This can be overridden to create an * appropriate adapter for a object. It parallels {@link #createAdapter(Notifier)} for plain Java objects, and is and * is not usually needed when dealing only with <code>EObject</code>s. */ protected GeneratorAdapter createAdapter(Object object) { return object instanceof GeneratorAdapter ? (GeneratorAdapter)object : null; } public Generator getGenerator() { return generator; } public void setGenerator(Generator generator) { this.generator = generator; } /** * Performs initialization for the given model-level input object. This implementation does nothing; it should be * overridden when {@link Generator#getOptions() options} should be set on the generator, or other initialization * is required. */ public void initialize(Object input) { // Subclasses may override } public abstract void dispose(); }