View Javadoc
1   package de.fhdw.wtf.generator.writer.tasks;
2   
3   import java.io.File;
4   
5   import de.fhdw.wtf.common.exception.walker.CyclicDependencyException;
6   import de.fhdw.wtf.common.exception.walker.TaskException;
7   import de.fhdw.wtf.common.task.DependencyTask;
8   import de.fhdw.wtf.common.task.TaskExecutor;
9   import de.fhdw.wtf.generator.java.generatorModel.GenAnyType;
10  import de.fhdw.wtf.generator.java.generatorModel.GenAspect;
11  import de.fhdw.wtf.generator.java.generatorModel.GenClassClass;
12  import de.fhdw.wtf.generator.java.generatorModel.GenException;
13  import de.fhdw.wtf.generator.java.generatorModel.GenExternalClassClass;
14  import de.fhdw.wtf.generator.java.generatorModel.GenExternalInterfaceClass;
15  import de.fhdw.wtf.generator.java.generatorModel.GenInterfaceClass;
16  import de.fhdw.wtf.generator.java.generatorModel.GenInterfaceWithClassImplClass;
17  import de.fhdw.wtf.generator.java.generatorModel.GenJavaException;
18  import de.fhdw.wtf.generator.java.generatorModel.GenOperation;
19  import de.fhdw.wtf.generator.java.generatorModel.GenSimpleInterfaceClass;
20  import de.fhdw.wtf.generator.java.generatorModel.GenUserClass;
21  import de.fhdw.wtf.generator.java.generatorModel.GeneratorModel;
22  import de.fhdw.wtf.generator.java.visitor.GenClassClassVisitor;
23  import de.fhdw.wtf.generator.java.visitor.GenInterfaceClassVisitor;
24  import de.fhdw.wtf.generator.java.walker.SimpleGeneratorModelWalkerTask;
25  import de.fhdw.wtf.generator.writer.writer.ExceptionFileWriter;
26  import de.fhdw.wtf.generator.writer.writer.FileHeaderWriter;
27  import de.fhdw.wtf.generator.writer.writer.JavaAspectClassFileWriter;
28  import de.fhdw.wtf.generator.writer.writer.JavaClassFileWriter;
29  import de.fhdw.wtf.generator.writer.writer.JavaInterfaceClassFileWriter;
30  
31  /**
32   * 
33   * {@link DependencyTask} for Writing all Java-Files declared in a {@link GeneratorModel} by {@link GenClassClass}s or
34   * {@link GenInterfaceClass} .
35   */
36  public class FileWriterTask extends SimpleGeneratorModelWalkerTask {
37  	
38  	private final JavaInterfaceClassFileWriter interfaceWriter;
39  	private final JavaClassFileWriter classWriter;
40  	private final JavaAspectClassFileWriter aspectWriter;
41  	private final ExceptionFileWriter exceptionWriter;
42  	
43  	private final File rootDir;
44  	
45  	public FileWriterTask(final TaskExecutor taskmanager,
46  			final GeneratorModel model,
47  			final String rootDir,
48  			final DependencyTask clipper) {
49  		super(taskmanager, model);
50  		this.interfaceWriter = new JavaInterfaceClassFileWriter(true);
51  		this.classWriter = new JavaClassFileWriter(true);
52  		this.aspectWriter = new JavaAspectClassFileWriter(true);
53  		this.exceptionWriter = new ExceptionFileWriter(true);
54  		this.rootDir = new File(rootDir);
55  		
56  		try {
57  			this.addDependency(clipper);
58  		} catch (final CyclicDependencyException e) {
59  			// should not happen
60  			e.printStackTrace();
61  			throw new Error("Dependency tasks are cyclic in FileWriterTask.");
62  		}
63  	}
64  	
65  	/**
66  	 * Writes the given {@link GenClassClass}.
67  	 */
68  	@Override
69  	public void handleClassClass(final GenClassClass cc) throws TaskException {
70  		cc.accept(new GenClassClassVisitor() {
71  			@Override
72  			public void handle(final GenAspect aspect) {
73  				final FileHeaderWriter writer = new FileHeaderWriter(FileWriterTask.this.aspectWriter);
74  				writer.writeGenClass(aspect, FileWriterTask.this.rootDir);
75  			}
76  			
77  			@Override
78  			public void handle(final GenUserClass userclass) {
79  				final FileHeaderWriter writer = new FileHeaderWriter(FileWriterTask.this.classWriter);
80  				writer.writeGenClass(userclass, FileWriterTask.this.rootDir);
81  			}
82  			
83  			@Override
84  			public void handle(final GenJavaException javaE) {
85  				// nothing to do
86  			}
87  			
88  			@Override
89  			public void handle(final GenAnyType anyType) {
90  				// nothing to do
91  			}
92  			
93  			@Override
94  			public void handle(final GenException exceptionClass) {
95  				final FileHeaderWriter headerWriter = new FileHeaderWriter(FileWriterTask.this.exceptionWriter);
96  				headerWriter.writeGenClass(exceptionClass, FileWriterTask.this.rootDir);
97  			}
98  			
99  			@Override
100 			public void handle(final GenExternalClassClass externalClass) {
101 				// nothing to do
102 			}
103 		});
104 	}
105 	
106 	/**
107 	 * Writes the given {@link GenInterfaceClass}.
108 	 */
109 	@Override
110 	public void handleInterfaceClass(final GenInterfaceClass ic) throws TaskException {
111 		ic.accept(new GenInterfaceClassVisitor() {
112 			
113 			@Override
114 			public void handle(final GenInterfaceWithClassImplClass interfaceWithImplClass) {
115 				
116 				final FileHeaderWriter writer = new FileHeaderWriter(FileWriterTask.this.interfaceWriter);
117 				writer.writeGenClass(interfaceWithImplClass, FileWriterTask.this.rootDir);
118 				
119 				final FileHeaderWriter classWriter = new FileHeaderWriter(FileWriterTask.this.classWriter);
120 				classWriter.writeGenClass(interfaceWithImplClass.getClassRepresentation(), FileWriterTask.this.rootDir);
121 				
122 			}
123 			
124 			@Override
125 			public void handle(final GenSimpleInterfaceClass simpleInterface) {
126 				
127 				final FileHeaderWriter writer = new FileHeaderWriter(FileWriterTask.this.interfaceWriter);
128 				writer.writeGenClass(simpleInterface, FileWriterTask.this.rootDir);
129 			}
130 			
131 			@Override
132 			public void handle(final GenExternalInterfaceClass iface) {
133 				// nothing to do, interface must already exist
134 			}
135 		});
136 	}
137 	
138 	@Override
139 	public void finalizeTask() throws TaskException {
140 		// nothing to do
141 	}
142 	
143 	@Override
144 	public String toString() {
145 		return "Filewriting";
146 	}
147 	
148 	@Override
149 	public void handleOperation(final GenOperation o) throws TaskException {
150 		// nothing to do
151 	}
152 }