package algorithm;
import java.util.ArrayList;
import models.*;
import models.algebra.Expression;
import models.algebra.Field;
import models.algebra.InvalidMessage;
import models.algebra.Parameter;
import models.algebra.ParameterizedIdentifierIsFutureWork;
import models.algebra.Symbol;
import models.algebra.Term;
import models.algebra.UnificationFailed;
import models.algebra.ValueUndefined;
import models.dataConstraintModel.ChannelMember;
import models.dataConstraintModel.IdentifierTemplate;
import models.dataFlowModel.*;
import models.dataFlowModel.DataflowChannelGenerator.IResourceStateAccessor;
public class CodeGenerator {
static public ArrayList<String> doGenerate(ResourceDependencyGraph graph) {
ArrayList<String> codes = new ArrayList<>();
IResourceStateAccessor pushAccessor = new IResourceStateAccessor() {
@Override
public Expression getCurrentStateAccessorFor(IdentifierTemplate target, IdentifierTemplate from) {
if (target.equals(from)) {
return new Field(target.getResourceName(), target.getResourceStateType());
}
return null;
}
@Override
public Expression getNextStateAccessorFor(IdentifierTemplate target, IdentifierTemplate from) {
return new Parameter(target.getResourceName(), target.getResourceStateType());
}
};
IResourceStateAccessor pullAccessor = new IResourceStateAccessor() {
@Override
public Expression getCurrentStateAccessorFor(IdentifierTemplate target, IdentifierTemplate from) {
if (target.equals(from)) {
return new Field(target.getResourceName(), target.getResourceStateType());
}
return null;
}
@Override
public Expression getNextStateAccessorFor(IdentifierTemplate target, IdentifierTemplate from) {
Term getter = new Term(new Symbol("get" + target.getResourceName(), 1, Symbol.Type.METHOD));
getter.addChild(new Field(target.getResourceName(), target.getResourceStateType()));
return getter;
}
};
codes.add("public class Main {");
for (Node n : graph.getNodes()) {
ResourceNode resource = (ResourceNode) n;
String str = "\t" + "private "
+ resource.getIdentifierTemplate().getResourceName().substring(0, 1).toUpperCase()
+ resource.getIdentifierTemplate().getResourceName().substring(1) + " "
+ resource.getIdentifierTemplate().getResourceName() + " = new "
+ resource.getIdentifierTemplate().getResourceName().substring(0, 1).toUpperCase()
+ resource.getIdentifierTemplate().getResourceName().substring(1) + "(";
str += ");";
codes.add(str);
}
codes.add("}");
codes.add("");
for (Node n : graph.getNodes()) {
ResourceNode resource = (ResourceNode) n;
String tmp;
codes.add("public class " + resource.getIdentifierTemplate().getResourceName().substring(0, 1).toUpperCase()
+ resource.getIdentifierTemplate().getResourceName().substring(1) + " {");
if (((StoreAttribute) resource.getAttribute()).isStored()) {
for (Edge e : resource.getOutEdges()) {
ResourceDependency re = (ResourceDependency) e;
for(ChannelMember cm:re.getChannelGenerator().getChannelMembers()) {
try {
Expression exp = re.getChannelGenerator().deriveUpdateExpressionOf(cm, pushAccessor);
if(exp != null) {
tmp = "\t" + exp.toImplementation();
codes.add(tmp);
}
} catch (ParameterizedIdentifierIsFutureWork e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ResolvingMultipleDefinitionIsFutureWork e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InvalidMessage e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (UnificationFailed e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ValueUndefined e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
} else {
for (Edge e : resource.getInEdges()) {
ResourceDependency re = (ResourceDependency) e;
for(ChannelMember cm:re.getChannelGenerator().getChannelMembers()) {
try {
Expression exp = re.getChannelGenerator().deriveUpdateExpressionOf(cm, pullAccessor);
if(exp != null) {
tmp = "\t" + exp.toImplementation();
codes.add(tmp);
}
} catch (ParameterizedIdentifierIsFutureWork e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ResolvingMultipleDefinitionIsFutureWork e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InvalidMessage e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (UnificationFailed e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ValueUndefined e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
codes.add("}");
codes.add("");
}
return codes;
}
}