package pt.ist.fenixframework.backend.jvstmmem; import java.io.PrintWriter; import pt.ist.fenixframework.atomic.ContextFactory; import pt.ist.fenixframework.atomic.DefaultContextFactory; import pt.ist.fenixframework.dml.CompilerArgs; import pt.ist.fenixframework.dml.DomainClass; import pt.ist.fenixframework.dml.DomainModel; import pt.ist.fenixframework.dml.IndexesCodeGenerator; import pt.ist.fenixframework.dml.Role; import pt.ist.fenixframework.dml.Slot; public class JVSTMMemCodeGenerator extends IndexesCodeGenerator { public JVSTMMemCodeGenerator(CompilerArgs compArgs, DomainModel domainModel) { super(compArgs, domainModel); String collectionName = compArgs.getParams().get(COLLECTION_CLASS_NAME_KEY); if (collectionName == null || collectionName.isEmpty()) { setCollectionToUse("pt.ist.fenixframework.core.adt.bplustree.BPlusTree"); } } @Override protected String getDomainClassRoot() { return JVSTMMemDomainObject.class.getName(); } @Override protected String getBackEndName() { return JVSTMMemBackEnd.BACKEND_NAME; } @Override protected String getDefaultConfigClassName() { return JVSTMMemConfig.class.getName(); } @Override protected Class<? extends ContextFactory> getAtomicContextFactoryClass() { return DefaultContextFactory.class; } @Override protected void generateFilePreamble(String subPackageName, PrintWriter out) { super.generateFilePreamble(subPackageName, out); println(out, "import jvstm.VBox;"); newline(out); } @Override protected void generateSlot(Slot slot, PrintWriter out) { onNewline(out); PrimitiveToWrapperEntry w = findWrapperEntry(slot.getTypeName()); String defaultValue = w != null ? w.defaultPrimitiveValue : "null"; printWords(out, "private", getVBoxType(slot), slot.getName(), "= new", getVBoxType(slot), "(" + defaultValue + ")"); print(out, ";"); } @Override protected void generateRoleSlot(Role role, PrintWriter out) { onNewline(out); if (role.getMultiplicityUpper() == 1) { PrimitiveToWrapperEntry w = findWrapperEntry(getTypeFullName(role.getType())); String defaultValue = w != null ? w.defaultPrimitiveValue : "null"; String t = makeGenericType("VBox", getReferenceType(getTypeFullName(role.getType()))); printWords(out, "private", t, role.getName(), "= new", t, "(" + defaultValue + ")"); } else { printWords(out, "private", getDefaultCollectionFor(role.getType().getFullName()), role.getName()); } println(out, ";"); } private String getVBoxType(Slot slot) { return makeGenericType("VBox", getReferenceType(slot.getTypeName())); } @Override protected void generateRoleSlotMethodsMultOneGetter(String slotName, String typeName, PrintWriter out) { generateVBoxSlotGetter("get" + capitalize(slotName), "get", slotName, typeName, out); } @Override protected void generateSlotAccessors(DomainClass domainClass, Slot slot, PrintWriter out) { generateVBoxSlotGetter("get" + capitalize(slot.getName()), "get", slot.getName(), slot.getTypeName(), out); generateVBoxSlotSetter(domainClass, slot, out); } protected void generateVBoxSlotGetter(String methodName, String accessToVBox, String name, String typeName, PrintWriter out) { newline(out); printFinalMethod(out, "public", typeName, methodName); startMethodBody(out); printWords(out, "return", getSlotExpression(name) + "." + accessToVBox + "();"); endMethodBody(out); } protected void generateVBoxSlotSetter(DomainClass domainClass, Slot slot, PrintWriter out) { newline(out); printFinalMethod(out, "public", "void", "set" + capitalize(slot.getName()), makeArg(slot.getTypeName(), slot.getName())); startMethodBody(out); generateSetterDAPStatement(domainClass, slot.getName(), slot.getTypeName(), out);//DAP write stats update statement generateSetterTxIntrospectorStatement(domainClass, slot, out); // TxIntrospector generateIndexationInSetter(domainClass, slot, out); // Indexes printWords(out, getSlotExpression(slot.getName()) + ".put(" + slot.getName() + ");"); endMethodBody(out); } @Override protected void generateRoleSlotMethodsMultStar(Role role, PrintWriter out) { String typeName = getTypeFullName(role.getType()); String slotName = role.getName(); String capitalizedSlotName = capitalize(slotName); String methodModifiers = getMethodModifiers(); generateRoleSlotMethodsMultStarGetter("get" + capitalize(role.getName()), role, out); generateRoleSlotMethodsMultStarSetter(role, out, methodModifiers, capitalizedSlotName, typeName, slotName); generateRoleSlotMethodsMultStarRemover(role, out, methodModifiers, capitalizedSlotName, typeName, slotName); generateRoleSlotMethodsMultStarSet(role, out, methodModifiers, capitalizedSlotName, typeName); generateRoleSlotMethodsMultStarCount(role, out, methodModifiers, capitalizedSlotName); generateRoleSlotMethodsMultStarHasAnyChild(role, out, methodModifiers, capitalizedSlotName); generateRoleSlotMethodsMultStarHasChild(role, out, methodModifiers, capitalizedSlotName, typeName, slotName); generateIteratorMethod(role, out); } protected void generateRoleSlotMethodsMultStarGetter(String methodName, Role role, PrintWriter out) { newline(out); printFinalMethod(out, "public", getSetTypeDeclarationFor(role), methodName); startMethodBody(out); generateGetterDAPStatement(dC, role.getName(), role.getType().getFullName(), out);//DAP read stats update statement print(out, "return new " + getRelationAwareTypeFor(role) + "((" + getTypeFullName(role.getOtherRole().getType()) + ") this, " + getRelationSlotNameFor(role) + ", this." + role.getName() + ");"); endMethodBody(out); } protected void generateRoleSlotMethodsMultStarSetter(Role role, PrintWriter out, String methodModifiers, String capitalizedSlotName, String typeName, String slotName) { newline(out); String adderMethodName = getAdderMethodName(role); printFinalMethod(out, methodModifiers, "void", adderMethodName, makeArg(typeName, slotName)); startMethodBody(out); generateRelationAddMethodCall(role, slotName, null, out); endMethodBody(out); } protected void generateRoleSlotMethodsMultStarRemover(Role role, PrintWriter out, String methodModifiers, String capitalizedSlotName, String typeName, String slotName) { String removerMethodName = getRemoverMethodName(role); newline(out); printMethod(out, methodModifiers, "void", removerMethodName, makeArg(typeName, slotName)); startMethodBody(out); generateRelationRemoveMethodCall(role, slotName, out); endMethodBody(out); } protected void generateRoleSlotMethodsMultStarSet(Role role, PrintWriter out, String methodModifiers, String capitalizedSlotName, String typeName) { newline(out); printMethod(out, methodModifiers, makeGenericType("java.util.Set", typeName), "get" + capitalizedSlotName + "Set"); startMethodBody(out); print(out, "return get" + capitalizedSlotName + "();"); endMethodBody(out); } protected void generateRoleSlotMethodsMultStarCount(Role role, PrintWriter out, String methodModifiers, String capitalizedSlotName) { newline(out); printMethod(out, methodModifiers, "int", "get" + capitalizedSlotName + "Count"); startMethodBody(out); printWords(out, "return get" + capitalizedSlotName + "().size();"); endMethodBody(out); } protected void generateRoleSlotMethodsMultStarHasChild(Role role, PrintWriter out, String methodModifiers, String capitalizedSlotName, String typeName, String slotName) { newline(out); printMethod(out, methodModifiers, "boolean", "has" + capitalizedSlotName, makeArg(typeName, slotName)); startMethodBody(out); printWords(out, "return get" + capitalizedSlotName + "().contains(" + slotName + ");"); endMethodBody(out); } protected void generateRoleSlotMethodsMultStarHasAnyChild(Role role, PrintWriter out, String methodModifiers, String capitalizedSlotName) { newline(out); printMethod(out, methodModifiers, "boolean", "hasAny" + capitalizedSlotName); startMethodBody(out); printWords(out, "return (get" + capitalizedSlotName + "().size() != 0);"); endMethodBody(out); } @Override protected void generateGetterBody(String slotName, String typeName, PrintWriter out) { // call the DAP CodeGen which is overridden in this method generateGetterDAPStatement(dC, slotName, typeName, out); printWords(out, "return", getSlotExpression(slotName) + ".get();"); } @Override protected void generateStaticRoleSlotsMultOne(Role role, Role otherRole, PrintWriter out) { printMethod(out, "public", getTypeFullName(role.getType()), "getValue", makeArg(getTypeFullName(otherRole.getType()), "o1")); startMethodBody(out); printWords(out, "return", "((" + otherRole.getType().getBaseName() + ")o1)." + role.getName() + ".get();"); endMethodBody(out); printMethod(out, "public", "void", "setValue", makeArg(getTypeFullName(otherRole.getType()), "o1"), makeArg(getTypeFullName(role.getType()), "o2")); startMethodBody(out); printWords(out, "((" + otherRole.getType().getBaseName() + ")o1)." + role.getName() + ".put(o2);"); endMethodBody(out); } }