You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by "Marc DeXeT (JIRA)" <co...@jakarta.apache.org> on 2005/01/11 19:11:13 UTC

[jira] Updated: (JELLY-195) Janino compiler tag library

     [ http://issues.apache.org/jira/browse/JELLY-195?page=history ]

Marc DeXeT updated JELLY-195:
-----------------------------

    Attachment: janino-0.0.zip

Source and unit tests.
You can get janino library at http://www.janino.net/download/janino-2.2.0.zip
IMPORTANT : note you need BeanUtils version 1.7.0 or upper !!

> Janino compiler tag library
> ---------------------------
>
>          Key: JELLY-195
>          URL: http://issues.apache.org/jira/browse/JELLY-195
>      Project: jelly
>         Type: New Feature
>   Components: submissions
>     Versions: 1.0
>     Reporter: Marc DeXeT
>  Attachments: janino-0.0.zip
>
> Janino is a pretty embedded compiler for run-time compilation purposes designed by Arno Unkrig under Apache License (<http://www.janino.net>).
> It can be a very usefull tool to create java function, entry point (main), class and package on run time.
> I would submit to jelly people a new jelly-tag library overview before getting in sandbox processus. This library implements janino compiler in jelly way.
> Janino jelly-tag library implements compilation, class body and scriptlet like janino evaluator.
> A - compilation
> For exemple you can define classes like :
> <compile var="janinoClassLoader">
> <!-- java source code -->
>   public class Item {
>     private String name;
>     private double price;
>     			
>     public void setName(String str) { this.name = str; }
>     public String getName() { return this.name; }    			
>     public void setPrice(double p) { 
>            if ( p &gt; 0 ) {
>                 this.price = p; 
>            }
>     public double getPrice() {return this.price; }
> }
> </compile>
> <j:new classLoader="${cl}" className="foo.test.Customer" var="customer"/>
> <j:set target="${customer}" property="name" value="Charles"/>
> B - ClassBody -
> <classBody var="clazz">
>  import java.util.*;
> 		
>  static private int a = 1;
>  private int b = 2;
> 		
>  public int func(int c, int d) { return func2(c, d); }
>  private static int func2(int e, int f) {
> 		       return e * f;
>  }   
> </classBody>
>     	
> <j:useBean class="${clazz}" var="b"/>
> <j:set var="result" value="${b.func(2,3)}"/>
> C - scriptlet 
> <script var="script" result="s" returnType="java.util.ArrayList" execute="true">
>  <!-- define expected parameters -->
>  <parameter name="a" type="java.lang.String"/>
>  <parameter name="b" type="java.util.ArrayList"/>    		
>     		
>  <!-- pass argument reference -->
>  <j:arg value="foo"/>
>  <j:arg value="${l}"/>
>     		
>  <!-- java scrip itself -->
>  import java.util.ArrayList;
>  ArrayList list = new ArrayList();
>  list.add(a);
>  list.add(b);    		
>  return list;
> </script>
> <evaluate script="${script}" result="myList">
>   <j:arg value="item0"/>
>   <j:arg value="item1"/>
> </evaluate>
> <j:forEach var="item" items=="${mylist}">...
> D - compilation support - 
> A light compilation log writer help you to get through compilation error
> Exemple :
> 11 janv. 2005 18:21:51 org.apache.commons.jelly.janino.JaninoHelper throwDocumentedExcpetion
> GRAVE: 0001:import java.util.fooArrayList;
> 0002:ArrayList list = new ArrayList();
> ---------------------^
> Line 2, Column 17: Expression "ArrayList" is not a type
> 0003:list.add(a);
> 0004:list.add(b);
> 0005:return list;
> E - Xml customizable bean definition - 
> A lot of jelly-tag library can do a lot for bean definition.
> In janino tag library, high customizable run time bean definition is a included :
> Exemples :
>     	<compile var="cl" mapName="classes" packageName="foo.test">
>     		<class name="Human">
>     			<property name="name"/>
>     			<property name="age" type="int"/>
>     		</class>    		
>     		<class name="Customer" extends="Human">
>     			<property name="society"/>
>     		</class>
>     	</compile>
> generate simple beans.
> But you can go further :
> <classBody var="Person">
>  <property name="name"/>
>  <property name="forname"/>
>  <property name="prefix"/>
>  <property name="sex" setter="true" declaration="true">
>    if ( string.equals("female") ) { 
>      this.prefix = "Ms";
>    } else {
>      this.prefix = "Mr";
>    }
>   </property>
>   <property name="sex" getter="true"/>
>   
>   <property name="clothing" getter="true" override="true" declaration="true">
>     if ( this.prefix.equals("Ms") ) {
>       return "wedding gown";
>     } else {
>       return "smoking";
>     }				
>   </property>
> </classBody>
> <j:useBean class ="${Person}" var="jane" name="Doo" forname="Jane" sex="female"/>
> <j:useBean class ="${Person}" var="john" name="Doo" forname="John" sex="male"/>
> <j:file var="gossip">
>   ${john.prefix} ${john.forname} ${john.name} dressed in ${john.clothing} and 
>   ${jane.prefix} ${jane.forname} ${jane.name} in ${jane.clothing} have enlighted this party !
> </j:file>
> F - of course you can use <compile> to load java class from a source file 
> <compile var="cl" uri="./mySources.txt"/>
> As I have said, this library is for jelly people interest evaluation. It's rather an alpha library, but I think it can be a great feature for more supple jelly scripting.
> Thank for your time.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org