Skip to content
This repository has been archived by the owner on Jan 7, 2019. It is now read-only.

Integrate 2.30.0 #247

Merged
merged 38 commits into from
Apr 15, 2017
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
e238c63
Merge pull request #227 from eMoflon/master
SaschaEdwinZander Apr 3, 2017
646a93e
some changes
SaschaEdwinZander Apr 4, 2017
9bbbf09
clean up code
SaschaEdwinZander Apr 4, 2017
ba7ce8e
Merge pull request #232 from eMoflon/szander-moslgt-wip
SaschaEdwinZander Apr 4, 2017
65f3ba0
readded debugging file
SaschaEdwinZander Apr 4, 2017
0d1e678
Merge pull request #234 from eMoflon/szander-moslgt-wip
SaschaEdwinZander Apr 4, 2017
cdffec5
restructure codeadapter and fixed an error in the META-INF in SDM
SaschaEdwinZander Apr 4, 2017
607bfb6
Merge pull request #235 from eMoflon/szander-moslgt-wip
SaschaEdwinZander Apr 4, 2017
2f38dab
some name refactorings in MOSLGT
SaschaEdwinZander Apr 4, 2017
f0794e3
Merge pull request #236 from eMoflon/szander-moslgt-wip
SaschaEdwinZander Apr 4, 2017
6c0a991
Merge pull request #233 from eMoflon/szander-moslgt-rc
RolandKluge Apr 4, 2017
6dc4272
add transformplan engine
SaschaEdwinZander Apr 4, 2017
759d2a6
Refactor error reporting
RolandKluge Apr 4, 2017
dcb5644
currentProgress
SaschaEdwinZander Apr 4, 2017
76fd881
Refactoring
RolandKluge Apr 5, 2017
697acac
Make resource set initialization (re-)usable from outside
RolandKluge Apr 5, 2017
d73a442
Add docu and refactoring
RolandKluge Apr 5, 2017
57a38f4
Refactoring in GitResetProjectHandler
RolandKluge Apr 5, 2017
c68e684
Documentation of MoflonProjectConfigurator
RolandKluge Apr 5, 2017
fe023cb
Set up structure for SDM-to-MOSL-GT conversion routine (#238)
RolandKluge Apr 5, 2017
cf98ed5
Consistent line endings when serializing moflon.properties.xmi (#240)
RolandKluge Apr 5, 2017
45c1522
Consistent line ending when saving EMF resources
RolandKluge Apr 5, 2017
303b1b3
getting correct structure
SaschaEdwinZander Apr 11, 2017
573eec6
Merge pull request #239 from eMoflon/rkluge-dev
SaschaEdwinZander Apr 11, 2017
5e18f9d
Merge pull request #241 from eMoflon/szander-moslgt-wip
SaschaEdwinZander Apr 11, 2017
825e979
Merge pull request #242 from eMoflon/szander-moslgt-rc
SaschaEdwinZander Apr 11, 2017
6a2f88a
Code clean up
SaschaEdwinZander Apr 11, 2017
90de7a9
added naming stability
SaschaEdwinZander Apr 11, 2017
c6c94cb
some fixes
SaschaEdwinZander Apr 11, 2017
fac0ee4
Merge pull request #246 from eMoflon/szander-moslgt-wip
SaschaEdwinZander Apr 11, 2017
74492dd
Introduce missing command category
RolandKluge Apr 13, 2017
d67875a
Update version numbers to 2.30.0
RolandKluge Apr 13, 2017
b8c8a5b
Merge remote-tracking branch 'origin/szander-moslgt-rc' into rkluge-dev
RolandKluge Apr 13, 2017
ec840af
Merge remote-tracking branch 'origin/master' into rkluge-dev
RolandKluge Apr 13, 2017
c562a46
Fix missing name of command category
RolandKluge Apr 13, 2017
992de67
Cleanup
RolandKluge Apr 13, 2017
f04b41f
Update .gitignore files after changing location of attr. lib.
RolandKluge Apr 13, 2017
3ad04ed
Update release date of 2.30.0
RolandKluge Apr 15, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
import org.moflon.gt.mosl.codeadapter.linkvariablerules.MatchingUnboundLVTransformingRule;
import org.moflon.gt.mosl.codeadapter.objectvariablerules.MatchingUnboundOVTransformerRule;
import org.moflon.gt.mosl.codeadapter.statementrules.*;
import org.moflon.gt.mosl.codeadapter.transformplanrules.BlackTransformPlanRule;
import org.moflon.gt.mosl.codeadapter.transformplanrules.GreenTransformPlanRule;
import org.moflon.gt.mosl.codeadapter.transformplanrules.RedTransformPlanRule;

public class CodeadapterAutofactory
{
Expand All @@ -13,6 +16,14 @@ public CodeadapterAutofactory()
createAllObjectVariableTransformers();
createAllLinkVariableTransformers();
createAllExpressionRules();
createAllTransformPlanRules();
}

private void createAllTransformPlanRules()
{
new BlackTransformPlanRule();
new GreenTransformPlanRule();
new RedTransformPlanRule();
}

private void createAllExpressionRules()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.resource.Resource;
Expand All @@ -19,8 +20,11 @@
import org.gervarro.democles.specification.emf.Variable;
import org.gervarro.democles.specification.emf.constraint.emf.emf.EMFTypeFactory;
import org.gervarro.democles.specification.emf.constraint.emf.emf.EMFVariable;
import org.moflon.gt.mosl.codeadapter.transformplanrules.TransformPlanRule;
import org.moflon.gt.mosl.codeadapter.utils.PatternKind;
import org.moflon.gt.mosl.codeadapter.utils.PatternUtil;
import org.moflon.gt.mosl.moslgt.EClassDef;
import org.moflon.gt.mosl.moslgt.LinkVariablePattern;
import org.moflon.gt.mosl.moslgt.ObjectVariableDefinition;
import org.moflon.gt.mosl.moslgt.PatternDef;
import org.moflon.gt.mosl.moslgt.PatternObject;
Expand All @@ -31,127 +35,166 @@
import org.moflon.sdm.runtime.democles.Scope;
import org.moflon.sdm.runtime.democles.VariableReference;

public class PatternBuilder {
private static PatternBuilder instance;

private Map<String, List<Consumer<Variable>>> unfinishedLinkVariables;

private Map<String, Pattern> patternCache;

private Map<String, Map<PatternKind, List<PatternObject>>> transformPlan;

private Map<String, PatternInvocation> patternInvocationCache;

private PatternBuilder(){
unfinishedLinkVariables = new HashMap<>();
patternCache = new HashMap<>();
patternInvocationCache = new HashMap<>();
}

public static PatternBuilder getInstance(){
if(instance == null)
instance = new PatternBuilder();
return instance;
}

private void createTransformPlan(){

}


public void createPattern(PatternDef patternDef, Map<String, Boolean> bindings, Map<String, CFVariable> env, Function<String, String> patternNameGenerator){
Pattern pattern = SpecificationFactory.eINSTANCE.createPattern();
String suffix = "";
String patternKind = "";

PatternBody patternBody = SpecificationFactory.eINSTANCE.createPatternBody();
patternBody.setHeader(pattern);

String patternName = patternDef.getName();
patternCache.put(patternName, pattern);
PatternInvocation invocation = createPatternInvocation(patternName, pattern);
for(PatternParameter pp : patternDef.getParameters()){
ObjectVariableDefinition ov = pp.getOv();
EMFVariable patternVariable = EMFTypeFactory.eINSTANCE.createEMFVariable();
pattern.getSymbolicParameters().add(patternVariable);

patternVariable.setName(ov.getName());
patternVariable.setEClassifier(ov.getType());

finishLinkVariables(patternVariable);

CFVariable cfVar = env.get(ov.getName());

if(bindings.get(cfVar.getName())){
suffix += "B";
}else{
suffix += "F";
}

patternKind=ObjectVariableBuilder.getInstance().transformObjectVariable(getCorrespondingOV(pp, patternDef), patternVariable, bindings, patternBody);

VariableReference vr = DemoclesFactory.eINSTANCE.createVariableReference();
vr.setInvocation(invocation);
vr.setFrom(cfVar);
vr.setTo(patternVariable);

}

pattern.setName(patternNameGenerator.apply(patternKind+suffix));

EClass eClass = EClassDef.class.cast(StatementBuilder.getInstance().getCurrentMethod().eContainer()).getName();
CodeadapterTrafo.getInstance().loadResourceSet(eClass.eResource().getResourceSet());
Resource patternResource = (Resource) EcoreUtil.getRegisteredAdapter(eClass, patternKind);
if (patternResource != null)
{
patternResource.getContents().add(pattern);
try {
pattern.eResource().save(Collections.EMPTY_MAP);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

private ObjectVariableDefinition getCorrespondingOV(PatternParameter pp, PatternDef patternDef){
Optional<ObjectVariableDefinition> optOV = patternDef.getObjectVariables().stream().filter(ov -> ov.getName().compareTo(pp.getOv().getName())==0).findAny();
if(optOV.isPresent())
return optOV.get();
else
return pp.getOv();
}

private void finishLinkVariables(Variable var){
List<Consumer<Variable>> toFinishLst = unfinishedLinkVariables.get(var.getName());
if(toFinishLst != null)
toFinishLst.stream().forEach(finisher -> {finisher.accept(var);});
}


public void addUnfinishedLinkVaraible(String targetName, Consumer<Variable> lvFinisher){
List<Consumer<Variable>> toFinishLst = unfinishedLinkVariables.get(targetName);
if(toFinishLst == null){
toFinishLst = new ArrayList<>();
unfinishedLinkVariables.put(targetName, toFinishLst);
}
toFinishLst.add(lvFinisher);
}

private PatternInvocation createPatternInvocation(String readAblePatternName, Pattern pattern){
PatternInvocation invocation = DemoclesFactory.eINSTANCE.createRegularPatternInvocation();
invocation.setPattern(pattern);
patternInvocationCache.put(readAblePatternName, invocation);
return invocation;
}

public PatternInvocation getPatternInvocation(String patternName){
return patternInvocationCache.get(patternName);
}

public void createResultPattern(ObjectVariableDefinition ov, Scope scope){

}

public class PatternBuilder
{
private static PatternBuilder instance;

private Map<String, List<Consumer<Variable>>> unfinishedLinkVariables;

private final PatternKind[] searchOrder = { PatternKind.BLACK, PatternKind.GREEN, PatternKind.RED };

private Map<String, Map<PatternKind, List<PatternObject>>> transformPlan;

private Map<PatternKind, TransformPlanRule> transformPlanRuleCache;

private Map<String, List<PatternInvocation>> patternInvocationCache;

private PatternBuilder()
{
unfinishedLinkVariables = new HashMap<>();
transformPlan = new HashMap<>();
patternInvocationCache = new HashMap<>();
transformPlanRuleCache = new HashMap<>();
}

public static PatternBuilder getInstance()
{
if (instance == null)
instance = new PatternBuilder();
return instance;
}

public void addTransformPlanRule(PatternKind patternKind, TransformPlanRule transformPlanRule)
{
transformPlanRuleCache.put(patternKind, transformPlanRule);
}

private void createTransformPlan(String patternName, PatternDef patternDef, Map<String, Boolean> bindings, Map<String, CFVariable> env)
{
for (PatternKind patternKind : searchOrder)
{
if (transformPlanRuleCache.get(patternKind) != null && transformPlanRuleCache.get(patternKind).isTransformable(patternKind, patternDef, bindings, env))
{
List<PatternObject> patternObjectIndex = transformPlanRuleCache.get(patternKind).getPatterObjectIndex();
Map<PatternKind, List<PatternObject>> patternKindIndex = transformPlan.get(patternName);
if (patternKindIndex == null)
patternKindIndex = new HashMap<>();
patternKindIndex.put(patternKind, patternObjectIndex);
transformPlan.put(patternName, patternKindIndex);
}
}
}

public void createPattern(PatternDef patternDef, Map<String, Boolean> bindings, Map<String, CFVariable> env, Function<String, String> patternNameGenerator)
{
String patternName = patternDef.getName();
List<PatternInvocation> invocations = patternInvocationCache.get(patternName);
invocations = new ArrayList<>();

createTransformPlan(patternName, patternDef, bindings, env);
Map<PatternKind, List<PatternObject>> patternPlan = transformPlan.get(patternName);

for (PatternKind patternKind : patternPlan.keySet())
{
List<PatternObject> patternObjectIndex = patternPlan.get(patternKind);
Pattern pattern = SpecificationFactory.eINSTANCE.createPattern();
PatternBody patternBody = SpecificationFactory.eINSTANCE.createPatternBody();
patternBody.setHeader(pattern);

List<LinkVariablePattern> lvIndex = patternObjectIndex.stream().filter(po -> po instanceof LinkVariablePattern).map(po -> {
return LinkVariablePattern.class.cast(po);
}).collect(Collectors.toList());

PatternInvocation invocation = createPatternInvocation(patternName, pattern);
invocations.add(invocation);
List<ObjectVariableDefinition> ovLst = patternObjectIndex.stream().filter(po -> po instanceof ObjectVariableDefinition).map(po -> {
return ObjectVariableDefinition.class.cast(po);
}).collect(Collectors.toList());
for (ObjectVariableDefinition ov : ovLst)
{

EMFVariable patternVariable = EMFTypeFactory.eINSTANCE.createEMFVariable();
pattern.getSymbolicParameters().add(patternVariable);

patternVariable.setName(ov.getName());
patternVariable.setEClassifier(ov.getType());

finishLinkVariables(patternVariable);

CFVariable cfVar = env.get(ov.getName());

// ObjectVariableBuilder.getInstance().transformObjectVariable(PatternUtil.getCorrespondingOV(pp,
// patternDef), patternVariable, bindings,
// patternBody);

VariableReference vr = DemoclesFactory.eINSTANCE.createVariableReference();
vr.setInvocation(invocation);
vr.setFrom(cfVar);
vr.setTo(patternVariable);

}

VariableTransformator.getInstance().transformPatternObjects(lvIndex, bindings, patternBody, patternKind);

pattern.setName(patternNameGenerator.apply(patternKind.getSuffix()));

EClass eClass = EClassDef.class.cast(StatementBuilder.getInstance().getCurrentMethod().eContainer()).getName();
CodeadapterTrafo.getInstance().loadResourceSet(eClass.eResource().getResourceSet());
Resource patternResource = (Resource) EcoreUtil.getRegisteredAdapter(eClass, patternKind.getSuffix());
if (patternResource != null)
{
patternResource.getContents().add(pattern);
try
{
pattern.eResource().save(Collections.EMPTY_MAP);
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
patternInvocationCache.put(patternName, invocations);
}

private void finishLinkVariables(Variable var)
{
List<Consumer<Variable>> toFinishLst = unfinishedLinkVariables.get(var.getName());
if (toFinishLst != null)
{
toFinishLst.stream().forEach(finisher -> {
finisher.accept(var);
});
}
unfinishedLinkVariables.remove(var.getName());
}

public void addUnfinishedLinkVaraible(String targetName, Consumer<Variable> lvFinisher)
{
List<Consumer<Variable>> toFinishLst = unfinishedLinkVariables.get(targetName);
if (toFinishLst == null)
{
toFinishLst = new ArrayList<>();
unfinishedLinkVariables.put(targetName, toFinishLst);
}
toFinishLst.add(lvFinisher);
}

private PatternInvocation createPatternInvocation(String readAblePatternName, Pattern pattern)
{
PatternInvocation invocation = DemoclesFactory.eINSTANCE.createRegularPatternInvocation();
invocation.setPattern(pattern);
return invocation;
}

public List<PatternInvocation> getPatternInvocation(String patternName)
{
return patternInvocationCache.get(patternName);
}

public void createResultPattern(ObjectVariableDefinition ov, Scope scope)
{

}

}
Loading