| 
 | 1 | +package com.behavioral.iterator;  | 
 | 2 | + | 
 | 3 | +import com.squareup.javapoet.*;  | 
 | 4 | + | 
 | 5 | +import javax.lang.model.element.Modifier;  | 
 | 6 | + | 
 | 7 | + | 
 | 8 | +public class iterator {  | 
 | 9 | + public static void main(String[] args) {  | 
 | 10 | + String input1 = "Iterator";  | 
 | 11 | + String input2 = "Aggregate";  | 
 | 12 | + String input3 = "ConcreteAggregate";  | 
 | 13 | + String input4 = "ConcreteIterator";  | 
 | 14 | + | 
 | 15 | + String packageName = "com.BehavioralDP.iterator";  | 
 | 16 | + | 
 | 17 | +// Observer interface declaration  | 
 | 18 | + ClassName Iterator = ClassName.get("",input1);  | 
 | 19 | + ClassName ConcreteIterator = ClassName.get("",input4);  | 
 | 20 | + MethodSpec first = MethodSpec.methodBuilder("first")  | 
 | 21 | + .addModifiers(Modifier.PUBLIC,Modifier.ABSTRACT).returns(TypeName.OBJECT)  | 
 | 22 | + .build();  | 
 | 23 | + MethodSpec next = MethodSpec.methodBuilder("next")  | 
 | 24 | + .addModifiers(Modifier.PUBLIC,Modifier.ABSTRACT).returns(TypeName.OBJECT)  | 
 | 25 | + .build();  | 
 | 26 | + MethodSpec isDone = MethodSpec.methodBuilder("isDone")  | 
 | 27 | + .addModifiers(Modifier.PUBLIC,Modifier.ABSTRACT).returns(TypeName.BOOLEAN)  | 
 | 28 | + .build();  | 
 | 29 | + MethodSpec currentItem = MethodSpec.methodBuilder("currentItem")  | 
 | 30 | + .addModifiers(Modifier.PUBLIC,Modifier.ABSTRACT).returns(TypeName.OBJECT)  | 
 | 31 | + .build();  | 
 | 32 | + TypeSpec iterator = TypeSpec.interfaceBuilder(Iterator)  | 
 | 33 | + .addModifiers(Modifier.PUBLIC)  | 
 | 34 | + .addJavadoc("Iterator defines an interface for accessing and traversing elements.")  | 
 | 35 | + .addMethod(first)  | 
 | 36 | + .addMethod(next)  | 
 | 37 | + .addMethod(isDone)  | 
 | 38 | + .addMethod(currentItem)  | 
 | 39 | + .build();  | 
 | 40 | + JavaFile class1 = JavaFile.builder(packageName,iterator)  | 
 | 41 | + .skipJavaLangImports(true)  | 
 | 42 | + .build();  | 
 | 43 | + | 
 | 44 | +// Aggregate interface declaration  | 
 | 45 | + ClassName Aggregate = ClassName.get("",input2);  | 
 | 46 | + MethodSpec createIterator = MethodSpec.methodBuilder("createIterator")  | 
 | 47 | + .addModifiers(Modifier.PUBLIC,Modifier.ABSTRACT).returns(Iterator)  | 
 | 48 | + .build();  | 
 | 49 | + TypeSpec aggregate = TypeSpec.interfaceBuilder(Aggregate)  | 
 | 50 | + .addModifiers(Modifier.PUBLIC)  | 
 | 51 | + .addJavadoc("Aggregate defines an interface for creating an Iterator object.")  | 
 | 52 | + .addMethod(createIterator)  | 
 | 53 | + .build();  | 
 | 54 | + JavaFile class2 = JavaFile.builder(packageName,aggregate)  | 
 | 55 | + .skipJavaLangImports(true)  | 
 | 56 | + .build();  | 
 | 57 | + | 
 | 58 | +// ConcreteAggregate class declaration  | 
 | 59 | + ClassName ConcreteAggregate = ClassName.get("",input3);  | 
 | 60 | +// String[] stringRecords = { "first", "second", "third", "fourth" };  | 
 | 61 | + FieldSpec records = FieldSpec.builder(String[].class,"records",Modifier.FINAL,Modifier.PRIVATE)  | 
 | 62 | + .initializer(" { \"first\", \"second\", \"third\", \"fourth\" }")  | 
 | 63 | + .build();  | 
 | 64 | + MethodSpec getRecords= MethodSpec.methodBuilder("getRecords")  | 
 | 65 | + .addModifiers(Modifier.PROTECTED).returns(String[].class)  | 
 | 66 | + .addStatement("return $N", records.name)  | 
 | 67 | + .build();  | 
 | 68 | + TypeSpec concreteAggregate = TypeSpec.classBuilder(ConcreteAggregate)  | 
 | 69 | + .addSuperinterface(Aggregate)  | 
 | 70 | + .addModifiers(Modifier.PUBLIC)  | 
 | 71 | + .addJavadoc("ConcreteAggregate implements the Iterator creation interface to return an instance of the proper ConcreteIterator.")  | 
 | 72 | + .addField(records)  | 
 | 73 | + .addMethod(MethodSpec.methodBuilder(createIterator.name)  | 
 | 74 | + .addModifiers(Modifier.PUBLIC).returns(Iterator)  | 
 | 75 | + .addStatement("return new $T(this)", ConcreteIterator)  | 
 | 76 | + .build())  | 
 | 77 | + .addMethod(getRecords)  | 
 | 78 | + .build();  | 
 | 79 | + JavaFile class3 = JavaFile.builder(packageName,concreteAggregate)  | 
 | 80 | + .skipJavaLangImports(true).build();  | 
 | 81 | + | 
 | 82 | + | 
 | 83 | +// ConcreteIterator class declaration  | 
 | 84 | + FieldSpec concAgg = FieldSpec.builder(ConcreteAggregate,"concreteAggregate",Modifier.PRIVATE)  | 
 | 85 | + .build();  | 
 | 86 | + FieldSpec index = FieldSpec.builder(int.class,"index",Modifier.PRIVATE)  | 
 | 87 | + .initializer("-1")  | 
 | 88 | + .build();  | 
 | 89 | + TypeSpec concreteIterator = TypeSpec.classBuilder(ConcreteIterator)  | 
 | 90 | + .addSuperinterface(Iterator)  | 
 | 91 | + .addModifiers(Modifier.PUBLIC)  | 
 | 92 | + .addJavadoc("ConcreteIterator implements the Iterator interface. Keeps track of the current position in the traversal of the aggregate.")  | 
 | 93 | + .addField(concAgg)  | 
 | 94 | + .addField(index)  | 
 | 95 | + .addMethod(MethodSpec.constructorBuilder()  | 
 | 96 | + .addModifiers(Modifier.PUBLIC)  | 
 | 97 | + .addParameter(ConcreteAggregate, "concreteAggregate")  | 
 | 98 | + .addStatement("this.$N = concreteAggregate",concAgg.name)  | 
 | 99 | + .build())  | 
 | 100 | + .addMethod(MethodSpec.methodBuilder(first.name)  | 
 | 101 | + .addModifiers(Modifier.PUBLIC).returns(TypeName.OBJECT)  | 
 | 102 | + .addStatement("$N = 0",index.name)  | 
 | 103 | + .addStatement("return $N.$N()[$N]",concAgg.name,getRecords.name,index.name)  | 
 | 104 | + .build())  | 
 | 105 | + .addMethod(MethodSpec.methodBuilder(next.name)  | 
 | 106 | + .addModifiers(Modifier.PUBLIC).returns(TypeName.OBJECT)  | 
 | 107 | + .addStatement("$N++",index.name)  | 
 | 108 | + .addStatement("return $N.$N()[$N]",concAgg.name,getRecords.name,index.name)  | 
 | 109 | + .build())  | 
 | 110 | + .addMethod(MethodSpec.methodBuilder(isDone.name)  | 
 | 111 | + .addModifiers(Modifier.PUBLIC).returns(TypeName.BOOLEAN)  | 
 | 112 | + .beginControlFlow("if ($N.$N().length == ($N + 1))",concAgg.name,getRecords.name,index.name)  | 
 | 113 | + .addStatement("return true")  | 
 | 114 | + .endControlFlow()  | 
 | 115 | + .addStatement("return false")  | 
 | 116 | + .build())  | 
 | 117 | + .addMethod(MethodSpec.methodBuilder(currentItem.name)  | 
 | 118 | + .addModifiers(Modifier.PUBLIC).returns(TypeName.OBJECT)  | 
 | 119 | + .addStatement("return $N.$N()[$N]",concAgg.name,getRecords.name,index.name)  | 
 | 120 | + .build())  | 
 | 121 | + .build();  | 
 | 122 | + JavaFile class4 = JavaFile.builder(packageName,concreteIterator)  | 
 | 123 | + .skipJavaLangImports(true).build();  | 
 | 124 | + | 
 | 125 | + System.out.println(class1);  | 
 | 126 | + System.out.println(class2);  | 
 | 127 | + System.out.println(class3);  | 
 | 128 | + System.out.println(class4);  | 
 | 129 | + }  | 
 | 130 | +}  | 
0 commit comments