/**
* Copyright 2004-2016 Riccardo Solmi. All rights reserved.
* This file is part of the Whole Platform.
*
* The Whole Platform is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Whole Platform is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>.
*/
package org.whole.lang;
import org.whole.lang.bindings.BindingManagerFactory;
import org.whole.lang.bindings.IBindingManager;
import org.whole.lang.commons.parsers.CommonsDataTypePersistenceParser;
import org.whole.lang.factories.GenericEntityFactory;
import org.whole.lang.iterators.IEntityIterator;
import org.whole.lang.iterators.IteratorFactory;
import org.whole.lang.model.IEntity;
import org.whole.lang.reflect.AbstractFunctionLibraryDeployer;
import org.whole.lang.reflect.Descriptor;
import org.whole.lang.reflect.EntityDescriptor;
import org.whole.lang.reflect.FeatureDescriptor;
import org.whole.lang.reflect.ILanguageKit;
import org.whole.lang.reflect.ReflectionFactory;
import org.whole.lang.resources.WholeURIResolver;
import org.whole.lang.util.DataTypeUtils;
import org.whole.lang.util.EntityUtils;
import org.whole.lang.util.IDataTypeWrapper;
import org.whole.lang.util.IRunnable;
import org.whole.lang.util.ResourceUtils;
/**
* @author Riccardo Solmi
*/
public class ReflectLibraryDeployer extends AbstractFunctionLibraryDeployer {
public static final String URI = "whole:org.whole.lang:ReflectLibrary";
public static final String KIND_ED = "http://lang.whole.org/Queries#KindTest";
//ILanguageKit, EntityDescriptor, FeatureDescriptor, IEntity APIs
public void deploy(ReflectionFactory platform) {
putFunctionLibrary(URI);
putFunctionCode("languages", languagesIterator());
//self = DataEntity<languageURI | entityURI | featureURI | LK | ED | FD>
putFunctionCode("languageURI", languageURIIterator());
putFunctionCode("languageNamespace", languageNamespaceIterator());
putFunctionCode("languageName", languageNameIterator());
putFunctionCode("languageSimpleName", languageSimpleNameIterator());
putFunctionCode("languageQualifiedName", languageQualifiedNameIterator());
putFunctionCode("languageVersion", languageVersionIterator());
putFunctionCode("languageIsDynamic", languageIsDynamicIterator());
putFunctionCode("languageMetamodel", languageMetamodelIterator());
putFunctionCode("languageEntities", languageEntitiesIterator());
putFunctionCode("languageFeatures", languageFeaturesIterator());
//self = DataEntity<entityURI | ED>
putFunctionCode("entityLanguage", entityLanguageIterator());
putFunctionCode("entityURI", entityUriIterator());
putFunctionCode("entityOrdinal", entityOrdinalIterator());
putFunctionCode("entityName", entityNameIterator());
putFunctionCode("entityImplName", entityImplNameIterator());
putFunctionCode("entityIsAbstract", entityIsAbstractIterator());
putFunctionCode("entityIsRelationship", entityIsRelationshipIterator());
putFunctionCode("entityIsToManyRelationship", entityIsToManyRelationshipIterator());
putFunctionCode("entityKind", entityKindIterator());
// putFunctionCode("entityCompositeKind", entityCompositeKindIterator());
// putFunctionCode("entityDataKind", entityDataKindIterator());
putFunctionCode("entitySize", entitySizeIterator());
putFunctionCode("entityChildSize", entityChildSizeIterator());
putFunctionCode("entityAdjacentSize", entityAdjacentSizeIterator());
putFunctionCode("entityFeature", entityFeatureIterator());
putFunctionCode("entityFeatures", entityFeaturesIterator());
putFunctionCode("entitySupertypes", entitySupertypesIterator());
putFunctionCode("entitySubtypes", entitySubtypesIterator());
putFunctionCode("entityExtendedConcreteSubtypes", entityExtendedConcreteSubtypesIterator());
//self = DataEntity<featureURI | FD>
putFunctionCode("featureLanguage", featureLanguageIterator());
putFunctionCode("featureURI", featureUriIterator());
putFunctionCode("featureOrdinal", featureOrdinalIterator());
putFunctionCode("featureName", featureNameIterator());
putFunctionCode("featureImplName", featureImplNameIterator());
putFunctionCode("featureIsOptional", featureIsOptionalIterator());
putFunctionCode("featureIsId", featureIsIdIterator());
putFunctionCode("featureIsReference", featureIsReferenceIterator());
putFunctionCode("featureIsDerived", featureIsDerivedIterator());
putFunctionCode("featureIsShared", featureIsSharedIterator());
putFunctionCode("featureIsToMany", featureIsToManyIterator());
putFunctionCode("featureParentType", featureParentTypeIterator());
putFunctionCode("featureOpposite", featureOppositeIterator());
putFunctionCode("featureType", featureTypeIterator());
//self = IEntity
putFunctionCode("instanceLanguage", instanceLanguageIterator());
putFunctionCode("instanceKind", instanceKindIterator());
putFunctionCode("instanceType", instanceTypeIterator());
putFunctionCode("instanceAtType", instanceAtTypeIterator());
putFunctionCode("instanceAtFeature", instanceAtFeatureIterator());
putFunctionCode("instanceAtIndex", instanceAtIndexIterator());
putFunctionCode("instanceSupertypes", instanceSupertypesIterator());
putFunctionCode("instanceSubtypes", instanceSubtypesIterator());
putFunctionCode("instanceExtendedConcreteSubtypes", instanceExtendedConcreteSubtypesIterator());
putFunctionCode("instanceFeatureStep", instanceFeatureStepIterator());
putFunctionCode("instanceFeature", instanceFeatureIterator());
putFunctionCode("instanceFeatures", instanceFeaturesIterator());
putFunctionCode("instanceAspectualFeatures", instanceAspectualFeaturesIterator());
putFunctionCode("instanceChildSize", instanceChildSizeIterator());
putFunctionCode("instanceAdjacentSize", instanceAdjacentSizeIterator());
putFunctionCode("instanceInverseAdjacentSize", instanceInverseAdjacentSizeIterator());
//self = DataEntity<resourceURI>
putFunctionCode("uriLanguage", uriLanguageIterator());
putFunctionCode("uriEntity", uriEntityIterator());
putFunctionCode("uriFeature", uriFeatureIterator());
putFunctionCode("uriResourcePart", uriResourcePartIterator());
putFunctionCode("uriFragmentPart", uriFragmentPartIterator());
putFunctionCode("uriIsWholeScheme", uriIsWholeSchemeIterator());
putFunctionCode("uriWithNamespaceNameVersion", uriWithNamespaceNameVersionIterator());
putFunctionCode("uriNamespace", uriNamespaceIterator());
putFunctionCode("uriWithNamespace", uriWithNamespaceIterator());
putFunctionCode("uriWithNamespaceSuffix", uriWithNamespaceSuffixIterator());
putFunctionCode("uriName", uriNameIterator());
putFunctionCode("uriWithName", uriWithNameIterator());
putFunctionCode("uriWithNameSuffix", uriWithNameSuffixIterator());
putFunctionCode("uriVersion", uriVersionIterator());
putFunctionCode("uriWithVersion", uriWithVersionIterator());
}
public static IEntityIterator<IEntity> languagesIterator() {
return IteratorFactory.multiValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
bm.setResultIterator(IteratorFactory.collectionIterator(
ReflectionFactory.getLanguageKits(false, ResourceUtils.SIMPLE_COMPARATOR),
IDataTypeWrapper.envObjectValue));
}
});
}
public static IEntityIterator<IEntity> languageURIIterator() {
return IteratorFactory.singleValuedRunnableIterator(new LanguageSingleValuedPropertyRunnable() {
protected IEntity getProperty(ILanguageKit languageKit) {
return BindingManagerFactory.instance.createValue(languageKit.getURI());
}
});
}
public static IEntityIterator<IEntity> languageNamespaceIterator() {
return IteratorFactory.singleValuedRunnableIterator(new LanguageSingleValuedPropertyRunnable() {
protected IEntity getProperty(ILanguageKit languageKit) {
return BindingManagerFactory.instance.createValue(languageKit.getNamespace());
}
});
}
public static IEntityIterator<IEntity> languageNameIterator() {
return IteratorFactory.singleValuedRunnableIterator(new LanguageSingleValuedPropertyRunnable() {
protected IEntity getProperty(ILanguageKit languageKit) {
return BindingManagerFactory.instance.createValue(languageKit.getName());
}
});
}
public static IEntityIterator<IEntity> languageSimpleNameIterator() {
return IteratorFactory.singleValuedRunnableIterator(new LanguageSingleValuedPropertyRunnable() {
protected IEntity getProperty(ILanguageKit languageKit) {
return BindingManagerFactory.instance.createValue(ResourceUtils.getSimpleName(languageKit));
}
});
}
public static IEntityIterator<IEntity> languageQualifiedNameIterator() {
return IteratorFactory.singleValuedRunnableIterator(new LanguageSingleValuedPropertyRunnable() {
protected IEntity getProperty(ILanguageKit languageKit) {
return BindingManagerFactory.instance.createValue(ResourceUtils.getQualifiedName(languageKit));
}
});
}
public static IEntityIterator<IEntity> languageVersionIterator() {
return IteratorFactory.singleValuedRunnableIterator(new LanguageSingleValuedPropertyRunnable() {
protected IEntity getProperty(ILanguageKit languageKit) {
return //TODO ? languageKit.getVersion().equals("") ? CommonsEntityFactory.instance.createResolver() :
BindingManagerFactory.instance.createValue(languageKit.getVersion());
}
});
}
public static IEntityIterator<IEntity> languageIsDynamicIterator() {
return IteratorFactory.singleValuedRunnableIterator(new LanguageSingleValuedPropertyRunnable() {
protected IEntity getProperty(ILanguageKit languageKit) {
return BindingManagerFactory.instance.createValue(languageKit.isDynamic());
}
});
}
public static IEntityIterator<IEntity> languageMetamodelIterator() {
return IteratorFactory.singleValuedRunnableIterator(new LanguageSingleValuedPropertyRunnable() {
protected IEntity getProperty(ILanguageKit languageKit) {
return languageKit.getMetaModel();
}
});
}
public static IEntityIterator<IEntity> languageEntitiesIterator() {
return IteratorFactory.multiValuedRunnableIterator(new LanguageMultiValuedPropertyRunnable() {
protected IEntityIterator<?> getPropertyIterator(ILanguageKit languageKit) {
return IteratorFactory.collectionIterator(
languageKit.getEntityDescriptorEnum(),
IDataTypeWrapper.envEnumValue);
}
});
}
public static IEntityIterator<IEntity> languageFeaturesIterator() {
return IteratorFactory.multiValuedRunnableIterator(new LanguageMultiValuedPropertyRunnable() {
protected IEntityIterator<?> getPropertyIterator(ILanguageKit languageKit) {
return IteratorFactory.collectionIterator(
languageKit.getFeatureDescriptorEnum(),
IDataTypeWrapper.envEnumValue);
}
});
}
protected abstract static class LanguagePropertyRunnable implements IRunnable {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
ILanguageKit languageKit = null;
if (DataTypeUtils.getDataKind(selfEntity).isString()) {
String languageUri = ResourceUtils.stripFragmentPart(selfEntity.wStringValue());
String contextUri = bm.wIsSet("contextURI") ? bm.wStringValue("contextURI") : null;
languageKit = ReflectionFactory.safeGetLanguageKit(languageUri, true, contextUri);
} else if (DataTypeUtils.getDataKind(selfEntity).isEnumValue() && selfEntity.wEnumValue() instanceof Descriptor)
languageKit = ((Descriptor) selfEntity.wEnumValue()).getLanguageKit();
else if (DataTypeUtils.getDataKind(selfEntity).isObject()) {
if (selfEntity.wGetValue() instanceof ILanguageKit)
languageKit = (ILanguageKit) selfEntity.wGetValue();
else if (selfEntity.wGetValue() instanceof Descriptor)
languageKit = ((Descriptor) selfEntity.wGetValue()).getLanguageKit();
}
if (languageKit != null)
setResult(bm, languageKit);
else
bm.setResult(null);
}
protected abstract void setResult(IBindingManager bm, ILanguageKit languageKit);
}
protected abstract static class LanguageSingleValuedPropertyRunnable extends LanguagePropertyRunnable {
protected void setResult(IBindingManager bm, ILanguageKit languageKit) {
bm.setResult(getProperty(languageKit));
}
protected abstract IEntity getProperty(ILanguageKit languageKit);
}
protected abstract static class LanguageMultiValuedPropertyRunnable extends LanguagePropertyRunnable {
protected void setResult(IBindingManager bm, ILanguageKit languageKit) {
bm.setResultIterator(getPropertyIterator(languageKit));
}
protected abstract IEntityIterator<?> getPropertyIterator(ILanguageKit languageKit);
}
public static IEntityIterator<IEntity> entityLanguageIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntitySingleValuedPropertyRunnable() {
protected IEntity getProperty(EntityDescriptor<?> ed) {
return BindingManagerFactory.instance.createValue(ed.getLanguageKit());
}
});
}
public static IEntityIterator<IEntity> entityUriIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntitySingleValuedPropertyRunnable() {
protected IEntity getProperty(EntityDescriptor<?> ed) {
return BindingManagerFactory.instance.createValue(ed.getURI());
}
});
}
public static IEntityIterator<IEntity> entityOrdinalIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntitySingleValuedPropertyRunnable() {
protected IEntity getProperty(EntityDescriptor<?> ed) {
return BindingManagerFactory.instance.createValue(ed.getOrdinal());
}
});
}
public static IEntityIterator<IEntity> entityNameIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntitySingleValuedPropertyRunnable() {
protected IEntity getProperty(EntityDescriptor<?> ed) {
return BindingManagerFactory.instance.createValue(ed.getName());
}
});
}
public static IEntityIterator<IEntity> entityImplNameIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntitySingleValuedPropertyRunnable() {
protected IEntity getProperty(EntityDescriptor<?> ed) {
return BindingManagerFactory.instance.createValue(ed.getImplName());
}
});
}
public static IEntityIterator<IEntity> entityIsAbstractIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntitySingleValuedPropertyRunnable() {
protected IEntity getProperty(EntityDescriptor<?> ed) {
return BindingManagerFactory.instance.createValue(ed.isAbstract());
}
});
}
public static IEntityIterator<IEntity> entityIsRelationshipIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntitySingleValuedPropertyRunnable() {
protected IEntity getProperty(EntityDescriptor<?> ed) {
return BindingManagerFactory.instance.createValue(ed.isRelationship());
}
});
}
public static IEntityIterator<IEntity> entityIsToManyRelationshipIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntitySingleValuedPropertyRunnable() {
protected IEntity getProperty(EntityDescriptor<?> ed) {
return BindingManagerFactory.instance.createValue(ed.isToManyRelationship());
}
});
}
public static IEntityIterator<IEntity> entityKindIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntitySingleValuedPropertyRunnable() {
protected IEntity getProperty(EntityDescriptor<?> ed) {
EntityDescriptor<?> kindEd = CommonsDataTypePersistenceParser.getEntityDescriptor(KIND_ED, false, null);
return GenericEntityFactory.instance.create(
kindEd, kindEd.getDataEnumType().valueOf(ed.getEntityKind().toString()));
}
});
}
public static IEntityIterator<IEntity> entitySizeIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntitySingleValuedPropertyRunnable() {
protected IEntity getProperty(EntityDescriptor<?> ed) {
return BindingManagerFactory.instance.createValue(ed.featureSize());
}
});
}
public static IEntityIterator<IEntity> entityChildSizeIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntitySingleValuedPropertyRunnable() {
protected IEntity getProperty(EntityDescriptor<?> ed) {
return BindingManagerFactory.instance.createValue(ed.childFeatureSize());
}
});
}
public static IEntityIterator<IEntity> entityAdjacentSizeIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntitySingleValuedPropertyRunnable() {
protected IEntity getProperty(EntityDescriptor<?> ed) {
return BindingManagerFactory.instance.createValue(ed.adjacentFeatureSize());
}
});
}
public static IEntityIterator<IEntity> entityFeatureIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityPropertyRunnable() {
protected void setResult(IBindingManager bm, EntityDescriptor<?> ed) {
setFeatureDescriptorResult(bm, ed);
}
});
}
public static void setFeatureDescriptorResult(IBindingManager bm, EntityDescriptor<?> ed) {
FeatureDescriptor fd = bm.wIsSet("feature") ? getFeatureDescriptor(bm.wGet("feature"), bm) : null;
String featureName = fd == null && bm.wIsSet("featureName") ? bm.wStringValue("featureName") : null;
int featureIndex = fd == null && featureName == null && bm.wIsSet("featureIndex") ? bm.wIntValue("featureIndex") : -1;
FeatureDescriptor lfd = null;
if (fd != null) {
if (fd.getLanguageKit().equals(ed.getLanguageKit()))
lfd = fd;
else
featureName = fd.getName();
}
if (featureName != null)
lfd = ed.getFeatureDescriptorEnum().valueOf(featureName);
FeatureDescriptor efd = null;
if (lfd != null)
featureIndex = ed.indexOf(lfd);
if (featureIndex > -1 && featureIndex < ed.featureSize())
efd = ed.getEntityFeatureDescriptor(featureIndex);
bm.setResult(efd != null ? BindingManagerFactory.instance.createValue(efd) : null);
}
public static IEntityIterator<IEntity> entityFeaturesIterator() {
return IteratorFactory.multiValuedRunnableIterator(new EntityMultiValuedPropertyRunnable() {
protected IEntityIterator<?> getPropertyIterator(EntityDescriptor<?> ed) {
return IteratorFactory.collectionIterator(
ed.getEntityFeatureDescriptors(),
IDataTypeWrapper.envEnumValue);
}
});
}
public static IEntityIterator<IEntity> entitySupertypesIterator() {
return IteratorFactory.multiValuedRunnableIterator(new EntityMultiValuedPropertyRunnable() {
protected IEntityIterator<?> getPropertyIterator(EntityDescriptor<?> ed) {
return supertypesIterator(ed);
}
});
}
public static IEntityIterator<IEntity> entitySubtypesIterator() {
return IteratorFactory.multiValuedRunnableIterator(new EntityMultiValuedPropertyRunnable() {
protected IEntityIterator<?> getPropertyIterator(EntityDescriptor<?> ed) {
return subtypesIterator(ed);
}
});
}
public static IEntityIterator<IEntity> entityExtendedConcreteSubtypesIterator() {
return IteratorFactory.multiValuedRunnableIterator(new EntityMultiValuedPropertyRunnable() {
protected IEntityIterator<?> getPropertyIterator(EntityDescriptor<?> ed) {
return extendedConcreteSubtypesIterator(ed);
}
});
}
protected abstract static class EntityPropertyRunnable implements IRunnable {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
EntityDescriptor<?> ed = null;
if (DataTypeUtils.getDataKind(selfEntity).isString()) {
String uri = selfEntity.wStringValue();
if (ResourceUtils.hasFragmentPart(uri)) {
String languageUri = ResourceUtils.stripFragmentPart(uri);
String descriptorName = ResourceUtils.getFragmentPart(uri);
String contextUri = bm.wIsSet("contextURI") ? bm.wStringValue("contextURI") : null;
ILanguageKit languageKit = ReflectionFactory.safeGetLanguageKit(languageUri, true, contextUri);
if (languageKit != null)
ed = languageKit.getEntityDescriptorEnum().valueOf(descriptorName);
}
} else if (DataTypeUtils.getDataKind(selfEntity).isEnumValue() && selfEntity.wEnumValue() instanceof EntityDescriptor)
ed = (EntityDescriptor<?>) selfEntity.wEnumValue();
else if (DataTypeUtils.getDataKind(selfEntity).isObject() && selfEntity.wGetValue() instanceof EntityDescriptor)
ed = (EntityDescriptor<?>) selfEntity.wGetValue();
if (ed != null)
setResult(bm, ed);
else
bm.setResult(null);
}
protected abstract void setResult(IBindingManager bm, EntityDescriptor<?> ed);
}
protected abstract static class EntitySingleValuedPropertyRunnable extends EntityPropertyRunnable {
protected void setResult(IBindingManager bm, EntityDescriptor<?> ed) {
bm.setResult(getProperty(ed));
}
protected abstract IEntity getProperty(EntityDescriptor<?> ed);
}
protected abstract static class EntityMultiValuedPropertyRunnable extends EntityPropertyRunnable {
protected void setResult(IBindingManager bm, EntityDescriptor<?> ed) {
bm.setResultIterator(getPropertyIterator(ed));
}
protected abstract IEntityIterator<?> getPropertyIterator(EntityDescriptor<?> ed);
}
public static IEntityIterator<IEntity> featureLanguageIterator() {
return IteratorFactory.singleValuedRunnableIterator(new FeatureSingleValuedPropertyRunnable() {
protected IEntity getProperty(FeatureDescriptor fd) {
return BindingManagerFactory.instance.createValue(fd.getLanguageKit());
}
});
}
public static IEntityIterator<IEntity> featureUriIterator() {
return IteratorFactory.singleValuedRunnableIterator(new FeatureSingleValuedPropertyRunnable() {
protected IEntity getProperty(FeatureDescriptor fd) {
return BindingManagerFactory.instance.createValue(fd.getURI());
}
});
}
public static IEntityIterator<IEntity> featureOrdinalIterator() {
return IteratorFactory.singleValuedRunnableIterator(new FeatureSingleValuedPropertyRunnable() {
protected IEntity getProperty(FeatureDescriptor fd) {
return BindingManagerFactory.instance.createValue(fd.getOrdinal());
}
});
}
public static IEntityIterator<IEntity> featureNameIterator() {
return IteratorFactory.singleValuedRunnableIterator(new FeatureSingleValuedPropertyRunnable() {
protected IEntity getProperty(FeatureDescriptor fd) {
return BindingManagerFactory.instance.createValue(fd.getName());
}
});
}
public static IEntityIterator<IEntity> featureImplNameIterator() {
return IteratorFactory.singleValuedRunnableIterator(new FeatureSingleValuedPropertyRunnable() {
protected IEntity getProperty(FeatureDescriptor fd) {
return BindingManagerFactory.instance.createValue(fd.getImplName());
}
});
}
public static IEntityIterator<IEntity> featureIsOptionalIterator() {
return IteratorFactory.singleValuedRunnableIterator(new FeatureSingleValuedPropertyRunnable() {
protected IEntity getProperty(FeatureDescriptor fd) {
try {
return BindingManagerFactory.instance.createValue(fd.isOptional());
} catch (UnsupportedOperationException e) {
return null;
}
}
});
}
public static IEntityIterator<IEntity> featureIsIdIterator() {
return IteratorFactory.singleValuedRunnableIterator(new FeatureSingleValuedPropertyRunnable() {
protected IEntity getProperty(FeatureDescriptor fd) {
try {
return BindingManagerFactory.instance.createValue(fd.isId());
} catch (UnsupportedOperationException e) {
return null;
}
}
});
}
public static IEntityIterator<IEntity> featureIsReferenceIterator() {
return IteratorFactory.singleValuedRunnableIterator(new FeatureSingleValuedPropertyRunnable() {
protected IEntity getProperty(FeatureDescriptor fd) {
try {
return BindingManagerFactory.instance.createValue(fd.isReference());
} catch (UnsupportedOperationException e) {
return null;
}
}
});
}
public static IEntityIterator<IEntity> featureIsDerivedIterator() {
return IteratorFactory.singleValuedRunnableIterator(new FeatureSingleValuedPropertyRunnable() {
protected IEntity getProperty(FeatureDescriptor fd) {
try {
return BindingManagerFactory.instance.createValue(fd.isDerived());
} catch (UnsupportedOperationException e) {
return null;
}
}
});
}
public static IEntityIterator<IEntity> featureIsSharedIterator() {
return IteratorFactory.singleValuedRunnableIterator(new FeatureSingleValuedPropertyRunnable() {
protected IEntity getProperty(FeatureDescriptor fd) {
try {
return BindingManagerFactory.instance.createValue(fd.isShared());
} catch (UnsupportedOperationException e) {
return null;
}
}
});
}
public static IEntityIterator<IEntity> featureIsToManyIterator() {
return IteratorFactory.singleValuedRunnableIterator(new FeatureSingleValuedPropertyRunnable() {
protected IEntity getProperty(FeatureDescriptor fd) {
try {
return BindingManagerFactory.instance.createValue(fd.isToMany());
} catch (UnsupportedOperationException e) {
return null;
}
}
});
}
public static IEntityIterator<IEntity> featureParentTypeIterator() {
return IteratorFactory.singleValuedRunnableIterator(new FeatureSingleValuedPropertyRunnable() {
protected IEntity getProperty(FeatureDescriptor fd) {
try {
return BindingManagerFactory.instance.createValue(fd.getParentEntityDescriptor());
} catch (UnsupportedOperationException e) {
return null;
}
}
});
}
public static IEntityIterator<IEntity> featureOppositeIterator() {
return IteratorFactory.singleValuedRunnableIterator(new FeatureSingleValuedPropertyRunnable() {
protected IEntity getProperty(FeatureDescriptor fd) {
try {
return BindingManagerFactory.instance.createValue(fd.getOppositeFeatureDescriptor());
} catch (UnsupportedOperationException e) {
return null;
}
}
});
}
public static IEntityIterator<IEntity> featureTypeIterator() {
return IteratorFactory.singleValuedRunnableIterator(new FeatureSingleValuedPropertyRunnable() {
protected IEntity getProperty(FeatureDescriptor fd) {
try {
return BindingManagerFactory.instance.createValue(fd.getEntityDescriptor());
} catch (UnsupportedOperationException e) {
return null;
}
}
});
}
protected abstract static class FeatureSingleValuedPropertyRunnable implements IRunnable {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
FeatureDescriptor fd = getFeatureDescriptor(selfEntity, bm);
bm.setResult(fd != null ? getProperty(fd) : null);
}
protected abstract IEntity getProperty(FeatureDescriptor d);
}
public static FeatureDescriptor getFeatureDescriptor(IEntity selfEntity, IBindingManager bm) {
FeatureDescriptor fd = null;
if (DataTypeUtils.getDataKind(selfEntity).isString()) {
String uri = selfEntity.wStringValue();
if (ResourceUtils.hasFragmentPart(uri)) {
String languageUri = ResourceUtils.stripFragmentPart(uri);
String descriptorName = ResourceUtils.getFragmentPart(uri);
String contextUri = bm.wIsSet("contextURI") ? bm.wStringValue("contextURI") : null;
ILanguageKit languageKit = ReflectionFactory.safeGetLanguageKit(languageUri, true, contextUri);
if (languageKit != null)
fd = languageKit.getFeatureDescriptorEnum().valueOf(descriptorName);
}
} else if (DataTypeUtils.getDataKind(selfEntity).isEnumValue() && selfEntity.wEnumValue() instanceof FeatureDescriptor)
fd = (FeatureDescriptor) selfEntity.wEnumValue();
else if (DataTypeUtils.getDataKind(selfEntity).isObject() && selfEntity.wGetValue() instanceof FeatureDescriptor)
fd = (FeatureDescriptor) selfEntity.wGetValue();
return fd;
}
public static IEntityIterator<IEntity> instanceLanguageIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
bm.setResult(BindingManagerFactory.instance.createValue(
selfEntity.wGetLanguageKit()));
}
});
}
public static IEntityIterator<IEntity> instanceKindIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
EntityDescriptor<?> ed = CommonsDataTypePersistenceParser.getEntityDescriptor(KIND_ED, false, null);
bm.setResult(GenericEntityFactory.instance.create(
ed, ed.getDataEnumType().valueOf(selfEntity.wGetEntityKind().toString())));
}
});
}
public static IEntityIterator<IEntity> instanceTypeIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
bm.setResult(BindingManagerFactory.instance.createValue(
selfEntity.wGetEntityDescriptor()));
}
});
}
public static IEntityIterator<IEntity> instanceAtTypeIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
bm.setResult(EntityUtils.hasParent(selfEntity) ?
BindingManagerFactory.instance.createValue(selfEntity.wGetParent().wGetEntityDescriptor(selfEntity)) : null);
}
});
}
public static IEntityIterator<IEntity> instanceAtFeatureIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
bm.setResult(EntityUtils.hasParent(selfEntity) ?
BindingManagerFactory.instance.createValue(selfEntity.wGetParent().wGetFeatureDescriptor(selfEntity)) : null);
}
});
}
public static IEntityIterator<IEntity> instanceAtIndexIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
bm.setResult(EntityUtils.hasParent(selfEntity) ?
BindingManagerFactory.instance.createValue(selfEntity.wGetParent().wIndexOf(selfEntity)) : null);
}
});
}
public static IEntityIterator<IEntity> instanceSupertypesIterator() {
return IteratorFactory.multiValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
bm.setResultIterator(supertypesIterator(selfEntity.wGetEntityDescriptor()));
}
});
}
public static IEntityIterator<IEntity> supertypesIterator(EntityDescriptor<?> ed) {
return IteratorFactory.collectionIterator(
ed.languageSupertypesIterable(),
IDataTypeWrapper.envEnumValue);
}
public static IEntityIterator<IEntity> instanceSubtypesIterator() {
return IteratorFactory.multiValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
bm.setResultIterator(subtypesIterator(selfEntity.wGetEntityDescriptor()));
}
});
}
public static IEntityIterator<IEntity> subtypesIterator(EntityDescriptor<?> ed) {
return IteratorFactory.collectionIterator(
ed.languageSubtypesIterable(),
IDataTypeWrapper.envEnumValue);
}
public static IEntityIterator<IEntity> instanceExtendedConcreteSubtypesIterator() {
return IteratorFactory.multiValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
bm.setResultIterator(extendedConcreteSubtypesIterator(selfEntity.wGetEntityDescriptor()));
}
});
}
public static IEntityIterator<IEntity> extendedConcreteSubtypesIterator(EntityDescriptor<?> ed) {
return IteratorFactory.collectionIterator(
ed.getEntityDescriptorEnum().getExtendedLanguageConcreteSubtypesOf(ed),
IDataTypeWrapper.envEnumValue);
}
public static IEntityIterator<IEntity> instanceFeatureStepIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
EntityDescriptor<?> ed = selfEntity.wGetEntityDescriptor();
FeatureDescriptor fd = bm.wIsSet("feature") ? getFeatureDescriptor(bm.wGet("feature"), bm) : null;
String featureName = fd == null && bm.wIsSet("featureName") ? bm.wStringValue("featureName") : null;
int featureIndex = fd == null && featureName == null && bm.wIsSet("featureIndex") ? bm.wIntValue("featureIndex") : -1;
FeatureDescriptor efd = null;
if (featureName != null)
fd = ed.getFeatureDescriptorEnum().valueOf(featureName);
if (fd != null)
featureIndex = ed.indexOf(fd);
IEntity child = null;
if (featureIndex > -1 && featureIndex < selfEntity.wSize())
child = selfEntity.wGet(featureIndex);
else if (fd != null && selfEntity.wGetAspectualFeatureDescriptors().contains(fd))
child = selfEntity.wGet(efd);
bm.setResult(child != null ? child : null);
}
});
}
public static IEntityIterator<IEntity> instanceFeatureIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
setFeatureDescriptorResult(bm, selfEntity.wGetEntityDescriptor());
}
});
}
public static IEntityIterator<IEntity> instanceFeaturesIterator() {
return IteratorFactory.multiValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
bm.setResultIterator(featuresIterator(selfEntity.wGetEntityDescriptor()));
}
});
}
public static IEntityIterator<IEntity> featuresIterator(EntityDescriptor<?> ed) {
return IteratorFactory.collectionIterator(
ed.getEntityFeatureDescriptors(),
IDataTypeWrapper.envEnumValue);
}
public static IEntityIterator<IEntity> instanceAspectualFeaturesIterator() {
return IteratorFactory.multiValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
bm.setResultIterator(IteratorFactory.collectionIterator(
selfEntity.wGetAspectualFeatureDescriptors(),
IDataTypeWrapper.envEnumValue));
}
});
}
public static IEntityIterator<IEntity> instanceChildSizeIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
bm.setResult(BindingManagerFactory.instance.createValue(selfEntity.wSize()));
}
});
}
public static IEntityIterator<IEntity> instanceAdjacentSizeIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
bm.setResult(BindingManagerFactory.instance.createValue(selfEntity.wAdjacentSize()));
}
});
}
public static IEntityIterator<IEntity> instanceInverseAdjacentSizeIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
bm.setResult(BindingManagerFactory.instance.createValue(selfEntity.wInverseAdjacentSize()));
}
});
}
public static IEntityIterator<IEntity> uriLanguageIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
IEntity result = null;
if (DataTypeUtils.getDataKind(selfEntity).isString()) {
String languageUri = ResourceUtils.stripFragmentPart(selfEntity.wStringValue());
String contextUri = bm.wIsSet("contextURI") ? bm.wStringValue("contextURI") : null;
ILanguageKit languageKit = ReflectionFactory.safeGetLanguageKit(languageUri, true, contextUri);
if (languageKit != null)
result = BindingManagerFactory.instance.createValue(languageKit);
}
bm.setResult(result);
}
});
}
public static IEntityIterator<IEntity> uriEntityIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
IEntity result = null;
if (DataTypeUtils.getDataKind(selfEntity).isString()) {
String uri = selfEntity.wStringValue();
String contextUri = bm.wIsSet("contextURI") ? bm.wStringValue("contextURI") : null;
EntityDescriptor<?> ed = CommonsDataTypePersistenceParser.getEntityDescriptor(uri, true, contextUri);
if (ed != null)
result = BindingManagerFactory.instance.createValue(ed);
}
bm.setResult(result);
}
});
}
public static IEntityIterator<IEntity> uriFeatureIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
IEntity result = null;
if (DataTypeUtils.getDataKind(selfEntity).isString()) {
String uri = selfEntity.wStringValue();
String contextUri = bm.wIsSet("contextURI") ? bm.wStringValue("contextURI") : null;
FeatureDescriptor fd = CommonsDataTypePersistenceParser.getFeatureDescriptor(uri, true, contextUri);
if (fd != null)
result = BindingManagerFactory.instance.createValue(fd);
}
bm.setResult(result);
}
});
}
public static IEntityIterator<IEntity> uriResourcePartIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
IEntity result = null;
if (DataTypeUtils.getDataKind(selfEntity).isString()) {
String resourcePart = ResourceUtils.getResourcePart(selfEntity.wStringValue());
if (resourcePart != null)
result = BindingManagerFactory.instance.createValue(resourcePart);
}
bm.setResult(result);
}
});
}
public static IEntityIterator<IEntity> uriFragmentPartIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
IEntity result = null;
if (DataTypeUtils.getDataKind(selfEntity).isString()) {
String fragmentPart = ResourceUtils.getFragmentPart(selfEntity.wStringValue());
if (fragmentPart != null)
result = BindingManagerFactory.instance.createValue(fragmentPart);
}
bm.setResult(result);
}
});
}
public static IEntityIterator<IEntity> uriIsWholeSchemeIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
bm.setResult(BindingManagerFactory.instance.createValue(
DataTypeUtils.getDataKind(selfEntity).isString() ?
WholeURIResolver.isWholeScheme(selfEntity.wStringValue()) : false));
}
});
}
public static IEntityIterator<IEntity> uriWithNamespaceNameVersionIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
IEntity result = null;
String namespace = bm.wIsSet("namespace") ? bm.wStringValue("namespace") : null;
String name = bm.wIsSet("name") ? bm.wStringValue("name") : null;
String version = bm.wIsSet("version") ? bm.wStringValue("version") : "";
if (namespace != null && name != null)
result = BindingManagerFactory.instance.createValue(WholeURIResolver.getURI(namespace, name, version));
bm.setResult(result);
}
});
}
public static IEntityIterator<IEntity> uriNamespaceIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
IEntity result = null;
if (DataTypeUtils.getDataKind(selfEntity).isString())
try {
result = BindingManagerFactory.instance.createValue(WholeURIResolver.getNamespace(selfEntity.wStringValue()));
} catch (IllegalArgumentException e) {
}
bm.setResult(result);
}
});
}
public static IEntityIterator<IEntity> uriWithNamespaceIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
IEntity result = null;
if (DataTypeUtils.getDataKind(selfEntity).isString()) {
String namespace = bm.wIsSet("namespace") ? bm.wStringValue("namespace") : null;
if (namespace != null)
try {
result = BindingManagerFactory.instance.createValue(WholeURIResolver.setNamespace(selfEntity.wStringValue(), namespace));
} catch (IllegalArgumentException e) {
}
}
bm.setResult(result);
}
});
}
public static IEntityIterator<IEntity> uriWithNamespaceSuffixIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
IEntity result = null;
if (DataTypeUtils.getDataKind(selfEntity).isString()) {
String suffix = bm.wIsSet("suffix") ? bm.wStringValue("suffix") : "";
try {
result = BindingManagerFactory.instance.createValue(WholeURIResolver.addNamespaceSuffix(selfEntity.wStringValue(), suffix));
} catch (IllegalArgumentException e) {
}
}
bm.setResult(result);
}
});
}
public static IEntityIterator<IEntity> uriNameIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
IEntity result = null;
if (DataTypeUtils.getDataKind(selfEntity).isString())
try {
result = BindingManagerFactory.instance.createValue(WholeURIResolver.getName(selfEntity.wStringValue()));
} catch (IllegalArgumentException e) {
}
bm.setResult(result);
}
});
}
public static IEntityIterator<IEntity> uriWithNameIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
IEntity result = null;
if (DataTypeUtils.getDataKind(selfEntity).isString()) {
String name = bm.wIsSet("name") ? bm.wStringValue("name") : null;
if (name != null)
try {
result = BindingManagerFactory.instance.createValue(WholeURIResolver.setName(selfEntity.wStringValue(), name));
} catch (IllegalArgumentException e) {
}
}
bm.setResult(result);
}
});
}
public static IEntityIterator<IEntity> uriWithNameSuffixIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
IEntity result = null;
if (DataTypeUtils.getDataKind(selfEntity).isString()) {
String suffix = bm.wIsSet("suffix") ? bm.wStringValue("suffix") : "";
result = BindingManagerFactory.instance.createValue(WholeURIResolver.addNameSuffix(selfEntity.wStringValue(), suffix));
}
bm.setResult(result);
}
});
}
public static IEntityIterator<IEntity> uriVersionIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
IEntity result = null;
if (DataTypeUtils.getDataKind(selfEntity).isString())
result = BindingManagerFactory.instance.createValue(WholeURIResolver.getVersion(selfEntity.wStringValue()));
bm.setResult(result);
}
});
}
public static IEntityIterator<IEntity> uriWithVersionIterator() {
return IteratorFactory.singleValuedRunnableIterator(new IRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
IEntity result = null;
if (DataTypeUtils.getDataKind(selfEntity).isString()) {
String version = bm.wIsSet("version") ? bm.wStringValue("version") : "";
result = BindingManagerFactory.instance.createValue(WholeURIResolver.setVersion(selfEntity.wStringValue(), version));
}
bm.setResult(result);
}
});
}
}