Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

VJET/JSRReference

< VJET
Revision as of 01:44, 12 December 2012 by Bimalshah72.gmail.com (Talk | contribs) (Multiple Optional Arguments:)

Purpose

The purpose is the document how the VJET JS or Java to JS is transformed into a Java API using a reference based programming model.

What is a JSR

A JSR (JavaScript Reference) is a Java type that serves as a reference to the following types:

  • VJET JavaScript Authored in multiple languages
    • JavaScript language
    • Java language
  • Native Types
    • JavaScript Native Types
    • DOM types

Java APIs to Access JavaScript

JSR provides access to JavaScript and provides Java APIs for public

  • Functions
  • Methods
  • Properties
  • Function References
  • Type References

Java code can access JavaScript references using Java. JavaScript developers can develop a definition neutral JavaScript Reference API. Developers can choose to use JavaScript authored in JavaScript language or in the Java language. JSRs are part of a larger technology set, V4, which supports the development of web pages and applications using Java.


Resource Access

JSRs provide a resource reference for any JavaScript resource backing the type. This is used for ensuring that when executing the JavaScript that all the definitions have loaded in the runtime. Resource Specs can be added to view specs. Please see the V4 resource pattern documentation for more information.


APIs Public Access Required

Methods, nested classes, and properties that are public will have generated JSR apis. All others will not be generated in JSR.


JSR Creation Options

VJET JS to JSR

VJET JS to Jsr is the entry point for JavaScript developers to work with Java developers. The JSR generated from the VJET JS source file is not meant to be edited by hand. The name of a JSR is composed of the name of the type it represents, appended with ‘Jsr’. For example, VJET JavaScript type named MyClass (.js) will generate a JSR named MyClassJsr.java. Generated java files should always be generated and never checked into source control. To handle this case the generated JSR contains a Java 5 annotation: @com.ebay.dsf.resource.utils.CodeGen("JsrGenerator")


There are 3 ways this can be done:

  1. Eclipse plugin – right click V4-> Js reference generation -
  2. Java main program - com.ebay.dsf.jstojava.codegen.JsToJavaGen
  3. ANT task - com.ebay.dsf.jstojava.prebuild.JsLibPreBuildTask

Note for eBay this task has been integrated into the Build3 and Build2 systems.


VJET Java to JSR

JSRs can also be generated from Java files. This provides the capability for JavaScript code to be authored in Java or JavaScript code without having consumer change their code if the signature doesn't change. The JSR generated from the Java source file is not meant to be edited by hand. The name of a JSR is composed of the name of the Java type it represents, appended with ‘Jsr’. For example, Java type named MyClass.java will generate a JSR named MyClassJsr.java. Generated java files should always be generated and never checked into source control. To handle this case the generated JSR contains a Java 5 annotation: @com.ebay.dsf.resource.utils.CodeGen("JsrGenerator")


There are 3 ways this can be done:

  1. Eclipse plug-in – right click V4-> Java 2 Js Generation
  2. Java main program - com.ebay.dsf.javatojs.cli.Java2Vjo
  3. ANT task - com.ebay.dsf.javatojs.prebuild.J2JsBuildTask

Hand coded Jsr

JSRs can also be generated by hand. For example if the original api authored by the JavaScript developer doesn't handle a specific case such as using a JavaScript type or DOM type but there is a more appropriate Java type that should be used a custom Jsr can be created.

When to not use Jsr

JSRs should not be used when writing JavaScript definitions using Java. Native java proxies should be used when trying to access native JavaScript code from a Java 2 Js definition.


VJET Types map to Jsr generated types

A JSR definition preserves all aspects of the original type definition, including inheritance, interface implementations, and dependencies. For example, if a JavaScript definition inherits from another type, the JSR will extend from the super class; if a JavaScript definition implements an interface, the JSR will specify the implemented interface. Please refer to the Appendix Xxx for more information.


Below is the list of fundamental VJO types that are supported.


Java Related types

  1. CType - a java class extending JsObj is generated
  2. IType – a java interface is generated
  3. EType – a java class extending JsEnum is generated
  4. Static Inner Type – a nested java class will be created for each public nested class.
  5. Instance Inner Type
  6. Anonymous Type

Js Types with no equivalent Java type

  1. MType – a java class is generated since java doesn't support mixin natively. This type answers to let you know it isMixin and provides access to resource backing mixin.
  2. OType – a java class with nested java classes is generated.

Js Functions

The following diagram shows the relationships for the Java Script Reference model for JavaScript Functions,

Vjet jsrreference jsfunction.png

Functions with No Arguments

If a method takes no arguments, a single function reference is generated. The reference preserves all modifier information from the original definition, in this case, a void return type, and public access.


JS code JSR Java API
 //> public void warn();
 
warn:function(){}
public JsFunc<Void> warn() {}
Java authored Js code
public void warn(){}

Functions with arguments

If a method takes one or more arguments, two function references are generated:

  • A reference that accepts the given argument type
JS code JSR Java API
//> public String foo(String s);
 
foo:function(s){}
public JsFunc<String> foo(String s)


Java authored Js code
public void warn(String s){}
  • A reference that accepts a value binding


JS code JSR Java API
//> public String foo(String s);
 
foo:function(s){} // assume this code is in props section / static
public static JsFunc<String> foo(IValueBinding<String> s)
Java authored Js code
public String foo(String s)
  • Passing a value binding allows delegation and deferring the materialization of a value to another object. In this case another Jsr property or function that returns JsFunc<String> can be passed into the warn method. For example since foo method returns JsFunc<String> it can be passed into itself.


Java JSR Usage Code Generated Js Method call code (un-optimized)
MyJsr.foo(MyJsr.foo("test"));
a.b.c.MyJsr.foo(a.b.c.MyJsr.foo("test")); 
// note that there are optimization techniques we use to shorten this.



Functions with Optional Arguments in methods (Js authored only)

Optional arguments will produce overloaded apis in JSR.

One required argument and one optional argument:

JS code JSR Java API
//>public void foo(Foo a, String? b) 
 
foo : function(a, b){}
public JsFunc<Void> foo(FooJsr a, String b)
 
public JsFunc<Void> foo(</nowiki>IValueBinding<nowiki><? extends 
FooJsr> a, IValueBinding<nowiki><String> b)
 
public JsFunc<Void> foo(FooJsr a)
 
public JsFunc<Void> foo(</nowiki>IValueBinding<? extends FooJsr> a)

Multiple Optional Arguments:

JS code JSR Java API
//>public void foo(Foo a, String? b, String? c) 
 
foo2 : function(a, b){}
public JsFunc<Void> foo2(FooJsr a, String b, String c)
 
public JsFunc<Void> foo2(IValueBinding<? extends
 FooJsr> a, IValueBinding<String> b, IValueBinding<String> c)
 
public JsFunc<Void> foo2(FooJsr a, String b)
 
public JsFunc<Void> foo2(IValueBinding<? extends FooJsr> a, IValueBinding<String> b)
 
public JsFunc<Void> foo2(FooJsr a)
 
public JsFunc<Void> foo2(IValueBinding<? extends FooJsr> a)
 
|}
 
=== Incorrect Optional arguments ===
Optional arguments are only supported as the last arguments in the argument list. If the optional argument occurs before a required argument the jsr generation will assume that the optional argument is required. 
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JSR Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| //>public void foo(Foo? a, String b) 
 
foo : '''function'''(a, b){}
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public'''<nowiki> JsFunc<Void> foo(FooJsr a, String b)</nowiki>
 
 
'''public'''<nowiki> JsFunc<Void> foo(IValueBinding<? </nowiki>'''extends'''<nowiki> FooJsr> a, IValueBinding<String> b)</nowiki>
 
 
 
 
|}
== Supporting Variable arguments ==
=== Variable Argument only ===
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JSR Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| //>public void foo3(Foo ... s) 
 
foo3 : '''function'''(s){}
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public'''<nowiki> JsFunc<Void> foo3(FooJsr... p0)</nowiki>
 
 
'''public'''<nowiki> JsFunc<Void> foo3(IValueBinding<? </nowiki>'''extends''' FooJsr>... p0)
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| public String foo3(Foo … s)
 
|}
=== Required argument and Variable argument  ===
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JSR Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| //>public void foo5(String z, Foo ... b) 
 
foo5 : '''function'''(z, b){
 
}
 
 
 
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public'''<nowiki> JsFunc<Void> foo5(String z, FooJsr... b)</nowiki>
 
 
'''public'''<nowiki> JsFunc<Void> foo5(IValueBinding<String> z, IValueBinding<? </nowiki>'''extends''' FooJsr>... b)
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| public String foo3(Foo … s)
 
|}
=== Variable Argument listed before required argument – not supported ===
VJET validation error will be produced and if error is ignored no method will be generated. In Java authored code java compiler will give you an error.
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JSR Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| //>public void foo4(Foo ... s, String b) 
 
foo3 : '''function'''(s, b){}
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''// nothing produced'''
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
 
|}
== Overloaded Methods ==
JavaScript developers can declare overloaded methods but JavaScript can only have one function per name so the Js developer must handle the overloading in the function internally. The Java developer can author 2 independent methods rather than rely on one method. The Jsr Generation supports up to 15 overloaded signatures.
 
=== Simple overloading scenario ===
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JSR Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| //>public void foo4(String) 
 
//>public void foo4(int) 
 
foo4 : '''function'''(){}
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public'''<nowiki> JsFunc<Void> foo4(String a)</nowiki>
 
 
'''public'''<nowiki> JsFunc<Void> foo4(IValueBinding<String> a)</nowiki>
 
 
'''public'''<nowiki> JsFunc<Void> foo4(</nowiki>'''int''' a)
 
 
'''public'''<nowiki> JsFunc<Void> foo4(IValueBinding<Integer> a, com.ebay.dsf.aggregator.jsref.d.D1... notUsed)</nowiki>
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' '''void''' foo4(String a){}
 
'''public''' '''void''' foo4('''int''' a){}
 
|}
<nowiki>Note: the D1 class is for working around a problem with overloading and generics in Java. We use the D1 vararg to fake out the compiler. Since the generic is an erasure the compile get's confused between IValueBinding<Integer> vs IValueBinding<String>. </nowiki>
 
=== Hand coding a function reference ===
In the base JsObj there is an overloaded method called call where you can pass in the return type, method name, and arguments. If you look at the generated code you will see this simple internal call. 
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Original Js code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JSR Hand coded Function reference
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| //> public String foo(String s);
 
foo:function(s){} 
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| <nowiki>public JsFunc<String> foo(String s){</nowiki>
 
return call(String.class, "foo").with(s);
 
}
 
 
 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| //> public String foo2();
 
foo2:function(){} 
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| <nowiki>public JsFunc<String> foo2(){</nowiki>
 
return call(String.class,"foo2");
 
}
 
 
 
 
|}
If a JavaScript developer doesn't correctly declare a method you can add a call method directly. This is not recommended practice it is similar to using reflection to call a method. It is possible to get a runtime error because there is no contract that the method will exist.
 
= Js Property References =
[[Image:]]
 
== Js property reference getting value (JsProp) ==
You can get a reference to the value. On the server side you will not have access to the value 10. You will have access to the property reference which could be passed into another IValueBinding based API. If you need access to the value you must be writing your JavaScript definitions in Java or JavaScript. 
 
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JSR Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| MyProp:10, <nowiki>//< public int; assume protos</nowiki>
 
 
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public'''<nowiki> JsProp<Integer> MyProp();</nowiki>
 
 
 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' '''int''' MyProp = 10;
 
|}
== Js property reference setting value (JsPropSetter) ==
If the property is public and not final a property setter api is available which allows you to change the property reference value. There are 2 apis created for this property one for the main type and one for the IValueBinding similar to the function with one argument. Properties do not allow for different types; JSRs only provide one argument methods.
 
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JSR Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| MyProp:10, <nowiki>//< public int; assume protos</nowiki>
 
 
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' IJsPropSetter MyProp('''int''' v) {
 
'''return''' setProp("MyProp", v);
 
}
 
 
'''public'''<nowiki> IJsPropSetter MyProp(IValueBinding<Integer> v) {</nowiki>
 
'''return''' setProp("MyProp", v);
 
}
 
 
 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' '''int''' MyProp = 10;
 
|}
= JavaScript Object References =
[[Image:]]
 
== Constructors ==
=== Default Constructor ===
Constructors are generated for concrete types: 
 
* Ctypes / classes, 
* Etypes / enum, 
* Otypes (authored in Js only)
 
Constructors are not created for 
 
* Itypes / Interfaces
* Mixins (authored in Js only)
 
By default, JSRs include a no-argument default constructor, unless the constructor is overloaded:
 
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| // no constructs method
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' SimpleJsr()
 
 
 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''// no java constructor'''
 
|}
=== Overloaded Constructor ===
==== Js to Jsr ====
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| //>public constructs(String)
 
constructs : '''function'''(a){}
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' FooJsr(String a)
 
'''public'''<nowiki> FooJsr(IValueBinding<String> a)</nowiki>
 
|}
==== Java to Jsr ====
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' FooJ2J(String a){}
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' FooJsr(String a)
 
'''public'''<nowiki> FooJsr(IValueBinding<String> a)</nowiki>
 
|}
=== Default protected constructor  ===
There is a default protected constructor created that takes the JsObjectMeta, determines if an instance should be created, and passes the value of the arguments. 
 
 
== Registration of the Object Instance ==
TODO
 
== Resource Pattern Integration ==
Any non native type that has a source backing file will have a resource spec added during code generation. Any reference to this Jsr will automatically add its resources into the JsRuntimeCtx.
 
=== Js Native Types ===
=== Vjo Types ===
When there is a resource that is required to support the definition of the JavaScript type the Jsr must implement an ISpecBasedComponent. Js Objects implement an ISpecBasedComponent to allow the active needs to be translated to a resource spec which supports resource aggregation.
 
 
ResourceSpec that is generated for user defined types should include the following:
 
# VjoBootstrap for Vjo Types, 
# The type itself and 
# all active needs and 
# honorary needs. Honorary needs are from sections such as extends, satisfies, and mixin. 
 
Resource Specs should not include inactive needs in resource spec or implied types such as JavaScript Date or DOM types.
 
 
= Types to JSR =
== Class or CType to JSR ==
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''vjo'''.'''ctype'''('vjo.example.MyCType') <nowiki>//< public</nowiki>
 
.'''endType'''();
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' '''class''' MyCTypeJsr '''extends''' JsObj {…
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''package''' vjo.example;
 
'''public''' '''class''' MyCType {
 
}
 
 
 
 
|}
== Interface or IType to JSR ==
In this case the interface doesn't extend JsObj the interface is used to load the resources and provide access to the type reference.
 
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''vjo'''.'''itype'''('vjo.example.MyIType') <nowiki>//< public</nowiki>
 
.'''protos'''({
 
})
 
.'''endType'''();
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' '''interface''' MyITypeJsr {
 
…
 
 
 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''package''' vjo.example;
 
 
'''public''' '''interface''' MyIType {
 
 
}
 
 
 
 
|}
== MType to JSR ==
We create a JSR for resource pattern only. The APIs are not added to this class. The methods and properties declared in the mixin are added directly into the Jsr class since at the time of Java 5 and 6. Java does not support native mixin or module support. 
 
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''vjo'''.'''mtype'''('vjo.MyMType') <nowiki>//< public</nowiki>
 
.'''endType'''();
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' '''abstract''' '''class''' MyMTypeJsr {
 
…
 
}
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''// not applicable no mixin concept in Java.'''
 
 
 
 
|}
== Java enum or EType to JSR ==
ETypes in JSR do not use the Java Enum construct instead they use a Java Class so that the members can be referenced. We support a simple enum to a more complex enum. In all cases the name references are static final. While the enum names are referenced statically in a Jsr there is actually an instance created during Js runtime for each name. We borrow the small talk static instance concept here. 
 
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''vjo'''.'''etype'''('vjo.MyEType') <nowiki>//< public</nowiki>
 
'''.values'''(
 
"A,B"
 
)
 
'''.endType'''();
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' '''final''' '''class''' MyETypeJsr '''extends''' JsEnum {
 
 
…
 
 
'''public''' '''static''' '''final'''<nowiki> JsProp<MyETypeJsr> </nowiki>''A'' = '''new'''<nowiki> JsProp<MyETypeJsr>(</nowiki>''S''.getStaticAnchor(), "A");
 
 
'''public''' '''static''' '''final'''<nowiki> JsProp<MyETypeJsr> </nowiki>''B'' = '''new'''<nowiki> JsProp<MyETypeJsr>(</nowiki>''S''.getStaticAnchor(), "B");
 
…
 
 
}
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''package''' vjo;
 
 
'''public''' '''enum''' MyEType {
 
''A'',''B''
 
}
 
 
 
 
|}
== OType (JS only) ==
Object literal types provide JSR apis for functions and object literals without requiring class hierarchy. These APIs are used to ensure function signature safety and property safety rather than type safety since the function and object can live on their own in a JavaScript runtime.
 
=== Object Literal in Defs ===
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''vjo.otype'''('example.A')
 
'''.defs'''({
 
foo:{
 
a:10, <nowiki>//<int</nowiki>
 
b:'''null'''<nowiki>//<Date</nowiki>
 
},
 
foo2:{
 
a:10, <nowiki>//<int?</nowiki>
 
b:'''null'''<nowiki>//<Date?</nowiki>
 
}
 
})
 
'''.endType'''();
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' '''abstract''' '''class''' AJsr {
 
 
…
 
'''public''' '''static''' '''class''' fooJsr '''extends''' JsObjectLiteral { 
 
 
'''public''' '''static''' fooJsr obj('''int''' a, Date b)
 
 
'''public''' '''static'''<nowiki> fooJsr obj(IValueBinding<Integer> a, IValueBinding<? </nowiki>'''extends''' Date> b)
 
 
'''public'''<nowiki> IValueBinding<Integer> getA() </nowiki>
 
'''public'''<nowiki> IValueBinding<? </nowiki>'''extends''' Date> getB()
 
 
}
 
…
 
}
 
 
 
 
|}
=== Object Literal with optional properties ===
Optional properties create a similar pattern to the optional arguments in a method. In this case there are 5 methods created one for zero values, and then the arguments go in order of entry in the object literal with int a first, then b Date. The Jsr generator bases the order on order of entry and doesn't create additional overloaded methods for reverse order.
 
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''vjo.otype'''('vjo.MyOType') <nowiki>//< public</nowiki>
 
'''.defs'''({
 
foo:{
 
a:10, <nowiki>//<int?</nowiki>
 
b:'''null'''<nowiki>//<Date?</nowiki>
 
}
 
})
 
'''.endType'''();
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' '''abstract''' '''class''' MyOTypeJsr {
 
 
…
 
'''public''' '''static''' '''class''' fooJsr '''extends''' JsObjectLiteral { 
 
'''public''' '''static''' fooJsr obj('''int''' a, Date b) 
 
'''public''' '''static'''<nowiki> fooJsr obj(IValueBinding<Integer> a, IValueBinding<? </nowiki>'''extends''' Date> b) 
 
'''public''' '''static''' fooJsr obj()
 
'''public''' '''static''' fooJsr obj('''int''' a)
 
'''public''' '''static'''<nowiki> fooJsr obj(IValueBinding<Integer> a) </nowiki>
 
'''public'''<nowiki> IValueBinding<Integer> getA()</nowiki>
 
'''public'''<nowiki> IValueBinding<? </nowiki>'''extends''' Date> getB() 
 
…
 
}
 
 
 
 
|}
=== Defining a Function Definition ===
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''vjo.otype'''('vjo.MyOType') <nowiki>//< public</nowiki>
 
'''.defs'''({
 
//>public MyOType.foo doIt() 
 
doIt : '''function'''(){
 
 
}
 
})
 
'''.endType'''();
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' '''abstract''' '''class''' MyOTypeJsr {
 
…
 
'''public''' '''static''' '''class''' doItJsr '''extends'''<nowiki> JsFuncRef<MyOTypeJsr.fooJsr> { </nowiki>
 
…
 
// advanced API
 
'''public''' doItJsr(JsObjData obj, String funcName)
 
'''public''' doItJsr(JsObj obj, String funcName)
 
 
}
 
 
…
 
}
 
 
 
 
|}
==== Using Function Defs in CType (Simple) ====
CType definition:
 
 
'''vjo.ctype'''('com.ebay.dsf.jsr.runtime.tests.otype.B') <nowiki>//< public</nowiki>
 
//>needs(com.ebay.dsf.jsr.runtime.tests.otype.A)
 
'''.props'''({
 
//>public void foo(A.foo) 
 
foo : '''function'''(a){
 
},
 
//>public void foo(A.foo2) 
 
foo2 : '''function'''(a){
 
 
}
 
})
 
'''.endType'''();
 
 
Passing a typed object literal to a static function:
 
 
BJsr.''foo''(AJsr.fooJsr.''obj''(1, '''new''' Date()))
 
 
'''Resulting JS code:'''
 
 
com.ebay.dsf.jsr.runtime.tests.otype.B.foo({a:1,b:new Date(1274728865945)});
 
 
'''Passing a typed object literal with optional arguments to a static function:'''
 
 
BJsr.''foo2''(AJsr.foo2Jsr.''obj''(1)
 
 
BJsr.''foo2''(AJsr.foo2Jsr.''obj''(1, '''new''' Date()))
 
 
Resulting JS code:
 
 
com.ebay.dsf.jsr.runtime.tests.otype.B.foo2({a:1});
 
com.ebay.dsf.jsr.runtime.tests.otype.B.foo2({a:1,b:new Date(1274728866195)});
 
 
==== Using Function Defs (Advanced) ====
If you want to pass a function reference into another function reference you can use the utility methods that are added. This is advanced because you must watch your execution scope for passing any methods on an instance. Jsrs do not automatically hitch the methods to the instance object. Also there is no type safety with this advanced mode so if the API changes or the method is removed you will not find out until runtime. This api is primarily for library developers or library developers who are adapting existing JavaScript object literals from the internet.
 
 
Step 1 defines the JS code:
 
 
OType: X – defines the function reference X.foo
 
 
'''vjo.otype'''('com.ebay.dsf.jsr.runtime.tests.otype.X') <nowiki>//< public</nowiki>
 
'''.defs'''({
 
//>public void foo(String x)
 
foo:vjo.NEEDS_IMPL
 
})
 
'''.endType'''();
 
 
CType 1 : Y – defines a method that passes the function reference defined in X
 
 
'''vjo.ctype'''('com.ebay.dsf.jsr.runtime.tests.otype.Y') <nowiki>//< public</nowiki>
 
//> needs(com.ebay.dsf.jsr.runtime.tests.otype.X)
 
'''.protos'''({
 
//>public void doIt(X.foo) 
 
doIt : '''function'''(f){
 
assertTrue(f != '''null''');
 
f("test")<nowiki>;</nowiki>
 
}
 
})
 
'''.endType'''();
 
 
CType 2 : Z – defines 2 methods that implement the api X.foo
 
 
'''vjo.ctype'''('com.ebay.dsf.jsr.runtime.tests.otype.Z') <nowiki>//< public</nowiki>
 
//> needs(com.ebay.dsf.jsr.runtime.tests.otype.X)
 
'''.props'''({
 
//> X.foo
 
method:'''function'''(x){
 
//vjo.sysout.println(x);
 
assertTrue(x == "test");
 
}
 
})
 
'''.protos'''({
 
//> X.foo
 
bar : '''function'''(x){
 
//vjo.sysout.println(x);
 
assertTrue(x == "test");
 
}
 
})
 
'''.endType'''();
 
 
Step 2 Generate the Jsr
 
 
Step 3 Using the Jsr
 
 
Pass an instance function into a static method:
 
 
XJsr.fooJsr foo = '''new''' XJsr.fooJsr('''new''' ZJsr(), "bar");
 
'''new''' YJsr().doIt(foo);
 
 
Resulting Js 
 
 
var _r = vjo.Registry;
 
r.put('0',new com.ebay.dsf.jsr.runtime.tests.otype.Z());
 
vjo.Registry._1.doIt(vjo.Registry._0.bar);
 
 
Pass a static function into a static method
 
 
XJsr.fooJsr foo2 = '''new''' XJsr.fooJsr('''new''' JsObjData("com.ebay.dsf.jsr.runtime.tests.otype.Z", ZJsr.'''class''', "Z"), "method");
 
'''new''' YJsr().doIt(foo2)
 
 
'''Resulting JS code:'''
 
 
var _r = vjo.Registry;
 
function $o2(){return new com.ebay.dsf.jsr.runtime.tests.otype.Y();};
 
_r.put('2',$o2());
 
vjo.Registry._2.doIt(com.ebay.dsf.jsr.runtime.tests.otype.Z.method);
 
 
== Nested Types ==
=== Static Inner Type ===
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''vjo.ctype'''('vjo.NestedTypeEx') <nowiki>//< public</nowiki>
 
'''.props'''({
 
Foo:'''vjo.ctype'''()
 
'''.endType'''()
 
})
 
'''.endType'''();
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' '''class''' NestedTypeExJsr '''extends''' JsObj {
 
…
 
'''public''' NestedTypeExJsr()
 
…
 
'''public''' '''static''' '''class''' FooJsr '''extends''' JsObj {
 
 
'''public''' FooJsr()
 
 
'''public''' '''static'''<nowiki> JsTypeRef<FooJsr> </nowiki>''prototype'' = '''new'''<nowiki> JsTypeRef<FooJsr>(</nowiki>''S'');
 
}
 
 
'''public''' '''static'''<nowiki> JsTypeRef<NestedTypeExJsr> </nowiki>''prototype'' = '''new'''<nowiki> JsTypeRef<NestedTypeExJsr>(</nowiki>''S'');
 
}
 
 
 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' '''class''' NestedTypeEx {
 
 
'''public''' '''static''' '''class''' Foo{}
 
 
}
 
 
 
 
|}
= Function References and Type References =
The following diagram shows the relationships for the Java Script Reference model for JavaScript Function references, JavaScript type references (added by VJO JS), and JavaScript properties. 
 
 
[[Image:]]
 
== Function References (JsFuncRef) ==
There are 2 ways to have a reference to a function one way is to use the JavaScript Function type in your API but this doesn't specify return type or arguments that are accepted. 
 
=== Function Ref using Function API ===
In the Java authored JS code you will notice the type is JFunction not Function. 
 
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JSR Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''vjo.otype(…)'''
 
'''.defs'''({
 
//> public int doIt(String x)
 
doIt : '''function'''(x){}
 
}
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' '''static''' '''class''' doItJsr '''extends'''<nowiki> JsFuncRef<Integer> { </nowiki>
 
'''public''' doItJsr(JsObjData obj, String funcName)
 
'''public''' doItJsr(JsObj obj, String funcName)
 
}
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| // not supported 
 
|}
TODO – I tried declaring a function reference but this is an otype only construct. We can pass Function objects in Java but this is not function reference. 
 
=== Using the JsFuncRef in a Class ===
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JSR Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| //> public OType.doIt foo(OType.doIt f);
 
foo:function(f){}
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public'''<nowiki> JsFunc<? </nowiki>'''extends''' MyOTypeJsr.doItJsr> foo(){}
 
 
 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' MyOType.doIt foo() // This is using the native proxy MyOType not the MyOTypeJsr
 
|}
== Type References (JsTypeRef) ==
=== API for Type References ===
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JSR Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| //> public Type::X foo(Type::X f);
 
foo:function(f){}
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public'''<nowiki> JsFunc<? </nowiki>'''extends'''<nowiki> JsTypeRef<FooJsr>> foo5(JsTypeRef<FooJsr> f){}</nowiki>
 
 
'''public'''<nowiki> JsFunc<? </nowiki>'''extends'''<nowiki> JsTypeRef<FooJsr>> foo5(IValueBinding<? </nowiki>'''extends'''<nowiki> JsTypeRef<FooJsr>> f){</nowiki>}
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| // currently not supported
 
|}
TODO – fix the Java to Jsr for type references. 
 
 
=== Access a Type Reference for any Type ===
A type reference property is added for all types except for:
 
# OType
# Mixin 
 
For nested types we support type references for 
 
# 
## Static nested types.
## Nested type inside an interface.
 
'''public''' '''static'''<nowiki> JsTypeRef<NestedTypeExJsr> </nowiki>''prototype'' = '''new'''<nowiki> JsTypeRef<NestedTypeExJsr>(</nowiki>''S'');
 
 
= Imports and Jsr =
* Imports are translated into a nested class resource spec that can be used in a view spec. 
* Inactive needs will not include the resource in the Jsr.
* Implicit types such as Date or HTMLSelectElement do not get included in the Jsr resource spec.
 
TODO example of needs/extends to resource spec inside outer type
 
 
= Java to JS Converters =
For any Java types used in Jsr APIs there is a converter registered. That will convert the Java object to a js object during runtime. There are default converters for the following Java types and literals:
 
 
== BooleanJsConverter ==
This converter converts Boolean literal from Java Boolean literal to Js Boolean literal
 
 
== BooleanWrapperConverter ==
This converter takes a java.lang.Boolean object and converts it to a JS Boolean object. In most cases this should not be used since developers mostly expect a Boolean literal not a 
 
 
== DateJsConverter ==
== StringArrayJsConverter ==
== StringJsConverter ==
== EnumJsConverter ==
== DsfMessageJsConverter ==
== DefaultJava2JsConverter ==
== JsContentGenJsConverter ==
== JsObjRefConverter ==
== JsVariableBindingConverter ==
== JsonObjectConverter ==
== VjoObjectConverter ==
= Js to Jsr Mappings =
In most cases JavaScript types will map XJsr types. In some cases for types that are similar to JavaScript native types and literals we use the Java data type rather than a Jsr. This is to provide Java developer a simple way to pass primitive information such as String literal or boolean literals without creating a Jsr. 
 
== Js Native Type mapping ==
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''JavaScript Type used in JavaScript Language'''
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''Java API'''
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Notes
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Arguments
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Not supported
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| This type should not be used in API. Type is only available in function scope.
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Array
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ArrayJsr.java
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| should not be abstract
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Boolean
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| java.lang.Boolean
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Converter is registered. Converts to js Boolean. Note you should not use this in your Js code instead use boolean (lower case b) and you will receive the literal.
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Date
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| java.util.Date
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Converter is registered. Converts to a Js date.
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Enumerator
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| EnumeratorJsr.java
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Maps to Jsr
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Error
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ErrorJsr.java
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Maps to Jsr
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| EvalError
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| EvalErrorJsr.java
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Maps to Jsr
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Function
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| FunctionJsr.java
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Maps to Jsr
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Global
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| GlobalJsr.java
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Should not be used since this is implied type for global scope.
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Math
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| MathJsr.java
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Maps to Jsr
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Number
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| double
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Converter is registered. 
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Object
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| java.lang.Object
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Maps to vjo.ObjectJsr
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ObjLiteral
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| java.lang.Object
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Should not be used in API. Use Object. We have mapping to Object for backwards compatibility
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| RangeError
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| RangeErrorJsr.java
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Maps to Jsr
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ReferenceError
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ReferenceErrorJsr.java
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Maps to Jsr
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| RegExp
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| RegExpJsr.java
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Maps to Jsr
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| String
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| java.lang.String
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Converter takes java string and converts to Js string literal
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| SyntaxError
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| SyntaxErrorJsr.java
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Maps to Jsr
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| TypeError
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| TypeErrorJsr.java
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Maps to Jsr
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| URIError
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| URIErrorJsr.java
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Maps to Jsr
 
|}
== Js / Java Literals to Jsr mappings ==
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''Java Literal used in JavaScript language'''
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''Java API'''
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Notes
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| float
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| float
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Not supported literal in Js but we add this literal to help declare precision. At Js runtime precision may be higher then Float.MAX_VALUE.
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| double
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| double
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Not supported literal in Js but we add this literal to help declare precision. At Js runtime precision may be higher then Double.MAX_VALUE.
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| byte
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| byte
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Not supported literal in Js but we add this literal to help declare precision. At Js runtime precision may be higher then Byte.MAX_VALUE.
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| void
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| void
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| char
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| char
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| should extend String
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| boolean
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| boolean
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| boolean represents a boolean literal and should never be Boolean object.
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| long
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| long
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| short
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| short
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
 
|}
== VJO Type mappings in Jsr ==
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''Vjo type'''
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''Java API'''
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Notes
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| vjo.Object
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| vjo.ObjectJsr
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JsObj is currently base for all native objects and vjo objects but really user defined objects using VJO should extend from vjo.ObjectJsr not JsObj. 
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| vjo.Enum
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| vjo.EnumJsr
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| vjo.Class
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| vjo.ClassJsr
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Converter is registered
 
|}
== DOM Type mappings in Jsr ==
DOM types are used for the type name only. 
 
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| colspan="2"  style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''Browser Data Types'''
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''DOM JS Built-in Type'''
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''Corresponding Jsr'''
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ActiveXObject
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ActiveXObjectJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Attr
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| AttrJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| CDATASection
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| CDATASectionJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| CharacterData
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| CharacterDataJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Comment
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| CommentJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DocumentEvent
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DocumentEventJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DocumentFragment
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DocumentFragmentJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Document
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DocumentJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DocumentType
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DocumentTypeJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMConfiguration
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMConfigurationJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMErrorHandler
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMErrorHandlerJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMError
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMErrorJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMException
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMExceptionJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMImplementation
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMImplementationJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMImplementationList
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMImplementationListJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMImplementationSource
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMImplementationSourceJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMLocator
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMLocatorJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMStringList
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| DOMStringListJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Element
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ElementView
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ElementViewJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Entity
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| EntityJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| EntityReference
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| EntityReferenceJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| EventException
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| EventExceptionJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Event
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| EventJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| EventListener
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| EventListenerJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| EventTarget
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| EventTargetJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| External
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ExternalJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Frames
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| FramesJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| History
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HistoryJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLAbbrElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLAbbrElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLAcronymElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLAcronymElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLAddressElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLAddressElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLAnchorElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLAnchorElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLAppletElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLAppletElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLAreaElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLAreaElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLArticleElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLArticleElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLAsideElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLAsideElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLAudioElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLAudioElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBaseElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBaseElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBaseFontElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBaseFontElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBbElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBbElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBDOElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBDOElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBgsoundElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBgsoundElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBigElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBigElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBlockquoteElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBlockquoteElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBodyElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBodyElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBRElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLBRElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLButtonElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLButtonElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLCanvasElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLCanvasElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLCenterElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLCenterElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLCiteElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLCiteElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLCodeElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLCodeElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLColgroupElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLColgroupElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLCollection
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLCollectionJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLCommandElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLCommandElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDataGridElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDataGridElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDataListElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDataListElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDdElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDdElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDelElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDelElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDetailsElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDetailsElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDfnElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDfnElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDialogElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDialogElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDirectoryElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDirectoryElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDivElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDivElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDListElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDListElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDocument
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDocumentJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDOMImplementation
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDOMImplementationJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDtElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLDtElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLElementStyle
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLElementStyleJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLEmbedElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLEmbedElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLEmElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLEmElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLFieldSetElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLFieldSetElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLFigureElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLFigureElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLFontElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLFontElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLFooterElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLFooterElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLFormElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLFormElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLFrameElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLFrameElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLFrameSetElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLFrameSetElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLHeadElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLHeadElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLHeaderElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLHeaderElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLHeadingElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLHeadingElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLHGroupElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLHGroupElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLHRElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLHRElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLHtmlElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLHtmlElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLIElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLIElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLIFrameElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLIFrameElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLImageElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLImageElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLInputElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLInputElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLInsElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLInsElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLIsIndexElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLIsIndexElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLKbdElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLKbdElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLKeyGenElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLKeyGenElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLLabelElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLLabelElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLLegendElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLLegendElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLLIElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLLIElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLLinkElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLLinkElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLMapElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLMapElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLMarkElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLMarkElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLMarqueeElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLMarqueeElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLMenuElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLMenuElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLMetaElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLMetaElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLMeterElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLMeterElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLModElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLModElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLNavElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLNavElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLNoBrElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLNoBrElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLNoFramesElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLNoFramesElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLNoScriptElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLNoScriptElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLObjectElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLObjectElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLOListElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLOListElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLOptGroupElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLOptGroupElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLOptionElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLOptionElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLOptionsCollection
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLOptionsCollectionJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLOutputElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLOutputElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLParagraphElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLParagraphElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLParamElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLParamElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLPreElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLPreElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLProgressElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLProgressElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLQuoteElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLQuoteElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLRpElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLRpElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLRtElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLRtElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLRubyElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLRubyElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSampElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSampElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLScriptElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLScriptElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSectionElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSectionElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSelectElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSelectElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSmallElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSmallElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSourceElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSourceElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSpanElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSpanElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLStrikeElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLStrikeElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLStrongElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLStrongElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLStyleElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLStyleElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSubElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSubElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSupElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLSupElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTableCaptionElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTableCaptionElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTableCellElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTableCellElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTableColElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTableColElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTableElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTableElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTableRowElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTableRowElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTableSectionElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTableSectionElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTextAreaElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTextAreaElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLThElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLThElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTimeElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTimeElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTitleElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTitleElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTtElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLTtElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLUElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLUElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLUListElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLUListElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLUnknownElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLUnknownElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLVarElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLVarElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLVideoElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLVideoElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLWbrElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLWbrElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLXmlElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLXmlElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLXmpElement
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| HTMLXmpElementJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Image
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ImageJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| KeyboardEvent
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| KeyboardEventJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Location
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| LocationJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| MimeType
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| MimeTypeJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| MouseEvent
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| MouseEventJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| NamedNodeMap
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| NamedNodeMapJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| NameList
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| NameListJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Navigator
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| NavigatorJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Node
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| NodeJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| NodeList
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| NodeListJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Notation
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| NotationJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Opera
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| OperaJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Option
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| OptionJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| PluginArray
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| PluginArrayJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Plugin
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| PluginJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ProcessingInstruction
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ProcessingInstructionJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Screen
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ScreenJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Selection
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| SelectionJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| TextEvent
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| TextEventJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Text
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| TextJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| TextRange
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| TextRangeJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| TextRectangle
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| TextRectangleJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| TextRectangleList
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| TextRectangleListJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| TypeInfo
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| TypeInfoJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| UIEvent
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| UIEventJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| UserDataHandler
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| UserDataHandlerJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Window
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| WindowJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| XMLHttpRequest
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| XMLHttpRequestJsr.java
 
|-
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
| style="border:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
 
|}
= JSR Built-in Convenience Extensions =
== Events Jsr Generation ==
=== Events Using Java Enum name (Js -> Jsr only) - deprecated ===
This way causes issues with code completion, searching and validation. We do not recommend using this and we need to clean this up. 
 
 
If the JsHandlerObjectEnum is the first argument then there will be 2 apis generated one with the object enum and one without. The native event object will be passed in by the EventDispatcher automatically. Since the browser passes the native event. 
 
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"|  //> public boolean doIt(com.ebay.dsf.resource.html.event.handler.JsHandlerObjectEnum);
 
 doIt : '''function''' (currentDsfMsg) {
 
 '''return''' '''true'''<nowiki>;</nowiki>
 
 }
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public'''<nowiki> JsFunc<Boolean> </nowiki>doIt(){
 
}
 
 
'''public'''<nowiki> JsFunc<Boolean> </nowiki>doIt(com.ebay.dsf.resource.html.event.handler.JsHandlerObjectEnum currentDsfMsg){
 
}
 
 
 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| // not supported
 
|}
=== Events Using Native Event (not recommended due to portability issues) ===
In this case the Event object in Js is using the native event object. There are 4 apis generated. 
 
# One with the EventJsr to allow for passing of the EventJsr object from other method that returns the event object.
# One with the EventJsr IValueBinding. 
# One for backward compatibility with deprecated mode using JsHandlerObjectEnum
# One without any arguments to allow for the event object to be passed into by the event dispatcher automatically. No user defined code required to pass the event object.
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| //> public boolean doIt(Event);
 
doIt2 : '''function''' (evt) {
 
evt.cancelBubble = '''true'''<nowiki>;</nowiki>
 
'''return''' '''false'''<nowiki>;</nowiki>
 
}
 
 
 
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public'''<nowiki> JsFunc<Boolean> doIt2(EventJsr evt)</nowiki>
 
 
'''public'''<nowiki> JsFunc<Boolean> doIt2(IValueBinding<? </nowiki>'''extends''' EventJsr> evt)
 
 
'''public'''<nowiki> JsFunc<Boolean> doIt2(com.ebay.dsf.resource.html.event.handler.JsHandlerObjectEnum evt)</nowiki>
 
 
'''public'''<nowiki> JsFunc<Boolean> doIt2(){</nowiki>
 
'''return''' call(Boolean.'''class''', "doIt2").with(com.ebay.dsf.resource.html.event.handler.JsHandlerObjectEnum.''nativeEvent'');
 
}
 
 
 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' '''boolean''' doIt2(Event evt){
 
evt.setCancelBubble(true);
 
return false;
 
}
 
|}
Note: Event.setCancelBubble needs to be added to make this work
 
 
=== Events using vjo.dsf.Event (preferred solution) ===
This is the preferred solution because the native event api is not standard across browsers where this object deals with these differences and you get consistent code completion, validation, and searching in VJET IDE.
 
 
There are 4 apis generated for this case. 
 
 
# One with the EventJsr to allow for passing of the EventJsr object from other method that returns the event object.
# One with the EventJsr IValueBinding to allow EventJsr to be passed from one reference to another.
# One for backward compatibility with deprecated mode using JsHandlerObjectEnum
# One without any arguments to allow for the event object to be passed into by the event dispatcher automatically. No user defined code required to pass the event object.
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| //> needs(vjo.dsf.Event)
 
//> public boolean doIt(Event);
 
doIt2 : '''function''' (evt) {
 
'''return''' '''true'''<nowiki>;</nowiki>
 
}
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| //note EventJsr is referring to vjo.dsf.EventJsr not the native EventJsr. 
 
 
'''public'''<nowiki> JsFunc<Boolean> doIt2(EventJsr evt)</nowiki>
 
 
'''public'''<nowiki> JsFunc<Boolean> doIt2(IValueBinding<? </nowiki>'''extends''' EventJsr> evt)
 
 
'''public'''<nowiki> JsFunc<Boolean> doIt2(com.ebay.dsf.resource.html.event.handler.JsHandlerObjectEnum evt)</nowiki>
 
 
 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''// Event in this case is referring to the native js proxy vjo.dsf.Event'''
 
 
'''public''' '''boolean''' doIt2(Event evt){
 
evt.setCancelBubble(true);
 
return false;
 
}
 
|}
== Ajax Service Engine Message Generation ==
=== Using the JsHandlerObjEnum - Deprecated ===
Similar to the Event using the same type we do not want to support this going forward. This example has multiple issues:
 
# Doesn't declare needs correctly which causes an implicit dependency on vjo.dsf.Message 
# It is very verbose and difficult to read.
# Code completion, searching, validation doesn't work correctly. Causing workarounds in VJET JS. 
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"|  //> public com.ebay.dsf.resource.html.event.handler.JsHandlerObjectEnum doIt(com.ebay.dsf.resource.html.event.handler.JsHandlerObjectEnum);
 
doIt : '''function''' (message) {
 
'''return''' message;
 
}
 
 
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public'''<nowiki> JsFunc<? </nowiki>'''extends''' com.ebay.dsf.resource.html.event.handler.JsHandlerObjectEnum> doIt(com.ebay.dsf.resource.html.event.handler.JsHandlerObjectEnum message)
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| // not supported
 
|}
=== Using vjo.dsf.Message in API – preferred solution ===
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| //>needs(vjo.dsf.Message)
 
//> public Message doIt(Message)
 
doIt : '''function''' (message) {
 
'''return''' message;
 
}
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public'''<nowiki> JsFunc<? </nowiki>'''extends''' MessageJsr> doIt(MessageJsr message)
 
 
'''public'''<nowiki> JsFunc<? </nowiki>'''extends'''<nowiki> MessageJsr> doIt(IValueBinding<? </nowiki>'''extends''' MessageJsr> message)
 
 
'''public'''<nowiki> JsFunc<? </nowiki>'''extends''' MessageJsr> doIt(){
 
'''return''' call(MessageJsr.'''class''', "doIt").with(com.ebay.dsf.resource.html.event.handler.JsHandlerObjectEnum.''message'');
 
}
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' '''void''' doIt(Message message){}
 
 
 
 
|}
TODO – Currently there is a problem with 3<sup>rd</sup> API not being generated.
 
TODO – Add more tests here
 
 
Note – On the server side there is com.ebay.dsf.service.Message but this class should not be passed into Jsr.
 
 
== Types supporting Java type and Java Jsr Type API ==
TODO – fix this on Zam currently broken after first iteration of Jsr fixes
 
 
ArrayList and HashMap are currently supported as types that support a native Java api as well as the ArrayListJsr and HashMapJsr respectively. 
 
 
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JS code
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java API
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| //>public constructs(HashMap)
 
constructs : '''function'''(a){}
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' FooJsr(HashMap a)
 
'''public''' FooJsr(HashMapJsr a)
 
'''public'''<nowiki> FooJsr(IValueBinding<HashMap> a)</nowiki>
 
'''public'''<nowiki> FooJsr(IValueBinding<HashMapJsr> a)</nowiki>
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Java authored Js code
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''public''' FooJ2J(HashMap a){}
 
|}
In order to support this HashMap api must have a converter registered or the default converter will take the HashMap and convert it to a JSON object.
 
 
A user can also define a Java type that supports this using the 
 
 
= Using JSR =
== JSRs are Independent of the Source Language ==
Recall that there are no differences in JSR references whether they are generated from JavaScript or Java code''. ''
 
 
The following example creates two Buttons, and adds a Click event to each button. One button associates the Click event to a JSR generated from Java (JavaCommunicatorJsr); the other button associates the Click event with a JSR generated from JavaScript (CommunicatorJsr). 
 
 
'''public''' '''class''' CommExample {
 
'''public''' DDiv div() {
 
 // CommunicatorJsr source of truth is .js (JavaScript)
 
DButton b1 = getButton("Warn me")
 
 .add(EventType.''CLICK'', CommunicatorJsr.''warn''("Will Robinson")) ;
 
 
// JavaCommunicatorJsr source of truth is .java (Java)
 
DButton b2 = getButton("Warn me again")
 
  .add(EventType.''CLICK'', JavaCommunicatorJsr.''warn''("The Wolf")) ; 
 
 
DDiv div = '''new''' DDiv()
 
.add(b1)
 
.addBr()
 
.add(b2) ;
 
 
'''return''' div ;
 
}
 
 
'''private''' DButton getButton(String label) {
 
 '''return''' '''new '''DButton(label)
 
.setHtmlType(DButton.''TYPE_BUTTON'') ;
 
}
 
}
 
 
= APPENDIX: VJET Sections and JSR  =
 
{| style="background-color:#F9F9F9;border:1px solid #AAAAAA;border-collapse:collapse;color:black; margin:1em 0;"
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| VJET Section
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| JSR 
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Notes
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| .needs
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| import
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| .values
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Creates a JsProp member for each element
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| .inherits
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Extends, import
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| .satisfies
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Implements,import
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| .mixin
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| mtype members are incorporated with the type that includes the mixin
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| .props
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| static
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Members defined in the props section become static members
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| .protos
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Instance members only public members
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Members defined in the protos section become instance members
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| .constructs
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Creates JSR constructor(s) if the constructor is overloaded; otherwise a no-argument, default constructor is created. 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| .options
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Not included
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| .inits
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Not included
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| .globals
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Not included
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| .expects
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Not included
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| 
 
|-
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| .defs
| style="border-top:0.018cm solid #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Nested classes
| style="border:0.018cm solid #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| Nested classes representing functions and object literals
 
|}
= Review #1 5/20/10 =
== Additions Requested ==
* MType isMixin api to be added
* Undefined type / Jsr do we want to add this?
* Utility to convert com.ebay.dsf.service.Message to MessageJsr 
* Change spec so that all Jsrs that implement VJO extend vjo.ObjectJsr
* Do we want to add function references to Spec for each static method? Preferred we have some Jsr Utilities for this.
* After all definitions show usage example.
* Mention something about property setting last one in wins. 
* Look at having a way to hint that certain types need convenience APIs without changing code generator. 
* Add example of using the annotation @Package and getting a Jsr with a resource spec
 
* Add Note about Property gets reference not actual value.
* Add Hand coding show the call without the method name repeated but state there is a performance enhancement by using overloaded method.
* Flow diagram that shows Jsr usage during page construction and how the code is invoked on a browser.
 
== Changes Requested ==
* 13.1Number usage in JS should be double in Jsr – added to spec – code gen change needed
* Make VJET validation requirement for Jsr generation currently they are separate today.
* 6.4.2 missing required argument 
* Inner types – show differences between static, instance, interface, .. Usage of type references.
* EType mention that EType must be final
* Etype from reference perspective are static but internally the values are static instances. A small talk concept.
* OTYPE - Show usage of the JsFuncRef constructors show simple and complex examples.
* OTYPE show object literal first before function references. Since I am using object literal in function reference.
* 10.1.2 examples are wrong
* 10.2.1 Need to determine how to do a type reference in Java to Jsr or what is should be?
* Section 12 more examples of converters
* 13.1 – java.lang.Number should be vjo.java.lang.Number not js Number (do we want different mapping for Java to Jsr types.
* 13.2 – remove the extends Number comment
* Show function and type references before types
* Function references… Text is covering Function instance
* Remove section 11 already covered in resource spec info
* Remove the usage section and integrate into after each definition. Write test cases at the same time.
* Move the convenience extensions into another document. It is not part of the core Jsr. 
 
== Verification Required ==
* Does VJET validator error on foo(Foo? A, String ) – need to verify
* Hand coding examples - Reflection different between Java Sun vs IBM?? Need to confirm this.
* Is there a resource pattern document to refer to?
* 
 
= Known Issues =
* Native types are names only and do not have their api's exposed. 
* Js developers who declare Boolean are not expecting a Boolean object in most cases but expecting the boolean literal or boolean. 
* Serialization feature was removed due to no documentation / support/ tests. More information is needed.
* Globals can not be referenced in Jsr
* Java 2 Jsr – type references do not generate correctly / same as Vjo to Jsr right now.
* JsObj is currently base for all native objects and vjo objects but really user defined objects using VJO should extend from vjo.ObjectJsr not JsObj. 
* VJET validation fixes were being added that used overloading for event and message. 
* When doing right click js to java generation I noticed that Event apis are missing zero argument signature. 14.5.1
* VjoObjectConverter is not added by default due to issues with JS code using HashMap, ArrayList but not using the VJO JDK classes. This issue needs to be addressed. There are currently validation errors on this code. 
* When auditing tests I found that Java to Js was not correctly using interfaces but using concrete classes which do not translate correctly to JSR or VJO. Biggest offender was using DapCtx to get the window or document rather than using VJ type.
* Native types should not have active or inactive needs in some cases I found that VJO code and Jsr was pulling 
 
Type Omissions
 
Jsr should not include imports for anything inside java.lang
 
Inactive Needs 
 
Should Object be in inactive needs?
 
.needs('Object','') active needs for Object?
 
.needs('Object','com.ebay.dsf.jsnative.global.Object') – strange
 
 
* Also show an example of adding vjo.ctype to get a vjo type. Which one is preferred and do they both work in runtime?
* Issue with nested object literals in otypes Jsr do not generate correctly. Added note into language spec this is not supported.
* OType on RA and previous did not correctly serialize object literals that used any of the java types such as Date. On ZAM fixed this to use the Js converters to prevent a JSON deserialize api call 
 
* JFunction had utility method def which I moved to JFunctionX since we want JFunction to map to JFunction. DOM JSR apis were using Native proxies not Jsrs this was fixed on ZAM. Example:
 
From
 
 
HtmlDocument is not a Jsr
 
 
'''<nowiki>public JsFunc<String> getReferrer(</nowiki>HtmlDocument doc){'''
 
'''return call(String.class, "getReferrer").with(doc);'''
 
'''}'''
 
 
'''<nowiki>public JsFunc<String> getReferrer(IValueBinding<? extends </nowiki>HtmlDocument'''> doc){
 
return call(String.class, "getReferrer").with(doc);
 
}
 
 
HTMLDocumentJsr can be used here:
 
 
'''<nowiki>public JsFunc<String> getReferrer(</nowiki>HTMLDocumentJsr doc){'''
 
'''return call(String.class, "getReferrer").with(doc);'''
 
'''}'''
 
 
'''<nowiki>public JsFunc<String> getReferrer(IValueBinding<? extends </nowiki>HTMLDocumentJsr'''> doc){
 
return call(String.class, "getReferrer").with(doc);
 
}

Back to the top