/** * Copyright (c) 2006 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 java.util.Collection; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.common.util.Monitor; /** * An adapter that performs code generation for a {@link Generator}. * * <p>A <code>GeneratorAdapter</code> implementation performs code generation for a single type of model object. It is * created by a {@link GeneratorAdapterFactory} and used by its containing {@link Generator}. Several different * generator adapters can be associated with a single object, with each one contributing functionality to the code * generation for that object. A singleton pattern is usually used for generator adapters, where a single instance of an * adapter type is shared by all instances of the same object type. * * <p>A generator adapter is primarily responsible for two aspects of two tasks. The tasks are: * <ul> * <li>Determining whether code generation is possible for an object. * <li>Generating code for an object. * </ul> * * <p>The two aspects of these tasks are: * <ul> * <li>Assembling the tree of relevant objects for the task. * <li>Performing the task for each object. * </ul> * * <p>In all cases, a project type can be used to identify a subset of the code generation for the given object. This * is an arbitrary object that should be meaningful to the particular generator adapter. * * <p>See {@link Generator#canGenerate(Object, Object)} and {@link Generator#generate(Object, Object, String, Monitor)} * for detailed descriptions of the protocol by which generator adapters are actually used to complete the two tasks. * * @see Generator#canGenerate(Object, Object) * @see Generator#generate(Object, Object, String, Monitor) * @since 2.2.0 */ public interface GeneratorAdapter { /** * Returns the adapter factory that created this adapter. * * @see #setAdapterFactory(GeneratorAdapterFactory) */ GeneratorAdapterFactory getAdapterFactory(); /** * Sets the adapter factory that created this adapter. If the constructor for the adapter does not set the adapter * factory, this method can be called immediately after the adapter is created. * * @see #getAdapterFactory() */ void setAdapterFactory(GeneratorAdapterFactory adapterFactory); /** * Returns any children of the specified object that are relevant to determining whether code, of the given project * type, can be generated for the specified object. */ Collection<?> getCanGenerateChildren(Object object, Object projectType); /** * Returns the parent of the specified object if it is relevant to determining whether code, of the given project * type, can be generated for the specified object. */ Object getCanGenerateParent(Object object, Object projectType); /** * Returns whether code of the given object type can be generated for the specified object. */ boolean canGenerate(Object object, Object projectType); /** * Returns any children of the specified object for which code of the given project type may be generated. */ Collection<?> getGenerateChildren(Object object, Object projectType); /** * Returns the parent of the specified object if code of the given project type may be generated for it. */ Object getGenerateParent(Object object, Object projectType); /** * Called before any code is generated for the object and/or any of its parents and/or children, in order to give * the adapter a chance to perform setup for the code generation. */ Diagnostic preGenerate(Object object, Object projectType); /** * Generates code for the given object and project type. Because this is a long-running operation, the monitor is * used to report progress. */ Diagnostic generate(Object object, Object projectType, Monitor monitor); /** * Called after all code is generated for the object and/or any of its parents and/or children, in order to give * the adapter a chance to perform cleanup from the code generation. */ Diagnostic postGenerate(Object object, Object projectType); /** * Removes the adapter from its {@link org.eclipse.emf.common.notify.Notifier Notifier}s and performs any other needed * disposal. */ void dispose(); }