/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.compare.generator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.teiid.core.designer.UserCancelledException;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.designer.compare.ModelGenerator;
import org.teiid.designer.core.compare.EObjectMatcherFactory;
/**
* CompositeModelGenerator
*
* @since 8.0
*/
public class CompositeModelGenerator extends AbstractModelGenerator {
private final List modelGenerators;
/**
* Construct an instance of AbstractModelGenerator.
* @param modelGenerators the list of {@link EObjectMatcherFactory mapping adapter}
* instances used during the difference processing; may not be null or empty
*/
public CompositeModelGenerator( final List modelGenerators ) {
super(null);
CoreArgCheck.isNotNull(modelGenerators);
this.modelGenerators = modelGenerators != null ? modelGenerators : new ArrayList();
}
/**
* Return the ordered list of {@link ModelGenerator} instances that comprise this generator.
* @return the list of generators; never null
*/
public List getModelGenerators() {
return this.modelGenerators;
}
/**
* @see org.teiid.designer.compare.generator.AbstractModelGenerator#getAllDifferenceReports()
*/
@Override
public List getAllDifferenceReports() {
final List reports = new LinkedList();
final Iterator iter = getModelGenerators().iterator();
while (iter.hasNext()) {
final ModelGenerator generator = (ModelGenerator)iter.next();
reports.addAll(generator.getAllDifferenceReports());
}
return reports;
}
/**
* This method closes each of the {@link #getModelGenerators() ModelGenerators} that make up this
* object. This metod overrides the inherited behavior.
* @see org.teiid.designer.compare.generator.AbstractModelGenerator#close()
*/
@Override
public void close() {
super.close();
final Iterator iter = getModelGenerators().iterator();
while (iter.hasNext()) {
final ModelGenerator generator = (ModelGenerator)iter.next();
generator.close();
}
}
// =========================================================================
// Methods to implement basic behavior
// =========================================================================
/**
* @see org.teiid.designer.compare.generator.AbstractModelGenerator#doClearDifferenceReports()
*/
@Override
protected void doClearDifferenceReports() {
// do nothing; they are always regenerated from the contained ...
}
/**
* @see org.teiid.designer.compare.generator.AbstractModelGenerator#doGenerateOutput(org.eclipse.core.runtime.IProgressMonitor, java.util.LinkedList)
*/
@Override
protected void doGenerateOutput(final IProgressMonitor monitor,
final LinkedList problems) throws UserCancelledException {
// Generate all of the contained ...
final Iterator iter = getModelGenerators().iterator();
while (iter.hasNext()) {
final ModelGenerator generator = (ModelGenerator)iter.next();
final IStatus status = generator.generateOutput(monitor);
problems.add(status);
}
}
/**
* @see org.teiid.designer.compare.generator.AbstractModelGenerator#doComputeDifferenceReport(org.eclipse.core.runtime.IProgressMonitor, java.util.LinkedList)
*/
@Override
protected void doComputeDifferenceReport(final IProgressMonitor monitor,
final LinkedList problems) throws UserCancelledException {
// Generate all of the contained ...
final Iterator iter = getModelGenerators().iterator();
while (iter.hasNext()) {
final ModelGenerator generator = (ModelGenerator)iter.next();
final IStatus status = generator.computeDifferenceReport(monitor);
problems.add(status);
}
}
/**
* @see org.teiid.designer.compare.generator.AbstractModelGenerator#doPostProcessDifferenceReports()
*/
@Override
protected void doPostProcessDifferenceReports() {
// do nothing, since each generator in this composite will each tell themselves to post-process
// their own
}
/**
* @see org.teiid.designer.compare.generator.AbstractModelGenerator#doMergeOutputIntoOriginal(org.eclipse.core.runtime.IProgressMonitor, java.util.LinkedList)
*/
@Override
protected void doMergeOutputIntoOriginal(final IProgressMonitor monitor,
final LinkedList problems) throws UserCancelledException {
// Generate all of the contained ...
final Iterator iter = getModelGenerators().iterator();
while (iter.hasNext()) {
final ModelGenerator generator = (ModelGenerator)iter.next();
if ( generator instanceof AbstractModelGenerator ) {
final AbstractModelGenerator amg = (AbstractModelGenerator)generator;
// Tell the generators to use this composite generator's mapping
amg.setProducedToOutputMapping( this.getProducedToOutputMapping() );
}
final IStatus status = generator.mergeOutputIntoOriginal(monitor);
problems.add(status);
}
// Reresolve imports ...
this.doReresolveAndRebuildImports();
if( isSaveAllBeforeFinish() ) {
this.saveModel();
}
}
/**
* @see org.teiid.designer.compare.generator.AbstractModelGenerator#doReresolveAndRebuildImports()
* @since 4.2
*/
@Override
protected void doReresolveAndRebuildImports() {
// Go through all of the contained generators and invoke their postMerge ...
final Iterator iter2 = getModelGenerators().iterator();
while (iter2.hasNext()) {
final ModelGenerator generator = (ModelGenerator)iter2.next();
if ( generator instanceof AbstractModelGenerator ) {
final AbstractModelGenerator amg = (AbstractModelGenerator)generator;
amg.doReresolveAndRebuildImports();
}
}
}
/**
*
* @see org.teiid.designer.compare.ModelGenerator#setNewModelCase(boolean)
* @since 5.0.2
*/
@Override
public void setNewModelCase(boolean theIsNewModelCase) {
super.setNewModelCase(theIsNewModelCase);
// Commumnicate the boolean to child generators
final Iterator iter = getModelGenerators().iterator();
while (iter.hasNext()) {
final ModelGenerator generator = (ModelGenerator)iter.next();
generator.setNewModelCase(theIsNewModelCase);
}
}
/**
*
* @see org.teiid.designer.compare.ModelGenerator#saveModel()
* @since 5.0.2
*/
@Override
public void saveModel() {
// Commumnicate the saveModel() to child generators
final Iterator iter = getModelGenerators().iterator();
while (iter.hasNext()) {
final ModelGenerator generator = (ModelGenerator)iter.next();
generator.saveModel();
}
}
/**
*
* @see org.teiid.designer.compare.ModelGenerator#setSaveAllBeforeFinish(boolean)
* @since 5.0.2
*/
@Override
public void setSaveAllBeforeFinish(boolean theDoSave) {
super.setSaveAllBeforeFinish(theDoSave);
final Iterator iter = getModelGenerators().iterator();
while (iter.hasNext()) {
final ModelGenerator generator = (ModelGenerator)iter.next();
generator.setSaveAllBeforeFinish(theDoSave);
}
}
}