use of org.whole.lang.util.FreshNameGenerator in project whole by wholeplatform.
the class TestsLearningInterpreterVisitor method visit.
@Override
public void visit(TestSuite entity) {
if (isLearning()) {
Map<IEntity, List<IEntity>> learntMap = getLearntMap();
IEntity result = null;
for (int cycle = 1; cycle <= learnCycles(); cycle++) {
printWriter().printf("*** Learning cycle %d ***\n\n", cycle);
ITransactionScope resettableScope = BindingManagerFactory.instance.createTransactionScope();
getBindings().wEnterScope(resettableScope);
try {
getBindings().wDefValue("learnCycle", cycle);
super.visit(entity);
result = getBindings().getResult();
} finally {
resettableScope.rollback();
getBindings().wExitScope();
}
}
getBindings().setResult(result);
FilterFamily filterFamily = getFilterFamily(entity);
FilterRules filterRules = filterFamily.getFilterRules();
FreshNameGenerator fnGen = new FreshNameGenerator();
for (IEntity name : BehaviorUtils.compileAndLazyEvaluate(createFindAllFilterRuleNamesQuery(), filterFamily)) fnGen.addBoundName(name.wStringValue());
for (IEntity adapter : learntMap.keySet()) {
List<IEntity> learntEntities = learntMap.get(adapter);
IEntity value = learntEntities.get(0);
if (learntEntities.size() > 1 && EntityUtils.isData(value)) {
for (IEntity learntEntity : learntEntities) if (!learntEntity.wEquals(value))
continue;
} else if (learntEntities.size() > 1) {
for (IEntity learntEntity2 : learntEntities) if (EntityUtils.isData(learntEntity2))
continue;
// generate filter rule
FilterRule filterRule = TestsHelpers.createFilterRule(learntEntities);
if (EntityUtils.isNotResolver(filterRule)) {
String filterName;
IEntity filterBody;
if ((filterBody = Matcher.find(filterRule.getBody(), filterRules, false)) != null) {
// try to reuse a generated filter
filterName = ((FilterRule) filterBody.wGetParent()).getName().getValue();
} else {
// add the filter rule to the filter family
filterName = fnGen.nextFreshName(GENERATED_FILTER_NAME);
ITransactionScope resettableScope = BindingManagerFactory.instance.createTransactionScope();
getBindings().wEnterScope(resettableScope);
try {
getBindings().wDefValue("filterName", filterName);
Matcher.substitute(filterRule, getBindings(), false);
filterRules.wAdd(filterRule);
} finally {
resettableScope.rollback();
getBindings().wExitScope();
}
}
// wrap SubjectStatement with a UsingFilter
ITransactionScope resettableScope = BindingManagerFactory.instance.createTransactionScope();
getBindings().wEnterScope(resettableScope);
try {
SubjectStatement statement = BehaviorUtils.evaluateFirstResult(createFindAncestorSubjectStatement(), adapter, getBindings());
UsingFilter usingFilter = createUsingFilter(filterName);
statement.wGetParent().wSet(statement, usingFilter);
usingFilter.setSubjectStatement(statement);
} finally {
resettableScope.rollback();
getBindings().wExitScope();
}
}
}
TestsHelpers.replace(adapter, value);
}
// add the newly generated family
if (!EntityUtils.hasParent(filterFamily) && !filterRules.wIsEmpty())
entity.getFilterFamilies().wAdd(filterFamily);
} else
super.visit(entity);
}
use of org.whole.lang.util.FreshNameGenerator in project whole by wholeplatform.
the class ModelsJavaModelGeneratorVisitor method visit.
public void visit(EnumEntity entity) {
entityModifiers.clear();
isConcrete = true;
entity.getModifiers().accept(this);
metaName = entity.getName().wStringValue();
// was entity.getName().wStringValue();
entityName = modelInfo.entityImplName(metaName);
qEntityName = modelsGen.entityInterfaceQName(entityName);
String enumTypeName = entityName + "Enum";
String valueDataType = enumTypeName + ".Value";
String valueQDataType = modelsGen.modelPackage() + "." + valueDataType;
org.whole.gen.lang.model.EnumTypeBuilder enumBuilder = modelsGen.enumTypeBuilder(enumTypeName, valueQDataType);
EnumValues values = entity.getValues();
FreshNameGenerator enumValueGen = new FreshNameGenerator();
for (int i = 0, size = values.wSize(); i < size; i++) {
String value = values.wGet(i).wStringValue();
if (StringUtils.isValidEnumLiteralName(value))
enumValueGen.putBoundName(value);
}
for (int i = 0, size = values.wSize(); i < size; i++) {
if (EntityUtils.isData(values.wGet(i))) {
String value = values.wGet(i).wStringValue();
enumBuilder.addValue(value, enumValueGen.isBoundOnlyName(value) ? value : enumValueGen.nextFreshName(StringUtils.toEnumLiteralName(value)));
}
}
entityAdapterBuilder = modelsGen.entityAdapterBuilder(entityName);
entityAdapterBuilder.addDataFeature(valueQDataType, "value");
modelsGen.adapterRegistryBuilder().addFactoryProduct(entityName);
modelsGen.implRegistryBuilder().addFactoryProduct(entityName);
buildEnumEntity(entityName, metaName, valueQDataType, valueDataType);
entity.getTypes().accept(this);
}
use of org.whole.lang.util.FreshNameGenerator in project whole by wholeplatform.
the class PojoNormalizerVisitor method visit.
@Override
public void visit(Library entity) {
IBindingManager bindings = BindingManagerFactory.instance.createBindingManager();
FreshNameGenerator entityNameGenerator = new FreshNameGenerator();
resolveTemplateNameCollisionsInDeclarations(entity, bindings, entityNameGenerator);
createDefaultTemplateInDeclarations(entity, bindings, entityNameGenerator);
createDefaultTemplateInProperties(entity, bindings);
createDefaultTypeInParameters(entity, bindings);
createDefaultTemplateInParameters(entity, bindings);
addMappingDataTypes(entity, bindings, entityNameGenerator);
}
use of org.whole.lang.util.FreshNameGenerator in project whole by wholeplatform.
the class Matcher method forceMatchUsingVariables.
public static boolean forceMatchUsingVariables(IEntity pattern, IEntity model) {
try {
GenericMatcher gm = new GenericMatcher();
final Set<String> boundNames = new HashSet<String>();
gm.withMatchStrategy(IMatchStrategy.CollectVariableNames(boundNames), CommonsEntityDescriptorEnum.Variable, CommonsEntityDescriptorEnum.InlineVariable).withMismatchStrategy(IMatchStrategy.IgnoreSubtree).match(model, pattern);
final FreshNameGenerator fng = new FreshNameGenerator(boundNames);
gm.withAsIsMatching().withMismatchStrategy(IMatchStrategy.ReplaceWithVariable(fng)).match(pattern, model);
return true;
} catch (MatchException | VisitException e) {
return false;
}
}
Aggregations