Compare commits
91 Commits
templess_b
...
devel-bran
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
022679d296 | ||
|
|
76f5993295 | ||
|
|
4aef196940 | ||
|
|
95212070e5 | ||
|
|
a3f8d0bd91 | ||
|
|
143d793d92 | ||
|
|
f23b34bd3a | ||
|
|
dd5fed5bb7 | ||
|
|
faa9114f05 | ||
|
|
4a664a9d17 | ||
|
|
7d3284a844 | ||
|
|
3d74830d90 | ||
|
|
195b682674 | ||
|
|
ec23d24715 | ||
|
|
2885898ef8 | ||
|
|
67eadf4f1e | ||
|
|
4f20761e34 | ||
|
|
fc2cad4932 | ||
|
|
30c56f3639 | ||
|
|
ca6dc1fc26 | ||
|
|
ba4c5094db | ||
|
|
ee64838ee8 | ||
|
|
1ce450ad4f | ||
|
|
b418188a8b | ||
|
|
2dc5206e75 | ||
|
|
96161f967c | ||
|
|
743c0a229c | ||
|
|
24d5d137a0 | ||
|
|
b5d4424801 | ||
|
|
ff1b4b1e1d | ||
|
|
69cf61f5eb | ||
|
|
5cc6e3d984 | ||
|
|
4d8621f697 | ||
|
|
a632e85b26 | ||
|
|
6540ca312f | ||
|
|
e5f29da793 | ||
|
|
c6207a9f7d | ||
|
|
4961efe27e | ||
|
|
ce3d4802c3 | ||
|
|
bddc00f963 | ||
|
|
0ca7401ac3 | ||
|
|
2483882907 | ||
|
|
3697139332 | ||
|
|
b6afda984b | ||
|
|
e635959f51 | ||
|
|
16434b387d | ||
|
|
638725b1b5 | ||
|
|
45f8213641 | ||
|
|
bfb9aca700 | ||
|
|
206cfea47e | ||
|
|
45dda7f9d7 | ||
|
|
56d5b33441 | ||
|
|
786c07678c | ||
|
|
ca381e50f6 | ||
|
|
be69ed26f7 | ||
|
|
f79e54a14b | ||
|
|
aaf3435cfc | ||
|
|
0f003d0b87 | ||
|
|
2c172f8f0f | ||
|
|
3a612c182b | ||
|
|
383306ef0c | ||
|
|
5c2a6e3f21 | ||
|
|
723ca452aa | ||
|
|
a11fe1b347 | ||
|
|
f9a11dce24 | ||
|
|
8329d2854a | ||
|
|
ff30605d39 | ||
|
|
ce2fbf607b | ||
|
|
9d783f7308 | ||
|
|
31c2738905 | ||
|
|
1b77458249 | ||
|
|
fb4750ee15 | ||
|
|
74b96f1ea2 | ||
|
|
87bc6b6e6d | ||
|
|
4547cd6a13 | ||
|
|
34f0846f9f | ||
|
|
d9a83967d0 | ||
|
|
d5617f8e13 | ||
|
|
8bc99deafc | ||
|
|
f78aa8f4f9 | ||
|
|
5067e3ff63 | ||
|
|
ee7c2f9140 | ||
|
|
c54f56e6c6 | ||
|
|
0261f758d6 | ||
|
|
d5c24acd01 | ||
|
|
543b395b1f | ||
|
|
41f0c06c10 | ||
|
|
40f68ba86c | ||
|
|
18c8e587ea | ||
|
|
e4b0ff57af | ||
|
|
125554af8f |
2840
mozilla/directory/perldap/API.pm
Normal file
2840
mozilla/directory/perldap/API.pm
Normal file
File diff suppressed because it is too large
Load Diff
1792
mozilla/directory/perldap/API.xs
Normal file
1792
mozilla/directory/perldap/API.xs
Normal file
File diff suppressed because it is too large
Load Diff
48
mozilla/directory/perldap/CREDITS
Normal file
48
mozilla/directory/perldap/CREDITS
Normal file
@@ -0,0 +1,48 @@
|
||||
This is a short list of people that have contributed to the success of
|
||||
this project.
|
||||
|
||||
|
||||
* Leif Hedstrom <leif@perldap.org>
|
||||
|
||||
- Project lead.
|
||||
- Wrote some of the API code, and most of OO layers (Conn.pm,
|
||||
Entry.pm etc.)
|
||||
- Unix portability test.
|
||||
- Port to Windows/NT and ActivePerl.
|
||||
|
||||
|
||||
* Clayton Donley
|
||||
|
||||
- Wrote a lot of the initial API code (API.xs and API.pm).
|
||||
|
||||
|
||||
* Kevin McCarthy <kmccarth@perldap.org>
|
||||
|
||||
- Bug fixes, tons of contribution, particularly to the API.xs file.
|
||||
|
||||
|
||||
* Michelle Wyner <mwyner@perldap.org>
|
||||
|
||||
- Testing, bug fixes, and documentation, as well as working on new
|
||||
modules for PerLDAP v2.0.
|
||||
|
||||
|
||||
* John Kristian <kristian@netscape.com>
|
||||
|
||||
- Rewrote the entire LDIF module, great stuff!
|
||||
|
||||
|
||||
* Netscape Netcenter team (Kevin Burns, Max Block, Mark Takacs etc.)
|
||||
|
||||
- Tons of ideas and requests for features.
|
||||
- Discovering bugs daily (great, thanks... ;-).
|
||||
|
||||
|
||||
* Bob Ferguson <rferguso@netscape.com>
|
||||
|
||||
- Primary guinea pig for all my NT builds.
|
||||
|
||||
|
||||
* Everyone else that I've forgot to mention:
|
||||
|
||||
- Thanks for testing and debugging this package!
|
||||
549
mozilla/directory/perldap/ChangeLog
Normal file
549
mozilla/directory/perldap/ChangeLog
Normal file
@@ -0,0 +1,549 @@
|
||||
1999-08-19 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Changed version numbering again, just called this plain v1.4.
|
||||
|
||||
* Entry.pm (FIRSTKEY): Bug fix, we'd crap out if there are no
|
||||
attributes in the returned entry.
|
||||
(NEXTKEY): Ditto.
|
||||
|
||||
1999-08-18 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Set version number to v1.4! Woohoo! Also tagged it as v1.3.4,
|
||||
last "development" release.
|
||||
|
||||
1999-08-17 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Makefile.PL: Fixes for Windows/NT, cleaned out some code etc.
|
||||
(MY::postamble): Support for "make html".
|
||||
|
||||
* MANIFEST: Updated with all new files etc.
|
||||
|
||||
* test.pl: Renamed to oldtest.pl, to avoid "make test" to fail.
|
||||
|
||||
1999-08-16 Kevin McCarthy <kmccarth@perldap.org> and Leif Hedstrom
|
||||
|
||||
* API.xs: Cleaned most all the memory allocation changes, we are
|
||||
changing it to use the LDAP_OPT_MEMALLOC_FN_PTRS option in the
|
||||
C-SDK instead (much cleaner!).
|
||||
(perldap_init): New function, set up the memory management
|
||||
handlers. This is called when the API module is loaded.
|
||||
(perldap_malloc): New function, our memory management method(s).
|
||||
(perldap_calloc): Ditto.
|
||||
(perldap_realloc): Ditto.
|
||||
(perldap_free): Ditto.
|
||||
|
||||
1999-08-16 Kevin McCarthy <kmccarth@perldap.org>
|
||||
|
||||
* API.xs: Cleaned up prototypes, changed strdup() to use a
|
||||
Perl'ified version, change a number of free()'s to use Safefree.
|
||||
(ldap_value_free_perl): New function, similar to
|
||||
ldap_mods_free_perl(), to avoid memory problems (on NT and
|
||||
ActivePerl primarily).
|
||||
(StrDup): New function, to handle strdup() calls in a safe way.
|
||||
(ber_bvfree_perl): Ditto.
|
||||
(ber_bvecfree_perl): Ditto.
|
||||
|
||||
1999-08-15 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* API.xs (ldap_mods_free_perl): Modified version of
|
||||
ldap_mods_free(), which uses Perl native free method instead of
|
||||
the things from the LDAP SDK. This fixes some nasty issues with
|
||||
Windows/NT and ActiveState Perl. Woohoo!!!
|
||||
|
||||
1999-08-14 Leif Hedstrom <leif@netscape.com> and Kevin McCarthy
|
||||
|
||||
* Entry.pm (setValues): Implemented bug fix for bug id 7131, where
|
||||
the "_save_" structures weren't set properly when using setValues().
|
||||
|
||||
1999-08-14 Kevin McCarthy <kmccarth@perldap.org>
|
||||
|
||||
* Conn.pm (update): Rewrote to optimize add/remove vs replace
|
||||
operations. Basically, we'll try to do whatever seems to be the
|
||||
smallest amount of work for the LDAP server now.
|
||||
|
||||
1999-08-13 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Makefile.PL: Cleaned up code, and added support for linking in
|
||||
the missing libraries need for some missing symbols.
|
||||
|
||||
1999-08-13 Michelle Wyner <mwyner@netscape.com>
|
||||
|
||||
* Entry.pm: Updated documentation, and cleaned it up.
|
||||
|
||||
* Conn.pm: Ditto.
|
||||
|
||||
1999-08-12 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (move): Changed name, was rename(), is now move().
|
||||
|
||||
1999-08-10 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (setValues): Renamed, used to be setValue(), which is
|
||||
now an alias to setValues().
|
||||
(getValues): New method, to get the array of values.
|
||||
(STORE): Fixed tests around DN handling, making sure it's not
|
||||
treated as an array. I also optimized a couple of tests, since we
|
||||
now filter out "DN" earlier in the funtion(s).
|
||||
(attrModified): Ditto.
|
||||
(attrClean): Ditto.
|
||||
(unRemove): Ditto.
|
||||
(removeValue): Ditto.
|
||||
(addValue): Ditto.
|
||||
|
||||
1999-08-08 Leif Hedstrom <leif@netscape.com> and Kevin McCarthy
|
||||
|
||||
* Entry.pm (setValue): Remove _delete_ flag, if set.
|
||||
|
||||
* Conn.pm (close): Fixed memory leak, moved code from the DESTROY
|
||||
method over here.
|
||||
(DESTROY): Call the close() method.
|
||||
(getErrorCode): We now return LDAP_SUCCESS if there is no LDAP
|
||||
connection handle.
|
||||
(getErrorString): Ditto.
|
||||
|
||||
* Entry.pm (STORE): Bug fix for large attribute sets.
|
||||
(attrModified): Ditto.
|
||||
(removeValue): Ditto.
|
||||
(addValue): Ditto.
|
||||
(EXISTS): Fix for bug 4368, cleaning up the code, and avoid the
|
||||
double calls.
|
||||
|
||||
1999-08-06 Leif Hedstrom <leif@netscape.com> and Kevin McCarthy
|
||||
|
||||
* API.xs: Added some more tests around free() statements. These
|
||||
are most likely never triggered, but better safe than sorrow (and
|
||||
the overhead of testing this is insignificant).
|
||||
|
||||
* Conn.pm (browse): Added this function, to make it easy to browse
|
||||
an entry.
|
||||
(compare): Compare an attribute value against a DN/entry, without
|
||||
having to do the search.
|
||||
|
||||
* Entry.pm (removeValue): Fixed loop bug.
|
||||
(addValue): Ditto.
|
||||
(hasValue): Ditto.
|
||||
(matchValue): Fixed loop bug, and also missing normalization in
|
||||
half of the case statement.
|
||||
(rename): Added this new method, to rename attributes.
|
||||
(copy): Added, to copy attributes.
|
||||
|
||||
* Merged v1.2.3 with v1.3 branch.
|
||||
|
||||
1999-08-06 Kevin McCarthy <kmccarth@perldap.org>
|
||||
|
||||
* Entry.pm (addDNValue): Bug fix, index for norm was wrong.
|
||||
|
||||
* Entry.pm (size): Optimzied for performance.
|
||||
|
||||
1999-07-25 Kevin McCarthy <kmccarth@perldap.org>
|
||||
|
||||
* API.xs: Fixed memory allocation problems in parsing and
|
||||
generating the LDAPMods structure.
|
||||
|
||||
1999-06-22 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (add): Fixed bug 3342, thanks to Kevin McCarthy for
|
||||
debugging this, and providing a patch. This fixes the problem with
|
||||
adding new entries that has binary data.
|
||||
|
||||
1999-03-23 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Changed versioning numbers for all .pm files.
|
||||
|
||||
1999-03-22 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm: Removed all _self_obj_ stuff...
|
||||
|
||||
* Conn.pm: Ditto.
|
||||
|
||||
* Conn.pm: Cleanup in use statements, and "use strict".
|
||||
(search): Avoid warnings of uninitialized variables.
|
||||
(searchURL): Ditto.
|
||||
(modifyRDN): Bugfix, we did not update the appropriate DN in the
|
||||
self object (very minor...).
|
||||
|
||||
* Entry.pm: Cleanup in use statements, and "use strict".
|
||||
(BEGIN): Added this initializer, to use the new LDIF module.
|
||||
(STORE): Fixed bug where we would not ignore the internal instance
|
||||
variables properly.
|
||||
|
||||
* Utils.pm: Cleanup in all use statements, and "use strict". Also
|
||||
enforces the VERSION control feature.
|
||||
|
||||
* Merged v1.2.1 to devel-branch-1_3, and tagged v1.3.1.
|
||||
|
||||
1999-03-21 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Checked in v1.2.1(beta).
|
||||
|
||||
1999-03-19 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (add): Fixed the code so that it will handle hash array,
|
||||
as the documentation indicates. (Pointed out by Kevin Burns).
|
||||
(add): Code cleanup in the add() method.
|
||||
|
||||
1999-03-18 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm: Changed back some of the "my" definitions, to make
|
||||
sure arrays are properly reset.
|
||||
(setValue): Added the _modified_ flag, from Stephen P. Schaefer
|
||||
<stephen@networks.com>.
|
||||
(addValue): Bug fix, when calling delete, and then
|
||||
addValue(). From Stephen P. Schaefer as well.
|
||||
|
||||
* Conn.pm: Ditto. This fixes the bug where qsearch/printLDIF()
|
||||
would print multiple values.
|
||||
|
||||
1999-03-12 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm: Changed docs for modifyRDN(), it was wrong...
|
||||
|
||||
1999-03-11 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (new): Added this method, so that "new ...::Entry" will
|
||||
work as expected.
|
||||
|
||||
1999-03-09 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm: Tons of changes to handling the save/modified/deleted
|
||||
attribute values.
|
||||
(DESTROY): Added this destructor again, this time it does seem to
|
||||
help quite a lot! Whoohoo...
|
||||
|
||||
* Conn.pm (update): Bug fix for bug #2530, keeping sort order for
|
||||
attribute values.
|
||||
|
||||
1999-03-08 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (unRemove): Bug fix, this was terribly horked, please
|
||||
let's try it to make sure it works...
|
||||
|
||||
* Conn.pm (newEntry): Bug fix, forgot to give it the self_obj
|
||||
member value... Sigh.
|
||||
|
||||
1999-03-05 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (DELETE): We now handle the event that someone tries to
|
||||
delete an internal attribute.
|
||||
|
||||
* Conn.pm (update): Bug: We forgot to test for existance of
|
||||
"_save_" before trying to loop over it.
|
||||
|
||||
* Entry.pm (attrClean): Added this method, to make it easier to
|
||||
reset the internal state of en Entry. This is used primarily by
|
||||
the Conn.pm package.
|
||||
(unRemove): Bug Fix: $selfl changed to $self...
|
||||
|
||||
1999-02-28 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (matchValue): Added support for the normalization,
|
||||
which should have been done before... Bug #2854.
|
||||
|
||||
* Conn.pm (printError): Changed to use ldap_err2string instead of
|
||||
ldap_perror.
|
||||
|
||||
* Utils.pm (ldapArgs): Changed "root" to "base" in the LD
|
||||
structure.
|
||||
(userCredentials): Ditto.
|
||||
|
||||
* Conn.pm: Changed documentation to reflect the "base/root"
|
||||
change.
|
||||
|
||||
1999-01-06 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (nextEntry): Fixed (tried to fix...) the bug with
|
||||
missing attributes. I hope this will work, at a minimum I'm sure
|
||||
it won't hurt. The idea is to keep the case on the attribute type
|
||||
when requesting the values_len().
|
||||
|
||||
1999-01-11 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* API.xs: Added IF statements around all ldap_value_free() calls.
|
||||
|
||||
1999-01-05 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (getRes): Ooops, didn't return the appropriate
|
||||
value... :(
|
||||
(init): Changed test for LDAP_SUCCESS, to always return 0 or 1.
|
||||
(close): Ditto.
|
||||
(delete): Ditto.
|
||||
(add): Ditto.
|
||||
(modifyRDN): Ditto.
|
||||
(update): Ditto.
|
||||
(simpleAuth): Ditto.
|
||||
|
||||
* Entry.pm (NEXTKEY): Don't return the last $key if it's one that
|
||||
should be hidden.
|
||||
|
||||
* Conn.pm (newEntry): New method, to create an empty LDAP::Entry
|
||||
object. It is properly "tied" into the appropriate object.
|
||||
|
||||
1999-01-04 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (setDN): Added third optional argument, to enfoce DN
|
||||
normalization.
|
||||
(getDN): Ditto.
|
||||
(hasDNValue): Ditto.
|
||||
(matchDNValue): Ditto.
|
||||
|
||||
* Entry.pm (removeValue): Added support for DN normalization
|
||||
(optional argument).
|
||||
(addValue): Ditto
|
||||
(getDN): Ditto.
|
||||
|
||||
1998-12-31 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (DESTROY): Added this method, don't know if it actually
|
||||
makes any sense at all... :(
|
||||
|
||||
* Conn.pm (add): Use _oc_order_ to find a list of attributes, to
|
||||
avoide calling the TIEHASH methods.
|
||||
(update): Ditto.
|
||||
(ALL): Clean out some "my" definitions.
|
||||
|
||||
* Entry.pm (unRemove): New function, to undo remove opertaions on
|
||||
an attribute.
|
||||
(DELETE): Bug-fix, don't undef the attribute, it would prevent us
|
||||
from updating it properly in the Conn::update() method.
|
||||
(remove): Ditto.
|
||||
|
||||
* Conn.pm (nextEntry): Return $obj instead of blessing the %entry
|
||||
(again).
|
||||
|
||||
1998-12-25 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (POD): Changed examples from $conn -> $entry.
|
||||
|
||||
1998-12-17 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (DESTROY): undef the Perl data after doing a
|
||||
ldap_msgfree(), bug #1964.
|
||||
(search): Ditto.
|
||||
(searchURL): Ditto.
|
||||
(nextEntry): Changed the order of setting numattr, to make sure
|
||||
it's zero if we don't find anything.
|
||||
|
||||
1998-12-16 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (FIRSTKEY): Modified to honor the oc_order.
|
||||
(NEXTKEY): Ditto.
|
||||
(markModified): Made as an alias for attrModified().
|
||||
|
||||
* Conn.pm (nextEntry): Added code to handle internal counters for
|
||||
number of attributes in oc_order. This is used/needed for the
|
||||
FIRSTKEY and NEXTKEY methods in the Entry/Tie::Hash object.
|
||||
|
||||
* Entry.pm (isAttr): New method, to make sure an attribute name
|
||||
really is a valid LDAP attribute.
|
||||
(FIRSTKEY): Now we'll handle each() and keys() properly, whooohoo!
|
||||
(NEXTKEY): Ditto.
|
||||
|
||||
1998-12-15 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (isDeleted): Added new method, almost identical to isModified().
|
||||
(EXISTS): New method, to implement the EXISTS functionality.
|
||||
|
||||
* API.xs (RET_CPP): Test for NULL pointers, bug #1387.
|
||||
(RET_BVPP): Ditto.
|
||||
|
||||
* Utils.pm (ldapArgs): Fixed bug where "-s 0" would not be honored
|
||||
(I'm an idiot, OK?).
|
||||
|
||||
1998-12-14 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (getRes): New method, to return the internal result message.
|
||||
(getLD): Use defined() around test for existence.
|
||||
|
||||
1998-12-11 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (new): Make sure binddn and bindpasswd are set to the
|
||||
empty string unless specified.
|
||||
(init): Make sure certdb is defined before trying to use it.
|
||||
(setDefaultRebindProc): Added default auth method, unless
|
||||
explicitly specified.
|
||||
|
||||
* Utils.pm (askPassword): Added support for Term::ReadKey.
|
||||
(askPassword): Moved the eval "use ..." here.
|
||||
(userCredentials): Removed verbose print statement.
|
||||
(askPassword): Added an optional argument to print a prompt;
|
||||
|
||||
* Conn.pm (setDefaultRebindProc): Added a default "auth" value, if
|
||||
not provided in the call.
|
||||
|
||||
1998-12-04 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Makefile.PL: Modified so that "silent" install will actually
|
||||
echo what options it's setting.
|
||||
It will now croak() if the SDK dir specified doesn't exist.
|
||||
|
||||
* INSTALL: Updated to reflect new v1.1 stuff. Added links to the
|
||||
FAQ.
|
||||
|
||||
* README: Ditto. Also changed some of the binary install
|
||||
information, which might not be useful anyways...
|
||||
|
||||
* Makefile.PL: Added "filters" to remove .dll and .sl from shared
|
||||
libraries when creating link options. I also replaced the code to
|
||||
put the valid library extensions into a variable (bug #1344).
|
||||
|
||||
* Makefile.PL: Fixed some crap with the config parsing, and ENV
|
||||
handling (for silent installs).
|
||||
|
||||
1998-12-03 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (update): Bug fix, now we empty the hash array before
|
||||
examining changed attributes (bug #1385).
|
||||
|
||||
* Makefile.PL: Added the "-nolinenumbers" XSUBS options (bug #1329).
|
||||
|
||||
1998-09-26 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (init): Cleaned out _perror() calls.
|
||||
(delete): Added support for calling delete() with an Entry::
|
||||
object as paramter.
|
||||
(new): Cleaned out some dead code for $ref.
|
||||
|
||||
* Entry.pm (setValue): New method, to avoid having to use Perl
|
||||
assignment statements to set an entire attribute value.
|
||||
|
||||
1998-09-18 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (init): Changed call to ldapssl_client_init() to pass a
|
||||
0 value as the handle pointer. This avoids a Perl compiler warning.
|
||||
|
||||
1998-09-12 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* LDIF.pm (readEntries): Changed tests for empty arguments, to use
|
||||
defined().
|
||||
|
||||
* Utils.pm (ldapArgs): Bug fix, we used the wrong option for the
|
||||
certificate (-P) when checking to set the LDAP port.
|
||||
(normalizeDN): Chagned tests for empty arguments, to use use defined().
|
||||
|
||||
* Entry.pm (STORE): Changed tests for empty arguments, to use
|
||||
defined().
|
||||
(DELETE): Ditto.
|
||||
(attrModified): Ditto.
|
||||
(isModified): Ditto.
|
||||
(remove): Ditto.
|
||||
(removeValue): Ditto.
|
||||
(addValue): Ditto.
|
||||
(hasValue): Ditto.
|
||||
(matchValue): Ditto.
|
||||
(setDN): Ditto.
|
||||
(size): Ditto.
|
||||
(exists): Ditto.
|
||||
|
||||
* Conn.pm (printError): Changed test for $str to see if it's defined.
|
||||
(delete): Cleaned up code around $dn.
|
||||
(modifyRDN): Cleaned up testes around $dn and $del.
|
||||
|
||||
1998-09-11 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (modifyRDN): We now preserve the case of the DN/RDN, but
|
||||
still treat RDNs as CIS when comparing strings.
|
||||
|
||||
1998-09-08 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (setDefaultRebindProc): Bug fix, it had the Ldapc:: crap
|
||||
stil in there... :-(.
|
||||
(simpleAuth): New method, to do simple authentication rebind.
|
||||
|
||||
1998-09-07 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Makefile.PL: Changed all <> to <STDIN>, to support command line
|
||||
arguments for MakeMaker.
|
||||
|
||||
1998-09-03 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (nextEntry): Fixed bug with case sensitivity.
|
||||
|
||||
1998-08-18 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (setDefaultRebindProc): It's back!
|
||||
Officially released PerLDAP v1.0.
|
||||
|
||||
1998-08-13 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Makefile.PL: Fixed so that automated installs works.
|
||||
|
||||
* Conn.pm (update): Fixed narly bug with ldap_modify()...
|
||||
|
||||
* All: Cleaned up some hash indexes, to make sure they are
|
||||
properly quoted, and there are no conflicts to resolve.
|
||||
|
||||
* Entry.pm (STORE): Fixed a bug with attribute names not being
|
||||
properly added to _oc_order_.
|
||||
(addValue): Ditto, added the same code as for STORE.
|
||||
|
||||
1998-08-06 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (printLDIF): Copied/modified from the Utils.pm library.
|
||||
(isModified): Added this function, thought it might be useful.
|
||||
|
||||
1998-08-03 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (modifyRDN): Fixed! It also has an option to take an
|
||||
"external" DN as an argument, if supplied.
|
||||
|
||||
1998-08-02 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (getErrorCode): Now takes two optional arguments, to
|
||||
return the match string, and extra error string. Note that these
|
||||
two arguments are pointers to strings!
|
||||
|
||||
* API.xs(ldap_get_lderrno): Fixed this function, at least it seems
|
||||
to work now...
|
||||
|
||||
* Conn.pm (getLD): Added this function, convenient way to get the
|
||||
LD from the OO layer.
|
||||
|
||||
1998-07-30 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (modifyRDN): New method, to rename the RDN of the entry.
|
||||
|
||||
* Utils.pm (answer): New function, from LdapUtils.pm.
|
||||
|
||||
* Conn.pm (delete): Fixed references to normalizeDN.
|
||||
|
||||
* Utils.pm (userCredentials): Added this function, to make it easy
|
||||
to get credentials when binding as a user.
|
||||
(normalizeDN): Fixed bugs, because of calling convention...
|
||||
|
||||
* Conn.pm (getError): Fixed bug with passing read-only argument.
|
||||
|
||||
1998-07-29 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Utils.pm (unixCrypt): Moved from my LdapUtils.pm module.
|
||||
Added askPassword to the export tag.
|
||||
|
||||
* Conn.pm (new): Added support for passing a hash array of all the
|
||||
parameters, as returned by the ldapArgs() function.
|
||||
|
||||
* Utils.pm (str2Scope): New function, for converting strings
|
||||
(subtree) to a numerical scope value (2).
|
||||
(askPassword): Ditto, ask for a password, interactively.
|
||||
(ldapArgs): Ditto, handle common LDAP command line arguments.
|
||||
|
||||
* Makefile.PL: Minor change, to do regex match on OS version for
|
||||
MSWin.
|
||||
|
||||
* Entry.pm: Changed all _XXX hash values to also end with a _,
|
||||
hence making it easier to isolate them (/^_.*_$/).
|
||||
|
||||
* Conn.pm (nextEntry): Changed to accept that the attributes are
|
||||
now arrays, not pointers to arrays. We still consider them as
|
||||
pointers internally though, it's cleaner API.
|
||||
|
||||
* API.pm: Changed to use the native Exporter function to export
|
||||
tags into EXPORT_OK.
|
||||
|
||||
1998-07-22 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* LDIF.pm (readEntry): Moved from my LdapUtils.pm package.
|
||||
|
||||
* Utils.pm (printEntry): Moved from the ::Connection class, and
|
||||
marked it as "obsolete".
|
||||
(encodeBase64): Moved from my LdapUtils.pm package.
|
||||
(decodeBase64): Ditto.
|
||||
|
||||
1240
mozilla/directory/perldap/Conn.pm
Normal file
1240
mozilla/directory/perldap/Conn.pm
Normal file
File diff suppressed because it is too large
Load Diff
1205
mozilla/directory/perldap/Entry.pm
Normal file
1205
mozilla/directory/perldap/Entry.pm
Normal file
File diff suppressed because it is too large
Load Diff
98
mozilla/directory/perldap/INSTALL
Normal file
98
mozilla/directory/perldap/INSTALL
Normal file
@@ -0,0 +1,98 @@
|
||||
PerLDAP installation instructions
|
||||
==================================
|
||||
|
||||
Building this package is fairly straight forward, but requires some
|
||||
knowledge about using compilers and compiler tools on your system. If you
|
||||
are uncomfortable using these tools, we recommend you get one of the
|
||||
prebuilt binary distributions instead.
|
||||
|
||||
|
||||
Prerequisites
|
||||
=============
|
||||
|
||||
In order to build the module, you'll need
|
||||
|
||||
- Perl, version 5.003 or later. We definitely recommend you to use
|
||||
v5.004 or later.
|
||||
|
||||
- An ANSI-C compiler, e.g. gcc-2.x, or Visual C++ 5.0.
|
||||
|
||||
- The LDAP client libraries and include files, e.g. the SDK from
|
||||
Netscape Communications. See the README file for information on
|
||||
retrieving binaries.
|
||||
|
||||
You can download (or CVS checkout) the Directory SDK source, see further
|
||||
information available on
|
||||
|
||||
http://www.mozilla.org/directory/
|
||||
|
||||
and the FAQ at
|
||||
|
||||
http://www.mozilla.org/directory/faq/perldap-faq.html
|
||||
|
||||
|
||||
|
||||
Building
|
||||
========
|
||||
|
||||
This package uses the normal Perl5 MakeMaker installation system. To
|
||||
generate a Makefile appropriate for your platform, run perl on the
|
||||
provided Makefile.PL script, e.g.
|
||||
|
||||
% perl Makefile.PL
|
||||
|
||||
|
||||
You might have to use the command `perl5' or `perl-5.004', depending on
|
||||
how you installed Perl-5. The script will now ask you a few questions to
|
||||
find the necessary library and include files. A typical configuration
|
||||
session is
|
||||
|
||||
data 195% perl5 Makefile.PL
|
||||
|
||||
PerLDAP - Perl 5 Module for LDAP
|
||||
================================
|
||||
Directory containing 'include' and 'lib' directory of the Netscape
|
||||
LDAP Software Developer Kit (default: /usr): /opt/ldapsdk3
|
||||
Using LDAPv3 Developer Kit (default: yes)?
|
||||
Include SSL Support (default: yes)?
|
||||
Libraries to link with (default: -L/opt/pkg/ldapsdk3/lib -lldapssl30):
|
||||
Checking if your kit is complete...
|
||||
Looks good
|
||||
Writing Makefile for Mozilla::LDAP::API
|
||||
|
||||
|
||||
|
||||
The important question is where your LDAP SDK is installed, in the example
|
||||
above the base directory is /opt/ldapsdk3. This directory should have two
|
||||
subdirectories, named "lib" and "include". If you installed the SDK in the
|
||||
standard /usr hierarchy, use the default value as provided by the install
|
||||
script.
|
||||
|
||||
Assuming you get no errors or warning, proceed with the build and install:
|
||||
|
||||
% make
|
||||
% make install
|
||||
|
||||
|
||||
That should be it!
|
||||
|
||||
|
||||
Automated Configuration and Installs
|
||||
====================================
|
||||
|
||||
The Makefile.PL script also honors a set of environment variables to make
|
||||
it possible to do configuration and installs non-interactively. The
|
||||
variables are
|
||||
|
||||
LDAPSDKDIR - Full path to the C SDK base directory
|
||||
LDAPV3ON - Set to "N" to diable LDAP v3 (on by default)
|
||||
LDAPSDKSSL - Set to "N" to disable SSL (SSL is default)
|
||||
|
||||
|
||||
With these variables set, you will not be asked any of the questions above
|
||||
(but it will echo the paramaters). Just run the Makefile.PL script, and
|
||||
finish the build, e.g.
|
||||
|
||||
% perl5 Makefile.PL
|
||||
% make
|
||||
% make install
|
||||
1231
mozilla/directory/perldap/LDIF.pm
Normal file
1231
mozilla/directory/perldap/LDIF.pm
Normal file
File diff suppressed because it is too large
Load Diff
40
mozilla/directory/perldap/MANIFEST
Normal file
40
mozilla/directory/perldap/MANIFEST
Normal file
@@ -0,0 +1,40 @@
|
||||
ChangeLog
|
||||
API.pm
|
||||
API.xs
|
||||
MANIFEST
|
||||
Makefile.PL
|
||||
constant.h
|
||||
oldtest.pl
|
||||
typemap
|
||||
Entry.pm
|
||||
Conn.pm
|
||||
LDIF.pm
|
||||
Utils.pm
|
||||
README
|
||||
INSTALL
|
||||
CREDITS
|
||||
RELEASE
|
||||
MPL-1.0.txt
|
||||
test_api/search.pl
|
||||
test_api/write.pl
|
||||
test_api/api.pl
|
||||
t/conn.pl
|
||||
t/entry.pl
|
||||
t/ChangeLog
|
||||
t/api.t
|
||||
t/conn.t
|
||||
t/entry.t
|
||||
t/ldif.t
|
||||
t/utils.t
|
||||
examples/ChangeLog
|
||||
examples/lfinger.pl
|
||||
examples/qsearch.pl
|
||||
examples/monitor.pl
|
||||
examples/ldappasswd.pl
|
||||
examples/rmentry.pl
|
||||
examples/tabdump.pl
|
||||
examples/modattr.pl
|
||||
examples/rename.pl
|
||||
examples/psoftsync.pl
|
||||
examples/changes2ldif.pl
|
||||
examples/rand_mods.pl
|
||||
360
mozilla/directory/perldap/MPL-1.0.txt
Normal file
360
mozilla/directory/perldap/MPL-1.0.txt
Normal file
@@ -0,0 +1,360 @@
|
||||
MOZILLA PUBLIC LICENSE
|
||||
Version 1.0
|
||||
|
||||
----------------
|
||||
|
||||
1. Definitions.
|
||||
|
||||
1.1. ``Contributor'' means each entity that creates or contributes to
|
||||
the creation of Modifications.
|
||||
|
||||
1.2. ``Contributor Version'' means the combination of the Original
|
||||
Code, prior Modifications used by a Contributor, and the Modifications
|
||||
made by that particular Contributor.
|
||||
|
||||
1.3. ``Covered Code'' means the Original Code or Modifications or the
|
||||
combination of the Original Code and Modifications, in each case
|
||||
including portions thereof.
|
||||
|
||||
1.4. ``Electronic Distribution Mechanism'' means a mechanism generally
|
||||
accepted in the software development community for the electronic
|
||||
transfer of data.
|
||||
|
||||
1.5. ``Executable'' means Covered Code in any form other than Source
|
||||
Code.
|
||||
|
||||
1.6. ``Initial Developer'' means the individual or entity identified as
|
||||
the Initial Developer in the Source Code notice required by Exhibit A.
|
||||
|
||||
1.7. ``Larger Work'' means a work which combines Covered Code or
|
||||
portions thereof with code not governed by the terms of this License.
|
||||
|
||||
1.8. ``License'' means this document.
|
||||
|
||||
1.9. ``Modifications'' means any addition to or deletion from the
|
||||
substance or structure of either the Original Code or any previous
|
||||
Modifications. When Covered Code is released as a series of files, a
|
||||
Modification is:
|
||||
|
||||
A. Any addition to or deletion from the contents of a file
|
||||
containing Original Code or previous Modifications.
|
||||
|
||||
B. Any new file that contains any part of the Original Code or
|
||||
previous Modifications.
|
||||
|
||||
1.10. ``Original Code'' means Source Code of computer software code
|
||||
which is described in the Source Code notice required by Exhibit A as
|
||||
Original Code, and which, at the time of its release under this License
|
||||
is not already Covered Code governed by this License.
|
||||
|
||||
1.11. ``Source Code'' means the preferred form of the Covered Code for
|
||||
making modifications to it, including all modules it contains, plus any
|
||||
associated interface definition files, scripts used to control
|
||||
compilation and installation of an Executable, or a list of source code
|
||||
differential comparisons against either the Original Code or another
|
||||
well known, available Covered Code of the Contributor's choice. The
|
||||
Source Code can be in a compressed or archival form, provided the
|
||||
appropriate decompression or de-archiving software is widely available
|
||||
for no charge.
|
||||
|
||||
1.12. ``You'' means an individual or a legal entity exercising rights
|
||||
under, and complying with all of the terms of, this License or a future
|
||||
version of this License issued under Section 6.1. For legal entities,
|
||||
``You'' includes any entity which controls, is controlled by, or is
|
||||
under common control with You. For purposes of this definition,
|
||||
``control'' means (a) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (b) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares or beneficial ownership of such entity.
|
||||
|
||||
2. Source Code License.
|
||||
|
||||
2.1. The Initial Developer Grant.
|
||||
The Initial Developer hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license, subject to third party intellectual property
|
||||
claims:
|
||||
|
||||
(a) to use, reproduce, modify, display, perform, sublicense and
|
||||
distribute the Original Code (or portions thereof) with or without
|
||||
Modifications, or as part of a Larger Work; and
|
||||
|
||||
(b) under patents now or hereafter owned or controlled by Initial
|
||||
Developer, to make, have made, use and sell (``Utilize'') the
|
||||
Original Code (or portions thereof), but solely to the extent that
|
||||
any such patent is reasonably necessary to enable You to Utilize
|
||||
the Original Code (or portions thereof) and not to any greater
|
||||
extent that may be necessary to Utilize further Modifications or
|
||||
combinations.
|
||||
|
||||
2.2. Contributor Grant.
|
||||
Each Contributor hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license, subject to third party intellectual property
|
||||
claims:
|
||||
|
||||
(a) to use, reproduce, modify, display, perform, sublicense and
|
||||
distribute the Modifications created by such Contributor (or
|
||||
portions thereof) either on an unmodified basis, with other
|
||||
Modifications, as Covered Code or as part of a Larger Work; and
|
||||
|
||||
(b) under patents now or hereafter owned or controlled by
|
||||
Contributor, to Utilize the Contributor Version (or portions
|
||||
thereof), but solely to the extent that any such patent is
|
||||
reasonably necessary to enable You to Utilize the Contributor
|
||||
Version (or portions thereof), and not to any greater extent that
|
||||
may be necessary to Utilize further Modifications or combinations.
|
||||
|
||||
3. Distribution Obligations.
|
||||
|
||||
3.1. Application of License.
|
||||
The Modifications which You create or to which You contribute are
|
||||
governed by the terms of this License, including without limitation
|
||||
Section 2.2. The Source Code version of Covered Code may be distributed
|
||||
only under the terms of this License or a future version of this
|
||||
License released under Section 6.1, and You must include a copy of this
|
||||
License with every copy of the Source Code You distribute. You may not
|
||||
offer or impose any terms on any Source Code version that alters or
|
||||
restricts the applicable version of this License or the recipients'
|
||||
rights hereunder. However, You may include an additional document
|
||||
offering the additional rights described in Section 3.5.
|
||||
|
||||
3.2. Availability of Source Code.
|
||||
Any Modification which You create or to which You contribute must be
|
||||
made available in Source Code form under the terms of this License
|
||||
either on the same media as an Executable version or via an accepted
|
||||
Electronic Distribution Mechanism to anyone to whom you made an
|
||||
Executable version available; and if made available via Electronic
|
||||
Distribution Mechanism, must remain available for at least twelve (12)
|
||||
months after the date it initially became available, or at least six
|
||||
(6) months after a subsequent version of that particular Modification
|
||||
has been made available to such recipients. You are responsible for
|
||||
ensuring that the Source Code version remains available even if the
|
||||
Electronic Distribution Mechanism is maintained by a third party.
|
||||
|
||||
3.3. Description of Modifications.
|
||||
You must cause all Covered Code to which you contribute to contain a
|
||||
file documenting the changes You made to create that Covered Code and
|
||||
the date of any change. You must include a prominent statement that the
|
||||
Modification is derived, directly or indirectly, from Original Code
|
||||
provided by the Initial Developer and including the name of the Initial
|
||||
Developer in (a) the Source Code, and (b) in any notice in an
|
||||
Executable version or related documentation in which You describe the
|
||||
origin or ownership of the Covered Code.
|
||||
|
||||
3.4. Intellectual Property Matters
|
||||
|
||||
(a) Third Party Claims.
|
||||
If You have knowledge that a party claims an intellectual property
|
||||
right in particular functionality or code (or its utilization
|
||||
under this License), you must include a text file with the source
|
||||
code distribution titled ``LEGAL'' which describes the claim and
|
||||
the party making the claim in sufficient detail that a recipient
|
||||
will know whom to contact. If you obtain such knowledge after You
|
||||
make Your Modification available as described in Section 3.2, You
|
||||
shall promptly modify the LEGAL file in all copies You make
|
||||
available thereafter and shall take other steps (such as notifying
|
||||
appropriate mailing lists or newsgroups) reasonably calculated to
|
||||
inform those who received the Covered Code that new knowledge has
|
||||
been obtained.
|
||||
|
||||
(b) Contributor APIs.
|
||||
If Your Modification is an application programming interface and
|
||||
You own or control patents which are reasonably necessary to
|
||||
implement that API, you must also include this information in the
|
||||
LEGAL file.
|
||||
|
||||
3.5. Required Notices.
|
||||
You must duplicate the notice in Exhibit A in each file of the Source
|
||||
Code, and this License in any documentation for the Source Code, where
|
||||
You describe recipients' rights relating to Covered Code. If You
|
||||
created one or more Modification(s), You may add your name as a
|
||||
Contributor to the notice described in Exhibit A. If it is not possible
|
||||
to put such notice in a particular Source Code file due to its
|
||||
structure, then you must include such notice in a location (such as a
|
||||
relevant directory file) where a user would be likely to look for such
|
||||
a notice. You may choose to offer, and to charge a fee for, warranty,
|
||||
support, indemnity or liability obligations to one or more recipients
|
||||
of Covered Code. However, You may do so only on Your own behalf, and
|
||||
not on behalf of the Initial Developer or any Contributor. You must
|
||||
make it absolutely clear than any such warranty, support, indemnity or
|
||||
liability obligation is offered by You alone, and You hereby agree to
|
||||
indemnify the Initial Developer and every Contributor for any liability
|
||||
incurred by the Initial Developer or such Contributor as a result of
|
||||
warranty, support, indemnity or liability terms You offer.
|
||||
|
||||
3.6. Distribution of Executable Versions.
|
||||
You may distribute Covered Code in Executable form only if the
|
||||
requirements of Section 3.1-3.5 have been met for that Covered Code,
|
||||
and if You include a notice stating that the Source Code version of the
|
||||
Covered Code is available under the terms of this License, including a
|
||||
description of how and where You have fulfilled the obligations of
|
||||
Section 3.2. The notice must be conspicuously included in any notice in
|
||||
an Executable version, related documentation or collateral in which You
|
||||
describe recipients' rights relating to the Covered Code. You may
|
||||
distribute the Executable version of Covered Code under a license of
|
||||
Your choice, which may contain terms different from this License,
|
||||
provided that You are in compliance with the terms of this License and
|
||||
that the license for the Executable version does not attempt to limit
|
||||
or alter the recipient's rights in the Source Code version from the
|
||||
rights set forth in this License. If You distribute the Executable
|
||||
version under a different license You must make it absolutely clear
|
||||
that any terms which differ from this License are offered by You alone,
|
||||
not by the Initial Developer or any Contributor. You hereby agree to
|
||||
indemnify the Initial Developer and every Contributor for any liability
|
||||
incurred by the Initial Developer or such Contributor as a result of
|
||||
any such terms You offer.
|
||||
|
||||
3.7. Larger Works.
|
||||
You may create a Larger Work by combining Covered Code with other code
|
||||
not governed by the terms of this License and distribute the Larger
|
||||
Work as a single product. In such a case, You must make sure the
|
||||
requirements of this License are fulfilled for the Covered Code.
|
||||
|
||||
4. Inability to Comply Due to Statute or Regulation.
|
||||
|
||||
If it is impossible for You to comply with any of the terms of this
|
||||
License with respect to some or all of the Covered Code due to statute
|
||||
or regulation then You must: (a) comply with the terms of this License
|
||||
to the maximum extent possible; and (b) describe the limitations and
|
||||
the code they affect. Such description must be included in the LEGAL
|
||||
file described in Section 3.4 and must be included with all
|
||||
distributions of the Source Code. Except to the extent prohibited by
|
||||
statute or regulation, such description must be sufficiently detailed
|
||||
for a recipient of ordinary skill to be able to understand it.
|
||||
|
||||
5. Application of this License.
|
||||
|
||||
This License applies to code to which the Initial Developer has
|
||||
attached the notice in Exhibit A, and to related Covered Code.
|
||||
|
||||
6. Versions of the License.
|
||||
|
||||
6.1. New Versions.
|
||||
Netscape Communications Corporation (``Netscape'') may publish revised
|
||||
and/or new versions of the License from time to time. Each version will
|
||||
be given a distinguishing version number.
|
||||
|
||||
6.2. Effect of New Versions.
|
||||
Once Covered Code has been published under a particular version of the
|
||||
License, You may always continue to use it under the terms of that
|
||||
version. You may also choose to use such Covered Code under the terms
|
||||
of any subsequent version of the License published by Netscape. No one
|
||||
other than Netscape has the right to modify the terms applicable to
|
||||
Covered Code created under this License.
|
||||
|
||||
6.3. Derivative Works.
|
||||
If you create or use a modified version of this License (which you may
|
||||
only do in order to apply it to code which is not already Covered Code
|
||||
governed by this License), you must (a) rename Your license so that the
|
||||
phrases ``Mozilla'', ``MOZILLAPL'', ``MOZPL'', ``Netscape'', ``NPL'' or
|
||||
any confusingly similar phrase do not appear anywhere in your license
|
||||
and (b) otherwise make it clear that your version of the license
|
||||
contains terms which differ from the Mozilla Public License and
|
||||
Netscape Public License. (Filling in the name of the Initial Developer,
|
||||
Original Code or Contributor in the notice described in Exhibit A shall
|
||||
not of themselves be deemed to be modifications of this License.)
|
||||
|
||||
7. DISCLAIMER OF WARRANTY.
|
||||
|
||||
COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS,
|
||||
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
|
||||
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
|
||||
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
|
||||
IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
|
||||
YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
|
||||
COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
|
||||
OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
|
||||
ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
|
||||
|
||||
8. TERMINATION.
|
||||
|
||||
This License and the rights granted hereunder will terminate
|
||||
automatically if You fail to comply with terms herein and fail to cure
|
||||
such breach within 30 days of becoming aware of the breach. All
|
||||
sublicenses to the Covered Code which are properly granted shall
|
||||
survive any termination of this License. Provisions which, by their
|
||||
nature, must remain in effect beyond the termination of this License
|
||||
shall survive.
|
||||
|
||||
9. LIMITATION OF LIABILITY.
|
||||
|
||||
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
|
||||
(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL
|
||||
DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
|
||||
OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER
|
||||
PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
|
||||
OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF
|
||||
GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND
|
||||
ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE
|
||||
BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
|
||||
LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
|
||||
RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
|
||||
PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
|
||||
EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT
|
||||
EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
|
||||
|
||||
10. U.S. GOVERNMENT END USERS.
|
||||
|
||||
The Covered Code is a ``commercial item,'' as that term is defined in
|
||||
48 C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer
|
||||
software'' and ``commercial computer software documentation,'' as such
|
||||
terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
|
||||
C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
|
||||
all U.S. Government End Users acquire Covered Code with only those
|
||||
rights set forth herein.
|
||||
|
||||
11. MISCELLANEOUS.
|
||||
|
||||
This License represents the complete agreement concerning subject
|
||||
matter hereof. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent
|
||||
necessary to make it enforceable. This License shall be governed by
|
||||
California law provisions (except to the extent applicable law, if any,
|
||||
provides otherwise), excluding its conflict-of-law provisions. With
|
||||
respect to disputes in which at least one party is a citizen of, or an
|
||||
entity chartered or registered to do business in, the United States of
|
||||
America: (a) unless otherwise agreed in writing, all disputes relating
|
||||
to this License (excepting any dispute relating to intellectual
|
||||
property rights) shall be subject to final and binding arbitration,
|
||||
with the losing party paying all costs of arbitration; (b) any
|
||||
arbitration relating to this Agreement shall be held in Santa Clara
|
||||
County, California, under the auspices of JAMS/EndDispute; and (c) any
|
||||
litigation relating to this Agreement shall be subject to the
|
||||
jurisdiction of the Federal Courts of the Northern District of
|
||||
California, with venue lying in Santa Clara County, California, with
|
||||
the losing party responsible for costs, including without limitation,
|
||||
court costs and reasonable attorneys fees and expenses. The application
|
||||
of the United Nations Convention on Contracts for the International
|
||||
Sale of Goods is expressly excluded. Any law or regulation which
|
||||
provides that the language of a contract shall be construed against the
|
||||
drafter shall not apply to this License.
|
||||
|
||||
12. RESPONSIBILITY FOR CLAIMS.
|
||||
|
||||
Except in cases where another Contributor has failed to comply with
|
||||
Section 3.4, You are responsible for damages arising, directly or
|
||||
indirectly, out of Your utilization of rights under this License, based
|
||||
on the number of copies of Covered Code you made available, the
|
||||
revenues you received from utilizing such rights, and other relevant
|
||||
factors. You agree to work with affected parties to distribute
|
||||
responsibility on an equitable basis.
|
||||
|
||||
EXHIBIT A.
|
||||
|
||||
``The contents of this file are subject to the Mozilla Public License
|
||||
Version 1.0 (the "License"); you may not use this file except in
|
||||
compliance with the License. You may obtain a copy of the License at
|
||||
http://www.mozilla.org/MPL/
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS"
|
||||
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific language governing rights and limitations
|
||||
under the License.
|
||||
|
||||
The Original Code is ______________________________________.
|
||||
|
||||
The Initial Developer of the Original Code is ________________________.
|
||||
Portions created by ______________________ are Copyright (C) ______
|
||||
_______________________. All Rights Reserved.
|
||||
|
||||
Contributor(s): ______________________________________.''
|
||||
194
mozilla/directory/perldap/Makefile.PL
Normal file
194
mozilla/directory/perldap/Makefile.PL
Normal file
@@ -0,0 +1,194 @@
|
||||
#############################################################################
|
||||
# $Id: Makefile.PL,v 1.14.2.6 1999-08-17 23:43:55 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# The Makefile "source".
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use ExtUtils::MakeMaker;
|
||||
use Config;
|
||||
use Carp;
|
||||
|
||||
$perlpath = $Config{'perlpath'};
|
||||
$osname = $Config{'osname'};
|
||||
|
||||
$ldapsdk_loc = $ENV{"LDAPSDKDIR"}; # Full Path to C SDK Top-Level
|
||||
$ldapsdk_ssl = $ENV{"LDAPSDKSSL"}; # N to exclude SSL
|
||||
$ldapsdk_ver = $ENV{"LDAPV3ON"}; # N to exclude LDAP v3 features
|
||||
|
||||
$libexts = "so|sl|a|lib";
|
||||
|
||||
|
||||
print "\nPerLDAP - Perl 5 Module for LDAP\n";
|
||||
print "================================\n";
|
||||
|
||||
$silent = 1;
|
||||
print "Directory containing 'include' and 'lib' directory of the Netscape\n";
|
||||
print "LDAP Software Developer Kit (default: /usr): ";
|
||||
if (!$ldapsdk_loc)
|
||||
{
|
||||
$silent = 0;
|
||||
chomp ($ldapsdk_loc = <STDIN>);
|
||||
$ldapsdk_loc = "/usr" unless $ldapsdk_loc =~ /\S/;
|
||||
} else {
|
||||
print "$ldapsdk_loc\n";
|
||||
}
|
||||
croak("Directory $ldapsdk_loc does not exist!") unless -d $ldapsdk_loc;
|
||||
|
||||
if ($osname =~ /mswin/i)
|
||||
{
|
||||
$dir_sep = "\\";
|
||||
} else {
|
||||
$dir_sep = "/";
|
||||
}
|
||||
|
||||
$include_ldap = $ldapsdk_loc . $dir_sep . "include";
|
||||
$lib_ldap = $ldapsdk_loc . $dir_sep . "lib";
|
||||
|
||||
print "Using LDAPv3 Developer Kit (default: yes)? ";
|
||||
if (!$ldapsdk_ver)
|
||||
{
|
||||
$silent = 0;
|
||||
chomp ($ldapsdk_ver = <STDIN>);
|
||||
} else {
|
||||
print "YES\n";
|
||||
}
|
||||
$v3_def = "-DLDAPV3" unless ($ldapsdk_ver =~ /^n/i);
|
||||
|
||||
|
||||
print "Include SSL Support (default: yes)? ";
|
||||
if (!$ldapsdk_ssl)
|
||||
{
|
||||
$silent = 0;
|
||||
chomp ($ldapsdk_ssl = <STDIN>);
|
||||
} else {
|
||||
print "YES\n";
|
||||
}
|
||||
$ssl_def = "-DUSE_SSL" unless ($ldapsdk_ssl =~ /^n/i);
|
||||
|
||||
|
||||
opendir(DIR,$lib_ldap);
|
||||
@files = grep{/ldap|lber/} readdir(DIR);
|
||||
closedir(DIR);
|
||||
|
||||
if (!((@ldaplib = grep{/ldapssl.*\.($libexts)$/} @files) && $ssl_def))
|
||||
{
|
||||
@ldaplib = grep{/ldap.*\.($libexts)$/} @files;
|
||||
@lberlib = grep{/lber.*\.($libexts)$/} @files;
|
||||
}
|
||||
|
||||
if ($#ldaplib < 0)
|
||||
{
|
||||
die "No LDAP libraries found.";
|
||||
}
|
||||
|
||||
if ($#ldaplib > 0)
|
||||
{
|
||||
print "Located multiple libraries:\n";
|
||||
foreach $alib (@ldaplib)
|
||||
{
|
||||
print " - $alib\n";
|
||||
}
|
||||
}
|
||||
|
||||
$lline_ldap = $ldaplib[0];
|
||||
$lline_ldap =~ s/^lib//;
|
||||
$lline_ldap =~ s/\.($libexts)$//;
|
||||
$lline = "-L$lib_ldap -l$lline_ldap";
|
||||
|
||||
if ($#lberlib >= 0 && $lline =~ /ldap$/)
|
||||
{
|
||||
$lline_lber = $lberlib[0];
|
||||
$lline_lber =~ s/^lib//;
|
||||
$lline_lber =~ s/\.($libexts)$//;
|
||||
$lline .= " -l$lline_lber";
|
||||
}
|
||||
|
||||
print "Libraries to link with (default: $lline): ";
|
||||
if (!$silent)
|
||||
{
|
||||
chomp ($lib_line = <STDIN>);
|
||||
$lib_line = $lline unless $lib_line =~ /\S/;
|
||||
} else {
|
||||
print "\n";
|
||||
}
|
||||
|
||||
|
||||
# Include directories etc.
|
||||
$my_includes = "";
|
||||
$my_includes .= " -I$include_ldap" unless ($include_ldap eq "/usr/include");
|
||||
|
||||
|
||||
# Add system dependant stuff here...
|
||||
@extras = ();
|
||||
if ($osname =~ /mswin/i)
|
||||
{
|
||||
$my_extlib = "$lib_ldap\\$ldaplib[0]";
|
||||
$my_extlib .= " $lib_ldap\\$lberlib[0]" if $lber_lib;
|
||||
push(@extras, 'dynamic_lib' => {
|
||||
'OTHERLDFLAGS' => "kernel32.lib oldnames.lib" });
|
||||
} else {
|
||||
$my_extlib = "";
|
||||
}
|
||||
|
||||
push(@extras,
|
||||
CAPI => 'TRUE')
|
||||
if ($] >= 5.005 and $^O eq 'MSWin32'
|
||||
and $Config{archname} =~ /-object\b/i);
|
||||
|
||||
push(@extras,
|
||||
ABSTRACT => 'Perl methods for LDAP C API calls',
|
||||
AUTHOR => 'Netscape Communications Corp., Inc. and Clayton Donley')
|
||||
if ($] >= 5.005);
|
||||
|
||||
#
|
||||
# Ok, let's do it!
|
||||
#
|
||||
WriteMakefile(
|
||||
'NAME' => 'Mozilla::LDAP::API',
|
||||
'DISTNAME' => 'PerLDAP',
|
||||
'VERSION_FROM' => 'API.pm',
|
||||
'INC' => $my_includes,
|
||||
'LIBS' => [$lib_line],
|
||||
'MYEXTLIB' => $my_extlib,
|
||||
'DEFINE' => "$v3_def $ssl_def",
|
||||
'XSOPT' => "-nolinenumbers",
|
||||
@extras
|
||||
);
|
||||
|
||||
|
||||
#
|
||||
# Generate a "make HTML" target
|
||||
#
|
||||
sub MY::postamble
|
||||
{
|
||||
'
|
||||
.SUFFIXES: .pm .html
|
||||
.PHONY: html
|
||||
|
||||
.pm.html:
|
||||
pod2html --netscape $< > $@
|
||||
|
||||
html: Entry.html Conn.html Utils.html API.html LDIF.html $(FIRST_MAKEFILE)
|
||||
@rm -f pod2html-itemcache pod2html-dircache
|
||||
'
|
||||
}
|
||||
131
mozilla/directory/perldap/README
Normal file
131
mozilla/directory/perldap/README
Normal file
@@ -0,0 +1,131 @@
|
||||
#############################################################################
|
||||
# #
|
||||
# PerLDAP v1.4 - A Perl Developers' Kit for LDAP #
|
||||
# #
|
||||
#############################################################################
|
||||
|
||||
|
||||
What is PerLDAP?
|
||||
================
|
||||
|
||||
PerLDAP is a set of modules written in Perl and C that allow developers to
|
||||
leverage their existing Perl knowledge to easily access and manage LDAP-
|
||||
enabled directories. PerLDAP makes it very easy to search, add, delete,
|
||||
and modify directory entries. For example, Perl developers can easily
|
||||
build web applications to access information stored in a directory or
|
||||
create directory sync tools between directories and other services.
|
||||
|
||||
PerLDAP is an open source development project, the result of a joint effort
|
||||
between Netscape and Clayton Donley, an open source developer. PerLDAP
|
||||
currently provides the basic functions to allow Perl users to access and
|
||||
manipulate directories easily. Based on developer feedback and
|
||||
involvement, PerLDAP will continue to evolve to include additional
|
||||
functionality in future releases.
|
||||
|
||||
|
||||
Compiling the PerLDAP Sources
|
||||
=============================
|
||||
|
||||
The source to PerLDAP is available on the Mozilla site at:
|
||||
|
||||
http://www.mozilla.org/directory/
|
||||
|
||||
You can either retrieve the .tar/zip file with the source distribution, or
|
||||
use CVS to checkout the module directly. The name of the CVS module is
|
||||
PerLDAP, and it checks out the directory
|
||||
|
||||
mozilla/directory/perldap
|
||||
|
||||
Further instructions for using CVS and Mozilla is available at
|
||||
|
||||
http://www.mozilla.org/cvs.html
|
||||
|
||||
and an FAQ for PerLDAP is at
|
||||
|
||||
http://www.mozilla.org/directory/faq/perldap-faq.html
|
||||
|
||||
|
||||
Instructions for building the source can be found in the INSTALL file
|
||||
in the source distribution. The latest stable release of PerLDAP is
|
||||
v1.4, the next version is planned to be v2.0 (development continues on the
|
||||
v1.9 development branch).
|
||||
|
||||
|
||||
Getting Started
|
||||
===============
|
||||
|
||||
Documentation for this module is in standard Perl 'pod' format. HTML
|
||||
versions of this documentation can also be found on the Netscape DevEdge
|
||||
site at: http://developer.netscape.com/tech/directory/.
|
||||
|
||||
Additionally, many good examples can be found in the 'examples' directory.
|
||||
|
||||
|
||||
Modules and Examples Included
|
||||
=============================
|
||||
|
||||
Mozilla::LDAP::API - Low level interface between Perl and the LDAP C API
|
||||
Mozilla::LDAP::Entry - Perl methods for manipulating entry objects
|
||||
Mozilla::LDAP::Conn - Perl methods for performing LDAP operations
|
||||
Mozilla::LDAP::LDIF - Perl methods for utilizing LDIF
|
||||
Mozilla::LDAP::Utils - Some convenient LDAP related utilities
|
||||
test_api/search.pl - Tests low level API search calls
|
||||
test_api/write.pl - Tests low level API write calls
|
||||
test_api/api.pl - Tests ALL low level LDAPv2 calls
|
||||
examples/lfinger.pl - LDAP version of the regular Unix finger command.
|
||||
examples/qsearch.pl - Simple ldapsearch replacement.
|
||||
examples/monitor.pl - Retrieve status information from an LDAP server.
|
||||
examples/ldappasswd.pl - Change the LDAP password for a user.
|
||||
examples/rmentry.pl - Remove an entire entry from the database.
|
||||
examples/rename.pl - Rename (modRDN) an entry.
|
||||
examples/tabdump.pl - Dump LDAP information into a tab separated file.
|
||||
examples/psoftsync.pl - Synchronize LDAP with a PeopleSoft "dump" file.
|
||||
|
||||
|
||||
All examples support the "standard" LDAP command line options, which are
|
||||
|
||||
-h hostname LDAP server name
|
||||
-p port # LDAP port, default is 389 (or 636 for SSL)
|
||||
-b base DN LDAP Base-DN
|
||||
-D bind DN LDAP bind DN (connect to server as this "user")
|
||||
-w bind pswd Password to bind to the server
|
||||
-P certfile Use SSL, with the publick keys from this file
|
||||
|
||||
|
||||
Note that the examples currently only support Simple Authentication
|
||||
(passwords), the Client Authentication features (using certificates) will
|
||||
be used in the next release. All examples also honors the environment
|
||||
variable LDAP_BASEDN, set it to your systems base DN, e.g.
|
||||
|
||||
% setenv LDAP_BASEDN 'dc=netscape,dc=com'
|
||||
|
||||
or for Bourne shell
|
||||
|
||||
# LDAP_BASEDN='dc=netscape,dc=com'; export LDAP_BASEDN
|
||||
|
||||
|
||||
Reporting problems and bugs
|
||||
===========================
|
||||
|
||||
Address all bug reports and comments to the Mozilla newsgroups at:
|
||||
|
||||
news://news.mozilla.org/netscape.public.mozilla.directory
|
||||
|
||||
|
||||
License/Copyright
|
||||
=================
|
||||
|
||||
Portions by Netscape (c) Copyright 1998 Netscape Communications Corp, Inc.
|
||||
Portions by Clayton Donley (c) Copyright 1998 Clayton Donley
|
||||
|
||||
Please read the MPL-1.0.txt file included for information on the Mozilla
|
||||
Public License, which covers all files in this distribution.
|
||||
|
||||
Known Bugs
|
||||
==========
|
||||
|
||||
There are a number of issues still outstanding at the time of release. Most
|
||||
of these are already in the process of being resolved.
|
||||
|
||||
- The Rebind operation on NT does NOT work properly when set to a Perl
|
||||
function. This is being investigated.
|
||||
79
mozilla/directory/perldap/RELEASE
Normal file
79
mozilla/directory/perldap/RELEASE
Normal file
@@ -0,0 +1,79 @@
|
||||
#############################################################################
|
||||
# #
|
||||
# PerLDAP Release Notes #
|
||||
# #
|
||||
#############################################################################
|
||||
|
||||
VERSION 1.4 - AUGUST 18, 1999
|
||||
=============================
|
||||
|
||||
This is primarily a bug fix release, however there are 5 new methods
|
||||
introduced as well. Brief descriptions follow in this document. To get
|
||||
full examples and a larger summary, see the PerLDAP Programmer's Guide.
|
||||
|
||||
|
||||
New Methods Added
|
||||
-----------------
|
||||
|
||||
Entry.pm:
|
||||
* getValues() - returns the array of values.
|
||||
* move() - move one attribute to another, and delete the original.
|
||||
* copy() - copy one attribute to another.
|
||||
|
||||
Conn.pm:
|
||||
* browse() - makes it easy to browse an entry.
|
||||
* compare() - compare an attribute value against a DN/entry
|
||||
without having to do the search.
|
||||
|
||||
|
||||
Bug Fixes and other changes
|
||||
---------------------------
|
||||
|
||||
Entry.pm:
|
||||
* addDNValue() - fixed wrong index for norm.
|
||||
* matchValue() - fixed missing normalization in half of case statement.
|
||||
* setValue() - remove _delete_ flag if set, fix for saving state.
|
||||
* STORE - fixed not ignoring the internal instance variables properly.
|
||||
* Fixed numerous bugs for large attribute sets.
|
||||
* Fixed bug 4368 ("exists vs. EXISTS").
|
||||
* Fixed several loop bugs.
|
||||
* Removed all _self_obj_ references, it's obsolete in this
|
||||
version.
|
||||
* We support each() and keys() now on the Entry object, to loop
|
||||
through all attribute names (types).
|
||||
|
||||
|
||||
Conn.pm:
|
||||
* close() - fixed memory leak.
|
||||
* modifyRDN() - fixed problem where we weren't updating the
|
||||
appropriate DN in the self object.
|
||||
* Fixed bug 3342 (problems adding entries with binary data).
|
||||
* getErrorCode()/getErrorString() - return LDAP_SUCCESS if no
|
||||
LDAP connection handle.
|
||||
* add() - fixed code to handle hash array as docs indicate.
|
||||
* update() - optimization for "replace" vs "add/delete", we try to
|
||||
use whatever LDAPMod is most efficient.
|
||||
|
||||
LDIF.pm:
|
||||
|
||||
* Complete rewrite, by John Kristian <kristian@netscape.com>.
|
||||
|
||||
API.xs:
|
||||
* Fixed memory allocation problems, replacing all memory management
|
||||
routines. This solves all known issues with ActiveState Perl.
|
||||
* More safety checks around calls to *_free().
|
||||
|
||||
|
||||
Miscellaneous
|
||||
-------------
|
||||
|
||||
* Various other optimizations on tests and such.
|
||||
* Fixed most (all?) known memory leaks.
|
||||
* Fixed a lot of problems with Makefile.PL, adding some new targets
|
||||
(like "make html"). Add a skeleton to "make test".
|
||||
* Fixed numerous small bugs, as reported to Mozilla.
|
||||
* We produce less warnings now, and try to "use strict" when
|
||||
appropriate.
|
||||
* We have a new versioning scheme, conforming to standard
|
||||
Perl. We'll change this again when Perl's new versioning system
|
||||
is in place (allowing versions like 1.2.3).
|
||||
387
mozilla/directory/perldap/Utils.pm
Normal file
387
mozilla/directory/perldap/Utils.pm
Normal file
@@ -0,0 +1,387 @@
|
||||
#############################################################################
|
||||
# $Id: Utils.pm,v 1.11.2.6 1999-08-19 23:11:46 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Lots of Useful Little Utilities, for LDAP related operations.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
package Mozilla::LDAP::Utils;
|
||||
|
||||
use Mozilla::LDAP::API 1.4 qw(:constant);
|
||||
use Mozilla::LDAP::Conn;
|
||||
use Exporter;
|
||||
|
||||
use strict;
|
||||
use vars qw($VERSION @ISA %EXPORT_TAGS);
|
||||
|
||||
@ISA = qw(Exporter);
|
||||
$VERSION = "1.4";
|
||||
|
||||
%EXPORT_TAGS = (
|
||||
all => [qw(normalizeDN
|
||||
isUrl
|
||||
printEntry
|
||||
printentry
|
||||
encodeBase64
|
||||
decodeBase64
|
||||
str2Scope
|
||||
askPassword
|
||||
ldapArgs
|
||||
unixCrypt
|
||||
userCredentials
|
||||
answer)]
|
||||
);
|
||||
|
||||
|
||||
# Add Everything in %EXPORT_TAGS to @EXPORT_OK
|
||||
Exporter::export_ok_tags('all');
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Normalize the DN string (first argument), and return the new, normalized,
|
||||
# string (DN). This is useful to make sure that two syntactically
|
||||
# identical DNs compare (eq) as the same string.
|
||||
#
|
||||
sub normalizeDN
|
||||
{
|
||||
my ($dn) = @_;
|
||||
my (@vals);
|
||||
|
||||
return "" unless (defined($dn) && ($dn ne ""));
|
||||
|
||||
@vals = Mozilla::LDAP::API::ldap_explode_dn(lc $dn, 0);
|
||||
|
||||
return join(",", @vals);
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Checks if a string is a properly formed LDAP URL.
|
||||
#
|
||||
sub isURL
|
||||
{
|
||||
return ldap_is_ldap_url($_[0]);
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Print an entry, in LDIF format. This is sort of obsolete, we encourage
|
||||
# you to use the :;LDAP::LDIF class instead.
|
||||
#
|
||||
sub printEntry
|
||||
{
|
||||
my $entry = $_[0];
|
||||
my ($attr);
|
||||
|
||||
local $_;
|
||||
|
||||
print "dn: ", $entry->{"dn"},"\n";
|
||||
foreach $attr (@{$entry->{"_oc_order_"}})
|
||||
{
|
||||
next if ($attr =~ /^_.+_$/);
|
||||
next if $entry->{"_${attr}_deleted_"};
|
||||
foreach (@{$entry->{$attr}})
|
||||
{
|
||||
print "$attr: $_\n";
|
||||
}
|
||||
}
|
||||
|
||||
print "\n";
|
||||
}
|
||||
*printentry = \*printEntry;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Perform Base64 encoding, this is based on MIME::Base64.pm, written
|
||||
# by Gisle Aas <gisle@aas.no>. If possible, use the MIME:: package instead.
|
||||
#
|
||||
sub encodeBase64
|
||||
{
|
||||
my ($res) = "";
|
||||
my ($eol) = "$_[1]";
|
||||
my ($padding);
|
||||
|
||||
pos($_[0]) = 0; # ensure start at the beginning
|
||||
while ($_[0] =~ /(.{1,45})/gs) {
|
||||
$res .= substr(pack('u', $1), 1);
|
||||
chop($res);
|
||||
}
|
||||
|
||||
$res =~ tr|` -_|AA-Za-z0-9+/|; # `# help emacs
|
||||
$padding = (3 - length($_[0]) % 3) % 3;
|
||||
$res =~ s/.{$padding}$/'=' x $padding/e if $padding;
|
||||
|
||||
if (length $eol) {
|
||||
$res =~ s/(.{1,76})/$1$eol/g;
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Perform Base64 decoding, this is based on MIME::Base64.pm, written
|
||||
# by Gisle Aas <gisle@aas.no>. If possible, use the MIME:: package instead.
|
||||
#
|
||||
sub decodeBase64
|
||||
{
|
||||
my ($str) = shift;
|
||||
my ($res) = "";
|
||||
my ($len);
|
||||
|
||||
$str =~ tr|A-Za-z0-9+=/||cd;
|
||||
Carp::croak("Base64 decoder requires string length to be a multiple of 4")
|
||||
if length($str) % 4;
|
||||
|
||||
$str =~ s/=+$//; # remove padding
|
||||
$str =~ tr|A-Za-z0-9+/| -_|; # convert to uuencoded format
|
||||
while ($str =~ /(.{1,60})/gs)
|
||||
{
|
||||
$len = chr(32 + length($1)*3/4);
|
||||
$res .= unpack("u", $len . $1 ); # uudecode
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Convert a "human" readable string to an LDAP scope value
|
||||
#
|
||||
sub str2Scope
|
||||
{
|
||||
my ($str) = $_[0];
|
||||
|
||||
return $str if ($str =~ /^[0-9]+$/);
|
||||
|
||||
if ($str =~ /^sub/i)
|
||||
{
|
||||
return LDAP_SCOPE_SUBTREE;
|
||||
}
|
||||
elsif ($str =~ /^base/i)
|
||||
{
|
||||
return LDAP_SCOPE_BASE;
|
||||
}
|
||||
elsif ($str =~ /^one/i)
|
||||
{
|
||||
return LDAP_SCOPE_ONELEVEL;
|
||||
}
|
||||
|
||||
# Default...
|
||||
return LDAP_SCOPE_SUBTREE;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Ask for a password, without displaying it on the TTY.
|
||||
#
|
||||
sub askPassword
|
||||
{
|
||||
my ($prompt) = $_[0];
|
||||
my ($hasReadKey) = 0;
|
||||
|
||||
eval "use Term::ReadKey";
|
||||
$hasReadKey=1 unless ($@);
|
||||
|
||||
print "LDAP password: " if $prompt;
|
||||
if ($hasReadKey)
|
||||
{
|
||||
ReadMode(2);
|
||||
chop($_ = ReadLine(0));
|
||||
ReadMode(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
system('/bin/stty -echo');
|
||||
chop($_ = <STDIN>);
|
||||
system('/bin/stty echo');
|
||||
}
|
||||
print "\n";
|
||||
|
||||
return $_;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Handle some standard LDAP options, and construct a nice little structure
|
||||
# that we can use later on. We really should have some appropriate defaults,
|
||||
# perhaps from an Mozilla::LDAP::Config module.
|
||||
#
|
||||
sub ldapArgs
|
||||
{
|
||||
my ($bind, $base) = @_;
|
||||
my (%ld);
|
||||
|
||||
$main::opt_v = $main::opt_n if defined($main::opt_n);
|
||||
$main::opt_p = LDAPS_PORT if (!defined($main::opt_p) &&
|
||||
defined($main::opt_P) &&
|
||||
($main::opt_P ne ""));
|
||||
|
||||
$ld{"host"} = $main::opt_h || "ldap";
|
||||
$ld{"port"} = $main::opt_p || LDAP_PORT;
|
||||
$ld{"base"} = $main::opt_b || $base || $ENV{'LDAP_BASEDN'};
|
||||
$ld{"root"} = $ld{"base"};
|
||||
$ld{"bind"} = $main::opt_D || $bind || "";
|
||||
$ld{"pswd"} = $main::opt_w || "";
|
||||
$ld{"cert"} = $main::opt_P || "";
|
||||
$ld{"scope"} = (defined($main::opt_s) ? $main::opt_s : LDAP_SCOPE_SUBTREE);
|
||||
|
||||
if (($ld{"bind"} ne "") && ($ld{"pswd"} eq ""))
|
||||
{
|
||||
$ld{pswd} = askPassword(1);
|
||||
}
|
||||
|
||||
return %ld;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Create a Unix-type password, using the "crypt" function. A random salt
|
||||
# is always generated, perhaps it should be an optional argument?
|
||||
#
|
||||
sub unixCrypt
|
||||
{
|
||||
my ($ascii) =
|
||||
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
||||
my ($salt) = substr($ascii, rand(62), 1) . substr($ascii, rand(62), 1);
|
||||
|
||||
srand(time ^ $$);
|
||||
crypt($_[0], $salt);
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Try to find a user to bind as, and possibly ask for the password. Pass
|
||||
# a pointer to the hash array with LDAP parameters to this function.
|
||||
#
|
||||
sub userCredentials
|
||||
{
|
||||
my ($ld) = @_;
|
||||
my ($conn, $entry, $pswd, $search);
|
||||
|
||||
if ($ld->{"bind"} eq "")
|
||||
{
|
||||
my ($base) = $ld->{"base"} || $ld->{"root"};
|
||||
|
||||
$conn = new Mozilla::LDAP::Conn($ld);
|
||||
die "Could't connect to LDAP server " . $ld->{"host"} unless $conn;
|
||||
|
||||
$search = "(&(objectclass=inetOrgPerson)(uid=$ENV{USER}))";
|
||||
$entry = $conn->search($base, "subtree", $search, 0, ("uid"));
|
||||
return 0 if (!$entry || $conn->nextEntry());
|
||||
|
||||
$conn->close();
|
||||
$ld->{"bind"} = $entry->getDN();
|
||||
}
|
||||
|
||||
if ($ld->{"pswd"} eq "")
|
||||
{
|
||||
$ld->{"pswd"} = Mozilla::LDAP::Utils::askPassword(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Ask a Y/N question, return "Y" or "N".
|
||||
#
|
||||
sub answer
|
||||
{
|
||||
die "Default string must be Y or N."
|
||||
unless (($_[0] eq "Y") || ($_[0] eq "N"));
|
||||
|
||||
chop($_ = <STDIN>);
|
||||
|
||||
return $_[0] if /^$/;
|
||||
return "Y" if /^[yY]/;
|
||||
return "N" if /^[nN]/;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Mandatory TRUE return value.
|
||||
#
|
||||
1;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# POD documentation...
|
||||
#
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Mozilla::LDAP::Utils.pm - Collection of useful little utilities.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use Mozilla::LDAP::Utils;
|
||||
|
||||
=head1 ABSTRACT
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
|
||||
=head1 OBJECT CLASS METHODS
|
||||
|
||||
=over 13
|
||||
|
||||
=item B<normalizeDN>
|
||||
|
||||
This function will remove all extraneous white spaces in the DN, and also
|
||||
change all upper case characters to lower case. The only argument is the
|
||||
DN string to normalize, and the return value is the new, clean DN.
|
||||
|
||||
=back
|
||||
|
||||
=head1 EXAMPLES
|
||||
|
||||
There are plenty of examples to look at, in the examples directory. We are
|
||||
adding more examples every day (almost).
|
||||
|
||||
=head1 INSTALLATION
|
||||
|
||||
Installing this package is part of the Makefile supplied in the
|
||||
package. See the installation procedures which are part of this package.
|
||||
|
||||
=head1 AVAILABILITY
|
||||
|
||||
This package can be retrieved from a number of places, including:
|
||||
|
||||
http://www.mozilla.org/directory/
|
||||
Your local CPAN server
|
||||
|
||||
=head1 CREDITS
|
||||
|
||||
Most of this code was developed by Leif Hedstrom, Netscape Communications
|
||||
Corporation.
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
None. :)
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<Mozilla::LDAP::Conn>, L<Mozilla::LDAP::Entry>, L<Mozilla::LDAP::API>, and
|
||||
of course L<Perl>.
|
||||
|
||||
=cut
|
||||
954
mozilla/directory/perldap/constant.h
Normal file
954
mozilla/directory/perldap/constant.h
Normal file
@@ -0,0 +1,954 @@
|
||||
/*
|
||||
*******************************************************************************
|
||||
* $Id: constant.h,v 1.7 1998-08-13 09:14:14 leif Exp $
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License
|
||||
* Version 1.0 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS"
|
||||
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing rights and limitations
|
||||
* under the License.
|
||||
*
|
||||
* The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
* Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
* created by Netscape are Copyright (C) Netscape Communications
|
||||
* Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
* Donley. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* DESCRIPTION
|
||||
* Constants.
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#include "EXTERN.h"
|
||||
#include "perl.h"
|
||||
#include "XSUB.h"
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#include <ldap.h>
|
||||
|
||||
static int
|
||||
not_here(s)
|
||||
char *s;
|
||||
{
|
||||
croak("%s not implemented on this architecture", s);
|
||||
return -1;
|
||||
}
|
||||
|
||||
double
|
||||
constant(name, arg)
|
||||
char *name;
|
||||
int arg;
|
||||
{
|
||||
errno = 0;
|
||||
if (name[0] == 'L' && name[1] == 'D' && name[2] == 'A' && name[3] == 'P'
|
||||
&& name[4] == '_')
|
||||
{
|
||||
switch (name[5]) {
|
||||
case 'A':
|
||||
if (strEQ(name, "LDAP_ADMINLIMIT_EXCEEDED"))
|
||||
#ifdef LDAP_ADMINLIMIT_EXCEEDED
|
||||
return LDAP_ADMINLIMIT_EXCEEDED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_AFFECTS_MULTIPLE_DSAS"))
|
||||
#ifdef LDAP_AFFECTS_MULTIPLE_DSAS
|
||||
return LDAP_AFFECTS_MULTIPLE_DSAS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_ALIAS_DEREF_PROBLEM"))
|
||||
#ifdef LDAP_ALIAS_DEREF_PROBLEM
|
||||
return LDAP_ALIAS_DEREF_PROBLEM;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_ALIAS_PROBLEM"))
|
||||
#ifdef LDAP_ALIAS_PROBLEM
|
||||
return LDAP_ALIAS_PROBLEM;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_ALREADY_EXISTS"))
|
||||
#ifdef LDAP_ALREADY_EXISTS
|
||||
return LDAP_ALREADY_EXISTS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_AUTH_METHOD_NOT_SUPPORTED"))
|
||||
#ifdef LDAP_AUTH_METHOD_NOT_SUPPORTED
|
||||
return LDAP_AUTH_METHOD_NOT_SUPPORTED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_AUTH_NONE"))
|
||||
#ifdef LDAP_AUTH_NONE
|
||||
return LDAP_AUTH_NONE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_AUTH_SASL"))
|
||||
#ifdef LDAP_AUTH_SASL
|
||||
return LDAP_AUTH_SASL;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_AUTH_SIMPLE"))
|
||||
#ifdef LDAP_AUTH_SIMPLE
|
||||
return LDAP_AUTH_SIMPLE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_AUTH_UNKNOWN"))
|
||||
#ifdef LDAP_AUTH_UNKNOWN
|
||||
return LDAP_AUTH_UNKNOWN;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'B':
|
||||
if (strEQ(name, "LDAP_BUSY"))
|
||||
#ifdef LDAP_BUSY
|
||||
return LDAP_BUSY;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'C':
|
||||
if (strEQ(name, "LDAP_CACHE_CHECK"))
|
||||
#ifdef LDAP_CACHE_CHECK
|
||||
return LDAP_CACHE_CHECK;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CACHE_LOCALDB"))
|
||||
#ifdef LDAP_CACHE_LOCALDB
|
||||
return LDAP_CACHE_LOCALDB;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CACHE_POPULATE"))
|
||||
#ifdef LDAP_CACHE_POPULATE
|
||||
return LDAP_CACHE_POPULATE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CHANGETYPE_ADD"))
|
||||
#ifdef LDAP_CHANGETYPE_ADD
|
||||
return LDAP_CHANGETYPE_ADD;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CHANGETYPE_ANY"))
|
||||
#ifdef LDAP_CHANGETYPE_ANY
|
||||
return LDAP_CHANGETYPE_ANY;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CHANGETYPE_DELETE"))
|
||||
#ifdef LDAP_CHANGETYPE_DELETE
|
||||
return LDAP_CHANGETYPE_DELETE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CHANGETYPE_MODDN"))
|
||||
#ifdef LDAP_CHANGETYPE_MODDN
|
||||
return LDAP_CHANGETYPE_MODDN;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CHANGETYPE_MODIFY"))
|
||||
#ifdef LDAP_CHANGETYPE_MODIFY
|
||||
return LDAP_CHANGETYPE_MODIFY;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CLIENT_LOOP"))
|
||||
#ifdef LDAP_CLIENT_LOOP
|
||||
return LDAP_CLIENT_LOOP;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_COMPARE_FALSE"))
|
||||
#ifdef LDAP_COMPARE_FALSE
|
||||
return LDAP_COMPARE_FALSE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_COMPARE_TRUE"))
|
||||
#ifdef LDAP_COMPARE_TRUE
|
||||
return LDAP_COMPARE_TRUE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CONFIDENTIALITY_REQUIRED"))
|
||||
#ifdef LDAP_CONFIDENTIALITY_REQUIRED
|
||||
return LDAP_CONFIDENTIALITY_REQUIRED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CONNECT_ERROR"))
|
||||
#ifdef LDAP_CONNECT_ERROR
|
||||
return LDAP_CONNECT_ERROR;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CONSTRAINT_VIOLATION"))
|
||||
#ifdef LDAP_CONSTRAINT_VIOLATION
|
||||
return LDAP_CONSTRAINT_VIOLATION;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_DECODING_ERROR"))
|
||||
#ifdef LDAP_DECODING_ERROR
|
||||
return LDAP_DECODING_ERROR;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'D':
|
||||
if (strEQ(name, "LDAP_DEREF_ALWAYS"))
|
||||
#ifdef LDAP_DEREF_ALWAYS
|
||||
return LDAP_DEREF_ALWAYS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_DEREF_FINDING"))
|
||||
#ifdef LDAP_DEREF_FINDING
|
||||
return LDAP_DEREF_FINDING;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_DEREF_NEVER"))
|
||||
#ifdef LDAP_DEREF_NEVER
|
||||
return LDAP_DEREF_NEVER;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_DEREF_SEARCHING"))
|
||||
#ifdef LDAP_DEREF_SEARCHING
|
||||
return LDAP_DEREF_SEARCHING;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'E':
|
||||
if (strEQ(name, "LDAP_ENCODING_ERROR"))
|
||||
#ifdef LDAP_ENCODING_ERROR
|
||||
return LDAP_ENCODING_ERROR;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'F':
|
||||
if (strEQ(name, "LDAP_FILTER_ERROR"))
|
||||
#ifdef LDAP_FILTER_ERROR
|
||||
return LDAP_FILTER_ERROR;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_FILT_MAXSIZ"))
|
||||
#ifdef LDAP_FILT_MAXSIZ
|
||||
return LDAP_FILT_MAXSIZ;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'I':
|
||||
if (strEQ(name, "LDAP_INAPPROPRIATE_AUTH"))
|
||||
#ifdef LDAP_INAPPROPRIATE_AUTH
|
||||
return LDAP_INAPPROPRIATE_AUTH;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_INAPPROPRIATE_MATCHING"))
|
||||
#ifdef LDAP_INAPPROPRIATE_MATCHING
|
||||
return LDAP_INAPPROPRIATE_MATCHING;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_INSUFFICIENT_ACCESS"))
|
||||
#ifdef LDAP_INSUFFICIENT_ACCESS
|
||||
return LDAP_INSUFFICIENT_ACCESS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_INVALID_CREDENTIALS"))
|
||||
#ifdef LDAP_INVALID_CREDENTIALS
|
||||
return LDAP_INVALID_CREDENTIALS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_INVALID_DN_SYNTAX"))
|
||||
#ifdef LDAP_INVALID_DN_SYNTAX
|
||||
return LDAP_INVALID_DN_SYNTAX;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_INVALID_SYNTAX"))
|
||||
#ifdef LDAP_INVALID_SYNTAX
|
||||
return LDAP_INVALID_SYNTAX;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_IS_LEAF"))
|
||||
#ifdef LDAP_IS_LEAF
|
||||
return LDAP_IS_LEAF;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'L':
|
||||
if (strEQ(name, "LDAP_LOCAL_ERROR"))
|
||||
#ifdef LDAP_LOCAL_ERROR
|
||||
return LDAP_LOCAL_ERROR;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_LOOP_DETECT"))
|
||||
#ifdef LDAP_LOOP_DETECT
|
||||
return LDAP_LOOP_DETECT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'M':
|
||||
if (strEQ(name, "LDAP_MOD_ADD"))
|
||||
#ifdef LDAP_MOD_ADD
|
||||
return LDAP_MOD_ADD;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_MOD_BVALUES"))
|
||||
#ifdef LDAP_MOD_BVALUES
|
||||
return LDAP_MOD_BVALUES;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_MOD_DELETE"))
|
||||
#ifdef LDAP_MOD_DELETE
|
||||
return LDAP_MOD_DELETE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_MOD_REPLACE"))
|
||||
#ifdef LDAP_MOD_REPLACE
|
||||
return LDAP_MOD_REPLACE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_MORE_RESULTS_TO_RETURN"))
|
||||
#ifdef LDAP_MORE_RESULTS_TO_RETURN
|
||||
return LDAP_MORE_RESULTS_TO_RETURN;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_MSG_ALL"))
|
||||
#ifdef LDAP_MSG_ALL
|
||||
return LDAP_MSG_ALL;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_MSG_ONE"))
|
||||
#ifdef LDAP_MSG_ONE
|
||||
return LDAP_MSG_ONE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_MSG_RECEIVED"))
|
||||
#ifdef LDAP_MSG_RECEIVED
|
||||
return LDAP_MSG_RECEIVED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'N':
|
||||
if (strEQ(name, "LDAP_NAMING_VIOLATION"))
|
||||
#ifdef LDAP_NAMING_VIOLATION
|
||||
return LDAP_NAMING_VIOLATION;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NOT_ALLOWED_ON_NONLEAF"))
|
||||
#ifdef LDAP_NOT_ALLOWED_ON_NONLEAF
|
||||
return LDAP_NOT_ALLOWED_ON_NONLEAF;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NOT_ALLOWED_ON_RDN"))
|
||||
#ifdef LDAP_NOT_ALLOWED_ON_RDN
|
||||
return LDAP_NOT_ALLOWED_ON_RDN;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NOT_SUPPORTED"))
|
||||
#ifdef LDAP_NOT_SUPPORTED
|
||||
return LDAP_NOT_SUPPORTED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NO_LIMIT"))
|
||||
#ifdef LDAP_NO_LIMIT
|
||||
return LDAP_NO_LIMIT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NO_MEMORY"))
|
||||
#ifdef LDAP_NO_MEMORY
|
||||
return LDAP_NO_MEMORY;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NO_OBJECT_CLASS_MODS"))
|
||||
#ifdef LDAP_NO_OBJECT_CLASS_MODS
|
||||
return LDAP_NO_OBJECT_CLASS_MODS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NO_RESULTS_RETURNED"))
|
||||
#ifdef LDAP_NO_RESULTS_RETURNED
|
||||
return LDAP_NO_RESULTS_RETURNED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NO_SUCH_ATTRIBUTE"))
|
||||
#ifdef LDAP_NO_SUCH_ATTRIBUTE
|
||||
return LDAP_NO_SUCH_ATTRIBUTE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NO_SUCH_OBJECT"))
|
||||
#ifdef LDAP_NO_SUCH_OBJECT
|
||||
return LDAP_NO_SUCH_OBJECT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'O':
|
||||
if (strEQ(name, "LDAP_OBJECT_CLASS_VIOLATION"))
|
||||
#ifdef LDAP_OBJECT_CLASS_VIOLATION
|
||||
return LDAP_OBJECT_CLASS_VIOLATION;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPERATIONS_ERROR"))
|
||||
#ifdef LDAP_OPERATIONS_ERROR
|
||||
return LDAP_OPERATIONS_ERROR;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_CACHE_ENABLE"))
|
||||
#ifdef LDAP_OPT_CACHE_ENABLE
|
||||
return LDAP_OPT_CACHE_ENABLE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_CACHE_FN_PTRS"))
|
||||
#ifdef LDAP_OPT_CACHE_FN_PTRS
|
||||
return LDAP_OPT_CACHE_FN_PTRS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_CACHE_STRATEGY"))
|
||||
#ifdef LDAP_OPT_CACHE_STRATEGY
|
||||
return LDAP_OPT_CACHE_STRATEGY;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_CLIENT_CONTROLS"))
|
||||
#ifdef LDAP_OPT_CLIENT_CONTROLS
|
||||
return LDAP_OPT_CLIENT_CONTROLS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_DEREF"))
|
||||
#ifdef LDAP_OPT_DEREF
|
||||
return LDAP_OPT_DEREF;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_DESC"))
|
||||
#ifdef LDAP_OPT_DESC
|
||||
return LDAP_OPT_DESC;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_DNS"))
|
||||
#ifdef LDAP_OPT_DNS
|
||||
return LDAP_OPT_DNS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_DNS_FN_PTRS"))
|
||||
#ifdef LDAP_OPT_DNS_FN_PTRS
|
||||
return LDAP_OPT_DNS_FN_PTRS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_ERROR_NUMBER"))
|
||||
#ifdef LDAP_OPT_ERROR_NUMBER
|
||||
return LDAP_OPT_ERROR_NUMBER;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_ERROR_STRING"))
|
||||
#ifdef LDAP_OPT_ERROR_STRING
|
||||
return LDAP_OPT_ERROR_STRING;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_HOST_NAME"))
|
||||
#ifdef LDAP_OPT_HOST_NAME
|
||||
return LDAP_OPT_HOST_NAME;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_IO_FN_PTRS"))
|
||||
#ifdef LDAP_OPT_IO_FN_PTRS
|
||||
return LDAP_OPT_IO_FN_PTRS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_MEMALLOC_FN_PTRS"))
|
||||
#ifdef LDAP_OPT_MEMALLOC_FN_PTRS
|
||||
return LDAP_OPT_MEMALLOC_FN_PTRS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_PREFERRED_LANGUAGE"))
|
||||
#ifdef LDAP_OPT_PREFERRED_LANGUAGE
|
||||
return LDAP_OPT_PREFERRED_LANGUAGE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_PROTOCOL_VERSION"))
|
||||
#ifdef LDAP_OPT_PROTOCOL_VERSION
|
||||
return LDAP_OPT_PROTOCOL_VERSION;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_REBIND_ARG"))
|
||||
#ifdef LDAP_OPT_REBIND_ARG
|
||||
return LDAP_OPT_REBIND_ARG;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_REBIND_FN"))
|
||||
#ifdef LDAP_OPT_REBIND_FN
|
||||
return LDAP_OPT_REBIND_FN;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_RECONNECT"))
|
||||
#ifdef LDAP_OPT_RECONNECT
|
||||
return LDAP_OPT_RECONNECT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_REFERRALS"))
|
||||
#ifdef LDAP_OPT_REFERRALS
|
||||
return LDAP_OPT_REFERRALS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_REFERRAL_HOP_LIMIT"))
|
||||
#ifdef LDAP_OPT_REFERRAL_HOP_LIMIT
|
||||
return LDAP_OPT_REFERRAL_HOP_LIMIT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_RESTART"))
|
||||
#ifdef LDAP_OPT_RESTART
|
||||
return LDAP_OPT_RESTART;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_RETURN_REFERRALS"))
|
||||
#ifdef LDAP_OPT_RETURN_REFERRALS
|
||||
return LDAP_OPT_RETURN_REFERRALS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_SERVER_CONTROLS"))
|
||||
#ifdef LDAP_OPT_SERVER_CONTROLS
|
||||
return LDAP_OPT_SERVER_CONTROLS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_SIZELIMIT"))
|
||||
#ifdef LDAP_OPT_SIZELIMIT
|
||||
return LDAP_OPT_SIZELIMIT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_SSL"))
|
||||
#ifdef LDAP_OPT_SSL
|
||||
return LDAP_OPT_SSL;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_THREAD_FN_PTRS"))
|
||||
#ifdef LDAP_OPT_THREAD_FN_PTRS
|
||||
return LDAP_OPT_THREAD_FN_PTRS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_TIMELIMIT"))
|
||||
#ifdef LDAP_OPT_TIMELIMIT
|
||||
return LDAP_OPT_TIMELIMIT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OTHER"))
|
||||
#ifdef LDAP_OTHER
|
||||
return LDAP_OTHER;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'P':
|
||||
if (strEQ(name, "LDAP_PARAM_ERROR"))
|
||||
#ifdef LDAP_PARAM_ERROR
|
||||
return LDAP_PARAM_ERROR;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_PARTIAL_RESULTS"))
|
||||
#ifdef LDAP_PARTIAL_RESULTS
|
||||
return LDAP_PARTIAL_RESULTS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_PORT"))
|
||||
#ifdef LDAP_PORT
|
||||
return LDAP_PORT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_PORT_MAX"))
|
||||
#ifdef LDAP_PORT_MAX
|
||||
return LDAP_PORT_MAX;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_PROTOCOL_ERROR"))
|
||||
#ifdef LDAP_PROTOCOL_ERROR
|
||||
return LDAP_PROTOCOL_ERROR;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'R':
|
||||
if (strEQ(name, "LDAP_REFERRAL"))
|
||||
#ifdef LDAP_REFERRAL
|
||||
return LDAP_REFERRAL;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_REFERRAL_LIMIT_EXCEEDED"))
|
||||
#ifdef LDAP_REFERRAL_LIMIT_EXCEEDED
|
||||
return LDAP_REFERRAL_LIMIT_EXCEEDED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RESULTS_TOO_LARGE"))
|
||||
#ifdef LDAP_RESULTS_TOO_LARGE
|
||||
return LDAP_RESULTS_TOO_LARGE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_ADD"))
|
||||
#ifdef LDAP_RES_ADD
|
||||
return LDAP_RES_ADD;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_ANY"))
|
||||
#ifdef LDAP_RES_ANY
|
||||
return LDAP_RES_ANY;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_BIND"))
|
||||
#ifdef LDAP_RES_BIND
|
||||
return LDAP_RES_BIND;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_COMPARE"))
|
||||
#ifdef LDAP_RES_COMPARE
|
||||
return LDAP_RES_COMPARE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_DELETE"))
|
||||
#ifdef LDAP_RES_DELETE
|
||||
return LDAP_RES_DELETE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_EXTENDED"))
|
||||
#ifdef LDAP_RES_EXTENDED
|
||||
return LDAP_RES_EXTENDED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_MODIFY"))
|
||||
#ifdef LDAP_RES_MODIFY
|
||||
return LDAP_RES_MODIFY;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_MODRDN"))
|
||||
#ifdef LDAP_RES_MODRDN
|
||||
return LDAP_RES_MODRDN;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_RENAME"))
|
||||
#ifdef LDAP_RES_RENAME
|
||||
return LDAP_RES_RENAME;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_SEARCH_ENTRY"))
|
||||
#ifdef LDAP_RES_SEARCH_ENTRY
|
||||
return LDAP_RES_SEARCH_ENTRY;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_SEARCH_REFERENCE"))
|
||||
#ifdef LDAP_RES_SEARCH_REFERENCE
|
||||
return LDAP_RES_SEARCH_REFERENCE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_SEARCH_RESULT"))
|
||||
#ifdef LDAP_RES_SEARCH_RESULT
|
||||
return LDAP_RES_SEARCH_RESULT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'S':
|
||||
if (strEQ(name, "LDAP_SASL_BIND_IN_PROGRESS"))
|
||||
#ifdef LDAP_SASL_BIND_IN_PROGRESS
|
||||
return LDAP_SASL_BIND_IN_PROGRESS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SASL_SIMPLE"))
|
||||
#ifdef LDAP_SASL_SIMPLE
|
||||
return LDAP_SASL_SIMPLE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SCOPE_BASE"))
|
||||
#ifdef LDAP_SCOPE_BASE
|
||||
return LDAP_SCOPE_BASE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SCOPE_ONELEVEL"))
|
||||
#ifdef LDAP_SCOPE_ONELEVEL
|
||||
return LDAP_SCOPE_ONELEVEL;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SCOPE_SUBTREE"))
|
||||
#ifdef LDAP_SCOPE_SUBTREE
|
||||
return LDAP_SCOPE_SUBTREE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SECURITY_NONE"))
|
||||
#ifdef LDAP_SECURITY_NONE
|
||||
return LDAP_SECURITY_NONE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SERVER_DOWN"))
|
||||
#ifdef LDAP_SERVER_DOWN
|
||||
return LDAP_SERVER_DOWN;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SIZELIMIT_EXCEEDED"))
|
||||
#ifdef LDAP_SIZELIMIT_EXCEEDED
|
||||
return LDAP_SIZELIMIT_EXCEEDED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SORT_CONTROL_MISSING"))
|
||||
#ifdef LDAP_SORT_CONTROL_MISSING
|
||||
return LDAP_SORT_CONTROL_MISSING;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_STRONG_AUTH_NOT_SUPPORTED"))
|
||||
#ifdef LDAP_STRONG_AUTH_NOT_SUPPORTED
|
||||
return LDAP_STRONG_AUTH_NOT_SUPPORTED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_STRONG_AUTH_REQUIRED"))
|
||||
#ifdef LDAP_STRONG_AUTH_REQUIRED
|
||||
return LDAP_STRONG_AUTH_REQUIRED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SUCCESS"))
|
||||
#ifdef LDAP_SUCCESS
|
||||
return LDAP_SUCCESS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'T':
|
||||
if (strEQ(name, "LDAP_TIMELIMIT_EXCEEDED"))
|
||||
#ifdef LDAP_TIMELIMIT_EXCEEDED
|
||||
return LDAP_TIMELIMIT_EXCEEDED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_TIMEOUT"))
|
||||
#ifdef LDAP_TIMEOUT
|
||||
return LDAP_TIMEOUT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_TYPE_OR_VALUE_EXISTS"))
|
||||
#ifdef LDAP_TYPE_OR_VALUE_EXISTS
|
||||
return LDAP_TYPE_OR_VALUE_EXISTS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'U':
|
||||
if (strEQ(name, "LDAP_UNAVAILABLE"))
|
||||
#ifdef LDAP_UNAVAILABLE
|
||||
return LDAP_UNAVAILABLE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_UNAVAILABLE_CRITICAL_EXTENSION"))
|
||||
#ifdef LDAP_UNAVAILABLE_CRITICAL_EXTENSION
|
||||
return LDAP_UNAVAILABLE_CRITICAL_EXTENSION;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_UNDEFINED_TYPE"))
|
||||
#ifdef LDAP_UNDEFINED_TYPE
|
||||
return LDAP_UNDEFINED_TYPE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_UNWILLING_TO_PERFORM"))
|
||||
#ifdef LDAP_UNWILLING_TO_PERFORM
|
||||
return LDAP_UNWILLING_TO_PERFORM;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_URL_ERR_BADSCOPE"))
|
||||
#ifdef LDAP_URL_ERR_BADSCOPE
|
||||
return LDAP_URL_ERR_BADSCOPE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_URL_ERR_MEM"))
|
||||
#ifdef LDAP_URL_ERR_MEM
|
||||
return LDAP_URL_ERR_MEM;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_URL_ERR_NODN"))
|
||||
#ifdef LDAP_URL_ERR_NODN
|
||||
return LDAP_URL_ERR_NODN;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_URL_ERR_NOTLDAP"))
|
||||
#ifdef LDAP_URL_ERR_NOTLDAP
|
||||
return LDAP_URL_ERR_NOTLDAP;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_URL_ERR_PARAM"))
|
||||
#ifdef LDAP_URL_ERR_PARAM
|
||||
return LDAP_URL_ERR_PARAM;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_URL_OPT_SECURE"))
|
||||
#ifdef LDAP_URL_OPT_SECURE
|
||||
return LDAP_URL_OPT_SECURE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_USER_CANCELLED"))
|
||||
#ifdef LDAP_USER_CANCELLED
|
||||
return LDAP_USER_CANCELLED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'V':
|
||||
if (strEQ(name, "LDAP_VERSION"))
|
||||
#ifdef LDAP_VERSION
|
||||
return LDAP_VERSION;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_VERSION1"))
|
||||
#ifdef LDAP_VERSION1
|
||||
return LDAP_VERSION1;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_VERSION2"))
|
||||
#ifdef LDAP_VERSION2
|
||||
return LDAP_VERSION2;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_VERSION3"))
|
||||
#ifdef LDAP_VERSION3
|
||||
return LDAP_VERSION3;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_VERSION_MAX"))
|
||||
#ifdef LDAP_VERSION_MAX
|
||||
return LDAP_VERSION_MAX;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (strEQ(name, "LDAPS_PORT"))
|
||||
#ifdef LDAPS_PORT
|
||||
return LDAPS_PORT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
}
|
||||
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
|
||||
not_there:
|
||||
errno = ENOENT;
|
||||
return 0;
|
||||
}
|
||||
35
mozilla/directory/perldap/examples/ChangeLog
Normal file
35
mozilla/directory/perldap/examples/ChangeLog
Normal file
@@ -0,0 +1,35 @@
|
||||
1999-06-30 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* rmentry.pl: Added support for "-p".
|
||||
|
||||
1999-01-05 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* psoftsync.pl (delAttr): Fixed annoying bug where I missed to
|
||||
"my" $entry.
|
||||
|
||||
1999-01-04 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* modattr.pl: Bug fixes for handling bad cases better (like
|
||||
missing attribute, adding empty values etc).
|
||||
|
||||
1998-12-11 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* modattr.pl: Modified slightly to enable the rebind proc.
|
||||
|
||||
1998-08-03 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* psoftsync.pl: New file, also merged in some modules from
|
||||
LdapUtils.pm, to make sure this works. NOTE: This script currently
|
||||
doesn't work, since all "modify" operations are horked.
|
||||
|
||||
1998-07-30 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* tabdump.pl: Actually works!
|
||||
|
||||
* ldappasswd.pl: Cleaned out some code, and moved it over to the
|
||||
::Utils module.
|
||||
|
||||
1998-07-29 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* qsearch.pl: First working version.
|
||||
|
||||
118
mozilla/directory/perldap/examples/changes2ldif.pl
Executable file
118
mozilla/directory/perldap/examples/changes2ldif.pl
Executable file
@@ -0,0 +1,118 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: changes2ldif.pl,v 1.2 1999-01-21 23:52:46 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Search the changelog, and produce an LDIF file suitable for ldapmodify
|
||||
# for instance. This should be merged into LDIF.pm eventually.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
use strict;
|
||||
no strict "vars";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "changes2ldif";
|
||||
$USAGE = "$APPNAM [-nv] -b base -h host -D bind -w pswd -P cert [min [max]]";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('nvb:h:D:p:s:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
$ld{root} = "cn=changelog" if (!defined($ld{root}) || $ld{root} eq "");
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Instantiate an LDAP object, which also binds to the LDAP server.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Create the search filter.
|
||||
#
|
||||
$min = $ARGV[$[];
|
||||
$max = $ARGV[$[ + 1];
|
||||
|
||||
if ($min ne "")
|
||||
{
|
||||
if ($max ne "")
|
||||
{
|
||||
$search = "(&(changenumber>=$min)(changenumber<=$max))";
|
||||
}
|
||||
else
|
||||
{
|
||||
$search = "(changenumber>=$min)";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$search = "(changenumber=*)";
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Do the searches, and print the results.
|
||||
#
|
||||
$entry = $conn->search($ld{root}, "ONE", "$search");
|
||||
while ($entry)
|
||||
{
|
||||
print "dn: ", $entry->{targetdn}[0], "\n";
|
||||
$type = $entry->{changetype}[0];
|
||||
print "changetype: $type\n";
|
||||
if ($type =~ /modify/i)
|
||||
{
|
||||
# Should we filter out modifiersname and modifytimestamp ? We do chop
|
||||
# off the trailing \0 though.
|
||||
chop($entry->{changes}[0]);
|
||||
print $entry->{changes}[0], "\n";
|
||||
}
|
||||
elsif ($type =~ /add/i)
|
||||
{
|
||||
print $entry->{changes}[0], "\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
print "\n";
|
||||
}
|
||||
|
||||
$entry = $conn->nextEntry;
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$ld{conn}->close if $ld{conn};
|
||||
104
mozilla/directory/perldap/examples/ldappasswd.pl
Executable file
104
mozilla/directory/perldap/examples/ldappasswd.pl
Executable file
@@ -0,0 +1,104 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: ldappasswd.pl,v 1.6 1998-08-13 09:13:23 leif Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# This is an LDAP version of the normal passwd/yppasswd command found
|
||||
# on most Unix systems. Note that this will only use the {crypt}
|
||||
# encryption/hash algorithm (at this point).
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "ldappasswd";
|
||||
$USAGE = "$APPNAM [-nv] -b base -h host -D bind -w pswd -P cert search ...";
|
||||
|
||||
@ATTRIBUTES = ("uid", "userpassword");
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('nvb:s:h:D:w:P:')) {
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
Mozilla::LDAP::Utils::userCredentials(\%ld) unless $opt_n;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Ask for the new password, and confirm it's correct.
|
||||
#
|
||||
do
|
||||
{
|
||||
print "New password: ";
|
||||
$new = Mozilla::LDAP::Utils::askPassword();
|
||||
print "New password (again): ";
|
||||
$new2 = Mozilla::LDAP::Utils::askPassword();
|
||||
print "Passwords didn't match, try again!\n\n" if ($new ne $new2);
|
||||
} until ($new eq $new2);
|
||||
print "\n";
|
||||
|
||||
$crypted = Mozilla::LDAP::Utils::unixCrypt("$new");
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Now do all the searches, one by one. If there are no search criteria, we
|
||||
# will change the password for the user running the script.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
foreach $search ($#ARGV >= $[ ? @ARGV : $ld{bind})
|
||||
{
|
||||
$entry = $conn->search($search, "subtree", "ALL", 0, @ATTRIBUTES);
|
||||
$entry = $conn->search($ld{root}, "subtree", $search, 0, @ATTRIBUTES)
|
||||
unless $entry;
|
||||
print "No such user: $search\n" unless $entry;
|
||||
|
||||
while ($entry)
|
||||
{
|
||||
$entry->{userpassword} = ["{crypt}" . $crypted];
|
||||
print "Changing password for: $entry->{dn}\n" if $opt_v;
|
||||
|
||||
if (!$opt_n)
|
||||
{
|
||||
$conn->update($entry);
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
}
|
||||
|
||||
$entry = $conn->nextEntry();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
128
mozilla/directory/perldap/examples/lfinger.pl
Executable file
128
mozilla/directory/perldap/examples/lfinger.pl
Executable file
@@ -0,0 +1,128 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: lfinger.pl,v 1.10 1998-08-13 09:13:08 leif Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# "finger" version using LDAP information (using RFC 2307 objectclass).
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Constants, shouldn't have to edit these... The HIDE mechanism is a very
|
||||
# Netscape internal specific feature. We use this objectclass to mark some
|
||||
# entries to be "hidden", and some of our applications will honor this. With
|
||||
# more recent versions of the Directory Server this can be accomplished more
|
||||
# effectively with appropriate ACI/ACLs.
|
||||
#
|
||||
$APPNAM = "lfinger";
|
||||
$USAGE = "$APPNAM -m -b base -h host -D bind -w pswd -P cert user_info";
|
||||
|
||||
@ATTRIBUTES = ("uid", "cn", "homedirectory", "loginshell", "pager",
|
||||
"telephonenumber", "facsimiletelephonenumber", "mobile");
|
||||
$HIDE = "(objectclass=nscphidethis)";
|
||||
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Print a "finger" entry.
|
||||
#
|
||||
sub printIt
|
||||
{
|
||||
my($entry) = @_;
|
||||
|
||||
print "Login name: $entry->{uid}[0]";
|
||||
print " " x (39 - 11 - length($entry->{uid}[0]));
|
||||
print "In real life: $entry->{cn}[0]\n";
|
||||
if ($entry->{homedirectory}[0] || $entry->{loginshell}[0])
|
||||
{
|
||||
print "Directory: $entry->{homedirectory}[0]";
|
||||
print " " x (39 - 10 - length($entry->{homedirectory}[0]));
|
||||
print "Shell: $entry->{loginshell}[0]\n";
|
||||
}
|
||||
|
||||
if ($entry->{telephonenumber}[0] || $entry->{pager}[0])
|
||||
{
|
||||
print "Phone: $entry->{telephonenumber}[0]";
|
||||
print " " x (39 - 6 - length($entry->{telephonenumber}[0]));
|
||||
print "Pager: $entry->{pager}[0]\n";
|
||||
}
|
||||
|
||||
if ($entry->{mobile}[0] || $entry->{facsimiletelephonenumber}[0])
|
||||
{
|
||||
print "Mobile: $entry->{mobile}[0]";
|
||||
print " " x (39 - 7 - length($entry->{mobile}[0]));
|
||||
print "Fax: $entry->{facsimiletelephonenumber}[0]\n";
|
||||
}
|
||||
|
||||
print "\n";
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('mb:h:D:p:w:P:') || !defined($ARGV[$[]))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
$user=$ARGV[$[];
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Instantiate an LDAP object, which also binds to the LDAP server.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Ok, lets generate the filter, and do the search!
|
||||
#
|
||||
if ($opt_m)
|
||||
{
|
||||
$search = "(&(uid=$user)(!$HIDE))";
|
||||
}
|
||||
else
|
||||
{
|
||||
$search = "(&(|(cn=*$user*)(uid=*$user*)(telephonenumber=*$user*))(!$HIDE))";
|
||||
}
|
||||
|
||||
$entry = $conn->search($ld{root}, "subtree", $search, 0, @ATTRIBUTES);
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
|
||||
while($entry)
|
||||
{
|
||||
printIt($entry);
|
||||
$entry = $conn->nextEntry();
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
331
mozilla/directory/perldap/examples/modattr.pl
Executable file
331
mozilla/directory/perldap/examples/modattr.pl
Executable file
@@ -0,0 +1,331 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: modattr.pl,v 1.8 1999-01-21 23:52:46 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# This script can be used to do a number of different modification
|
||||
# operations on a script. Like adding/deleting values, or entire
|
||||
# attributes.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
use strict;
|
||||
no strict "vars";
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "modattr";
|
||||
$USAGE = "$APPNAM [-dnvW] -b base -h host -D bind -w pswd -P cert attr=value filter";
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('adnvWb:h:D:p:s:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
Mozilla::LDAP::Utils::userCredentials(\%ld) unless $opt_n;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Let's process the changes requested, and commit them unless the "-n"
|
||||
# option was given.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
$conn->setDefaultRebindProc($ld{bind}, $ld{pswd});
|
||||
|
||||
($change, $search) = @ARGV;
|
||||
if (($change eq "") || ($search eq ""))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
($attr, $value) = split(/=/, $change, 2);
|
||||
|
||||
$entry = $conn->search($ld{root}, $ld{scope}, $search);
|
||||
while ($entry)
|
||||
{
|
||||
$changed = 0;
|
||||
|
||||
if ($opt_d)
|
||||
{
|
||||
if (defined $entry->{$attr})
|
||||
{
|
||||
if ($value)
|
||||
{
|
||||
$changed = $entry->removeValue($attr, $value);
|
||||
if ($changed && $opt_v)
|
||||
{
|
||||
print "Removed value from ", $entry->getDN(), "\n" if $opt_v;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
delete $entry->{$attr};
|
||||
print "Deleted attribute $attr for ", $entry->getDN(), "\n" if $opt_v;
|
||||
$changed = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
print "No attribute values for: $attr\n";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!defined($value) || !$value)
|
||||
{
|
||||
print "No value provided for the attribute $attr\n";
|
||||
}
|
||||
elsif ($opt_a)
|
||||
{
|
||||
$changed = $entry->addValue($attr, $value);
|
||||
if ($changed && $opt_v)
|
||||
{
|
||||
print "Added attribute to ", $entry->getDN(), "\n" if $opt_v;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$entry->setValue($attr, $value);
|
||||
$changed = 1;
|
||||
print "Set attribute for ", $entry->getDN(), "\n" if $opt_v;
|
||||
}
|
||||
}
|
||||
if ($changed && ! $opt_n)
|
||||
{
|
||||
$conn->update($entry);
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
}
|
||||
|
||||
$entry = $conn->nextEntry();
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# POD documentation...
|
||||
#
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
modattr - Modify an attribute for one or more LDAP entries
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
modattr [-adnvW] -b base -h host -D bind DN -w pwd -P cert attr=value filter
|
||||
|
||||
=head1 ABSTRACT
|
||||
|
||||
This command line utility can be used to modify one attribute for one or
|
||||
more LDAP entries. As simple as this sounds, this turns out to be a very
|
||||
common operation. For instance, let's say you want to change "mailHost"
|
||||
for all users on a machine named I<dredd>, to be I<judge>. With this
|
||||
script all you have to do is
|
||||
|
||||
modattr mailHost=judge '(mailHost=dredd)'
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
There are four primary operations that can be made with this utility:
|
||||
|
||||
=over 4
|
||||
|
||||
=item *
|
||||
|
||||
Set an attribute to a (single) specified value.
|
||||
|
||||
=item *
|
||||
|
||||
Add a value to an attribute (for multi-value attributes).
|
||||
|
||||
=item *
|
||||
|
||||
Delete a value from an attribute. If it's the last value (or if it's a
|
||||
single value), this will remove the entire attribute.
|
||||
|
||||
=item *
|
||||
|
||||
Delete an entire attribute, even if it has multiple values.
|
||||
|
||||
=back
|
||||
|
||||
The first three requires an option of the form B<attr=value>, while the
|
||||
last one only takes the name of the attribute as the option. The last
|
||||
argument is always an LDAP search filter, specifying which entries the
|
||||
operation should be applied to.
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
All but the first two command line options for this tool are standard LDAP
|
||||
options, to set parameters for the LDAP connection. The two new options
|
||||
are I<-a> and I<-d> to add and remove attribute values.
|
||||
|
||||
Without either of these two options specified (they are both optional),
|
||||
the default action is to set the attribute to the specified value. That
|
||||
will effectively remove any existing values for this attribute.
|
||||
|
||||
=over 12
|
||||
|
||||
=item -a
|
||||
|
||||
Specify that the operation is an I<add>, to add a value to the
|
||||
attribute. If there is no existing value for this attribute, we'll create
|
||||
a new attribute, otherwise we add the new value if it's not already there.
|
||||
|
||||
=item -d
|
||||
|
||||
Delete the attribute value, or the entire attribute if there's no value
|
||||
specified. As you can see this option has two forms, and it's function
|
||||
depends on the last arguments. Be careful here, if you forget to specify
|
||||
the value to delete, you will remove all of them.
|
||||
|
||||
=item -h <host>
|
||||
|
||||
Name of the LDAP server to connect to.
|
||||
|
||||
=item -p <port>
|
||||
|
||||
TCP port for the LDAP connection.
|
||||
|
||||
=item -b <DN>
|
||||
|
||||
Base DN for the search
|
||||
|
||||
=item -D <bind>
|
||||
|
||||
User (DN) to bind as. We support a few convenience shortcuts here, like
|
||||
I<root>, I<user> and I<repl>.
|
||||
|
||||
=item -w <passwd>
|
||||
|
||||
This specifies the password to use when connecting to the LDAP
|
||||
server. This is strongly discouraged, and without this option the script
|
||||
will ask for the password interactively.
|
||||
|
||||
=item -s <scope>
|
||||
|
||||
Search scope, default is I<sub>, the other possible values are I<base> and
|
||||
I<one>. You can also specify the numeric scopes, I<0>, I<1> or I<2>.
|
||||
|
||||
=item -P
|
||||
|
||||
Use SSL for the LDAP connection, using the specified cert.db file for
|
||||
certificate information.
|
||||
|
||||
=item -n
|
||||
|
||||
Don't do anything, only show the changes that would have been made. This
|
||||
is very convenient, and can save you from embarrassing mistakes.
|
||||
|
||||
=item -v
|
||||
|
||||
Verbose output.
|
||||
|
||||
=back
|
||||
|
||||
The last two arguments are special for this script. The first
|
||||
argument specifies the attribute (and possibly the value) to operate on,
|
||||
and the last argument is a properly formed LDAP search filter.
|
||||
|
||||
=head1 EXAMPLES
|
||||
|
||||
We'll give one example for each of the four operations this script can
|
||||
currently handle. Since the script itself is quite flexible, you'll
|
||||
probably find you can use this script for a lot of other applications, or
|
||||
call it from other scripts. Note that we don't specify any LDAP specific
|
||||
options here, we assume you have configured your defaults properly.
|
||||
|
||||
To set the I<description> attribute for user "leif", you would do
|
||||
|
||||
modattr 'description=Company Swede' '(uid=leif)'
|
||||
|
||||
The examples shows how to use this command without either of the I<-a> or
|
||||
the I<-d> argument. To add an e-mail alias (alternate address) to the same
|
||||
user, you would do
|
||||
|
||||
modattr -a 'mailAlternateAddress=theSwede@netscape.com' '(uid=leif)'
|
||||
|
||||
To remove an object class from all entries which uses it, you could do
|
||||
|
||||
modattr -d 'objectclass=dummyClass' '(objectclass=dummyClass)'
|
||||
|
||||
This example is not great, since unless you've assured that no entries
|
||||
uses any of the attributes in this class, you'll get schema
|
||||
violations. But don't despair, you can use this tool to clean up all
|
||||
entries first! To completely remove all usage of an attribute named
|
||||
I<dummyAttr>, you'd simply do
|
||||
|
||||
modattr -d dummyAttr '(dummyAttr=*)'
|
||||
|
||||
This shows the final format of this command, notice how we don't specify a
|
||||
value, to assure that the entire attribute is removed. This is potentially
|
||||
dangerous, so again be careful.
|
||||
|
||||
=head1 INSTALLATION
|
||||
|
||||
In order to use this script, you'll need Perl version 5.004 or later, the
|
||||
LDAP SDK, and also the LDAP Perl module (aka PerLDAP). Once you've installed
|
||||
these packages, just copy this file to where you keep your admin binaries,
|
||||
e.g. /usr/local/bin.
|
||||
|
||||
In order to get good performance, you should make sure you have indexes on
|
||||
the attributes you typically use with this script. Our experience has been
|
||||
that in most cases the standard indexes in the Directory Server are
|
||||
sufficient, e.g. I<CN>, I<UID> and I<MAIL>.
|
||||
|
||||
=head1 AVAILABILITY
|
||||
|
||||
This package can be retrieved from a number of places, including:
|
||||
|
||||
http://www.mozilla.org/directory/
|
||||
Your local CPAN server
|
||||
|
||||
=head1 CREDITS
|
||||
|
||||
This little tool was developed internally at Netscape, by Leif Hedstrom.
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
None, of course...
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<Mozilla::LDAP::API> and L<Perl>
|
||||
|
||||
=cut
|
||||
67
mozilla/directory/perldap/examples/monitor.pl
Executable file
67
mozilla/directory/perldap/examples/monitor.pl
Executable file
@@ -0,0 +1,67 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: monitor.pl,v 1.2 1998-08-13 09:12:05 leif Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Ask the directory server for it's monitor entry, to see some
|
||||
# performance and usage stats.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "monitor";
|
||||
$USAGE = "$APPNAM [-nv] -b base -h host -D bind -w pswd -P cert";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('b:h:D:p:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs("", "cn=monitor");
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Instantiate an LDAP object, which also binds to the LDAP server, and then
|
||||
# do the simple search.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
$entry = $conn->search($ld{root}, "base", "objectclass=*");
|
||||
Mozilla::LDAP::Utils::printEntry($entry)
|
||||
if ($entry);
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
615
mozilla/directory/perldap/examples/psoftsync.pl
Executable file
615
mozilla/directory/perldap/examples/psoftsync.pl
Executable file
@@ -0,0 +1,615 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: psoftsync.pl,v 1.5 1999-01-21 23:52:47 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Synchronise some LDAP info with a PeopleSoft "dump". This "dump" file
|
||||
# is a "tab" separated file, as generated by an SQL utility on the
|
||||
# Oracle server.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Local configurations, check these out . Note that SYNCS and ORDER has to
|
||||
# have the same fields, this is because the hash array doesn't preserve
|
||||
# the order of it's entries... :-( The "codes" are bit fields, where the
|
||||
# three LSB are used as
|
||||
#
|
||||
# 1 Force the update, even if attribute is empty (i.e. delete it)
|
||||
# 2 The attribute is the base for a DN (e.g. "manager").
|
||||
# 4 The attribute should be deleted if the user is not in PeopleSoft.
|
||||
# 8 Don't warn if the attribute is missing in the Psoft file (-W option).
|
||||
# 16 Always delete this attribute in the PeopleSoft entry.
|
||||
# 32 Delete this attribute if the account has "expired".
|
||||
#
|
||||
%SYNCS = (
|
||||
"nscpharold" => 1 + 4,
|
||||
"uid" => 0,
|
||||
"" => 0,
|
||||
"" => 0,
|
||||
"employeenumber" => 1 + 4 + 32,
|
||||
"departmentnumber" => 1 + 4,
|
||||
"" => 0,
|
||||
"" => 0,
|
||||
"" => 0,
|
||||
"manager" => 1 + 2,
|
||||
"title" => 1 + 4 + 16 + 32,
|
||||
"ou" => 1 + 4 + 32,
|
||||
"businesscategory" => 1 + 4 + 32,
|
||||
"employeetype" => 0,
|
||||
"nscppersonexpdate" => 1 + 8
|
||||
);
|
||||
|
||||
@ORDER = (
|
||||
"nscpharold",
|
||||
"uid",
|
||||
"",
|
||||
"",
|
||||
"employeenumber",
|
||||
"departmentnumber",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"manager",
|
||||
"title",
|
||||
"ou",
|
||||
"businesscategory",
|
||||
"employeetype",
|
||||
"nscppersonexpdate"
|
||||
);
|
||||
|
||||
# This is used for mapping the employeeType attribute into a readable format.
|
||||
%EMPCODES = (
|
||||
"A" => "Applicant",
|
||||
"C" => "Contractor",
|
||||
"E" => "Employee",
|
||||
"O" => "OEM Partner",
|
||||
"T" => "Interim",
|
||||
"V" => "Vendor"
|
||||
);
|
||||
|
||||
# Expiration policy for other attributes, the EXPDELAY is a convenience
|
||||
# default setting.
|
||||
$EXPDELAY = 24 * 7;
|
||||
%EXPIRES = (
|
||||
"carlicense" => $EXPDELAY,
|
||||
"mailautoreplymode" => $EXPDELAY,
|
||||
"mailautoreplytext" => $EXPDELAY,
|
||||
"mailforwardingaddress" => $EXPDELAY,
|
||||
"facsimiletelephonenumber" => $EXPDELAY
|
||||
);
|
||||
|
||||
|
||||
$NOTYPE = "Unknown";
|
||||
$DELIMITER = "%%";
|
||||
$SENDMAIL = "/usr/lib/sendmail";
|
||||
|
||||
$SEARCH = "(&(uid=*)(!(objectclass=pseudoAccount)))";
|
||||
$MAILTO = "leif\@netscape.com";
|
||||
|
||||
#$LDAP_DEBUG = 1;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "psoftsync";
|
||||
$USAGE = "$APPNAM [-nvW] -b base -h host -D bind -w passwd -P cert PS_file";
|
||||
|
||||
@ATTRIBUTES = uniq(@ORDER);
|
||||
push(@ATTRIBUTES, "objectclass");
|
||||
|
||||
$TODAY = `/usr/bin/date '+%Y%m%d'`;
|
||||
chop($TODAY);
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Print an error for the PeopleSoft data. Note that we use the "__XXX__" fields
|
||||
# here, to avoid the problem when an attribute is "expired" or modified.
|
||||
#
|
||||
sub psoftError
|
||||
{
|
||||
my ($str, $entry) = @_;
|
||||
|
||||
print "Error: $str: ";
|
||||
print $entry->key(), " (";
|
||||
print $entry->{__employeenumber__}, ", ";
|
||||
print $entry->{__employeetype__}, ", ";
|
||||
print $entry->{__departmentnumber__}, ")\n";
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Read in a PeopleSoft file, and create all the entries.
|
||||
#
|
||||
sub readDump
|
||||
{
|
||||
my ($file) = @_;
|
||||
my (@info, %entries);
|
||||
my $val;
|
||||
|
||||
if (!open(PSOFT, $file))
|
||||
{
|
||||
print "Error: Can't read file $file\n";
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
while (<PSOFT>)
|
||||
{
|
||||
next unless /$DELIMITER/;
|
||||
|
||||
@info = split(/\s*%%\s*/);
|
||||
$entry = new PsoftEntry($info[$[]);
|
||||
foreach $attr (@ORDER)
|
||||
{
|
||||
$val = shift(@info);
|
||||
next if ($attr eq "");
|
||||
|
||||
$entry->add($attr, $val, $SYNCS{$attr});
|
||||
}
|
||||
#
|
||||
# Perhaps we should do some sanity checks here on the PeopleSoft data?
|
||||
#
|
||||
|
||||
# Clean up some data if the user has expired ("best before...")
|
||||
if ($entry->expired($entry->{nscppersonexpdate}))
|
||||
{
|
||||
foreach $attr (@ORDER)
|
||||
{
|
||||
next unless $attr;
|
||||
|
||||
delete($entry->{$attr}) if ($SYNCS{$attr} & 32);
|
||||
}
|
||||
}
|
||||
|
||||
if ($entry->{uid})
|
||||
{
|
||||
$entries{$entry->{uid}} = $entry;
|
||||
}
|
||||
elsif ($opt_W)
|
||||
{
|
||||
psoftError("No UID", $entry);
|
||||
}
|
||||
}
|
||||
close(PSOFT);
|
||||
|
||||
return %entries;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Make a list "uniq", just like the Unix command.
|
||||
#
|
||||
sub uniq { # uniq(elements[])
|
||||
my %tmp;
|
||||
|
||||
grep($tmp{$_}++, @_);
|
||||
return sort(keys(%tmp));
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Delete an attribute from an entry.
|
||||
#
|
||||
sub delAttr { # delAttr(ENTRY, ATTR)
|
||||
my ($entry, $attr) = @_;
|
||||
|
||||
if (defined($entry->{$attr}))
|
||||
{
|
||||
$out->write("Deleted $attr for user: $entry->{uid}[0]") if $opt_v;
|
||||
delete($entry->{$attr});
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('nvMWb:h:D:p:s:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
Mozilla::LDAP::Utils::userCredentials(\%ld) unless $opt_n;
|
||||
|
||||
$out = new Mail();
|
||||
if ($opt_M)
|
||||
{
|
||||
$out->set("to", $MAILTO);
|
||||
$out->set("subject", "Hoth: PeopleSoft synchronization report");
|
||||
}
|
||||
else
|
||||
{
|
||||
$out->echo();
|
||||
$out->nomail();
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Read in all the PeopleSoft entries, and then instantiate an LDAP object,
|
||||
# which also binds to the LDAP server.
|
||||
#
|
||||
%psoft = readDump(@ARGV[$[]);
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Now process all the users, one by one.
|
||||
#
|
||||
$entry = $conn->search($ld{root}, "subtree", $SEARCH, 0, @ATTRIBUTES);
|
||||
|
||||
while ($entry)
|
||||
{
|
||||
$uid = $entry->{"uid"}[0];
|
||||
$changed = 0;
|
||||
|
||||
$psent = $psoft{$uid};
|
||||
if (!$psent)
|
||||
{
|
||||
print "Error: LDAP user $uid: No entry in PeopleSoft\n" if $opt_W;
|
||||
foreach $attr (@ORDER)
|
||||
{
|
||||
next unless $attr;
|
||||
$changed += delAttr($entry, $attr) if ($SYNCS{$attr} & 4);
|
||||
}
|
||||
if ($entry->{employeetype}[0] ne "$NOTYPE")
|
||||
{
|
||||
$entry->{employeetype} = ["$NOTYPE"];
|
||||
$changed = 1;
|
||||
$out->write("Set employeeType to $NOTYPE for user: $uid") if $opt_v;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
$psent->handled(1);
|
||||
foreach $attr (@ORDER)
|
||||
{
|
||||
next unless $attr;
|
||||
|
||||
if (!defined($psent->{$attr}) || ($psent->{$attr} eq ""))
|
||||
{
|
||||
$changed += delAttr($entry, $attr) if ($SYNCS{$attr} & 1);
|
||||
}
|
||||
elsif ($entry->{$attr}[0] ne $psent->{$attr})
|
||||
{
|
||||
$entry->{$attr} = [$psent->{$attr}];
|
||||
$changed = 1;
|
||||
$out->write("Set $attr to $psent->{$attr} for user: $uid") if $opt_v;
|
||||
}
|
||||
}
|
||||
# Now handle the Expire date special case...
|
||||
if ($psent->expired() ne "")
|
||||
{
|
||||
if ($entry->addValue("objectclass", "nscphidethis"))
|
||||
{
|
||||
$changed = 1;
|
||||
$out->write("Expiring the user: $uid") if $opt_v;
|
||||
}
|
||||
|
||||
# Expire other attributes, IFF the expire is over a certain
|
||||
# treshhold (e.g. a week).
|
||||
}
|
||||
elsif ($entry->removeValue("objectclass", "nscphidethis"))
|
||||
{
|
||||
$changed = 1;
|
||||
$out->write("Enabling the user: $uid") if $opt_v;
|
||||
}
|
||||
}
|
||||
|
||||
$conn->update($entry) if ($changed && ! $opt_n);
|
||||
$entry = $conn->nextEntry();
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Close the LDAP connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Post process, figure out which PSoft entries have no entry in LDAP.
|
||||
#
|
||||
if ($opt_W)
|
||||
{
|
||||
foreach (keys(%psoft))
|
||||
{
|
||||
$ent=$psoft{$_};
|
||||
|
||||
psoftError("No LDAP entry", $ent) unless $ent->handled();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Package to an entry from the PeopleSoft database.
|
||||
#
|
||||
package PsoftEntry;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Creator.
|
||||
#
|
||||
sub new
|
||||
{
|
||||
my ($class, $key) = @_;
|
||||
my $self = {};
|
||||
|
||||
bless $self, ref $class || $class;
|
||||
$self->{__key__} = $key;
|
||||
|
||||
return $self;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Add an attribute/field to the entry.
|
||||
#
|
||||
sub add
|
||||
{
|
||||
my ($self, $attr, $val, $lev) = @_;
|
||||
|
||||
return if ($lev & 16);
|
||||
|
||||
$attr = lc $attr;
|
||||
if ($attr eq "employeetype")
|
||||
{
|
||||
if (defined($main::EMPCODES{$val}))
|
||||
{
|
||||
$self->{$attr} = $main::EMPCODES{$val};
|
||||
}
|
||||
else
|
||||
{
|
||||
$self->{$attr} = $main::NOTYPE;
|
||||
}
|
||||
$self->{__employeetype__} = $val;
|
||||
}
|
||||
elsif (!defined($val) || ($val eq ""))
|
||||
{
|
||||
main::psoftError("No attribute $attr", $self)
|
||||
if ($main::opt_W && ($lev & 1) && !($lev & 8));
|
||||
}
|
||||
else
|
||||
{
|
||||
$self->{$attr} = ($lev & 2) ? "uid=$val,$main::ld{root}" : $val;
|
||||
$self->{"__${attr}__"} = $val;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Return the value for an attribute/field.
|
||||
#
|
||||
sub get
|
||||
{
|
||||
my ($self, $attr) = @_;
|
||||
|
||||
return $self->{$attr};
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Mark the entry as "expired". If there is no "date" argument, we'll return
|
||||
# the current entries expire status.
|
||||
#
|
||||
sub expired
|
||||
{
|
||||
my ($self, $date) = @_;
|
||||
|
||||
if ($date)
|
||||
{
|
||||
# Only expire entries with reasonable expire dates...
|
||||
if (length($date) != 8)
|
||||
{
|
||||
main::psoftError("Bad expire date", $self) if $main::opt_W;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ($date lt $main::TODAY)
|
||||
{
|
||||
$self->{employeetype} = "$main::NOTYPE";
|
||||
$self->{__expired__} = 1;
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return $self->{__expired__};
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Mark the entry as "handled", i.e. it exists in LDAP.
|
||||
#
|
||||
sub handled
|
||||
{
|
||||
my ($self, $flag) = @_;
|
||||
|
||||
$self->{__handled__} = 1 if $flag;
|
||||
|
||||
return $self->{__handled__};
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Return the "key" of this entry, typically the name field.
|
||||
#
|
||||
sub key
|
||||
{
|
||||
my ($self) = @_;
|
||||
|
||||
return $self->{__key__};
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# This sub-package will send mail to some recipients, IFF there is anything to
|
||||
# send, or your force it to send. Note that the Subject doesn't qualify it to
|
||||
# send a message (force it to send if you have to).
|
||||
#
|
||||
package Mail;
|
||||
|
||||
|
||||
#################################################################################
|
||||
# The constructor, which optionally takes the TO, FROM and SUBJECT.
|
||||
#
|
||||
sub new
|
||||
{
|
||||
my ($class, $to, $from, $subject) = @_;
|
||||
my $self = {};
|
||||
|
||||
bless $self, ref $class || $class;
|
||||
|
||||
$self->{to} = $to || "root";
|
||||
$self->{from} = $from || "ldap";
|
||||
$self->{subject} = $subject || "Output from LDAP script\n";
|
||||
@{$self->{message}} = ();
|
||||
$self->{send} = 0;
|
||||
$self->{nomail} = 0;
|
||||
$self->{echo} = 0;
|
||||
|
||||
return $self;
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Destructor, which will also send the message, if appropriate.
|
||||
#
|
||||
sub DESTROY
|
||||
{
|
||||
my ($self) = @_;
|
||||
|
||||
if ($self->{send} && !$self->{nomail})
|
||||
{
|
||||
$self->send();
|
||||
$self->{send} = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Set a field for this entry, e.g. From:, To: etc.
|
||||
#
|
||||
sub set
|
||||
{
|
||||
my ($self, $field, $string) = @_;
|
||||
|
||||
if ($field && $string)
|
||||
{
|
||||
$field = lc $field;
|
||||
$self->{$field} = $string;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Add a line to the message, the argument is the string.
|
||||
#
|
||||
sub write
|
||||
{
|
||||
my ($self, $string) = @_;
|
||||
|
||||
if ($string ne "")
|
||||
{
|
||||
push(@{$self->{message}}, $string);
|
||||
print "$string\n" if $self->{echo};
|
||||
|
||||
$self->{send}++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Force the object to send the message, no matter if there's anything in the
|
||||
# body or not.
|
||||
#
|
||||
sub force
|
||||
{
|
||||
my ($self) = @_;
|
||||
|
||||
$self->{send} = 1;
|
||||
$self->{nomail} = 0;
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Don't send the mail, this is the oppositte to "force...
|
||||
#
|
||||
sub nomail
|
||||
{
|
||||
my ($self) = @_;
|
||||
|
||||
$self->{send} = 0;
|
||||
$self->{nomail} = 1;
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Enable echo-mode, where we will also print everything to STDOUT.
|
||||
#
|
||||
sub echo
|
||||
{
|
||||
my ($self) = @_;
|
||||
|
||||
$self->{echo} = 1;
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Actually send the message. This is automatically done by the DESTROY method,
|
||||
# but we can force it to do it this way.
|
||||
#
|
||||
sub send
|
||||
{
|
||||
my ($self) = @_;
|
||||
|
||||
if ($self->{send} && !$self->{nomail})
|
||||
{
|
||||
open(MAILER, "|$main::SENDMAIL -t");
|
||||
print MAILER "From: $self->{from}\n";
|
||||
print MAILER "To: $self->{to}\n";
|
||||
print MAILER "Subject: $self->{subject}\n\n";
|
||||
|
||||
foreach (@{$self->{message}})
|
||||
{
|
||||
print MAILER "$_\n";
|
||||
}
|
||||
print MAILER ".\n";
|
||||
|
||||
close(MAILER);
|
||||
$self->{send} = 0;
|
||||
}
|
||||
}
|
||||
98
mozilla/directory/perldap/examples/qsearch.pl
Executable file
98
mozilla/directory/perldap/examples/qsearch.pl
Executable file
@@ -0,0 +1,98 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: qsearch.pl,v 1.8 1999-01-21 23:52:47 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Quick Search, like ldapsearch, but in Perl. Look how simple it is.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
use strict;
|
||||
no strict "vars";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "qsearch";
|
||||
$USAGE = "$APPNAM -b base -h host -D bind -w pswd -P cert filter [attr...]";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('b:h:D:p:s:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Now do all the searches, one by one.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
foreach (@ARGV)
|
||||
{
|
||||
if (/\=/)
|
||||
{
|
||||
push(@srch, $_);
|
||||
}
|
||||
else
|
||||
{
|
||||
push(@attr, $_);
|
||||
}
|
||||
}
|
||||
|
||||
foreach $search (@srch)
|
||||
{
|
||||
if ($#attr >= $[)
|
||||
{
|
||||
$entry = $conn->search($ld{root}, $ld{scope}, $search, 0, @attr);
|
||||
}
|
||||
else
|
||||
{
|
||||
$entry = $conn->search($ld{root}, $ld{scope}, "$search");
|
||||
}
|
||||
|
||||
print "Searched for `$search':\n\n";
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
|
||||
while ($entry)
|
||||
{
|
||||
$entry->printLDIF();
|
||||
$entry = $conn->nextEntry;
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
135
mozilla/directory/perldap/examples/rand_mods.pl
Executable file
135
mozilla/directory/perldap/examples/rand_mods.pl
Executable file
@@ -0,0 +1,135 @@
|
||||
#!/usr/bin/perl5
|
||||
#################################################################################
|
||||
# $Id: rand_mods.pl,v 1.1.2.1 1999-08-16 01:31:09 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License Version
|
||||
# 1.0 (the "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
||||
# the specific language governing rights and limitations under the License.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape Communications
|
||||
# Corporation. Portions created by Netscape are Copyright (C) 1998 Netscape
|
||||
# Communications Corporation. All Rights Reserved.
|
||||
#
|
||||
# SYNOPSIS:
|
||||
# Modify an attribute for one or more entries, or possibly delete it.
|
||||
#
|
||||
# USAGE:
|
||||
# rand_mods [-adnvW] -b base -h host -D bind DN -w pwd -P cert filter loops
|
||||
# attribute ...
|
||||
#
|
||||
#################################################################################
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Modules we need. Note that we depend heavily on the Ldapp module,
|
||||
# which needs to be built from the C code. It also requires an LDAP SDK.
|
||||
#
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
use Carp;
|
||||
|
||||
use strict;
|
||||
no strict "vars";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "rand_mods";
|
||||
$USAGE = "$APPNAM [-dnvW] -b base -h host -D bind -w pswd filter loops attr ...";
|
||||
$AUTHOR = "Leif Hedstrom <leif\@netscape.com>";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('adnvWb:h:D:p:s:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Instantiate an LDAP object, which also binds to the LDAP server.
|
||||
#
|
||||
if (!getopts('b:h:D:p:s:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
croak "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Parse some extra argumens
|
||||
#
|
||||
my $srch, $loop;
|
||||
my (@attrs) = ("givenName", "sn");
|
||||
|
||||
if (! ($srch = shift(@ARGV)))
|
||||
{
|
||||
print "Usage: $APPNAME $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
$srch = "(&(!(objectclass=nscpHideThis))(uid=*))" if ($srch eq "");
|
||||
|
||||
if (! ($loops = shift(@ARGV)))
|
||||
{
|
||||
print "Usage: $APPNAME $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
@attrs = @ARGV if ($#ARGV > $[);
|
||||
$num_attrs = $#attrs;
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Find all the argument
|
||||
#
|
||||
my $num = 0;
|
||||
$entry = $conn->search($ld{root}, $ld{scope}, $srch, 0, ("0.0"));
|
||||
while ($entry)
|
||||
{
|
||||
push(@users, $entry->getDN());
|
||||
$num++;
|
||||
$entry = $conn->nextEntry();
|
||||
}
|
||||
|
||||
print "Found $num users, randomizing changes now...\n";
|
||||
|
||||
srand(time ^ $$);
|
||||
|
||||
my $tmp, $tmp2, $dn, $loop2;
|
||||
while ($loops--)
|
||||
{
|
||||
$dn = $users[rand($num)];
|
||||
|
||||
print "$loops loops left...\n" if (($loops % 100) == 0);
|
||||
$entry = $conn->browse($dn, @attrs);
|
||||
|
||||
if ($entry)
|
||||
{
|
||||
$loop2 = $num_attrs + 1;
|
||||
while ($loop2--)
|
||||
{
|
||||
$tmp = $entry->{$attrs[$loop2]}[0];
|
||||
$tmp2 = rand($num_attrs);
|
||||
|
||||
$entry->{$attrs[$loop2]} = [ $entry->{$attrs[$tmp2]}[0] ];
|
||||
$entry->{$attrs[$tmp2]} = [ $tmp] ;
|
||||
|
||||
$entry->printLDIF();
|
||||
}
|
||||
|
||||
$conn->update($entry);
|
||||
}
|
||||
}
|
||||
98
mozilla/directory/perldap/examples/rename.pl
Executable file
98
mozilla/directory/perldap/examples/rename.pl
Executable file
@@ -0,0 +1,98 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: rename.pl,v 1.4 1999-01-21 23:52:47 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Rename an LDAP entry, changing it's DN. Note that currently this only
|
||||
# works with RDNs.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "rename";
|
||||
$USAGE = "$APPNAM [-nvI] -b base -h host -D bind -w pswd -P cert filter new_rdn";
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('nvIb:h:D:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
Mozilla::LDAP::Utils::userCredentials(\%ld) unless $opt_n;
|
||||
|
||||
($search, $rdn) = @ARGV;
|
||||
if (($search eq "") || ($rdn eq ""))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Instantiate an LDAP object, which also binds to the LDAP server.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
$key = "Y" if $opt_I;
|
||||
$entry = $conn->search($ld{root}, $ld{scope}, $search, 0, @ATTRIBUTES);
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
|
||||
if (! $entry || $conn->nextEntry())
|
||||
{
|
||||
print "Error: The search did not return exactly one match, abort!\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
if (! $opt_I)
|
||||
{
|
||||
print "Rename ", $entry->getDN(), " with $rdn [N]? ";
|
||||
$key = Mozilla::LDAP::Utils::answer("N") unless $opt_I;
|
||||
}
|
||||
|
||||
if ($key eq "Y")
|
||||
{
|
||||
# Note: I have to explicitly specify the original DN below, since the call
|
||||
# to nextEntry() above blows the DN away from the ::Conn object.
|
||||
if (! $opt_n)
|
||||
{
|
||||
$conn->modifyRDN($rdn, $entry->getDN());
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
}
|
||||
print "Renamed $entry->{dn}\n" if $opt_v;
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
95
mozilla/directory/perldap/examples/rmentry.pl
Executable file
95
mozilla/directory/perldap/examples/rmentry.pl
Executable file
@@ -0,0 +1,95 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: rmentry.pl,v 1.4.2.1 1999-08-06 19:53:54 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Remove one or several LDAP objects. By default this tool is
|
||||
# interactive, which can be disabled with the "-I" option (but
|
||||
# please be careful...).
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "rmentry";
|
||||
$USAGE = "$APPNAM [-nvI] -b base -h host -p port -D bind -w pswd" .
|
||||
"-P cert filter ...";
|
||||
|
||||
@ATTRIBUTES = ("uid");
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('nvIb:h:p:D:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
Mozilla::LDAP::Utils::userCredentials(\%ld) unless $opt_n;
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Do the search, and process all the entries.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
$key = "Y" if $opt_I;
|
||||
foreach $search (@ARGV)
|
||||
{
|
||||
$entry = $conn->search($ld{root}, $ld{scope}, $search, 0, @ATTRIBUTES);
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
|
||||
while ($entry)
|
||||
{
|
||||
if (! $opt_I)
|
||||
{
|
||||
print "Delete $entry->{dn} [N]? ";
|
||||
$key = Mozilla::LDAP::Utils::answer("N") unless $opt_I;
|
||||
}
|
||||
|
||||
if ($key eq "Y")
|
||||
{
|
||||
if (! $opt_n)
|
||||
{
|
||||
$conn->delete($entry);
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
}
|
||||
print "Deleted $entry->{dn}\n" if $opt_v;
|
||||
}
|
||||
|
||||
$entry = $conn->nextEntry();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
81
mozilla/directory/perldap/examples/tabdump.pl
Executable file
81
mozilla/directory/perldap/examples/tabdump.pl
Executable file
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: tabdump.pl,v 1.3 1998-08-13 09:11:10 leif Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Generate a TAB separate "dump" of entries matching the search criteria,
|
||||
# using the list of attributes specified.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "tabdump";
|
||||
$USAGE = "$APPNAM [-nv] -b base -h host -D bind -w pswd -P cert attr1,attr2,.. srch";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('nvb:h:D:p:s:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
|
||||
$attributes = $ARGV[$[];
|
||||
$search = $ARGV[$[ + 1];
|
||||
die "Need to specify a list of attributes and the search filter.\n"
|
||||
unless ($attributes && $search);
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Do the searches, and produce the output.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
@attr = split(/,/, $attributes);
|
||||
$entry = $conn->search($ld{root}, $ld{scope}, $search, 0, @attr);
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
|
||||
while ($entry)
|
||||
{
|
||||
foreach (@attr)
|
||||
{
|
||||
print $entry->{$_}[0], "\t";
|
||||
}
|
||||
print "\n";
|
||||
$entry = $conn->nextEntry;
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
162
mozilla/directory/perldap/oldtest.pl
Normal file
162
mozilla/directory/perldap/oldtest.pl
Normal file
@@ -0,0 +1,162 @@
|
||||
#############################################################################
|
||||
# $Id: oldtest.pl,v 1.1.2.1 1999-08-17 21:14:01 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Before `make install' is performed this script should be runnable with
|
||||
# `make test'. After `make install' it should work as `perl test.pl'
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
######################### We start with some black magic to print on failure.
|
||||
|
||||
# Change 1..1 below to 1..last_test_to_print .
|
||||
# (It may become useful if the test is moved to ./t subdirectory.)
|
||||
|
||||
BEGIN { $| = 1; print "1..8\n"; }
|
||||
END {print "modinit - not ok\n" unless $loaded;}
|
||||
use Mozilla::LDAP::API qw(:constant :api :ssl);
|
||||
$loaded = 1;
|
||||
print "modinit - ok\n";
|
||||
|
||||
######################### End of black magic.
|
||||
|
||||
|
||||
$attrs = [];
|
||||
|
||||
$ldap_host = $ENV{"LDAPHOST"};
|
||||
$filter = $ENV{"TESTFILTER"};
|
||||
$BASEDN = $ENV{"LDAPBASE"};
|
||||
|
||||
if (!$ldap_host)
|
||||
{
|
||||
print "\nEnter LDAP Server: ";
|
||||
chomp($ldap_host = <>);
|
||||
}
|
||||
|
||||
if (!$filter)
|
||||
{
|
||||
print "Enter Search Filter (ex. uid=abc123): ";
|
||||
chomp($filter = <>);
|
||||
}
|
||||
|
||||
if (!$BASEDN)
|
||||
{
|
||||
print "Enter LDAP Search Base (ex. o=Org, c=US): ";
|
||||
chomp($BASEDN = <>);
|
||||
}
|
||||
|
||||
print "\n";
|
||||
|
||||
|
||||
##
|
||||
## Initialize LDAP Connection
|
||||
##
|
||||
|
||||
if (($ld = ldap_init($ldap_host,LDAP_PORT)) == -1)
|
||||
{
|
||||
print "open - not ok\n";
|
||||
exit -1;
|
||||
}
|
||||
print "open - ok\n";
|
||||
|
||||
##
|
||||
## Bind as DN, PASSWORD (NULL,NULL) on LDAP connection $ld
|
||||
##
|
||||
|
||||
if (ldap_simple_bind_s($ld,"","") != LDAP_SUCCESS)
|
||||
{
|
||||
ldap_perror($ld,"bind_s");
|
||||
print "bind - not ok\n";
|
||||
exit -1;
|
||||
}
|
||||
print "bind - ok\n";
|
||||
|
||||
##
|
||||
## ldap_search_s - Synchronous Search
|
||||
##
|
||||
|
||||
if (ldap_search_s($ld,$BASEDN,LDAP_SCOPE_SUBTREE,$filter,$attrs,0,$result) != LDAP_SUCCESS)
|
||||
{
|
||||
ldap_perror($ld,"search_s");
|
||||
print "search - not ok\n";
|
||||
}
|
||||
print "search - ok\n";
|
||||
|
||||
##
|
||||
## ldap_count_entries - Count Matched Entries
|
||||
##
|
||||
|
||||
if (($count = ldap_count_entries($ld,$result)) == -1)
|
||||
{
|
||||
ldap_perror($ld,"count_entry");
|
||||
print "count - not ok\n";
|
||||
}
|
||||
print "count - ok - $count\n";
|
||||
|
||||
##
|
||||
## first_entry - Get First Matched Entry
|
||||
## next_entry - Get Next Matched Entry
|
||||
##
|
||||
|
||||
for ($ent = ldap_first_entry($ld,$result); $ent; $ent = ldap_next_entry($ld,$ent))
|
||||
{
|
||||
|
||||
##
|
||||
## ldap_get_dn - Get DN for Matched Entries
|
||||
##
|
||||
|
||||
if (($dn = ldap_get_dn($ld,$ent)) ne "")
|
||||
{
|
||||
print "getdn - ok - $dn\n";
|
||||
} else {
|
||||
ldap_perror($ld,"get_dn");
|
||||
print "getdn - not ok\n";
|
||||
}
|
||||
|
||||
for ($attr = ldap_first_attribute($ld,$ent,$ber); $attr; $attr = ldap_next_attribute($ld,$ent,$ber))
|
||||
{
|
||||
print "firstatt - ok - $attr\n";
|
||||
|
||||
##
|
||||
## ldap_get_values
|
||||
##
|
||||
|
||||
@vals = ldap_get_values($ld,$ent,$attr);
|
||||
if ($#vals >= 0)
|
||||
{
|
||||
foreach $val (@vals)
|
||||
{
|
||||
print "getvals - ok - $val\n";
|
||||
}
|
||||
} else {
|
||||
print "getvals - not ok\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
##
|
||||
## Unbind LDAP Connection
|
||||
##
|
||||
|
||||
ldap_unbind($ld);
|
||||
|
||||
14
mozilla/directory/perldap/t/ChangeLog
Normal file
14
mozilla/directory/perldap/t/ChangeLog
Normal file
@@ -0,0 +1,14 @@
|
||||
1999-08-06 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* conn.pl: Added support for browse() and compare().
|
||||
|
||||
1999-03-19 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* conn.pl: Added test for add() with a hash array.
|
||||
|
||||
1999-01-05 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* entry.pl: New script, to test all Entry:: methods.
|
||||
|
||||
* conn.pl: Added test for modifyRDN().
|
||||
|
||||
4
mozilla/directory/perldap/t/api.t
Normal file
4
mozilla/directory/perldap/t/api.t
Normal file
@@ -0,0 +1,4 @@
|
||||
print "This is not a real test, yet...\n";
|
||||
print "1..1\n";
|
||||
|
||||
print "ok 1\n";
|
||||
BIN
mozilla/directory/perldap/t/conn.pl
Executable file
BIN
mozilla/directory/perldap/t/conn.pl
Executable file
Binary file not shown.
4
mozilla/directory/perldap/t/conn.t
Normal file
4
mozilla/directory/perldap/t/conn.t
Normal file
@@ -0,0 +1,4 @@
|
||||
print "This is not a real test, yet...\n";
|
||||
print "1..1\n";
|
||||
|
||||
print "ok 1\n";
|
||||
150
mozilla/directory/perldap/t/entry.pl
Executable file
150
mozilla/directory/perldap/t/entry.pl
Executable file
@@ -0,0 +1,150 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: entry.pl,v 1.2 1999-01-21 23:52:50 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Test most (all?) of the LDAP::Mozilla::Conn methods.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
use Mozilla::LDAP::API;
|
||||
|
||||
use strict;
|
||||
no strict "vars";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Configurations, modify these as needed.
|
||||
#
|
||||
$BIND = "uid=ldapadmin";
|
||||
$BASE = "o=Netscape Communications Corp.,c=US";
|
||||
$PEOPLE = "ou=people";
|
||||
$GROUPS = "ou=groups";
|
||||
$UID = "leif-test";
|
||||
$CN = "test-group-1";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "entry.pl";
|
||||
$USAGE = "$APPNAM -b base -h host -D bind -w pswd -P cert";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('b:h:D:p:s:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs($BIND, $BASE);
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Get an LDAP connection
|
||||
#
|
||||
sub getConn
|
||||
{
|
||||
my $conn;
|
||||
|
||||
if ($main::reuseConn)
|
||||
{
|
||||
if (!defined($main::mainConn))
|
||||
{
|
||||
$main::mainConn = new Mozilla::LDAP::Conn(\%main::ld);
|
||||
die "Could't connect to LDAP server $main::ld{host}"
|
||||
unless $main::mainConn;
|
||||
}
|
||||
return $main::mainConn;
|
||||
}
|
||||
else
|
||||
{
|
||||
$conn = new Mozilla::LDAP::Conn(\%main::ld);
|
||||
die "Could't connect to LDAP server $main::ld{host}" unless $conn;
|
||||
}
|
||||
|
||||
return $conn;
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Some small help functions...
|
||||
#
|
||||
sub dotPrint
|
||||
{
|
||||
my $str = shift;
|
||||
|
||||
print $str . '.' x (20 - length($str));
|
||||
}
|
||||
|
||||
sub attributeEQ
|
||||
{
|
||||
my @a, @b;
|
||||
my $i;
|
||||
|
||||
@a = @{$_[0]};
|
||||
@b = @{$_[1]};
|
||||
return 1 if (($#a < 0) && ($#b < 0));
|
||||
return 0 unless ($#a == $#b);
|
||||
|
||||
@a = sort(@a);
|
||||
@b = sort(@b);
|
||||
for ($i = 0; $i <= $#a; $i++)
|
||||
{
|
||||
return 0 unless ($a[$i] eq $b[$i]);;
|
||||
}
|
||||
|
||||
return 1; # We passed all the tests, we're ok.
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Setup the test entries.
|
||||
#
|
||||
$filter = "(uid=$UID)";
|
||||
$conn = getConn();
|
||||
$nentry = $conn->newEntry();
|
||||
|
||||
$nentry->setDN("uid=$UID, $PEOPLE, $BASE");
|
||||
$nentry->{objectclass} = [ "top", "person", "inetOrgPerson", "mailRecipient" ];
|
||||
$nentry->addValue("uid", $UID);
|
||||
$nentry->addValue("sn", "Hedstrom");
|
||||
$nentry->addValue("givenName", "Leif");
|
||||
$nentry->addValue("cn", "Leif Hedstrom");
|
||||
$nentry->addValue("cn", "Leif P. Hedstrom");
|
||||
$nentry->addValue("cn", "The Swede");
|
||||
$nentry->addValue("description", "Test1");
|
||||
$nentry->addValue("description", "Test2");
|
||||
$nentry->addValue("description", "Test3");
|
||||
$nentry->addValue("description", "Test4");
|
||||
$nentry->addValue("description", "Test5");
|
||||
$nentry->addValue("mail", "leif\@ogre.com");
|
||||
|
||||
$ent = $conn->search($ld{root}, $ld{scope}, $filter);
|
||||
$conn->delete($ent->getDN()) if $ent;
|
||||
$conn->add($nentry);
|
||||
|
||||
$conn->close();
|
||||
4
mozilla/directory/perldap/t/entry.t
Normal file
4
mozilla/directory/perldap/t/entry.t
Normal file
@@ -0,0 +1,4 @@
|
||||
print "This is not a real test, yet...\n";
|
||||
print "1..1\n";
|
||||
|
||||
print "ok 1\n";
|
||||
4
mozilla/directory/perldap/t/ldif.t
Normal file
4
mozilla/directory/perldap/t/ldif.t
Normal file
@@ -0,0 +1,4 @@
|
||||
print "This is not a real test, yet...\n";
|
||||
print "1..1\n";
|
||||
|
||||
print "ok 1\n";
|
||||
4
mozilla/directory/perldap/t/utils.t
Normal file
4
mozilla/directory/perldap/t/utils.t
Normal file
@@ -0,0 +1,4 @@
|
||||
print "This is not a real test, yet...\n";
|
||||
print "1..1\n";
|
||||
|
||||
print "ok 1\n";
|
||||
280
mozilla/directory/perldap/test_api/api.pl
Executable file
280
mozilla/directory/perldap/test_api/api.pl
Executable file
@@ -0,0 +1,280 @@
|
||||
#!/usr/bin/perl -w
|
||||
#############################################################################
|
||||
# $Id: api.pl,v 1.7 1999-01-21 23:52:52 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# api.pl - Test all LDAPv2 API function
|
||||
# Author: Clayton Donley <donley@wwa.com>
|
||||
#
|
||||
# Performs all API calls directly in order to test for possible issues
|
||||
# on a particular platform.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Mozilla::LDAP::API qw(:api :constant);
|
||||
use strict;
|
||||
|
||||
my $BASE = "ou=Test,o=Test,c=US";
|
||||
my $DN = "cn=Directory Manager";
|
||||
my $PASS = "abcd1234";
|
||||
my $HOST = "";
|
||||
my $PORT = 389;
|
||||
|
||||
if (!$HOST)
|
||||
{
|
||||
print "Please edit the variables at the top of this file.\n";
|
||||
exit -1;
|
||||
}
|
||||
|
||||
print "\nPerLDAP API TestSuite\n";
|
||||
print "\nNote: Failures in earlier tests will cause later tests to fail.\n";
|
||||
print "\n";
|
||||
|
||||
my $howmany = 10;
|
||||
|
||||
# Initialize the Connection
|
||||
{
|
||||
my $ld = ldap_init($HOST,$PORT);
|
||||
if ($ld <0)
|
||||
{
|
||||
print "init - Failed!\n";
|
||||
die;
|
||||
}
|
||||
print "init - OK\n";
|
||||
|
||||
# Set an LDAP Session Option
|
||||
if (ldap_set_option($ld,LDAP_OPT_PROTOCOL_VERSION,LDAP_VERSION3)
|
||||
!= LDAP_SUCCESS)
|
||||
{
|
||||
print "set_option - Failed!\n";
|
||||
} else {
|
||||
print "set_option - OK\n";
|
||||
}
|
||||
|
||||
# Get an LDAP Session Option
|
||||
my $option;
|
||||
ldap_get_option($ld,LDAP_OPT_REFERRALS,$option);
|
||||
|
||||
if ($option != 1)
|
||||
{
|
||||
print "get_option - Failed!\n";
|
||||
} else {
|
||||
print "get_option - OK\n";
|
||||
}
|
||||
|
||||
# Anonymous Bind
|
||||
if (ldap_simple_bind_s($ld,"","") != LDAP_SUCCESS)
|
||||
{
|
||||
print "anon_bind - Failed!\n";
|
||||
} else {
|
||||
print "anon_bind - OK\n";
|
||||
}
|
||||
|
||||
# Authenticated Simple Bind
|
||||
if (ldap_simple_bind_s($ld,$DN,$PASS) != LDAP_SUCCESS)
|
||||
{
|
||||
print "simple_bind - Failed!\n";
|
||||
} else {
|
||||
print "simple_bind - OK\n";
|
||||
}
|
||||
|
||||
# Set Rebind Process
|
||||
my $rebindproc = sub { return($DN,$PASS,LDAP_AUTH_SIMPLE); };
|
||||
ldap_set_rebind_proc($ld,$rebindproc);
|
||||
print "set_rebind - OK\n";
|
||||
|
||||
# Add an OrgUnit Entry
|
||||
my $entry = {
|
||||
"objectclass" => ["top","organizationalUnit"],
|
||||
"ou" => "Test",
|
||||
};
|
||||
|
||||
if (ldap_add_s($ld,$BASE,$entry) != LDAP_SUCCESS)
|
||||
{
|
||||
print "add_org - Failed!\n";
|
||||
} else {
|
||||
print "add_org - OK\n";
|
||||
}
|
||||
|
||||
|
||||
# Add People
|
||||
foreach my $number (1..$howmany)
|
||||
{
|
||||
$entry = {
|
||||
"objectclass" => ["top","person"],
|
||||
"cn" => "Mozilla $number",
|
||||
"sn" => ["$number"],
|
||||
};
|
||||
if (ldap_add_s($ld,"cn=Mozilla $number,$BASE",$entry)
|
||||
!= LDAP_SUCCESS)
|
||||
{
|
||||
print "add_user_$number - Failed!\n";
|
||||
} else {
|
||||
print "add_user_$number - OK\n";
|
||||
}
|
||||
}
|
||||
|
||||
# Modify People
|
||||
foreach my $number (1..$howmany)
|
||||
{
|
||||
$entry = {
|
||||
"sn" => {"ab",["Test"]},
|
||||
"telephoneNumber" => {"ab",[123.456]},
|
||||
# "telephoneNumber" => "800-555-111$number",
|
||||
};
|
||||
if (ldap_modify_s($ld,"cn=Mozilla $number,$BASE",$entry)
|
||||
!= LDAP_SUCCESS)
|
||||
{
|
||||
print "mod_user_$number - Failed!\n";
|
||||
} else {
|
||||
print "mod_user_$number - OK\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Search People
|
||||
my $filter = "(sn=Test)";
|
||||
my $attrs = ["cn","sn"];
|
||||
my $res;
|
||||
if (ldap_search_s($ld,$BASE,LDAP_SCOPE_SUBTREE,$filter,$attrs,0,$res)
|
||||
!= LDAP_SUCCESS)
|
||||
{
|
||||
print "search_user - Failed!\n";
|
||||
} else {
|
||||
print "search_user - OK\n";
|
||||
}
|
||||
|
||||
# Count Results
|
||||
if (ldap_count_entries($ld,$res) != $howmany)
|
||||
{
|
||||
print "count_res - Failed!\n";
|
||||
} else {
|
||||
print "count_res - OK\n";
|
||||
}
|
||||
|
||||
# Sort Results
|
||||
if (ldap_sort_entries($ld,$res,"sn") != LDAP_SUCCESS)
|
||||
{
|
||||
print "sort_ent - Failed!\n";
|
||||
} else {
|
||||
print "sort_ent - OK\n";
|
||||
}
|
||||
|
||||
# Multisort Results
|
||||
if (ldap_multisort_entries($ld,$res,["sn","telephoneNumber"]) != LDAP_SUCCESS)
|
||||
{
|
||||
print "multisort - Failed!\n";
|
||||
} else {
|
||||
print "multisort - OK\n";
|
||||
}
|
||||
|
||||
# Get First Entry
|
||||
my $ent = ldap_first_entry($ld,$res);
|
||||
if (!$ent)
|
||||
{
|
||||
print "first_entry - Failed!\n";
|
||||
} else {
|
||||
print "first_entry - OK\n";
|
||||
}
|
||||
|
||||
# Get Next Entry
|
||||
$ent = ldap_next_entry($ld,$ent);
|
||||
if (!$ent)
|
||||
{
|
||||
print "next_entry - Failed!\n";
|
||||
} else {
|
||||
print "next_entry - OK\n";
|
||||
}
|
||||
|
||||
# Get DN
|
||||
my $dn = ldap_get_dn($ld,$ent);
|
||||
if (!$dn)
|
||||
{
|
||||
print "get_dn - Failed!\n";
|
||||
} else {
|
||||
print "get_dn - OK\n";
|
||||
}
|
||||
|
||||
# Get First Attribute
|
||||
my $ber;
|
||||
my $attr = ldap_first_attribute($ld,$ent,$ber);
|
||||
if (!$attr)
|
||||
{
|
||||
print "first_attr - Failed!\n";
|
||||
} else {
|
||||
print "first_attr - OK\n";
|
||||
}
|
||||
|
||||
# Get Next Attribute
|
||||
$attr = ldap_next_attribute($ld,$ent,$ber);
|
||||
if (!$attr)
|
||||
{
|
||||
print "next_attr - Failed!\n";
|
||||
} else {
|
||||
print "next_attr - OK\n";
|
||||
}
|
||||
|
||||
# Get Attribute Values
|
||||
my @vals = ldap_get_values($ld,$ent,$attr);
|
||||
if ($#vals < 0)
|
||||
{
|
||||
print "get_values - Failed!\n";
|
||||
} else {
|
||||
print "get_values - OK\n";
|
||||
}
|
||||
|
||||
# Free structures pointed to by $ber and $res to prevent memory leak
|
||||
ldap_ber_free($ber,1);
|
||||
ldap_msgfree($res);
|
||||
|
||||
# Compare Attribute Values
|
||||
foreach my $number (1..$howmany)
|
||||
{
|
||||
if(ldap_compare_s($ld,"cn=Mozilla $number,$BASE","sn",$number)
|
||||
!= LDAP_COMPARE_TRUE)
|
||||
{
|
||||
print "comp_user_$number - Failed!\n";
|
||||
} else {
|
||||
print "comp_user_$number - OK\n";
|
||||
}
|
||||
}
|
||||
|
||||
# Delete Users
|
||||
foreach my $number (1..$howmany)
|
||||
{
|
||||
if (ldap_delete_s($ld,"cn=Mozilla $number,$BASE") != LDAP_SUCCESS)
|
||||
{
|
||||
print "del_user_$number - Failed!\n";
|
||||
} else {
|
||||
print "del_user_$number - OK\n";
|
||||
}
|
||||
}
|
||||
|
||||
if (ldap_delete_s($ld,"$BASE") != LDAP_SUCCESS)
|
||||
{
|
||||
print "del_org - Failed!\n";
|
||||
} else {
|
||||
print "del_org - OK\n";
|
||||
}
|
||||
|
||||
# Unbind
|
||||
ldap_unbind($ld);
|
||||
}
|
||||
131
mozilla/directory/perldap/test_api/search.pl
Executable file
131
mozilla/directory/perldap/test_api/search.pl
Executable file
@@ -0,0 +1,131 @@
|
||||
#!/usr/bin/perl
|
||||
#############################################################################
|
||||
# $Id: search.pl,v 1.4 1998-08-13 04:40:01 clayton Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerlDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Test the search capabilities of the API, similar to write.pl.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Mozilla::LDAP::API qw(:api :constant);
|
||||
use strict;
|
||||
|
||||
|
||||
my $ldap_host = "";
|
||||
my $BASEDN = "o=Org,c=US";
|
||||
my $filter = $ARGV[0];
|
||||
|
||||
if (!$ldap_host)
|
||||
{
|
||||
print "Edit the top portion of this file before continuing.\n";
|
||||
exit -1;
|
||||
}
|
||||
|
||||
my $attrs = [];
|
||||
|
||||
my ($ld,$result,$count);
|
||||
|
||||
##
|
||||
## Initialize LDAP Connection
|
||||
##
|
||||
|
||||
if (($ld = ldap_init($ldap_host,LDAP_PORT)) == -1)
|
||||
{
|
||||
die "Can not open LDAP connection to $ldap_host";
|
||||
}
|
||||
|
||||
##
|
||||
## Bind as DN, PASSWORD (NULL,NULL) on LDAP connection $ld
|
||||
##
|
||||
|
||||
if (ldap_simple_bind_s($ld,"","") != LDAP_SUCCESS)
|
||||
{
|
||||
ldap_perror($ld,"bind_s");
|
||||
die;
|
||||
}
|
||||
|
||||
##
|
||||
## ldap_search_s - Synchronous Search
|
||||
##
|
||||
|
||||
if (ldap_search_s($ld,$BASEDN,LDAP_SCOPE_SUBTREE,$filter,$attrs,0,$result) != LDAP_SUCCESS)
|
||||
{
|
||||
ldap_perror($ld,"search_s");
|
||||
die;
|
||||
}
|
||||
|
||||
##
|
||||
## ldap_count_entries - Count Matched Entries
|
||||
##
|
||||
|
||||
if (($count = ldap_count_entries($ld,$result)) == -1)
|
||||
{
|
||||
ldap_perror($ld,"count_entry");
|
||||
die;
|
||||
}
|
||||
|
||||
##
|
||||
## first_entry - Get First Matched Entry
|
||||
## next_entry - Get Next Matched Entry
|
||||
##
|
||||
|
||||
for (my $ent = ldap_first_entry($ld,$result); $ent; $ent = ldap_next_entry($ld,$ent))
|
||||
{
|
||||
|
||||
##
|
||||
## ldap_get_dn - Get DN for Matched Entries
|
||||
##
|
||||
|
||||
my ($dn,$attr,@vals,$val,$ber);
|
||||
if (($dn = ldap_get_dn($ld,$ent)) ne "")
|
||||
{
|
||||
print "dn: $dn\n";
|
||||
} else {
|
||||
ldap_perror($ld,"get_dn");
|
||||
die;
|
||||
}
|
||||
|
||||
for ($attr = ldap_first_attribute($ld,$ent,$ber); $attr; $attr = ldap_next_attribute($ld,$ent,$ber))
|
||||
{
|
||||
|
||||
##
|
||||
## ldap_get_values
|
||||
##
|
||||
|
||||
@vals = ldap_get_values($ld,$ent,$attr);
|
||||
if ($#vals >= 0)
|
||||
{
|
||||
foreach $val (@vals)
|
||||
{
|
||||
print "$attr: $val\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
ldap_ber_free($ber,0);
|
||||
}
|
||||
ldap_msgfree($result);
|
||||
|
||||
##
|
||||
## Unbind LDAP Connection
|
||||
##
|
||||
|
||||
ldap_unbind($ld);
|
||||
|
||||
110
mozilla/directory/perldap/test_api/write.pl
Executable file
110
mozilla/directory/perldap/test_api/write.pl
Executable file
@@ -0,0 +1,110 @@
|
||||
#!/usr/bin/perl -w
|
||||
#############################################################################
|
||||
# $Id: write.pl,v 1.4 1998-08-13 04:40:02 clayton Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerlDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# write.pl - Test of LDAP Modify Operations in Perl5
|
||||
# Author: Clayton Donley <donley@wwa.com>
|
||||
#
|
||||
# This utility is mostly to demonstrate all the write operations
|
||||
# that can be done with LDAP through this PERL5 module.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use strict;
|
||||
use Mozilla::LDAP::API qw(:constant :api);
|
||||
|
||||
|
||||
# This is the entry we will be adding. Do not use a pre-existing entry.
|
||||
my $ENTRYDN = "cn=Test Guy, o=Org, c=US";
|
||||
|
||||
# This is the DN and password for an Administrator
|
||||
my $ROOTDN = "cn=DSManager,o=Org,c=US";
|
||||
my $ROOTPW = "";
|
||||
|
||||
my $ldap_server = "";
|
||||
|
||||
if (!$ldap_server)
|
||||
{
|
||||
print "Edit the top portion of this file before continuing.\n";
|
||||
exit -1;
|
||||
}
|
||||
|
||||
my $ld = ldap_init($ldap_server,LDAP_PORT);
|
||||
|
||||
if ($ld == -1)
|
||||
{
|
||||
die "Connection to LDAP Server Failed";
|
||||
}
|
||||
|
||||
if (ldap_simple_bind_s($ld,$ROOTDN,$ROOTPW) != LDAP_SUCCESS)
|
||||
{
|
||||
ldap_perror($ld,"bind_s");
|
||||
die;
|
||||
}
|
||||
|
||||
my %testwrite = (
|
||||
"cn" => "Test User",
|
||||
"sn" => "User",
|
||||
"givenName" => "Test",
|
||||
"telephoneNumber" => "8475551212",
|
||||
"objectClass" => ["top","person","organizationalPerson",
|
||||
"inetOrgPerson"],
|
||||
"mail" => "tuser\@my.org",
|
||||
);
|
||||
|
||||
if (ldap_add_s($ld,$ENTRYDN,\%testwrite) != LDAP_SUCCESS)
|
||||
{
|
||||
ldap_perror($ld,"add_s");
|
||||
die;
|
||||
}
|
||||
|
||||
print "Entry Added.\n";
|
||||
|
||||
|
||||
%testwrite = (
|
||||
"telephoneNumber" => "7085551212",
|
||||
"mail" => {"a",["Test_User\@my.org"]},
|
||||
);
|
||||
|
||||
if (ldap_modify_s($ld,$ENTRYDN,\%testwrite) != LDAP_SUCCESS)
|
||||
{
|
||||
ldap_perror($ld,"modify_s");
|
||||
die;
|
||||
}
|
||||
|
||||
print "Entry Modified.\n";
|
||||
|
||||
#
|
||||
# Delete the entry for $ENTRYDN
|
||||
#
|
||||
if (ldap_delete_s($ld,$ENTRYDN) != LDAP_SUCCESS)
|
||||
{
|
||||
ldap_perror($ld,"delete_s");
|
||||
die;
|
||||
}
|
||||
|
||||
print "Entry Deleted.\n";
|
||||
|
||||
# Unbind to LDAP server
|
||||
ldap_unbind($ld);
|
||||
|
||||
exit;
|
||||
70
mozilla/directory/perldap/typemap
Normal file
70
mozilla/directory/perldap/typemap
Normal file
@@ -0,0 +1,70 @@
|
||||
#############################################################################
|
||||
# $Id: typemap,v 1.4 1998-08-13 09:15:00 leif Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Typemap to declare XSUB data types.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
const int T_IV
|
||||
char * T_PV
|
||||
const char * T_PV
|
||||
char ** T_charptrptr
|
||||
LDAP * T_PTR
|
||||
LDAPMessage * T_PTR
|
||||
LDAPMessage ** T_PTR
|
||||
BerElement * T_PTR
|
||||
LDAPControl * T_PTR
|
||||
LDAPVersion * T_PTR
|
||||
struct berval T_berval
|
||||
struct berval ** T_bervalptrptr
|
||||
FriendlyMap * T_PTR
|
||||
LDAPsortkey ** T_PTR
|
||||
LDAPVirtualList * T_PTR
|
||||
LDAPURLDesc * T_PTR
|
||||
LDAPControl ** T_PTR
|
||||
LDAPFiltDesc * T_PTR
|
||||
LDAPFiltInfo * T_PTR
|
||||
LDAPMemCache * T_PTR
|
||||
LDAPMemCache ** T_PTR
|
||||
struct ldap_thread_fns * T_PTR
|
||||
LDAPMod ** T_PTR
|
||||
LDAP_CMP_CALLBACK * T_PTR
|
||||
LDAP_REBINDPROC_CALLBACK * T_PTR
|
||||
struct timeval T_timeval
|
||||
|
||||
#########
|
||||
INPUT
|
||||
T_timeval
|
||||
$var.tv_sec = atof((char *)SvPV($arg,na));
|
||||
$var.tv_usec = 0
|
||||
T_berval
|
||||
$var.bv_val = (char *)SvPV($arg,na);
|
||||
$var.bv_len = na
|
||||
T_charptrptr
|
||||
$var = (char **)avref2charptrptr($arg)
|
||||
T_bervalptrptr
|
||||
$var = (struct berval **)avref2berptrptr($arg)
|
||||
OUTPUT
|
||||
T_charptrptr
|
||||
$arg = charptrptr2avref($var);
|
||||
T_bervalptrptr
|
||||
$arg = berptrptr2avref((struct berval **)$var);
|
||||
@@ -1,46 +0,0 @@
|
||||
<html>
|
||||
<!--
|
||||
- The contents of this file are subject to the Netscape Public
|
||||
- License Version 1.1 (the "License"); you may not use this file
|
||||
- except in compliance with the License. You may obtain a copy of
|
||||
- the License at http://www.mozilla.org/NPL/
|
||||
-
|
||||
- Software distributed under the License is distributed on an "AS
|
||||
- IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
- implied. See the License for the specific language governing
|
||||
- rights and limitations under the License.
|
||||
-
|
||||
- The Original Code is Rhino code, released
|
||||
- May 6, 1999.
|
||||
-
|
||||
- The Initial Developer of the Original Code is Netscape
|
||||
- Communications Corporation. Portions created by Netscape are
|
||||
- Copyright (C) 1998-1999 Netscape Communications Corporation. All
|
||||
- Rights Reserved.
|
||||
-
|
||||
- Contributor(s):
|
||||
- Norris Boyd
|
||||
-
|
||||
- Alternatively, the contents of this file may be used under the
|
||||
- terms of the GNU Public License (the "GPL"), in which case the
|
||||
- provisions of the GPL are applicable instead of those above.
|
||||
- If you wish to allow use of your version of this file only
|
||||
- under the terms of the GPL and not to allow others to use your
|
||||
- version of this file under the NPL, indicate your decision by
|
||||
- deleting the provisions above and replace them with the notice
|
||||
- and other provisions required by the GPL. If you do not delete
|
||||
- the provisions above, a recipient may use your version of this
|
||||
- file under either the NPL or the GPL.
|
||||
-->
|
||||
<body>
|
||||
<h1>
|
||||
<span CLASS=LXRSHORTDESC>
|
||||
Rhino: JavaScript in Java<p>
|
||||
</span>
|
||||
</h1>
|
||||
<span CLASS=LXRLONGDESC>
|
||||
Rhino is an implementation of JavaScript in Java. Documentation can be found
|
||||
<a href="http://www.mozilla.org/rhino/index.html">here</a>.
|
||||
</span>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,22 +0,0 @@
|
||||
apiClasses=\
|
||||
src/org/mozilla/javascript/ClassCache.java,\
|
||||
src/org/mozilla/javascript/ClassDefinitionException.java,\
|
||||
src/org/mozilla/javascript/ClassShutter.java,\
|
||||
src/org/mozilla/javascript/Context.java,\
|
||||
src/org/mozilla/javascript/ContextListener.java,\
|
||||
src/org/mozilla/javascript/EcmaError.java,\
|
||||
src/org/mozilla/javascript/ErrorReporter.java,\
|
||||
src/org/mozilla/javascript/Function.java,\
|
||||
src/org/mozilla/javascript/FunctionObject.java,\
|
||||
src/org/mozilla/javascript/ImporterTopLevel.java,\
|
||||
src/org/mozilla/javascript/JavaScriptException.java,\
|
||||
src/org/mozilla/javascript/PropertyException.java,\
|
||||
src/org/mozilla/javascript/Script.java,\
|
||||
src/org/mozilla/javascript/Scriptable.java,\
|
||||
src/org/mozilla/javascript/ScriptableObject.java,\
|
||||
src/org/mozilla/javascript/SecurityController.java,\
|
||||
src/org/mozilla/javascript/WrapFactory.java,\
|
||||
src/org/mozilla/javascript/Wrapper.java,\
|
||||
src/org/mozilla/javascript/Synchronizer.java,\
|
||||
src/org/mozilla/javascript/serialize/ScriptableInputStream.java,\
|
||||
src/org/mozilla/javascript/serialize/ScriptableOutputStream.java
|
||||
@@ -1 +0,0 @@
|
||||
This version was built on @datestamp@.
|
||||
@@ -1,183 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<!--
|
||||
Build file for Rhino using Ant (see http://jakarta.apache.org/ant/index.html)
|
||||
Requires Ant version 1.2 or later
|
||||
-->
|
||||
|
||||
<project name="Rhino" default="help" basedir=".">
|
||||
|
||||
<target name="properties">
|
||||
<property name="name" value="rhino"/>
|
||||
<property name="Name" value="Rhino"/>
|
||||
<property name="version" value="1_5R5pre"/>
|
||||
<property name="rhino.jar" value="js.jar"/>
|
||||
<property name="small-rhino.jar" value="smalljs.jar"/>
|
||||
|
||||
<property name="jar-compression" value="true"/>
|
||||
<property name="debug" value="on"/>
|
||||
|
||||
<property name="build.dir" value="./build"/>
|
||||
<property name="classes" value="${build.dir}/classes"/>
|
||||
|
||||
<property name="dist.name" value="rhino${version}"/>
|
||||
<property name="dist.dir" value="${build.dir}/${dist.name}"/>
|
||||
<property name="dist.src" value="${dist.dir}/src"/>
|
||||
<property name="dist.toolsrc" value="${dist.dir}/toolsrc"/>
|
||||
<property name="dist.examples" value="${dist.dir}/examples"/>
|
||||
<property name="dist.docs" value="${dist.dir}/docs"/>
|
||||
<property name="dist.apidocs" value="${dist.docs}/apidocs"/>
|
||||
<property name="dist.file" value="rhino${version}.zip"/>
|
||||
<property name="dist.source-only-zip" value="rhino${version}-sources.zip"/>
|
||||
|
||||
<property file="apiClasses.properties"/>
|
||||
<property name="docsrc.dir" value="docs"/>
|
||||
<property name="dist.docsrc.dir" value="src/docs"/>
|
||||
</target>
|
||||
|
||||
<target name="init" depends="properties">
|
||||
<mkdir dir="${build.dir}"/>
|
||||
<mkdir dir="${classes}"/>
|
||||
<mkdir dir="${dist.dir}"/>
|
||||
<mkdir dir="${dist.src}"/>
|
||||
<mkdir dir="${dist.toolsrc}"/>
|
||||
<mkdir dir="${dist.examples}"/>
|
||||
<mkdir dir="${dist.docs}"/>
|
||||
<mkdir dir="${dist.apidocs}"/>
|
||||
</target>
|
||||
|
||||
<target name="compile" depends="init">
|
||||
<ant dir="src" target="compile"/>
|
||||
<ant dir="toolsrc" target="compile"/>
|
||||
</target>
|
||||
|
||||
<target name="copy-source" depends="init">
|
||||
<ant dir="src" target="copy-source"/>
|
||||
<ant dir="toolsrc" target="copy-source"/>
|
||||
<copy todir="${dist.dir}" file="build.xml"/>
|
||||
<copy todir="${dist.dir}" file="apiClasses.properties"/>
|
||||
</target>
|
||||
|
||||
<target name="jar" depends="compile">
|
||||
<jar jarfile="${dist.dir}/${rhino.jar}"
|
||||
basedir="${classes}"
|
||||
manifest="src/manifest"
|
||||
compress="${jar-compression}"
|
||||
/>
|
||||
</target>
|
||||
|
||||
<target name="smalljar" depends="compile">
|
||||
|
||||
<jar basedir="${classes}" destfile="${dist.dir}/${small-rhino.jar}"
|
||||
compress="${jar-compression}">
|
||||
<include name="org/mozilla/javascript/*.class"/>
|
||||
<exclude name="org/mozilla/javascript/ClassNameHelper*.class"/>
|
||||
<exclude name="org/mozilla/javascript/ClassRepository*.class"/>
|
||||
<exclude name="org/mozilla/javascript/JavaAdapter*.class"/>
|
||||
<exclude name="org/mozilla/javascript/NotAFunctionException*.class"/>
|
||||
<exclude name="org/mozilla/javascript/Token.class"/>
|
||||
|
||||
<include name="org/mozilla/javascript/debug/*.class"/>
|
||||
<include name="org/mozilla/javascript/resources/*.properties"/>
|
||||
|
||||
<include name="org/mozilla/javascript/regexp/*.class"
|
||||
unless="no-regexp"/>
|
||||
</jar>
|
||||
|
||||
</target>
|
||||
|
||||
<target name="copy-examples" depends="init">
|
||||
<copy todir="${dist.examples}">
|
||||
<fileset dir="examples" includes="*.java,*.js,*.html" />
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<target name="copy-misc" depends="init">
|
||||
<tstamp/>
|
||||
<filter token="datestamp" value="${TODAY}"/>
|
||||
<copy todir="${dist.dir}" filtering="yes">
|
||||
<fileset dir=".">
|
||||
<patternset>
|
||||
<include name="build-date"/>
|
||||
</patternset>
|
||||
</fileset>
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<target name="copy-all" depends="copy-source,copy-examples,copy-misc">
|
||||
</target>
|
||||
|
||||
<target name="copy-docs" depends="init">
|
||||
<echo message="copy from ${docsrc.dir}"/>
|
||||
<copy todir="${dist.docs}">
|
||||
<fileset dir="${docsrc.dir}"
|
||||
includes="**/*.html,**/*.jpg,**/*.gif" />
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<target name="javadoc" depends="compile,copy-docs">
|
||||
<javadoc sourcefiles="${apiClasses}"
|
||||
sourcepath="src"
|
||||
destdir="${dist.apidocs}"
|
||||
overview="${dist.docs}/api.html"
|
||||
version="true"
|
||||
author="true"
|
||||
public="true"
|
||||
windowtitle="${Name}" />
|
||||
</target>
|
||||
|
||||
<target name="dist" depends="deepclean,jar,copy-all,javadoc">
|
||||
<delete file="${dist.file}" />
|
||||
<zip zipfile="${dist.file}"
|
||||
basedir="${build.dir}"
|
||||
includes="**"
|
||||
excludes="classes/**" />
|
||||
</target>
|
||||
|
||||
<target name="source-zip" depends="copy-source">
|
||||
<delete file="${dist.source-only-zip}" />
|
||||
<zip zipfile="${dist.source-only-zip}" basedir="${build.dir}"
|
||||
includes="${dist.name}/src/**,${dist.name}/toolsrc/**,${dist.name}/build.xml,${dist.name}/apiClasses.properties"/>
|
||||
</target>
|
||||
|
||||
<target name="clean" depends="properties">
|
||||
<delete quiet="true" file="${dist.dir}/${rhino.jar}"/>
|
||||
<delete quiet="true" file="${dist.dir}/${small-rhino.jar}"/>
|
||||
<delete quiet="true" dir="${classes}"/>
|
||||
</target>
|
||||
|
||||
<target name="deepclean" depends="properties">
|
||||
<delete quiet="true" dir="${build.dir}"/>
|
||||
<delete quiet="true" file="${dist.file}"/>
|
||||
<delete quiet="true" file="${dist.source-only-zip}"/>
|
||||
</target>
|
||||
|
||||
<target name="help" depends="properties">
|
||||
<echo>The following targets are available with this build file:
|
||||
|
||||
clean remove all compiled classes and copied property files
|
||||
|
||||
compile compile all classes and copy all property files
|
||||
into ${classes} directory
|
||||
|
||||
deepclean remove all generated files and directories
|
||||
|
||||
dist create ${dist.file} with full Rhino distribution
|
||||
|
||||
help print this help
|
||||
|
||||
jar create ${rhino.jar} in ${dist.dir}
|
||||
|
||||
smalljar create ${small-rhino.jar} in ${dist.dir} with
|
||||
minimalist set of Rhino classes. See footprint.html
|
||||
from the doc directory for details.
|
||||
|
||||
javadoc generate generate Rhino API documentation
|
||||
in ${dist.apidocs}
|
||||
|
||||
source-zip create ${dist.source-only-zip} with all Rhino
|
||||
source files necessary to recreate ${rhino.jar}
|
||||
</echo>
|
||||
</target>
|
||||
|
||||
</project>
|
||||
@@ -1,161 +0,0 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
|
||||
<META NAME="Generator" CONTENT="Microsoft Word 97">
|
||||
<TITLE>1</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
|
||||
<OL>
|
||||
|
||||
<B><FONT FACE="Arial" SIZE=5 COLOR="#000080"><LI>Using the Rhino JavaScript Debugger</LI>
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">The Mozilla Rhino JavaScript engine includes a source-level debugger for debugging JavaScript scripts. The debugger is itself a Java program which you may run as</P>
|
||||
</FONT><FONT FACE="Arial" SIZE=2><P ALIGN="JUSTIFY">java org.mozilla.javascript.tools.debugger.JSDebugger [options] [filename.js] [script-arguments]</P>
|
||||
</FONT><FONT SIZE=2><P ALIGN="JUSTIFY">where the options are the same as the shell.</P>
|
||||
<OL>
|
||||
|
||||
<LI><A NAME="_Toc502165108"></FONT><B><FONT FACE="Arial" SIZE=4 COLOR="#000080">Features</A></LI>
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">The Rhino JavaScript Debugger can debug scripts running in multiple threads and provides facilities to set and clear breakpoints, control execution, view variables, and evaluate arbitrary JavaScript code in the current scope of an executing script.</P>
|
||||
<OL>
|
||||
|
||||
<LI><A NAME="_Toc502165109"></FONT><B><FONT FACE="Arial" COLOR="#000080">Console Window</A></LI>
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">The debugger redirects the </FONT><FONT FACE="Arial" SIZE=2>System.out</FONT><FONT SIZE=2>, </FONT><FONT FACE="Arial" SIZE=2>System.in</FONT><FONT SIZE=2>, and </FONT><FONT FACE="Arial" SIZE=2>System.err</FONT><FONT SIZE=2> streams to an internal JavaScript console window which provides an editable command line for you to enter JavaScript code and view system output. The console window maintains a history of the commands you have entered. You may move backward and forward through the history list by pressing the Up/Down arrow keys on the keyboard.</P>
|
||||
<LI><A NAME="_Toc502165110"></FONT><B><FONT FACE="Arial" COLOR="#000080">Opening Scripts</A></LI>
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">You may select the <B><I>File->Open</B></I> menu item on the menu bar to load JavaScript scripts contained in files. This action will display a file-selection dialog box prompting you for the location of a script to load. The selected file will be compiled and displayed in a new window.</P>
|
||||
</FONT><B><FONT FACE="Arial" COLOR="#000080"><LI>Running Scripts</LI>
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">You may select the <B><I>File->Run</B></I> menu item on the menu bar to execute JavaScript scripts contained in files. This action will display a file-selection dialog box prompting you for the location of a script to execute. The loaded script will be run in a new thread and control will be given to the debugger on its first instruction.</P>
|
||||
<LI><A NAME="_Toc502165111"></FONT><B><FONT FACE="Arial" COLOR="#000080">Controlling Execution</A></LI>
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">The debugger provides the following facilities for you to control the execution of scripts you are debugging:</P>
|
||||
<OL>
|
||||
|
||||
</FONT><B><FONT FACE="Arial" COLOR="#000080"><LI>Step Into</LI></OL>
|
||||
</OL>
|
||||
</OL>
|
||||
</OL>
|
||||
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">To single step entering any function calls, you may do any of the following:</P>
|
||||
|
||||
<UL>
|
||||
<P ALIGN="JUSTIFY"><LI>Select the <B><I>Debug->Step Into </B></I>menu item on the menu bar</LI></P>
|
||||
<P ALIGN="JUSTIFY"><LI>Press the <B><I>Step Into</B></I> button on the toolbar</LI></P>
|
||||
<P ALIGN="JUSTIFY"><LI>Press the F11 key on the keyboard</LI></P></UL>
|
||||
|
||||
<P ALIGN="JUSTIFY">Execution will resume. If the current line in the script contains a function call control will return to the debugger upon entry into the function. Otherwise control will return to the debugger at the next line in the current function.</P>
|
||||
<OL>
|
||||
<OL>
|
||||
<OL>
|
||||
<OL>
|
||||
|
||||
</FONT><B><FONT FACE="Arial" COLOR="#000080"><LI>Step Over</LI></OL>
|
||||
</OL>
|
||||
</OL>
|
||||
</OL>
|
||||
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">To single step to the next line in the current function, you may do any of the following:</P>
|
||||
|
||||
<UL>
|
||||
<P ALIGN="JUSTIFY"><LI>Select the <B><I>Debug->Step Over</B></I> menu item on the menu bar</LI></P>
|
||||
<P ALIGN="JUSTIFY"><LI>Press the <B><I>Step Over</B></I> button on the toolbar</LI></P>
|
||||
<P ALIGN="JUSTIFY"><LI>Press the F7 key on the keyboard</LI></P></UL>
|
||||
|
||||
<P ALIGN="JUSTIFY">Execution will resume but control will return to the debugger at the next line in the current function or top-level script.</P>
|
||||
<OL>
|
||||
<OL>
|
||||
<OL>
|
||||
<OL>
|
||||
|
||||
</FONT><B><FONT FACE="Arial" COLOR="#000080"><LI>Step Out</LI></OL>
|
||||
</OL>
|
||||
</OL>
|
||||
</OL>
|
||||
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">To continue execution until the current function returns you may do any of the following:</P>
|
||||
|
||||
<UL>
|
||||
<P ALIGN="JUSTIFY"><LI>Select the <B><I>Debug->Step Out</B></I> menu item on the menu bar</LI></P>
|
||||
<P ALIGN="JUSTIFY"><LI>Press the <B><I>Step Out</B></I> button on the toolbar</LI></P>
|
||||
<P ALIGN="JUSTIFY"><LI>Press the F8 key on the keyboard</LI></P></UL>
|
||||
|
||||
<P ALIGN="JUSTIFY">Execution will resume until the current function returns or a breakpoint is hit.</P>
|
||||
<OL>
|
||||
<OL>
|
||||
<OL>
|
||||
<OL>
|
||||
|
||||
</FONT><B><FONT FACE="Arial" COLOR="#000080"><LI>Go</LI></OL>
|
||||
</OL>
|
||||
</OL>
|
||||
</OL>
|
||||
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">To resume execution of a script you may do any of the following:</P>
|
||||
|
||||
<UL>
|
||||
<P ALIGN="JUSTIFY"><LI>Select the <B><I>Debug->Go</B></I> menu item on the menu bar</LI></P>
|
||||
<P ALIGN="JUSTIFY"><LI>Press the <B><I>Go</B></I> button on the toolbar</LI></P>
|
||||
<P ALIGN="JUSTIFY"><LI>Press the F5 key on the keyboard</LI></P></UL>
|
||||
|
||||
<P ALIGN="JUSTIFY">Execution will resume until a breakpoint is hit or the script completes.</P>
|
||||
<P ALIGN="JUSTIFY"> </P>
|
||||
<OL>
|
||||
<OL>
|
||||
<OL>
|
||||
<OL>
|
||||
|
||||
</FONT><B><FONT FACE="Arial" COLOR="#000080"><LI>Break</LI></OL>
|
||||
</OL>
|
||||
</OL>
|
||||
</OL>
|
||||
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">To stop all running scripts and give control to the debugger you may do any of the following:</P>
|
||||
|
||||
<UL>
|
||||
<P ALIGN="JUSTIFY"><LI>Select the <B><I>Debug->Break</B></I> menu item on the menu bar</LI></P>
|
||||
<P ALIGN="JUSTIFY"><LI>Press the <B><I>Break</B></I> button on the toolbar</LI></P>
|
||||
<P ALIGN="JUSTIFY"><LI>Press the Pause/Break key on the keyboard</LI></P></UL>
|
||||
|
||||
<OL>
|
||||
<OL>
|
||||
<OL>
|
||||
|
||||
<LI><A NAME="_Toc502165112"></FONT><B><FONT FACE="Arial" COLOR="#000080">Moving Up and Down the Stack</A></LI>
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">The lower-left (dockable) pane in the debugger main window contains a combo-box labeled "Context:" which displays the current stack of the executing script. You may move up and down the stack by selecting an entry in the combo-box. When you select a stack frame the variables and watch windows are updated to reflect the names and values of the variables visible at that scope.</P>
|
||||
<LI><A NAME="_Toc502165113"></FONT><B><FONT FACE="Arial" COLOR="#000080">Setting and Clearing Breakpoints</A></LI></OL>
|
||||
</OL>
|
||||
</OL>
|
||||
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">The main desktop of the debugger contains file windows which display the contents of each script you are debugging. You may set a breakpoint in a script by doing one of the following:</P>
|
||||
|
||||
<UL>
|
||||
<P ALIGN="JUSTIFY"><LI>Place the cursor on the line at which you want to set a breakpoint and right-click with the mouse. This action will display a pop-up menu. Select the <B><I>Set Breakpoint</B></I> menu item. </LI></P>
|
||||
<P ALIGN="JUSTIFY"><LI>Simply single-click on the line number of the line at which you want to set a breakpoint.</LI></P></UL>
|
||||
|
||||
<P ALIGN="JUSTIFY">If the selected line contains executable code a red dot will appear next to the line number and a breakpoint will be set at that location.</P>
|
||||
<P ALIGN="JUSTIFY">You may set clear breakpoint in a script by doing one of the following:</P>
|
||||
|
||||
<UL>
|
||||
<P ALIGN="JUSTIFY"><LI>Place the cursor on the line at which you want to clear a breakpoint and right-click with the mouse. This action will display a pop-up menu. Select the <B><I>Clear Breakpoint</B></I> menu item. </LI></P>
|
||||
<P ALIGN="JUSTIFY"><LI>Simply single-click on the red dot or the line number of the line at which you want to clear a breakpoint.</LI></P></UL>
|
||||
|
||||
<P ALIGN="JUSTIFY">The red dot will disappear and the breakpoint at that location will be cleared.</P>
|
||||
<OL>
|
||||
<OL>
|
||||
<OL>
|
||||
|
||||
<LI><A NAME="_Toc502165114"></FONT><B><FONT FACE="Arial" COLOR="#000080">Viewing Variables</A></LI>
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">The lower-left (dockable) pane in the debugger main window contains a tab-pane with two tabs, labeled "this" and "Locals". Each pane contains a tree-table which displays the properties of the current object and currently visible local variables, respectively. </P>
|
||||
<OL>
|
||||
|
||||
</FONT><B><FONT FACE="Arial" COLOR="#000080"><LI>This</LI></OL>
|
||||
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">The properties of the current object are displayed in the <B><I>this</B></I> table. If a property is itself a JavaScript object the property may be expanded to show its sub-properties. The <B><I>this</B></I> table is updated each time control returns to the debugger or when you change the stack location in the <B><I>Context:</B></I> window.</P>
|
||||
<LI><A NAME="_Toc502165115"></FONT><B><FONT FACE="Arial" COLOR="#000080">Locals</A></LI>
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">The local variables of the current function are displayed in the <B><I>Locals</B></I> table. If a variable is itself a JavaScript object the variable may be expanded to show its sub-properties. The <B><I>Locals</B></I> table is updated each time control returns to the debugger or when you change the stack location in the <B><I>Context:</B></I> window</P>
|
||||
<LI><A NAME="_Toc502165116"></FONT><B><FONT FACE="Arial" COLOR="#000080">Watch Window</A></LI>
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">You may enter arbitrary JavaScript expressions in the <B><I>Watch:</B></I> table located in the lower-right (dockable) pane in the debugger main window. The expressions you enter are reevaluated in the current scope and their current values displayed each time control returns to the debugger or when you change the stack location in the <B><I>Context:</B></I> window.</P>
|
||||
<LI><A NAME="_Toc502165117"></FONT><B><FONT FACE="Arial" COLOR="#000080">Evaluation Window</A></LI></OL>
|
||||
</OL>
|
||||
</OL>
|
||||
|
||||
</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">The <B><I>Evaluate</B></I> pane located in the lower-right (dockable) pane in the debugger main window contains an editable command line where you may enter arbitrary JavaScript code. The code is evaluated in the context of the current stack frame. The window maintains a history of the commands you have entered. You may move backward or forward through the history by pressing the Up/Down arrow keys on the keyboard. </P>
|
||||
</FONT></BODY>
|
||||
</HTML>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,142 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; U) [Netscape]">
|
||||
<title>JavaScript API</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
|
||||
|
||||
<h1 align="center">
|
||||
Rhino API Reference.</h1>
|
||||
|
||||
<h4>
|
||||
The Control API</h4>
|
||||
These APIs provide methods for controlling the actions of JavaScript in
|
||||
a host environment.
|
||||
<ul>
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/Context.html">Context</a> - Represents
|
||||
the runtime context of an executing script. Has methods to associate the
|
||||
JavaScript evaluation engine with a Java thread, set attributes of the
|
||||
engine, and compile and evaluate scripts.</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/ContextListener.html">ContextListener</a>
|
||||
- Allows embeddings to be notified of the creation, entering, exiting,
|
||||
and releasing of Contexts. </li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/Script.html">Script</a> - The result of
|
||||
compiling a JavaScript script. Also encapsulates script execution.</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/ErrorReporter.html">ErrorReporter</a> -
|
||||
This interface can be implemented to control the actions the JavaScript
|
||||
engine takes when it encounters errors.</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/SecurityController.html">SecurityController</a>
|
||||
- Optional support routines that must be provided by embeddings implementing
|
||||
security controls on scripts.</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/ClassShutter.html">ClassShutter</a>
|
||||
- Embeddings that wish to filter Java classes that are visible to scripts
|
||||
through the LiveConnect, should implement this interface.</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/Wrapper.html">Wrapper</a> - Interface implemented
|
||||
by objects wrapping other objects. Provides a method for recovering the
|
||||
wrapped value.</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/WrapHandler.html">WrapHandler</a> - Interface
|
||||
embedders can implement in order to control the way Java objects are wrapped
|
||||
for use by JavaScript.</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/ClassOutput.html">ClassOutput</a> - Interface
|
||||
embedders can implement in order to control the placement of generated
|
||||
class bytecodes.</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/serialize/ScriptableOutputStream.html">ScriptableOutputStream</a> - This stream can be used to serialize JavaScript objects and functions.
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/serialize/ScriptableInputStream.html">ScriptableInputStream</a> - This stream can be used to deserialize JavaScript objects and functions.
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<h4>
|
||||
The Host Object API</h4>
|
||||
These APIs provide support for adding objects specific to a particular
|
||||
embedding of JavaScript in a host environment. Note that if you just want
|
||||
to script existing Java classes, you should just use <a href="http://developer.netscape.com/library/documentation/communicator/jsguide4/livecon.htm">LiveConnect</a>.
|
||||
It is also helpful to understand some of the implementation of the <a href="runtime.html">runtime</a>.
|
||||
<ul>
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/Scriptable.html">Scriptable</a> - All JavaScript
|
||||
objects must implement this interface. Provides methods to access properties
|
||||
and attributes of those properties, as well as other services required
|
||||
of JavaScript objects.</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/Function.html">Function</a> - All JavaScript
|
||||
functions must implement this interface. Extends Scriptable, adding methods
|
||||
to support invocation.</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/ScriptableObject.html">ScriptableObject</a>
|
||||
- A default implementation of Scriptable that may be extended. Implements
|
||||
property and attribute storage and lookup and other default JavaScript
|
||||
object behavior.</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/FunctionObject.html">FunctionObject</a>
|
||||
- An implementation of Function that allows Java methods and constructors
|
||||
to be used as JavaScript function objects.</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/ImporterTopLevel.html">ImporterTopLevel</a>
|
||||
- Allows embeddings to use the importClass and importPackage functions.</li>
|
||||
</ul>
|
||||
|
||||
<h4>
|
||||
Exceptions</h4>
|
||||
These exceptions are thrown by JavaScript.
|
||||
<ul>
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/JavaScriptException.html">JavaScriptException</a>
|
||||
- Thrown from within JavaScript by the JavaScript 'throw' statement, or
|
||||
by LiveConnect calls from JavaScript into Java. Wraps a JavaScript value.</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/ClassDefinitionException.html">ClassDefinitionException</a>
|
||||
- Thrown if errors are detected while attempting to define a host object
|
||||
from a Java class.</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/PropertyException.html">PropertyException</a>
|
||||
- Thrown if errors are detected while attempting to define a property of
|
||||
a host object from a Java class or method, or if a property is not found.</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/NotAFunctionException.html">NotAFunctionException</a>
|
||||
- Thrown when attempting to call an object that is not a function.</li>
|
||||
|
||||
<li>
|
||||
<a href="org/mozilla/javascript/EvaluatorException.html">EvaluatorException</a>
|
||||
- An exception thrown when an error is detected during the execution of
|
||||
a script. The default error reporter will throw EvaluatorExceptions when
|
||||
an error is encountered.</li>
|
||||
</ul>
|
||||
|
||||
<hr WIDTH="100%">
|
||||
<br><a href="overview-summary.html">back to top</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,43 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.75 [en] (WinNT; U) [Netscape]">
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java, BSF, Apache">
|
||||
<title>Rhino and BSF</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
<script src="owner.js"></script>
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
Using Rhino with BSF and Apache</h1></center>
|
||||
<script>document.write(owner());</script>
|
||||
|
||||
<br><script>
|
||||
var d = new Date(document.lastModified);
|
||||
document.write((d.getMonth()+1)+"/"+d.getDate()+"/"+d.getFullYear());
|
||||
document.write('<br>');
|
||||
</script>
|
||||
|
||||
<hr WIDTH="100%">
|
||||
<br>The <a href="http://oss.software.ibm.com/developerworks/projects/bsf">Bean
|
||||
Scripting Framework</a> (or BSF) was originally developed by IBM and now
|
||||
published as open source. It provides a framework for using a number of
|
||||
scripting languages with Java. Rhino is one of the supported languages.
|
||||
<p>This framework has been embedded in a number of open source projects,
|
||||
including the XSL processor <a href="http://xml.apache.org/xalan-j/index.html">Xalan</a>
|
||||
and the XML/Java build tool <a href="http://ant.apache.org/">Ant</a>.
|
||||
<p>You can download a version of <tt>bsf.jar</tt> from <a href="http://oss.software.ibm.com/developerworks/projects/bsf">http://oss.software.ibm.com/developerworks/projects/bsf</a>
|
||||
that includes the <tt>com.ibm.bsf.engines.javascript.JavaScriptEngine</tt>
|
||||
class. The current version is 2.2 release candidate at the time of this
|
||||
writing. This version thus supports JavaScript through Rhino when used
|
||||
with the <tt>js.jar</tt> file from either <tt>rhino15R1.zip</tt> or <tt>rhinoTip.zip</tt>.
|
||||
<p>See <a href="http://xml.apache.org/xalan/extensions.html#ex-basic">Xalan-Java
|
||||
Extensions</a> for more information on adding JavaScript to XSL and the
|
||||
<a href="http://jakarta.apache.org/ant/jakarta-ant/docs/#script">Script
|
||||
task</a> for using scripting in Ant build files.
|
||||
<p><a href="index.html">back to top</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,21 +0,0 @@
|
||||
<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java">
|
||||
<title>Change Log</title>
|
||||
</head>
|
||||
|
||||
<body bgcolor="#ffffff">
|
||||
|
||||
<h1 align="center">
|
||||
Change Log for Significant Rhino Changes</h1>
|
||||
|
||||
This is a log of significant changes since Rhino 1.5 Release 4.
|
||||
|
||||
<h3>Nothing significant yet!</h3>
|
||||
|
||||
<hr width="100%"><br>
|
||||
<a href="index.html">back to top</a></h3>
|
||||
|
||||
</body></html>
|
||||
@@ -1,249 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; I) [Netscape]">
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java, Debugger">
|
||||
<title>Rhino Debugger</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
<script src="owner.js">
|
||||
|
||||
</script>
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
Rhino JavaScript Debugger</h1></center>
|
||||
Christopher Oliver
|
||||
<br><script>document.write(owner());</script>
|
||||
|
||||
<br>6/28/2001
|
||||
<center>
|
||||
<hr WIDTH="100%"></center>
|
||||
The Rhino JavaScript debugger is a GUI that allows debugging of interpreted
|
||||
JavaScript scripts run in Rhino. Note that this debugger <i>will not</i>
|
||||
work with JavaScript scripts run in the mozilla browser since Rhino is
|
||||
not the engine used in such environments.
|
||||
<p><img SRC="jsdebug.jpg" height=460 width=600>
|
||||
<p>Current limitations:
|
||||
<ul>
|
||||
<li>
|
||||
Requires JDK 1.2 or greater</li>
|
||||
|
||||
<li>
|
||||
Requires js.jar from rhinoTip.zip</li>
|
||||
|
||||
<li>
|
||||
No breakpoint menu</li>
|
||||
</ul>
|
||||
<b><font face="Arial"><font color="#000080"><font size=+2>Using the Rhino
|
||||
JavaScript Debugger</font></font></font></b>
|
||||
<p><font size=-1>The Mozilla Rhino JavaScript engine includes a source-level
|
||||
debugger for debugging JavaScript scripts. The debugger is itself a Java
|
||||
program which you may run as</font>
|
||||
<ol><font face="Arial"><font size=-1>java org.mozilla.javascript.tools.debugger.Main
|
||||
[options] [filename.js] [script-arguments]</font></font></ol>
|
||||
<font size=-1>where the options are the same as the shell.</font>
|
||||
<p><font size=-1>The Rhino JavaScript Debugger can debug scripts running
|
||||
in multiple threads and provides facilities to set and clear breakpoints,
|
||||
control execution, view variables, and evaluate arbitrary JavaScript code
|
||||
in the current scope of an executing script.</font>
|
||||
<p><a NAME="_Toc502165109"></a><b><font face="Arial"><font color="#000080"><font size=-1>Console
|
||||
Window</font></font></font></b>
|
||||
<br><font size=-1>The debugger redirects the <font face="Arial">System.out</font>,
|
||||
<font face="Arial">System.in</font>,
|
||||
and <font face="Arial">System.err</font> streams to an internal JavaScript
|
||||
console window which provides an editable command line for you to enter
|
||||
JavaScript code and view system output. The console window maintains a
|
||||
history of the commands you have entered. You may move backward and forward
|
||||
through the history list by pressing the Up/Down arrow keys on the keyboard.</font>
|
||||
<br><a NAME="_Toc502165110"></a><b><font face="Arial"><font color="#000080"><font size=-1>Opening
|
||||
Scripts</font></font></font></b>
|
||||
<br><font size=-1>You may select the <b><i>File->Open</i></b> menu item
|
||||
on the menu bar to load JavaScript scripts contained in files. This action
|
||||
will display a file-selection dialog box prompting you for the location
|
||||
of a script to load. The selected file will be compiled and displayed in
|
||||
a new window.</font>
|
||||
<br><a NAME="_RunningScripts"></a><b><font face="Arial"><font color="#000080"><font size=-1>Running
|
||||
Scripts</font></font></font></b>
|
||||
<br><font size=-1>You may select the <b><i>File->Run</i></b> menu item
|
||||
on the menu bar to execute JavaScript scripts contained in files. This
|
||||
action will display a file-selection dialog box prompting you for the location
|
||||
of a script to execute. The loaded script will be run in a new thread and
|
||||
control will be given to the debugger on its first instruction.</font>
|
||||
<p><a NAME="_Toc502165111"></a><b><font face="Arial"><font color="#000080"><font size=+1>Controlling
|
||||
Execution</font></font></font></b>
|
||||
<br><font size=-1>The debugger provides the following facilities for you
|
||||
to control the execution of scripts you are debugging:</font>
|
||||
<p><b><font face="Arial"><font color="#000080">Step Into</font></font></b>
|
||||
<br><font size=-1>To single step entering any function calls, you may do
|
||||
any of the following:</font>
|
||||
<ul>
|
||||
<li>
|
||||
<font size=-1>Select the <b><i>Debug->Step Into </i></b>menu item on the
|
||||
menu bar</font></li>
|
||||
|
||||
<li>
|
||||
<font size=-1>Press the <b><i>Step Into</i></b> button on the toolbar</font></li>
|
||||
|
||||
<li>
|
||||
<font size=-1>Press the F11 key on the keyboard</font></li>
|
||||
</ul>
|
||||
<font size=-1>Execution will resume. If the current line in the script
|
||||
contains a function call control will return to the debugger upon entry
|
||||
into the function. Otherwise control will return to the debugger at the
|
||||
next line in the current function.</font>
|
||||
<p><b><font face="Arial"><font color="#000080">Step Over</font></font></b>
|
||||
<br><font size=-1>To single step to the next line in the current function,
|
||||
you may do any of the following:</font>
|
||||
<ul>
|
||||
<li>
|
||||
<font size=-1>Select the <b><i>Debug->Step Over</i></b> menu item on the
|
||||
menu bar</font></li>
|
||||
|
||||
<li>
|
||||
<font size=-1>Press the <b><i>Step Over</i></b> button on the toolbar</font></li>
|
||||
|
||||
<li>
|
||||
<font size=-1>Press the F7 key on the keyboard</font></li>
|
||||
</ul>
|
||||
<font size=-1>Execution will resume but control will return to the debugger
|
||||
at the next line in the current function or top-level script.</font>
|
||||
<p><b><font face="Arial"><font color="#000080">Step Out</font></font></b>
|
||||
<br><font size=-1>To continue execution until the current function returns
|
||||
you may do any of the following:</font>
|
||||
<ul>
|
||||
<li>
|
||||
<font size=-1>Select the <b><i>Debug->Step Out</i></b> menu item on the
|
||||
menu bar</font></li>
|
||||
|
||||
<li>
|
||||
<font size=-1>Press the <b><i>Step Out</i></b> button on the toolbar</font></li>
|
||||
|
||||
<li>
|
||||
<font size=-1>Press the F8 key on the keyboard</font></li>
|
||||
</ul>
|
||||
<font size=-1>Execution will resume until the current function returns
|
||||
or a breakpoint is hit.</font>
|
||||
<p><b><font face="Arial"><font color="#000080">Go</font></font></b>
|
||||
<br><font size=-1>To resume execution of a script you may do any of the
|
||||
following:</font>
|
||||
<ul>
|
||||
<li>
|
||||
<font size=-1>Select the <b><i>Debug->Go</i></b> menu item on the menu
|
||||
bar</font></li>
|
||||
|
||||
<li>
|
||||
<font size=-1>Press the <b><i>Go</i></b> button on the toolbar</font></li>
|
||||
|
||||
<li>
|
||||
<font size=-1>Press the F5 key on the keyboard</font></li>
|
||||
</ul>
|
||||
<font size=-1>Execution will resume until a breakpoint is hit or the script
|
||||
completes.</font>
|
||||
<p><b><font face="Arial"><font color="#000080">Break</font></font></b>
|
||||
<br><font size=-1>To stop all running scripts and give control to the debugger
|
||||
you may do any of the following:</font>
|
||||
<ul>
|
||||
<li>
|
||||
<font size=-1>Select the <b><i>Debug->Break</i></b> menu item on the menu
|
||||
bar</font></li>
|
||||
|
||||
<li>
|
||||
<font size=-1>Press the <b><i>Break</i></b> button on the toolbar</font></li>
|
||||
|
||||
<li>
|
||||
<font size=-1>Press the Pause/Break key on the keyboard</font></li>
|
||||
</ul>
|
||||
|
||||
<a NAME="_RunningScripts"></a><b><font face="Arial"><font color="#000080"><font size=-1>Break
|
||||
on Exceptions</font></font></font></b>
|
||||
<br><font size=-1>To give control to the debugger whenever a JavaScript
|
||||
is exception is thrown select the <b><i>Debug->Break on Exceptions</i></b>
|
||||
checkbox from the menu bar. Whenever a JavaScript exception is thrown
|
||||
by a script a message dialog will be displayed and control will be given
|
||||
to the debugger at the location the exception is raised.</font>
|
||||
|
||||
<p><a NAME="_BreakOnFunctionEnter"></a><b><font face="Arial"><font color="#000080"><font size=-1>Break on Function Enter</font></font></font></b>
|
||||
<br><font size=-1>Selecting <b><i>Debug->Break on Function Enter</i></b> will give control to the debugger whenever the execution is entered into a function or script.</font>
|
||||
|
||||
<p><a NAME="_BreakOnFunctionExit"></a><b><font face="Arial"><font color="#000080"><font size=-1>Break on Function Exit</font></font></font></b>
|
||||
<br><font size=-1>Selecting <b><i>Debug->Break on Function Return</i></b> will give control to the debugger whenever the execution is about to return from a function or script.</font>
|
||||
|
||||
<p><a NAME="_Toc502165112"></a><b><font face="Arial"><font color="#000080">Moving
|
||||
Up and Down the Stack</font></font></b>
|
||||
<br><font size=-1>The lower-left (dockable) pane in the debugger main window
|
||||
contains a combo-box labeled "Context:" which displays the current stack
|
||||
of the executing script. You may move up and down the stack by selecting
|
||||
an entry in the combo-box. When you select a stack frame the variables
|
||||
and watch windows are updated to reflect the names and values of the variables
|
||||
visible at that scope.</font>
|
||||
<p><a NAME="_Toc502165113"></a><b><font face="Arial"><font color="#000080">Setting
|
||||
and Clearing Breakpoints</font></font></b>
|
||||
<br><font size=-1>The main desktop of the debugger contains file windows
|
||||
which display the contents of each script you are debugging. You may set
|
||||
a breakpoint in a script by doing one of the following:</font>
|
||||
<ul>
|
||||
<li>
|
||||
<font size=-1>Place the cursor on the line at which you want to set a breakpoint
|
||||
and right-click with the mouse. This action will display a pop-up menu.
|
||||
Select the <b><i>Set Breakpoint</i></b> menu item.</font></li>
|
||||
|
||||
<li>
|
||||
<font size=-1>Simply single-click on the line number of the line at which
|
||||
you want to set a breakpoint.</font></li>
|
||||
</ul>
|
||||
<font size=-1>If the selected line contains executable code a red dot will
|
||||
appear next to the line number and a breakpoint will be set at that location.</font>
|
||||
<p><font size=-1>You may clear breakpoint in a script by doing one of the
|
||||
following:</font>
|
||||
<ul>
|
||||
<li>
|
||||
<font size=-1>Place the cursor on the line at which you want to clear a
|
||||
breakpoint and right-click with the mouse. This action will display a pop-up
|
||||
menu. Select the <b><i>Clear Breakpoint</i></b> menu item.</font></li>
|
||||
|
||||
<li>
|
||||
<font size=-1>Simply single-click on the red dot or the line number of
|
||||
the line at which you want to clear a breakpoint.</font></li>
|
||||
</ul>
|
||||
<font size=-1>The red dot will disappear and the breakpoint at that location
|
||||
will be cleared.</font>
|
||||
<p><a NAME="_Toc502165114"></a><b><font face="Arial"><font color="#000080"><font size=+1>Viewing
|
||||
Variables</font></font></font></b>
|
||||
<br><font size=-1>The lower-left (dockable) pane in the debugger main window
|
||||
contains a tab-pane with two tabs, labeled "this" and "Locals". Each pane
|
||||
contains a tree-table which displays the properties of the current object
|
||||
and currently visible local variables, respectively.</font>
|
||||
<p><b><font face="Arial"><font color="#000080">This</font></font></b>
|
||||
<br><font size=-1>The properties of the current object are displayed in
|
||||
the
|
||||
<b><i>this</i></b> table. If a property is itself a JavaScript object
|
||||
the property may be expanded to show its sub-properties. The <b><i>this</i></b>
|
||||
table is updated each time control returns to the debugger or when you
|
||||
change the stack location in the <b><i>Context:</i></b> window.</font>
|
||||
<p><b><font face="Arial"><font color="#000080">Locals</font></font></b>
|
||||
<br><font size=-1>The local variables of the current function are displayed
|
||||
in the <b><i>Locals</i></b> table. If a variable is itself a JavaScript
|
||||
object the variable may be expanded to show its sub-properties. The <b><i>Locals</i></b>
|
||||
table is updated each time control returns to the debugger or when you
|
||||
change the stack location in the <b><i>Context:</i></b> window</font>
|
||||
<p><a NAME="_Toc502165116"></a><b><font face="Arial"><font color="#000080">Watch
|
||||
Window</font></font></b>
|
||||
<br><font size=-1>You may enter arbitrary JavaScript expressions in the
|
||||
<b><i>Watch:</i></b>
|
||||
table located in the lower-right (dockable) pane in the debugger main window.
|
||||
The expressions you enter are re-evaluated in the current scope and their
|
||||
current values displayed each time control returns to the debugger or when
|
||||
you change the stack location in the <b><i>Context:</i></b> window.</font>
|
||||
<p><a NAME="_Toc502165117"></a><b><font face="Arial"><font color="#000080">Evaluation
|
||||
Window</font></font></b>
|
||||
<br><font size=-1>The <b><i>Evaluate</i></b> pane located in the lower-right
|
||||
(dockable) pane in the debugger main window contains an editable command
|
||||
line where you may enter arbitrary JavaScript code. The code is evaluated
|
||||
in the context of the current stack frame. The window maintains a history
|
||||
of the commands you have entered. You may move backward or forward through
|
||||
the history by pressing the Up/Down arrow keys on the keyboard.</font>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,171 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
|
||||
<meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
|
||||
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java">
|
||||
<title>Rhino Documentation</title>
|
||||
</head>
|
||||
<body bgcolor="#ffffff">
|
||||
|
||||
<center>
|
||||
<h1> Rhino Documentation</h1>
|
||||
</center>
|
||||
<b><i><font size="+1">General</font></i></b>
|
||||
<table width="100%">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><a href="overview.html">Overview</a>
|
||||
</td>
|
||||
<td>An overview of the JavaScript language and of Rhino.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="limits.html">Requirements and Limitations</a>
|
||||
</td>
|
||||
<td>What you must have to run Rhino; what Rhino cannot do.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="rhino15R4.html">What's new in 1.5R4</a>
|
||||
</td>
|
||||
<td>Changes since 1.5R3.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="debugger.html">Rhino Debugger</a>
|
||||
</td>
|
||||
<td>A debugger for debugging JavaScript running in Rhino.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="opt.html">Optimization</a>
|
||||
</td>
|
||||
<td>Details on the various optimization levels.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="http://sourceforge.net/projects/jscorba">JS/CORBA Adapter</a>
|
||||
</td>
|
||||
<td>Provides a mechanism for arbitrary JavaScript objects to interact
|
||||
with each other transparently in a distributed JavaScript system using CORBA.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="bsf.html">Using Rhino with BSF and Apache</a>
|
||||
</td>
|
||||
<td>How to use Rhino with apps that support BSF.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="changes.html">Recent Changes</a>
|
||||
</td>
|
||||
<td>Describes recent changes to Rhino.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="faq.html">FAQ</a>
|
||||
</td>
|
||||
<td>Answers to frequently asked questions about Rhino.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="http://industry.java.sun.com/javaone/99/event/0,1768,629,00.html">
|
||||
1999 JavaOne session on Rhino</a>
|
||||
</td>
|
||||
<td>A talk on Rhino with slides. Also see the <a href="javaone.html">followup</a>
|
||||
.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="Top"><a href="http://www.ociweb.com/jnb/archive/jnbMar2001.html">
|
||||
Scripting Languages for Java</a>
|
||||
<br>
|
||||
</td>
|
||||
<td valign="Top">An article comparing and contrasting Rhino and Jython.<br>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p><b><i><font size="+1">Writing Scripts</font></i></b>
|
||||
<table width="100%">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><a href="ScriptingJava.html">Scripting Java</a>
|
||||
</td>
|
||||
<td>How to use Rhino to script Java classes.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="scriptjava.html">Scripting Java</a>
|
||||
</td>
|
||||
<td>How to use Rhino to script Java classes (an older treatment).</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="perf.html">Performance Hints</a>
|
||||
</td>
|
||||
<td>Some tips on writing faster JavaScript code.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="tools.html">Tools</a>
|
||||
</td>
|
||||
<td>Some tools for developing JavaScript scripts.</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</p>
|
||||
|
||||
<p><b><i><font size="+1">Embedding Rhino</font></i></b>
|
||||
<table width="100%">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><a href="tutorial.html">Embedding tutorial</a>
|
||||
</td>
|
||||
<td>A short tutorial on how to embed Rhino into your application.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="apidocs/index.html">API javadoc Reference</a>
|
||||
</td>
|
||||
<td>An annotated outline of the programming interface to Rhino (tip only).</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="scopes.html">Scopes and Contexts</a>
|
||||
</td>
|
||||
<td>Describes how to use scopes and contexts for the best performance
|
||||
and flexibility, with an eye toward multithreaded environments.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="serialization.html">Serialization</a>
|
||||
</td>
|
||||
<td>How to serialize JavaScript objects and functions in Rhino.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="runtime.html">Runtime</a>
|
||||
</td>
|
||||
<td>A brief description of the JavaScript runtime.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="footprint.html">Small Footprint</a>
|
||||
</td>
|
||||
<td>Hints for those interested in small-footprint embeddings.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="examples.html">Examples</a>
|
||||
</td>
|
||||
<td>A set of examples showing how to control the JavaScript engine and
|
||||
build JavaScript host objects.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><font color="#000000"><a href="http://www.mozilla.org/js/tests/library.html">
|
||||
Testing</a>
|
||||
</font></td>
|
||||
<td>How to run the JavaScript test suite.</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</p>
|
||||
|
||||
<h3>
|
||||
<hr width="100%"><a href="index.html">back to top</a>
|
||||
</h3>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,91 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="Author" content="Igor Bukanov">
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java">
|
||||
<title>Rhino Downloads</title>
|
||||
</head>
|
||||
<body>
|
||||
<center><b><font size="+3">Rhino Downloads</font></b></center>
|
||||
<p>Rhino is available for download both in source and compiled form. </p>
|
||||
<h3> Binaries</h3>
|
||||
You can download binaries (JAR files) from <a
|
||||
href="ftp://ftp.mozilla.org/pub/mozilla.org/js/"> ftp://ftp.mozilla.org/pub/mozilla.org/js/</a>
|
||||
. Rhino 1.5 Release 4.1 is the last qualified release. It is also possible
|
||||
to download the latest rhino build that reflects newer features and bug
|
||||
fixes, but has not been fully qualified. These zip files also include
|
||||
the source.
|
||||
<p>If you are looking for <tt>js.jar</tt> for XSLT or for IBM's Bean
|
||||
Scripting Framework (BSF), download one of the zip files below and
|
||||
unzip it. </p>
|
||||
<ul>
|
||||
|
||||
<li> <a href="ftp://ftp.mozilla.org/pub/mozilla.org/js/rhino15R41.zip">Rhino 1.5R4.1.</a>
|
||||
<ul>
|
||||
<li> <i><font size="-1"><a href="rhino15R41.html">Description of changes from 1.5R4.1</a> </font></i>.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li> <a href="ftp://ftp.mozilla.org/pub/mozilla.org/js/rhino15R4.zip">Rhino 1.5R4.</a>
|
||||
<ul>
|
||||
<li> <i><font size="-1"><a href="rhino15R4.html">Description of changes from 1.5R3</a> </font></i>.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="ftp://ftp.mozilla.org/pub/mozilla.org/js/rhino15R3.zip">Rhino 1.5R3.</a>
|
||||
<ul>
|
||||
<li> <i><font size="-1"><a href="rhino15R3.html">Description of
|
||||
changes from 1.5R2</a> </font></i>.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li> <a
|
||||
href="ftp://ftp.mozilla.org/pub/mozilla.org/js/older-packages/rhino15R2.zip">Rhino
|
||||
1.5R2.</a>
|
||||
<ul>
|
||||
<li> <i><font size="-1"><a href="rhino15R2.html">Description of
|
||||
changes from 1.5R1</a> </font></i>.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a
|
||||
href="ftp://ftp.mozilla.org/pub/mozilla.org/js/older-packages/rhino15R1.zip">Rhino
|
||||
1.5R1.</a>
|
||||
<ul>
|
||||
<li> <i><font size="-1"><a href="rhino15R1.html">Description of
|
||||
changes from 1.4R3</a> </font></i>.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li> <a
|
||||
href="ftp://ftp.mozilla.org/pub/mozilla.org/js/older-packages/rhino14R3.zip"> Rhino
|
||||
1.4 Release 3</a> .</li>
|
||||
|
||||
<li> <a href="ftp://ftp.mozilla.org/pub/mozilla.org/js/rhinoLatest.zip">Latest
|
||||
Rhino builds</a> .
|
||||
<ul>
|
||||
<li> <i><font size="-1"><a href="changes.html">Description of
|
||||
changes from 1.5R4</a> </font></i>.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
<h3> Source</h3>
|
||||
The source code for Rhino is available under <a
|
||||
href="http://www.mozilla.org/NPL/"> NPL 1.1</a> . In addition to getting
|
||||
the source from the zip files above, the source code for Rhino can be
|
||||
found in the CVS tree at mozilla/js/rhino. See <a
|
||||
href="http://www.mozilla.org/cvs.html">source code via cvs</a> for
|
||||
details on how to set up CVS, define your CVSROOT, and login. Once
|
||||
you've done that, just execute the command
|
||||
<pre> cvs co mozilla/js/rhino</pre>
|
||||
to get the tip source.
|
||||
<p>The current tip can also be viewed using LXR at <a
|
||||
href="http://lxr.mozilla.org/mozilla/source/js/rhino/">
|
||||
http://lxr.mozilla.org/mozilla/source/js/rhino/</a> . </p>
|
||||
<p> </p>
|
||||
<hr width="100%"><a href="index.html">back to top</a> <br>
|
||||
<br>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,278 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Generator" content="Microsoft Word 97">
|
||||
<meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; U) [Netscape]">
|
||||
<title>Embedding ‘Scripting Host’ in Business Applications</title>
|
||||
</head>
|
||||
<body link="#0000FF">
|
||||
<b><font face="Arial"><font size=-1>Embedding
|
||||
‘Scripting Host’ in Business Applications</font></font></b>
|
||||
<p><b><font face="Arial"><font size=-1>Madhukumar Seshadri, <a href="http://www.cognizant.com)/">www.cognizant.com</a></font></font></b>
|
||||
<br>
|
||||
<br>
|
||||
<p><font face="Arial"><font size=-1>With web browsers, continuing to rule
|
||||
the human interface for applications, creating value by being ubiquitous,
|
||||
few adoptions of rich technology that’s getting brewed underneath, will
|
||||
help designing business applications even though most of the current ones
|
||||
are made with bird’s eye of the underlying technologies.</font></font>
|
||||
<p><font face="Arial"><font size=-1>JavaScript is a scripting language
|
||||
invented and developed by Netscape. The language was primarily designed
|
||||
for creating lightweight programming for web browser extensions by exposing
|
||||
the Document Object Model of an HTML page to the scripts. JavaScript is
|
||||
becoming object oriented and getting adopted for server-side scripting.</font></font>
|
||||
<p><font face="Arial"><font size=-1>JavaScript is also becoming a standard
|
||||
in the scripting world as Netscape is working closely with ECMA (European
|
||||
Computer Manufacturers Association) to make it as a standard scripting
|
||||
language for the script world. The standards are published as ECMA Script.</font></font>
|
||||
<p><font face="Arial"><font size=-1>JavaScript originally designed for
|
||||
exposing the DOM (Document Object Model) standardized by World Wide Web
|
||||
consortium (W3C), to help web page designers to control and manipulate
|
||||
the pages dynamically. ‘JavaScript’ engines were embedded in the browsers
|
||||
and they execute those portions of the code embedded in the HTML pages.</font></font>
|
||||
<p><font face="Arial"><font size=-1>In short, JavaScript engine embedded
|
||||
in the browser allowed extensions or manipulations for DOM Object run time
|
||||
for the HTML page by executing the ‘scripts’ associated with them. In other
|
||||
words, browser exposes its DOM object for the page to scripts for extensions
|
||||
and dynamic manipulations of the same, using a language that the script
|
||||
interpreter understands.</font></font>
|
||||
<p><font face="Arial"><font size=-1>Can I do the same for my application
|
||||
by exposing my custom business objects written in my middle-tier? Can I
|
||||
allow user to my write JavaScript extensions for my objects and also be
|
||||
host for executing those scripts?</font></font>
|
||||
<p><font face="Arial"><font size=-1>JavaScript host runs times are available
|
||||
as binaries written in major languages. Check out <a href="http://www.mozilla.org/js">www.mozilla.org/js</a>.
|
||||
Spider Monkey and Rhino are open source JavaScripting engines available
|
||||
from mozilla.</font></font>
|
||||
<p><font face="Arial"><font size=-1>Microsoft implementation of ECMA Script
|
||||
(ECMA Script is based on core JavaScript, created by Netscape) is called
|
||||
JScript. Microsoft binaries of jscript engine can be downloaded from http://msdn.microsoft.com/scripting/.</font></font>
|
||||
<p><font face="Arial"><font size=-1>This document doesn’t explain the JavaScript
|
||||
language in detail but explains how these scripting engines can be used
|
||||
as host to expose business objects in the middle-tier and how the user
|
||||
of these applications can extend it if needed using JavaScript.</font></font>
|
||||
<p><font face="Arial"><font size=-1>The scripting engine Rhino (<a href="http://www.mozilla.org/js)">www.mozilla.org/rhino)</a>,
|
||||
a javascript engine purely written in Java is one that I am going to use
|
||||
for the testing the above.</font></font>
|
||||
<p><font face="Arial"><font size=-1>Let us set some simple goals,</font></font>
|
||||
<ul>
|
||||
<li>
|
||||
<font face="Arial"><font size=-1>Execute a plain ‘JavaScript’ code and
|
||||
use static Java object</font></font></li>
|
||||
|
||||
<li>
|
||||
<font face="Arial"><font size=-1>Instantiate external objects (written
|
||||
in Java) from the script and use them within the script</font></font></li>
|
||||
</ul>
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<p><font face="Arial"><font size=-1>Let us write a simple Javscript to
|
||||
test the above set goals,</font></font>
|
||||
<p><font face="Arial"><font size=-1><b>Fig 1</b> – jshosttest.js</font></font>
|
||||
<p><b><i><font face="Arial"><font size=-1>/* Test 1 */</font></font></i></b>
|
||||
<br><b><i><font face="Arial"><font size=-1>/* Use a static Java Object
|
||||
in the script */</font></font></i></b>
|
||||
<p><font face="Arial"><font size=-1>function test1() {</font></font>
|
||||
<br><font face="Arial"><font size=-1> var str;</font></font>
|
||||
<br><font face="Arial"><font size=-1> str = '"Hello World";</font></font>
|
||||
<br><font face="Arial"><font size=-1> return str;</font></font>
|
||||
<br><font face="Arial"><font size=-1>}</font></font>
|
||||
<p><font face="Arial"><font size=-1>var str = test1( );</font></font>
|
||||
<br><font face="Arial"><font size=-1>//out is expected to be Java Object
|
||||
exposed to the script scope</font></font>
|
||||
<br><font face="Arial"><font size=-1>out.println ("JavaScript - Test 1
|
||||
- " + str);</font></font>
|
||||
<p><b><i><font face="Arial"><font size=-1>/* Test 2 */</font></font></i></b>
|
||||
<p><b><i><font face="Arial"><font size=-1>/* Instantiate a Javaobject for
|
||||
this scope and use it */</font></font></i></b>
|
||||
<p><font face="Arial"><font size=-1>function test2(){</font></font>
|
||||
<br><font face="Arial"><font size=-1> // create a Java
|
||||
string buffer object from JavaScript and use its java instance</font></font>
|
||||
<br><font face="Arial"><font size=-1> // This uses an
|
||||
another Java object created for creating new objects within Java and</font></font>
|
||||
<br><font face="Arial"><font size=-1> // brings the same
|
||||
for JavaScript execution scope</font></font>
|
||||
<br><font face="Arial"><font size=-1> // Refer _create.java
|
||||
for more information</font></font>
|
||||
<br><font face="Arial"><font size=-1> create.getInstance("java.lang.StringBuffer","buffer");</font></font>
|
||||
<br><font face="Arial"><font size=-1> //JavaScript refers
|
||||
the java object instance as ‘buffer’</font></font>
|
||||
<br><font face="Arial"><font size=-1> out.println(buffer.toString());</font></font>
|
||||
<br> <font face="Arial"><font size=-1>buffer.append("I
|
||||
am a javaobject dynamically created and executed in JavaScript");</font></font>
|
||||
<br> <font face="Arial"><font size=-1>return buffer.toString();</font></font>
|
||||
<br><font face="Arial"><font size=-1>}</font></font>
|
||||
<p><font face="Arial"><font size=-1>var str = test2();</font></font>
|
||||
<br><font face="Arial"><font size=-1>out.println("From JavaScript - Test
|
||||
2 " + str);</font></font>
|
||||
<p><font face="Arial"><font size=-1>Let us write a simple Javahost Object
|
||||
using the Rhino engine to execute the above script,</font></font>
|
||||
<p><b><font face="Arial"><font size=-1>Fig 2.1 - JSHost.java</font></font></b>
|
||||
<p><font face="Arial"><font size=-1>/**</font></font>
|
||||
<br><font face="Arial"><font size=-1>* @author Madhukumar Seshadri</font></font>
|
||||
<br><font face="Arial"><font size=-1>* @version</font></font>
|
||||
<br><font face="Arial"><font size=-1>*/</font></font>
|
||||
<p><font face="Arial"><font size=-1>import org.mozilla.javascript.*;</font></font>
|
||||
<br><font face="Arial"><font size=-1>import java.io.*;</font></font>
|
||||
<br><font face="Arial"><font size=-1>import java.lang.*;</font></font>
|
||||
<br><i><font face="Arial"><font size=-1>// import com.xxx.xxx.*;</font></font></i>
|
||||
<p><font face="Arial"><font size=-1>public class JSHost extends Object
|
||||
{</font></font>
|
||||
<br><font face="Arial"><font size=-1> /** Creates new
|
||||
JSHost */</font></font>
|
||||
<br><font face="Arial"><font size=-1> public JSHost()
|
||||
{</font></font>
|
||||
<br><font face="Arial"><font size=-1> }</font></font>
|
||||
<p><i><font face="Arial"><font size=-1> /*** Executes
|
||||
.js file ***/</font></font></i>
|
||||
<br><font face="Arial"><font size=-1> public Object executeJS
|
||||
(String jsfname){</font></font>
|
||||
<br><font face="Arial"><font size=-1> //You can also
|
||||
use evaluateReader</font></font>
|
||||
<br><font face="Arial"><font size=-1> File fp = new File(jsfname);</font></font>
|
||||
<br><font face="Arial"><font size=-1> String str_buff
|
||||
=null;</font></font>
|
||||
<br><font face="Arial"><font size=-1> try {</font></font>
|
||||
<br><font face="Arial"><font size=-1>
|
||||
FileReader fr = new FileReader(jsfname);</font></font>
|
||||
<br><font face="Arial"><font size=-1>
|
||||
int length = (int) fp.length();</font></font>
|
||||
<br><font face="Arial"><font size=-1>
|
||||
char cbuff[] = new char[(char)length];</font></font>
|
||||
<br><font face="Arial"><font size=-1>
|
||||
fr.read(cbuff);</font></font>
|
||||
<br><font face="Arial"><font size=-1>
|
||||
str_buff = new String(cbuff);</font></font>
|
||||
<br><font face="Arial"><font size=-1> } catch(Exception
|
||||
e) {</font></font>
|
||||
<br><font face="Arial"><font size=-1>
|
||||
e.printStackTrace();</font></font>
|
||||
<br><font face="Arial"><font size=-1> }</font></font>
|
||||
<p><font face="Arial"><font size=-1> //Execute the .js
|
||||
file content</font></font>
|
||||
<br><font face="Arial"><font size=-1> return executeJSSource(str_buff);</font></font>
|
||||
<br><font face="Arial"><font size=-1>}</font></font>
|
||||
<p><i><font face="Arial"><font size=-1>/*** Executes javascript source
|
||||
***/</font></font></i>
|
||||
<br><font face="Arial"><font size=-1>public Object executeJSSource (String
|
||||
jsbuff){</font></font>
|
||||
<br><font face="Arial"><font size=-1>Object any=null;</font></font>
|
||||
<br><font face="Arial"><font size=-1>try{</font></font>
|
||||
<br><i><font face="Arial"><font size=-1>//Enter the Context</font></font></i>
|
||||
<br><font face="Arial"><font size=-1><i>// Refer </i><u><font color="#0000FF">http://www.mozilla.org/js/rhino/tutorial.html</font></u></font></font>
|
||||
<br><font face="Arial"><font size=-1>Context context = Context.enter();</font></font>
|
||||
<br><i><font face="Arial"><font size=-1>// Get the execution scope</font></font></i>
|
||||
<br><font face="Arial"><font size=-1>Scriptable scope = context.initStandardObjects();</font></font>
|
||||
<p><i><font face="Arial"><font size=-1>//----------- For Test 1 - Get System.out
|
||||
in scope</font></font></i>
|
||||
<br><font face="Arial"><font size=-1>//Scriptable jObj1 = Context.toObject(System.out,
|
||||
scope);</font></font>
|
||||
<br><font face="Arial"><font size=-1>scope.put("out", scope, jObj1);</font></font>
|
||||
<p><i><font face="Arial"><font size=-1>//------------ For Test 2 - Instantiate
|
||||
Create Object and get that in scope</font></font></i>
|
||||
<br><i><font face="Arial"><font size=-1>//Allow JScript to create Java
|
||||
Objects</font></font></i>
|
||||
<br><i><font face="Arial"><font size=-1>//Bring the _create object to context</font></font></i>
|
||||
<br><font face="Arial"><font size=-1>_create create = new _create( );</font></font>
|
||||
<br><i><font face="Arial"><font size=-1>//Register this context and scope
|
||||
to this create object instance</font></font></i>
|
||||
<br><font face="Arial"><font size=-1>create.registerContext(context,scope);</font></font>
|
||||
<br><font face="Arial"><font size=-1>//Scriptable jObj2 = Context.toObject(_create,
|
||||
scope);</font></font>
|
||||
<br><font face="Arial"><font size=-1>scope.put("create",scope,create);</font></font>
|
||||
<br><i><font face="Arial"><font size=-1>//Evaluate (or execute js)</font></font></i>
|
||||
<br><font face="Arial"><font size=-1><i>//Refer </i><u><font color="#0000FF">http://www.mozilla.org/js/rhino/tutorial.html</font></u></font></font>
|
||||
<br><font face="Arial"><font size=-1>any = context.evaluateString(scope,
|
||||
jsbuff, "", 1, null);</font></font>
|
||||
<br><i><font face="Arial"><font size=-1>//Exit the Context</font></font></i>
|
||||
<br><font face="Arial"><font size=-1>context.exit( );</font></font>
|
||||
<br><font face="Arial"><font size=-1>}</font></font>
|
||||
<p><font face="Arial"><font size=-1>catch ( JavaScriptException jse) {</font></font>
|
||||
<br><font face="Arial"><font size=-1>jse.printStackTrace();</font></font>
|
||||
<br><font face="Arial"><font size=-1>}</font></font>
|
||||
<p><font face="Arial"><font size=-1>return any;</font></font>
|
||||
<p><font face="Arial"><font size=-1>}</font></font>
|
||||
<p><font face="Arial"><font size=-1>}</font></font>
|
||||
<br>
|
||||
<br>
|
||||
<p><font face="Arial"><font size=-1>Let us write a class for creating new
|
||||
Java objects and bringing them to this script execution scope,</font></font>
|
||||
<p><b><font face="Arial"><font size=-1>Fig 2.2 – _create.java</font></font></b>
|
||||
<p><i><font face="Arial"><font size=-1>/**</font></font></i>
|
||||
<p><i><font face="Arial"><font size=-1>* @author Madhukumar</font></font></i>
|
||||
<p><i><font face="Arial"><font size=-1>*/</font></font></i>
|
||||
<p><font face="Arial"><font size=-1>import java.lang.Class;</font></font>
|
||||
<p><font face="Arial"><font size=-1>import org.mozilla.javascript.*;</font></font>
|
||||
<p><font face="Arial"><font size=-1>public class _create extends Object
|
||||
{</font></font>
|
||||
<p><font face="Arial"><font size=-1>static Context ptr = null;</font></font>
|
||||
<p><font face="Arial"><font size=-1>static Scriptable scope =null;</font></font>
|
||||
<p><font face="Arial"><font size=-1>public _create () { }</font></font>
|
||||
<p><font face="Arial"><font size=-1>public void registerContext(Context
|
||||
cptr, Scriptable sc){</font></font>
|
||||
<p><font face="Arial"><font size=-1>ptr = cptr;</font></font>
|
||||
<p><font face="Arial"><font size=-1>scope = sc;</font></font>
|
||||
<p><font face="Arial"><font size=-1>}</font></font>
|
||||
<p><font face="Arial"><font size=-1>public void getInstance(String classname,String
|
||||
jsclassname) {</font></font>
|
||||
<p><font face="Arial"><font size=-1>Object any=null;</font></font>
|
||||
<p><font face="Arial"><font size=-1>try {</font></font>
|
||||
<p><font face="Arial"><font size=-1>Class thisclass = Class.forName(classname);</font></font>
|
||||
<p><font face="Arial"><font size=-1>any = thisclass.newInstance();</font></font>
|
||||
<p><font face="Arial"><font size=-1>}</font></font>
|
||||
<p><font face="Arial"><font size=-1>catch(Exception e){</font></font>
|
||||
<p><font face="Arial"><font size=-1>e.printStackTrace();</font></font>
|
||||
<p><font face="Arial"><font size=-1>}</font></font>
|
||||
<p><font face="Arial"><font size=-1>if( ptr != null) {</font></font>
|
||||
<p><font face="Arial"><font size=-1>if (scope !=null) {</font></font>
|
||||
<p><i><font face="Arial"><font size=-1>//register created object for this
|
||||
execution scope</font></font></i>
|
||||
<p><font face="Arial"><font size=-1>scope.put(jsclassname,scope,any);</font></font>
|
||||
<p><font face="Arial"><font size=-1>}</font></font>
|
||||
<p><font face="Arial"><font size=-1>}</font></font>
|
||||
<p><font face="Arial"><font size=-1>}</font></font>
|
||||
<p><font face="Arial"><font size=-1>}</font></font>
|
||||
<br>
|
||||
<br>
|
||||
<p><font face="Arial"><font size=-1>It is time to test the code, so let
|
||||
us write a small object that will use the JSHost object,</font></font>
|
||||
<p><b><font face="Arial"><font size=-1>Fig 3 - JSHosttest.java</font></font></b>
|
||||
<p><font face="Arial"><font size=-1>/**</font></font>
|
||||
<p><font face="Arial"><font size=-1>* @author Madhukumar</font></font>
|
||||
<p><font face="Arial"><font size=-1>* @version</font></font>
|
||||
<p><font face="Arial"><font size=-1>*/</font></font>
|
||||
<p><font face="Arial"><font size=-1>public class JSHosttest extends Object
|
||||
{</font></font>
|
||||
<p><font face="Arial"><font size=-1>/** Creates new JSHostTest*/</font></font>
|
||||
<p><font face="Arial"><font size=-1>public JSHosttest() {</font></font>
|
||||
<p><font face="Arial"><font size=-1>}</font></font>
|
||||
<p><font face="Arial"><font size=-1>public static void main (String args[]){</font></font>
|
||||
<p><font face="Arial"><font size=-1>if (args.length < 1) {</font></font>
|
||||
<p><font face="Arial"><font size=-1>System.out.println("Usage - Java JSHosttest.class
|
||||
<js source file>");</font></font>
|
||||
<p><font face="Arial"><font size=-1>return;</font></font>
|
||||
<p><font face="Arial"><font size=-1>}</font></font>
|
||||
<p><font face="Arial"><font size=-1>JSHost jsh = new JSHost();</font></font>
|
||||
<p><font face="Arial"><font size=-1>System.out.println("Executing JavaScript
|
||||
file - " + args[0]);</font></font>
|
||||
<p><font face="Arial"><font size=-1>Object result = jsh.executeJS(args[0]);</font></font>
|
||||
<p><font face="Arial"><font size=-1>if (result instanceof String){</font></font>
|
||||
<p><font face="Arial"><font size=-1>System.out.println("Results - " + result);</font></font>
|
||||
<p><font face="Arial"><font size=-1>}</font></font>
|
||||
<p><font face="Arial"><font size=-1>}</font></font>
|
||||
<p><font face="Arial"><font size=-1>}</font></font>
|
||||
<br>
|
||||
<br>
|
||||
<p><font face="Arial"><font size=-1>For more explanations on the code execution,
|
||||
please refer embedding tutorial <a href="http://www.mozilla.org/js/rhino/tutorial.html">http://www.mozilla.org/js/rhino/tutorial.html</a>
|
||||
and for all documentation and examples on Rhino visit <a href="http://www.mozilla.org/rhino/doc.html">http://www.mozilla.org/rhino/doc.html</a>.</font></font>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,94 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.75 [en] (WinNT; U) [Netscape]">
|
||||
<title>Rhino Examples</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
Rhino Examples</h1></center>
|
||||
Examples have been provided that show how to control the JavaScript engine
|
||||
and to implement scriptable host objects. All the examples are in the cvs
|
||||
tree at <tt><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/">mozilla/js/rhino/examples</a></tt>.
|
||||
<br>
|
||||
<h2>
|
||||
Sample Scripts</h2>
|
||||
The <tt><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/unique.js">unique.js</a></tt>
|
||||
script allows printing unique lines from a file.
|
||||
<p>The <tt><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/liveConnect.js">liveConnect.js</a></tt>
|
||||
script shows a sample usage of LiveConnect (Java-to-JavaScript connectivity).
|
||||
<p>The <tt><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/jsdoc.js">jsdoc.js</a></tt>
|
||||
script is a JavaScript analog to Java's <tt>javadoc</tt>. It makes heavy
|
||||
use of regular expressions.
|
||||
<p>The <tt><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/checkParam.js">checkParam.js</a></tt>
|
||||
script is a useful tool to check that <tt>@param</tt> tags in Java documentation
|
||||
comments match the parameters in the corresponding Java method.
|
||||
<p>The <tt><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/enum.js">enum.js</a></tt>
|
||||
script is a good example of using a JavaAdapter to implement a Java interface
|
||||
using a JavaScript object.
|
||||
<p>The <a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/NervousText.js">NervousText.js</a>
|
||||
script is a JavaScript implementation of the famous NervousText applet
|
||||
using JavaScript compiled to Java classes using <a href="jsc.html">jsc</a>.
|
||||
It can be run in the HTML page <a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/NervousText.html">NervousText.html</a>.
|
||||
<br>
|
||||
<h2>
|
||||
Controlling the JavaScript Engine</h2>
|
||||
|
||||
<h4>
|
||||
The RunScript class</h4>
|
||||
<tt><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/RunScript.java">RunScript.java</a></tt>
|
||||
is a simple program that executes a script from the command line.
|
||||
<h4>
|
||||
The Control class</h4>
|
||||
<tt><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/Control.java">Control.java</a></tt>
|
||||
is a program that executes a simple script and then manipulates the result.
|
||||
<h4>
|
||||
JavaScript Shell</h4>
|
||||
<tt><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/Shell.java">Shell.java</a></tt>
|
||||
is a program that executes JavaScript programs; it is a simplified version
|
||||
of the shell in the <tt>tools</tt> package. The programs may be specified
|
||||
as files on the command line or by typing interactively while the shell
|
||||
is running.
|
||||
<h4>PrimitiveWrapFactory</h4>
|
||||
<a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/PrimitiveWrap
|
||||
Factory.java">PrimitiveWrapFactory.java</a> is an example of a WrapFactory that
|
||||
can be used to control the wrapping behavior of the Rhino engine on calls to Jav
|
||||
a methods.<br>
|
||||
<h4>
|
||||
<b>Multithreaded Script Execution</b></h4>
|
||||
<tt><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/DynamicScopes.java">DynamicScopes.java</a></tt>
|
||||
is a program that creates a single global scope object and then shares
|
||||
it across multiple threads. Sharing the global scope allows both information
|
||||
to be shared across threads, and amortizes the cost of Context.initStandardObjects
|
||||
by only performing that expensive operation once.
|
||||
<br>
|
||||
<h2>
|
||||
Implementing Host Objects</h2>
|
||||
First check out the <a href="http://www.mozilla.org/rhino/tutorial.html">tutorial</a>
|
||||
if you haven't already.
|
||||
<h4>
|
||||
The Foo class - Extending ScriptableObject</h4>
|
||||
<tt><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/Foo.java">Foo.java</a></tt>
|
||||
is a simple JavaScript host object that includes a property with an associated
|
||||
action and a variable argument method.
|
||||
<br>
|
||||
<h4>
|
||||
The Matrix class - Implementing Scriptable</h4>
|
||||
<tt><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/Matrix.java">Matrix.java</a></tt>
|
||||
provides a simple multidimensional array by implementing the Scriptable
|
||||
interface.
|
||||
<br>
|
||||
<h4>
|
||||
The File class - An advanced example</h4>
|
||||
<tt><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/File.java">File.java</a></tt>
|
||||
extends ScriptableObject to provide a means of reading and writing files
|
||||
from JavaScript. A more involved example of host object definition.
|
||||
<p>
|
||||
<hr WIDTH="100%">
|
||||
<br><a href="index.html">back to top</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,52 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java">
|
||||
<title>Rhino FAQ</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
<script src="owner.js"></script>
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
Frequently Asked Questions about Rhino</h1></center>
|
||||
<script>document.write(owner());</script>
|
||||
|
||||
<br><script>
|
||||
var d = new Date(document.lastModified);
|
||||
document.write((d.getMonth()+1)+"/"+d.getDate()+"/"+d.getFullYear());
|
||||
document.write('<br>');
|
||||
</script>
|
||||
|
||||
<center>
|
||||
<hr WIDTH="100%"></center>
|
||||
|
||||
<p><b><font size=+2>Q</font>.</b> <i>How do I create a Java array from
|
||||
JavaScript?</i>
|
||||
<p><b><font size=+2>A.</font></b> You must use Java reflection. For instance,
|
||||
to create an array of java.lang.String of length five, do
|
||||
<blockquote><tt>var stringArray = java.lang.reflect.Array.newInstance(java.lang.String,
|
||||
5);</tt></blockquote>
|
||||
Then if you wish to assign the string "hi" to the first element, simply
|
||||
execute <tt>stringArray[0] = "hi"</tt>.
|
||||
<p>Creating arrays of primitive types is slightly different: you must use
|
||||
the TYPE field. For example, creating an array of seven ints can be done
|
||||
with the code
|
||||
<blockquote><tt>var intArray = java.lang.reflect.Array.newInstance(java.lang.Integer.TYPE,
|
||||
7);</tt></blockquote>
|
||||
|
||||
<p><br><b><font size=+2>Q</font>.</b> <i>When I try to execute a script
|
||||
I get the exception </i><tt>Required security context missing</tt><i>.
|
||||
What's going on?</i>
|
||||
<p><b><font size=+2>A.</font></b> You've likely missed placing the <tt>Security.properties</tt>
|
||||
file in your class path at <tt>org.mozilla.javascript.resources</tt>.
|
||||
<h3>
|
||||
|
||||
<hr WIDTH="100%"><br>
|
||||
<a href="index.html">back to top</a></h3>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,60 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.51 [en] (WinNT; U) [Netscape]">
|
||||
<title>Small Footprint</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
Small Footprint</h1></center>
|
||||
A few changes can be made to reduce the footprint of Rhino for embeddings
|
||||
where space is at a premium. On a recent build, the length of js.jar was 603,127 bytes corresponding to 1,171,708 bytes of all uncompressed Rhino classes with debug information included.
|
||||
With various changes js.jar size can be reduced to 204,689 bytes corresponding to 424,774 bytes of uncompressed classes.
|
||||
|
||||
<h3>Tools</h3>
|
||||
<p>
|
||||
Most embeddings won't need any of the classes in <tt>org.mozilla.javascript.tools</tt> or any of its sub-packages.
|
||||
<h3>
|
||||
Optimizer</h3>
|
||||
<p>
|
||||
It is possible to run Rhino with interpreter mode only, allowing you to remove
|
||||
classes for classfile generation that include all the classes from
|
||||
<tt>org.mozilla.javascript.optimizer</tt> package and <tt>ClassNameHelper</tt>, <tt>ClassRepository</tt> classes from <tt>org.mozilla.javascript</tt> package.
|
||||
|
||||
<h3>JavaAdapter</h3>
|
||||
<p>
|
||||
Implementing the JavaAdapter functionality requires the ability to generate
|
||||
classes on the fly. Removing <tt>org.mozilla.javascript.JavaAdapter</tt> will disable this functionality, but Rhino will otherwise run correctly.
|
||||
|
||||
<h3>Class generation library</h3>
|
||||
<p>
|
||||
If you do not include Optimizer or JavaAdapter, then you do not need Rhino library for class file generation and you can remove all the classes from in <tt>org.mozilla.classfile</tt> package.
|
||||
|
||||
<h3>Regular Expressions</h3>
|
||||
<p>
|
||||
The package <tt>org.mozilla.javascript.regexp</tt> can be removed. Rhino
|
||||
will continue to run, although it will not be able to execute any regular
|
||||
expression matches. This change saves 47,984 bytes of class files.
|
||||
|
||||
<h3>Debug information</h3>
|
||||
<p>
|
||||
Debug information in Rhino classes consumes about 25% of code size and if you can live without that, you can recompile Rhino to remove it.
|
||||
|
||||
<h2>smalljs.jar</h2>
|
||||
|
||||
Ant build script in Rhino supports smalljar target that will generate smalljs.jar that does not include Tools, Optimizer, JavaAdapter and Class generation library, Regular Expressions and deprecated files. To build such minimalist jar without debug information, run the following command from the top directory of Rhino distribution:
|
||||
<pre>
|
||||
ant clean
|
||||
ant -Ddebug=off -Dno-regexp=true smalljar
|
||||
</pre>
|
||||
If you omit <tt>-Dno-regexp=true</tt>, then the resulting smalljs.jar will include Regular Expression support.
|
||||
|
||||
<p>
|
||||
<hr WIDTH="100%">
|
||||
<br><a href="index.html">back to top</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,44 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
|
||||
<title>Help with Rhino</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<center><b><font size=+3>Help with Rhino</font></b></center>
|
||||
<script src="owner.js"></script>
|
||||
|
||||
<p>Have a question that you can't find answer to in the <a href="doc.html">documentation</a>?
|
||||
Here are some additional resources for help:
|
||||
<br>
|
||||
<h3>
|
||||
<font size=+1>Newsgroup and Mail Gateway</font></h3>
|
||||
The <a href="news:netscape.public.mozilla.jseng">netscape.public.mozilla.jseng</a>
|
||||
newsgroup answers questions about both Rhino and the C implementation of
|
||||
JavaScript. You can get to the newsgroup through a mail gateway. Send a
|
||||
message with the subject "subscribe" to <a href="mailto:mozilla-jseng-request@mozilla.org?subject=subscribe">mozilla-jseng-request@mozilla.org</a>.
|
||||
To post messages, send mail to <a href="mailto:mozilla-jseng@mozilla.org">mozilla-jseng@mozilla.org</a>.
|
||||
To unsubscribe, mail with "unsubscribe" in the subject to <a href="mailto:mozilla-jseng-request@mozilla.org?subject=unsubscribe">mozilla-jseng-request@mozilla.org</a>.
|
||||
<p>
|
||||
To view archived messages, try <a href="http://groups.google.com/groups?q=netscape.public.mozilla.jseng&hl=en&lr=&safe=off&site=groups">Google groups</a> or
|
||||
other newsgroup services.
|
||||
<h3>
|
||||
Bug System</h3>
|
||||
Use <a href="http://bugzilla.mozilla.org/enter_bug.cgi?product=Rhino">Bugzilla</a>
|
||||
to enter bugs against Rhino. Note that Rhino has its own product category.
|
||||
<br>
|
||||
<h3>
|
||||
Module Owner</h3>
|
||||
The module owner, <script>document.write(owner());</script>
|
||||
, can
|
||||
be mailed for help as well, although he may copy his response to the newsgroup
|
||||
to help others.
|
||||
<p>
|
||||
<hr WIDTH="100%"><a href="index.html">back to top</a>
|
||||
<br>
|
||||
<br>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,45 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.72 [en]C-NSCP (WinNT; U) [Netscape]">
|
||||
<title>Rhino History</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<center><b><font size=+3>Rhino History</font></b></center>
|
||||
|
||||
<p>Rhino gets its name from the animal on the cover of the <a href="http://www.ora.com/">O'Reilly</a>
|
||||
book about JavaScript.
|
||||
<p>The Rhino project was started at Netscape in Fall 1997. At the time,
|
||||
Netscape was planning to produce a version of Navigator written entirely
|
||||
in Java and so it needed an implementation of JavaScript written in Java.
|
||||
When Netscape stopped work on "Javagator", as it was called, somehow Rhino
|
||||
escaped the axe (rumor had it that the executives "forgot" it existed).
|
||||
Since then, a couple of major companies (including Sun) have licensed Rhino
|
||||
for use in their products and paid Netscape to do so, allowing us to continue
|
||||
work on it. Now Rhino is planned to be part of several server products
|
||||
from Netscape as well.
|
||||
<p>Originally, Rhino compiled all JavaScript code to Java bytecodes in
|
||||
generated classfiles. This produced the best performance (often beating
|
||||
the C implementation of JavaScript when run on a JIT), but suffered from
|
||||
two faults. First, compilation time was long since generating Java bytecodes
|
||||
and loading the generated classes was a heavyweight process. Also, the
|
||||
implementation effectively leaked memory since most JVMs don't really collect
|
||||
unused classes or the strings that are interned as a result of loading
|
||||
a class file.
|
||||
<p>So in Fall of 1998, Rhino added an interpretive mode. The classfile
|
||||
generation code was moved to an optional, dynamically-loaded package. Compilation
|
||||
is faster and when scripts are no longer in use they can be collected like
|
||||
any other Java object.
|
||||
<p>Rhino was released to mozilla.org in April of 1998. Originally Rhino
|
||||
classfile generation had been held back from release. However the licensees
|
||||
of Rhino have now agreed to release all of Rhino to open source, including
|
||||
class file generation. Since its release to open source, Rhino has found
|
||||
a variety of <a href="users.html">uses</a> and an increasing
|
||||
number of people have contributed to the code.
|
||||
<p>
|
||||
<hr WIDTH="100%"><a href="index.html">back to top</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,75 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; U) [Netscape]">
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java, Mozilla">
|
||||
<title>Rhino - JavaScript for Java</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
Rhino: JavaScript for Java</h1></center>
|
||||
|
||||
<center><img SRC="rhino50.jpg" height=200 width=398></center>
|
||||
|
||||
<hr WIDTH="100%">Rhino is an open-source implementation of JavaScript written
|
||||
entirely in Java. It is typically embedded into Java applications to provide
|
||||
scripting to end users.
|
||||
<table WIDTH="100%" >
|
||||
<tr>
|
||||
<td>
|
||||
<div align=right><b><a href="download.html">Downloads</a></b></div>
|
||||
</td>
|
||||
|
||||
<td>How to get source and binaries.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<div align=right><b><a href="doc.html">Documentation</a></b></div>
|
||||
</td>
|
||||
|
||||
<td>Information on Rhino for script writers and embedders.</td>
|
||||
</tr>
|
||||
|
||||
<!--
|
||||
<tr>
|
||||
<td>
|
||||
<div align=right><b><a href="users.html">Users</a></b></div>
|
||||
</td>
|
||||
|
||||
<td>How people are using Rhino.</td>
|
||||
</tr>
|
||||
-->
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<div align=right><b><a href="history.html">History</a></b></div>
|
||||
</td>
|
||||
|
||||
<td>The ancestry of the beast.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<div align=right><b><a href="help.html">Help</a></b></div>
|
||||
</td>
|
||||
|
||||
<td>Some resources if you get stuck.</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<hr WIDTH="100%"><font size=-1>Module owner </font><script src="owner.js"></script>
|
||||
<script>document.write(owner());</script>
|
||||
|
||||
<br><font size=-1>Rhino image courtesy of Paul Houle.</font><!---
|
||||
Add reference to
|
||||
http://www.javaworld.com/jw-08-1999/jw-08-howto.html
|
||||
and
|
||||
http://www.javaworld.com/javaworld/jw-09-1999/jw-09-howto.html
|
||||
--->
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,66 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.6 [en] (WinNT; U) [Netscape]">
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java">
|
||||
<title>Followup to JavaOne</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
Followup to JavaOne session on Rhino</h1></center>
|
||||
This page is intended to follow up on the <a href="http://www.javasoft.com/javaone/">JavaOne</a>
|
||||
session on <a href="http://industry.java.sun.com/javaone/99/event/0,1768,629,00.html">"Rhino:
|
||||
JavaScript for the Java Platform"</a>. I hope it will be useful whether
|
||||
or not you actually attended the talk.
|
||||
<br>
|
||||
<h2>
|
||||
Slides</h2>
|
||||
<a href="http://industry.java.sun.com/javaone/99/pdfs/e629.pdf">Slides</a>
|
||||
(PDF file, 1112246 bytes) can be downloaded from Sun's site.
|
||||
<br>
|
||||
<br>
|
||||
<h2>
|
||||
More on Q & A</h2>
|
||||
Following the talk there was an excellent question and answer session where
|
||||
many attendees asked good questions and offered useful suggestions. I'll
|
||||
follow up on some of those here. I'll start a thread on the newsgroup <a href="news://news.mozilla.org/netscape.public.mozilla.jseng">netscape.public.mozilla.jseng</a>
|
||||
so people can ask addition questions or comments there.
|
||||
<h3>
|
||||
Java classes visible to scripts</h3>
|
||||
One attendee raised the point that many embeddings may not want scripts
|
||||
to be able to access all Java classes. This is an excellent point, and
|
||||
I've implemented an addition to the <a href="../js/rhino/org/mozilla/javascript/SecuritySupport.html">SecuritySupport</a>
|
||||
class that allows embedders to choose which classes are exposed to scripts.
|
||||
<h3>
|
||||
Easier "importing" of Java classes</h3>
|
||||
Another attendee suggested that the current method of referring to Java
|
||||
classes (like <tt>java.lang.String</tt> or <tt>Packages.org.mozilla.javascript.Context</tt>)
|
||||
could be improved. I've implemented a set of changes that make importing
|
||||
easier, but I'm not convinced that adding them is the right thing to do
|
||||
due to some drawbacks.
|
||||
<p>To see what I've done, take a look at the javadoc for the <a href="../js/rhino/org/mozilla/javascript/ImporterTopLevel.html">ImporterTopLevel</a>
|
||||
class. You'll see that it's now possible to make function calls to "import"
|
||||
Java classes so that they can be referred to without qualification. I didn't
|
||||
use the word "import" because that's a keyword in JavaScript.
|
||||
<p>There are a few drawbacks to this implemenation. First, there is a runtime
|
||||
cost associated with every lookup of a top-level variable. The problem
|
||||
is that it's not possible to use the Java runtime to determine the set
|
||||
of classes from a given package. Instead, importing the package "java.util"
|
||||
saves the package name in a special list and every access to the global
|
||||
scope that fails to find a matching variable causes the runtime to see
|
||||
if there is a class by that name in the "java.util" package. Even for lookups
|
||||
that succeed there is an additional method call.
|
||||
<p>Another drawback to this implementation is namespace pollution: now
|
||||
"importClass" and "importPackage" have special meaning. It's still possible
|
||||
to substitute your own variables for these functions, but it's still possible
|
||||
that program behavior could change.
|
||||
<p>So I'm interested in people's opinion: Is this benefit worth the costs?
|
||||
<p>
|
||||
<hr WIDTH="100%">
|
||||
<br><a href="index.html">back to top</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,82 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; U) [Netscape]">
|
||||
<title>JavaScript Compiler</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
JavaScript Compiler</h1></center>
|
||||
The JavaScript compiler translates JavaScript source into Java class files.
|
||||
The resulting Java class files can then be loaded and executed at another
|
||||
time, providing a convenient method for transfering JavaScript, and for
|
||||
avoiding translation cost.
|
||||
<p>Note that the top-level functions available to the shell (such as <tt>print</tt>)
|
||||
are <i>not</i> available to compiled scripts when they are run outside
|
||||
the shell.
|
||||
<br>
|
||||
<h2>
|
||||
Invoking the Compiler</h2>
|
||||
<tt>java org.mozilla.javascript.tools.jsc.Main</tt> [<i>options</i>] <i>file1</i><tt>.js</tt>
|
||||
[<i>file2</i><tt>.js</tt>...]
|
||||
<p>where <i>options</i> are:
|
||||
<p><tt>-extends <i>java-class-name</i></tt>
|
||||
<blockquote>Specifies that a java class extending the Java class <i>java-class-name</i>
|
||||
should be generated from the incoming JavaScript source file. Each global
|
||||
function in the source file is made a method of the generated class, overriding
|
||||
any methods in the base class by the same name.</blockquote>
|
||||
<tt>-implements <i>java-intf-name</i></tt>
|
||||
<blockquote>Specifies that a java class implementing the Java interface
|
||||
<i><tt>java-intf-name</tt></i>
|
||||
should be generated from the incoming JavaScript source file. Each global
|
||||
function in the source file is made a method of the generated class, implementing
|
||||
any methods in the interface by the same name.</blockquote>
|
||||
<tt>-debug</tt>
|
||||
<br><tt>-g</tt>
|
||||
<ul>Specifies that debug information should be generated. May not be combined
|
||||
with optimization at an <i>optLevel</i> greater than zero.</ul>
|
||||
<tt>-nosource</tt>
|
||||
<ul>Does not save the source in the class file. Functions and scripts compiled
|
||||
this way cannot be decompiled. This option can be used to avoid distributing
|
||||
source or simply to save space in the resulting class file.</ul>
|
||||
<tt>-o </tt><i>outputFile</i>
|
||||
<ul>Writes the class file to the given file (which should end in <tt>.class</tt>).
|
||||
The string <i>outputFile</i> must be a writable filename.</ul>
|
||||
<tt>-opt </tt><i>optLevel</i>
|
||||
<br><tt>-O</tt> <i>optLevel</i>
|
||||
<ul>Optimizes at level <i>optLevel</i>, which must be an integer between
|
||||
-1 and 9. See <a href="opt.html">Optimization</a> for more details. If
|
||||
<i>optLevel</i>
|
||||
is greater than zero, <tt>-debug</tt> may not be specified.</ul>
|
||||
<tt>-package</tt> <i>packageName</i>
|
||||
<ul>Specifies the package to generate the class into. The string <i>packageName</i>
|
||||
must be composed of valid identifier characters optionally separated by
|
||||
periods.</ul>
|
||||
<tt>-version </tt><i>versionNumber</i>
|
||||
<ul>Specifies the language version to compile with. The string <i>versionNumber</i>
|
||||
must be one of <tt>100</tt>, <tt>110</tt>, <tt>120</tt>, <tt>130</tt>,
|
||||
or <tt>140</tt>. See <a href="overview.html#versions">JavaScript Language
|
||||
Versions</a> for more information on language versions.</ul>
|
||||
|
||||
<h2>
|
||||
Examples</h2>
|
||||
<tt>$ cat test.js</tt>
|
||||
<br><tt>java.lang.System.out.println("hi, mom!");</tt>
|
||||
<br><tt>$ java org.mozilla.javascript.tools.jsc.Main test.js</tt>
|
||||
<br><tt>$ ls *.class</tt>
|
||||
<br><tt>test.class</tt>
|
||||
<br><tt>$ java test</tt>
|
||||
<br><tt>hi, mom!</tt>
|
||||
<p><tt>$ java org.mozilla.javascript.tools.jsc.Main -extends java.applet.Applet
|
||||
\</tt>
|
||||
<br><tt> -implements java.lang.Runnable NervousText.js</tt>
|
||||
<br>
|
||||
<p>
|
||||
<hr WIDTH="100%">
|
||||
<br><a href="index.html">back to top</a>
|
||||
</body>
|
||||
</html>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 60 KiB |
@@ -1,86 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.72 [en]C-NSCP (WinNT; U) [Netscape]">
|
||||
<title>JavaScript Requirements and Limitations</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
Requirements and Limitations</h1></center>
|
||||
|
||||
<h2>
|
||||
<b>Requirements</b></h2>
|
||||
Rhino requires version 1.1 or greater of Java.
|
||||
<p>To use the JavaAdapter feature or an optimization level of 0 or greater,
|
||||
Rhino must be running under a security manager that allows the definition
|
||||
of class loaders.
|
||||
<p>
|
||||
<hr WIDTH="100%">
|
||||
<h2>
|
||||
<b>Limitations</b></h2>
|
||||
|
||||
<h3>
|
||||
<b>Platforms and </b>JITs</h3>
|
||||
Many platforms and JREs have problems converting decimal numbers to and
|
||||
from strings. These errors are usually boundary case errors and will show
|
||||
up as test failures in section 7.7.3.
|
||||
<p>Windows versions of the Symantec JIT prior to 3.00.029(i) will report
|
||||
internal errors for some generated class files.
|
||||
<p>On the Symantec JIT and the AIX JVM, accessing a static field of a class
|
||||
that has not yet loaded may not give the correct value of the field. For
|
||||
example, accessing
|
||||
<tt>java.io.File.separatorChar</tt> before <tt>java.io.File</tt>
|
||||
has been loaded will return a value of 0. (This is a bug in the JIT; accessing
|
||||
the field should cause the class to be loaded.)
|
||||
<p>The AIX Java version "JDK 1.1.6 IBM build a116-19980924 (JIT enabled:
|
||||
jitc)" core dumps running several classes generated by Rhino. It also has
|
||||
errors in java.lang.Math.pow that are reflected as failures in the JavaScript
|
||||
Math object's pow method.
|
||||
<p>IBM Java for Linux version "JDK 1.1.8 IBM build l118-19991013 (JIT enabled:
|
||||
jitc)" has errors in java.lang.Math.pow that are reflected as test failures
|
||||
in the JavaScript Math object's pow method.
|
||||
<p>Solaris JDK 1.1.6 has errors in java.lang.Math.atan2 that are reflected
|
||||
as test failures in the JavaScript Math object's atan2 method.
|
||||
<br>
|
||||
<h3>
|
||||
<b>LiveConnect</b></h3>
|
||||
If a JavaObject's field's name collides with that of a method, the value
|
||||
of that field is retrieved lazily, and can be counter-intuitively affected
|
||||
by later assignments:
|
||||
<blockquote><tt>javaObj.fieldAndMethod = 5;</tt>
|
||||
<br><tt>var field = javaObj.fieldAndMethod;</tt>
|
||||
<br><tt>javaObj.fieldAndMethod = 7;</tt>
|
||||
<br><tt>// now, field == 7</tt></blockquote>
|
||||
You can work around this by forcing the field value to be converted to
|
||||
a JavaScript type when you take its value:
|
||||
<blockquote><tt>javaObj.fieldAndMethod = 5;</tt>
|
||||
<br><tt>var field = javaObj.fieldAndMethod + 0; // force conversion now</tt>
|
||||
<br><tt>javaObj.fieldAndMethod = 7;</tt>
|
||||
<br><tt>// now, field == 5</tt></blockquote>
|
||||
|
||||
<h3>
|
||||
<b>JSObject</b></h3>
|
||||
Rhino does NOT support the <tt>netscape.javascript.JSObject</tt> class.
|
||||
<br>
|
||||
<h3>
|
||||
<b>Date object</b></h3>
|
||||
The JavaScript Date object depends on time facilities of the underlying
|
||||
Java runtime to determine daylight savings time dates. Earlier JRE versions
|
||||
may report a date for the daylight savings changeover that is a week off.
|
||||
JRE 1.1.6 reports the correct date.
|
||||
<p>Under the 1.1.6 JRE, evaluating <tt>(new Date(1998, 9, 25, 2)).toString()</tt>
|
||||
returns:
|
||||
<pre> Sun Oct 25 02:00:00 GMT-0800 (PST) 1998</pre>
|
||||
Earlier versions may return:
|
||||
<pre> Sun Oct 25 02:00:00 GMT-0700 (PDT) 1998</pre>
|
||||
(the JRE doesn't report the changeover until Nov. 1.)
|
||||
<p>The Microsoft SDK 3.1 for Java also exhibits this problem.
|
||||
<p>
|
||||
<hr WIDTH="100%">
|
||||
<br><a href="rhino.html">back to top</a>
|
||||
</body>
|
||||
</html>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 19 KiB |
@@ -1,68 +0,0 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
|
||||
<META NAME="Author" CONTENT="Norris Boyd">
|
||||
<META NAME="GENERATOR" CONTENT="Mozilla/4.05 [en] (WinNT; U) [Netscape]">
|
||||
<TITLE>Optimization</TITLE>
|
||||
</HEAD>
|
||||
<BODY BGCOLOR="#FFFFFF">
|
||||
|
||||
<CENTER>
|
||||
<H1>
|
||||
Optimization</H1></CENTER>
|
||||
|
||||
<H2>
|
||||
Optimization settings</H2>
|
||||
<P>The currently supported optimization settings are:</P>
|
||||
|
||||
<P><B>-1</B>
|
||||
|
||||
<P><B></B>Interpretive mode is always
|
||||
used. The compilation time is minimized at the expense of runtime performance.
|
||||
No class files are generated, which may improve memory usage depending on your
|
||||
system.
|
||||
<p>
|
||||
If the optimization package is not available, then optimization acts as if it is always -1.
|
||||
</P>
|
||||
|
||||
<P><B>0</B>
|
||||
|
||||
<P><B></B>No optimizations are
|
||||
performed. The bytecode compiler runs fastest in this mode, but the generated byte code
|
||||
is less efficient.</P>
|
||||
|
||||
<P><B>1-9</B>
|
||||
|
||||
<P>All optimizations are performed. Simple data & type
|
||||
flow analysis is performed to determine which JavaScript variables can be
|
||||
allocated to Java VM registers, and which variables are used only as Numbers.
|
||||
Local common sub-expressions are collapsed (currently this only happens for
|
||||
property lookup, but in the future more expressions may be optimized). All local
|
||||
variables and parameters are allocated to Java VM registers. Function call
|
||||
targets are speculatively pre-cached (based on the name used in the source) so
|
||||
that dispatching can be direct, pending runtime confirmation of the actual
|
||||
target. Arguments are passed as Object/Number pairs to reduce conversion
|
||||
overhead.</P>
|
||||
|
||||
<P>Note:
|
||||
<OL>
|
||||
<LI>
|
||||
Some language features (indirect calls to eval, use
|
||||
of the arguments property of function objects) were previously not supported
|
||||
in higher optimization levels. These features have been removed from the
|
||||
language in ECMA, so higher optimization levels are now conformant.
|
||||
|
||||
<LI>
|
||||
Future versions may allocate more aggressive
|
||||
optimizations to higher optimization levels. For compatibility with future
|
||||
versions, use level 1. For maximal optimization, use level 9, but retest
|
||||
your application when upgrading to new versions.</LI>
|
||||
</OL>
|
||||
|
||||
|
||||
<P>
|
||||
<HR WIDTH="100%">
|
||||
<BR><A HREF="index.html">back to top</A>
|
||||
<br>
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -1,148 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.72 [en]C-NSCP (WinNT; U) [Netscape]">
|
||||
<title>JavaScript Overview</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
Rhino Overview</h1></center>
|
||||
|
||||
<h3>
|
||||
Overview of Rhino</h3>
|
||||
Most people who have used JavaScript before have done so by adding scripts
|
||||
to their HTML web pages. However, Rhino is an implementation of the core
|
||||
language only and doesn't contain objects or methods for manipulating HTML
|
||||
documents.
|
||||
<p>Rhino contains
|
||||
<ul>
|
||||
<li>
|
||||
All the features of JavaScript 1.5</li>
|
||||
|
||||
<li>
|
||||
Allows direct scripting of Java</li>
|
||||
|
||||
<li>
|
||||
A JavaScript shell for executing JavaScript scripts</li>
|
||||
|
||||
<li>
|
||||
A JavaScript compiler to transform JavaScript source files into Java class
|
||||
files</li>
|
||||
</ul>
|
||||
|
||||
<h3>
|
||||
Language</h3>
|
||||
The JavaScript language itself is standardized by Standard ECMA-262 <i>ECMAScript:
|
||||
A general purpose, cross-platform programming language</i>. Rhino 1.5 implements
|
||||
JavaScript 1.5, which conforms to Edition 3 of the Standard. The Standard
|
||||
may be <a href="http://www.ecma.ch/ecma1/STAND/ECMA-262.HTM">downloaded</a> or
|
||||
obtained by mail from ECMA, 114 Rue du Rhône, CH1204 Geneva, Switzerland.
|
||||
<p>In addition, Rhino has implemented JavaAdapters, which allows JavaScript
|
||||
to implement any Java interface or extend any Java class with a JavaScript
|
||||
object. See the <tt>enum.js</tt> example for more information.
|
||||
<p>Numerous books and tutorials on JavaScript are available.
|
||||
<br>
|
||||
<br>
|
||||
<h3>
|
||||
Deprecated Language Features</h3>
|
||||
Several language features introduced in JavaScript 1.2 are now deprecated.
|
||||
These features allow "computational reflection": that is, the ability for
|
||||
a script to determine and influence aspects of the way it is evaluated.
|
||||
These features are generally not broadly useful, yet they impose significant
|
||||
constraints on implementations that hamper or prevent optimization. The
|
||||
deprecated features are the <tt>__proto__</tt> and <tt>__parent__</tt>
|
||||
properties, and the constructors <tt>With</tt>, <tt>Closure</tt>, and <tt>Call</tt>.
|
||||
Attempts to invoke these constructors with the language version 1.4 will
|
||||
result in an error. For other versions, a warning will be generated.
|
||||
<br>
|
||||
<br>
|
||||
<h3>
|
||||
Internationalization</h3>
|
||||
The messages reported by the JavaScript engine are by default retrieved
|
||||
from the property file <tt>org/mozilla/javascript/resources/Messages.properties</tt>.
|
||||
If other properties files with extensions corresponding to the current
|
||||
locale exist, they will be used instead.
|
||||
<br>
|
||||
<br>
|
||||
<h3>
|
||||
<a NAME="versions"></a>JavaScript Language Versions</h3>
|
||||
Some behavior in the JavaScript engine is dependent on the language version.
|
||||
In browser embeddings, this language version is selected using the LANGUAGE
|
||||
attribute of the SCRIPT tag with values such as "JavaScript1.2".
|
||||
<p>Version 1.3 and greater are ECMA conformant.
|
||||
<p><b>Operators <tt>==</tt> and <tt>!=</tt></b>
|
||||
<p>Version 1.2 only uses strict equality for the == and != operators. In
|
||||
version 1.3 and greater, == and != have the same meanings as ECMA. The
|
||||
operators === and !== use strict equality in all versions.
|
||||
<p><b>ToBoolean</b>
|
||||
<p><tt>Boolean(new Boolean(false))</tt> is false for all versions before
|
||||
1.3. It is true (and thus ECMA conformant) for version 1.3 and greater.
|
||||
<p><b>Array.prototype.toString and Object.prototype.toString</b>
|
||||
<p>Version 1.2 only returns array or object literal notation ("[1,2,3]"
|
||||
or "{a:1, b:2}" for example). In version 1.3 and greater these functions
|
||||
are ECMA conformant.
|
||||
<p><b>Array constructor</b>
|
||||
<p><tt>Array(i)</tt> for a number argument <tt>i</tt> constructs an array
|
||||
with a single element equal to <tt>i</tt> for version 1.2 only. Otherwise
|
||||
the ECMA conformant version is used (an array is constructed with no elements
|
||||
but with length property equal to <tt>i</tt>).
|
||||
<p><b>String.prototype.substring</b>
|
||||
<p>For version 1.2 only, the two arguments are not swapped if the first
|
||||
argument is less than the second one. All other versions are ECMA compliant.
|
||||
<p><b>String.prototype.split</b>
|
||||
<p>For version 1.2 only, split performs the Perl4 special case when given
|
||||
a single space character as an argument (skips leading whitespace, and
|
||||
splits on whitespace). All other versions split on the space character
|
||||
proper as specified by ECMA.
|
||||
<br>
|
||||
<br>
|
||||
<h3>
|
||||
Security</h3>
|
||||
The security features in Rhino provide the ability to track the origin
|
||||
of a piece of code (and any pieces of code that it may in turn generate).
|
||||
These features allow for the implementation of a traditional URL-based
|
||||
security policy for JavaScript as in Netscape Navigator. Embeddings that
|
||||
trust the JavaScript code they execute may ignore the security features.
|
||||
<p>Embeddings that run untrusted JavaScript code must do two things to
|
||||
enable the security features. First, every <tt>Context</tt> that is created
|
||||
must be supplied an instance of an object that implements the <tt>SecuritySupport</tt>
|
||||
interface. This will provide Rhino the support functionality it needs to
|
||||
perform security-related tasks.
|
||||
<p>Second, the value of the property <tt>security.requireSecurityDomain</tt>
|
||||
should be changed to <tt>true</tt> in the resource bundle <tt>org.mozilla.javascript.resources.Security</tt>.
|
||||
The value of this property can be determined at runtime by calling the
|
||||
<tt>isSecurityDomainRequired</tt>
|
||||
method of <tt>Context</tt>. Setting this property to true requires that
|
||||
any calls that compile or evaluate JavaScript must supply a security domain
|
||||
object of any object type that will be used to identify JavaScript code.
|
||||
In a typical client embedding, this object might be a string with the URL
|
||||
of the server that supplied the script, or an object that contains a representation
|
||||
of the signers of a piece of code for certificate-based security policies.
|
||||
<p>When JavaScript code attempts a restricted action, the security domain
|
||||
can be retrieved in the following manner. The class context should be obtained
|
||||
from the security manager (see <tt>java.lang.SecurityManager.getClassContext()</tt>).
|
||||
Then, the class of the code that called to request the restricted action
|
||||
can be obtained by looking an appropriate index into the class context
|
||||
array. If the caller is JavaScript the class obtained may be one of two
|
||||
types. First, it may be the class of the interpreter if interpretive mode
|
||||
is in effect. Second, it may be a generated class if classfile generation
|
||||
is supported. An embedding can distinguish the two cases by calling <tt>isInterpreterClass()</tt>
|
||||
in the <tt>Context</tt> class. If it is the interpreter class, call the
|
||||
getInterpreterSecurityDomain() method of Context to obtain the security
|
||||
domain of the currently executing interpreted script or function. Otherwise,
|
||||
it must be a generated class, and an embedding can call <tt>getSecurityDomain()</tt>
|
||||
in the class implementing
|
||||
<tt>SecuritySupport</tt>. When the class was
|
||||
defined and loaded, the appropriate security domain was associated with
|
||||
it, and can be retrieved by calling this method. Once the security domain
|
||||
has been determined, an embedding can perform whatever checks are appropriate
|
||||
to determine whether access should be allowed.
|
||||
<p>
|
||||
<hr WIDTH="100%">
|
||||
<br><a href="index.html">back to top</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,3 +0,0 @@
|
||||
function owner() {
|
||||
return '<a href="mailto:nboyd'+'@'+ 'atg.com">Norris Boyd</a>'
|
||||
}
|
||||
@@ -1,83 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.5 [en]C-NSCP (WinNT; I) [Netscape]">
|
||||
<title>Performance Hints</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
Performance Hints</h1></center>
|
||||
<h3>
|
||||
<tt>var</tt> Statements</h3>Use <tt>var</tt> statements when possible. Not only is it good
|
||||
programming practice, it can speed up your code by allowing the compiler to
|
||||
generate special code to access the variables. For example, you could rewrite
|
||||
<p><tt>function sum(a) {</tt>
|
||||
<br><tt> result = 0;</tt>
|
||||
<br><tt> for (i=0; i <
|
||||
a.length; i++)</tt>
|
||||
<br><tt> result += a[i];</tt>
|
||||
<br><tt> return result;</tt>
|
||||
<br><tt>}</tt>
|
||||
<p>as
|
||||
<p><tt>function sum(a) {</tt>
|
||||
<br><tt> var result = 0;</tt>
|
||||
<br><tt> for (var i=0; i
|
||||
< a.length; i++)</tt>
|
||||
<br><tt> result += a[i];</tt>
|
||||
<br><tt> return result;</tt>
|
||||
<br><tt>}</tt>
|
||||
<p>This is not equivalent code because the second version does
|
||||
not modify global variables <tt>result</tt> and <tt>i</tt>. However, if you don't intend for any other function to
|
||||
access these variables, then storing them globally is probably wrong anyway
|
||||
(what if you called another function that had a loop like the one in <tt>sum</tt>!).
|
||||
<br>
|
||||
<h3>
|
||||
Arrays</h3>Use the forms of the Array constructor that
|
||||
specify a size or take a list of initial elements. For example, the code
|
||||
<p><tt>var a = new Array();</tt>
|
||||
<br><tt>for (var i=0; i < n; i++)</tt>
|
||||
<br><tt> a[i] = i;</tt>
|
||||
<p>could be sped up by changing the constructor call to <tt>new Array(n)</tt>. A constructor call like that indicates to
|
||||
the runtime that a Java array should be used for the first <i>n</i> entries of the array. Similarly,
|
||||
<tt>new
|
||||
Array("a", "b", "c")</tt> or <tt>["a", "b", "c"]</tt> will cause a 3-element
|
||||
Java array to be allocated to hold the contents of the JavaScript array.
|
||||
<br>
|
||||
<br>
|
||||
<h3>
|
||||
<tt>eval</tt> and <tt>new Function</tt></h3>Avoid calling <tt>eval</tt> when
|
||||
possible. Calls to <tt>eval</tt> are slow because the script
|
||||
being executed must be compiled. Constructing a new function object can be slow
|
||||
for the same reason, while function expressions are more efficient because the
|
||||
function can be compiled. For example, the code
|
||||
<p><tt>function MyObject(a) {</tt>
|
||||
<br><tt> this.s = a;</tt>
|
||||
<br><tt> this.toString = new
|
||||
Function("return this.s");</tt>
|
||||
<br><tt>}</tt>
|
||||
<p>could be written more efficiently as
|
||||
<p><tt>function MyObject(a) {</tt>
|
||||
<br><tt> this.s = a;</tt>
|
||||
<br><tt> this.toString =
|
||||
function () { return this.s }</tt>
|
||||
<br><tt>}</tt>
|
||||
<p>Beginning with Rhino 1.4 Release 2, code
|
||||
passed to eval and new Function will be interpreted rather than compiled to
|
||||
class files.
|
||||
<br> </p>
|
||||
<h3>
|
||||
with</h3>Using the <tt>with</tt>
|
||||
statement prevents the compiler from generating code for fast access to local
|
||||
variables. You're probably better off explicitly accessing any properties of the
|
||||
object.
|
||||
<br>
|
||||
<p>
|
||||
<hr WIDTH="100%">
|
||||
<br><a href="index.html">back to top</a>
|
||||
<br>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,162 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java">
|
||||
<title>What's New in Rhino 1.5</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
What's New in Rhino 1.5 Release 1</h1></center>
|
||||
|
||||
<h2>
|
||||
ECMA 262 Edition 3 Conformance</h2>
|
||||
Rhino 1.5 implements JavaScript 1.5, which conforms to ECMA 262 Edition
|
||||
3 (sometimes referred to as "ECMAScript"). Edition 3 standardized several
|
||||
features of JavaScript that were present in JavaScript 1.4, including:
|
||||
<ul>
|
||||
<li>
|
||||
regular expressions</li>
|
||||
|
||||
<li>
|
||||
<tt>switch</tt> statements</li>
|
||||
|
||||
<li>
|
||||
<tt>do</tt>...<tt>while</tt> loops</li>
|
||||
|
||||
<li>
|
||||
statement labels and labelled <tt>break</tt> and <tt>continue</tt></li>
|
||||
|
||||
<li>
|
||||
object literals</li>
|
||||
|
||||
<li>
|
||||
nested functions</li>
|
||||
|
||||
<li>
|
||||
exception handling</li>
|
||||
|
||||
<li>
|
||||
the <tt>instanceof</tt> operator</li>
|
||||
|
||||
<li>
|
||||
the <tt>in</tt> operator</li>
|
||||
</ul>
|
||||
In addition, new features were added to Edition 3 and JavaScript 1.5, including:
|
||||
<ul>
|
||||
<li>
|
||||
Perl 5 regular expressions, including operators like greedy quantifiers</li>
|
||||
|
||||
<li>
|
||||
errors as exceptions</li>
|
||||
|
||||
<li>
|
||||
number formatting (<tt>Number.prototype.toFixed</tt>, <tt>Number.prototype.toExponential</tt>,
|
||||
and <tt>Number.prototype.toGeneral</tt>)</li>
|
||||
</ul>
|
||||
|
||||
<h2>
|
||||
Changes since Rhino 1.4 Release 3</h2>
|
||||
Other significant changes to Rhino since the initial release to open source
|
||||
(1.4 Release 3) are listed below. Bug fixes won't be mentioned here, just
|
||||
API changes or significant functionality changes.
|
||||
<h3>
|
||||
Compilation mode</h3>
|
||||
Rhino has two modes of execution available. Interpretive mode has an interpreter
|
||||
loop implemented in Java. Compilation mode compiles JavaScript code to
|
||||
Java bytecodes in class files. This compilation can be done as part of
|
||||
script evaluation using the same APIs already available for the interpreter,
|
||||
or in a separate compile-time step. The code for the interpreter is located
|
||||
in the <tt>org.mozilla.javascript.optimizer</tt> package.
|
||||
<br>
|
||||
<h3>
|
||||
JavaScript Compiler</h3>
|
||||
The distribution now contains an extra class that can be invoked from the
|
||||
command line. This is <tt>jsc</tt>, the JavaScript compiler. This tool
|
||||
can be used to create Java classes from JavaScript. Options exist to allow
|
||||
creation of Java classes that implement arbitrary interfaces and extend
|
||||
arbitrary base classes, allowing JavaScript scripts to implement important
|
||||
protocols like applets and servlets. See <a href="http://www.mozilla.org/rhino/jsc.html">http://www.mozilla.org/rhino/jsc.html</a>.
|
||||
<br>
|
||||
<h3>
|
||||
LiveConnect 3</h3>
|
||||
Rhino now supports the LiveConnect 3 specification, or LC3. The most notable
|
||||
change is support for overloaded method resolution. See <a href="http://www.mozilla.org/js/liveconnect/lc3_proposal.html">LiveConnect
|
||||
Release 3 Goals/Features</a>.
|
||||
<br>
|
||||
<h3>
|
||||
JavaBeans properties reflected as Java properties</h3>
|
||||
Java classes with getFoo/setFoo methods will have a "foo" property in the
|
||||
JavaScript reflection. Boolean methods are also reflected.
|
||||
<br>
|
||||
<h3>
|
||||
Dynamic scope support</h3>
|
||||
Rhino 1.5 implements support for dynamic scopes, which are particularly
|
||||
useful for multithreaded environments like server embeddings.
|
||||
<br>
|
||||
<h3>
|
||||
New semantics for <tt>ScriptableObject.defineClass</tt></h3>
|
||||
The old rules for defining JavaScript objects using a Java class were getting
|
||||
baroque. Those rules are still supported, but a cleaner definition is now
|
||||
supported. See the <a href="http://www.mozilla.org/js/rhino/org/mozilla/javascript/ScriptableObject.html#defineClass(org.mozilla.javascript.Scriptable, java.lang.Class)">javadoc</a>
|
||||
for details.
|
||||
<br>
|
||||
<h3>
|
||||
Support for the Java 2 <tt>-jar</tt> option</h3>
|
||||
It's now possible to start the shell using the new <tt>-jar</tt> option
|
||||
in Java 2.
|
||||
<br>
|
||||
<h3>
|
||||
Shell changes</h3>
|
||||
Two changes here: addition of the "environment" and "history" top-level
|
||||
variables.
|
||||
<br>
|
||||
<h3>
|
||||
Java classes visible to scripts</h3>
|
||||
An attendee at JavaOne raised the point that many embeddings may not want
|
||||
scripts to be able to access all Java classes. This is an excellent point,
|
||||
and I've implemented an addition to the <a href="../js/rhino/org/mozilla/javascript/SecuritySupport.html">SecuritySupport</a>
|
||||
interface that allows embedders to choose which classes are exposed to
|
||||
scripts.
|
||||
<br>
|
||||
<h3>
|
||||
SecuritySupport and JavaAdapter</h3>
|
||||
Andrew Wason pointed a problem with the new JavaAdapter feature (which
|
||||
allows JavaScript objects to implement arbitrary Java interfaces by generating
|
||||
class files). It didn't support the <a href="../js/rhino/org/mozilla/javascript/SecuritySupport.html">SecuritySupport</a>
|
||||
interface, which allows Rhino to delegate the creation of classes from
|
||||
byte arrays to a routine provided by the embedding. This ability is important
|
||||
from a security standpoint because class creation is considered a privileged
|
||||
action.
|
||||
<p>I've checked in changes that fix this problem. If a SecuritySupport
|
||||
class is specified when a Context is created, uses of JavaAdapter will
|
||||
will delegate class creation to the SecuritySupport class.
|
||||
<br>
|
||||
<h3>
|
||||
Context.exit()</h3>
|
||||
Context.exit() has been changed from an instance method to a static method.
|
||||
This makes it match the Context.enter() method, which is also static. See
|
||||
the <a href="http://www.mozilla.org/js/rhino/org/mozilla/javascript/Context.html#exit()">javadoc</a>
|
||||
for more information on its operation.
|
||||
<br>
|
||||
<h3>
|
||||
Context.enter(Context)</h3>
|
||||
A new overloaded form of Context.enter has been added. Without the addition
|
||||
of this method it was not possible to attach an existing context to a thread.
|
||||
See the <a href="http://www.mozilla.org/js/rhino/org/mozilla/javascript/Context.html#enter(org.mozilla.javascript.Context)">javadoc</a>
|
||||
for more information on its operation.
|
||||
<br>
|
||||
<h3>
|
||||
Listeners for Context</h3>
|
||||
Context now supports property change listeners for a couple of its properties.
|
||||
<h3>
|
||||
|
||||
<hr WIDTH="100%"><br>
|
||||
<a href="index.html">back to top</a></h3>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,84 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java">
|
||||
<title>Rhino 1.5 Release 2</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
What's New in Rhino 1.5 Release 2</h1></center>
|
||||
This is a log of significant changes since the release of Rhino 1.5 Release
|
||||
1.
|
||||
<br>
|
||||
<h2>
|
||||
Graphical debugger</h2>
|
||||
Thanks to a contribution by Christopher Oliver, Rhino now has a graphical
|
||||
debugger. See <a href="debugger.html">Rhino Debugger</a> for more details.
|
||||
<br>
|
||||
<h2>
|
||||
Footprint reductions</h2>
|
||||
Igor Bukanov has provided a wealth of changes to reduce the number and
|
||||
size of objects required by Rhino. In particular, he introduced a new way
|
||||
to represent the built-in objects like Date and RegExp that reduces the
|
||||
amount of memory required and speeds up <tt>Context.initStandardObjects</tt>.
|
||||
<br>
|
||||
<h2>
|
||||
Interpreted mode performance improvements</h2>
|
||||
Igor Bukanov also made a number of improvements to interpreter mode performance.
|
||||
<br>
|
||||
<h2>
|
||||
JS/CORBA Adapter</h2>
|
||||
Matthias Radestock wrote a module that allows JavaScript code to interact
|
||||
with CORBA. See <a href="http://sourceforge.net/projects/jscorba">http://sourceforge.net/projects/jscorba</a>
|
||||
for more details.
|
||||
<br>
|
||||
<h2>
|
||||
Directory restructuring and Ant buildfile</h2>
|
||||
I've restructured the the Rhino directory and written an <a href="http://jakarta.apache.org/ant/index.html">Ant</a>
|
||||
buildfile. This should make building easier and more consistent with other
|
||||
open source Java projects.
|
||||
<br>
|
||||
<h2>
|
||||
FlattenedObject deprecated</h2>
|
||||
I wrote FlattenedObject to provide a means for dealing with JavaScript
|
||||
<br>objects in prototype chains. Where Scriptable defines the primitive
|
||||
<br>operations, FlattenedObject defines the aggregate operations of
|
||||
<br>manipulating properties that may be defined in an object or in an object
|
||||
<br>reachable by a succession of getPrototype calls.
|
||||
<p>However, I now believe that I designed FlattenedObject poorly. Perhaps
|
||||
<br>it should have been a clue that I was never satisfied with the name:
|
||||
if
|
||||
<br>it's hard to express the name of the object it may mean the function
|
||||
the
|
||||
<br>object is supposed to fulfill is not well defined either. The problem
|
||||
is
|
||||
<br>that it is inefficient since it requires an extra object creation,
|
||||
and
|
||||
<br>balky because of that extra level of wrapping.
|
||||
<p>So I've checked in changes that deprecate FlattenedObject. I've
|
||||
<br>introduced new static methods in ScriptableObject (thanks to
|
||||
<br>beard@netscape.com for the idea) that replace the functionality. These
|
||||
<br>methods perform the get, put, and delete operations on a Scriptable
|
||||
<br>object passed in without the overhead of creating a new object.
|
||||
<h2>
|
||||
WrapHandler interface</h2>
|
||||
Embeddings that wish to provide their own custom wrappings for Java objects
|
||||
may implement this interface and
|
||||
<br>call Context.setWrapHandler. See WrapHandler javadoc.
|
||||
<br>
|
||||
<h2>
|
||||
ClassOutput interface</h2>
|
||||
An interface embedders can implement in order to control the placement
|
||||
of generated class bytecodes. See the javadoc.
|
||||
<h3>
|
||||
|
||||
<hr WIDTH="100%"><br>
|
||||
<a href="index.html">back to top</a></h3>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,63 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
|
||||
<meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
|
||||
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java">
|
||||
<title>Change Log</title>
|
||||
</head>
|
||||
<body bgcolor="#ffffff">
|
||||
|
||||
<center>
|
||||
<h1> Change Log for Significant Rhino Changes</h1>
|
||||
</center>
|
||||
This is a log of significant changes since the release of Rhino 1.5 Release
|
||||
2.
|
||||
<p> </p>
|
||||
<h3> </h3>
|
||||
<h3>Serialization</h3>
|
||||
See the <a href="serialization.html">serialization documentation</a>
|
||||
.<br>
|
||||
<br>
|
||||
<h3>Class writer API changes</h3>
|
||||
Courtesy of Kemal Bayram.<br>
|
||||
<br>
|
||||
"The biggest change I've made is the replacement of ClassOutput with<br>
|
||||
ClassRepository that has the single method:<br>
|
||||
<br>
|
||||
public boolean storeClass(String className, byte[] classBytes,<br>
|
||||
|
||||
boolean isTopLevel) throws IOException;<br>
|
||||
<br>
|
||||
This interface allows any arbitary storage method, such as a<br>
|
||||
Hashtable/Map. In addition it also allows you to specify whether a<br>
|
||||
class should be loaded, via returning true or false. You can still
|
||||
use<br>
|
||||
ClassOutput as I've coded an internal wrapper.<br>
|
||||
<br>
|
||||
With this interface it has also been possible to strip out the file<br>
|
||||
saving code from Codegen and OptClassNameHelper. The file<br>
|
||||
saving code is now an inner class FileClassRepository in Context. As<br>
|
||||
a consequence of this I've stripped out some methods from ClassNameHelper.<br>
|
||||
The resulting code is much more cleaner then before hand and everything<br>
|
||||
still works as per usual.<br>
|
||||
<br>
|
||||
Other small additions are:<br>
|
||||
o Annonymous functions are now named class$1 instead of class1<br>
|
||||
o get/setClassName added to ClassNameHelper exposed in Context.
|
||||
"<br>
|
||||
<br>
|
||||
<h3>Bunches of bug fixes and optimizations from Igor Bukanov and others</h3>
|
||||
See the CVS logs<br>
|
||||
<h3>
|
||||
<hr width="100%"><br>
|
||||
<a href="index.html">back to top</a>
|
||||
</h3>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,201 +0,0 @@
|
||||
<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Igor Bukanov">
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java">
|
||||
<title>Debug API changes</title>
|
||||
</head>
|
||||
|
||||
<body bgcolor="#ffffff">
|
||||
|
||||
<h2 align="center">Debug API changes in Rhino 1.5 Release 4</h2>
|
||||
<p>
|
||||
The main difference between the old and new API is that the application needs to implement both org.mozilla.javascript.debugger.Debugger and
|
||||
org.mozilla.javascript.debugger.DebugFrame interfaces to receive debug
|
||||
information during script execution. See the API documentation for these
|
||||
classes for details:
|
||||
<br>
|
||||
<tt><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/src/org/mozilla/javascript/debug/DebugFrame.java">http://lxr.mozilla.org/mozilla/source/js/rhino/src/org/mozilla/javascript/debug/DebugFrame.java</a>
|
||||
<br><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/src/org/mozilla/javascript/debug/Debugger.java">http://lxr.mozilla.org/mozilla/source/js/rhino/src/org/mozilla/javascript/debug/Debugger.java</a>
|
||||
</tt>
|
||||
<p>
|
||||
In addition the org.mozilla.javascript.debugger.DebuggableEngine interface and the getDebuggableEngine method in org.mozilla.javascript.Context are replaced by 3 Context methods: setDebugger, getDebugger and getDebuggerContextData to set/get debugger and its Context data in the current thread Context:<br>
|
||||
<tt><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/src/org/mozilla/javascript/Context.java">http://lxr.mozilla.org/mozilla/source/js/rhino/src/org/mozilla/javascript/Context.java</a></tt>
|
||||
|
||||
<p>The following gives few examples how to update your current application to the new API.
|
||||
<p>
|
||||
1. Setting and querying a Debugger implementation
|
||||
<p>
|
||||
Old API:
|
||||
<pre>
|
||||
cx.getDebuggableEngine.setDebugger(debugger);
|
||||
cx.getDebuggableEngine.getDebugger();
|
||||
</pre>
|
||||
New API:
|
||||
<pre>
|
||||
cx.setDebugger(debugger);
|
||||
cx.getDebugger();
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
2. Monitoring execution of each line in the script
|
||||
<p>
|
||||
Old implementation:
|
||||
<pre>
|
||||
public MyDebugger implement Debugger {
|
||||
|
||||
public void handleCompilationDone(Context cx,
|
||||
DebuggableScript fnOrScript,
|
||||
StringBuffer source)
|
||||
{
|
||||
}
|
||||
|
||||
void handleBreakpointHit(Context cx)
|
||||
{
|
||||
DebugFrame frame = cx.getDebuggableEngine().getFrame(0);
|
||||
System.out.println("New line:" + frame.getLineNumber());
|
||||
}
|
||||
|
||||
void handleExceptionThrown(Context cx, Object exception)
|
||||
{
|
||||
}
|
||||
}
|
||||
...
|
||||
cx.getDebuggableEngine.setDebugger(new MyDebugger());
|
||||
cx.getDebuggableEngine.setBreakNextLine(true);
|
||||
</pre>
|
||||
|
||||
New implementation:
|
||||
<pre>
|
||||
public MyDebugger implement Debugger
|
||||
{
|
||||
public void handleCompilationDone(Context cx,
|
||||
DebuggableScript fnOrScript,
|
||||
StringBuffer source)
|
||||
{
|
||||
}
|
||||
|
||||
public DebugFrame getFrame(Context cx, DebuggableScript fnOrScript)
|
||||
{
|
||||
return new MyDebugFrame();
|
||||
}
|
||||
}
|
||||
|
||||
class MyDebugFrame implements DebugFrame
|
||||
{
|
||||
public void onEnter(Context cx, Scriptable activation,
|
||||
Scriptable thisObj, Object[] args)
|
||||
{
|
||||
}
|
||||
|
||||
public void onExceptionThrown(Context cx, Throwable ex)
|
||||
{
|
||||
}
|
||||
|
||||
public void onExit(Context cx, boolean byThrow,
|
||||
Object resultOrException)
|
||||
{
|
||||
}
|
||||
|
||||
public void onLineChange(Context cx, int lineNumber)
|
||||
{
|
||||
System.out.println("New line:" + frame.getLineNumber());
|
||||
}
|
||||
}
|
||||
...
|
||||
cx.setDebugger(new MyDebugger());
|
||||
</pre>
|
||||
Note the in the new implementation the application can monitor function enter/exit by customizing enterFrame and onExit in the above code.
|
||||
<p>
|
||||
3. Breakpoint handling
|
||||
<p>
|
||||
Old implementation:
|
||||
<pre>
|
||||
public MyDebugger implement Debugger {
|
||||
|
||||
public void handleCompilationDone(Context cx, DebuggableScript fnOrScript,
|
||||
StringBuffer source)
|
||||
{
|
||||
int breakpointLine = ...;
|
||||
fnOrScript.placeBreakpoint(breakpointLine);
|
||||
}
|
||||
|
||||
void handleBreakpointHit(Context cx) {
|
||||
DebugFrame frame = cx.getDebuggableEngine().getFrame(0);
|
||||
System.out.println("Breakpoint hit: "+frame.getSourceName()+":"+frame.getLineNumber());
|
||||
}
|
||||
|
||||
void handleExceptionThrown(Context cx, Object exception)
|
||||
{
|
||||
}
|
||||
}
|
||||
...
|
||||
cx.getDebuggableEngine.setDebugger(new MyDebugger());
|
||||
</pre>
|
||||
|
||||
New implementation:
|
||||
<pre>
|
||||
public MyDebugger implement Debugger
|
||||
{
|
||||
public void handleCompilationDone(Context cx,
|
||||
DebuggableScript fnOrScript,
|
||||
StringBuffer source)
|
||||
{
|
||||
}
|
||||
|
||||
public DebugFrame getFrame(Context cx, DebuggableScript fnOrScript)
|
||||
{
|
||||
return new MyDebugFrame(fnOrScript);
|
||||
}
|
||||
}
|
||||
|
||||
class MyDebugFrame implements DebugFrame
|
||||
{
|
||||
DebuggableScript fnOrScript;
|
||||
|
||||
MyDebugFrame(DebuggableScript fnOrScript)
|
||||
{
|
||||
this.fnOrScript = fnOrScript;
|
||||
}
|
||||
|
||||
public void onEnter(Context cx, Scriptable activation,
|
||||
Scriptable thisObj, Object[] args)
|
||||
{
|
||||
System.out.println("Frame entered");
|
||||
}
|
||||
|
||||
public void onLineChange(Context cx, int lineNumber)
|
||||
{
|
||||
if (isBreakpoint(lineNumber)) {
|
||||
System.out.println("Breakpoint hit: "+fnOrScript.getSourceName()+":"+lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
public void onExceptionThrown(Context cx, Throwable ex)
|
||||
{
|
||||
}
|
||||
|
||||
public void onExit(Context cx, boolean byThrow,
|
||||
Object resultOrException)
|
||||
{
|
||||
System.out.println("Frame exit, result="+resultOrException);
|
||||
}
|
||||
|
||||
private boolean isBreakpoint(int lineNumber)
|
||||
{
|
||||
...
|
||||
}
|
||||
}
|
||||
...
|
||||
cx.setDebugger(new MyDebugger());
|
||||
</pre>
|
||||
|
||||
Here debugger during execution needs to decide if a particular line has breakpoint on it set or not during script execution, not at the moment of script initialization.
|
||||
|
||||
<p>See also Rhino Debugger that fully explore the new API:<br><tt><a href="http://lxr.mozilla.org/mozilla/source/js/rhino/toolsrc/org/mozilla/javascript/tools/debugger/Main.java">http://lxr.mozilla.org/mozilla/source/js/rhino/toolsrc/org/mozilla/javascript/tools/debugger/Main.java</a></tt>. The debugger changes includes support for debugging eval and Function scripts and loading script sources from their URL if debugger was not installed during scripts initialization.
|
||||
|
||||
<hr width="100%"><br>
|
||||
<a href="index.html">back to top</a></h3>
|
||||
|
||||
|
||||
</body></html>
|
||||
@@ -1,217 +0,0 @@
|
||||
<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"><html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java"><title>Change Log</title></head>
|
||||
|
||||
<body bgcolor="#ffffff">
|
||||
|
||||
<h1 align="center">
|
||||
Rhino Change Log</h1>
|
||||
|
||||
This is a log of changes since the release of Rhino 1.5 Release 3.
|
||||
|
||||
<h3>Rhino debug API changes</h3>
|
||||
|
||||
A new, incompatible Rhino debug API gives an option to monitor
|
||||
entering/leaving of script functions while decreasing the amount of code to
|
||||
implement the API in the Rhino core. Details are available <a href="rhino15R4-debugger.html">here</a>. With the new API <a href="debugger.html">Rhino Debugger</a> provides options to break on function enter/exit, can debug scripts defined by eval and Function construction and scripts loaded prior the debugger were started.
|
||||
|
||||
<h3>WrapFactory introduced, WrapHandler deprecated</h3>
|
||||
A design flaw in the WrapHandler interface (a call to a Java contructor from
|
||||
JavaScript would result in a call to wrap the result, which would then be
|
||||
cast to a Scriptable) inspired the deprecation of that interface and the
|
||||
introduction of a new class, WrapFactory, that contains a new method called
|
||||
on the result of a constructor call and can be customized by application if necessary.
|
||||
<p>
|
||||
In addition, WrapFactory has the new <tt>setJavaPrimitiveWrap</tt> method to control if instances of Java <tt>String</tt> and <tt>Number</tt> class should be wrapped to special script objects as any other Java objects so a script can access any method <tt>String</tt> and <tt>Number</tt>, or they should be converted to JavaScript primitive strings and numbers.
|
||||
|
||||
<h3>New security interfaces</h3>
|
||||
<p>
|
||||
Igor Bukanov contributed a new security implementation that allows integration with Java2 security model and prevents scripts to escape the security sandbox via eval/Function schemes.
|
||||
<p>
|
||||
Due to this changes SecuritySupport interface is replaced by ClassShutter and SecurityController, where ClassShutter controls which classes are visible to scripts via LiveConnect and SecurityController provides permission management. For compatibility SecuritySupport is still available as a deprecated interface but only its visibleToScripts method is used as an alias for ClassShutter.visibleToScripts. See API documentation for new classes for details.
|
||||
<p>
|
||||
An implementation of SecurityController that uses java policy settings to restrict script permissions based on its URL is available with Rhino shell. See the <a href="http://lxr.mozilla.org/mozilla/source/js/rhino/toolsrc/org/mozilla/javascript/tools/shell/JavaPolicySecurity.java">JavaPolicySecurity</a> source for details. To activate it, set the <tt>rhino.use_java_policy_security</tt> system property to true when invoking Rhino shell together with installing a security manager.
|
||||
|
||||
<h3>Serialization chages</h3>
|
||||
Due to changes in Rhino implementation and bug fixes in serialization support runtime data serialized in Rhino 1.5 Release 3 can not be read back in the Release 4.
|
||||
|
||||
<h3>Regular expressions improvements</h3>
|
||||
Roger Lawrence provided new regular expressions implementation which fully confirms to EcmaScript 262 standard and faster.
|
||||
|
||||
<h3>Scripting of classes from any class loader</h3>
|
||||
|
||||
Christopher Oliver contributed code to allow to use the <tt>Packages</tt> object as a constructor taking a class loader argument so a script can access classes defined by that class loader. For example, to access classes from foo.jar file in the current directory, the following can be used:
|
||||
<pre>
|
||||
// create class loader
|
||||
var loader = new java.net.URLClassLoader([new java.net.URL("file:./foo.jar")]);
|
||||
// create its LiveConnect wrapper
|
||||
var fooJar = new Packages(loader);
|
||||
// create an instance of the class For from foo.jar
|
||||
var obj = new fooJar.Foo(1, 2, 3);
|
||||
obj.someMethod();
|
||||
</pre>
|
||||
|
||||
<h3>Shell function to run external processes.</h3>
|
||||
A new <tt>runCommand</tt> function is added to <a href="shell.html">Rhino Shell</a> to run external priocesses. For details, see JavaDoc for <a href="http://lxr.mozilla.org/mozilla/source/js/rhino/toolsrc/org/mozilla/javascript/tools/shell/Global.java">org.mozilla.javascript.tools.shell.Global#runCommand</a>.
|
||||
|
||||
<h3>Resolved Bugzilla reports</h3>
|
||||
|
||||
The following Rhino reports in <a href="http://bugzilla.mozilla.org/">Bugzilla</a> where resolved for Rhino 1.5 Release 4.
|
||||
<p>
|
||||
<a href="http://bugzilla.mozilla.org/show_bug.cgi?id=61579">61579</a> -
|
||||
context.decompileScript doesn't work.
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=72021">72021</a> -
|
||||
The ScriptRuntime class tries to convert even the String values to JavaNativeObject
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=83051">83051</a> -
|
||||
A function defined under a with block can't be invoked outside it
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=104089">104089</a> -
|
||||
Cannot reattach context to its thread because of the bug in Context class
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=105438">105438</a> -
|
||||
SourceName and lineNumbers of syntax errors in Javascript files not dispalyed.
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=106548">106548</a> -
|
||||
/^.*?$/ will not match anything
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=114583">114583</a> -
|
||||
script compile/decompile bug
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=114969">114969</a> -
|
||||
[], [^] are valid RegExp conditions
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=115717">115717</a> -
|
||||
java.lang.ArrayIndexOutOfBoundsException on with/try/finally
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=120194">120194</a> -
|
||||
JS toInt32(x) conversion doesn't match ECMAScript definition
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=122167">122167</a> -
|
||||
string.replace() placeholder '$1' not working
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=123439">123439</a> -
|
||||
Backreferences /(a)? etc./ must hold |undefined| if not used
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=124508">124508</a> -
|
||||
regexp.lastIndex should be integer-valued double, not uint32
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=124900">124900</a> -
|
||||
arguments object storing duplicate parameter values
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=125562">125562</a> -
|
||||
Regexp performance improvement
|
||||
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=126317">126317</a> -
|
||||
Crash on re.exec(str) if re.lastIndex set to certain values
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=126722">126722</a> -
|
||||
(undefined === null) evaluating to true in Rhino compiled mode
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=128468">128468</a> -
|
||||
java.io.NotSerializableException: org.mozilla.javascript.NativeError
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=129365">129365</a> -
|
||||
Incorrect licensing in dtoa.java
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=132217">132217</a> -
|
||||
delete on global function should not delete the function
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=136893">136893</a> -
|
||||
Rhino treatment of |for(i in undefined)|, |for(i in null)|
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=137181">137181</a> -
|
||||
delete on an arguments[i] not working correctly
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=145791">145791</a> -
|
||||
ECMA conformance: Function.prototype.apply(), Function.prototype.call()
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=149285">149285</a> -
|
||||
Complier does not report the correct line number on SyntaxError:Invalid assignment left-hand side.
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=151337">151337</a> -
|
||||
EcmaError.getLineSource() returns 0x0 characters.
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=153223">153223</a> -
|
||||
New RegExp engine in Rhino
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=154693">154693</a> -
|
||||
Interpreted mode doesn't grok different functions on different objects
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=156510">156510</a> -
|
||||
for (i in undefined) {} should not throw TypeError
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=157196">157196</a> -
|
||||
ScriptableObject needs custom serialization implementation
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=157509">157509</a> -
|
||||
No error on invalid usage of \ in identifiers
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=158159">158159</a> -
|
||||
Should Rhino support octal escape sequences in regexps?
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=159334">159334</a> -
|
||||
The javascript functions size is limited by a bug
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=164947">164947</a> -
|
||||
Debugging unique.js produce a stack trace and erratic results
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=166530">166530</a> -
|
||||
ClassCostException in FunctionObject static initializer
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=169830">169830</a> -
|
||||
Array.concat(function) doesn't add function to the array
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=173180">173180</a> -
|
||||
Rhino UTF-8 decoder accepts overlong sequences
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=173906">173906</a> -
|
||||
Dynamic scope not working correctly with optimzation level >= 1
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=175383">175383</a> -
|
||||
ArrayIndexOutOfBoundsException in string.replace()
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=177314">177314</a> -
|
||||
Rhino should allow '\400' to mean ' 0'
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=179068">179068</a> -
|
||||
String literals in Rhino are limited to 64K
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=179366">179366</a> -
|
||||
--> after whitespace after line start should mean comments to line end
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=181654">181654</a> -
|
||||
Calling toString for an object derived from the Error class throws TypeError
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=181834">181834</a> -
|
||||
wrong scope used for inner functions when compiling functions with dynamic scopes (interpreted only)
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=181909">181909</a> -
|
||||
some regression tests for Error invalid
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=182028">182028</a> -
|
||||
Calling has() in get() of a ScriptableObject causes getter function to not be called
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=184107">184107</a> -
|
||||
with(...) { function f ...} should set f in the global scope
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=184111">184111</a> -
|
||||
ArrayOutOfBounds Exception thrown when using Rhino Javascript Debugger
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=185165">185165</a> -
|
||||
Decompilation of "\\" gives broken "\"
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=189183">189183</a> -
|
||||
Debugger source frame window layering fix
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=189898">189898</a> -
|
||||
Broken String.replace: "XaXY".replace("XY", "--") gives --aXY
|
||||
|
||||
<hr width="100%"><br>
|
||||
<a href="index.html">back to top</a></h3>
|
||||
|
||||
</body></html>
|
||||
@@ -1,41 +0,0 @@
|
||||
<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Igor Bukanov">
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java">
|
||||
<title>Rhino 1.5 Release 4.1 Change Log</title>
|
||||
</head>
|
||||
|
||||
<body bgcolor="#ffffff">
|
||||
|
||||
<h1 align="center">Rhino 1.5 Release 4.1 Change Log</h1>
|
||||
|
||||
1.5R4.1 is a bug fix release to address mostly regressions from 1.5R3 found in 1.5R4. The only visible API change compared with 1.5R4 is two new methods in <tt>org.mozilla.javascript.Context</tt>, <tt>getApplicationClassLoader()</tt> and <tt>setApplicationClassLoader(ClasssLoader)</tt>. They allow to control the class loader Rhino uses when accessing application classes.
|
||||
<p>
|
||||
For differences between 1.5R4 and 1.5R3, see <a href="rhino15R4.html">1.5R4 change log</a>.
|
||||
|
||||
<h3>Resolved Bugzilla reports</h3>
|
||||
|
||||
The following Rhino reports in <a href="http://bugzilla.mozilla.org/">Bugzilla</a> where resolved for Rhino 1.5 Release 4.
|
||||
<p>
|
||||
<a href="http://bugzilla.mozilla.org/show_bug.cgi?id=96270">96270</a> -
|
||||
Unable to create java objects from within a javascript.
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=193168">193168</a> -
|
||||
Rhino debugger in v1.5R4 fails to update script source when a script is reloaded.
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=193555">193555</a> -
|
||||
1.5R4 regression: function expression has no access to its name.
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=196017">196017</a> -
|
||||
1.5R4 regression: script can not find classes on some versions of JDK.
|
||||
|
||||
<br><a href="http://bugzilla.mozilla.org/show_bug.cgi?id=200551">200551</a> -
|
||||
JavaAdapter not loading a class if js.jar installed in jre/lib/ext directory.
|
||||
|
||||
|
||||
<hr width="100%"><br>
|
||||
<a href="index.html">back to top</a></h3>
|
||||
|
||||
</body></html>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 6.6 KiB |
@@ -1,138 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.75 [en] (WinNT; U) [Netscape]">
|
||||
<title>JavaScript Runtime</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
The JavaScript Runtime</h1></center>
|
||||
|
||||
<h3>
|
||||
Interpretation</h3>
|
||||
Beginning with Rhino 1.4 Release 2, an interpretive mode is supported.
|
||||
When scripts are compiled in interpretive mode, an internal representation
|
||||
of the compiled form is created and stored rather than generating a Java
|
||||
class. Execution proceeds by evaluating this compiled form using support
|
||||
routines in Rhino.
|
||||
<h3>
|
||||
Compilation to Java Bytecodes</h3>
|
||||
For improved performance, Rhino may compile JavaScript scripts to Java
|
||||
bytecodes. The generated bytecodes in turn depend upon runtime support
|
||||
routines. Each JavaScript script or function is compiled to a separate
|
||||
class.
|
||||
<p>Compilation of JavaScript source to class files is supported. It is
|
||||
possible to specify the class files as well as the packages to generate
|
||||
into.
|
||||
<h3>
|
||||
Types and Values</h3>
|
||||
There are six fundamental types in JavaScript. These types are implemented
|
||||
with the following Java types and values:
|
||||
<br>
|
||||
<br>
|
||||
<center><table BORDER COLS=2 WIDTH="75%" >
|
||||
<tr>
|
||||
<td><i>JavaScript fundamental type</i></td>
|
||||
|
||||
<td><i>Java type</i></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Undefined</td>
|
||||
|
||||
<td>A singleton object defined by <tt>Context.getUndefinedType()</tt></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Null</td>
|
||||
|
||||
<td><tt>null</tt></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Boolean</td>
|
||||
|
||||
<td><tt>java.lang.Boolean</tt></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Number</td>
|
||||
|
||||
<td><tt>java.lang.Number</tt>, that is, any of <tt>java.lang.Byte</tt>,<tt>
|
||||
java.lang.Short</tt>,<tt> java.lang.Integer</tt>,<tt> java.lang.Float</tt>,
|
||||
or <tt>java.lang.Double. Not java.lang.Long, since a double representation
|
||||
of a long may lose precision.</tt></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>String</td>
|
||||
|
||||
<td><tt>java.lang.String</tt></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Object</td>
|
||||
|
||||
<td><tt>org.mozilla.javascript.Scriptable</tt></td>
|
||||
</tr>
|
||||
</table></center>
|
||||
|
||||
<p>In addition, ECMA refers to objects that implement [[Call]] as functions.
|
||||
These object types are represented by implementing the Function interface.
|
||||
<p>Since JavaScript is a dynamically typed language, the static Java type
|
||||
of a JavaScript value is <tt>java.lang.Object</tt>.
|
||||
<p>The behavior of the JavaScript engine is undefined if a value of any
|
||||
type other than the ones described above is introduced into JavaScript.
|
||||
(This caveat does not apply to scripts that use LiveConnect; the Java values
|
||||
are wrapped and unwrapped as appropriate to conform to the above type constraints.)
|
||||
<br>
|
||||
<h3>
|
||||
Property Access</h3>
|
||||
Properties in JavaScript objects may be accessed using either string or
|
||||
numeric identifiers. Conceptually, all accessors are converted to strings
|
||||
in order to perform the lookup of the property in the object. However,
|
||||
this is not the implementation used in practice because a number to string
|
||||
conversion is too expensive to be performed on every array access.
|
||||
<p>Instead, every property accessor method in <a href="org/mozilla/javascript/Scriptable.html">Scriptable</a>
|
||||
(<tt>has</tt>, <tt>get</tt>, <tt>set</tt>, <tt>remove</tt>, <tt>getAttributes</tt>,
|
||||
and <tt>setAttributes</tt>) has overloaded forms that take either a <tt>String</tt>
|
||||
or an <tt>int</tt> argument. It is the responsibility of the caller to
|
||||
invoke the appropriate overloaded form. For example, evaluating the expression
|
||||
<tt>obj["3"]</tt>
|
||||
will invoke the get(int, Scriptable) method even though the property name
|
||||
was presented in the script as a string. Similarly, values of numbers that
|
||||
do not fix in integers (like 1.1 and 0x100000000) must be converted to
|
||||
strings.
|
||||
<br>
|
||||
<h3>
|
||||
Defining Host Objects</h3>
|
||||
Host objects are JavaScript objects that provide special access to the
|
||||
host environment. For example, in a browser environment, the Window and
|
||||
Document objects are host objects.
|
||||
<p>The easiest way to define new host objects is by using <a href="org/mozilla/javascript/ScriptableObject.html#defineClass(org.mozilla.javascript.Scriptable, java.lang.Class)">ScriptableObject.defineClass()</a>.
|
||||
This method defines a set of JavaScript objects using a Java class. Several
|
||||
of the <a href="examples.html">examples</a> define host objects this way.
|
||||
<p>If the services provided by defineClass are insufficient, try other
|
||||
methods of
|
||||
<a href="org/mozilla/javascript/ScriptableObject.html">ScriptableObject</a>
|
||||
and
|
||||
<a href="org/mozilla/javascript/FunctionObject.html">FunctionObject</a>,
|
||||
such as <tt>defineProperty</tt> and <tt>defineFunctionProperties</tt>.
|
||||
<br>
|
||||
<br>
|
||||
<h3>
|
||||
Contexts and Threads</h3>
|
||||
Every thread that executes JavaScript must have an associated Context.
|
||||
Multiple threads (with multiple associated Contexts) may act upon the same
|
||||
set of objects. Any host objects that are defined are responsible for any
|
||||
sychronization required to run safely from multiple threads.
|
||||
<br>
|
||||
<p>
|
||||
<hr WIDTH="100%">
|
||||
<br><a href="index.html">back to top</a>
|
||||
</body>
|
||||
</html>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 80 KiB |
@@ -1,194 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
|
||||
<meta name="GENERATOR" content="Mozilla/4.72 [en]C-NSCP (WinNT; U) [Netscape]">
|
||||
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java">
|
||||
<title>Scopes and Contexts</title>
|
||||
</head>
|
||||
<body bgcolor="#ffffff">
|
||||
|
||||
<script src="owner.js"></script>
|
||||
<center>
|
||||
<h1> Scopes and Contexts</h1>
|
||||
</center>
|
||||
|
||||
<script>document.write(owner());</script> <br>
|
||||
<script>
|
||||
var d = new Date(document.lastModified);
|
||||
document.write((d.getMonth()+1)+"/"+d.getDate()+"/"+d.getFullYear());
|
||||
document.write('<br>');
|
||||
</script>
|
||||
<center>
|
||||
<hr width="100%"></center>
|
||||
|
||||
<p>Before using Rhino in a concurrent environment, it is important to understand
|
||||
the distinction between Contexts and scopes. Both are required to execute
|
||||
scripts, but they play different roles. Simple embeddings of Rhino probably
|
||||
won't need any of the information here, but more complicated embeddings can
|
||||
gain performance and flexibility from the techniques described below. <br>
|
||||
</p>
|
||||
<h2> Contexts</h2>
|
||||
The Rhino Context object is used to store thread-specific information about
|
||||
the execution environment. There should be one and only one Context associated
|
||||
with each thread that will be executing JavaScript.
|
||||
<p>To associate the current thread with a Context, simply call the <tt>enter</tt>
|
||||
method of Context: </p>
|
||||
<pre>
|
||||
Context cx = Context.enter();
|
||||
</pre>
|
||||
Once you are done with execution, simply exit the Context:
|
||||
<pre>
|
||||
Context.exit();
|
||||
</pre>
|
||||
These calls will work properly even if there is already a Context associated
|
||||
with the current thread. That context will be returned and an internal counter
|
||||
incremented. Only when the counter reaches zero will it be disassociated from
|
||||
the thread.
|
||||
<p>Remember to put the <tt>exit()</tt> call in a <tt>finally</tt> block if
|
||||
you're executing code that could throw an exception. <br>
|
||||
</p>
|
||||
<h2> Scopes</h2>
|
||||
A scope is a set of JavaScript objects. Execution of scripts requires a scope
|
||||
for top-level script variable storage as well as a place to find standard
|
||||
objects like <tt>Function</tt> and <tt>Object</tt>.
|
||||
<p>It's important to understand that a scope is independent of the Context
|
||||
that created it. You can create a scope using one Context and then evaluate
|
||||
a script using that scope and another Context (either by exiting the current
|
||||
context and entering another, or by executing on a different thread). You
|
||||
can even execute scripts on multiple threads simultaneously in the same scope.
|
||||
Rhino guarantees that accesses to properties of JavaScript objects are atomic
|
||||
across threads, but doesn't make any more guarantees for scripts executing
|
||||
in the same scope at the same time. If two scripts use the same scope simultaneously,
|
||||
the scripts are responsible for coordinating any accesses to shared variables.
|
||||
</p>
|
||||
<p>A top-level scope is created by calling <tt>Context.initStandardObjects</tt>
|
||||
to create all the standard objects: </p>
|
||||
<pre>
|
||||
ScriptableObject scope = cx.initStandardObjects();
|
||||
</pre>
|
||||
The easiest way to embed Rhino is just to create a new scope this way whenever
|
||||
you need one. However, <tt>initStandardObjects</tt> is an expensive method
|
||||
to call and it allocates a fair amount of memory. We'll see below that there
|
||||
are ways to share a scope created this way among multiple scopes and threads.
|
||||
<br>
|
||||
|
||||
<h2> Name Lookup</h2>
|
||||
So how are scopes used to look up names? In general, variables are looked
|
||||
up by starting at the current variable object (which is different depending
|
||||
on what code is being executed in the program), traversing its prototype chain,
|
||||
and then traversing the parent chain. In the diagram below, the order in
|
||||
which the six objects are traversed is indicated.
|
||||
<center>
|
||||
<p><img src="lookup.gif" height="194" width="500">
|
||||
<br>
|
||||
<i><font size="-1">Order of lookups in a two-deep scope chain with prototypes.</font></i></p>
|
||||
</center>
|
||||
|
||||
<p>For a more concrete example, let's consider the following script: </p>
|
||||
<blockquote><tt>var g = 7;</tt> <br>
|
||||
<tt>function f(a) {</tt> <br>
|
||||
<tt> var v = 8;</tt> <br>
|
||||
<tt> x = v + a;</tt> <br>
|
||||
<tt>}</tt> <br>
|
||||
<tt>f(6);</tt></blockquote>
|
||||
We have a top-level variable <tt>g</tt>, and the call to <tt>f</tt> will
|
||||
create a new top-level variable <tt>x</tt>. All top-level variables are properties
|
||||
of the scope object. When we start executing <tt>f</tt>, the scope chain
|
||||
will start with the function's activation object and will end with the top-level
|
||||
scope (see diagram below). The activation object has two properties, 'a'
|
||||
for the argument, and 'v' for the variable. The top-level scope has properties
|
||||
for the variable <tt>g</tt> and the function <tt>f</tt>.
|
||||
<center>
|
||||
<p><img src="scopes.gif" height="496" width="820">
|
||||
<br>
|
||||
<i><font size="-1">An example scope chain for a simple script.</font></i></p>
|
||||
</center>
|
||||
|
||||
<p>When the statement <tt>x = v + a;</tt> is executed, the scope chain is
|
||||
traversed looking for a 'x' property. When none is found, a new property 'x'
|
||||
is created in the top-level scope. </p>
|
||||
<h2> Sharing Scopes</h2>
|
||||
JavaScript is a language that uses delegation rather than traditional class-based inheritance. This is a large topic in itself, but for our purposes it gives us an easy way to share a set of read-only variables across multiple scopes.
|
||||
|
||||
To do this we set an object's prototype. When accessing a property of an object
|
||||
in JavaScript, the object is first searched for a property with the given
|
||||
name. If none is found, the object's prototype is searched. This continues
|
||||
until either the object is found or the end of the prototype chain is reached.
|
||||
<p>So to share information across multiple scopes, we first create the object
|
||||
we wish to share. Typically this object will have been created with <tt>initStandardObjects</tt>
|
||||
and may also have additional objects specific to the embedding. Then all
|
||||
we need to do is create a new object and call its <tt>setPrototype</tt> method
|
||||
to set the prototype to the shared object, and the parent of the new scope
|
||||
to null:
|
||||
<pre> Scriptable newScope = cx.newObject(sharedScope);
|
||||
newScope.setPrototype(sharedScope);
|
||||
newScope.setParentScope(null);
|
||||
</pre>
|
||||
The call to <tt>newObject</tt> simply creates a new JavaScript object with
|
||||
no properties. It uses the <tt>sharedScope</tt> passed in to initialize the
|
||||
prototype with the standard <tt>Object.prototype</tt> value.
|
||||
<p>We can now use <tt>newScope</tt> as a scope for calls to evaluate scripts.
|
||||
Let's call this scope the <i>instance scope</i>. Any top-level functions or
|
||||
variables defined in the script will end up as properties of the instance
|
||||
scope. Uses of standard objects like <tt>Function</tt>, <tt>String</tt>, or
|
||||
<tt>RegExp</tt> will find the definitions in the shared scope. Multiple
|
||||
instance scopes can be defined and have their own variables for scripts yet
|
||||
share the definitions in the shared scope. These multiple instance scopes
|
||||
can be used concurrently. <br>
|
||||
</p>
|
||||
<h2>Sealed shared scopes</h2>
|
||||
<p>The ECMAScript standard defines that scripts can add properties to all standard library objects and in many cases it is also possible to change or delete their properties as well. Such behavior may not be suitable with shared scopes since if a script by mistake adds a property to a library object from the shared scope, that object would not be garbage collected until there re active references to the shared scope potentially leading to memory leaks. In addition if a script alters some of the standard objects, the library may not work properly for other scripts. Such bugs are hard to debug and to remove a possibility for them to occur one can use seal the shared scope and all its objects.
|
||||
<p>
|
||||
A notion of a sealed object is a JavaScript extension supported by Rhino and it means that properties can not be added/deleted to the object and the existing object properties can not be changed. Any attempt to modify sealed object throws an exception. To seal all objects in the standard library pass <tt>true</tt> for the sealed argument when calling <tt>Context.initStandardObjects(ScriptableObject, boolean)</tt>:
|
||||
<pre> ScriptableObject sealedSharedScope = cx.initStandardObjects(null, true);</pre>
|
||||
This seals only all standard library objects, it does not seal the shared scope itself thus after calling <tt>initStandardObjects</tt>, <tt>sealedSharedScope</tt> cab be farther populated with application-specific objects and functions. Then after a custom initialization is done, one can seal the shared scope by calling <tt>ScriptableObject.sealObject()</tt>:
|
||||
<pre> sealedSharedScope.sealObject();</pre>
|
||||
|
||||
Note that currently one needs to explicitly seal any additional properties he adds to the sealed shared scope since although after calling <tt>sealedSharedScope.sealObject();</tt> it would no be possible to set the additional properties to different values, one still would be able to alter the objects themselves.
|
||||
|
||||
<h2> Dynamic Scopes</h2>
|
||||
There's one problem with the setup outlined above. Calls to functions in
|
||||
JavaScript use <i>static scope</i>, which means that variables are first looked
|
||||
up in the function and then, if not found there, in the lexically enclosing
|
||||
scope. This causes problems if functions you define in your shared scope
|
||||
need access to variables you define in your instance scope.
|
||||
<p>With Rhino 1.5, it is possible to compile functions to use <i>dynamic
|
||||
scope</i>. With dynamic scope, functions look at the top-level scope of the
|
||||
calling function rather than their lexical scope. So we can store information
|
||||
that varies across scopes in the instance scope yet still share functions
|
||||
that manipulate that information reside in the shared scope. </p>
|
||||
<p>The <a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/DynamicScopes.java">
|
||||
DynamicScopes example</a>
|
||||
illustrates all the points discussed above. <br>
|
||||
<br>
|
||||
</p>
|
||||
<h2> More on Scopes</h2>
|
||||
The key things to determine in setting up scopes for your application are
|
||||
<br>
|
||||
(1) What scope should global variables be created in when your script executes
|
||||
an assignment to an undefined variable, and <br>
|
||||
(2) What variables should your script have access to when it references a
|
||||
variable?
|
||||
<p>The answer to (1) determines which scope should be the ultimate parent
|
||||
scope: Rhino follows the parent chain up to the top and places the variable
|
||||
there. After you've constructed your parent scope chain, the answer to question
|
||||
(2) may indicate that there are additional scopes that need to be searched
|
||||
that are not in your parent scope chain. You can add these as prototypes
|
||||
of scopes in your parent scope chain. When Rhino looks up a variable, it
|
||||
starts in the current scope, walks the prototype chain, then goes to the
|
||||
parent scope and its prototype chain, until there are no more parent scopes
|
||||
left. <br>
|
||||
</p>
|
||||
<h3>
|
||||
<hr width="100%"><br>
|
||||
<a href="index.html">back to top</a>
|
||||
</h3>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 53 B |
@@ -1,219 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; U) [Netscape]">
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java">
|
||||
<title>Scripting Java</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
<script src="owner.js"></script>
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
Scripting Java</h1></center>
|
||||
<script>document.write(owner());</script>
|
||||
|
||||
<br><script>
|
||||
var d = new Date(document.lastModified);
|
||||
document.write((d.getMonth()+1)+"/"+d.getDate()+"/"+d.getFullYear());
|
||||
document.write('<br>');
|
||||
</script>
|
||||
|
||||
<center>
|
||||
<hr WIDTH="100%"></center>
|
||||
|
||||
<p>It's possible to use Rhino just for scripting Java. You don't have to
|
||||
write any additional Java code; just use the existing Rhino shell and then
|
||||
make calls into Java.
|
||||
<br>
|
||||
<h2>
|
||||
Rhino Shell</h2>
|
||||
The Rhino shell allows you to run scripts from files or interactively at
|
||||
a command line.
|
||||
<p>If you download the zip file for rhino, it will contain a single JAR
|
||||
file, <tt>js.jar</tt>. If you add the JAR file to your class path, you
|
||||
can start the Rhino shell using the command
|
||||
<pre> java org.mozilla.javascript.tools.shell.Main</pre>
|
||||
or if you have Java 2 (JDK 1.2 or greater), you can avoid changing your classpath
|
||||
and simply use the command
|
||||
<pre> java -jar js.jar</pre>
|
||||
Unfortunately the <tt>-jar</tt> option to <tt>java</tt> will overwrite
|
||||
your existing classpath. The shell's interactive mode is a good way to
|
||||
begin exploring Rhino.
|
||||
<p><i>Note: Earlier versions of Rhino have two JAR files, js.jar and jstools.jar,
|
||||
and don't support the -jar option. Both JAR files must be added to the
|
||||
class path to start the shell</i>.
|
||||
<p>You can execute a JavaScript file by putting the file name as an argument
|
||||
to the shell class:
|
||||
<pre> java org.mozilla.javascript.tools.shell.Main myScript.js</pre>
|
||||
There are a number of options for evaluating scripts using the shell. See
|
||||
the <a href="http://www.mozilla.org/rhino/shell.html">command description</a>
|
||||
for more information.
|
||||
<br>
|
||||
<h2>
|
||||
LiveConnect: Communicating with Java from JavaScript</h2>
|
||||
If you are planning to script Java using Rhino, you'll want to use LiveConnect,
|
||||
which allows you to create Java classes and call Java methods from within
|
||||
JavaScript. For example, here's a log from an interactive session. If you
|
||||
type it in, you'll see a window with a button filling it.
|
||||
<center>
|
||||
<p><img SRC="scriptjavaframe.jpg" height=100 width=200>
|
||||
<br><i><font size=-1>A Java frame created from the Rhino shell.</font></i></center>
|
||||
|
||||
<pre>$ java org.mozilla.javascript.tools.shell.Main
|
||||
js> importPackage(java.awt);
|
||||
js> frame = new Frame("JavaScript")
|
||||
java.awt.Frame[frame0,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,resizable,title=JavaScript]
|
||||
js> frame.show()
|
||||
js> frame.setSize(new Dimension(200,100))
|
||||
js> button = new Button("OK")
|
||||
java.awt.Button[button0,0,0,0x0,invalid,label=OK]
|
||||
js> frame.add(button)
|
||||
java.awt.Button[button0,0,0,0x0,invalid,label=OK]
|
||||
js> frame.show()
|
||||
js> quit()
|
||||
$</pre>
|
||||
If you wish to load classes from JavaScript that aren't in the <tt>java</tt>
|
||||
package, you'll need to prefix the package name with "<tt>Packages.</tt>".
|
||||
For example:
|
||||
<pre>$ java org.mozilla.javascript.tools.shell.Main
|
||||
js> cx = Packages.org.mozilla.javascript.Context.enter()
|
||||
org.mozilla.javascript.Context@25980b44
|
||||
js> cx.evaluateString(this, "3+2", null, 0, null)
|
||||
5.0
|
||||
js> quit()
|
||||
$</pre>
|
||||
|
||||
<h2>
|
||||
Accessing JavaBean Properties</h2>
|
||||
Java classes can define JavaBean properties using getter and setter methods.
|
||||
For example, the following class defines two properties:
|
||||
<p><tt>public class Me {</tt>
|
||||
<br><tt> public int getAge() { return age; }</tt>
|
||||
<br><tt> public void setAge(int anAge) { age = anAge;
|
||||
}</tt>
|
||||
<br><tt> public String getSex() { return "male"; }</tt>
|
||||
<br><tt> private int age;</tt>
|
||||
<br><tt>};</tt>
|
||||
<p>The two properties defined are <i>age</i> and <i>sex</i>. The <i>sex</i>
|
||||
property is read-only: it has no setter.
|
||||
<p>Using Rhino we can access the bean properties as if they where JavaScript
|
||||
properties. We can also continue to call the methods that define the property.
|
||||
<p><tt>js> me = new Packages.Me();</tt>
|
||||
<br><tt>Me@93</tt>
|
||||
<br><tt>js> me.getSex()</tt>
|
||||
<br><tt>male</tt>
|
||||
<br><tt>js> me.sex</tt>
|
||||
<br><tt>male</tt>
|
||||
<br><tt>js> me.age = 33;</tt>
|
||||
<br><tt>33</tt>
|
||||
<br><tt>js> me.age</tt>
|
||||
<br><tt>33</tt>
|
||||
<br><tt>js> me.getAge()</tt>
|
||||
<br><tt>33</tt>
|
||||
<br><tt>js></tt>
|
||||
<p>Since the <i>sex</i> property is read-only, we are not allowed to write
|
||||
to it.
|
||||
<p><i>Note: JavaBean reflection is not available in versions of Rhino before
|
||||
1.5.</i>
|
||||
<br><tt></tt>
|
||||
<h2>
|
||||
Importing Java Classes and Packages</h2>
|
||||
Above we saw the use of the <tt>importPackage</tt> function to import all
|
||||
the classes from a particular Java package. There is also <tt>importClass</tt>,
|
||||
which imports a single class:
|
||||
<pre>$ java org.mozilla.javascript.tools.shell.Main
|
||||
js> importClass(Packages.org.mozilla.javascript.Context)
|
||||
js> cx = Context.enter()
|
||||
org.mozilla.javascript.Context@25980d62
|
||||
js> cx.evaluateString(this, "3+2", null, 0, null)
|
||||
5.0
|
||||
js> quit()
|
||||
$</pre>
|
||||
|
||||
<h2>
|
||||
Extending Java Classes and Implementing Java Interfaces with JavaScript</h2>
|
||||
Starting from the example above of creating a Java frame using JavaScript,
|
||||
we can add a listener for the button. Once we call <tt>addActionListener</tt>
|
||||
we can then click on the button to get the current date printed out:
|
||||
<pre>$ java org.mozilla.javascript.tools.shell.Main
|
||||
js> importPackage(java.awt);
|
||||
js> frame = new Frame("JavaScript")
|
||||
java.awt.Frame[frame0,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,resizable,title=JavaScript]
|
||||
js> button = new Button("OK")
|
||||
java.awt.Button[button0,0,0,0x0,invalid,label=OK]
|
||||
js> frame.setSize(new Dimension(200,100))
|
||||
js> frame.add(button)
|
||||
java.awt.Button[button0,0,0,0x0,invalid,label=OK]
|
||||
js> frame.show()
|
||||
js> function printDate() { print(new Date()) }
|
||||
js> printDate()
|
||||
Wed Mar 15 15:42:20 GMT-0800 (PST) 2000
|
||||
js> o = { actionPerformed: printDate }
|
||||
[object Object]
|
||||
js> o.actionPerformed()
|
||||
Wed Mar 15 15:42:39 GMT-0800 (PST) 2000
|
||||
js> buttonListener = java.awt.event.ActionListener(o)
|
||||
adapter0@6acc0f66
|
||||
js> button.addActionListener(buttonListener)
|
||||
js> Wed Mar 15 15:43:05 GMT-0800 (PST) 2000
|
||||
Wed Mar 15 15:43:05 GMT-0800 (PST) 2000
|
||||
Wed Mar 15 15:43:08 GMT-0800 (PST) 2000
|
||||
quit()
|
||||
$</pre>
|
||||
When we type <tt>buttonListener = java.awt.event.ActionListener(o)</tt>,
|
||||
Rhino actually creates a new Java class that implements <tt>ActionListener</tt>
|
||||
and forwards calls from that class to the JavaScript object. So when you
|
||||
click on the button, the <tt>printDate</tt> method is called.
|
||||
<p>
|
||||
Starting from the release 1.5R5 Rhino allows to pass JavaScript functions directly to Java methods if the corresponding argument is Java interface with single method. It allows to pass <tt>printDate</tt> directly to <tt>addActionListener</tt> and simplifies example:
|
||||
<pre>$ java org.mozilla.javascript.tools.shell.Main
|
||||
js> importPackage(java.awt);
|
||||
js> frame = new Frame("JavaScript")
|
||||
java.awt.Frame[frame0,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,title=JavaScript,resizable,normal]
|
||||
js> button = new Button("OK")
|
||||
java.awt.Button[button0,0,0,0x0,invalid,label=OK]
|
||||
js> frame.setSize(new Dimension(200,100))
|
||||
js> frame.add(button)
|
||||
java.awt.Button[button0,0,0,0x0,invalid,label=OK]
|
||||
js> frame.show()
|
||||
js> function printDate() { print(new Date()) }
|
||||
js> printDate()
|
||||
Mon Oct 27 2003 10:35:44 GMT+0100 (CET)
|
||||
js> button.addActionListener(printDate)
|
||||
js> Mon Oct 27 2003 10:36:09 GMT+0100 (CET)
|
||||
Mon Oct 27 2003 10:36:10 GMT+0100 (CET)
|
||||
quit()
|
||||
$</pre>
|
||||
|
||||
<h2>
|
||||
JavaAdapter constructor</h2>
|
||||
Another way to create a JavaAdapter is to call the JavaAdapter constructor
|
||||
explicitly. Using the JavaAdapter constructor gives you additional features
|
||||
that cannot be had by "constructing" a Java interface as was done above.
|
||||
<p>Instead of writing
|
||||
<pre> buttonListener = java.awt.event.ActionListener(o)</pre>
|
||||
above we can also write
|
||||
<pre> buttonListener = new JavaAdapter(java.awt.event.ActionListener, o)</pre>
|
||||
which is equivalent. If we also wanted to extend class <tt>Foo</tt>, while
|
||||
also implementing <tt>java.lang.Runnable</tt>, we would write
|
||||
<pre> buttonListener = new JavaAdapter(Packages.Foo,
|
||||
java.awt.event.ActionListener,
|
||||
java.lang.Runnable, o)</pre>
|
||||
In general the syntax is
|
||||
<p> <tt>new JavaAdapter(</tt><i>java-class</i>, [<i>java-class</i>,
|
||||
...] <i>javascript-object</i><tt>)</tt>
|
||||
<p>where at most one <i>java-class</i> is a Java class and the remaining
|
||||
<i>java-class</i>es
|
||||
are interfaces. The result will be a Java adapter that extends any specified
|
||||
Java class, implements the Java interfaces, and forwards any calls to the
|
||||
methods of the <i>javascript-object</i>.
|
||||
<h3>
|
||||
|
||||
<hr WIDTH="100%"><br>
|
||||
<a href="index.html">back to top</a></h3>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.0 KiB |
@@ -1,122 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
|
||||
<meta name="GENERATOR" content="Mozilla/4.72 [en]C-NSCP (WinNT; U) [Netscape]">
|
||||
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java">
|
||||
<title>Serialization</title>
|
||||
</head>
|
||||
<body bgcolor="#ffffff">
|
||||
|
||||
<script src="owner.js"></script>
|
||||
<center>
|
||||
<h1>Serialization</h1>
|
||||
</center>
|
||||
|
||||
<script>document.write(owner());</script> <br>
|
||||
<script>
|
||||
var d = new Date(document.lastModified);
|
||||
document.write((d.getMonth()+1)+"/"+d.getDate()+"/"+d.getFullYear());
|
||||
document.write('<br>');
|
||||
</script>
|
||||
<center>
|
||||
<hr width="100%"></center>
|
||||
|
||||
<p>Beginning with Rhino 1.5 Release 3 it is possible to serialize JavaScript
|
||||
objects, including functions and scripts. However, serialization of
|
||||
code in compilation mode has some significant limitations.. Serialization
|
||||
provides a way to save the state of an object and write it out to a file
|
||||
or send it across a network connection. <br>
|
||||
</p>
|
||||
<h2>Simple serialization example</h2>
|
||||
The Rhino shell has two new top-level functions, serialize and deserialize.
|
||||
They're intended mainly as examples of the use of serialization:<br>
|
||||
<pre>$ java org.mozilla.javascript.tools.shell.Main<br>js> function f() { return 3; }<br>js> serialize(f, "f.ser")<br>js> quit()<br><br>$ java org.mozilla.javascript.tools.shell.Main<br>js> f = deserialize("f.ser")<br><br>function f() {<br> return 3;<br>}<br><br>js> f()<br>3<br>js></pre>
|
||||
<pre></pre>
|
||||
<pre></pre>
|
||||
<pre></pre>
|
||||
<pre></pre>
|
||||
<pre></pre>
|
||||
<pre></pre>
|
||||
<pre></pre>
|
||||
<pre></pre>
|
||||
<pre></pre>
|
||||
Here we see a simple case of a function being serialized to a file and then
|
||||
read into a new instance of Rhino and called. <br>
|
||||
<br>
|
||||
<h2>Rhino serialization APIs</h2>
|
||||
Two new classes, ScriptableOutputStream and ScriptableInputStream, were introduced
|
||||
to handle serialization of Rhino classes. These classes extend ObjectOutputStream
|
||||
and ObjectInputStream respectively. Writing an object to a file can be done
|
||||
in a few lines of Java code:<br>
|
||||
<pre>FileOutputStream fos = new FileOutputStream(filename);<br>ScriptableOutputStream out = new ScriptableOutputStream(fos, scope);<br>out.writeObject(obj);<br>out.close();</pre>
|
||||
<p>Here filename is the file to write to, obj is the object or function to
|
||||
write, and scope is the top-level scope containing obj. </p>
|
||||
<p>Reading the serialized object back into memory is similarly simple:</p>
|
||||
<pre>FileInputStream fis = new FileInputStream(filename);<br>ObjectInputStream in = new ScriptableInputStream(fis, scope);<br>Object deserialized = in.readObject();<br>in.close();<br></pre>
|
||||
<p>Again, we need the scope to create our serialization stream class. </p>
|
||||
<p>So why do we need these specialized stream classes instead of simply using
|
||||
ObjectOutputStream and ObjectInputStream? To understand the answer we must
|
||||
know what goes on behind the scenes when Rhino serializes objects. </p>
|
||||
<h2>How Rhino serialization works</h2>
|
||||
By default, Java serialization of an object also serializes objects that
|
||||
are referred to by that object. Upon deserialization the initial object and
|
||||
the objects it refers to are all created and the references between the objects
|
||||
are resolved. <br>
|
||||
<br>
|
||||
However, for JavaScript this creates a problem. JavaScript objects contain
|
||||
references to prototypes and to parent scopes. Default serialization would
|
||||
serialize the object or function we desired but would also serialize Object.prototype
|
||||
or even possibly the entire top-level scope and everything it refers to!
|
||||
We want to be able to serialize a JavaScript object and then deserialize
|
||||
it into a new scope and have all of the references from the deserialized
|
||||
object to prototypes and parent scopes resolved correctly to refer to objects
|
||||
in the new scope. <br>
|
||||
<br>
|
||||
ScriptableOutputStream takes a scope as a parameter to its constructor. If
|
||||
in the process of serialization it encounters a reference to the scope it
|
||||
will serialize a marker that will be resolved to the new scope upon deserialization.
|
||||
It is also possible to add names of objects to a list in the ScriptableOutputStream
|
||||
object. These objects will also be saved as markers upon serialization and
|
||||
resolved in the new scope upon deserialization. Use the addExcludedName method
|
||||
of ScriptableOutputStream to add new names. By default, ScriptableOutputStream
|
||||
excludes all the names defined using Context.initStandardObjects.<br>
|
||||
<br>
|
||||
If you are using Rhino serialization in an environment where you always define,
|
||||
say, a constructor "Foo", you should add the following code before calling
|
||||
writeObject:<br>
|
||||
<pre>out.addExcludedName("Foo");<br>out.addExcludedName("Foo.prototype");<br></pre>
|
||||
This code will prevent Foo and Foo.prototype from being serialized and will
|
||||
cause references to Foo or Foo.prototype to be resolved to the objects in
|
||||
the new scope upon deserialization. Exceptions will be thrown if Foo or Foo.prototype
|
||||
cannot be found the scopes used in either ScriptableOutputStream or ScriptableInputStream.<br>
|
||||
<br>
|
||||
<h2>Rhino serialization in compilation mode</h2>
|
||||
Serialization works well with objects and with functions and scripts in
|
||||
interpretive mode. However, you can run into problems with serialization
|
||||
of compiled functions and scripts:<br>
|
||||
<pre>$ cat test.js<br>function f() { return 3; }<br>serialize(f, "f.ser");<br>g = deserialize("f.ser");<br>print(g());<br>$ java org.mozilla.javascript.tools.shell.Main -opt -1 test.js<br>3<br>$ java org.mozilla.javascript.tools.shell.Main test.js<br>js: uncaught JavaScript exception: java.lang.ClassNotFoundException: c1<br></pre>
|
||||
<p>The problem is that Java serialization has no built-in way to serialize
|
||||
Java classes themselves. (It might be possible to save the Java bytecodes
|
||||
in an array and then load the class upon deserialization, but at best that
|
||||
would eat up a lot of memory for just this feature.) One way around this
|
||||
is to compile the functions using the jsc tool: </p>
|
||||
<pre>$ cat f.js<br>function f() { return 3; }<br>$ java -classpath js.jar org.mozilla.javascript.tools.jsc.Main f.js<br>$ cat test2.js<br>loadClass("f");<br>serialize(f, "f.ser");<br>g = deserialize("f.ser");<br>print(g());<br>$ java -classpath 'js.jar;.' org.mozilla.javascript.tools.shell.Main test2.js<br>3<br></pre>
|
||||
<p> Now the function f is compiled to a Java class, but that class is
|
||||
then made available in the classpath so serialization works. This isn't that
|
||||
interesting an example since compiling a function to a class and then loading
|
||||
it accomplishes the same as serializing an interpreted function, but it becomes
|
||||
more relevant if you wish to serialize JavaScript objects that have references
|
||||
to compiled functions. </p>
|
||||
<h3>
|
||||
<hr width="100%"><br>
|
||||
<a href="index.html">back to top</a>
|
||||
</h3>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,234 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.7 [en]C-NSCP (WinNT; U) [Netscape]">
|
||||
<title>JavaScript Shell</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
JavaScript Shell</h1></center>
|
||||
The JavaScript shell provides a simple way to run scripts in batch mode
|
||||
or an interactive environment for exploratory programming.
|
||||
<h2>
|
||||
Invoking the Shell</h2>
|
||||
<tt>java org.mozilla.javascript.tools.shell.Main [<i>options</i>]
|
||||
<i>script-filename-or-url</i> [<i>script-arguments</i>]</tt>
|
||||
<p>where <tt><i>options</i></tt> are:
|
||||
<p><tt>-e <i>script-source</i></tt>
|
||||
<blockquote>Executes <i>script-source</i> as a JavaScript script.</blockquote>
|
||||
<tt>-f <i>script-filename-or-url</i></tt>
|
||||
<blockquote>Reads <i>script-filename-or-url</i> content and execute it as a JavaScript script.</blockquote>
|
||||
<tt>-opt <i>optLevel</i></tt>
|
||||
<br><tt>-O <i>optLevel</i></tt>
|
||||
<ul>Optimizes at level <i>optLevel</i>, which must be an integer between
|
||||
0 and 9. See <a href="opt.html">Optimization</a> for more details.</ul>
|
||||
<tt>-version <i>versionNumber</i></tt>
|
||||
<ul>Specifies the language version to compile with. The string <i>versionNumber</i>
|
||||
must be one of <tt>100</tt>, <tt>110</tt>, <tt>120</tt>, <tt>130</tt>,
|
||||
or <tt>140</tt>. See <a href="overview.html#versions">JavaScript Language
|
||||
Versions</a> for more information on language versions.</ul>
|
||||
|
||||
If the shell is invoked with the system property rhino.use_java_policy_security set to true and with a security manager installed, the shell restricts scripts permissions based on their URLs according to Java policy settings. This is available only if JVM implements Java2 security model.
|
||||
<h2>
|
||||
Predefined Properties</h2>
|
||||
Scripts executing in the shell have access to some additional properties
|
||||
of the top-level object.
|
||||
<br>
|
||||
<h4>
|
||||
arguments</h4>
|
||||
|
||||
<blockquote>The <tt>arguments</tt> object is an array containing the strings
|
||||
of all the arguments given at the command line when the shell was invoked.</blockquote>
|
||||
|
||||
<h4>
|
||||
help()</h4>
|
||||
|
||||
<blockquote>Executing the help function will print usage and help messages.</blockquote>
|
||||
|
||||
<h4>
|
||||
defineClass(<i>className</i>)</h4>
|
||||
|
||||
<blockquote>Define an extension using the Java class named with the string
|
||||
argument <i>className</i>. Uses ScriptableObject.defineClass() to define
|
||||
the extension.</blockquote>
|
||||
|
||||
<h4>
|
||||
deserialize(<i>filename</i>)</h4>
|
||||
|
||||
<blockquote>Restore from the specified file an object previously written by a call to <tt>serialize</tt>.</blockquote>
|
||||
|
||||
<h4>
|
||||
load([<i>filename</i>, ...])</h4>
|
||||
|
||||
<blockquote>Load JavaScript source files named by string arguments. If
|
||||
multiple arguments are given, each file is read in and executed in turn.</blockquote>
|
||||
|
||||
<h4>
|
||||
loadClass(<i>className</i>)</h4>
|
||||
|
||||
<blockquote>Load and execute the class named by the string argument <i>className</i>.
|
||||
The class must be a class that implements the Script interface, as will
|
||||
any script compiled by <a href="jsc.html">jsc</a>.</blockquote>
|
||||
|
||||
<h4>
|
||||
print([<i>expr</i> ...])</h4>
|
||||
|
||||
<blockquote>Evaluate and print expressions. Evaluates each expression,
|
||||
converts the result to a string, and prints it.</blockquote>
|
||||
|
||||
<h4>
|
||||
readFile(<i>path</i> [, <i>characterCoding</i>)</h4>
|
||||
|
||||
<blockquote>Read given file and convert its bytes to a string using the
|
||||
specified character coding or default character coding if explicit coding
|
||||
argument is not given.</blockquote>
|
||||
|
||||
<h4>
|
||||
readUrl(<i>url</i> [, <i>characterCoding</i>)</h4>
|
||||
|
||||
<blockquote>Open an input connection to the given string url, read all its
|
||||
bytes and convert them to a string using the specified character coding or
|
||||
default character coding if explicit coding argument is not given.</blockquote>
|
||||
|
||||
<h4>
|
||||
runCommand(<i>commandName</i>, [<i>arg</i>, ...] [<i>options</i>])</h4>
|
||||
|
||||
<blockquote>Execute the specified command with the given argument and options
|
||||
as a separate process and return the exit status of the process. For details, see JavaDoc for <a href="http://lxr.mozilla.org/mozilla/source/js/rhino/toolsrc/org/mozilla/javascript/tools/shell/Global.java">org.mozilla.javascript.tools.shell.Global#runCommand</a>.</blockquote>
|
||||
|
||||
<h4>
|
||||
serialize(<i>object</i>, <i>filename</i>)</h4>
|
||||
<blockquote>Serialize the given object to the specified file.</blockquote>
|
||||
|
||||
<h4>
|
||||
spawn(<i>functionOrScript</i>)</h4>
|
||||
|
||||
<blockquote>Run the given function or script in a different thread.</blockquote>
|
||||
|
||||
<h4>
|
||||
sync(<i>function</i>)</h4>
|
||||
|
||||
<blockquote>creates a synchronized function (in the sense of a Java synchronized method) from an existing function. The new function synchronizes on the <code>this</code> object of its invocation.</blockquote>
|
||||
|
||||
<h4>
|
||||
quit()</h4>
|
||||
|
||||
<blockquote>Quit shell. The shell will also quit in interactive mode if
|
||||
an end-of-file character is typed at the prompt.</blockquote>
|
||||
|
||||
<h4>
|
||||
version([<i>number</i>])</h4>
|
||||
|
||||
<blockquote>Get or set JavaScript version number. If no argument is supplied,
|
||||
the current version number is returned. If an argument is supplied, it
|
||||
is expected to be one of <tt>100</tt>, <tt>110</tt>, <tt>120</tt>, <tt>130,</tt>
|
||||
or <tt>140</tt> to indicate JavaScript version 1.0, 1.1, 1.2, 1.3, or 1.4
|
||||
respectively.</blockquote>
|
||||
|
||||
<h2>
|
||||
Example</h2>
|
||||
|
||||
<h4>Invocation</h4>
|
||||
Here the shell is invoked three times from the command line. (The system
|
||||
command prompt is shown as <tt>$</tt>.) The first invocation executes a
|
||||
script specified on the command line itself. The next invocation has no
|
||||
arguments, so the shell goes into interactive mode, reading and evaluating
|
||||
each line as it is typed in. Finally, the last invocation executes a script
|
||||
from a file and accesses arguments to the script itself.
|
||||
<pre>
|
||||
$ java org.mozilla.javascript.tools.shell.Main -e print('hi')
|
||||
hi
|
||||
$ java org.mozilla.javascript.tools.shell.Main
|
||||
js> print('hi')
|
||||
hi
|
||||
js> 6*7
|
||||
42
|
||||
js> function f() {
|
||||
return a;
|
||||
}
|
||||
js> var a = 34;
|
||||
js> f()
|
||||
34
|
||||
js> quit()
|
||||
$ cat echo.js
|
||||
for (i in arguments) {
|
||||
print(arguments[i])
|
||||
}
|
||||
$ java org.mozilla.javascript.tools.shell.Main echo.js foo bar
|
||||
foo
|
||||
bar
|
||||
$
|
||||
</pre>
|
||||
|
||||
<h4>spawn and sync</h4>
|
||||
The following example creates 2 threads via <tt>spawn</tt> and uses <tt>sync</tt> to create a synchronized version of the function <tt>test</tt>.
|
||||
|
||||
<pre>
|
||||
js> function test(x) {
|
||||
print("entry");
|
||||
java.lang.Thread.sleep(x*1000);
|
||||
print("exit");
|
||||
}
|
||||
js> var o = { f : sync(test) };
|
||||
js> spawn(function() {o.f(5);});
|
||||
Thread[Thread-0,5,main]
|
||||
entry
|
||||
js> spawn(function() {o.f(5);});
|
||||
Thread[Thread-1,5,main]
|
||||
js>
|
||||
exit
|
||||
entry
|
||||
exit
|
||||
</pre>
|
||||
|
||||
<h4>runCommand</h4>
|
||||
Here is few examples of invoking <tt>runCommand</tt> under Linux.
|
||||
<pre>
|
||||
js> runCommand('date')
|
||||
Thu Jan 23 16:49:36 CET 2003
|
||||
0
|
||||
// Using input option to provide process input
|
||||
js> runCommand("sort", {input: "c\na\nb"})
|
||||
a
|
||||
b
|
||||
c
|
||||
0
|
||||
js> // Demo of output and err options
|
||||
js> var opt={input: "c\na\nb", output: 'Sort Output:\n'}
|
||||
js> runCommand("sort", opt)
|
||||
0
|
||||
js> print(opt.output)
|
||||
Sort Output:
|
||||
a
|
||||
b
|
||||
c
|
||||
js> var opt={input: "c\na\nb", output: 'Sort Output:\n', err: ''}
|
||||
js> runCommand("sort", "--bad-arg", opt)
|
||||
2
|
||||
js> print(opt.err)
|
||||
/bin/sort: unrecognized option `--bad-arg'
|
||||
Try `/bin/sort --help' for more information.
|
||||
|
||||
js> runCommand("bad_command", "--bad-arg", opt)
|
||||
js: "<stdin>", line 18: uncaught JavaScript exception: java.io.IOException: bad_command: not found
|
||||
js> // Passing explicit environment to the system shell
|
||||
js> runCommand("sh", "-c", "echo $env1 $env2", { env: {env1: 100, env2: 200}})
|
||||
100 200
|
||||
0
|
||||
js> // Use args option to provide additional command arguments
|
||||
js> var arg_array = [1, 2, 3, 4];
|
||||
js> runCommand("echo", { args: arg_array})
|
||||
1 2 3 4
|
||||
0
|
||||
</pre>
|
||||
|
||||
|
||||
|
||||
<hr WIDTH="100%">
|
||||
<br><a href="index.html">back to top</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,31 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.7 [en]C-NSCP (WinNT; U) [Netscape]">
|
||||
<title>JavaScript Tools</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
JavaScript Tools</h1></center>
|
||||
|
||||
<h2>
|
||||
JavaScript shell</h2>
|
||||
The <a href="shell.html">JavaScript shell</a> allows for interactive and
|
||||
batch execution of JavaScript scripts.
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>
|
||||
JavaScript compiler</h2>
|
||||
The <a href="jsc.html">JavaScript compiler</a> translates JavaScript source
|
||||
into Java class files.
|
||||
<br>
|
||||
<p>
|
||||
<hr WIDTH="100%">
|
||||
<br><a href="index.html">back to top</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,357 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Generator" content="Microsoft Word 97">
|
||||
<meta name="GENERATOR" content="Mozilla/4.75 [en] (WinNT; U) [Netscape]">
|
||||
<title>Embedding Rhino</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<center><font size=+4>Tutorial: Embedding Rhino</font></center>
|
||||
|
||||
<p>Embedding Rhino can be done simply with good results. With more effort
|
||||
on the part of the embedder, the objects exposed to scripts can be customized
|
||||
further.
|
||||
<p>This tutorial leads you through the steps from a simple embedding to
|
||||
more customized, complex embeddings. Fully compilable examples are provided
|
||||
along the way.
|
||||
<p>The examples live in the <tt>rhino/examples</tt> directory in the distribution
|
||||
and in <tt>mozilla/js/rhino/examples</tt> in cvs. This document will link
|
||||
to them using <a href="http://lxr.mozilla.org/">lxr</a>.
|
||||
<p>In this document, JavaScript code will be in <font color="#006600">green</font>,
|
||||
Java code will be in <font color="#006600">green</font>, and shell logs
|
||||
will be in <font color="#663366">purple</font>.
|
||||
<h3>
|
||||
<font size=+3>Contents</font></h3>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<font size=+1><a href="#RunScript">RunScript: A simple embedding</a></font></li>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<font size=+1><a href="#EnteringContext">Entering a Context</a></font></li>
|
||||
|
||||
<li>
|
||||
<font size=+1><a href="#initializing">Initializing standard objects</a></font></li>
|
||||
|
||||
<li>
|
||||
<font size=+1><a href="#Collecting">Collecting the arguments</a></font></li>
|
||||
|
||||
<li>
|
||||
<font size=+1><a href="#Evaluating">Evaluating a script</a></font></li>
|
||||
|
||||
<li>
|
||||
<font size=+1><a href="#Print">Print the result</a></font></li>
|
||||
|
||||
<li>
|
||||
<font size=+1><a href="#Exit">Exit the Context</a></font></li>
|
||||
</ul>
|
||||
|
||||
<li>
|
||||
<font size=+1><a href="#Expose">Expose Java APIs</a></font></li>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<font size=+1><a href="#UseJava">Use Java APIs</a></font></li>
|
||||
|
||||
<li>
|
||||
<font size=+1><a href="#ImplementingInterfaces">Implementing interfaces</a></font></li>
|
||||
|
||||
<li>
|
||||
<font size=+1><a href="#AddJava">Add Java objects</a></font></li>
|
||||
</ul>
|
||||
|
||||
<li>
|
||||
<font size=+1><a href="#UsingJSObjs">Using JavaScript objects from Java</a></font></li>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<font size=+1><a href="#UsingJSvars">Using JavaScript variables</a></font></li>
|
||||
|
||||
<li>
|
||||
<font size=+1><a href="#CallingJSfuns">Calling JavaScript functions</a></font></li>
|
||||
</ul>
|
||||
|
||||
<li>
|
||||
<font size=+1><a href="#JavaScriptHostObjects">JavaScript host objects</a></font></li>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<font size=+1><a href="#DefiningHostObjects">Defining Host Objects</a></font></li>
|
||||
|
||||
<li>
|
||||
<font size=+1><a href="#Counter">Counter example</a></font></li>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<font size=+1><a href="#CounterCtors">Counter's constructors</a></font></li>
|
||||
|
||||
<li>
|
||||
<font size=+1><a href="#classname">Class name</a></font></li>
|
||||
|
||||
<li>
|
||||
<font size=+1><a href="#Dynamic">Dynamic properties</a></font></li>
|
||||
|
||||
<li>
|
||||
<font size=+1><a href="#DefiningMethods">Defining JavaScript "methods"</a></font></li>
|
||||
|
||||
<li>
|
||||
<font size=+1><a href="#AddingCounter">Adding Counter to RunScript</a></font></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</ul>
|
||||
|
||||
<hr WIDTH="100%">
|
||||
<br><a NAME="RunScript"></a><font size=+3>RunScript: A simple embedding</font>
|
||||
<p>About the simplest embedding of Rhino possible is the <a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/RunScript.java">RunScript
|
||||
example</a>. All it does it read a script from the command line, execute
|
||||
it, and print a result.
|
||||
<p>Here's an example use of RunScript from a shell command line:
|
||||
<blockquote>
|
||||
<pre><font color="#663366">$ java RunScript "Math.cos(Math.PI)"
|
||||
-1
|
||||
$ java RunScript 'function f(x){return x+1} f(7)'
|
||||
8</font></pre>
|
||||
</blockquote>
|
||||
Note that you'll have to have both the Rhino classes and the RunScript
|
||||
example class file in the classpath. Let's step through the body of <tt>main</tt>
|
||||
one line at time.
|
||||
<p><a NAME="EnteringContext"></a><font size=+2>Entering a Context</font>
|
||||
<p>The code
|
||||
<blockquote>
|
||||
<pre><font color="#006600">Context cx = Context.enter();</font></pre>
|
||||
</blockquote>
|
||||
Creates and enters a <tt>Context. </tt>A <tt>Context</tt> stores information
|
||||
about the execution environment of a script.
|
||||
<br>
|
||||
<p><a NAME="initializing"></a><font size=+2>Initializing standard objects</font>
|
||||
<p>The code
|
||||
<blockquote>
|
||||
<pre><font color="#006600">Scriptable scope = cx.initStandardObjects();</font></pre>
|
||||
</blockquote>
|
||||
Initializes the standard objects (<tt>Object</tt>,
|
||||
<tt>Function</tt>, etc.)
|
||||
This must be done before scripts can be executed. The <tt>null</tt> parameter
|
||||
tells <tt>initStandardObjects</tt> to create and return a scope object
|
||||
that we use in later calls.
|
||||
<p><a NAME="Collecting"></a><font size=+2>Collecting the arguments</font>
|
||||
<p>This code is standard Java and not specific to Rhino. It just collects
|
||||
all the arguments and concatenates them together.
|
||||
<blockquote>
|
||||
<pre style="color: #006600">
|
||||
String s = "";
|
||||
for (int i=0; i < args.length; i++) {
|
||||
s += args[i];
|
||||
}
|
||||
</pre>
|
||||
</blockquote>
|
||||
<p><br><a NAME="Evaluating"></a><font size=+2>Evaluating a script</font>
|
||||
<p>The code
|
||||
<blockquote>
|
||||
<pre><font color="#006600">Object result = cx.evaluateString(scope, s, "<cmd>", 1, null);</font></pre>
|
||||
</blockquote>
|
||||
uses the Context <tt>cx</tt> to evaluate a string. Evaluation of the script
|
||||
looks up variables in <tt>scope</tt>, and errors will be reported with
|
||||
the filename <tt><cmd></tt> and line number 1.
|
||||
<br>
|
||||
<p><a NAME="Print"></a><font size=+2>Print the result</font>
|
||||
<p>The code
|
||||
<blockquote>
|
||||
<pre><font color="#006600">System.out.println(cx.toString(result));</font></pre>
|
||||
</blockquote>
|
||||
prints the result of evaluating the script (contained in the variable <tt>result</tt>).
|
||||
<tt>result</tt>
|
||||
could be a string, JavaScript object, or other values..The
|
||||
<tt>toString</tt>
|
||||
method converts any JavaScript value to a string.
|
||||
<br>
|
||||
<p><a NAME="Exit"></a><font size=+2>Exit the Context</font>
|
||||
<p>The code
|
||||
<blockquote>
|
||||
<pre style="color: #006600">
|
||||
} finally {
|
||||
Context.exit();
|
||||
}
|
||||
</pre>
|
||||
</blockquote>
|
||||
exits the Context. This removes the association between the Context and
|
||||
the current thread and is an essential cleanup action. There should be
|
||||
a call to <tt>exit</tt> for every call to <tt>enter</tt>. To make sure that it is called even if an exception is thrown, it is put into the finally block corresponding to the try block starting after <tt>Context.enter()</tt>.
|
||||
<br>
|
||||
<dir> </dir>
|
||||
<a NAME="Expose"></a><font size=+3>Expose Java APIs</font>
|
||||
<p><a NAME="UseJava"></a><font size=+2>Use Java APIs</font>
|
||||
<p>No additional code in the embedding needed! The JavaScript feature called
|
||||
<i>LiveConnect</i>
|
||||
allows JavaScript programs to interact with Java objects:
|
||||
<dir><tt><font color="#663366">$ java RunScript 'java.lang.System.out.println(3)'</font></tt>
|
||||
<br><tt><font color="#663366">3.0</font></tt>
|
||||
<br><tt><font color="#663366">undefined</font></tt></dir>
|
||||
<a NAME="ImplementingInterfaces"></a><font size=+2>Implementing interfaces</font>
|
||||
<p>Using Rhino, JavaScript objects can implement arbitrary Java interfaces.
|
||||
There's no Java code to write--it's part of Rhino's LiveConnect implementation.
|
||||
For example, we can see how to implement java.lang.Runnable in a Rhino
|
||||
shell session:
|
||||
<blockquote>
|
||||
<pre><font color="#663366">js> obj = { run: function() { print('hi'); } }
|
||||
[object Object]
|
||||
js> obj.run()
|
||||
hi
|
||||
js> r = new java.lang.Runnable(obj);
|
||||
[object Object]
|
||||
js> t = new java.lang.Thread(r)
|
||||
Thread[Thread-0,5,main]
|
||||
js> t.start()
|
||||
hi</font></pre>
|
||||
</blockquote>
|
||||
<a NAME="AddJava"></a><font size=+2>Add Java objects</font>
|
||||
<p>The next example is <a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/RunScript2.java">RunScript2</a>.
|
||||
This is the same as RunScript, but with the addition of two extra lines
|
||||
of code:
|
||||
<dir><tt><font color="#006600">Scriptable jsArgs = Context.toObject(System.out,
|
||||
scope);</font></tt>
|
||||
<br><tt><font color="#006600">scope.put("out", scope, jsArgs);</font></tt></dir>
|
||||
These lines add a global variable <tt>out</tt> that is a JavaScript reflection
|
||||
of the <tt>System.out</tt> variable:
|
||||
<dir><tt><font color="#663366">$ java RunScript2 'out.println(42)'</font></tt>
|
||||
<br><tt><font color="#663366">42.0</font></tt>
|
||||
<br><tt><font color="#663366">undefined</font></tt></dir>
|
||||
|
||||
<p><br><a NAME="UsingJSObjs"></a><font size=+3>Using JavaScript objects
|
||||
from Java</font>
|
||||
<p>After evaluating a script it's possible to query the scope for variables
|
||||
and functions, extracting values and calling JavaScript functions. This
|
||||
is illustrated in the <a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/RunScript3.java">RunScript3</a>
|
||||
example. This example adds the ability to print the value of variable <tt>x</tt>
|
||||
and the result of calling function <tt>f</tt>. Both <tt>x</tt> and <tt>f</tt>
|
||||
are expected to be defined by the evaluated script. For example,
|
||||
<blockquote>
|
||||
<pre style="color: #663366">
|
||||
$ java RunScript3 'x = 7'
|
||||
x = 7
|
||||
f is undefined or not a function.
|
||||
$ java RunScript3 'function f(a) { return a; }'
|
||||
x is not defined.
|
||||
f('my args') = my arg
|
||||
</pre>
|
||||
</blockquote>
|
||||
<a NAME="UsingJSvars"></a><font size=+2>Using JavaScript variables</font>
|
||||
<p>To print out the value of <tt>x</tt>, we add the following code.
|
||||
<blockquote>
|
||||
<pre style="color: #006600">
|
||||
Object x = scope.get("x", scope);
|
||||
if (x == Scriptable.NOT_FOUND) {
|
||||
System.out.println("x is not defined.");
|
||||
} else {
|
||||
System.out.println("x = " + Context.toString(x));
|
||||
}
|
||||
</pre>
|
||||
</blockquote>
|
||||
<a NAME="CallingJSfuns"></a><font size=+2>Calling JavaScript functions</font>
|
||||
<p>To get the function <tt>f</tt>, call it, and print the result, we add
|
||||
this code:
|
||||
<blockquote>
|
||||
<pre style="color: #006600">
|
||||
Object fObj = scope.get("f", scope);
|
||||
if (!(fObj instanceof Function)) {
|
||||
System.out.println("f is undefined or not a function.");
|
||||
} else {
|
||||
Object functionArgs[] = { "my arg" };
|
||||
Function f = (Function)fObj;
|
||||
Object result = f.call(cx, scope, scope, functionArgs);
|
||||
String report = "f('my args') = " + Context.toString(result);
|
||||
System.out.println(report);
|
||||
}
|
||||
</pre>
|
||||
</blockquote>
|
||||
<p><br><a NAME="JavaScriptHostObjects"></a><font size=+3>JavaScript host
|
||||
objects</font>
|
||||
<p><a NAME="DefiningHostObjects"></a><font size=+2>Defining Host Objects</font>
|
||||
<p>Custom host objects can implement special JavaScript features like dynamic
|
||||
properties.
|
||||
<p><a NAME="Counter"></a><font size=+2>Counter example</font>
|
||||
<p>The <a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/Counter.java">Counter
|
||||
example</a> is a simple host object. We'll go through it method by method
|
||||
below.
|
||||
<p>It's easy to try out new host object classes in the shell using its
|
||||
built-in <tt>defineClass</tt> function. We'll see how to add it to RunScript
|
||||
later. (Note that because the <tt>java -jar</tt> option preempts the rest
|
||||
of the classpath, we can't use that and access the <tt>Counter</tt> class.)
|
||||
<blockquote>
|
||||
<pre style="color: #663366">
|
||||
$ java -cp 'js.jar;examples' org.mozilla.javascript.tools.shell.Main
|
||||
js> defineClass("Counter")
|
||||
js> c = new Counter(7)
|
||||
[object Counter]
|
||||
js> c.count
|
||||
7
|
||||
js> c.count
|
||||
8
|
||||
js> c.count
|
||||
9
|
||||
js> c.resetCount()
|
||||
js> c.count
|
||||
0
|
||||
</pre>
|
||||
</blockquote>
|
||||
<a NAME="CounterCtors"></a><font size=+2>Counter's constructors</font>
|
||||
<p>The zero-argument constructor is used by Rhino runtime to create instances.
|
||||
For the counter example, no initialization work is needed, so the implementation
|
||||
is empty.
|
||||
<dir><tt><font color="#006600">public Counter () { }</font></tt></dir>
|
||||
The method <tt>jsConstructor</tt> defines the JavaScript constructor that
|
||||
was called with the expression <tt>new Counter(7)</tt> in the JavaScript
|
||||
code above.
|
||||
<dir><tt><font color="#006600">public void jsConstructor(int a) { count
|
||||
= a; }</font></tt></dir>
|
||||
<a NAME="classname"></a><font size=+2>Class name</font>
|
||||
<p>The class name is defined by the <tt>getClassName</tt> method. This
|
||||
is used to determine the name of the constructor.
|
||||
<dir><tt><font color="#006600">public String getClassName() { return "Counter";
|
||||
}</font></tt></dir>
|
||||
<a NAME="Dynamic"></a><font size=+2>Dynamic properties</font>
|
||||
<p>Dynamic properties are defined by methods beginning with <tt>jsGet_</tt>
|
||||
or <tt>jsSet_</tt>. The method <tt>jsGet_count</tt> defines the <i>count</i>
|
||||
property.
|
||||
<dir><tt><font color="#006600">public int jsGet_count() { return count++;
|
||||
}</font></tt></dir>
|
||||
The expression <tt>c.count</tt> in the JavaScript code above results in
|
||||
a call to this method.
|
||||
<p><a NAME="DefiningMethods"></a><font size=+2>Defining JavaScript "methods"</font>
|
||||
<p>Methods can be defined using the <tt>jsFunction_ prefix</tt>. Here we
|
||||
define <tt>resetCount</tt> for JavaScript.
|
||||
<dir><tt><font color="#006600">public void jsFunction_resetCount() { count
|
||||
= 0; }</font></tt></dir>
|
||||
The call <tt>c.resetCount()</tt> above calls this method.
|
||||
<p><a NAME="AddingCounter"></a><font size=+2>Adding Counter to RunScript</font>
|
||||
<p>Now take a look at the <a href="http://lxr.mozilla.org/mozilla/source/js/rhino/examples/RunScript4.java">RunScript4
|
||||
example</a>. It's the same as RunScript except for two additions. The method
|
||||
<tt>ScriptableObject.defineClass</tt>
|
||||
uses a Java class to define the Counter "class" in the top-level scope:
|
||||
<dir><tt><font color="#006600">ScriptableObject.defineClass(scope, Counter.class);</font></tt></dir>
|
||||
Now we can reference the <tt>Counter</tt> object from our script:
|
||||
<dir><tt><font color="#663366">$ java RunScript4 'c = new Counter(3); c.count;
|
||||
c.count;'</font></tt>
|
||||
<br><tt><font color="#663366">4</font></tt></dir>
|
||||
It also creates a new instance of the <tt>Counter</tt> object from within
|
||||
our Java code, constructing it with the value 7, and assigning it to the
|
||||
top-level variable <tt>myCounter</tt>:
|
||||
<blockquote>
|
||||
<pre style="color: #006600">
|
||||
Object[] arg = { new Integer(7) };
|
||||
Scriptable myCounter = cx.newObject(scope, "Counter", arg);
|
||||
scope.put("myCounter", scope, myCounter);
|
||||
</pre>
|
||||
</blockquote>
|
||||
Now we can reference the <tt>myCounter</tt> object from our script:
|
||||
<blockquote>
|
||||
<pre style="color: #663366">
|
||||
$ java RunScript3 'RunScript4 'myCounter.count; myCounter.count'
|
||||
8
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,77 +0,0 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="Norris Boyd">
|
||||
<meta name="GENERATOR" content="Mozilla/4.72 [en]C-NSCP (WinNT; U) [Netscape]">
|
||||
<meta name="KeyWords" content="Rhino, JavaScript, Java">
|
||||
<title>Using Rhino</title>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
<script src="owner.js"></script>
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
How are people using Rhino?</h1></center>
|
||||
Here's a partial list of the ways people are using Rhino in their projects.
|
||||
The initial list was collected by Netscape marketing, so Rhino is referred
|
||||
to as Netscape Java-based JavaScript. We'd love to hear how you're using
|
||||
Rhino--just mail <script>document.write(owner());</script>
|
||||
.
|
||||
<p><a href="http://www.attachmate.com">Attachmate</a>
|
||||
<br>"Netscape JavaScript 1.5 with Java implementation was a perfect solution
|
||||
for developing our MacroRecorder because it made our development process
|
||||
faster and better, and our customers get a more efficient, reliable, and
|
||||
standards based product as a result," said Rob Clark, Director of Product
|
||||
Development at Attachmate. Attachmate integrates Netscape's Java-based
|
||||
JavaScript 1.5 Interpreter into its 100% Pure Java certified web-to-host
|
||||
thin clients, called e-Vantage Viewers. The Netscape Java-based JavaScript
|
||||
interpreter is used in a MacroRecorder feature that allows browser-based
|
||||
users to efficiently navigate host applications on mainframe and midrange
|
||||
systems.
|
||||
<p><a href="http://www.bristowhill.com/">Bristow Hill Software</a>
|
||||
<br>"We thought it would require lots of work to add scripting capability
|
||||
to Bristow Hill Server Pages, but we were delighted to find that Netscape
|
||||
JavaScript 1.5 with Java implementation fit right in with only a couple
|
||||
of lines of initialization code and one line of code to export our standard
|
||||
objects by name. Also, we were pleased to find we could take embedded scripting
|
||||
and compile it down to Java classes which could be used directly for greater
|
||||
speed in production. Netscape's JavaScript engine is rock solid and standards
|
||||
compliant, and my only regret is that we didn't start using it sooner,"
|
||||
said Don Anderson, President of Bristow Hill Software.
|
||||
<p><a href="http://www.icesoft.com/">ICEsoft Technologies</a>
|
||||
<br>ICEsoft Technologies adds JavaScript support to their <a href="http://www.icesoft.com/ps_browser_overview.html">ICEbrowser</a> using Rhino.
|
||||
<p><a href="http://homepage.mac.com/pcbeard/JShell/">JShell</a>
|
||||
<br>Rhino is used as the scripting language for the open source command
|
||||
shell JShell written by Patrick Beard.
|
||||
<p><a href="http://www.softcom.com">Softcom</a>
|
||||
<br>The tight integration of Netscape's Java-based JavaScript 1.5 with
|
||||
Softcom's Java-based RealPlayer plugin, RJ, enables Softcom to quickly
|
||||
produce dynamic interactive video applications for our media/entertainment,
|
||||
retail and professional education clients, helping us to synchronize the
|
||||
full interactivity of the Web and e-commerce with streaming video, said
|
||||
Chris O'Brien, president and COO of Softcom. For the enhanced Oscarcast
|
||||
recently produced for E! Online during the Academy Awards, Softcom used
|
||||
RJ to embed Netscape's JavaScript 1.5 in the RealPlayer, successfully integrating
|
||||
interactive chat and Java games, along with streaming video, within the
|
||||
RealPlayer.
|
||||
<p><a href="http://www.tdiinc.com/">Technology Deployment International</a>
|
||||
<br>"Technology Deployment International selected the Java-based Netscape
|
||||
JavaScript engine to incorporate into the workflow module of our eBusiness
|
||||
Management System (eBMS) allowing our customers to integrate business logic
|
||||
into any workstep of their application," said Dr. Kelvin Liu, VP eBMS Development,
|
||||
Technology Deployment International. "It has been easy to embed, the support
|
||||
we received from the engineering team has been outstanding, and the performance
|
||||
of the JavaScript code is almost identical to the equivalent Java."
|
||||
<p><a href="http://www.xypoint.com/">XYPOINT</a>
|
||||
<br>XYPOINT uses Rhino for automating test cases of their Java classes
|
||||
used in their service <a href="http://www.webwirelessnow.com/">WebWirelessNow</a>.
|
||||
Abraham Backus says that he's happy with Rhino because "I've always wanted
|
||||
this kind of JavaScript support."
|
||||
<h3>
|
||||
|
||||
<hr WIDTH="100%"><br>
|
||||
<a href="index.html">back to top</a></h3>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,105 +0,0 @@
|
||||
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Rhino code, released
|
||||
* May 6, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1997-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
import org.mozilla.javascript.*;
|
||||
|
||||
/**
|
||||
* Example of controlling the JavaScript execution engine.
|
||||
*
|
||||
* We evaluate a script and then manipulate the result.
|
||||
*
|
||||
*/
|
||||
public class Control {
|
||||
|
||||
/**
|
||||
* Main entry point.
|
||||
*
|
||||
* Process arguments as would a normal Java program. Also
|
||||
* create a new Context and associate it with the current thread.
|
||||
* Then set up the execution environment and begin to
|
||||
* execute scripts.
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
Context cx = Context.enter();
|
||||
|
||||
// Set version to JavaScript1.2 so that we get object-literal style
|
||||
// printing instead of "[object Object]"
|
||||
cx.setLanguageVersion(Context.VERSION_1_2);
|
||||
|
||||
// Initialize the standard objects (Object, Function, etc.)
|
||||
// This must be done before scripts can be executed.
|
||||
Scriptable scope = cx.initStandardObjects();
|
||||
|
||||
// Now we can evaluate a script. Let's create a new object
|
||||
// using the object literal notation.
|
||||
Object result = null;
|
||||
try {
|
||||
result = cx.evaluateString(scope, "obj = {a:1, b:['x','y']}",
|
||||
"MySource", 1, null);
|
||||
}
|
||||
catch (JavaScriptException jse) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
Scriptable obj = (Scriptable) scope.get("obj", scope);
|
||||
|
||||
// Should print "obj == result" (Since the result of an assignment
|
||||
// expression is the value that was assigned)
|
||||
System.out.println("obj " + (obj == result ? "==" : "!=") +
|
||||
" result");
|
||||
|
||||
// Should print "obj.a == 1"
|
||||
System.out.println("obj.a == " + obj.get("a", obj));
|
||||
|
||||
Scriptable b = (Scriptable) obj.get("b", obj);
|
||||
|
||||
// Should print "obj.b[0] == x"
|
||||
System.out.println("obj.b[0] == " + b.get(0, b));
|
||||
|
||||
// Should print "obj.b[1] == y"
|
||||
System.out.println("obj.b[1] == " + b.get(1, b));
|
||||
|
||||
try {
|
||||
// Should print {a:1, b:["x", "y"]}
|
||||
Function fn = (Function) ScriptableObject.getProperty(obj, "toString");
|
||||
System.out.println(fn.call(cx, scope, obj, new Object[0]));
|
||||
} catch (JavaScriptException e) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
cx.exit();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Rhino code, released
|
||||
* May 6, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Norris Boyd
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
import org.mozilla.javascript.*;
|
||||
|
||||
public class Counter extends ScriptableObject {
|
||||
// The zero-argument constructor used by Rhino runtime to create instances
|
||||
public Counter() { }
|
||||
|
||||
// Method jsConstructor defines the JavaScript constructor
|
||||
public void jsConstructor(int a) { count = a; }
|
||||
|
||||
// The class name is defined by the getClassName method
|
||||
public String getClassName() { return "Counter"; }
|
||||
|
||||
// The method jsGet_count defines the count property.
|
||||
public int jsGet_count() { return count++; }
|
||||
|
||||
// Methods can be defined using the jsFunction_ prefix. Here we define
|
||||
// resetCount for JavaScript.
|
||||
public void jsFunction_resetCount() { count = 0; }
|
||||
|
||||
private int count;
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Rhino code, released
|
||||
* May 6, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Norris Boyd
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
import org.mozilla.javascript.*;
|
||||
|
||||
/**
|
||||
* An example illustrating how to create a JavaScript object and retrieve
|
||||
* properties and call methods.
|
||||
* <p>
|
||||
* Output should be:
|
||||
* <pre>
|
||||
* count = 0
|
||||
* count = 1
|
||||
* resetCount
|
||||
* count = 0
|
||||
* </pre>
|
||||
*/
|
||||
public class CounterTest {
|
||||
|
||||
public static void main(String[] args) throws Exception
|
||||
{
|
||||
Context cx = Context.enter();
|
||||
try {
|
||||
Scriptable scope = cx.initStandardObjects();
|
||||
ScriptableObject.defineClass(scope, Counter.class);
|
||||
|
||||
Scriptable testCounter = cx.newObject(scope, "Counter");
|
||||
|
||||
Object count = ScriptableObject.getProperty(testCounter, "count");
|
||||
System.out.println("count = " + count);
|
||||
|
||||
count = ScriptableObject.getProperty(testCounter, "count");
|
||||
System.out.println("count = " + count);
|
||||
|
||||
ScriptableObject.callMethod(testCounter,
|
||||
"resetCount",
|
||||
new Object[0]);
|
||||
System.out.println("resetCount");
|
||||
|
||||
count = ScriptableObject.getProperty(testCounter, "count");
|
||||
System.out.println("count = " + count);
|
||||
} finally {
|
||||
Context.exit();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,172 +0,0 @@
|
||||
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Rhino code, released
|
||||
* May 6, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Norris Boyd
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
import org.mozilla.javascript.*;
|
||||
|
||||
/**
|
||||
* Example of controlling the JavaScript with multiple scopes and threads.
|
||||
*/
|
||||
public class DynamicScopes {
|
||||
|
||||
/**
|
||||
* Main entry point.
|
||||
*
|
||||
* Set up the shared scope and then spawn new threads that execute
|
||||
* relative to that shared scope. Try compiling functions with and
|
||||
* without dynamic scope to see the effect.
|
||||
*
|
||||
* The expected output is
|
||||
* <pre>
|
||||
* sharedScope
|
||||
* sharedScope
|
||||
* sharedScope
|
||||
* thread0
|
||||
* thread1
|
||||
* thread2
|
||||
* </pre>
|
||||
* The final three lines may be permuted in any order depending on
|
||||
* thread scheduling.
|
||||
*/
|
||||
public static void main(String[] args)
|
||||
throws JavaScriptException
|
||||
{
|
||||
Context cx = Context.enter();
|
||||
try {
|
||||
cx.setCompileFunctionsWithDynamicScope(false);
|
||||
runScripts(cx);
|
||||
cx.setCompileFunctionsWithDynamicScope(true);
|
||||
runScripts(cx);
|
||||
} finally {
|
||||
cx.exit();
|
||||
}
|
||||
}
|
||||
|
||||
static void runScripts(Context cx)
|
||||
throws JavaScriptException
|
||||
{
|
||||
// Initialize the standard objects (Object, Function, etc.)
|
||||
// This must be done before scripts can be executed. The call
|
||||
// returns a new scope that we will share.
|
||||
ScriptableObject scope = cx.initStandardObjects(null, true);
|
||||
|
||||
// Now we can evaluate a script and functions will be compiled to
|
||||
// use dynamic scope if the Context is so initialized.
|
||||
String source = "var x = 'sharedScope';" +
|
||||
"function f() { return x; }";
|
||||
cx.evaluateString(scope, source, "MySource", 1, null);
|
||||
|
||||
// Now we spawn some threads that execute a script that calls the
|
||||
// function 'f'. The scope chain looks like this:
|
||||
// <pre>
|
||||
// ------------------
|
||||
// | shared scope |
|
||||
// ------------------
|
||||
// ^
|
||||
// |
|
||||
// ------------------
|
||||
// | per-thread scope |
|
||||
// ------------------
|
||||
// ^
|
||||
// |
|
||||
// ------------------
|
||||
// | f's activation |
|
||||
// ------------------
|
||||
// </pre>
|
||||
// Both the shared scope and the per-thread scope have variables 'x'
|
||||
// defined in them. If 'f' is compiled with dynamic scope enabled,
|
||||
// the 'x' from the per-thread scope will be used. Otherwise, the 'x'
|
||||
// from the shared scope will be used. The 'x' defined in 'g' (which
|
||||
// calls 'f') should not be seen by 'f'.
|
||||
final int threadCount = 3;
|
||||
Thread[] t = new Thread[threadCount];
|
||||
for (int i=0; i < threadCount; i++) {
|
||||
String script = "function g() { var x = 'local'; return f(); }" +
|
||||
"java.lang.System.out.println(g());";
|
||||
t[i] = new Thread(new PerThread(scope, script,
|
||||
"thread" + i));
|
||||
}
|
||||
for (int i=0; i < threadCount; i++)
|
||||
t[i].start();
|
||||
// Don't return in this thread until all the spawned threads have
|
||||
// completed.
|
||||
for (int i=0; i < threadCount; i++) {
|
||||
try {
|
||||
t[i].join();
|
||||
} catch (InterruptedException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static class PerThread implements Runnable {
|
||||
|
||||
PerThread(Scriptable scope, String script, String x) {
|
||||
this.scope = scope;
|
||||
this.script = script;
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
// We need a new Context for this thread.
|
||||
Context cx = Context.enter();
|
||||
try {
|
||||
// We can share the scope.
|
||||
Scriptable threadScope = cx.newObject(scope);
|
||||
threadScope.setPrototype(scope);
|
||||
|
||||
// We want "threadScope" to be a new top-level
|
||||
// scope, so set its parent scope to null. This
|
||||
// means that any variables created by assignments
|
||||
// will be properties of "threadScope".
|
||||
threadScope.setParentScope(null);
|
||||
|
||||
// Create a JavaScript property of the thread scope named
|
||||
// 'x' and save a value for it.
|
||||
threadScope.put("x", threadScope, x);
|
||||
cx.evaluateString(threadScope, script, "threadScript", 1, null);
|
||||
}
|
||||
catch (JavaScriptException jse) {
|
||||
// ignore
|
||||
}
|
||||
finally {
|
||||
Context.exit();
|
||||
}
|
||||
}
|
||||
private Scriptable scope;
|
||||
private String script;
|
||||
private String x;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,347 +0,0 @@
|
||||
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Rhino code, released
|
||||
* May 6, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Norris Boyd
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
import org.mozilla.javascript.*;
|
||||
import java.io.*;
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* Define a simple JavaScript File object.
|
||||
*
|
||||
* This isn't intended to be any sort of definitive attempt at a
|
||||
* standard File object for JavaScript, but instead is an example
|
||||
* of a more involved definition of a host object.
|
||||
*
|
||||
* Example of use of the File object:
|
||||
* <pre>
|
||||
* js> defineClass("File")
|
||||
* js> file = new File("myfile.txt");
|
||||
* [object File]
|
||||
* js> file.writeLine("one"); <i>only now is file actually opened</i>
|
||||
* js> file.writeLine("two");
|
||||
* js> file.writeLine("thr", "ee");
|
||||
* js> file.close(); <i>must close file before we can reopen for reading</i>
|
||||
* js> var a = file.readLines(); <i>creates and fills an array with the contents of the file</i>
|
||||
* js> a;
|
||||
* one,two,three
|
||||
* js>
|
||||
* </pre>
|
||||
*
|
||||
*
|
||||
* File errors or end-of-file signaled by thrown Java exceptions will
|
||||
* be wrapped as JavaScript exceptions when called from JavaScript,
|
||||
* and may be caught within JavaScript.
|
||||
*
|
||||
* @author Norris Boyd
|
||||
*/
|
||||
public class File extends ScriptableObject {
|
||||
|
||||
/**
|
||||
* The zero-parameter constructor.
|
||||
*
|
||||
* When Context.defineClass is called with this class, it will
|
||||
* construct File.prototype using this constructor.
|
||||
*/
|
||||
public File() {
|
||||
}
|
||||
|
||||
/**
|
||||
* The Java method defining the JavaScript File constructor.
|
||||
*
|
||||
* If the constructor has one or more arguments, and the
|
||||
* first argument is not undefined, the argument is converted
|
||||
* to a string as used as the filename.<p>
|
||||
*
|
||||
* Otherwise System.in or System.out is assumed as appropriate
|
||||
* to the use.
|
||||
*/
|
||||
public static Scriptable jsConstructor(Context cx, Object[] args,
|
||||
Function ctorObj,
|
||||
boolean inNewExpr)
|
||||
{
|
||||
File result = new File();
|
||||
if (args.length == 0 || args[0] == Context.getUndefinedValue()) {
|
||||
result.name = "";
|
||||
result.file = null;
|
||||
} else {
|
||||
result.name = Context.toString(args[0]);
|
||||
result.file = new java.io.File(result.name);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of this JavaScript class, "File".
|
||||
*/
|
||||
public String getClassName() {
|
||||
return "File";
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the name of the file.
|
||||
*
|
||||
* Used to define the "name" property.
|
||||
*/
|
||||
public String jsGet_name() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the remaining lines in the file and return them in an array.
|
||||
*
|
||||
* Implements a JavaScript function.<p>
|
||||
*
|
||||
* This is a good example of creating a new array and setting
|
||||
* elements in that array.
|
||||
*
|
||||
* @exception IOException if an error occurred while accessing the file
|
||||
* associated with this object
|
||||
* @exception JavaScriptException if a JavaScript exception occurred
|
||||
* while creating the result array
|
||||
*/
|
||||
public Object jsFunction_readLines()
|
||||
throws IOException, JavaScriptException
|
||||
{
|
||||
Vector v = new Vector();
|
||||
String s;
|
||||
while ((s = jsFunction_readLine()) != null) {
|
||||
v.addElement(s);
|
||||
}
|
||||
Object[] lines = new Object[v.size()];
|
||||
v.copyInto(lines);
|
||||
|
||||
Scriptable scope = ScriptableObject.getTopLevelScope(this);
|
||||
Context cx = Context.getCurrentContext();
|
||||
return cx.newObject(scope, "Array", lines);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read a line.
|
||||
*
|
||||
* Implements a JavaScript function.
|
||||
* @exception IOException if an error occurred while accessing the file
|
||||
* associated with this object, or EOFException if the object
|
||||
* reached the end of the file
|
||||
*/
|
||||
public String jsFunction_readLine() throws IOException {
|
||||
return getReader().readLine();
|
||||
}
|
||||
|
||||
/**
|
||||
* Read a character.
|
||||
*
|
||||
* @exception IOException if an error occurred while accessing the file
|
||||
* associated with this object, or EOFException if the object
|
||||
* reached the end of the file
|
||||
*/
|
||||
public String jsFunction_readChar() throws IOException {
|
||||
int i = getReader().read();
|
||||
if (i == -1)
|
||||
return null;
|
||||
char[] charArray = { (char) i };
|
||||
return new String(charArray);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write strings.
|
||||
*
|
||||
* Implements a JavaScript function. <p>
|
||||
*
|
||||
* This function takes a variable number of arguments, converts
|
||||
* each argument to a string, and writes that string to the file.
|
||||
* @exception IOException if an error occurred while accessing the file
|
||||
* associated with this object
|
||||
*/
|
||||
public static void jsFunction_write(Context cx, Scriptable thisObj,
|
||||
Object[] args, Function funObj)
|
||||
throws IOException
|
||||
{
|
||||
write0(thisObj, args, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write strings and a newline.
|
||||
*
|
||||
* Implements a JavaScript function.
|
||||
* @exception IOException if an error occurred while accessing the file
|
||||
* associated with this object
|
||||
*
|
||||
*/
|
||||
public static void jsFunction_writeLine(Context cx, Scriptable thisObj,
|
||||
Object[] args, Function funObj)
|
||||
throws IOException
|
||||
{
|
||||
write0(thisObj, args, true);
|
||||
}
|
||||
|
||||
public int jsGet_lineNumber()
|
||||
throws FileNotFoundException
|
||||
{
|
||||
return getReader().getLineNumber();
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the file. It may be reopened.
|
||||
*
|
||||
* Implements a JavaScript function.
|
||||
* @exception IOException if an error occurred while accessing the file
|
||||
* associated with this object
|
||||
*/
|
||||
public void jsFunction_close() throws IOException {
|
||||
if (reader != null) {
|
||||
reader.close();
|
||||
reader = null;
|
||||
} else if (writer != null) {
|
||||
writer.close();
|
||||
writer = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finalizer.
|
||||
*
|
||||
* Close the file when this object is collected.
|
||||
*/
|
||||
public void finalize() {
|
||||
try {
|
||||
jsFunction_close();
|
||||
}
|
||||
catch (IOException e) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Java reader.
|
||||
*/
|
||||
public Object jsFunction_getReader() {
|
||||
if (reader == null)
|
||||
return null;
|
||||
// Here we use toObject() to "wrap" the BufferedReader object
|
||||
// in a Scriptable object so that it can be manipulated by
|
||||
// JavaScript.
|
||||
Scriptable parent = ScriptableObject.getTopLevelScope(this);
|
||||
return Context.toObject(reader, parent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Java writer.
|
||||
*
|
||||
* @see File#jsFunction_getReader
|
||||
*
|
||||
*/
|
||||
public Object jsFunction_getWriter() {
|
||||
if (writer == null)
|
||||
return null;
|
||||
Scriptable parent = ScriptableObject.getTopLevelScope(this);
|
||||
return Context.toObject(writer, parent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the reader, checking that we're not already writing this file.
|
||||
*/
|
||||
private LineNumberReader getReader() throws FileNotFoundException {
|
||||
if (writer != null) {
|
||||
throw Context.reportRuntimeError("already writing file \""
|
||||
+ name
|
||||
+ "\"");
|
||||
}
|
||||
if (reader == null)
|
||||
reader = new LineNumberReader(file == null
|
||||
? new InputStreamReader(System.in)
|
||||
: new FileReader(file));
|
||||
return reader;
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform the guts of write and writeLine.
|
||||
*
|
||||
* Since the two functions differ only in whether they write a
|
||||
* newline character, move the code into a common subroutine.
|
||||
*
|
||||
*/
|
||||
private static void write0(Scriptable thisObj, Object[] args, boolean eol)
|
||||
throws IOException
|
||||
{
|
||||
File thisFile = checkInstance(thisObj);
|
||||
if (thisFile.reader != null) {
|
||||
throw Context.reportRuntimeError("already writing file \""
|
||||
+ thisFile.name
|
||||
+ "\"");
|
||||
}
|
||||
if (thisFile.writer == null)
|
||||
thisFile.writer = new BufferedWriter(
|
||||
thisFile.file == null ? new OutputStreamWriter(System.out)
|
||||
: new FileWriter(thisFile.file));
|
||||
for (int i=0; i < args.length; i++) {
|
||||
String s = Context.toString(args[i]);
|
||||
thisFile.writer.write(s, 0, s.length());
|
||||
}
|
||||
if (eol)
|
||||
thisFile.writer.newLine();
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform the instanceof check and return the downcasted File object.
|
||||
*
|
||||
* This is necessary since methods may reside in the File.prototype
|
||||
* object and scripts can dynamically alter prototype chains. For example:
|
||||
* <pre>
|
||||
* js> defineClass("File");
|
||||
* js> o = {};
|
||||
* [object Object]
|
||||
* js> o.__proto__ = File.prototype;
|
||||
* [object File]
|
||||
* js> o.write("hi");
|
||||
* js: called on incompatible object
|
||||
* </pre>
|
||||
* The runtime will take care of such checks when non-static Java methods
|
||||
* are defined as JavaScript functions.
|
||||
*/
|
||||
private static File checkInstance(Scriptable obj) {
|
||||
if (obj == null || !(obj instanceof File)) {
|
||||
throw Context.reportRuntimeError("called on incompatible object");
|
||||
}
|
||||
return (File) obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Some private data for this class.
|
||||
*/
|
||||
private String name;
|
||||
private java.io.File file; // may be null, meaning to use System.out or .in
|
||||
private LineNumberReader reader;
|
||||
private BufferedWriter writer;
|
||||
}
|
||||
|
||||
@@ -1,168 +0,0 @@
|
||||
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Rhino code, released
|
||||
* May 6, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1997-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
import org.mozilla.javascript.*;
|
||||
|
||||
/**
|
||||
* An example host object class.
|
||||
*
|
||||
* Here's a shell session showing the Foo object in action:
|
||||
* <pre>
|
||||
* js> defineClass("Foo")
|
||||
* js> foo = new Foo(); <i>A constructor call, see <a href="#Foo">Foo</a> below.</i>
|
||||
* [object Foo] <i>The "Foo" here comes from <a href"#getClassName">getClassName</a>.</i>
|
||||
* js> foo.counter; <i>The counter property is defined by the <code>defineProperty</code></i>
|
||||
* 0 <i>call below and implemented by the <a href="#getCounter">getCounter</a></i>
|
||||
* js> foo.counter; <i>method below.</i>
|
||||
* 1
|
||||
* js> foo.counter;
|
||||
* 2
|
||||
* js> foo.resetCounter(); <i>Results in a call to <a href="#resetCounter">resetCounter</a>.</i>
|
||||
* js> foo.counter; <i>Now the counter has been reset.</i>
|
||||
* 0
|
||||
* js> foo.counter;
|
||||
* 1
|
||||
* js> bar = new Foo(37); <i>Create a new instance.</i>
|
||||
* [object Foo]
|
||||
* js> bar.counter; <i>This instance's counter is distinct from</i>
|
||||
* 37 <i>the other instance's counter.</i>
|
||||
* js> foo.varargs(3, "hi"); <i>Calls <a href="#varargs">varargs</a>.</i>
|
||||
* this = [object Foo]; args = [3, hi]
|
||||
* js> foo[7] = 34; <i>Since we extended ScriptableObject, we get</i>
|
||||
* 34 <i>all the behavior of a JavaScript object</i>
|
||||
* js> foo.a = 23; <i>for free.</i>
|
||||
* 23
|
||||
* js> foo.a + foo[7];
|
||||
* 57
|
||||
* js>
|
||||
* </pre>
|
||||
*
|
||||
* @see org.mozilla.javascript.Context
|
||||
* @see org.mozilla.javascript.Scriptable
|
||||
* @see org.mozilla.javascript.ScriptableObject
|
||||
*
|
||||
* @author Norris Boyd
|
||||
*/
|
||||
|
||||
public class Foo extends ScriptableObject {
|
||||
|
||||
/**
|
||||
* The zero-parameter constructor.
|
||||
*
|
||||
* When Context.defineClass is called with this class, it will
|
||||
* construct Foo.prototype using this constructor.
|
||||
*/
|
||||
public Foo() {
|
||||
}
|
||||
|
||||
/**
|
||||
* The Java method defining the JavaScript Foo constructor.
|
||||
*
|
||||
* Takes an initial value for the counter property.
|
||||
* Note that in the example Shell session above, we didn't
|
||||
* supply a argument to the Foo constructor. This means that
|
||||
* the Undefined value is used as the value of the argument,
|
||||
* and when the argument is converted to an integer, Undefined
|
||||
* becomes 0.
|
||||
*/
|
||||
public Foo(int counterStart) {
|
||||
counter = counterStart;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of this JavaScript class, "Foo".
|
||||
*/
|
||||
public String getClassName() {
|
||||
return "Foo";
|
||||
}
|
||||
|
||||
/**
|
||||
* The Java method defining the JavaScript resetCounter function.
|
||||
*
|
||||
* Resets the counter to 0.
|
||||
*/
|
||||
public void jsFunction_resetCounter() {
|
||||
counter = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* The Java method implementing the getter for the counter property.
|
||||
* <p>
|
||||
* If "setCounter" had been defined in this class, the runtime would
|
||||
* call the setter when the property is assigned to.
|
||||
*/
|
||||
public int jsGet_counter() {
|
||||
return counter++;
|
||||
}
|
||||
|
||||
/**
|
||||
* An example of a variable-arguments method.
|
||||
*
|
||||
* All variable arguments methods must have the same number and
|
||||
* types of parameters, and must be static. <p>
|
||||
* @param cx the Context of the current thread
|
||||
* @param thisObj the JavaScript 'this' value.
|
||||
* @param args the array of arguments for this call
|
||||
* @param funObj the function object of the invoked JavaScript function
|
||||
* This value is useful to compute a scope using
|
||||
* Context.getTopLevelScope().
|
||||
* @return computes the string values and types of 'this' and
|
||||
* of each of the supplied arguments and returns them in a string.
|
||||
*
|
||||
* @exception ThreadAssociationException if the current
|
||||
* thread is not associated with a Context
|
||||
* @see org.mozilla.javascript.ScriptableObject#getTopLevelScope
|
||||
*/
|
||||
public static Object jsFunction_varargs(Context cx, Scriptable thisObj,
|
||||
Object[] args, Function funObj)
|
||||
{
|
||||
StringBuffer buf = new StringBuffer();
|
||||
buf.append("this = ");
|
||||
buf.append(Context.toString(thisObj));
|
||||
buf.append("; args = [");
|
||||
for (int i=0; i < args.length; i++) {
|
||||
buf.append(Context.toString(args[i]));
|
||||
if (i+1 != args.length)
|
||||
buf.append(", ");
|
||||
}
|
||||
buf.append("]");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* A piece of private data for this class.
|
||||
*/
|
||||
private int counter;
|
||||
}
|
||||
|
||||
@@ -1,276 +0,0 @@
|
||||
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Rhino code, released
|
||||
* May 6, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1997-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
import org.mozilla.javascript.*;
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* Matrix: An example host object class that implements the Scriptable interface.
|
||||
*
|
||||
* Built-in JavaScript arrays don't handle multiple dimensions gracefully: the
|
||||
* script writer must create every array in an array of arrays. The Matrix class
|
||||
* takes care of that by automatically allocating arrays for every index that
|
||||
* is accessed. What's more, the Matrix constructor takes a integer argument
|
||||
* that specifies the dimension of the Matrix. If m is a Matrix with dimension 3,
|
||||
* then m[0] will be a Matrix with dimension 1, and m[0][0] will be an Array.
|
||||
*
|
||||
* Here's a shell session showing the Matrix object in action:
|
||||
* <pre>
|
||||
* js> defineClass("Matrix")
|
||||
* js> m = new Matrix(2); <i>A constructor call, see <a href="#Matrix">Matrix</a> below.</i>
|
||||
* [object Matrix] <i>The "Matrix" here comes from <a href"#getClassName">getClassName</a>.</i>
|
||||
* js> version(120); <i>switch to JavaScript1.2 to see arrays better</i>
|
||||
* 0
|
||||
* js> m[0][0] = 3;
|
||||
* 3
|
||||
* js> m[0]; <i>an array was created automatically!</i>
|
||||
* [3]
|
||||
* js> m[1]; <i>array is created even if we don't set a value</i>
|
||||
* []
|
||||
* js> m.dim; <i>we can access the "dim" property</i>
|
||||
* 2
|
||||
* js> m.dim = 3;
|
||||
* 3
|
||||
* js> m.dim; <i>but not modify it</i>
|
||||
* 2
|
||||
* </pre>
|
||||
*
|
||||
* @see org.mozilla.javascript.Context
|
||||
* @see org.mozilla.javascript.Scriptable
|
||||
*
|
||||
* @author Norris Boyd
|
||||
*/
|
||||
public class Matrix implements Scriptable {
|
||||
|
||||
/**
|
||||
* The zero-parameter constructor.
|
||||
*
|
||||
* When ScriptableObject.defineClass is called with this class, it will
|
||||
* construct Matrix.prototype using this constructor.
|
||||
*/
|
||||
public Matrix() {
|
||||
}
|
||||
|
||||
/**
|
||||
* The Java constructor, also used to define the JavaScript constructor.
|
||||
*/
|
||||
public Matrix(int dimension) {
|
||||
if (dimension <= 0) {
|
||||
throw Context.reportRuntimeError(
|
||||
"Dimension of Matrix must be greater than zero");
|
||||
}
|
||||
dim = dimension;
|
||||
v = new Vector();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of this JavaScript class, "Matrix".
|
||||
*/
|
||||
public String getClassName() {
|
||||
return "Matrix";
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines the "dim" property by returning true if name is
|
||||
* equal to "dim".
|
||||
* <p>
|
||||
* Defines no other properties, i.e., returns false for
|
||||
* all other names.
|
||||
*
|
||||
* @param name the name of the property
|
||||
* @param start the object where lookup began
|
||||
*/
|
||||
public boolean has(String name, Scriptable start) {
|
||||
return name.equals("dim");
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines all numeric properties by returning true.
|
||||
*
|
||||
* @param index the index of the property
|
||||
* @param start the object where lookup began
|
||||
*/
|
||||
public boolean has(int index, Scriptable start) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the named property.
|
||||
* <p>
|
||||
* Handles the "dim" property and returns NOT_FOUND for all
|
||||
* other names.
|
||||
* @param name the property name
|
||||
* @param start the object where the lookup began
|
||||
*/
|
||||
public Object get(String name, Scriptable start) {
|
||||
if (name.equals("dim"))
|
||||
return new Integer(dim);
|
||||
|
||||
return NOT_FOUND;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the indexed property.
|
||||
* <p>
|
||||
* Look up the element in the associated vector and return
|
||||
* it if it exists. If it doesn't exist, create it.<p>
|
||||
* @param index the index of the integral property
|
||||
* @param start the object where the lookup began
|
||||
*/
|
||||
public Object get(int index, Scriptable start) {
|
||||
if (index >= v.size())
|
||||
v.setSize(index+1);
|
||||
Object result = v.elementAt(index);
|
||||
if (result != null)
|
||||
return result;
|
||||
if (dim > 2) {
|
||||
Matrix m = new Matrix(dim-1);
|
||||
m.setParentScope(getParentScope());
|
||||
m.setPrototype(getPrototype());
|
||||
result = m;
|
||||
} else {
|
||||
Context cx = Context.getCurrentContext();
|
||||
Scriptable scope = ScriptableObject.getTopLevelScope(start);
|
||||
result = cx.newArray(scope, 0);
|
||||
}
|
||||
v.setElementAt(result, index);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a named property.
|
||||
*
|
||||
* We do nothing here, so all properties are effectively read-only.
|
||||
*/
|
||||
public void put(String name, Scriptable start, Object value) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an indexed property.
|
||||
*
|
||||
* We do nothing here, so all properties are effectively read-only.
|
||||
*/
|
||||
public void put(int index, Scriptable start, Object value) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a named property.
|
||||
*
|
||||
* This method shouldn't even be called since we define all properties
|
||||
* as PERMANENT.
|
||||
*/
|
||||
public void delete(String id) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove an indexed property.
|
||||
*
|
||||
* This method shouldn't even be called since we define all properties
|
||||
* as PERMANENT.
|
||||
*/
|
||||
public void delete(int index) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get prototype.
|
||||
*/
|
||||
public Scriptable getPrototype() {
|
||||
return prototype;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set prototype.
|
||||
*/
|
||||
public void setPrototype(Scriptable prototype) {
|
||||
this.prototype = prototype;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get parent.
|
||||
*/
|
||||
public Scriptable getParentScope() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set parent.
|
||||
*/
|
||||
public void setParentScope(Scriptable parent) {
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get properties.
|
||||
*
|
||||
* We return an empty array since we define all properties to be DONTENUM.
|
||||
*/
|
||||
public Object[] getIds() {
|
||||
return new Object[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Default value.
|
||||
*
|
||||
* Use the convenience method from Context that takes care of calling
|
||||
* toString, etc.
|
||||
*/
|
||||
public Object getDefaultValue(Class typeHint) {
|
||||
return "[object Matrix]";
|
||||
}
|
||||
|
||||
/**
|
||||
* instanceof operator.
|
||||
*
|
||||
* We mimick the normal JavaScript instanceof semantics, returning
|
||||
* true if <code>this</code> appears in <code>value</code>'s prototype
|
||||
* chain.
|
||||
*/
|
||||
public boolean hasInstance(Scriptable value) {
|
||||
Scriptable proto = value.getPrototype();
|
||||
while (proto != null) {
|
||||
if (proto.equals(this))
|
||||
return true;
|
||||
proto = proto.getPrototype();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Some private data for this class.
|
||||
*/
|
||||
private int dim;
|
||||
private Vector v;
|
||||
private Scriptable prototype, parent;
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
<html>
|
||||
<body>
|
||||
This is the NervousText applet in javascript:
|
||||
<applet archive="js.jar" code=NervousText width=200 height=50 >
|
||||
</applet>
|
||||
|
||||
<hr>
|
||||
The test assumes that applet code is generated with:
|
||||
<pre>
|
||||
java -classpath js.jar org.mozilla.javascript.tools.jsc.Main \
|
||||
-extends java.applet.Applet \
|
||||
-implements java.lang.Runnable \
|
||||
NervousText.js
|
||||
</pre>
|
||||
and the resulting 2 classes, NervousText.class extending java.applet.Applet and implementing java.lang.Runnable and NervousText1.class which represents compiled JavaScript code, are placed in the same directory as NervousText.html.
|
||||
<p>
|
||||
The test also assumes that js.jar from Rhino distribution is available in the same directory.
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,75 +0,0 @@
|
||||
// The Java "NervousText" example ported to JavaScript.
|
||||
// Compile using java org.mozilla.javascript.tools.jsc.Main -extends java.applet.Applet -implements java.lang.Runnable NervousText.js
|
||||
/*
|
||||
Adapted from Java code by
|
||||
Daniel Wyszynski
|
||||
Center for Applied Large-Scale Computing (CALC)
|
||||
04-12-95
|
||||
|
||||
Test of text animation.
|
||||
|
||||
kwalrath: Changed string; added thread suspension. 5-9-95
|
||||
*/
|
||||
var Font = java.awt.Font;
|
||||
var Thread = java.lang.Thread;
|
||||
var separated;
|
||||
var s = null;
|
||||
var killme = null;
|
||||
var i;
|
||||
var x_coord = 0, y_coord = 0;
|
||||
var num;
|
||||
var speed=35;
|
||||
var counter =0;
|
||||
var threadSuspended = false; //added by kwalrath
|
||||
|
||||
function init() {
|
||||
this.resize(150,50);
|
||||
this.setFont(new Font("TimesRoman",Font.BOLD,36));
|
||||
s = this.getParameter("text");
|
||||
if (s == null) {
|
||||
s = "Rhino";
|
||||
}
|
||||
separated = s.split('');
|
||||
}
|
||||
|
||||
function start() {
|
||||
if(killme == null)
|
||||
{
|
||||
killme = new java.lang.Thread(java.lang.Runnable(this));
|
||||
killme.start();
|
||||
}
|
||||
}
|
||||
|
||||
function stop() {
|
||||
killme = null;
|
||||
}
|
||||
|
||||
function run() {
|
||||
while (killme != null) {
|
||||
try {Thread.sleep(100);} catch (e){}
|
||||
this.repaint();
|
||||
}
|
||||
killme = null;
|
||||
}
|
||||
|
||||
function paint(g) {
|
||||
for(i=0;i<separated.length;i++)
|
||||
{
|
||||
x_coord = Math.random()*10+15*i;
|
||||
y_coord = Math.random()*10+36;
|
||||
g.drawChars(separated, i,1,x_coord,y_coord);
|
||||
}
|
||||
}
|
||||
|
||||
/* Added by kwalrath. */
|
||||
function mouseDown(evt, x, y) {
|
||||
if (threadSuspended) {
|
||||
killme.resume();
|
||||
}
|
||||
else {
|
||||
killme.suspend();
|
||||
}
|
||||
threadSuspended = !threadSuspended;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Rhino code, released
|
||||
* May 6, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1997-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Norris Boyd
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
import org.mozilla.javascript.*;
|
||||
|
||||
/**
|
||||
* An example WrapFactory that can be used to avoid wrapping of Java types
|
||||
* that can be converted to ECMA primitive values.
|
||||
* So java.lang.String is mapped to ECMA string, all java.lang.Numbers are
|
||||
* mapped to ECMA numbers, and java.lang.Booleans are mapped to ECMA booleans
|
||||
* instead of being wrapped as objects. Additionally java.lang.Character is
|
||||
* converted to ECMA string with length 1.
|
||||
* Other types have the default behavior.
|
||||
* <p>
|
||||
* Note that calling "new java.lang.String('foo')" in JavaScript with this
|
||||
* wrap factory enabled will still produce a wrapped Java object since the
|
||||
* WrapFactory.wrapNewObject method is not overridden.
|
||||
* <p>
|
||||
* The PrimitiveWrapFactory is enabled on a Context by calling setWrapFactory
|
||||
* on that context.
|
||||
*/
|
||||
public class PrimitiveWrapFactory extends WrapFactory {
|
||||
|
||||
public Object wrap(Context cx, Scriptable scope, Object obj,
|
||||
Class staticType)
|
||||
{
|
||||
if (obj instanceof String || obj instanceof Number ||
|
||||
obj instanceof Boolean)
|
||||
{
|
||||
return obj;
|
||||
} else if (obj instanceof Character) {
|
||||
char[] a = { ((Character)obj).charValue() };
|
||||
return new String(a);
|
||||
}
|
||||
return super.wrap(cx, scope, obj, staticType);
|
||||
}
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Rhino code, released
|
||||
* May 6, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
import org.mozilla.javascript.*;
|
||||
|
||||
/**
|
||||
* RunScript: simplest example of controlling execution of Rhino.
|
||||
*
|
||||
* Collects its arguments from the command line, executes the
|
||||
* script, and prints the result.
|
||||
*
|
||||
* @author Norris Boyd
|
||||
*/
|
||||
public class RunScript {
|
||||
public static void main(String args[])
|
||||
throws JavaScriptException
|
||||
{
|
||||
// Creates and enters a Context. The Context stores information
|
||||
// about the execution environment of a script.
|
||||
Context cx = Context.enter();
|
||||
try {
|
||||
// Initialize the standard objects (Object, Function, etc.)
|
||||
// This must be done before scripts can be executed. Returns
|
||||
// a scope object that we use in later calls.
|
||||
Scriptable scope = cx.initStandardObjects();
|
||||
|
||||
// Collect the arguments into a single string.
|
||||
String s = "";
|
||||
for (int i=0; i < args.length; i++) {
|
||||
s += args[i];
|
||||
}
|
||||
|
||||
// Now evaluate the string we've colected.
|
||||
Object result = cx.evaluateString(scope, s, "<cmd>", 1, null);
|
||||
|
||||
// Convert the result to a string and print it.
|
||||
System.err.println(cx.toString(result));
|
||||
|
||||
} finally {
|
||||
// Exit from the context.
|
||||
Context.exit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Rhino code, released
|
||||
* May 6, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
import org.mozilla.javascript.*;
|
||||
|
||||
/**
|
||||
* RunScript2: Like RunScript, but reflects the System.out into JavaScript.
|
||||
*
|
||||
* @author Norris Boyd
|
||||
*/
|
||||
public class RunScript2 {
|
||||
public static void main(String args[])
|
||||
throws JavaScriptException
|
||||
{
|
||||
Context cx = Context.enter();
|
||||
try {
|
||||
Scriptable scope = cx.initStandardObjects();
|
||||
|
||||
// Add a global variable "out" that is a JavaScript reflection
|
||||
// of System.out
|
||||
Scriptable jsArgs = Context.toObject(System.out, scope);
|
||||
scope.put("out", scope, jsArgs);
|
||||
|
||||
String s = "";
|
||||
for (int i=0; i < args.length; i++) {
|
||||
s += args[i];
|
||||
}
|
||||
Object result = cx.evaluateString(scope, s, "<cmd>", 1, null);
|
||||
System.err.println(cx.toString(result));
|
||||
} finally {
|
||||
Context.exit();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Rhino code, released
|
||||
* May 6, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
import org.mozilla.javascript.*;
|
||||
|
||||
/**
|
||||
* RunScript3: Example of using JavaScript objects
|
||||
*
|
||||
* Collects its arguments from the command line, executes the
|
||||
* script, and then ...
|
||||
*
|
||||
* @author Norris Boyd
|
||||
*/
|
||||
public class RunScript3 {
|
||||
public static void main(String args[])
|
||||
throws JavaScriptException
|
||||
{
|
||||
Context cx = Context.enter();
|
||||
try {
|
||||
Scriptable scope = cx.initStandardObjects();
|
||||
|
||||
// Collect the arguments into a single string.
|
||||
String s = "";
|
||||
for (int i=0; i < args.length; i++) {
|
||||
s += args[i];
|
||||
}
|
||||
|
||||
// Now evaluate the string we've colected. We'll ignore the result.
|
||||
cx.evaluateString(scope, s, "<cmd>", 1, null);
|
||||
|
||||
// Print the value of variable "x"
|
||||
Object x = scope.get("x", scope);
|
||||
if (x == Scriptable.NOT_FOUND) {
|
||||
System.out.println("x is not defined.");
|
||||
} else {
|
||||
System.out.println("x = " + Context.toString(x));
|
||||
}
|
||||
|
||||
// Call function "f('my arg')" and print its result.
|
||||
Object fObj = scope.get("f", scope);
|
||||
if (!(fObj instanceof Function)) {
|
||||
System.out.println("f is undefined or not a function.");
|
||||
} else {
|
||||
Object functionArgs[] = { "my arg" };
|
||||
Function f = (Function)fObj;
|
||||
Object result = f.call(cx, scope, scope, functionArgs);
|
||||
String report = "f('my args') = " + Context.toString(result);
|
||||
System.out.println(report);
|
||||
}
|
||||
} finally {
|
||||
Context.exit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Rhino code, released
|
||||
* May 6, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
import org.mozilla.javascript.*;
|
||||
|
||||
/**
|
||||
* RunScript4: Execute scripts in an environment that includes the
|
||||
* example Counter class.
|
||||
*
|
||||
* @author Norris Boyd
|
||||
*/
|
||||
public class RunScript4 {
|
||||
public static void main(String args[])
|
||||
throws Exception
|
||||
{
|
||||
Context cx = Context.enter();
|
||||
try {
|
||||
Scriptable scope = cx.initStandardObjects();
|
||||
|
||||
// Use the Counter class to define a Counter constructor
|
||||
// and prototype in JavaScript.
|
||||
ScriptableObject.defineClass(scope, Counter.class);
|
||||
|
||||
// Create an instance of Counter and assign it to
|
||||
// the top-level variable "myCounter". This is
|
||||
// equivalent to the JavaScript code
|
||||
// myCounter = new Counter(7);
|
||||
Object[] arg = { new Integer(7) };
|
||||
Scriptable myCounter = cx.newObject(scope, "Counter", arg);
|
||||
scope.put("myCounter", scope, myCounter);
|
||||
|
||||
String s = "";
|
||||
for (int i=0; i < args.length; i++) {
|
||||
s += args[i];
|
||||
}
|
||||
Object result = cx.evaluateString(scope, s, "<cmd>", 1, null);
|
||||
System.err.println(cx.toString(result));
|
||||
} finally {
|
||||
Context.exit();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user