View Javadoc

1   /*
2    * Copyright (c) 2001-2005,
3    * RedVerst Group, ISP RAS http://www.ispras.ru
4    * All rights reserved.
5    *
6    * Redistribution and use in source and binary forms, with or without
7    * modification, are permitted provided that the following conditions are met:
8    *
9    * 1. Redistributions of source code must retain the above copyright notice, this
10   *    list of conditions and the following disclaimer.
11   *
12   * 2. Redistributions in binary form must reproduce the above copyright notice,
13   *    this list of conditions and the following disclaimer in the documentation
14   *    and/or other materials provided with the distribution.
15   *
16   * 3. The names "ATP", "TreeDL", "RedVerst", "ISP RAS"
17   *    may not be used to endorse or promote products derived from this software
18   *    without specific prior written permission.
19   *
20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
24   * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
27   * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30   */
31  
32  package com.unitesk.atp.treedl;
33  
34  import com.unitesk.atp.tool.PluginClass;
35  import com.unitesk.atp.treedl.TDL.*;
36  
37  /***
38   * @author <A href="mailto:demakov@ispras.ru">Alexey Demakov</A>
39   * @version $Id: Java5NodeFactoryGenerator.java,v 1.4 2005/11/20 20:20:13 all-x Exp $
40   */
41  public class Java5NodeFactoryGenerator
42      extends Java5InterfaceFactoryGenerator
43  {
44      /***
45       * {@inheritDoc}
46       */
47      public String getVersion()
48      {
49          return PluginClass.getRevision( "$Revision: 1.4 $" ) + "-beta";
50      }
51  
52      public void visitModule( Module node )
53      {
54          setFunction( "PredefinedTypeName", new PredefinedTypeNameFunction() );
55  
56          generateHeader();
57  
58          int indexOfLastDot = getOutClassName().lastIndexOf( '.' );
59          if( indexOfLastDot != -1 )
60          {
61              txt( "package " + getOutClassName().substring( 0, indexOfLastDot ) + ";" ); nl();
62              nl();
63          }
64  
65          if( node.getOptHeader() != null )
66          {
67              txt( "//-----------------------------------------------------------------------------" ); nl();
68              txt( "// tree header" ); nl();
69              txt( "${optHeader}" ); nl();
70              txt( "//-----------------------------------------------------------------------------" ); nl();
71              nl();
72          }
73          txt( "import ${name}.*;" ); nl();
74          nl();
75  
76          String outShortClassName = getOutClassName().substring( indexOfLastDot + 1 );
77  
78          txt( "public class " + outShortClassName + " implements " );
79          String[] implementedInterfaceList = getImplementedInterfaceList();
80          Object oldImplementedInterfaceList
81              = setVariable( "implementedInterfaceList", implementedInterfaceList );
82          list( "i", 0, implementedInterfaceList.length, "${.implementedInterfaceList[i]}", ", " ); nl();
83          setVariable( "implementedInterfaceList", oldImplementedInterfaceList );
84          block();
85          list( "i", 0, node.sizeOptMemberList(), "${optMemberList[i]}", null ); nl();
86          unblock_nl();
87      }
88  
89      public void visitNodeTypeDecl( NodeTypeDecl node )
90      {
91          if( node.isAbstract() ) return;
92          
93          nl();
94          txt( "public ${name} create${name}" );
95          int constructorParametersCount = 0;
96          for( int i = 0; i < node.sizeFullFieldList(); i++ )
97          {
98              Field field = node.getFullFieldList( i );
99  
100             if( TDL_Module.isConstructorParameter( field ) )
101             {
102                 pushNode( field );
103 
104                 nl();
105                 txtif( constructorParametersCount == 0, "(", "," );
106                 txt( " ${type} ${name}" );
107                 constructorParametersCount++;
108 
109                 popNode();
110             }
111         }
112 
113         switch( constructorParametersCount )
114         {
115         case 0:
116             txt( "()" );
117             break;
118         case 1:
119             txt( " )" );
120             break;
121         default:
122             nl();
123             txt( ")" );
124             break;
125         }
126         nl();
127         block_nl();
128         if( node.isAbstract() )
129         {
130             txt( "throw new UnsupportedOperationException( \"create${name}\" );"); nl();
131         } else {
132             txt( "return new ${name}" );
133             constructorParametersCount = 0;
134             for( int i = 0; i < node.sizeFullFieldList(); i++ )
135             {
136                 Field field = node.getFullFieldList( i );
137 
138                 if( TDL_Module.isConstructorParameter( field ) )
139                 {
140                     pushNode( field );
141 
142                     nl();
143                     txtif( constructorParametersCount == 0, "(", "," );
144                     txt( " ${name}" );
145                     constructorParametersCount++;
146 
147                     popNode();
148                 }
149             }
150 
151             switch( constructorParametersCount )
152             {
153             case 0:
154                 txt( "();" );
155                 break;
156             case 1:
157                 txt( " );" );
158                 break;
159             default:
160                 nl();
161                 txt( ");" );
162                 break;
163             }
164             nl();
165         }
166         unblock_nl();
167     }
168 }