Follow Techotopia on Twitter

On-line Guides
All Guides
eBook Store
iOS / Android
Linux for Beginners
Office Productivity
Linux Installation
Linux Security
Linux Utilities
Linux Virtualization
Linux Kernel
System/Network Admin
Programming
Scripting Languages
Development Tools
Web Development
GUI Toolkits/Desktop
Databases
Mail Systems
openSolaris
Eclipse Documentation
Techotopia.com
Virtuatopia.com
Answertopia.com

How To Guides
Virtualization
General System Admin
Linux Security
Linux Filesystems
Web Servers
Graphics & Desktop
PC Hardware
Windows
Problem Solutions
Privacy Policy

  




 

 

EMF Model Query Developer Guide
Previous Page Home Next Page

Feature Conditions

In addition to conditions testing the identity or type of a model element (an EObject), the EMF Model Query Framework provides a variety of conditions that introspect the features of model elements.

EStructuralFeature Condition API
[ as SVG]

The basic condition that asks about the structural features of model elements is the EObjectStructuralFeatureCondition. This condition pertains to a single EStructuralFeature. By itself, it tests whether that feature is available on an element or not (whether the element's EClass has that feature). This is a useful condition to check for subclasses that ask questions about the values of the feature. Clients may directly extend this class, or they may use the subclasses described below to assemble predicates on the feature values.

The EObjectReferencerCondition selects objects that reference a client-specified target element via any cross-reference feature. That is, it does not consider contaiment or container features.

Set<EObject> subjects = getSubjects();  // hypothetical source of test subjects

Person dickens = getPerson("Charles Dickens");

// look for any library item that was read by, written by, or acted by. Charles Dickens
EObjectCondition cond = new EObjectReferencerCondition(dickens);

for (EObject subject : Subjects) {
    if (cond.isSatisfied(subject)) {
        System.out.println(subject);
    }
}

The EObjectContainmentFeatureCondition selects elements that are contained in a specific feature of their containers. It checks an object's eContainingFeature() against the specified feature.

Conditions on Feature Values

The EObjectStructuralFeatureValueCondition class defines a flexible framework for predicates on the particular values of features of the objects in the query scope. It includes support for data types (in EAttributes), element references (in EReferences), and the "boolean for-all" and "exists" quantifiers for multi-valued features.

EStructuralFeature Value Condition API
[ as SVG]

An EObjectStructuralFeatureValueCondition applies an EObjectCondition (its featureCondition) to the value or values in a structural feature. For multi-valued (multiplicity many) features, the optional ConditionPolicy is used to determine whether the condition matches when ALL values satisfy the feature condition (including the case of an empty set) or when ANY value satisfies the feature condition (excluding the case of an empty set). The default policy is ANY.

The EObjectStructuralFeatureValueCondition uses an IEStructuralFeatureValueGetter to access the values of structural features. This is useful in cases where the implementation of the model being queried has customizations such as lazy loading from the data store that require special handling. Most applications only need the default instance that simply uses EMF reflection to obtain values.

As the EObjectReferenceValueCondition class tests the values in reference features, it is normally used with an EObjectCondition as the feature value condition. EObjectAttributeValueConditions are usually supplied with Conditions on primitive types.

Library subject = getLibrary();  // hypothetical source of library to test

Condition name = new SubStringValue("Dickens");
Condition writerName = new EObjectAttributeValueCondition(
        EXTLibraryPackage.Literals.WRITER__NAME, name);
Condition authorName = new EObjectReferenceValueCondition(
        EXTLibraryPackage.Literals.BOOK__AUTHOR, writerName);

// are all of the library's books written by somebody named Dickens?
Condition allDickens = new EObjectReferenceValueCondition(
        EXTLibraryPackage.Literals.LIBRARY__BOOKS, authorName,
        ConditionPolicy.ALL, EStructuralFeatureValueGetter.getInstance());

// are any of the library's books written by somebody named Dickens?
Condition anyDickens = new EObjectReferenceValueCondition(
        EXTLibraryPackage.Literals.LIBRARY__BOOKS, authorName,
        ConditionPolicy.ANY, EStructuralFeatureValueGetter.getInstance());
        
System.out.println("Test all: " + allDickens.isSatisfied(subject));
System.out.println("Test any: " + anyDickens.isSatisfied(subject));

Handling Null Values

The value of a scalar EAttribute or EReference may be null (in EMF, multi-valued features may never contain null). To protect feature-value condition objects from being given null inputs, when a feature value is null, the EObjectStructuralFeatureValueCondition simply returns false without invoking the value condition.

How, then, does a query search for objects that have null values in features? Either extend the EObjectStructuralFeatureCondition abstract class and check for null yourself, or use one of the IS_NULL shared instances define by the ObjectInstanceCondition (for attribute values) and EObjectInstanceCondition (for reference values) classes.

Library subject = getLibrary();  // hypothetical source of library to test

Condition anonymous = new EObjectReferenceValueCondition(
        EXTLibraryPackage.Literals.BOOK__AUTHOR,
        EObjectInstanceCondition.IS_NULL);

// see whether any of the books in this library has no author
Condition anyAnonymous = new EObjectReferenceValueCondition(
        EXTLibraryPackage.Literals.LIBRARY__BOOKS, anonymous,
        ConditionPolicy.ANY, EStructuralFeatureValueGetter.getInstance());
        
System.out.println("Test: " + anyAnonymous.isSatisfied(subject));

Copyright (c) 2000, 2007 IBM Corporation and others. All Rights Reserved.


 
 
  Published under the terms of the Eclipse Public License Version 1.0 ("EPL") Design by Interspire