/*
* 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.query.ui.builder.model;
import java.util.ArrayList;
import java.util.List;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.core.designer.util.I18nUtil;
import org.teiid.designer.query.sql.lang.ILanguageObject;
/**
* The <code>CompositeLanguageObjectEditorModel</code> manages a collection of <code>ILanguageObjectEditorModel</code>s.
*
* @since 8.0
*/
public abstract class CompositeLanguageObjectEditorModel extends AbstractLanguageObjectEditorModel {
/** Logging prefix. */
private static final String PREFIX = I18nUtil.getPropertyPrefix(CompositeLanguageObjectEditorModel.class);
/** Event type indicating the currently selected model has changed. */
public static final String MODEL_CHANGE = "MODEL_CHANGE"; //$NON-NLS-1$
/** The currently selected model from the model collection. */
private ILanguageObjectEditorModel currentModel;
/** Listener for changes in the model collection. */
private ModelListener listener;
/** Collection of <code>ILanguageObjectEditorModel</code>s being managed. */
private List models;
/**
* Constructs a <code>CompositeLanguageObjectEditorModel</code> that handles <code>LanguageObject</code>s of the given type.
*
* @param theLanguageObjectType the type of <code>LanguageObject</code>
*/
public CompositeLanguageObjectEditorModel( Class theLanguageObjectType ) {
super(theLanguageObjectType);
}
/**
* Adds a model to the collection of models being managed by this model. Subclasses must add models at construction time.
*/
protected void addModel( ILanguageObjectEditorModel theModel ) {
if (models == null) {
models = new ArrayList();
listener = new ModelListener();
}
models.add(theModel);
theModel.addModelListener(listener);
if (currentModel == null) {
currentModel = theModel;
}
}
/**
* Gets the current model.
*
* @return the current model
*/
public ILanguageObjectEditorModel getCurrentModel() {
CoreArgCheck.isNotNull(models, Util.getString(PREFIX + "noModelsFound", //$NON-NLS-1$
new Object[] {"getCurrentModel"})); //$NON-NLS-1$
return currentModel;
}
/**
* @see org.teiid.query.ui.builder.model.ILanguageObjectEditorModel#getLanguageObject()
*/
@Override
public ILanguageObject getLanguageObject() {
CoreArgCheck.isNotNull(models, Util.getString(PREFIX + "noModelsFound", //$NON-NLS-1$
new Object[] {"getLanguageObject"})); //$NON-NLS-1$
ILanguageObject langObj = null;
if (currentModel != null) {
langObj = currentModel.getLanguageObject();
}
return langObj;
}
/**
* Handler for when one of the models this model is managing has changed.
*
* @param theEvent the event being processed
*/
protected void handleModelChanged( LanguageObjectEditorModelEvent theEvent ) {
Object source = theEvent.getSource();
if (source == currentModel) {
fireModelChanged(theEvent.getType());
}
}
/**
* @see org.teiid.query.ui.builder.model.ILanguageObjectEditorModel#isComplete()
*/
@Override
public boolean isComplete() {
CoreArgCheck.isNotNull(models, Util.getString(PREFIX + "noModelsFound", //$NON-NLS-1$
new Object[] {"isComplete"})); //$NON-NLS-1$
boolean complete;
if (getCurrentModel() == null) {
complete = false;
} else {
ILanguageObjectEditorModel model = getCurrentModel();
complete = model.isComplete();
}
return complete;
}
/**
* @see org.teiid.query.ui.builder.model.AbstractLanguageObjectEditorModel#save()
*/
@Override
public void save() {
super.save();
currentModel.save();
// clear all other models
for (int size = models.size(), i = 0; i < size; i++) {
ILanguageObjectEditorModel model = (ILanguageObjectEditorModel)models.get(i);
if (model != currentModel) {
// model.clear();
}
}
}
/**
* Sets the given model as the current model. Fires an <code>LanguageObjectEditorModelEvent</code> if the current model
* actually changes. The previous model is cleared.
*
* @param theModel the model be set as the current model
* @throws IllegalArgumentException if parameter is <code>null</code> or is not contained in the collection of models
*/
public void setCurrentModel( ILanguageObjectEditorModel theModel ) {
if (models == null) {
CoreArgCheck.isNotNull(models, Util.getString(PREFIX + "noModelsFound", //$NON-NLS-1$
new Object[] {"setCurrentModel"})); //$NON-NLS-1$
}
CoreArgCheck.contains(models, theModel);
if ((currentModel == null) || (currentModel != theModel)) {
currentModel = theModel;
fireModelChanged(MODEL_CHANGE);
}
}
/**
* @see org.teiid.query.ui.builder.model.AbstractLanguageObjectEditorModel#setLanguageObject(org.teiid.query.sql.LanguageObject)
*/
@Override
public void setLanguageObject( ILanguageObject theLangObj ) {
CoreArgCheck.isNotNull(models, Util.getString(PREFIX + "noModelsFound", //$NON-NLS-1$
new Object[] {"setLanguageObject"})); //$NON-NLS-1$
super.setLanguageObject(theLangObj);
ILanguageObject langObj = getSavedLanguageObject();
ILanguageObjectEditorModel newModel = null;
if (langObj == null) {
// set to first model
newModel = (ILanguageObjectEditorModel)models.get(0);
} else {
Class langObjType = langObj.getClass();
// find sub-model that can handle this type of language object
for (int size = models.size(), i = 0; i < size; i++) {
ILanguageObjectEditorModel model = (ILanguageObjectEditorModel)models.get(i);
if (model.getModelType().isAssignableFrom(langObjType)) {
newModel = model;
break;
}
}
// always should have a submodel that can handle the language object type
if (newModel == null) {
// TODO: WE don't have a mode editor for some types like Scalar SubQuery, but we don't want to
// Throw up too many problem dialogs....
// CoreArgCheck.isNotNull(newModel, Util.getString(PREFIX + "noModelFoundForLangObj", //$NON-NLS-1$
// new Object[] {langObj.getClass().getName()}));
return;
}
}
if (newModel == currentModel) {
currentModel.setLanguageObject(langObj);
} else {
newModel.setLanguageObject(langObj);
setCurrentModel(newModel);
}
// the call to super did a save but this was before the language object had been set
// on the appropriate sub-model.
// save();
}
/**
* The <code>ModelListener</code> class processes changes to any model being managed by this model.
*/
class ModelListener implements ILanguageObjectEditorModelListener {
/**
* @see org.teiid.query.ui.builder.model.ILanguageObjectEditorModelListener#modelChanged(org.teiid.query.ui.builder.model.LanguageObjectEditorModelEvent)
*/
@Override
public void modelChanged( LanguageObjectEditorModelEvent theEvent ) {
handleModelChanged(theEvent);
}
}
}