Skip to content
Snippets Groups Projects
Commit 8c7b7027 authored by Niklas Fors's avatar Niklas Fors
Browse files

Add support for * <-> 1 and 1 <-> *

parent 8cbcac32
No related branches found
No related tags found
No related merge requests found
...@@ -200,37 +200,39 @@ aspect BackendBidirectionalAPI { ...@@ -200,37 +200,39 @@ aspect BackendBidirectionalAPI {
if (l.multiplicityOne()) { if (l.multiplicityOne()) {
if (r.multiplicityOne()) { if (r.multiplicityOne()) {
l.generateBiOne(sb, false); l.generateBiOneOne(sb, false);
r.generateBiOne(sb, false); r.generateBiOneOne(sb, false);
} else if (r.multiplicityOpt()) { } else if (r.multiplicityOpt()) {
l.generateBiOne(sb, false); l.generateBiOneOne(sb, false);
r.generateBiOne(sb, true); r.generateBiOneOne(sb, true);
} else if (r.multiplicityMany()) { } else if (r.multiplicityMany()) {
l.generateBiOneMany(sb);
r.generateBiManyOne(sb);
} }
} else if (l.multiplicityOpt()) { } else if (l.multiplicityOpt()) {
if (r.multiplicityOne()) { if (r.multiplicityOne()) {
l.generateBiOne(sb, true); l.generateBiOneOne(sb, true);
r.generateBiOne(sb, false); r.generateBiOneOne(sb, false);
} else if (r.multiplicityOpt()) { } else if (r.multiplicityOpt()) {
l.generateBiOne(sb, true); l.generateBiOneOne(sb, true);
r.generateBiOne(sb, true); r.generateBiOneOne(sb, true);
} else if (r.multiplicityMany()) { } else if (r.multiplicityMany()) {
} }
} else if (l.multiplicityMany()) { } else if (l.multiplicityMany()) {
if (r.multiplicityOne()) { if (r.multiplicityOne()) {
l.generateBiManyOne(sb);
r.generateBiOneMany(sb);
} else if (r.multiplicityOpt()) { } else if (r.multiplicityOpt()) {
} else if (r.multiplicityMany()) { } else if (r.multiplicityMany()) {
l.generateBiMany(sb); l.generateBiManyMany(sb);
r.generateBiMany(sb); r.generateBiManyMany(sb);
} }
} }
} }
public void RelationComponent.generateBiOne(StringBuilder sb, boolean isOpt) { public void RelationComponent.generateBiOneOne(StringBuilder sb, boolean isOpt) {
// Get // Get
sb.append(ind(1) + "public " + ofTypeDecl() + " " + toTypeDecl()); sb.append(ind(1) + "public " + ofTypeDecl() + " " + toTypeDecl());
sb.append("." + name() + "() {\n"); sb.append("." + name() + "() {\n");
...@@ -268,7 +270,7 @@ aspect BackendBidirectionalAPI { ...@@ -268,7 +270,7 @@ aspect BackendBidirectionalAPI {
} }
} }
public void RelationComponent.generateBiMany(StringBuilder sb) { public void RelationComponent.generateBiManyMany(StringBuilder sb) {
// Get // Get
sb.append(ind(1) + "public java.util.List<" + ofTypeDecl() + "> " + toTypeDecl()); sb.append(ind(1) + "public java.util.List<" + ofTypeDecl() + "> " + toTypeDecl());
sb.append("." + name() + "() {\n"); sb.append("." + name() + "() {\n");
...@@ -310,6 +312,79 @@ aspect BackendBidirectionalAPI { ...@@ -310,6 +312,79 @@ aspect BackendBidirectionalAPI {
sb.append(ind(2) + "}\n"); sb.append(ind(2) + "}\n");
sb.append(ind(1) + "}\n"); sb.append(ind(1) + "}\n");
} }
public void RelationComponent.generateBiManyOne(StringBuilder sb) {
// Get
sb.append(ind(1) + "public java.util.List<" + ofTypeDecl() + "> " + toTypeDecl());
sb.append("." + name() + "() {\n");
sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> l = get"
+ getImplAttributeName() + "();\n");
sb.append(ind(2) + "return l != null ? l : Collections.emptyList();\n");
sb.append(ind(1) + "}\n");
// Add
sb.append(ind(1) + "public void " + toTypeDecl() + ".addTo");
sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n");
sb.append(ind(2) + "assertNotNull(o);\n");
sb.append(ind(2) + "if (o != null && o.get" + otherSide().getImplAttributeName() + "() != null) {\n");
sb.append(ind(3) + "ArrayList<" + ofTypeDecl() + "> list2 = o.get"
+ otherSide().getImplAttributeName() + "().get" + getImplAttributeName() + "();\n");
sb.append(ind(3) + "if (list2.remove(o))\n");
sb.append(ind(4) + "o.get" + otherSide().getImplAttributeName()
+ "().set" + getImplAttributeName() + "(list2);\n");
sb.append(ind(2) + "}\n");
sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
sb.append(ind(2) + "if (list == null) {\n");
sb.append(ind(3) + "list = new ArrayList<>();\n");
sb.append(ind(2) + "}\n");
sb.append(ind(2) + "list.add(o);\n");
sb.append(ind(2) + "set" + getImplAttributeName() + "(list);\n");
sb.append(ind(2) + "o.set" + otherSide().getImplAttributeName() + "(this);\n");
sb.append(ind(1) + "}\n");
// Remove
sb.append(ind(1) + "public void " + toTypeDecl() + ".removeFrom");
sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n");
sb.append(ind(2) + "assertNotNull(o);\n");
sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
sb.append(ind(2) + "if (list != null && list.remove(o)) {\n");
sb.append(ind(3) + "set" + getImplAttributeName() + "(list);\n");
sb.append(ind(3) + "if (o.get" + otherSide().getImplAttributeName() + "() == this) {\n");
sb.append(ind(4) + "o.set" + otherSide().getImplAttributeName() + "(null);\n");
sb.append(ind(3) + "}\n");
sb.append(ind(2) + "}\n");
sb.append(ind(1) + "}\n");
}
public void RelationComponent.generateBiOneMany(StringBuilder sb) {
// Get
sb.append(ind(1) + "public " + ofTypeDecl() + " " + toTypeDecl());
sb.append("." + name() + "() {\n");
sb.append(ind(2) + "return get" + getImplAttributeName() + "();\n");
sb.append(ind(1) + "}\n");
// Set
sb.append(ind(1) + "public void " + toTypeDecl() + ".set" + nameCapitalized()
+ "(" + ofTypeDecl() + " o) {\n");
sb.append(ind(2) + "assertNotNull(o);\n");
sb.append(ind(2) + "if (get" + getImplAttributeName() + "() != null) {\n");
sb.append(ind(3) + "ArrayList<" + toTypeDecl() + "> list2 = get" + getImplAttributeName()
+ "()." + "get" + otherSide().getImplAttributeName() + "();\n");
sb.append(ind(3) + "list2.remove(this);\n");
sb.append(ind(3) + "get" + getImplAttributeName() + "()." + "set"
+ otherSide().getImplAttributeName() + "(list2);\n");
sb.append(ind(2) + "}\n");
sb.append(ind(2) + "set" + getImplAttributeName() + "(o);\n");
sb.append(ind(2) + "ArrayList<" + toTypeDecl() + "> list = o.get"
+ otherSide().getImplAttributeName() + "();\n");
sb.append(ind(2) + "if (list == null) {\n");
sb.append(ind(3) + "list = new ArrayList<>();\n");
sb.append(ind(2) + "}\n");
sb.append(ind(2) + "list.add(this);\n");
sb.append(ind(2) + "o.set" + otherSide().getImplAttributeName() + "(list);\n");
sb.append(ind(1) + "}\n");
}
} }
......
...@@ -191,6 +191,48 @@ public class Test { ...@@ -191,6 +191,48 @@ public class Test {
* rel A.bi3 <-> B.bi3*; * rel A.bi3 <-> B.bi3*;
*/ */
private void testBi3() { private void testBi3() {
setup();
a2.setBi3(b2);
assertNull(a1.bi3());
assertSame(a2.bi3(), b2);
assertEquals(b1.bi3(), Arrays.asList());
assertEquals(b2.bi3(), Arrays.asList(a2));
assertEquals(b3.bi3(), Arrays.asList());
a2.setBi3(b3);
assertNull(a1.bi3());
assertSame(a2.bi3(), b3);
assertEquals(b1.bi3(), Arrays.asList());
assertEquals(b2.bi3(), Arrays.asList());
assertEquals(b3.bi3(), Arrays.asList(a2));
a1.setBi3(b3);
a3.setBi3(b3);
assertSame(a1.bi3(), b3);
assertSame(a2.bi3(), b3);
assertSame(a3.bi3(), b3);
assertEquals(b1.bi3(), Arrays.asList());
assertEquals(b2.bi3(), Arrays.asList());
assertEquals(b3.bi3(), Arrays.asList(a2, a1, a3));
a2.setBi3(b1);
assertSame(a1.bi3(), b3);
assertSame(a2.bi3(), b1);
assertSame(a3.bi3(), b3);
assertEquals(b1.bi3(), Arrays.asList(a2));
assertEquals(b2.bi3(), Arrays.asList());
assertEquals(b3.bi3(), Arrays.asList(a1, a3));
try {
a2.setBi3(null);
check(false, "exception should be thrown");
} catch (Exception e) {
// OK
}
} }
...@@ -281,6 +323,47 @@ public class Test { ...@@ -281,6 +323,47 @@ public class Test {
* rel A.bi7* <-> B.bi7; * rel A.bi7* <-> B.bi7;
*/ */
private void testBi7() { private void testBi7() {
setup();
a2.addToBi7(b2);
assertEquals(a1.bi7(), Arrays.asList());
assertEquals(a2.bi7(), Arrays.asList(b2));
assertNull(b1.bi7());
assertSame(b2.bi7(), a2);
assertNull(b3.bi7());
a2.addToBi7(b3);
a1.addToBi7(b2);
assertEquals(a1.bi7(), Arrays.asList(b2));
assertEquals(a2.bi7(), Arrays.asList(b3));
assertNull(b1.bi7());
assertSame(b2.bi7(), a1);
assertSame(b3.bi7(), a2);
a1.addToBi7(b1);
assertEquals(a1.bi7(), Arrays.asList(b2, b1));
assertEquals(a2.bi7(), Arrays.asList(b3));
assertSame(b1.bi7(), a1);
assertSame(b2.bi7(), a1);
assertSame(b3.bi7(), a2);
a1.addToBi7(b1);
assertEquals(a1.bi7(), Arrays.asList(b2, b1));
assertEquals(a2.bi7(), Arrays.asList(b3));
assertSame(b1.bi7(), a1);
assertSame(b2.bi7(), a1);
assertSame(b3.bi7(), a2);
a1.removeFromBi7(b1);
assertEquals(a1.bi7(), Arrays.asList(b2));
assertEquals(a2.bi7(), Arrays.asList(b3));
assertNull(b1.bi7());
assertSame(b2.bi7(), a1);
assertSame(b3.bi7(), a2);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment