Dexels / navajo

Navajo Service-oriented Applications
GNU Affero General Public License v3.0
9 stars 5 forks source link

Use annotation in Java classes to use them as adapters or functions from within Navascript #615

Open aschoneveld opened 2 years ago

aschoneveld commented 2 years ago

Currently you need to edit an XML file in order to use java classes as adapters.

For example the following Java class:

public class Adder {
     public int operandA;
     public int operandB;
     public int result;
     public String operator = "+";
     public boolean flag;
     public ComplexField complexField;
     public ComplexField [] complexArrayField;

     public void setCalculate(boolean b) {
          if ( "+".equals(operator) ( {
             result = operandA + operandB;
          } else if ("-".equals(operator) ) {
             result = operandA - operandB;
          }
     }
}

If you want to use this class, in a convenient way from Navascript you have to add the following XML:

<map>
        <tagname>adder</tagname>
        <object>Adder</object>
        <methods>
            <method name="plus">
                <param name="left" field="operandA" type="integer" required="true" />
                <param name="right" field="operandB" type="integer" required="true" />
                <param name="value" field="calculate" type="boolean" required="automatic" value="true" />
            </method>
                </methods>
</map>

With annotations this could be circumvented. Something like this:

@NavajoAdapter(map='adder')
public class Adder {
     public int operandA;
     public int operandB;
     public int result;
     public String operator = "+";
     public boolean flag;
     public ComplexField complexField;
     public ComplexField [] complexArrayField;

     @NavajoMethod(name='plus')   // This assumes that this "setter" is called last as param with required='automatic'
     @MethodParam(name='left',field='operandA',required=true)
     @MethodParam(name='right',field='operandB',required=true)
     public void setCalculate(boolean b) {
          if ( "+".equals(operator) ( {
             result = operandA + operandB;
          } else if ("-".equals(operator) ) {
             result = operandA - operandB;
          }
     }
}

This would allow to use this 'adapter' in a NS3 script as follows:

map.adder {
   .plus(left=4,right=2);
   message "Result" {
      property "Answer" = $result;
   }
}
aschoneveld commented 2 years ago

@roelofkemp @kharybdys @gballintijn : wat denken jullie van bovenstaande idee?

kharybdys commented 2 years ago

Ik roep al een poos dat het makkelijker moet worden om Adapters en Functions toe te voegen en een belangrijk onderdeel daarvan, in mijn ogen, is het verwijderen van alle ballast mbt discovery mechanisme, dus zeker de XML (die al over meerdere plekken verspreid staat anyways), en bij voorkeur ook de verplichting tot het subclassen van ExtensionDefinition. Hoe dat precies gebeurt is minder belangrijk maar annotaties zijn wel de eerst logische oplossing lijkt mij. En het is voor mij helemaal akkoord om het alleen binnen NS3 te laten werken (en backwards compatibility te schrappen)

kharybdys commented 2 years ago

Ik zat nog te bedenken dat als we inderdaad iets met annotations gaan doen, het mij logisch lijkt dat methodes en klassevariabelen die NIET geannoteerd zijn dan dus ook niet benaderbaar zijn vanuit webservices.