1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22 #include <precomp.h>
23 #include "cmd_run.hxx"
24
25
26 // NOT FULLY DEFINED SERVICES
27 #include <cosv/file.hxx>
28 #include <cosv/x.hxx>
29 #include <ary/ary.hxx>
30 #include <ary/cpp/c_gate.hxx>
31 #include <ary/idl/i_ce.hxx>
32 #include <ary/idl/i_gate.hxx>
33 #include <ary/idl/i_module.hxx>
34 #include <ary/idl/ip_ce.hxx>
35 #include <autodoc/filecoli.hxx>
36 #include <autodoc/parsing.hxx>
37 #include <autodoc/prs_code.hxx>
38 #include <autodoc/prs_docu.hxx>
39 #include <parser/unoidl.hxx>
40 #include <adc_cl.hxx>
41 #include "adc_cmd_parse.hxx"
42 #include "adc_cmds.hxx"
43
44 namespace autodoc
45 {
46 namespace command
47 {
48 namespace run
49 {
50
Parser(const Parse & i_command)51 Parser::Parser( const Parse & i_command )
52 : rCommand(i_command),
53 pCppParser(),
54 pCppDocuInterpreter(),
55 pIdlParser()
56 {
57 }
58
~Parser()59 Parser::~Parser()
60 {
61 }
62
63 bool
Perform()64 Parser::Perform()
65 {
66 Cout() << "Parsing the repository "
67 << rCommand.ReposyName()
68 << " ..."
69 << Endl();
70 try
71 {
72 ::ary::Repository &
73 rAry = CommandLine::Get_().TheRepository();
74 rAry.Set_Title(rCommand.ReposyName());
75
76 Dyn< FileCollector_Ifc >
77 pFiles( ParseToolsFactory().Create_FileCollector(6000) );
78
79 bool bIDL = false;
80 bool bCpp = false;
81
82 command::Parse::ProjectIterator
83 itEnd = rCommand.ProjectsEnd();
84 for ( command::Parse::ProjectIterator it = rCommand.ProjectsBegin();
85 it != itEnd;
86 ++it )
87 {
88 uintt nCount = GatherFiles( *pFiles, *(*it) );
89 Cout() << nCount
90 << " files found to parse in project "
91 << (*it)->Name()
92 << "."
93 << Endl();
94
95 switch ( (*it)->Language().eLanguage )
96 {
97 case command::S_LanguageInfo::idl:
98 {
99 Get_IdlParser().Run(*pFiles);
100 bIDL = true;
101 } break;
102 case command::S_LanguageInfo::cpp:
103 {
104 Get_CppParser().Run( *pFiles );
105 bCpp = true;
106 } break;
107 default:
108 Cerr() << "Project in yet unimplemented language skipped."
109 << Endl();
110 }
111 } // end for
112
113 if (bCpp)
114 {
115 rAry.Gate_Cpp().Calculate_AllSecondaryInformation();
116 }
117 if (bIDL)
118 {
119 rAry.Gate_Idl().Calculate_AllSecondaryInformation(
120 rCommand.DevelopersManual_RefFilePath() );
121
122 // ::ary::idl::SecondariesPilot &
123 // rIdl2sPilot = rAry.Gate_Idl().Secondaries();
124 //
125 // rIdl2sPilot.CheckAllInterfaceBases( rAry.Gate_Idl() );
126 // rIdl2sPilot.Connect_Types2Ces();
127 // rIdl2sPilot.Gather_CrossReferences();
128 //
129 // if (NOT rCommand.DevelopersManual_RefFilePath().empty())
130 // {
131 // csv::File
132 // aFile(rCommand.DevelopersManual_RefFilePath(), csv::CFM_READ);
133 // if ( aFile.open() )
134 // {
135 // rIdl2sPilot.Read_Links2DevManual(aFile);
136 // aFile.close();
137 // }
138 // }
139 } // endif (bIDL)
140
141 return true;
142
143 } // end try
144 catch (csv::Exception & xx)
145 {
146 xx.GetInfo(Cerr());
147 Cerr() << " program will exit." << Endl();
148
149 return false;
150 }
151 }
152
153 CodeParser_Ifc &
Get_CppParser()154 Parser::Get_CppParser()
155 {
156 if ( NOT pCppParser )
157 Create_CppParser();
158 return *pCppParser;
159 }
160
161 IdlParser &
Get_IdlParser()162 Parser::Get_IdlParser()
163 {
164 if ( NOT pIdlParser )
165 Create_IdlParser();
166 return *pIdlParser;
167 }
168
169 void
Create_CppParser()170 Parser::Create_CppParser()
171 {
172 pCppParser = ParseToolsFactory().Create_Parser_Cplusplus();
173 pCppDocuInterpreter = ParseToolsFactory().Create_DocuParser_AutodocStyle();
174
175 pCppParser->Setup( CommandLine::Get_().TheRepository(),
176 *pCppDocuInterpreter );
177 }
178
179 void
Create_IdlParser()180 Parser::Create_IdlParser()
181 {
182 pIdlParser = new IdlParser(CommandLine::Get_().TheRepository());
183 }
184
185 const ParseToolsFactory_Ifc &
ParseToolsFactory()186 Parser::ParseToolsFactory()
187 {
188 return ParseToolsFactory_Ifc::GetIt_();
189 }
190
191 uintt
GatherFiles(FileCollector_Ifc & o_rFiles,const S_ProjectData & i_rProject)192 Parser::GatherFiles( FileCollector_Ifc & o_rFiles,
193 const S_ProjectData & i_rProject )
194 {
195 uintt ret = 0;
196 o_rFiles.EraseAll();
197
198 typedef StringVector StrVector;
199 typedef StrVector::const_iterator StrIterator;
200 const S_Sources &
201 rSources = i_rProject.Sources();
202 const StrVector &
203 rExtensions = i_rProject.Language().aExtensions;
204
205 StrIterator it;
206 StrIterator itTreesEnd = rSources.aTrees.end();
207 StrIterator itDirsEnd = rSources.aDirectories.end();
208 StrIterator itFilesEnd = rSources.aFiles.end();
209 StrIterator itExt;
210 StrIterator itExtEnd = rExtensions.end();
211
212 csv::StreamStr aDir(500);
213 i_rProject.RootDirectory().Get( aDir );
214
215 uintt nProjectDir_AddPosition =
216 ( strcmp(aDir.c_str(),".\\") == 0 OR strcmp(aDir.c_str(),"./") == 0 )
217 ? 0
218 : uintt( aDir.tellp() );
219
220 for ( it = rSources.aDirectories.begin();
221 it != itDirsEnd;
222 ++it )
223 {
224 aDir.seekp( nProjectDir_AddPosition );
225 aDir << *it;
226
227 for ( itExt = rExtensions.begin();
228 itExt != itExtEnd;
229 ++itExt )
230 {
231 ret += o_rFiles.AddFilesFrom( aDir.c_str(),
232 *itExt,
233 FileCollector_Ifc::flat );
234 } // end for itExt
235 } // end for it
236 for ( it = rSources.aTrees.begin();
237 it != itTreesEnd;
238 ++it )
239 {
240 aDir.seekp( nProjectDir_AddPosition );
241 aDir << *it;
242
243 for ( itExt = rExtensions.begin();
244 itExt != itExtEnd;
245 ++itExt )
246 {
247 ret += o_rFiles.AddFilesFrom( aDir.c_str(),
248 *itExt,
249 FileCollector_Ifc::recursive );
250 } // end for itExt
251 } // end for it
252 for ( it = rSources.aFiles.begin();
253 it != itFilesEnd;
254 ++it )
255 {
256 aDir.seekp( nProjectDir_AddPosition );
257 aDir << *it;
258
259 o_rFiles.AddFile( aDir.c_str() );
260 } // end for it
261 ret += rSources.aFiles.size();
262
263 return ret;
264 }
265
266
267 } // namespace run
268 } // namespace command
269
270
271 #if 0
272 inline const ParseToolsFactory_Ifc &
273 CommandRunner::ParseToolsFactory()
274 { return ParseToolsFactory_Ifc::GetIt_(); }
275
276
277 inline const command::S_LanguageInfo &
278 CommandRunner::Get_ProjectLanguage( const command::Parse & i_rCommand,
279 const command::S_ProjectData & i_rProject )
280 {
281 if ( i_rProject.pLanguage )
282 return *i_rProject.pLanguage;
283 return *i_rCommand.GlobalLanguageInfo();
284 }
285
286 inline bool
287 CommandRunner::HasParsedCpp() const
288 { return pCppParser; }
289 inline bool
290 CommandRunner::HasParsedIdl() const
291 { return pIdlParser; }
292
293
294
295
296
297 CommandRunner::CommandRunner()
298 : pCommandLine(0),
299 pReposy(0),
300 pNewReposy(0),
301 nResultCode(0)
302 {
303 Cout() << "\nAutodoc version 2.2.1"
304 << "\n-------------------"
305 << "\n" << Endl();
306 }
307
308 CommandRunner::~CommandRunner()
309 {
310 ary::Repository::Destroy_();
311 Cout() << "\n" << Endl();
312 }
313
314 void
315 CommandRunner::Run( const CommandLine & i_rCL )
316 {
317 ary::Repository::Destroy_();
318 // ary::Repository::Destroy_();
319 pReposy = 0;
320 pNewReposy = 0;
321 nResultCode = 0;
322 pCommandLine = &i_rCL;
323
324 pCommandLine->Run();
325 }
326
327 void
328 CommandRunner::Parse()
329 {
330 try
331 {
332
333 csv_assert( pCommandLine->Cmd_Parse() != 0 );
334 const command::Parse &
335 rCmd = *pCommandLine->Cmd_Parse();
336
337 Cout() << "Parsing the repository "
338 << rCmd.ReposyName()
339 << " ..."
340 << Endl();
341
342 if ( pReposy == 0 )
343 pReposy = & ary::Repository::Create_( rCmd.ReposyName(), 0 );
344 if ( pNewReposy == 0 )
345 pNewReposy = & ary::Repository::Create_( rCmd.ReposyName() );
346
347 Dyn< FileCollector_Ifc > pFiles;
348 pFiles = ParseToolsFactory().Create_FileCollector(6000);
349
350 bool bCpp = false;
351 bool bIDL = false;
352
353 command::Parse::ProjectIterator itEnd = rCmd.ProjectsEnd();
354 for ( command::Parse::ProjectIterator it = rCmd.ProjectsBegin();
355 it != itEnd;
356 ++it )
357 {
358
359 uintt nCount = GatherFiles( *pFiles, rCmd, *(*it) );
360 Cout() << nCount
361 << " files found to parse in project "
362 << (*it)->Name()
363 << "."
364 << Endl();
365
366
367 switch ( Get_ProjectLanguage(rCmd, *(*it)).eLanguage )
368 {
369 case command::S_LanguageInfo::cpp:
370 {
371 Get_CppParser().Run( (*it)->Name(),
372 (*it)->RootDirectory(),
373 *pFiles );
374 bCpp = true;
375 } break;
376 case command::S_LanguageInfo::idl:
377 {
378 Get_IdlParser().Run(*pFiles);
379 bIDL = true;
380 } break;
381 default:
382 Cerr() << "Project in yet unimplemented language skipped."
383 << Endl();
384 }
385 } // end for
386
387 if (bCpp)
388 pReposy->RwGate_Cpp().Connect_AllTypes_2_TheirRelated_CodeEntites();
389 if (bIDL)
390 {
391 pNewReposy->Gate_Idl().Secondaries().Connect_Types2Ces();
392 pNewReposy->Gate_Idl().Secondaries().Gather_CrossReferences();
393 }
394
395 } // end try
396 catch (csv::Exception & xx)
397 {
398 xx.GetInfo(Cerr());
399 Cerr() << " program will exit." << Endl();
400 nResultCode = 1;
401 }
402 catch (...)
403 {
404 Cerr() << "Unknown exception - program will exit." << Endl();
405 nResultCode = 1;
406 }
407 }
408
409 void
410 CommandRunner::Load()
411 {
412 Cout() << "This would load the repository from the directory "
413 << pCommandLine->Cmd_Load()->ReposyDir()
414 << "."
415 << Endl();
416 }
417
418
419 void
420 CommandRunner::Save()
421 {
422 Cout() << "This would save the repository into the directory "
423 << pCommandLine->Cmd_Save()->ReposyDir()
424 << "."
425 << Endl();
426 }
427
428
429 void
430 CommandRunner::CreateHtml()
431 {
432 Cout() << "Creating HTML-output into the directory "
433 << pCommandLine->Cmd_CreateHtml()->OutputDir()
434 << "."
435 << Endl();
436
437 if ( HasParsedCpp() )
438 CreateHtml_NewStyle();
439 if ( HasParsedIdl() )
440 CreateHtml_OldIdlStyle();
441 }
442
443
444
445 void
446 CommandRunner::CreateXml()
447 {
448 Cout() << "This would create the XML-output into the directory "
449 << pCommandLine->Cmd_CreateXml()->OutputDir()
450 << "."
451 << Endl();
452 }
453
454 CodeParser_Ifc &
455 CommandRunner::Get_CppParser()
456 {
457 if ( NOT pCppParser )
458 Create_CppParser();
459 return *pCppParser;
460 }
461
462 IdlParser &
463 CommandRunner::Get_IdlParser()
464 {
465 if ( NOT pIdlParser )
466 Create_IdlParser();
467 return *pIdlParser;
468 }
469
470 void
471 CommandRunner::Create_CppParser()
472 {
473 pCppParser = ParseToolsFactory().Create_Parser_Cplusplus();
474 pCppDocuInterpreter = ParseToolsFactory().Create_DocuParser_AutodocStyle();
475
476 pCppParser->Setup( *pReposy,
477 *pCppDocuInterpreter );
478 }
479
480 void
481 CommandRunner::Create_IdlParser()
482 {
483 pIdlParser = new IdlParser(*pNewReposy);
484 }
485
486 uintt
487 CommandRunner::GatherFiles( FileCollector_Ifc & o_rFiles,
488 const command::Parse & i_rCommand,
489 const command::S_ProjectData & i_rProject )
490 {
491 uintt ret = 0;
492 o_rFiles.EraseAll();
493
494 typedef StringVector StrVector;
495 typedef StrVector::const_iterator StrIterator;
496 const command::S_Sources &
497 rSources = i_rProject.aFiles;
498 const StrVector &
499 rExtensions = Get_ProjectLanguage(i_rCommand,i_rProject).aExtensions;
500
501 StrIterator it;
502 StrIterator itDirsEnd = rSources.aDirectories.end();
503 StrIterator itTreesEnd = i_rProject.aFiles.aTrees.end();
504 StrIterator itFilesEnd = i_rProject.aFiles.aFiles.end();
505 StrIterator itExt;
506 StrIterator itExtEnd = rExtensions.end();
507
508 csv::StreamStr aDir(500);
509 i_rProject.aRootDirectory.Get( aDir );
510
511 uintt nProjectDir_AddPosition =
512 ( strcmp(aDir.c_str(),".\\") == 0 OR strcmp(aDir.c_str(),"./") == 0 )
513 ? 0
514 : uintt( aDir.tellp() );
515
516 for ( it = rSources.aDirectories.begin();
517 it != itDirsEnd;
518 ++it )
519 {
520 aDir.seekp( nProjectDir_AddPosition );
521 aDir << *it;
522
523 for ( itExt = rExtensions.begin();
524 itExt != itExtEnd;
525 ++itExt )
526 {
527 ret += o_rFiles.AddFilesFrom( aDir.c_str(),
528 *itExt,
529 FileCollector_Ifc::flat );
530 } // end for itExt
531 } // end for it
532 for ( it = rSources.aTrees.begin();
533 it != itTreesEnd;
534 ++it )
535 {
536 aDir.seekp( nProjectDir_AddPosition );
537 aDir << *it;
538
539 for ( itExt = rExtensions.begin();
540 itExt != itExtEnd;
541 ++itExt )
542 {
543 ret += o_rFiles.AddFilesFrom( aDir.c_str(),
544 *itExt,
545 FileCollector_Ifc::recursive );
546 } // end for itExt
547 } // end for it
548 for ( it = rSources.aFiles.begin();
549 it != itFilesEnd;
550 ++it )
551 {
552 aDir.seekp( nProjectDir_AddPosition );
553 aDir << *it;
554
555 o_rFiles.AddFile( aDir.c_str() );
556 } // end for it
557 ret += rSources.aFiles.size();
558
559 return ret;
560 }
561
562 void
563 CommandRunner::CreateHtml_NewStyle()
564 {
565 const ary::cpp::DisplayGate &
566 rGate = pReposy->DisplayGate_Cpp();
567
568 Dyn< autodoc::HtmlDisplay_UdkStd > pHtmlDisplay;
569 pHtmlDisplay = DisplayToolsFactory_Ifc::GetIt_()
570 .Create_HtmlDisplay_UdkStd();
571
572 pHtmlDisplay->Run( pCommandLine->Cmd_CreateHtml()->OutputDir(),
573 rGate,
574 DisplayToolsFactory_Ifc::GetIt_().Create_StdFrame() );
575 }
576
577 void
578 CommandRunner::CreateHtml_OldIdlStyle()
579 {
580 ary::idl::Gate &
581 rAryGate = pNewReposy->Gate_Idl();
582
583 // Read DevManualLinkFile:
584 // KORR_FUTURE
585 csv::File
586 aFile("devmanref.txt", csv::CFM_READ);
587 if ( aFile.open() )
588 {
589 rAryGate.Secondaries().Read_Links2DevManual(aFile);
590 aFile.close();
591 }
592
593 // New Style Output
594 Dyn<autodoc::HtmlDisplay_Idl_Ifc> pNewDisplay;
595 pNewDisplay = DisplayToolsFactory_Ifc::GetIt_()
596 .Create_HtmlDisplay_Idl();
597 pNewDisplay->Run( pCommandLine->Cmd_CreateHtml()->OutputDir(),
598 rAryGate,
599 DisplayToolsFactory_Ifc::GetIt_().Create_StdFrame() );
600 }
601 #endif // 0
602
603 } // namespace autodoc
604
605
606
607
608