1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.objectweb.fractal.cecilia.adl.idl;
25
26 import java.io.File;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.logging.Level;
30 import java.util.logging.Logger;
31
32 import org.objectweb.fractal.adl.ADLException;
33 import org.objectweb.fractal.adl.Node;
34 import org.objectweb.fractal.adl.timestamp.Timestamp;
35 import org.objectweb.fractal.adl.util.FractalADLLogManager;
36 import org.objectweb.fractal.api.Component;
37 import org.objectweb.fractal.cecilia.adl.SourceCodeProvider;
38 import org.objectweb.fractal.cecilia.adl.file.CodeWriter;
39 import org.objectweb.fractal.cecilia.adl.file.SourceFile;
40 import org.objectweb.fractal.cecilia.adl.file.SourceFileProvider;
41 import org.objectweb.fractal.cecilia.adl.file.SourceFileWriter;
42 import org.objectweb.fractal.cecilia.adl.idl.ast.UnionDefinition;
43 import org.objectweb.fractal.cecilia.adl.idl.ast.IDLDefinition;
44 import org.objectweb.fractal.task.core.AbstractTaskFactoryUser;
45 import org.objectweb.fractal.task.core.Executable;
46 import org.objectweb.fractal.task.core.TaskException;
47 import org.objectweb.fractal.task.core.primitive.annotations.ClientInterface;
48 import org.objectweb.fractal.task.core.primitive.annotations.ServerInterface;
49 import org.objectweb.fractal.task.core.primitive.annotations.ServerInterfaces;
50 import org.objectweb.fractal.task.core.primitive.annotations.TaskParameters;
51
52
53
54
55 public class CUnionFileVisitor extends AbstractTaskFactoryUser
56 implements
57 IDLDefinitionVisitor {
58
59
60 protected static Logger logger = FractalADLLogManager.getLogger("dep");
61
62
63
64
65
66
67
68
69
70 public Component visit(final List<Node> path,
71 final IDLDefinition idlDefinition, final Map<Object, Object> context)
72 throws ADLException, TaskException {
73 if (idlDefinition instanceof UnionDefinition) {
74 return taskFactoryItf.newPrimitiveTask(new CUnionFileTask(
75 (UnionDefinition) idlDefinition, (File) context
76 .get("idlBuildDirectory")), idlDefinition);
77 } else
78 return null;
79 }
80
81
82
83
84
85
86
87
88
89
90
91
92 @TaskParameters("unionDefinitionNode")
93 @ServerInterfaces({
94 @ServerInterface(name = "c-union-definition-provider", signature = SourceCodeProvider.class, record = "role:cUnionHeaderSource, id:%", parameters = {"unionDefinitionNode"}),
95 @ServerInterface(name = "c-union-header-file-provider", signature = SourceFileProvider.class, record = "role:cUnionHeaderFile, id:%", parameters = {"unionDefinitionNode"})})
96 public static class CUnionFileTask
97 implements
98 Executable,
99 SourceCodeProvider,
100 SourceFileProvider {
101
102
103 protected final UnionDefinition unionDefinition;
104 protected final File idlBuildDirectory;
105
106
107 protected SourceFile sourceFile;
108
109 protected String sourceCode;
110
111 protected String headerFileName;
112
113
114
115
116
117
118 @ClientInterface(name = "c-union-definition", record = "role:cUnionDefinition, id:%", parameters = "unionDefinitionNode")
119 public SourceCodeProvider cItfSourceItf;
120
121
122
123
124
125
126
127
128
129
130
131 public CUnionFileTask(final UnionDefinition unionDefinition,
132 final File idlBuildDirectory) {
133 this.unionDefinition = unionDefinition;
134 this.idlBuildDirectory = idlBuildDirectory;
135 }
136
137
138
139
140
141 public void execute() throws Exception {
142
143
144 if (sourceFile == null) {
145 headerFileName = unionDefinition.getName().replace('.',
146 File.separatorChar)
147 + ".idl.h";
148 prepareSourceCode();
149 prepareSourceFile();
150 }
151 }
152
153
154
155
156
157 public String getSourceCode() {
158 return sourceCode;
159 }
160
161
162
163
164
165 public SourceFile getSourceFile() {
166 return sourceFile;
167 }
168
169
170
171
172
173 protected void prepareSourceCode() {
174 final CodeWriter cw = new CodeWriter();
175 cw.append("#include \"").append(headerFileName).append("\"").endl();
176 sourceCode = cw.toString();
177 }
178
179 protected void prepareSourceFile() throws Exception {
180 final File file = new File(idlBuildDirectory, headerFileName);
181 sourceFile = new SourceFile(unionDefinition.getName(), file);
182
183 if (Timestamp.isNodeMoreRecentThan(unionDefinition, file)) {
184 SourceFileWriter.createOutputDir(file.getParentFile());
185 SourceFileWriter.writeToFile(file, cItfSourceItf.getSourceCode());
186 } else if (logger.isLoggable(Level.FINE)) {
187 logger.fine("IDL file '" + file + "' is uptodate");
188 }
189 }
190 }
191 }