1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.objectweb.fractal.cecilia.primitive.thinkMC.attributes;
28
29 import java.util.HashMap;
30 import java.util.Map;
31
32 import org.objectweb.fractal.adl.attributes.Attribute;
33 import org.objectweb.fractal.adl.attributes.Attributes;
34 import org.objectweb.fractal.adl.components.ComponentContainer;
35 import org.objectweb.fractal.api.Component;
36 import org.objectweb.fractal.cecilia.adl.AbstractInstantiationTask;
37 import org.objectweb.fractal.cecilia.adl.SourceCodeProvider;
38 import org.objectweb.fractal.cecilia.adl.attributes.AbstractAttributeVisitor;
39 import org.objectweb.fractal.cecilia.adl.file.CodeWriter;
40 import org.objectweb.fractal.cecilia.adl.idl.ast.ArrayOf;
41 import org.objectweb.fractal.cecilia.adl.idl.ast.Field;
42 import org.objectweb.fractal.cecilia.adl.idl.ast.FieldContainer;
43 import org.objectweb.fractal.cecilia.adl.idl.ast.IDLDefinitionContainer;
44 import org.objectweb.fractal.cecilia.adl.idl.ast.Type;
45 import org.objectweb.fractal.cecilia.adl.idl.ast.ComplexType;
46 import org.objectweb.fractal.cecilia.adl.idl.ast.PointerOf;
47 import org.objectweb.fractal.cecilia.adl.idl.ast.PrimitiveType;
48 import org.objectweb.fractal.cecilia.adl.idl.util.CUtil;
49 import org.objectweb.fractal.cecilia.adl.idl.util.Util;
50 import org.objectweb.fractal.task.core.TaskException;
51 import org.objectweb.fractal.task.core.primitive.annotations.ServerInterface;
52 import org.objectweb.fractal.task.core.primitive.annotations.ServerInterfaces;
53 import org.objectweb.fractal.task.core.primitive.annotations.TaskParameters;
54
55
56
57
58
59
60 public class AttributeInstantiationVisitor extends AbstractAttributeVisitor {
61
62
63
64
65
66 @Override
67 protected Component createTask(final ComponentContainer container,
68 final Attributes attributes) throws TaskException {
69 final Map<String, Type> fieldTypes = new HashMap<String, Type>();
70 for (final Field field : ((FieldContainer) ((IDLDefinitionContainer) attributes)
71 .getIDLDefinition()).getFields()) {
72 fieldTypes.put(field.getName(), Util.getContainedType(field));
73 }
74 return taskFactoryItf.newPrimitiveTask(new AttributeDefinitionTask(
75 attributes.getAttributes(), fieldTypes), container);
76 }
77
78
79
80
81
82
83
84
85
86 @TaskParameters("componentNode")
87 @ServerInterfaces(@ServerInterface(name = "source-code-provider", signature = SourceCodeProvider.class, record = "role:attributeInstantiation, id:%", parameters = "componentNode"))
88 public static class AttributeDefinitionTask extends AbstractInstantiationTask {
89
90 protected final Map<String, Type> fieldTypes;
91
92 protected final Attribute[] fields;
93
94
95
96
97
98
99
100
101
102
103 public AttributeDefinitionTask(final Attribute[] fields,
104 final Map<String, Type> fieldTypes) {
105 this.fields = fields;
106 this.fieldTypes = fieldTypes;
107 }
108
109
110
111
112
113 @Override
114 protected String processSourceCode() throws Exception {
115 final CodeWriter cw = new CodeWriter();
116 cw.append("{");
117 for (final Attribute field : fields) {
118 final Type attType = fieldTypes.get(field.getName());
119 final String attTypeStr = CUtil.buildDeclarationType(attType);
120 final String valSym = field.getValue();
121
122
123 cw.append('(').append(attTypeStr).append(") ");
124
125
126 cw.append(valSym).appendln(", ");
127 }
128 cw.append("}");
129 return cw.toString();
130 }
131 }
132 }