Possible to generate links inside doxygen startuml/enduml section? - doxygen

I have PlantUML configured to run from doxygen, and it is able to generate a simple diagram with a single class:
\startuml
class MyClass
\enduml
If I modify this to add a link to a url, clicking on the class in the UML works fine:
\startuml
class MyClass [[https://www.google.com]]
\enduml
I'd like have doxygen generate links so that clicking on the UML graph nodes takes the user to the documentation for the class, but clicking on MyClass in the following navigates me to \link:
\startuml
class MyClass [[\link MyClass]]
\enduml
I'd guess this is because the \startuml ... \enduml block is sent to PlantUML without being parsed by doxygen. Is there any way to make link generation work in this case?
If I remember correctly, \link and \ref were resolved inside \dot ... \enddot on a project I worked on years ago, and I'm wondering if there's a reason why this couldn't work inside \startuml ... \enduml as well.

Doxygen does not interpret the input between the \startuml and \enduml tag, so it is, currently, not possible.
The fact that a https address works is due to the fact that it is handled by plantuml directly.

Related

Enterprise Architect Code Generation: Get tags of interface

I use Enterprise Architect for code generation and I would like to automatically retrieve all tags (in my case Java annotations) of the interfaces that a class realizes. Consider the following example:
From this model, I want to generate a class that looks like this:
#AnnotationOfMyInterface
public class MyClass {
...
}
So I want to add annotations as tags to MyInterface that should be applied to MyClass during code generation. In the UI, tags of implemented interfaces are shown so I was hoping there is a way to get these tags during code generation.
I tried to edit the code generation templates and found macros to get
All interfaces that a class implements: %list="ClassInterface" #separator=", "%
All tags with a given name (of the class that code is being generated for): %classTag:"annotations"%
But unfortunately, I cannot combine these macros, i.e., I cannot pass one interface to the classTag macro so that I can retrieve the tags of that particular interface (and not the one I'm generating code for). Is there a way to get classTags of a specific class / interface?
I also tried to create a separate code generation template and "call" it from the main class code generation template. But inside my template, the classTag macro still only gets the tags of the class.
Thanks to the comments above and especially because of an answer to my question in EA's forum, I was able to setup a little proof of concept achieving what I wanted. I'm answering my question to document my solution in case someone has a similar problem in the future.
After Eve's hint in EA's forum I looked into creating an AddIn for Enterprise Architect to use this AddIn from a code generation template. I started by writing a basic AddIn as explained by #Geert Bellekens in this tutorial. Afterwards I changed the AddIn to fit my needs. This is how I finally got the tagged values (annotations) of the interfaces a class realizes:
First step:
Inside a code generation template, I get all the interfaces a class realizes and pass them to my AddIn:
$interfaces=%list="ClassInterface" #separator=", "%
%EXEC_ADD_IN("MyAddin","getInterfaceTags", $interfaces)%
Second step:
As documented here the repository objects gets passed along with the EXEC_ADD_IN call. I use the repository object and query for all interfaces using the names contained in $interfaces. I can then get the tagged values of each interface element. Simple prototype that achieves this for a single interface:
public Object getInterfaceTags(EA.Repository repo, Object args)
{
String[] interfaceNames = args as String[];
String firstInterfaceName = interfaceNames[0];
EA.Element interfaceElement = repo.GetElementsByQuery("Simple", firstInterfaceName).GetAt(0);
String tag = interfaceElement.TaggedValues.GetAt(0);
return interfaceElement.Name + " has tag value" + tag.Value;
}
I know, there are a couple of shortcomings but this is just a simple proof of concept for an idea that will most likely never be production code.

Create information tooltip about your own methods and classes

My question is very simple. How can you create your own tooltip information for your own created methods and classes, the way all methods and classes of the standard library of java have, when you are writing code and choosing methods and subclasses?!
For example, let's say I have a Class A, in which I have a Method B. Now I define a new instance of Class A in another Class C by writing "A my_class = new A()". Now when I write "my_class.B" I want the Eclipse to show me the information about the Method B in a tooltip, so I know what are the parameters I have to pass to that method B.
Here is a picture example:
http://www.subshell.com/en/subshell/blog/eclipse-javadoc-tooltips100~v-full_small.jpg
I searched a while, but I didn't find any solutions for that. So maybe you know how to do that!
In eclipse, once you add the javadoc comment to your method, it will show up wherever you refer to that method. The Javadoc comment takes the form
/**
* This is my method description
* #param x the total number of mangoes allowed
* #return int the number of litres of juice possible
*/
Javadoc comments are placed just before the artifact that it describes. So a method comment will go on the line before the method, a class comment goes on the line before the class statement and so on.

Issue with extending class in TYPO3

I saw some extension files which are in TYPO3 4.5. (class.tx_ajaxsearch_pi1.php...), looks like this way:
class tx_ajaxsearch_pi1 extends tslib_pibase {
...
if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/ajax_search/pi1/class.tx_ajaxsearch_pi1.php']) {
include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/ajax_search/pi1/class.tx_ajaxsearch_pi1.php']);
}
I am checking this document about XCLASS: http://typo3.org/documentation/document-library/core-documentation/doc_core_api/4.1.0/view/3/8/
Questions:
According to this document: http://typo3.org/documentation/document-library/core-documentation/doc_core_api/4.1.0/view/3/8/
Extending TYPO3s PHP classes is recommended mostly for special needs in individual projects. This is due to the limitation that a class can only be extended once. Thus, if many extensions try to extend the same class, only one of them will succeed and in turn the others will not function correctly.
But why class tslib_pibase can be extended many times by different extension classes?
Is it a good habit to put below codes in every extension scripts? Just in case the extension class needs to be extended in the future?
if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/ajax_search/pi1/class.tx_ajaxsearch_pi1.php']) {
include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/ajax_search/pi1/class.tx_ajaxsearch_pi1.php']);
XCLASS'ing is an approach, when someone substitutes one class with another one. Sounds like inheritance in OOP, but in fact it is different, because you can XCLASS only once, since in TYPO3 global scope one class definition is substituted with another one.
So, i.e. you XCLASS t3lib_db with ux_t3lib_db - that means, taht t3lib_db will never be used in DB processing, but ux_t3lib_db
Sure, your XCLASS can extend the base class, like ux_t3lib_db extends t3lib_db, so it works with inheritance of OOP, but if someone else would like to XCLASS t3lib_db too this will fail simply because TYPO3 will not find t3lib_db in it's scope, because it is already substituted with ux_t3lib_db. So, the only winner will be the one, who XCLASS'ed first.
You can read more here.
But, general note is, that XCLASS'ing is the last option you should try. Use hooks or signals/slots (last works in ExtBase only).
Answering your second question, I can say, that yes, you can do this in 4.5, but no - you shouldn't do that from 6.0.

Having difficulties extending Zend_Form

Currently I have big difficulties extending Zend_Form.
I have the basic class called Forms_LpaManageEmailForm.
It is used separately and works fine.
Next I've created a new class form
called Default_Form_CartReport witch extends Forms_LpaManageEmailForm.
So the task is to render Default_Form_CartReport and slitely modificate it.
In other words I need all functionality of
Forms_LpaManageEmailForm class but with overriden _addMultiOptionsForMultiSelect() function
(what is done) and changed button label (doesn't solved).
In basic class I have hidden element named id which value is filled with
$this->_entry_id['entry_id']. When I use basic form separately - its woks fine. But
when I run extended form(Forms_LpaManageEmailForm) I see that hidden id element's value is empty. In basic class in construct section I run
Zend debugger(with this line Zend_Debug::dump($this->_entry_id['entry_id'])) to see if the
value is passed. And it's passed :) When I repeat this in init() section it shows NULL...
As I barely understand - the problem lays in init() functions, in the way it is called.
I think something is wrong with Default_Form_CartReport class skeleton.
I've uploaded code to: PASTEBIN
Really need help in this question.
Thank you!
I believe your issues are causing my the fact that Forms_LpaManageEmailForm:: __construct is calling $this->init() directly. if you open the Zend_Form, you will notice that the __construct is also calling the $this->init() function. This cause your init() function to executed twice.
Try to load all your logic & elements solely in the __construct function, and don't use the init() function. also, the __construct function in each form class should always call the parent::__construct before any additional logic.

Reference class in browser friendly and node.js friendly way

I've got the following code at the top of my CoffeeScript
program to reference a BinaryNode class from a BinaryTree
class.
Since I want to be able to use the BinaryTree class from
a node.js program or from the browser I have the following
if/else statement to reference the BinaryNode.
file: BinaryTree.coffee
isNodeJs = exports?
if isNodeJs
{BinaryNode} = require('./binary_node')
else
BinaryNode = window.BinaryNode
class BinaryTree
(code for BinaryTree goes here)
Somehow this if/else bugs me specially if I will need to
add it on a lot of different classes that make up the
program.
Are there any other better ways to perform this check?
(From my comment above)
The branching can be shortened to:
{BinaryNode} = require?("/.binary_node") or window
(provided you don't have a global require function somewhere in your browser code, of course)