blob: 306d09d0ca1952179a31394c9f86730ba89f730f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2018 Obeo.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors: Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.eef.core.internal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.function.Consumer;
import org.eclipse.eef.EEFGroupDescription;
import org.eclipse.eef.EEFPageDescription;
import org.eclipse.eef.common.api.utils.Util;
import org.eclipse.eef.core.api.EEFExpressionUtils;
import org.eclipse.eef.core.api.EEFGroup;
import org.eclipse.eef.core.api.EEFPage;
import org.eclipse.eef.core.api.EEFView;
import org.eclipse.eef.core.api.IEEFDomainClassTester;
import org.eclipse.eef.core.api.utils.EvalFactory;
import org.eclipse.sirius.common.interpreter.api.IInterpreter;
import org.eclipse.sirius.common.interpreter.api.IVariableManager;
/**
* The implementation of the {@link EEFPage}.
*
* @author sbegaudeau
*/
public class EEFPageImpl implements EEFPage {
/**
* The variable manager.
*/
private IVariableManager variableManager;
/**
* The interpreter.
*/
private IInterpreter interpreter;
/**
* The containing {@link EEFView}.
*/
private EEFView eefView;
/**
* The description.
*/
private EEFPageDescription eefPageDescription;
/**
* The {@link EEFGroup}.
*/
private List<EEFGroup> eefGroups = new ArrayList<EEFGroup>();
/**
* The domain class tester.
*/
private IEEFDomainClassTester domainClassTester;
/**
* Indicates if the description of this page has been instantiated multiple times.
*/
private boolean isUnique;
/**
* The constructor.
*
* @param eefView
* The containing {@link EEFView}
* @param eefPageDescription
* The description
* @param variableManager
* The variable manager
* @param interpreter
* The interpreter
* @param domainClassTester
* The domain class tester
* @param isUnique
* Indicates if the description from this page has been instantiated multiple times
*/
public EEFPageImpl(EEFView eefView, EEFPageDescription eefPageDescription, IVariableManager variableManager, IInterpreter interpreter,
IEEFDomainClassTester domainClassTester, boolean isUnique) {
this.variableManager = variableManager;
this.interpreter = interpreter;
this.eefView = eefView;
this.eefPageDescription = eefPageDescription;
this.domainClassTester = domainClassTester;
this.isUnique = isUnique;
}
/**
* Initialize the variables of the EEFPage.
*/
public void initialize() {
EEFCorePlugin.getPlugin().debug("EEFPageImpl#initialize()"); //$NON-NLS-1$
for (final EEFGroupDescription eefGroupDescription : eefPageDescription.getGroups()) {
String preconditionExpression = eefGroupDescription.getPreconditionExpression();
Boolean preconditionValid = EvalFactory.of(this.interpreter, this.variableManager).logIfInvalidType(Boolean.class)
.evaluate(preconditionExpression);
if (preconditionValid == null || preconditionValid.booleanValue()) {
Consumer<Object> consumer = (value) -> {
Collection<Object> objectCollection = Util.asCollection(value, Object.class);
objectCollection.stream().filter(new DomainClassPredicate(eefGroupDescription.getDomainClass(), domainClassTester))
.forEach(object -> {
IVariableManager childVariableManager = this.getVariableManager().createChild();
childVariableManager.put(EEFExpressionUtils.SELF, object);
EEFGroupImpl eefGroupImpl = new EEFGroupImpl(this, eefGroupDescription, childVariableManager, interpreter);
this.eefGroups.add(eefGroupImpl);
});
};
Object self = this.variableManager.getVariables().get(EEFExpressionUtils.SELF);
String groupSemanticCandidateExpression = eefGroupDescription.getSemanticCandidateExpression();
EvalFactory.of(this.interpreter, this.variableManager).defaultValue(self).call(groupSemanticCandidateExpression, consumer);
}
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.core.api.EEFPage#getGroups()
*/
@Override
public List<EEFGroup> getGroups() {
return this.eefGroups;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.core.api.EEFPage#getDescription()
*/
@Override
public EEFPageDescription getDescription() {
return this.eefPageDescription;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.core.api.EEFPage#getView()
*/
@Override
public EEFView getView() {
return this.eefView;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.core.api.EEFPage#getVariableManager()
*/
@Override
public IVariableManager getVariableManager() {
return this.variableManager;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.core.api.EEFPage#getInterpreter()
*/
@Override
public IInterpreter getInterpreter() {
return this.interpreter;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.core.api.EEFPage#isUnique()
*/
@Override
public boolean isUnique() {
return this.isUnique;
}
}