blob: 963d488e7c69674b8b8b1a38db349bebe7138258 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2005 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 Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.common.frameworks.datamodel.provisional;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
/**
* <p>
* This interface is not intended to be implemented by clients.
* </p>
*/
public interface IDataModel {
public IDataModelOperation getDefaultOperation();
public List getExtendedContext();
/**
* <p>
* Returns the property value for the specified propertyName.
* </p>
* <p>
* If the specified propertyName is not a property {@see #isProperty(String)}then a
* RuntimeException will be thrown.
* </p>
* <p>
* If the specified propertyName is a base property {@see #isBaseProperty(String)}then it will
* immediatly be set and nested models will not be affected. If it is not a base property (i.e.
* it is a property for a nested DataModel) then a recursive search through nested DataModels
* will be conducted. The first nested DataModel having the property will return its value.
* </p>
*
* @param propertyName
* @return
*
* @see #getBooleanProperty(String)
* @see #getIntProperty(String)
* @see #getStringProperty(String)
*/
public Object getProperty(String propertyName);
/**
* <p>
* Returns the default property value for the specified propertyName.
* </p>
*/
public Object getDefaultProperty(String propertyName);
/**
* <p>
* A convenience method for getting ints. If the property is set then this method is equavalent
* to:
* <p>
* <code>((Integer)getProperty(propertyName)).intValue();</code>
* <p>
* If the property is unset, <code>-1</code> will be returned.
*
* @param propertyName
* the property name
* @return the int value of the property
* @see #setProperty(String, Object)
* @see #setIntProperty(String, int)
*/
public int getIntProperty(String propertyName);
/**
* <p>
* A convenience method for getting booleans. If the property is set then this method is
* equavalent to:
* <p>
* <code>((Boolean)getProperty(propertyName)).booleanValue();</code>
* <p>
* If the property is unset, <code>false</code> will be returned.
*
* @param propertyName
* the property name
* @return the boolean value of the property
* @see #setProperty(String, Object)
* @see #setBooleanProperty(String, int)
*/
public boolean getBooleanProperty(String propertyName);
/**
* <p>
* A convenience method for getting Strings. If the property is set then this method is
* equavalent to:
* <p>
* <code>(String)getProperty(propertyName)</code>
* <p>
* If the property is unset, the empty String, <code>""</code>, will be returned.
*
* @param propertyName
* @param value
* @see #setProperty(String, Object)
*/
public String getStringProperty(String propertyName);
/**
* <p>
* Sets the specified propertyName to the specified propertyValue. Subsequent calls to
* #getProperty(String) will return the same propertyValue.
* <p>
* When a propertyValue other than <code>null</code> is set, then the property is considered
* "set" (see #isSet(String)), conversly, a propertyValue of <code>null</code> is considered
* "unset".
* <p>
* If the specified propertyName is not a property (see#isProperty(String)) then a
* RuntimeException will be thrown.
* <p>
* Attempting to set a propertyName when this DataModel is locked (see #isLocked()) will result
* in a thrown IllegalStateException. An IllegalStateException will not be thrown, however, if
* the propertyName is a Result Property, (see #isResultProperty(String)).
* <p>
*
* @param propertyName
* @param propertyValue
*
*
* @see #getProperty(String)
* @see #isSet(String)
* @see #isProperty(String)
* @see #isResultProperty(String)
* @see #isLocked()
*
* <p>
* There are also convenience methods for setting properties representing property types of
* boolean and int.
* <p>
* @see #setBooleanProperty(String, boolean)
* @see #setIntProperty(String, int)
*/
public void setProperty(String propertyName, Object propertyValue);
/**
* <p>
* A convenience method for setting ints. This method is equavalent to:
* <p>
* <code>setProperty(propertyName, new Integer(value));</code>
* </p>
*
* @param propertyName
* the name of the property
* @param value
* the <code>int</code> value of the property
* @see #setProperty(String, Object)
* @see #getIntProperty(String)
*/
public void setIntProperty(String propertyName, int propertyValue);
/**
* <p>
* A convenience method for setting booleans. This method is equavalent to:
* <p>
* <code>setProperty(propertyName, (value) ? Boolean.TRUE : Boolean.FALSE);</code>
* </p>
*
* @param propertyName
* the name of the property
* @param value
* the <code>boolean</code> value of the property
* @see #setProperty(String, Object)
* @see #getBooleanProperty(String)
*/
public void setBooleanProperty(String propertyName, boolean propertyValue);
/**
* <p>
* A convenience method for setting Strings. This method is equavalent to:
* <p>
* <code>setProperty(propertyName, value);</code>
* </p>
*
* @param propertyName
* the name of the property
* @param value
* the value of the property
* @see #setProperty(String, Object)
* @see #getBooleanProperty(String)
*/
public void setStringProperty(String propertyName, String propertyValue);
/**
* <p>
* This method is used to nest the specified IDataModel within this IDataModel. The
* <code>modelName</code> argument should be a unique String to identify this particular
* nested IDataModel. The same String is required when accessing the nested IDataModel using
* either <code>getNestedModel(String)</code> or <code>removeNestedModel(String)</code>. If
* the specified nested IDataModel has already been nested under this IDataModel or it is the
* same instance as this IDataModel, then calling this method will have no effect.
* </p>
* <p>
* Refer to <A HREF="#nestedDataModels"> <CODE>NestedDataModels</CODE> </A>.
* </p>
*
* @param modelName
* the name of the IDataModel to be nested
* @param dataModel
* the IDataModel to be nested
*
* @see #getNestedModel(String)
* @see #removeNestedModel(String)
* @return <code>true</code> if the nesting was successful, <code>false</code> otherwise.
*/
public boolean addNestedModel(String nestedModelName, IDataModel dataModel);
/**
* <p>
* Remove the specified nestedModel.
* </p>
*
* @param nestedModelName
* @return the IDataModel removed, or <code>null</code> if the nested model does not exist or
* if the specified name is null.
*/
public IDataModel removeNestedModel(String nestedModelName);
public boolean isNestedModel(String nestedModelName);
public IDataModel getNestedModel(String nestedModelName);
public Collection getNestedModels();
public Collection getNestingModels();
public Collection getBaseProperties();
public Collection getNestedProperties();
public Collection getAllProperties();
/**
* Returns <code>true</code> if the specified propertyName is a valid propertyName for this
* root DataModel only. Nested DataModels are not checked.
*
* @param propertyName
* @return
* @see #isProperty(String)
*/
public boolean isBaseProperty(String propertyName);
/**
* Returns <code>true</code> if the specified propertyName is a valid propertyName for this
* DataModel or any of its (recursively) nested DataModels.
*
* @param propertyName
* @return
* @see #isBaseProperty(String)
*/
public boolean isProperty(String propertyName);
public boolean isNestedProperty(String propertyName);
public boolean isPropertySet(String propertyName);
public boolean isPropertyEnabled(String propertyName);
public boolean isPropertyValid(String propertyName);
public IStatus validateProperty(String propertyName);
public boolean isValid();
public IStatus validate();
public IStatus validate(boolean stopAtFirstFailure);
/**
* <p>
* Returns a WTPPropertyDescriptor for the specified property. The
* <code>getPropertyValue()</code> method on the returned WTPPropertyDescriptor will be the
* same value as returned by <code>getPropertyValue(propertyName)</code>.
* </p>
* <p>
* Following the example introduced in {@see #getValidPropertyDescriptors(String)}, suppose the
* <code>SHIRT_SIZE</code> property is currently set to 1. A call to this method would return
* a WTPPropertyDescriptor whose <code>getPropertyValue()</code> returns <code>1</code> and
* whose <code>getPropertyDescription()</code> returns <code>small</code>.
* </p>
* <p>
* Also, note that even if a particular property is not confined to a finite set of values as
* defined by {@see #getValidPropertyDescriptors(String)}this method will always return a valid
* WTPPropertyDescriptor.
* </p>
* <p>
* Subclasses should should override {@see #doGetPropertyDescriptor(String)}as necessary.
* </p>
*
* @param propertyName
* @return the WTPPropertyDescriptor for the specified property
*
* @see #doGetValidPropertyDescriptors(String)
* @see #doGetPropertyDescriptor(String)
*/
public DataModelPropertyDescriptor getPropertyDescriptor(String propertyName);
/**
* <p>
* Returns a WTPPropertyDescriptor array consisting of all valid WTPPropertyDescriptors for the
* specified property. Each WTPPropertyDescriptor {@see WTPPropertyDescriptor for details}
* contains a value and a human readible description for the value. The set of all values in the
* returned array are those values which are valid for the DataModel. This value set only makes
* sense when valid property values conform to a well defined finite set. If no such value set
* exists for the property, the a 0 length array is returned. <code>null</code> is never
* returned.
* </p>
* <p>
* As an example, suppose there is a property called <code>SHIRT_SIZE</code> which is an
* <code>Integer</code> type. Also suppse that valid shirt sizes are only small, medium, or
* large. However, the actual values representing small, medium, and large are 1, 2, and 3
* respectively. A call to <code>getValidPropertyDescriptors(SHIRT_SIZE)</code> would return a
* WTPPropertyDescriptor array where the value, description pairs would be {(1, small), (2,
* medium), (3, large)}.
* </p>
* <p>
* Subclasses should override {@see #doGetValidPropertyDescriptors(String)}as necessary.
* </p>
*
* @param propertyName
* @return the array of valid WTPPropertyDescriptors
* @see #getPropertyDescriptor(String)
* @see #doGetValidPropertyDescriptors(String)
*/
public DataModelPropertyDescriptor[] getValidPropertyDescriptors(String propertyName);
public void addListener(IDataModelListener dataModelListener);
public void removeListener(IDataModelListener dataModelListener);
/**
* <p>
* A constant used for notification.
* </p>
*
* @see DataModelEvent#VALUE_CHG
* @see #notifyPropertyChange(String, int)
*/
public static final int VALUE_CHG = DataModelEvent.VALUE_CHG;
/**
* <p>
* A constant used for notification. This contant is different from the others because it does
* not map to an even type on DataModelEvent. When notifying with this type, a check is done to
* see whether the property is set. If the property is set, then a <code>VALUE_CHG</code> is
* fired, otherwise nothing happens.
* </p>
*
* @see #notifyPropertyChange(String, int)
*/
public static final int DEFAULT_CHG = DataModelEvent.DEFAULT_CHG;
/**
* <p>
* A constant used for notification.
* </p>
*
* @see DataModelEvent#ENABLE_CHG
* @see #notifyPropertyChange(String, int)
*/
public static final int ENABLE_CHG = DataModelEvent.ENABLE_CHG;
/**
* <p>
* A constant used for notification.
* </p>
*
* @see DataModelEvent#VALID_VALUES_CHG
* @see #notifyPropertyChange(String, int)
*/
public static final int VALID_VALUES_CHG = DataModelEvent.VALID_VALUES_CHG;
/**
* <p>
* Notify all listeners of a property change. <code>eventType</code> specifies the type of
* change. Acceptible values for eventType are <code>VALUE_CHG</code>,
* <code>DEFAULT_CHG</code>, <code>ENABLE_CHG</code>, <code>VALID_VALUES_CHG</code>. If
* the eventType is <code>DEFAULT_CHG</code> and the specified property is set, then this
* method will do nothing.
* </p>
*
* @param propertyName
* the name of the property changing
* @param eventType
* the type of event to fire
*
* @see #VALUE_CHG
* @see #DEFAULT_CHG
* @see #ENABLE_CHG
* @see #VALID_VALUES_CHG
* @see DataModelEvent
*/
public void notifyPropertyChange(String propertyName, int eventType);
public void dispose();
}