/*
* 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;
import org.teiid.query.ui.UiConstants;
import org.teiid.query.ui.builder.util.BuilderUtils;
/**
* AbstractLanguageObjectEditorModel
*
* @since 8.0
*/
public abstract class AbstractLanguageObjectEditorModel implements ILanguageObjectEditorModel, UiConstants {
// /////////////////////////////////////////////////////////////////////////////////////////////
// CONSTANTS
// /////////////////////////////////////////////////////////////////////////////////////////////
private static final String PREFIX = I18nUtil.getPropertyPrefix(AbstractLanguageObjectEditorModel.class);
// /////////////////////////////////////////////////////////////////////////////////////////////
// FIELDS
// /////////////////////////////////////////////////////////////////////////////////////////////
private ILanguageObject savedLangObj;
private List<ILanguageObjectEditorModelListener> listeners;
protected boolean notifyListeners = true;
/** The model language object type. */
private Class modelType;
// /////////////////////////////////////////////////////////////////////////////////////////////
// CONSTRUCTORS
// /////////////////////////////////////////////////////////////////////////////////////////////
public AbstractLanguageObjectEditorModel( Class theType ) {
setModelType(theType);
}
// /////////////////////////////////////////////////////////////////////////////////////////////
// METHODS
// /////////////////////////////////////////////////////////////////////////////////////////////
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.model.ILanguageObjectEditorModel#addModelListeners(org.teiid.query.ui.builder.model.ILanguageObjectEditorModelListener)
*/
@Override
public boolean addModelListener( ILanguageObjectEditorModelListener theListener ) {
CoreArgCheck.isNotNull(theListener);
boolean result = false;
if (listeners == null) {
listeners = new ArrayList<ILanguageObjectEditorModelListener>();
}
if (!listeners.contains(theListener)) {
result = listeners.add(theListener);
}
return result;
}
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.model.ILanguageObjectEditorModel#clear()
*/
@Override
public void clear() {
if (savedLangObj != null) {
savedLangObj = null;
fireModelChanged(LanguageObjectEditorModelEvent.SAVED);
}
}
/**
* Notifies registered {@link org.teiid.query.ui.builder.model.ILanguageObjectEditorModelListener}s of the given
* event. Listeners are notified in the order they registered in.
*
* @param theEvent the event being broadcast
*/
protected void fireModelChanged( String theType ) {
if (notifyListeners && (listeners != null)) {
LanguageObjectEditorModelEvent event = new LanguageObjectEditorModelEvent(this, theType);
for (int size = listeners.size(), i = 0; i < size; i++) {
ILanguageObjectEditorModelListener listener = listeners.get(i);
listener.modelChanged(event);
}
}
}
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.model.ILanguageObjectEditorModel#getLanguageObject()
*/
@Override
public abstract ILanguageObject getLanguageObject();
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.model.ILanguageObjectEditorModel#getType()
*/
@Override
public Class getModelType() {
return modelType;
}
/**
* Gets the saved <code>LanguageObject</code>.
*
* @return the <code>LanguageObject</code> or <code>null</code>
*/
protected ILanguageObject getSavedLanguageObject() {
return savedLangObj;
}
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.model.ILanguageObjectEditorModel#hasChanged()
*/
@Override
public boolean hasChanged() {
// if no saved language object return true if complete
// if there is a saved language object return true if the current value is complete and different
boolean result = false;
if (savedLangObj == null) {
result = isComplete();
} else {
boolean complete = isComplete();
if (complete) {
result = (!savedLangObj.equals(getLanguageObject()));
} else {
result = false;
}
}
return result;
}
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.model.ILanguageObjectEditorModel#isComplete()
*/
@Override
public abstract boolean isComplete();
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.model.ILanguageObjectEditorModel#removeModelListener(org.teiid.query.ui.builder.model.ILanguageObjectEditorModelListener)
*/
@Override
public boolean removeModelListener( ILanguageObjectEditorModelListener theListener ) {
CoreArgCheck.isNotNull(theListener);
boolean result = false;
if (listeners != null) {
result = listeners.remove(theListener);
if (listeners.isEmpty()) {
listeners = null;
}
}
return result;
}
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.model.ILanguageObjectEditorModel#reset()
*/
@Override
public void reset() {
setLanguageObject(savedLangObj);
}
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.model.ILanguageObjectEditorModel#save()
*/
@Override
public void save() {
savedLangObj = getLanguageObject();
fireModelChanged(LanguageObjectEditorModelEvent.SAVED);
}
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.model.ILanguageObjectEditorModel#setLanguageObject(org.teiid.query.sql.LanguageObject)
*/
@Override
public void setLanguageObject( ILanguageObject theLangObj ) {
if (theLangObj != null) {
if (!modelType.isAssignableFrom(theLangObj.getClass())) {
CoreArgCheck.isTrue(modelType.isAssignableFrom(theLangObj.getClass()),
Util.getString(PREFIX + "wrongLangObjType", //$NON-NLS-1$
new Object[] {theLangObj.getClass().getName(), modelType.getName()}));
}
}
// make sure no implicit functions get shown to user
savedLangObj = (theLangObj == null) ? theLangObj : BuilderUtils.getBuilderLanguageObject(theLangObj);
}
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.model.ILanguageObjectEditorModel#setType(java.lang.Class)
*/
@Override
public void setModelType( Class theLanguageObjectClass ) {
CoreArgCheck.isNotNull(theLanguageObjectClass, PREFIX + "nullType"); //$NON-NLS-1$
CoreArgCheck.isTrue(ILanguageObject.class.isAssignableFrom(theLanguageObjectClass), PREFIX + "modelTypeNotLangObj"); //$NON-NLS-1$
modelType = theLanguageObjectClass;
}
}