KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > corba > generator > cif > lib > CIF_JavaGenerator


1 /*====================================================================
2
3 OpenCCM: The Open CORBA Component Model Platform
4 Copyright (C) 2000-2004 INRIA & USTL - LIFL - GOAL
5 Contact: openccm@objectweb.org
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General Public
18 License along with this library; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20 USA
21
22 Initial developer(s): Christophe Demarey.
23 Contributor(s): ________________________________________.
24
25 ====================================================================*/

26
27 package org.objectweb.corba.generator.cif.lib;
28
29
30 // Package dependencies
31
import org.objectweb.openccm.ast.api.*;
32 import org.objectweb.openccm.generator.java.core.lib.*;
33 import org.objectweb.openccm.generator.translator.idl2java.api.PSDL_JavaTranslator;
34 import org.objectweb.openccm.generator.java.ast.api.*;
35 import org.objectweb.openccm.generator.java.ast.lib.*;
36 import org.objectweb.openccm.ast.utils.api.ExecutorInfo;
37 import org.objectweb.openccm.generator.common.lib.GenerationException;
38 import java.util.List JavaDoc;
39 import java.util.ArrayList JavaDoc;
40
41
42 /**
43  * This class generates CIF implementation.
44  * Firstly, a java ast is fed, then classes are generated by the JavaGenerator.
45  *
46  * @author <a HREF="mailto:Christophe.Demarey@lifl.fr">Christophe Demarey</A>
47  */

48
49 public class CIF_JavaGenerator
50      extends org.objectweb.openccm.generator.common.lib.GeneratorBase
51   implements org.objectweb.corba.generator.cif.api.CIF_JavaGenerator
52 {
53     // ==================================================================
54
//
55
// Internal state.
56
//
57
// ==================================================================
58

59     /** The java repository */
60     private Repository repository_;
61
62     /** Utility class to convert types in Java*/
63     public PSDL_JavaTranslator translator_;
64
65     // ==================================================================
66
//
67
// Constructor.
68
//
69
// ==================================================================
70

71     /**
72      * The default constructor.
73      *
74      * @param ast - The Abstract Syntax Tree.
75      **/

76     public CIF_JavaGenerator(AST ast)
77     {
78         super(ast);
79         // Init internal state
80
repository_ = null;
81         translator_ = new org.objectweb.openccm.generator.translator.idl2java.lib.PSDL_JavaTranslator();
82     }
83
84     // ==================================================================
85
//
86
// Internal methods.
87
//
88
// ==================================================================
89

90     /**
91      * Map a Home Executor definition into a java Class.
92      *
93      * @param home_executor - The home executor to map.
94      * @param package_name - The package name.
95      * @param component_executor_name - The component executor name.
96      */

97     private void
98     mapHomeExecutor( HomeExecutorDecl home_executor,
99                      String JavaDoc package_name,
100                      String JavaDoc component_executor_name )
101     {
102         ClassObject clazz = null;
103         ConstructorObject ct = null;
104         MethodObject method = null;
105
106         clazz = new ClassObjectImpl(home_executor.getName());
107         clazz.addComment("Home Executor for " + component_executor_name);
108         clazz.setAbstract(true);
109         clazz.setModifier(ModifierKindImpl.mk_public);
110         clazz.setPackage(package_name);
111         clazz.addInheritedObject("org.objectweb.ccm.runtime.cif.lib.HomeBase");
112         clazz.addImplementedObject("CIF_" + home_executor.getName());
113
114         // Add the constructor
115
ct = new ConstructorObjectImpl();
116         clazz.addConstructor(ct);
117
118         // Add the create method
119
method = new MethodObjectImpl();
120         method.addComment("Create a component executor.");
121         method.addComment(" ");
122         method.addComment("@return The EnterpriseComponent created executor.");
123         method.setName("create");
124         method.setReturnType("org.omg.Components.EnterpriseComponent");
125         method.getImpl().setMacro("HE_CREATE");
126         clazz.addMethod(method);
127
128         repository_.addObject(clazz);
129     }
130
131     /**
132      * Map a Component Executor definition into a java Class.
133      *
134      * @param comp_exec - The component executor to map.
135      * @param package_name - The package name.
136      * @param comp_decl - The component to map.
137      * @param segments - All segments contained by the component executor.
138      * @param context - The associated context.
139      */

140     private void
141     mapComponentExecutor( ExecutorDecl comp_exec,
142                           String JavaDoc package_name,
143                           ComponentDecl comp_decl,
144                           Declaration[] segments,
145                           InterfaceDecl context )
146     {
147         ClassObject clazz = null;
148         ConstructorObject ct = null;
149         MethodObject method = null;
150         AttributeObject att = null;
151         ParameterObject param = null;
152         CategoryKind kind = null;
153         ExecutorInfo exec_info = null;
154
155         clazz = new ClassObjectImpl(comp_exec.getName());
156         clazz.addComment("Component Executor for "+comp_decl.getName());
157         clazz.setAbstract(true);
158         clazz.setModifier(ModifierKindImpl.mk_public);
159         clazz.setPackage(package_name);
160         kind = comp_exec.getCompositionKind();
161         if ((kind==CategoryKind.ck_entity) || (kind==CategoryKind.ck_process))
162             clazz.addInheritedObject("org.objectweb.ccm.runtime.cif.lib.EntityComponentSegmentBase");
163         else
164             clazz.addInheritedObject("org.objectweb.ccm.runtime.cif.lib.SessionComponentSegmentBase");
165
166         clazz.addImplementedObject("CIF_" + comp_exec.getName());
167
168         // Add the segmentation table attribute
169
att = new AttributeObjectImpl();
170         att.addComment("The segmentation table.");
171         att.setName("the_segmentation_table_");
172         att.setType("java.util.HashMap");
173         att.setModifier( ModifierKindImpl.mk_private );
174         att.setStatic(true);
175         clazz.addAttribute(att);
176
177         // Add the _segment_id_value attribute
178
att = new AttributeObjectImpl();
179         att.addComment("The segment id.");
180         att.setName("_segment_id_value");
181         att.setType("int");
182         att.setModifier( ModifierKindImpl.mk_public );
183         att.setFinal(true);
184         att.setStatic(true);
185         att.setInitialValue("0");
186         clazz.addAttribute(att);
187
188         // Add the context attribute
189
att = new AttributeObjectImpl();
190         att.addComment(" To refer to the component context.");
191         att.setName("the_context_");
192         att.setType(translator_.getAbsoluteName(context));
193         att.setModifier( ModifierKindImpl.mk_private );
194         clazz.addAttribute(att);
195
196         // Add the constructor
197
ct = new ConstructorObjectImpl();
198         ct.getImpl().setMacro("CE_CONSTRUCTOR");
199         ct.getImpl().addContextValue("nb", new Integer JavaDoc(segments.length+1));
200         clazz.addConstructor(ct);
201
202         // Add a static statement
203
method = new MethodObjectImpl();
204         method.setName("StaticStatement");
205         method.getImpl().setMacro("CE_STATIC_STATEMENT");
206         exec_info = new org.objectweb.openccm.ast.utils.lib.ExecutorInfo(comp_exec);
207         method.getImpl().addContextValue("comp_facet_list", exec_info.getMainSegmentFacets());
208         method.getImpl().addContextValue("segment_list", segments);
209         method.getImpl().addContextValue("component_name", comp_decl.getName());
210         clazz.addMethod(method);
211
212         // Add the get_segmentation_table() method
213
method = new MethodObjectImpl();
214         method.addComment("Obtain the segmentation table.");
215         method.addComment(" ");
216         method.addComment("@return A HashMap containing <facet_name, segid> associations.");
217         method.setName("get_segmentation_table");
218         method.setReturnType("java.util.HashMap");
219         method.getImpl().setMacro("GET_METHOD");
220         method.getImpl().addContextValue("var", "the_segmentation_table_");
221         clazz.addMethod(method);
222
223         if ((kind==CategoryKind.ck_entity) || (kind==CategoryKind.ck_process))
224         {
225             // Add the set_entity_context() method
226
method = new MethodObjectImpl();
227             method.addComment("Set the entity component context.");
228             method.addComment("Must be implemented in subclasses.");
229             method.addComment(" ");
230             method.addComment("@param context The entity component context.");
231             method.addComment(" ");
232             method.addComment("@throw org.omg.Components.CCMException For any problems.");
233             method.setName("set_entity_context");
234             method.setReturnType("void");
235             param = new ParameterObjectImpl();
236             param.setName("context");
237             param.setType("org.omg.Components.EntityContext");
238             method.addParameter(param);
239             method.addException("org.omg.Components.CCMException");
240             method.getImpl().setMacro("SET_METHOD");
241             method.getImpl().addContextValue("var", "the_context_");
242             method.getImpl().addContextValue("value", "(" + translator_.getAbsoluteName(context) + ")context");
243             clazz.addMethod(method);
244
245             // Add the unset_entity_context() method
246
method = new MethodObjectImpl();
247             method.addComment("Unset the entity component context.");
248             method.addComment(" ");
249             method.addComment("@throw org.omg.Components.CCMException For any problems.");
250             method.setName("unset_entity_context");
251             method.setReturnType("void");
252             method.addException("org.omg.Components.CCMException");
253             method.getImpl().setMacro("SET_METHOD");
254             method.getImpl().addContextValue("var", "the_context_");
255             method.getImpl().addContextValue("value", "null");
256             clazz.addMethod(method);
257         }
258         else
259         {
260             // Add the set_session_context() method
261
method = new MethodObjectImpl();
262             method.addComment("Set the session component context.");
263             method.addComment("Must be implemented in subclasses.");
264             method.addComment(" ");
265             method.addComment("@param context The session component context.");
266             method.addComment(" ");
267             method.addComment("@throw org.omg.Components.CCMException For any problems.");
268             method.setName("set_session_context");
269             method.setReturnType("void");
270             param = new ParameterObjectImpl();
271             param.setName("context");
272             param.setType("org.omg.Components.SessionContext");
273             method.addParameter(param);
274             method.addException("org.omg.Components.CCMException");
275             method.getImpl().setMacro("SET_METHOD");
276             method.getImpl().addContextValue("var", "the_context_");
277             method.getImpl().addContextValue("value", "(" + translator_.getAbsoluteName(context) + ")context");
278             clazz.addMethod(method);
279         }
280
281         // Add the get_context() method
282
method = new MethodObjectImpl();
283         method.addComment("Obtain the context.");
284         method.addComment(" ");
285         method.addComment("@return The associated context.");
286         method.setName("get_context");
287         method.setReturnType(translator_.getAbsoluteName(context));
288         method.getImpl().setMacro("GET_METHOD");
289         method.getImpl().addContextValue("var", "the_context_");
290         clazz.addMethod(method);
291
292         // Add the get_main_segment() method
293
method = new MethodObjectImpl();
294         method.addComment("Obtain the main executor segment.");
295         method.addComment(" ");
296         method.addComment("@return The main segment (with id = 0).");
297         method.setName("get_main_segment");
298         method.setReturnType("CIF_" + comp_exec.getName());
299         method.getImpl().setMacro("GET_METHOD");
300         method.getImpl().addContextValue("var", "this");
301         clazz.addMethod(method);
302
303         /* For Persistence */
304         if ((kind==CategoryKind.ck_entity) || (kind==CategoryKind.ck_process))
305         {
306             // Ajouter get_state();
307
}
308
309         repository_.addObject(clazz);
310     }
311
312     /**
313      * Map a segment definition into a java Class.
314      *
315      * @param segment - The segment to map.
316      * @param package_name - The package name.
317      * @param seg_id - The segment id.
318      * @param comp_exec - The component executor to map.
319      * @param context - The associated context.
320      */

321     private void
322     mapSegment( SegmentDecl segment,
323                 String JavaDoc package_name,
324                 int seg_id,
325                 ExecutorDecl comp_exec,
326                 InterfaceDecl context )
327     {
328         ClassObject clazz = null;
329         ConstructorObject ct = null;
330         MethodObject method = null;
331         AttributeObject att = null;
332         ParameterObject param = null;
333
334         clazz = new ClassObjectImpl(segment.getName());
335         clazz.addComment("Segment");
336         clazz.setAbstract(true);
337         clazz.setModifier(ModifierKindImpl.mk_public);
338         clazz.setPackage(package_name);
339         clazz.addInheritedObject("org.objectweb.corba.util.LocalObjectBase");
340         clazz.addImplementedObject("CIF_" + segment.getName());
341         clazz.addImplementedObject("org.objectweb.ccm.runtime.cif.api.Segment");
342
343         // Add the _segment_id_value attribute
344
att = new AttributeObjectImpl();
345         att.addComment("The segment id.");
346         att.setName("_segment_id_value");
347         att.setType("int");
348         att.setModifier( ModifierKindImpl.mk_public );
349         att.setFinal(true);
350         att.setStatic(true);
351         att.setInitialValue(new Integer JavaDoc(seg_id).toString());
352         clazz.addAttribute(att);
353
354         // Add the main segment attribute
355
att = new AttributeObjectImpl();
356         att.addComment("To refer to the main segment.");
357         att.setName("main_segment_");
358         att.setType("CIF_" + comp_exec.getName());
359         att.setModifier( ModifierKindImpl.mk_private );
360         clazz.addAttribute(att);
361
362         // Add the constructor
363
ct = new ConstructorObjectImpl();
364         clazz.addConstructor(ct);
365
366         // Add the set_main_segment() method
367
method = new MethodObjectImpl();
368         method.addComment("Set the main segment executor (segid = 0).");
369         method.addComment(" ");
370         method.addComment("@param seg - The main segment.");
371         method.setName("set_main_segment");
372         method.setReturnType("void");
373         param = new ParameterObjectImpl();
374         param.setName("seg");
375         param.setType("org.objectweb.ccm.runtime.cif.api.ComponentSegment");
376         method.addParameter(param);
377         method.getImpl().setMacro("SET_METHOD");
378         method.getImpl().addContextValue("var", "main_segment_");
379         method.getImpl().addContextValue("value", "(CIF_" + comp_exec.getName() + ")seg");
380         clazz.addMethod(method);
381
382         // Add the get_context() method
383
method = new MethodObjectImpl();
384         method.addComment("Obtain the context.");
385         method.addComment(" ");
386         method.addComment("@return The associated context.");
387         method.setName("get_context");
388         method.setReturnType(translator_.getAbsoluteName(context));
389         method.getImpl().setMacro("GET_METHOD");
390         method.getImpl().addContextValue("var", " get_main_segment().get_context()");
391         clazz.addMethod(method);
392
393         // Add the get_main_segment() method
394
method = new MethodObjectImpl();
395         method.addComment("Obtain the main executor segment.");
396         method.addComment(" ");
397         method.addComment("@return The main segment (with id = 0).");
398         method.setName("get_main_segment");
399         method.setReturnType("CIF_" + comp_exec.getName());
400         method.getImpl().setMacro("GET_METHOD");
401         method.getImpl().addContextValue("var", "main_segment_");
402         clazz.addMethod(method);
403
404         repository_.addObject(clazz);
405     }
406
407     // ==================================================================
408
//
409
// Public methods.
410
//
411
// ==================================================================
412

413     /**
414      * Generate java files for the CIF.
415      *
416      * @param base_dir - The base directory where files will be generated.
417      * @param scope - The scope to map.
418      **/

419     public void
420     cif_to_java(String JavaDoc base_dir, Scope scope)
421     throws GenerationException
422     {
423         java.io.File JavaDoc out_dir = null;
424         repository_ = new RepositoryImpl();
425         Declaration[] compositions = null;
426         List JavaDoc list = null;
427
428         // Check and create the output directory
429
try{
430             out_dir = org.objectweb.openccm.generator.common.lib.FileManager.mkdir(base_dir);
431         }catch(GenerationException ex){
432             System.err.println(ex.getMessage());
433             return;
434         }
435
436         /** Get all compositions contained in the file scope **/
437         list = getAllDeclarations(scope, DeclarationKind.dk_composition);
438         compositions = (Declaration[]) list.toArray(new Declaration[0]);
439
440         // For each composition, call mapping
441
for (int i=0; i<compositions.length; i++)
442         {
443             CompositionDecl composition = ((CompositionDecl)compositions[i]);
444             ComponentDecl component = null;
445             Declaration[] decls = null, segments = null;
446             HomeExecutorDecl home_exec = null;
447             ExecutorDecl comp_exec = null;
448             InterfaceDecl context = null;
449             String JavaDoc package_name = null;
450             ArrayList JavaDoc facet_list = null;
451
452             /** Get the home executor */
453             decls = composition.getContents(true, DeclarationKind.dk_home_executor);
454               // A composition has 1 home executor.
455
home_exec = (org.objectweb.openccm.ast.lib.HomeExecutorDeclImpl)decls[0];
456             package_name = translator_.getPackage(home_exec);
457
458             /** Get the component executor */
459             decls = home_exec.getContents(true, DeclarationKind.dk_executor);
460               // A Home Executor has 1 component executor.
461
comp_exec = (org.objectweb.openccm.ast.lib.ExecutorDeclImpl)decls[0];
462
463             /** Get the associated context */
464             component = home_exec.getHomeType().getManagedComponent();
465             context = component.getLocalContextMapping();
466
467             /** Get segments */
468             segments = comp_exec.getContents(true, DeclarationKind.dk_segment);
469
470             // Call mapping for home executor
471
mapHomeExecutor( home_exec,
472                              package_name,
473                              comp_exec.getName() );
474             // Call mapping for component executor
475
mapComponentExecutor( comp_exec,
476                                   package_name,
477                                   component,
478                                   segments,
479                                   context );
480             // Call mapping for segments
481
for (int j=0; j<segments.length; j++)
482             {
483                 mapSegment( (SegmentDecl)segments[j],
484                             package_name,
485                             j+1, // seg_id starts from 1 (0 is reserved to the component executor)
486
comp_exec,
487                             context );
488             }
489         }
490
491         // Generate Java Files
492
org.objectweb.openccm.generator.java.core.lib.JavaGenerator java_gen = new JavaGenerator();
493         java.util.Vector JavaDoc v = new java.util.Vector JavaDoc();
494         v.add("org/objectweb/corba/generator/cif/cif.vm");
495         java_gen.initialize("CIF", v);
496         java_gen.generate(repository_, base_dir);
497     }
498 }
499
Popular Tags