/**
* Copyright (c) 2009 Mia-Software.
* 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:
* Fabien GIQUEL (Mia-Software) - initial API and implementation
* Nicolas Bros (Mia-Software) - Bug 335003 - [Discoverer] : Existing Discoverers Refactoring based on new framework
*******************************************************************************/
package org.eclipse.modisco.java.discoverer.internal;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.gmt.modisco.java.Model;
import org.eclipse.modisco.java.discoverer.internal.io.java.binding.BindingManager;
/**
* The interface for readers which build Java models.
* <p>
* A model reader reads a source (a Java project for example) and fills a given
* {@link Model} object.
* </p>
* <p>
* Concrete model readers should indicate which source type they can handle.
* </p>
* <p>
* When using the methods {@code readModel} with no {@link BindingManager}, the
* reader uses a private blank one. Otherwise, the reader uses the given
* {@code BindingManager} to handle global references. This is useful when
* linking readers.
* </p>
* <p>
* After model creation, don't forget to call {@link #terminate()} to finish the
* process. This is <b>not</b> done automatically to allow to link readers.
* Clients shouldn't make modifications on the resulting {@code Model}.
* </p>
*/
public interface IModelReader {
/**
* This is a convenience method for
* {@link #readModel(Object, Model, BindingManager, IProgressMonitor)} with
* a private blank {@code BindingManager}.
*
* @see #readModel(Object, Model, BindingManager, IProgressMonitor)
* @param source
* the source element to analyse
* @param model
* the resulting {@code Model}
* @param monitor
* a monitor to report progress
*/
public void readModel(Object source, Model model, IProgressMonitor monitor);
/**
* Reads the source and fill the {@code model} object. This reader will use
* the given {@code BindingManager} to handle global references.
* <p>
* Readers implementing this method should throw an
* {@link IllegalArgumentException} if source is not analysable.
* </p>
*
* @param source
* the source to analyse
* @param model
* the resulting {@code Model}
* @param globalBindings
* the global {@code BindingManager}
* @param monitor
* a monitor to report progress
* @throws IllegalArgumentException
* if the reader can not handle the source (for example, a
* library reader can not analyse a compilation unit)
*/
public void readModel(Object source, Model model, BindingManager globalBindings,
IProgressMonitor monitor);
/**
* Finalize the creation of the model.
* <p>
* For a single source, should be called on the reader after analysis of the
* source. For multiple sources, should be called on any reader after
* analysis of all sources.
* </p>
* <p>
* Clients shouldn't make modifications on the resulting {@code Model}.
* </p>
*
* @param monitor
* a monitor to report progress
*/
public void terminate(IProgressMonitor monitor);
}