OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libjava/] [classpath/] [doc/] [cp-hacking.texinfo] - Blame information for rev 767

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 767 jeremybenn
\input texinfo @c -*-texinfo-*-
2
 
3
@c %**start of header
4
@setfilename cp-hacking.info
5
@settitle GNU Classpath Hacker's Guide
6
@c %**end of header
7
 
8
@setchapternewpage off
9
 
10
@ifinfo
11
This file contains important information you will need to know if you
12
are going to hack on the GNU Classpath project code.
13
 
14
Copyright (C) 1998,1999,2000,2001,2002,2003,2004,2005,2007,2009 Free Software Foundation, Inc.
15
 
16
@ifnotplaintext
17
@dircategory GNU Libraries
18
@direntry
19
* Classpath Hacking: (cp-hacking).  GNU Classpath Hacker's Guide
20
@end direntry
21
@end ifnotplaintext
22
@end ifinfo
23
 
24
@titlepage
25
@title GNU Classpath Hacker's Guide
26
@author Aaron M. Renn
27
@author Paul N. Fisher
28
@author John Keiser
29
@author C. Brian Jones
30
@author Mark J. Wielaard
31
 
32
@page
33
@vskip 0pt plus 1filll
34
Copyright @copyright{} 1998,1999,2000,2001,2002,2003,2004 Free Software Foundation, Inc.
35
@sp 2
36
Permission is granted to make and distribute verbatim copies of
37
this document provided the copyright notice and this permission notice
38
are preserved on all copies.
39
 
40
Permission is granted to copy and distribute modified versions of this
41
document under the conditions for verbatim copying, provided that the
42
entire resulting derived work is distributed under the terms of a
43
permission notice identical to this one.
44
 
45
Permission is granted to copy and distribute translations of this manual
46
into another language, under the above conditions for modified versions,
47
except that this permission notice may be stated in a translation
48
approved by the Free Software Foundation.
49
 
50
@end titlepage
51
 
52
@ifinfo
53
@node Top, Introduction, (dir), (dir)
54
@top GNU Classpath Hacker's Guide
55
 
56
This document contains important information you'll want to know if
57
you want to hack on GNU Classpath, Essential Libraries for Java, to
58
help create free core class libraries for use with virtual machines
59
and compilers for the java programming language.
60
@end ifinfo
61
 
62
@menu
63
* Introduction::                An introduction to the GNU Classpath project
64
* Requirements::                Very important rules that must be followed
65
* Volunteering::                So you want to help out
66
* Project Goals::               Goals of the GNU Classpath project
67
* Needed Tools and Libraries::  A list of programs and libraries you will need
68
* Installation::                Installation instructions
69
* Building and running with the X AWT peers:: Building and running with the X AWT peers
70
* Misc. Notes::                 Miscellaneous notes
71
* Programming Standards::       Standards to use when writing code
72
* Hacking Code::                Working on code, Working with others
73
* Programming Goals::           What to consider when writing code
74
* API Compatibility::           How to handle serialization and deprecated methods
75
* Specification Sources::       Where to find class library specs
76
* Naming Conventions::          How files and directories are named
77
* Character Conversions::       Working on Character conversions
78
* Localization::                How to handle localization/internationalization
79
 
80
@detailmenu
81
 --- The Detailed Node Listing ---
82
 
83
Programming Standards
84
 
85
* Source Code Style Guide::
86
 
87
Working on the code, Working with others
88
 
89
* Branches::
90
* Writing ChangeLogs::
91
 
92
Working with branches
93
 
94
* Writing ChangeLogs::
95
 
96
Programming Goals
97
 
98
* Portability::                 Writing Portable Software
99
* Utility Classes::             Reusing Software
100
* Robustness::                  Writing Robust Software
101
* Java Efficiency::             Writing Efficient Java
102
* Native Efficiency::           Writing Efficient JNI
103
* Security::                    Writing Secure Software
104
 
105
API Compatibility
106
 
107
* Serialization::               Serialization
108
* Deprecated Methods::          Deprecated methods
109
 
110
Localization
111
 
112
* String Collation::            Sorting strings in different locales
113
* Break Iteration::             Breaking up text into words, sentences, and lines
114
* Date Formatting and Parsing::  Locale specific date handling
115
* Decimal/Currency Formatting and Parsing::  Local specific number handling
116
 
117
@end detailmenu
118
@end menu
119
 
120
@node Introduction, Requirements, Top, Top
121
@comment node-name, next, previous, up
122
@chapter Introduction
123
 
124
The GNU Classpath Project is dedicated to providing a 100% free,
125
clean room implementation of the standard core class libraries for
126
compilers and runtime environments for the java programming language.
127
It offers free software developers an alternative core library
128
implementation upon which larger java-like programming environments
129
can be built.  The GNU Classpath Project was started in the Spring of
130
1998 as an official Free Software Foundation project.  Most of the
131
volunteers working on GNU Classpath do so in their spare time, but a
132
couple of projects based on GNU Classpath have paid programmers to
133
improve the core libraries.  We appreciate everyone's efforts in the
134
past to improve and help the project and look forward to future
135
contributions by old and new members alike.
136
 
137
@node Requirements, Volunteering, Introduction, Top
138
@comment node-name, next, previous, up
139
@chapter Requirements
140
 
141
Although GNU Classpath is following an open development model where input
142
from developers is welcome, there are certain base requirements that
143
need to be met by anyone who wants to contribute code to this project.
144
They are mostly dictated by legal requirements and are not arbitrary
145
restrictions chosen by the GNU Classpath team.
146
 
147
You will need to adhere to the following things if you want to donate
148
code to the GNU Classpath project:
149
 
150
@itemize @bullet
151
@item
152
@strong{Never under any circumstances refer to proprietary code while
153
working on GNU Classpath.}  It is best if you have never looked at
154
alternative proprietary core library code at all.  To reduce
155
temptation, it would be best if you deleted the @file{src.zip} file
156
from your proprietary JDK distribution (note that recent versions of
157
GNU Classpath and the compilers and environments build on it are
158
mature enough to not need any proprietary implementation at all when
159
working on GNU Classpath, except in exceptional cases where you need
160
to test compatibility issues pointed out by users).  If you have
161
signed Sun's non-disclosure statement, then you unfortunately cannot
162
work on Classpath code at all.  If you have any reason to believe that
163
your code might be ``tainted'', please say something on the mailing
164
list before writing anything.  If it turns out that your code was not
165
developed in a clean room environment, we could be very embarrassed
166
someday in court.  Please don't let that happen.
167
 
168
@item
169
@strong{Never decompile proprietary class library implementations.}  While
170
the wording of the license in Sun's Java 2 releases has changed, it is
171
not acceptable, under any circumstances, for a person working on
172
GNU Classpath to decompile Sun's class libraries.  Allowing the use of
173
decompilation in the GNU Classpath project would open up a giant can of
174
legal worms, which we wish to avoid.
175
 
176
@item
177
Classpath is licensed under the terms of the
178
@uref{http://www.fsf.org/copyleft/gpl.html,GNU General Public
179
License}, with a special exception included to allow linking with
180
non-GPL licensed works as long as no other license would restrict such
181
linking.  To preserve freedom for all users and to maintain uniform
182
licensing of Classpath, we will not accept code into the main
183
distribution that is not licensed under these terms.  The exact
184
wording of the license of the current version of GNU Classpath can be
185
found online from the
186
@uref{http://www.gnu.org/software/classpath/license.html, GNU
187
Classpath license page} and is of course distributed with current
188
snapshot release from @uref{ftp://ftp.gnu.org/gnu/classpath/} or by
189
obtaining a copy of the current CVS tree.
190
 
191
@item
192
GNU Classpath is GNU software and this project is being officially sponsored
193
by the @uref{http://www.fsf.org/,Free Software Foundation}.  Because of
194
this, the FSF will hold copyright to all code developed as part of
195
GNU Classpath.  This will allow them to pursue copyright violators in court,
196
something an individual developer may neither have the time nor
197
resources to do.  Everyone contributing code to GNU Classpath will need to
198
sign a copyright assignment statement.  Additionally, if you are
199
employed as a programmer, your employer may need to sign a copyright
200
waiver disclaiming all interest in the software.  This may sound harsh,
201
but unfortunately, it is the only way to ensure that the code you write
202
is legally yours to distribute.
203
@end itemize
204
 
205
@node Volunteering, Project Goals, Requirements, Top
206
@comment node-name, next, previous, up
207
@chapter Volunteering to Help
208
 
209
The GNU Classpath project needs volunteers to help us out.  People are
210
needed to write unimplemented core packages, to test GNU Classpath on
211
free software programs written in the java programming language, to
212
test it on various platforms, and to port it to platforms that are
213
currently unsupported.
214
 
215
While pretty much all contributions are welcome (but see
216
@pxref{Requirements}) it is always preferable that volunteers do the
217
whole job when volunteering for a task.  So when you volunteer to write
218
a Java package, please be willing to do the following:
219
 
220
@itemize @bullet
221
@item
222
Implement a complete drop-in replacement for the particular package.
223
That means implementing any ``internal'' classes.  For example, in the
224
java.net package, there are non-public classes for implementing sockets.
225
Without those classes, the public socket interface is useless.  But do
226
not feel obligated to completely implement all of the functionality at
227
once.  For example, in the java.net package, there are different types
228
of protocol handlers for different types of URLs.  Not all of these
229
need to be written at once.
230
 
231
@item
232
Please write complete and thorough API documentation comments for
233
every public and protected method and variable.  These should be
234
superior to Sun's and cover everything about the item being
235
documented.
236
 
237
@item
238
Please write a regression test package that can be used to run tests
239
of your package's functionality.  GNU Classpath uses the
240
@uref{http://sources.redhat.com/mauve/,Mauve project} for testing the
241
functionality of the core class libraries.  The Classpath Project is
242
fast approaching the point in time where all modifications to the
243
source code repository will require appropriate test cases in Mauve to
244
ensure correctness and prevent regressions.
245
@end itemize
246
 
247
Writing good documentation, tests and fixing bugs should be every
248
developer's top priority in order to reach the elusive release of
249
version 1.0.
250
 
251
@node Project Goals, Needed Tools and Libraries, Volunteering, Top
252
@comment node-name, next, previous, up
253
@chapter Project Goals
254
 
255
The goal of the Classpath project is to produce a
256
@uref{http://www.fsf.org/philosophy/free-sw.html,free} implementation of
257
the standard class library for Java.  However, there are other more
258
specific goals as to which platforms should be supported.
259
 
260
Classpath is targeted to support the following operating systems:
261
 
262
@enumerate
263
@item
264
Free operating systems.  This includes GNU/Linux, GNU/Hurd, and the free
265
BSDs.
266
 
267
@item
268
Other Unix-like operating systems.
269
 
270
@item
271
Platforms which currently have no Java support at all.
272
 
273
@item
274
Other platforms such as MS-Windows.
275
@end enumerate
276
 
277
While free operating systems are the top priority, the other priorities
278
can shift depending on whether or not there is a volunteer to port
279
Classpath to those platforms and to test releases.
280
 
281
Eventually we hope the Classpath will support all JVMs that provide
282
JNI or CNI support.  However, the top priority is free JVMs.  A small
283
list of Compiler/VM environments that are currently actively
284
incorporating GNU Classpath is below.  A more complete overview of
285
projects based on GNU classpath can be found online at
286
@uref{http://www.gnu.org/software/classpath/stories.html,the GNU
287
Classpath stories page}.
288
 
289
@enumerate
290
@item
291
@uref{http://gcc.gnu.org/java/,GCJ}
292
@item
293
@uref{http://jamvm.sourceforge.net/,jamvm}
294
@item
295
@uref{http://www.cacaojvm.org/,cacao}
296
@item
297
@uref{http://jikesrvm.org,Jikes RVM}
298
@item
299
@uref{http://www.kaffe.org/,Kaffe}
300
@item
301
@uref{http://www.ikvm.net/,IKVM}
302
@end enumerate
303
 
304
As with OS platform support, this priority list could change if a
305
volunteer comes forward to port, maintain, and test releases for a
306
particular JVM@.  Since gcj is part of the GNU Compiler Collective it
307
is one of the most important targets.  But since it doesn't currently
308
work out of the box with GNU Classpath it is not the easiest
309
target.  When hacking on GNU Classpath the easiest solution is to use
310
compilers and runtime environments that work out of the box with
311
it, such as the Eclipse compiler, ecj, and the runtime environments jamvm and
312
cacao.  Both Jikes RVM and Kaffe use an included version of GNU Classpath by
313
default, but Kaffe can now use a pre-installed version and Jikes RVM supports
314
using a CVS snapshot as well as the latest release.  Working directly with
315
targets such as Jikes RVM, gcj and IKVM is possible but can be a little more
316
difficult as changes have to be merged back into GNU Classpath proper,
317
which requires additional work.  Due to a recent switch to the use of 1.5 language
318
features within GNU Classpath, a compiler compatible with these features is required.
319
At present, this includes the Eclipse compiler, ecj, and the OpenJDK compiler.
320
 
321
GNU Classpath currently implements the majority of the 1.4 and 1.5 APIs
322
(binary compatibility is above 95% for both, but does not take into account
323
internal implementations of features such as graphic and sound support).  There
324
is support for some 1.6 APIs but this is still nascent.  Please do not create classes
325
that depend on features in other packages unless GNU Classpath already
326
contains those features.  GNU Classpath has been free of any
327
proprietary dependencies for a long time now and we like to keep it
328
that way.  Finishing, polishing up, documenting, testing and
329
debugging current functionality is of higher priority then adding new
330
functionality.
331
 
332
@node Needed Tools and Libraries, Installation, Project Goals, Top
333
@comment node-name, next, previous, up
334
@chapter Needed Tools and Libraries
335
 
336
If you want to hack on Classpath, you should at least download and
337
install the following tools and try to familiarize yourself with
338
them.  In most cases having these tools installed will be all
339
you really need to know about them.  Also note that when working on
340
(snapshot) releases only a 1.5 compiler (plus a free VM from the list above
341
and the libraries listed below) is required.  The other tools are only
342
needed when working directly on the CVS version.
343
 
344
@itemize @bullet
345
@item
346
GNU make 3.80+
347
@item
348
GCC 2.95+
349
@item
350
Eclipse Compiler for Java 3.1+
351
@item
352
CVS 1.11+
353
@item
354
automake 1.11+
355
@item
356
autoconf 2.64+
357
@item
358
libtool 1.5+
359
@item
360
GNU m4 1.4.6
361
@item
362
texinfo 4.2+
363
@end itemize
364
 
365
All of these tools are available from
366
@uref{ftp://gnudist.gnu.org/pub/gnu/,gnudist.gnu.org} via anonymous
367
ftp, except CVS which is available from
368
@uref{http://www.cvshome.org/,www.cvshome.org} and the Eclipse
369
Compiler for Java, which is available from
370
@uref{http://www.eclipse.org/jdt/core,www.eclipse.org/jdt/core}.
371
 
372
Except for the Eclipse Compiler for Java, they are fully documented
373
with texinfo manuals.  Texinfo can be browsed with the Emacs editor,
374
or with the text editor of your choice, or transformed into nicely
375
printable Postscript.
376
 
377
Here is a brief description of the purpose of those tools.
378
 
379
@table @b
380
 
381
@item make
382
GNU make ("gmake") is required for building Classpath.
383
 
384
@item GCC
385
The GNU Compiler Collection. This contains a C compiler (gcc) for
386
compiling the native C code and a compiler for the java programming
387
language (gcj).  You will need at least gcc version 2.95 or higher
388
in order to compile the native code. There is currently no
389
released version of gcj that can compile the Java 1.5 programming
390
language used by GNU Classpath.
391
 
392
@item ecj
393
The Eclipse Compiler for Java. This is a compiler for the Java 1.5
394
programming language. It translates source code to bytecode. The
395
Eclipse Foundation makes ``ecj.jar'' available as the JDT Core Batch
396
Compiler download.
397
 
398
@item CVS
399
A version control system that maintains a centralized Internet
400
repository of all code in the Classpath system.
401
 
402
@item automake
403
This tool automatically creates @file{Makefile.in} files from
404
@file{Makefile.am} files.  The @file{Makefile.in} is turned into a
405
@file{Makefile} by @command{autoconf}.
406
 
407
Why use this?  Because it automatically generates every makefile
408
target you would ever want (@option{clean}, @option{install},
409
@option{dist}, etc) in full compliance with the GNU coding standards.
410
It also simplifies Makefile creation in a number of ways that cannot
411
be described here.  Read the docs for more info.
412
 
413
@item autoconf
414
Automatically configures a package for the platform on which it is
415
being built and generates the Makefile for that platform.
416
 
417
@item libtool
418
Handles all of the zillions of hairy platform specific options needed
419
to build shared libraries.
420
 
421
@item m4
422
The free GNU replacement for the standard Unix macro processor.
423
Proprietary m4 programs are broken and so GNU m4 is required for
424
autoconf to work though knowing a lot about GNU m4 is not required to
425
work with autoconf.
426
 
427
@item perl
428
Larry Wall's scripting language.  It is used internally by automake.
429
 
430
@item texinfo
431
Manuals and documentation (like this guide) are written in texinfo.
432
Texinfo is the official documentation format of the GNU project.
433
Texinfo uses a single source file to produce output in a number of formats,
434
both online and printed (dvi, info, html, xml, etc.). This means that
435
instead of writing different documents for online information and another
436
for a printed manual, you need write only one document. And when the work
437
is revised, you need revise only that one document.
438
 
439
@end table
440
 
441
For any build environment involving native libraries, recent
442
versions of @command{autoconf}, @command{automake}, and @command{libtool}
443
are required if changes are made that require rebuilding @file{configure},
444
@file{Makefile.in}, @file{aclocal.m4}, or @file{config.h.in}.
445
 
446
When working from CVS you can run those tools by executing
447
@command{autogen.sh} in the source directory.
448
 
449
For building the Java bytecode (.class files), you can select
450
which compiler should be employed using @option{--with-javac} or
451
@option{--with-ecj} as an argument to @command{configure};
452
the present default is @command{ecj} if found.
453
 
454
Instead of @command{ecj}, you can also use @command{javac}, which is
455
available at
456
@uref{https://openjdk.dev.java.net/compiler, openjdk.dev.java.net/compiler}.
457
 
458
For compiling the native AWT libraries you need to have the following
459
libraries installed (unless @option{--disable-gtk-peer} is used as an argument
460
to @command{configure}):
461
 
462
@table @b
463
@item GTK+ 2.8.x
464
@uref{http://www.gtk.org/,GTK+} is a multi-platform toolkit for
465
creating graphical user interfaces.  It is used as the basis of the
466
GNU desktop project GNOME.
467
 
468
@item gdk-pixbuf
469
@uref{http://www.gnome.org/start/,gdk-pixbuf} is a GNOME library for
470
representing images.
471
 
472
@item XTest
473
@uref{http://www.x.org,www.x.org} hosts the XTest Extension (libXtst).
474
It is necessary for GdkRobot support in java.awt.
475
 
476
@end table
477
 
478
There is a bug in earlier versions of at-spi, atk, and gail, which are
479
used for GNOME accessibility.  Prior to version 1.18.0 of these packages,
480
gtk graphical applications should be run without accessibility (clear the
481
GTK_MODULES environment variable).
482
 
483
For building the Qt AWT peer JNI native libraries you have to
484
specify @option{--enable-qt-peer} and need the following library:
485
 
486
@table @b
487
@item Qt
488
@uref{http://www.trolltech.com/products/qt,Qt} version 4.0.1 or higher.
489
The Qt library is a cross-platform graphics toolkit.
490
 
491
@end table
492
 
493
Please note that at the moment most operating systems do not
494
ship Qt version 4.0.1 by default. We recommend using GNU Classpath' Qt
495
support only for its developers and bug reporters. See
496
@uref{http://developer.classpath.org/mediation/ClasspathShowcase, the wiki}
497
for details on how to get it to work.
498
 
499
For building the X AWT peers you have to specify where to find the
500
Escher library on your system using the @option{--with-escher=ABS.PATH} option.
501
You will need the following library:
502
 
503
@table @b
504
@item Escher
505
@uref{http://escher.sourceforge.net,Escher} version 0.2.3 or higher.
506
The Escher library is an implementation of X protocol and associated
507
libraries written in the Java programming language.
508
 
509
@end table
510
 
511
For building the ALSA midi provider code you will need
512
the following library:
513
 
514
 
515
@table @b
516
@item ALSA
517
@uref{http://www.alsa-project.org,ALSA} libraries.
518
 
519
The ALSA project provides sound device drivers and associated
520
libraries for the Linux kernel.
521
 
522
@end table
523
 
524
Building the ALSA midi provider code can be disabled by passing
525
@option{--disable-alsa} to @command{configure}.
526
 
527
For building the DSSI midi synthesizer provider code you will
528
need the following libraries:
529
 
530
@table @b
531
@item DSSI
532
@uref{http://dssi.sourceforge.net,DSSI} library for audio
533
processing plugins.
534
 
535
@item liblo
536
@uref{http://plugin.org.uk/liblo/,liblo}, the Lightweight OSC
537
implementation.
538
 
539
@item LADSPA
540
@uref{http://www.ladspa.org,LADSPA}, the Linux Audio Developer's
541
Simple Plugin API.
542
 
543
@item JACK
544
@uref{http://jackit.sourceforge.net,JACK}, a low latency audio
545
server.
546
 
547
@item libsndfile
548
@uref{http://www.mega-nerd.com/libsndfile/,libsndfile}, an audio
549
file I/O library.
550
 
551
@item fluidsynth
552
@uref{http://www.fluidsynth.org/,fluidsynth}, a real-time SoundFont
553
2 based soft-synth.
554
 
555
@end table
556
 
557
The GConf-based backend for java.util.prefs needs the following
558
library headers:
559
 
560
@table @b
561
@item GConf
562
@uref{http://www.gnome.org/projects/gconf/,GConf} version 2.11.2
563
(or higher). GConf is used for storing desktop and application
564
configuration settings in GNOME.
565
 
566
@end table
567
 
568
The GStreamer backend for javax.sound.sampled (The Java Sound API, not
569
including the MIDI portion) needs the following library headers:
570
 
571
@table @b
572
@item GStreamer
573
@uref{http://gstreamer.freedesktop.org/,GStreamer} version 0.10.10
574
(or higher). You will also need at least gstreamer-base and
575
gstreamer-plugins-base. More plugins can be used to allow streaming of
576
different sound types but are not a compile time requirement. See
577
README.gstreamer in the source distribution for more informations.
578
 
579
@end table
580
 
581
For building @command{gcjwebplugin} you'll need the Mozilla plugin
582
support headers and libraries, which are available at
583
@uref{http://www.mozilla.org,www.mozilla.org}.
584
 
585
For enabling the com.sun.tools.javac support in tools.zip you
586
will need a jar file containing the Eclipse Java Compiler.
587
Otherwise com.sun.tools.javac will not be included in @file{tools.zip}.
588
 
589
For building the xmlj JAXP implementation (disabled by default,
590
use @command{configure --enable-xmlj}) you need the following libraries:
591
 
592
@table @b
593
@item libxml2
594
@uref{http://www.xmlsoft.org/,libxml2} version 2.6.8 or higher.
595
 
596
The libxml2 library is the XML C library for the Gnome desktop.
597
 
598
@item libxslt
599
@uref{http://www.xmlsoft.org/XSLT/,libxslt} version 1.1.11 or higher.
600
 
601
The libxslt library if the XSLT C library for the Gnome desktop.
602
@end table
603
 
604
GNU Classpath comes with a couple of libraries included in the source
605
that are not part of GNU Classpath proper, but that have been included
606
to provide certain needed functionality.  All these external libraries
607
should be clearly marked as such.  In general we try to use as much as
608
possible the clean upstream versions of these sources.  That way
609
merging in new versions will be easier.  You should always try to get
610
bug fixes to these files accepted upstream first.  Currently we
611
include the following 'external' libraries.  Most of these sources are
612
included in the @file{external} directory.  That directory also
613
contains a @file{README} file explaining how to import newer versions.
614
 
615
@table @b
616
 
617
@item JSR166 concurrency support
618
Can be found in @file{external/jsr166}.  Provides java.util.concurrent
619
and its subpackages.  Upstream is
620
@uref{http://g.oswego.edu/dl/concurrency-interest/,Doug Lea's Concurrency Interest Site}.
621
 
622
@item RelaxNG Datatype Interfaces
623
Can be found in @file{external/relaxngDatatype}.  Provides org.relaxng.datatype
624
and its subpackages.  Upstream is
625
@uref{http://www.oasis-open.org/committees/relax-ng/}.
626
 
627
@item Simple API for XML (SAX)
628
Can be found in @file{external/sax}.  Provides org.xml.sax and its subpackages.
629
Upstream is
630
@uref{http://www.saxproject.org}.
631
 
632
@item Document Object Model (DOM) bindings
633
Can be found in @file{external/w3c_dom}.  Provides org.w3c.dom and its subpackages.
634
Upstream locations are listed in @file{external/w3c_dom/README}.
635
 
636
@item fdlibm
637
Can be found in @file{native/fdlibm}.  Provides native implementations
638
of some of the Float and Double operations.  Upstream is
639
@uref{http://gcc.gnu.org/java/,libgcj}, they sync again with the
640
'real' upstream @uref{http://www.netlib.org/fdlibm/readme}.  See also
641
java.lang.StrictMath.
642
 
643
@end table
644
 
645
@node Installation, Building and running with the X AWT peers, Needed Tools and Libraries, Top
646
@comment node-name, next, previous, up
647
@chapter Installation instructions
648
 
649
This package was designed to use the GNU standard for configuration
650
and makefiles.  To build and install do the following:
651
 
652
@enumerate
653
@item Configuration
654
 
655
Run the @command{configure} script to configure the package.  There are
656
various options you might want to pass to @command{configure} to control how the
657
package is built.  Consider the following options, @command{configure --help}
658
gives a complete list.
659
 
660
@table @option
661
@item --enable-java
662
 
663
compile Java source (default=@option{yes}).
664
 
665
@item --enable-jni
666
 
667
compile JNI source (default=@option{yes}).
668
 
669
@item --enable-gtk-peer
670
 
671
compile GTK native peers (default=@option{yes}).
672
 
673
@item --enable-qt-peer
674
 
675
compile Qt4 native peers (default=@option{no}).
676
 
677
@item --enable-default-toolkit
678
 
679
fully qualified class name of default AWT toolkit (default=@option{no}).
680
 
681
@item --enable-xmlj
682
 
683
compile native libxml/xslt library (default=@option{no}).
684
 
685
@item --enable-load-library
686
 
687
enable to use JNI native methods (default=@option{yes}).
688
 
689
@item --enable-local-sockets
690
 
691
enable build of local Unix sockets.
692
 
693
@item --with-glibj
694
define what to install @option{(zip|flat|both|none)} (default=@option{zip}).
695
 
696
@item --with-escher=/path/to/escher
697
 
698
enable build of the X/Escher peers, with
699
the escher library at @file{/path/to/escher}, either
700
in the form of a JAR file, or a directory
701
containing the .class files of Escher.
702
 
703
@item --enable-Werror
704
 
705
whether to compile C code with @option{-Werror} which turns
706
any compiler warning into a compilation failure
707
(default=@option{no}).
708
 
709
@item --with-gjdoc
710
 
711
generate documentation using @command{gjdoc} (default=@option{no}).
712
 
713
@item --with-jay
714
 
715
Regenerate the parsers with @command{jay}, must be given the
716
path to the @command{jay} executable
717
 
718
@item --with-glibj-zip=ABS.PATH
719
 
720
use prebuilt glibj.zip class library
721
 
722
@item --with-ecj-jar=ABS.PATH
723
 
724
specify jar file containing the Eclipse Java Compiler
725
 
726
@item --with-gstreamer-peer
727
 
728
build the experimental GStreamer peer (see @file{README.gstreamer})
729
 
730
@end table
731
 
732
For more flags run @command{configure --help}.
733
 
734
@item Building
735
 
736
Type @command{gmake} to build the package.  There is no longer a
737
dependency problem and we aim to keep it that way.
738
 
739
@item Installation
740
 
741
Type @command{gmake install} to install everything.  This may require
742
being the superuser. The default install path is /usr/local/classpath
743
you may change it by giving @command{configure} the
744
@option{--prefix=<path>} option.
745
 
746
@end enumerate
747
 
748
Report bugs to @email{classpath@@gnu.org} or much better to the
749
GNU Classpath bug tracker at
750
@uref{http://savannah.gnu.org/support/?func=addsupport&group=classpath,Savannah}.
751
 
752
Happy Hacking!
753
 
754
Once installed, GNU Classpath is ready to be used by any VM that supports
755
using the official version of GNU Classpath.  Simply ensure that
756
@file{/usr/local/classpath/share/classpath} is in your @env{CLASSPATH} environment
757
variable.  You'll also have to set your @env{LD_LIBRARY_PATH}
758
variable (or similar system configuration) to include the Classpath
759
native libraries in @file{/usr/local/classpath/lib/classpath}.
760
 
761
*NOTE* All example paths assume the default prefix is used with @command{configure}.
762
If you don't know what this means then the examples are correct.
763
 
764
@example
765
LD_LIBRARY_PATH=/usr/local/classpath/lib/classpath
766
CLASSPATH=/usr/local/classpath/share/classpath/glibj.zip:.
767
export LD_LIBRARY_PATH CLASSPATH
768
@end example
769
 
770
More information about the VMs that use GNU Classpath can be found in the
771
@file{README} file.
772
 
773
@node Building and running with the X AWT peers, Misc. Notes, Installation, Top
774
@comment node-name, next, previous, up
775
@chapter Building and running with the X AWT peers
776
 
777
In order build the X peers you need the Escher library version 0.2.3
778
from @uref{http://escher.sourceforge.net,escher.sourceforge.net}.
779
Unpack (and optionally build) the
780
Escher library following the instructions in the downloaded
781
package. Enable the build of the X peers by passing
782
@option{--with-escher=/path/to/escher} to @command{configure} where @file{/path/to/escher}
783
either points to a directory structure or JAR file containing the
784
Escher classes. For Unix systems it is preferable to also build local
785
socket support by passing @option{--enable-local-sockets}, which accelerates
786
the network communication to the X server significantly.
787
 
788
In this release you have to enable the X peers at runtime by
789
setting the system property awt.toolkit=gnu.java.awt.peer.x.XToolkit
790
by passing @option{-Dawt.toolkit=gnu.java.awt.peer.x.XToolkit} to the @command{java}
791
command when running an application.
792
 
793
@node Misc. Notes, Programming Standards, Building and running with the X AWT peers, Top
794
@comment node-name, next, previous, up
795
@chapter Misc. Notes
796
 
797
Compilation is accomplished using a compiler's @@file syntax.  For our
798
part, we avoid placing make style dependencies as rules upon the
799
compilation of a particular class file and leave this up to the Java
800
compiler instead.
801
 
802
The @option{--enable-maintainer-mode} option to @command{configure} currently does very
803
little and shouldn't be used by ordinary developers or users anyway.
804
 
805
On Windows machines, the native libraries do not currently build, but
806
the Java bytecode library will.  GCJ trunk is beginning to work under
807
Cygwin.
808
 
809
@node Programming Standards, Hacking Code, Misc. Notes, Top
810
@comment node-name, next, previous, up
811
@chapter Programming Standards
812
 
813
For C source code, follow the
814
@uref{http://www.gnu.org/prep/standards/,GNU Coding Standards}.
815
The standards also specify various things like the install directory
816
structure.  These should be followed if possible.
817
 
818
For Java source code, please follow the
819
@uref{http://www.gnu.org/prep/standards/,GNU Coding
820
Standards}, as much as possible.  There are a number of exceptions to
821
the GNU Coding Standards that we make for GNU Classpath as documented
822
in this guide.  We will hopefully be providing developers with a code
823
formatting tool that closely matches those rules soon.
824
 
825
For API documentation comments, please follow
826
@uref{http://java.sun.com/products/jdk/javadoc/writingdoccomments.html,How
827
to Write Doc Comments for Javadoc}.  We would like to have a set of
828
guidelines more tailored to GNU Classpath as part of this document.
829
 
830
@menu
831
* Source Code Style Guide::
832
@end menu
833
 
834
@node Source Code Style Guide,  , Programming Standards, Programming Standards
835
@comment node-name, next, previous, up
836
@section Java source coding style
837
 
838
Here is a list of some specific rules used when hacking on GNU
839
Classpath java source code. We try to follow the standard
840
@uref{http://www.gnu.org/prep/standards/,GNU Coding Standards}
841
for that. There are lots of tools that can automatically generate it
842
(although most tools assume C source, not java source code) and it
843
seems as good a standard as any. There are a couple of exceptions and
844
specific rules when hacking on GNU Classpath java source code however.
845
The following lists how code is formatted (and some other code
846
conventions):
847
 
848
 
849
@itemize @bullet
850
 
851
@item
852
Java source files in GNU Classpath are encoded using UTF-8.  However,
853
ordinarily it is considered best practice to use the ASCII subset of
854
UTF-8 and write non-ASCII characters using \u escapes.
855
 
856
@item
857
If possible, generate specific imports (expand) over java.io.* type
858
imports. Order by gnu, java, javax, org. There must be one blank line
859
between each group. The imports themselves are ordered alphabetically by
860
package name. Classes and interfaces occur before sub-packages. The
861
classes/interfaces are then also sorted alphabetical. Note that uppercase
862
characters occur before lowercase characters.
863
 
864
@example
865
import gnu.java.awt.EmbeddedWindow;
866
 
867
import java.io.IOException;
868
import java.io.InputStream;
869
 
870
import javax.swing.JFrame;
871
@end example
872
 
873
@item
874
Blank line after package statement, last import statement, classes,
875
interfaces, methods.
876
 
877
@item
878
Opening/closing brace for class and method is at the same level of
879
indent as the declaration.  All other braces are indented and content
880
between braces indented again.
881
 
882
@item
883
Since method definitions don't start in column zero anyway (since they
884
are always inside a class definition), the rational for easy grepping
885
for ``^method_def'' is mostly gone already. Since it is customary for
886
almost everybody who writes java source code to put modifiers, return
887
value and method name on the same line, we do too.
888
 
889
@c fixme Another rational for always indenting the method definition is that it makes it a bit easier to distinguish methods in inner and anonymous classes from code in their enclosing context. NEED EXAMPLE.
890
 
891
@item
892
Implements and extends on separate lines, throws too.  Indent extends,
893
implements, throws.  Apply deep indentation for method arguments.
894
 
895
@c fixme Needs example.
896
 
897
@item
898
Don't add a space between a method or constructor call/definition and
899
the open-bracket. This is because often the return value is an object on
900
which you want to apply another method or from which you want to access
901
a field.
902
 
903
Don't write:
904
 
905
@example
906
  getToolkit ().createWindow (this);
907
@end example
908
 
909
But write:
910
@example
911
  getToolkit().createWindow(this);
912
@end example
913
 
914
@item
915
The GNU Coding Standard it gives examples for almost every construct
916
(if, switch, do, while, etc.).  One missing is the try-catch construct
917
which should be formatted as:
918
 
919
@example
920
  try
921
    @{
922
      //
923
    @}
924
  catch (...)
925
    @{
926
      //
927
    @}
928
@end example
929
 
930
@item
931
Wrap lines at 80 characters after assignments and before operators.
932
Wrap always before extends, implements, throws, and labels.
933
 
934
@item
935
Don't put multiple class definitions in the same file, except for
936
inner classes. File names (plus .java) and class names should be the
937
same.
938
 
939
@item
940
Don't catch a @code{NullPointerException} as an alternative to simply
941
checking for @code{null}.  It is clearer and usually more efficient
942
to simply write an explicit check.
943
 
944
For instance, don't write:
945
 
946
@example
947
try
948
  @{
949
    return foo.doit();
950
  @}
951
catch (NullPointerException _)
952
  @{
953
    return 7;
954
  @}
955
@end example
956
 
957
If your intent above is to check whether @samp{foo} is @code{null},
958
instead write:
959
 
960
@example
961
if (foo == null)
962
  return 7;
963
else
964
  return foo.doit();
965
@end example
966
 
967
@item
968
Don't use redundant modifiers or other redundant constructs.  Here is
969
some sample code that shows various redundant items in comments:
970
 
971
@example
972
/*import java.lang.Integer;*/
973
/*abstract*/ interface I @{
974
   /*public abstract*/ void m();
975
   /*public static final*/ int i = 1;
976
   /*public static*/ class Inner @{@}
977
@}
978
final class C /*extends Object*/ @{
979
   /*final*/ void m() @{@}
980
@}
981
@end example
982
 
983
Note that Jikes will generate warnings for redundant modifiers if you
984
use @code{+Predundant-modifiers} on the command line.
985
 
986
@item
987
Modifiers should be listed in the standard order recommended by the
988
JLS@.  Jikes will warn for this when given @code{+Pmodifier-order}.
989
 
990
@item
991
Because the output of different compilers differs, we have
992
standardized on explicitly specifying @code{serialVersionUID} in
993
@code{Serializable} classes in Classpath.  This field should be
994
declared as @code{private static final}.  Note that a class may be
995
@code{Serializable} without being explicitly marked as such, due to
996
inheritance.  For instance, all subclasses of @code{Throwable} need to
997
have @code{serialVersionUID} declared.
998
@c fixme index
999
@c fixme link to the discussion
1000
 
1001
@item
1002
Don't declare unchecked exceptions in the @code{throws} clause of a
1003
method.  However, if throwing an unchecked exception is part of the
1004
method's API, you should mention it in the Javadoc.  There is one
1005
important exception to this rule, which is that a stub method should
1006
be marked as throwing @code{gnu.classpath.NotImplementedException}.
1007
This will let our API comparison tools note that the method is not
1008
fully implemented.
1009
 
1010
@item
1011
When overriding @code{Object.equals}, remember that @code{instanceof}
1012
filters out @code{null}, so an explicit check is not needed.
1013
 
1014
@item
1015
When catching an exception and rethrowing a new exception you should
1016
``chain'' the Throwables.  Don't just add the String representation of
1017
the caught exception.
1018
 
1019
@example
1020
  try
1021
    @{
1022
      // Some code that can throw
1023
    @}
1024
  catch (IOException ioe)
1025
    @{
1026
      throw (SQLException) new SQLException("Database corrupt").setCause(ioe);
1027
    @}
1028
@end example
1029
 
1030
@item
1031
Avoid the use of reserved words for identifiers.  This is obvious with those
1032
such as @code{if} and @code{while} which have always been part of the Java
1033
programming language, but you should be careful about accidentally using
1034
words which have been added in later versions.  Notable examples are
1035
@code{assert} (added in 1.4) and @code{enum} (added in 1.5).  Jikes will warn
1036
of the use of the word @code{enum}, but, as it doesn't yet support the 1.5
1037
version of the language, it will still allow this usage through.  A
1038
compiler which supports 1.5 (e.g.@: the Eclipse compiler, ecj) will simply
1039
fail to compile the offending source code.
1040
 
1041
@c fixme Describe Anonymous classes (example).
1042
@c fixme Descibe Naming conventions when different from GNU Coding Standards.
1043
@c fixme Describee API doc javadoc tags used.
1044
 
1045
@end itemize
1046
 
1047
Some things are the same as in the normal GNU Coding Standards:
1048
 
1049
@itemize @bullet
1050
 
1051
@item
1052
Unnecessary braces can be removed, one line after an if, for, while as
1053
examples.
1054
 
1055
@item
1056
Space around operators (assignment, logical, relational, bitwise,
1057
mathematical, shift).
1058
 
1059
@item
1060
Blank line before single-line comments, multi-line comments, javadoc
1061
comments.
1062
 
1063
@item
1064
If more than 2 blank lines, trim to 2.
1065
 
1066
@item
1067
Don't keep commented out code.  Just remove it or add a real comment
1068
describing what it used to do and why it is changed to the current
1069
implementation.
1070
@end itemize
1071
 
1072
 
1073
@node Hacking Code, Programming Goals, Programming Standards, Top
1074
@comment node-name, next, previous, up
1075
@chapter Working on the code, Working with others
1076
 
1077
There are a lot of people helping out with GNU Classpath.  Here are a
1078
couple of practical guidelines to make working together on the code
1079
smoother.
1080
 
1081
The main thing is to always discuss what you are up to on the
1082
mailinglist.  Making sure that everybody knows who is working on what
1083
is the most important thing to make sure we cooperate most
1084
effectively.
1085
 
1086
We maintain a
1087
@uref{http://www.gnu.org/software/classpath/tasks.html,Task List}
1088
which contains items that you might want to work on.
1089
 
1090
Before starting to work on something please make sure you read this
1091
complete guide.  And discuss it on list to make sure your work does
1092
not duplicate or interferes with work someone else is already doing.
1093
Always make sure that you submit things that are your own work.  And
1094
that you have paperwork on file (as stated in the requirements
1095
section) with the FSF authorizing the use of your additions.
1096
 
1097
Technically the GNU Classpath project is hosted on
1098
@uref{http://savannah.gnu.org/,Savannah} a central point for
1099
development, distribution and maintenance of GNU Software.  Here you
1100
will find the
1101
@uref{https://savannah.gnu.org/projects/classpath/,project page}, bug
1102
reports, pending patches, links to mailing lists, news items and CVS.
1103
 
1104
You can find instructions on getting a CVS checkout for classpath at
1105
@uref{https://savannah.gnu.org/cvs/?group=classpath}.
1106
 
1107
You don't have to get CVS commit write access to contribute, but it is
1108
sometimes more convenient to be able to add your changes directly to
1109
the project CVS@. Please contact the GNU Classpath savannah admins to
1110
arrange CVS access if you would like to have it.
1111
 
1112
Make sure to be subscribed to the commit-classpath mailinglist while
1113
you are actively hacking on Classpath.  You have to send patches (cvs
1114
diff -uN) to this list before committing.
1115
 
1116
We really want to have a pretty open check-in policy.  But this means
1117
that you should be extra careful if you check something in.  If at all
1118
in doubt or if you think that something might need extra explaining
1119
since it is not completely obvious please make a little announcement
1120
about the change on the mailinglist.  And if you do commit something
1121
without discussing it first and another GNU Classpath hackers asks for
1122
extra explanation or suggests to revert a certain commit then please
1123
reply to the request by explaining why something should be so or if
1124
you agree to revert it.  (Just reverting immediately is OK without
1125
discussion, but then please don't mix it with other changes and please
1126
say so on list.)
1127
 
1128
Patches that are already approved for libgcj or also OK for Classpath.
1129
(But you still have to send a patch/diff to the list.)  All other
1130
patches require you to think whether or not they are really OK and
1131
non-controversial, or if you would like some feedback first on them
1132
before committing.  We might get real commit rules in the future, for
1133
now use your own judgement, but be a bit conservative.
1134
 
1135
Always contact the GNU Classpath maintainer before adding anything
1136
non-trivial that you didn't write yourself and that does not come from
1137
libgcj or from another known GNU Classpath or libgcj hacker.  If you
1138
have been assigned to commit changes on behalf of another project or
1139
a company always make sure they come from people who have signed the
1140
papers for the FSF and/or fall under the arrangement your company made
1141
with the FSF for contributions.  Mention in the ChangeLog who actually
1142
wrote the patch.
1143
 
1144
Commits for completely unrelated changes they should be committed
1145
separately (especially when doing a formatting change and a logical
1146
change, do them in two separate commits). But do try to do a commit of
1147
as much things/files that are done at the same time which can
1148
logically be seen as part of the same change/cleanup etc.
1149
 
1150
When the change fixes an important bug or adds nice new functionality
1151
please write a short entry for inclusion in the @file{NEWS} file.  If it
1152
changes the VM interface you must mention that in both the @file{NEWS} file
1153
and the VM Integration Guide.
1154
 
1155
All the ``rules'' are really meant to make sure that GNU Classpath
1156
will be maintainable in the long run and to give all the projects that
1157
are now using GNU Classpath an accurate view of the changes we make to
1158
the code and to see what changed when.  If you think the requirements
1159
are ``unworkable'' please try it first for a couple of weeks.  If you
1160
still feel the same after having some more experience with the project
1161
please feel free to bring up suggestions for improvements on the list.
1162
But don't just ignore the rules!  Other hackers depend on them being
1163
followed to be the most productive they can be (given the above
1164
constraints).
1165
 
1166
@menu
1167
* Branches::
1168
* Writing ChangeLogs::
1169
@end menu
1170
 
1171
@node Branches, Writing ChangeLogs, Hacking Code, Hacking Code
1172
@comment node-name, next, previous, up
1173
@section Working with branches
1174
 
1175
Sometimes it is necessary to create branch of the source for doing new
1176
work that is disruptive to the other hackers, or that needs new
1177
language or libraries not yet (easily) available.
1178
 
1179
After discussing the need for a branch on the main mailinglist with
1180
the other hackers explaining the need of a branch and suggestion of
1181
the particular branch rules (what will be done on the branch, who will
1182
work on it, will there be different commit guidelines then for the
1183
mainline trunk and when is the branch estimated to be finished and
1184
merged back into the trunk) every GNU Classpath hacker with commit
1185
access should feel free to create a branch. There are however a couple
1186
of rules that every branch should follow:
1187
 
1188
@itemize @bullet
1189
 
1190
@item All branches ought to be documented in the developer wiki at
1191
@uref{http://developer.classpath.org/mediation/ClasspathBranches}, so
1192
we can know which are live, who owns them, and when they die.
1193
 
1194
@item Some rules can be changed on a branch.  In particular the branch
1195
maintainer can change the review requirements, and the requirement of
1196
keeping things building, testing, etc, can also be lifted.  (These
1197
should be documented along with the branch name and owner if they
1198
differ from the trunk.)
1199
 
1200
@item Requirements for patch email to classpath-patches and for paperwork
1201
@strong{cannot} be lifted. See @ref{Requirements}.
1202
 
1203
@item A branch should not be seen as ``private'' or
1204
``may be completely broken''. It should be as much as possible
1205
something that you work on with a team (and if there is no team - yet
1206
- then there is nothing as bad as having a completely broken build to
1207
get others to help out). There can of course be occasional breakage, but
1208
it should be planned and explained. And you can certainly have a rule
1209
like ``please ask me before committing to this branch''.
1210
 
1211
@item Merges from the trunk to a branch are at the discretion of the
1212
branch maintainer.
1213
 
1214
@item A merge from a branch to the trunk is treated like any other patch.
1215
In particular, it has to go through review, it must satisfy all the
1216
trunk requirements (build, regression test, documentation).
1217
 
1218
@item There may be additional timing requirements on merging a branch to
1219
the trunk depending on the release schedule, etc.  For instance we may
1220
not want to do a branch merge just before a release.
1221
 
1222
@end itemize
1223
 
1224
If any of these rules are unclear please discuss on the list first.
1225
 
1226
@menu
1227
* Writing ChangeLogs::
1228
@end menu
1229
 
1230
@node Writing ChangeLogs,  , Branches, Hacking Code
1231
@comment node-name, next, previous, up
1232
@section Documenting what changed when with ChangeLog entries
1233
 
1234
To keep track of who did what when we keep an explicit ChangeLog entry
1235
together with the code.  This mirrors the CVS commit messages and in
1236
general the ChangeLog entry is the same as the CVS commit message.
1237
This provides an easy way for people getting a (snapshot) release or
1238
without access to the CVS server to see what happened when.  We do not
1239
generate the ChangeLog file automatically from the CVS server since
1240
that is not reliable.
1241
 
1242
A good ChangeLog entry guideline can be found in the Guile Manual at
1243
@uref{http://www.gnu.org/software/guile/changelogs/guile-changelogs_3.html}.
1244
 
1245
Here are some example to explain what should or shouldn't be in a
1246
ChangeLog entry (and the corresponding commit message):
1247
 
1248
@itemize @bullet
1249
 
1250
@item
1251
The first line of a ChangeLog entry should be:
1252
 
1253
@example
1254
[date] <two spaces> [full name] <two spaces> [email-contact]
1255
@end example
1256
 
1257
The second line should be blank. All other lines should be indented
1258
with one tab.
1259
 
1260
@item
1261
Just state what was changed.  Why something is done as it is done in
1262
the current code should be either stated in the code itself or be
1263
added to one of the documentation files (like this Hacking Guide).
1264
 
1265
So don't write:
1266
 
1267
@example
1268
        * java/awt/font/OpenType.java: Remove 'public static final'
1269
        from OpenType tags, reverting the change of 2003-08-11.  See
1270
        Classpath discussion list of 2003-08-11.
1271
@end example
1272
 
1273
Just state:
1274
 
1275
@example
1276
        * java/awt/font/OpenType.java: Remove 'public static final' from
1277
        all member fields.
1278
@end example
1279
 
1280
In this case the reason for the change was added to this guide.
1281
 
1282
@item
1283
Just as with the normal code style guide, don't make lines longer then
1284
80 characters.
1285
 
1286
@item
1287
Just as with comments in the code. The ChangeLog entry should be a
1288
full sentence, starting with a capital and ending with a period.
1289
 
1290
@item
1291
Be precise in what changed, not the effect of the change (which should
1292
be clear from the code/patch).  So don't write:
1293
 
1294
@example
1295
 * java/io/ObjectOutputStream.java : Allow putFields be called more
1296
 than once.
1297
@end example
1298
 
1299
But explain what changed and in which methods it was changed:
1300
 
1301
@example
1302
 * java/io/ObjectOutputStream.java (putFields): Don't call
1303
 markFieldsWritten(). Only create new PutField when
1304
 currentPutField is null.
1305
 (writeFields): Call markFieldsWritten().
1306
@end example
1307
 
1308
@end itemize
1309
 
1310
The above are all just guidelines.  We all appreciate the fact that writing
1311
ChangeLog entries, using a coding style that is not ``your own'' and the
1312
CVS, patch and diff tools do take some time to getting used to.  So don't
1313
feel like you have to do it perfect right away or that contributions
1314
aren't welcome if they aren't ``perfect''.  We all learn by doing and
1315
interacting with each other.
1316
 
1317
 
1318
@node Programming Goals, API Compatibility, Hacking Code, Top
1319
@comment node-name, next, previous, up
1320
@chapter Programming Goals
1321
 
1322
When you write code for Classpath, write with three things in mind, and
1323
in the following order: portability, robustness, and efficiency.
1324
 
1325
If efficiency breaks portability or robustness, then don't do it the
1326
efficient way.  If robustness breaks portability, then bye-bye robust
1327
code.  Of course, as a programmer you would probably like to find sneaky
1328
ways to get around the issue so that your code can be all three ... the
1329
following chapters will give some hints on how to do this.
1330
 
1331
@menu
1332
* Portability::                 Writing Portable Software
1333
* Utility Classes::             Reusing Software
1334
* Robustness::                  Writing Robust Software
1335
* Java Efficiency::             Writing Efficient Java
1336
* Native Efficiency::           Writing Efficient JNI
1337
* Security::                    Writing Secure Software
1338
@end menu
1339
 
1340
@node Portability, Utility Classes, Programming Goals, Programming Goals
1341
@comment node-name, next, previous, up
1342
@section Portability
1343
 
1344
The portability goal for Classpath is the following:
1345
 
1346
@enumerate
1347
@item
1348
native functions for each platform that work across all VMs on that
1349
platform
1350
@item
1351
a single classfile set that work across all VMs on all platforms that
1352
support the native functions.
1353
@end enumerate
1354
 
1355
For almost all of Classpath, this is a very feasible goal, using a
1356
combination of JNI and native interfaces.  This is what you should shoot
1357
for.  For those few places that require knowledge of the Virtual Machine
1358
beyond that provided by the Java standards, the VM Interface was designed.
1359
Read the Virtual Machine Integration Guide for more information.
1360
 
1361
Right now the only supported platform is Linux.  This will change as that
1362
version stabilizes and we begin the effort to port to many other
1363
platforms.  Jikes RVM runs Classpath on AIX, and generally the Jikes
1364
RVM team fixes Classpath to work on that platform.
1365
 
1366
@node Utility Classes, Robustness, Portability, Programming Goals
1367
@comment  node-name,  next,  previous,  up
1368
@section Utility Classes
1369
 
1370
At the moment, we are not very good at reuse of the JNI code.  There
1371
have been some attempts, called @dfn{libclasspath}, to
1372
create generally useful utility classes.  The utility classes are in
1373
the directory @file{native/jni/classpath} and they are mostly declared
1374
in @file{native/jni/classpath/jcl.h}.  These utility classes are
1375
currently only discussed in @ref{Robustness} and in @ref{Native
1376
Efficiency}.
1377
 
1378
There are more utility classes available that could be factored out if
1379
a volunteer wants something nice to hack on.  The error reporting and
1380
exception throwing functions and macros in
1381
@file{native/jni/gtk-peer/gthread-jni.c} might be good
1382
candidates for reuse.  There are also some generally useful utility
1383
functions in @file{gnu_java_awt_peer_gtk_GtkMainThread.c} that could
1384
be split out and put into libclasspath.
1385
 
1386
@node Robustness, Java Efficiency, Utility Classes, Programming Goals
1387
@comment node-name, next, previous, up
1388
@section Robustness
1389
 
1390
Native code is very easy to make non-robust.  (That's one reason Java is
1391
so much better!)  Here are a few hints to make your native code more
1392
robust.
1393
 
1394
Always check return values for standard functions.  It's sometimes easy
1395
to forget to check that malloc() return for an error.  Don't make that
1396
mistake.  (In fact, use JCL_malloc() in the jcl library instead--it will
1397
check the return value and throw an exception if necessary.)
1398
 
1399
Always check the return values of JNI functions, or call
1400
@code{ExceptionOccurred} to check whether an error occurred.  You must
1401
do this after @emph{every} JNI call.  JNI does not work well when an
1402
exception has been raised, and can have unpredictable behavior.
1403
 
1404
Throw exceptions using @code{JCL_ThrowException}.  This guarantees that if
1405
something is seriously wrong, the exception text will at least get out
1406
somewhere (even if it is stderr).
1407
 
1408
Check for null values of @code{jclass}es before you send them to JNI functions.
1409
JNI does not behave nicely when you pass a null class to it: it
1410
terminates Java with a "JNI Panic."
1411
 
1412
In general, try to use functions in @file{native/jni/classpath/jcl.h}.  They
1413
check exceptions and return values and throw appropriate exceptions.
1414
 
1415
@node Java Efficiency, Native Efficiency, Robustness, Programming Goals
1416
@comment node-name, next, previous, up
1417
@section Java Efficiency
1418
 
1419
For methods which explicitly throw a @code{NullPointerException} when an
1420
argument is passed which is null, per a Sun specification, do not write
1421
code like:
1422
 
1423
@example
1424
int
1425
strlen (String foo) throws NullPointerException
1426
@{
1427
  if (foo == null)
1428
    throw new NullPointerException ("foo is null");
1429
  return foo.length ();
1430
@}
1431
@end example
1432
 
1433
Instead, the code should be written as:
1434
 
1435
@example
1436
int
1437
strlen (String foo) throws NullPointerException
1438
@{
1439
  return foo.length ();
1440
@}
1441
@end example
1442
 
1443
Explicitly comparing foo to null is unnecessary, as the virtual machine
1444
will throw a NullPointerException when length() is invoked.  Classpath
1445
is designed to be as fast as possible -- every optimization, no matter
1446
how small, is important.
1447
 
1448
@node Native Efficiency, Security, Java Efficiency, Programming Goals
1449
@comment node-name, next, previous, up
1450
@section Native Efficiency
1451
 
1452
You might think that using native methods all over the place would give
1453
our implementation of Java speed, speed, blinding speed.  You'd be
1454
thinking wrong.  Would you believe me if I told you that an empty
1455
@emph{interpreted} Java method is typically about three and a half times
1456
@emph{faster} than the equivalent native method?
1457
 
1458
Bottom line: JNI is overhead incarnate.  In Sun's implementation, even
1459
the JNI functions you use once you get into Java are slow.
1460
 
1461
A final problem is efficiency of native code when it comes to things
1462
like method calls, fields, finding classes, etc.  Generally you should
1463
cache things like that in static C variables if you're going to use them
1464
over and over again.  GetMethodID(), GetFieldID(), and FindClass() are
1465
@emph{slow}.  Classpath provides utility libraries for caching methodIDs
1466
and fieldIDs in @file{native/jni/classpath/jnilink.h}.  Other native data can
1467
be cached between method calls using functions found in
1468
@file{native/jni/classpath/native_state.h}.
1469
 
1470
Here are a few tips on writing native code efficiently:
1471
 
1472
Make as few native method calls as possible.  Note that this is not the
1473
same thing as doing less in native method calls; it just means that, if
1474
given the choice between calling two native methods and writing a single
1475
native method that does the job of both, it will usually be better to
1476
write the single native method.  You can even call the other two native
1477
methods directly from your native code and not incur the overhead of a
1478
method call from Java to C.
1479
 
1480
Cache @code{jmethodID}s and @code{jfieldID}s wherever you can.  String
1481
lookups are
1482
expensive.  The best way to do this is to use the
1483
@file{native/jni/classpath/jnilink.h}
1484
library.  It will ensure that @code{jmethodID}s are always valid, even if the
1485
class is unloaded at some point.  In 1.1, jnilink simply caches a
1486
@code{NewGlobalRef()} to the method's underlying class; however, when 1.2 comes
1487
along, it will use a weak reference to allow the class to be unloaded
1488
and then re-resolve the @code{jmethodID} the next time it is used.
1489
 
1490
Cache classes that you need to access often.  jnilink will help with
1491
this as well.  The issue here is the same as the methodID and fieldID
1492
issue--how to make certain the class reference remains valid.
1493
 
1494
If you need to associate native C data with your class, use Paul
1495
Fisher's native_state library (NSA).  It will allow you to get and set
1496
state fairly efficiently.  Japhar now supports this library, making
1497
native state get and set calls as fast as accessing a C variable
1498
directly.
1499
 
1500
If you are using native libraries defined outside of Classpath, then
1501
these should be wrapped by a Classpath function instead and defined
1502
within a library of their own.  This makes porting Classpath's native
1503
libraries to new platforms easier in the long run.  It would be nice
1504
to be able to use Mozilla's NSPR or Apache's APR, as these libraries
1505
are already ported to numerous systems and provide all the necessary
1506
system functions as well.
1507
 
1508
@node Security,  , Native Efficiency, Programming Goals
1509
@comment  node-name,  next,  previous,  up
1510
@section Security
1511
 
1512
Security is such a huge topic it probably deserves its own chapter.
1513
Most of the current code needs to be audited for security to ensure
1514
all of the proper security checks are in place within the Java
1515
platform, but also to verify that native code is reasonably secure and
1516
avoids common pitfalls, buffer overflows, etc.  A good source for
1517
information on secure programming is the excellent HOWTO by David
1518
Wheeler,
1519
@uref{http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/index.html,Secure
1520
Programming for Linux and Unix HOWTO}.
1521
 
1522
@node API Compatibility, Specification Sources, Programming Goals, Top
1523
@comment  node-name,  next,  previous,  up
1524
@chapter API Compatibility
1525
 
1526
@menu
1527
* Serialization::               Serialization
1528
* Deprecated Methods::          Deprecated methods
1529
@end menu
1530
 
1531
@node Serialization, Deprecated Methods, API Compatibility, API Compatibility
1532
@comment  node-name,  next,  previous,  up
1533
@section Serialization
1534
 
1535
Sun has produced documentation concerning much of the information
1536
needed to make Classpath serializable compatible with Sun
1537
implementations.  Part of doing this is to make sure that every class
1538
that is Serializable actually defines a field named serialVersionUID
1539
with a value that matches the output of serialver on Sun's
1540
implementation.  The reason for doing this is below.
1541
 
1542
If a class has a field (of any accessibility) named serialVersionUID
1543
of type long, that is what serialver uses. Otherwise it computes a
1544
value using some sort of hash function on the names of all method
1545
signatures in the .class file.  The fact that different compilers
1546
create different synthetic method signatures, such as access$0() if an
1547
inner class needs access to a private member of an enclosing class,
1548
make it impossible for two distinct compilers to reliably generate the
1549
same serial #, because their .class files differ. However, once you
1550
have a .class file, its serial # is unique, and the computation will
1551
give the same result no matter what platform you execute on.
1552
 
1553
Serialization compatibility can be tested using tools provided with
1554
@uref{http://www.kaffe.org/~stuart/japi/,Japitools}.  These
1555
tools can test binary serialization compatibility and also provide
1556
information about unknown serialized formats by writing these in XML
1557
instead.  Japitools is also the primary means of checking API
1558
compatibility for GNU Classpath with Sun's Java Platform.
1559
 
1560
@node Deprecated Methods,  , Serialization, API Compatibility
1561
@comment  node-name,  next,  previous,  up
1562
@section Deprecated Methods
1563
 
1564
Sun has a practice of creating ``alias'' methods, where a public or
1565
protected method is deprecated in favor of a new one that has the same
1566
function but a different name.  Sun's reasons for doing this vary; as
1567
an example, the original name may contain a spelling error or it may
1568
not follow Java naming conventions.
1569
 
1570
Unfortunately, this practice complicates class library code that calls
1571
these aliased methods.  Library code must still call the deprecated
1572
method so that old client code that overrides it continues to work.
1573
But library code must also call the new version, because new code is
1574
expected to override the new method.
1575
 
1576
The correct way to handle this (and the way Sun does it) may seem
1577
counterintuitive because it means that new code is less efficient than
1578
old code: the new method must call the deprecated method, and throughout
1579
the library code calls to the old method must be replaced with calls to
1580
the new one.
1581
 
1582
Take the example of a newly-written container laying out a component and
1583
wanting to know its preferred size.  The Component class has a
1584
deprecated preferredSize method and a new method, getPreferredSize.
1585
Assume that the container is laying out an old component that overrides
1586
preferredSize and a new component that overrides getPreferredSize.  If
1587
the container calls getPreferredSize and the default implementation of
1588
getPreferredSize calls preferredSize, then the old component will have
1589
its preferredSize method called and new code will have its
1590
getPreferredSize method called.
1591
 
1592
Even using this calling scheme, an old component may still be laid out
1593
improperly if it implements a method, getPreferredSize, that has the
1594
same signature as the new Component.getPreferredSize.  But that is a
1595
general problem -- adding new public or protected methods to a
1596
widely-used class that calls those methods internally is risky, because
1597
existing client code may have already declared methods with the same
1598
signature.
1599
 
1600
The solution may still seem counterintuitive -- why not have the
1601
deprecated method call the new method, then have the library always call
1602
the old method?  One problem with that, using the preferred size example
1603
again, is that new containers, which will use the non-deprecated
1604
getPreferredSize, will not get the preferred size of old components.
1605
 
1606
@node Specification Sources, Naming Conventions, API Compatibility, Top
1607
@comment node-name, next, previous, up
1608
@chapter Specification Sources
1609
 
1610
There are a number of specification sources to use when working on
1611
Classpath.  In general, the only place you'll find your classes
1612
specified is in the JavaDoc documentation or possibly in the
1613
corresponding white paper.  In the case of java.lang, java.io and
1614
java.util, you should look at the Java Language Specification.
1615
 
1616
Here, however, is a list of specs, in order of canonicality:
1617
 
1618
@enumerate
1619
@item
1620
@uref{http://java.sun.com/docs/books/jls/clarify.html,Clarifications and Amendments to the JLS - 1.1}
1621
@item
1622
@uref{http://java.sun.com/docs/books/jls/html/1.1Update.html,JLS Updates
1623
- 1.1}
1624
@item
1625
@uref{http://java.sun.com/docs/books/jls/html/index.html,The 1.0 JLS}
1626
@item
1627
@uref{http://java.sun.com/docs/books/vmspec/index.html,JVM spec - 1.1}
1628
@item
1629
@uref{http://java.sun.com/products/jdk/1.1/docs/guide/jni/spec/jniTOC.doc.html,JNI spec - 1.1}
1630
@item
1631
@uref{http://java.sun.com/products/jdk/1.1/docs/api/packages.html,Sun's javadoc - 1.1}
1632
(since Sun's is the reference implementation, the javadoc is
1633
documentation for the Java platform itself.)
1634
@item
1635
@uref{http://java.sun.com/products/jdk/1.2/docs/guide/jvmdi/jvmdi.html,JVMDI spec - 1.2},
1636
@uref{http://java.sun.com/products/jdk/1.2/docs/guide/jni/jni-12.html,JNI spec - 1.2}
1637
(sometimes gives clues about unspecified things in 1.1; if
1638
it was not specified accurately in 1.1, then use the spec
1639
for 1.2; also, we are using JVMDI in this project.)
1640
@item
1641
@uref{http://java.sun.com/products/jdk/1.2/docs/api/frame.html,Sun's javadoc - 1.2}
1642
(sometimes gives clues about unspecified things in 1.1; if
1643
it was not specified accurately in 1.1, then use the spec
1644
for 1.2)
1645
@item
1646
@uref{http://developer.java.sun.com/developer/bugParade/index.html,The
1647
Bug Parade}: I have obtained a ton of useful information about how
1648
things do work and how they *should* work from the Bug Parade just by
1649
searching for related bugs.  The submitters are very careful about their
1650
use of the spec.  And if something is unspecified, usually you can find
1651
a request for specification or a response indicating how Sun thinks it
1652
should be specified here.
1653
@end enumerate
1654
 
1655
You'll notice that in this document, white papers and specification
1656
papers are more canonical than the JavaDoc documentation.  This is true
1657
in general.
1658
 
1659
 
1660
@node Naming Conventions, Character Conversions, Specification Sources, Top
1661
@comment node-name, next, previous, up
1662
@chapter Directory and File Naming Conventions
1663
 
1664
The Classpath directory structure is laid out in the following manner:
1665
 
1666
@example
1667
classpath
1668
 |
1669
 |---->java
1670
 |       |
1671
 |       |-->awt
1672
 |       |-->io
1673
 |       |-->lang
1674
 |       |-->util
1675
 |       |     |
1676
 |       |     |--->zip
1677
 |       |     |--->jar
1678
 |       |-->net
1679
 |       |-->etc
1680
 |
1681
 |---->gnu
1682
 |       |
1683
 |       |-->java
1684
 |             |
1685
 |             |-->awt
1686
 |             |-->lang
1687
 |             |-->util
1688
 |             |     |
1689
 |             |     |-->zip
1690
 |             |-->etc
1691
 |
1692
 |---->native
1693
         |
1694
         |-->jni
1695
         |    |-->classpath
1696
         |    |-->gtk-peer
1697
         |    |-->java-io
1698
         |    |-->java-lang
1699
         |    |-->java-net
1700
         |    |-->java-util
1701
         |    |-->etc
1702
         |-->cni
1703
 
1704
@end example
1705
 
1706
Here is a brief description of the toplevel directories and their contents.
1707
 
1708
@table @b
1709
 
1710
@item java
1711
Contains the source code to the Java packages that make up the core
1712
class library.  Because this is the public interface to Java, it is
1713
important that the public classes, interfaces, methods, and variables
1714
are exactly the same as specified in Sun's documentation.  The directory
1715
structure is laid out just like the java package names.  For example,
1716
the class java.util.zip would be in the directory java-util.
1717
 
1718
@item gnu/java
1719
Internal classes (roughly analogous to Sun's sun.* classes) should go
1720
under the @file{gnu/java} directory.  Classes related to a particular public
1721
Java package should go in a directory named like that package.  For
1722
example, classes related to java.util.zip should go under a directory
1723
@file{gnu/java/util/zip}.  Sub-packages under the main package name are
1724
allowed.  For classes spanning multiple public Java packages, pick an
1725
appropriate name and see what everybody else thinks.
1726
 
1727
@item native
1728
This directory holds native code needed by the public Java packages.
1729
Each package has its own subdirectory, which is the ``flattened'' name
1730
of the package.  For example, native method implementations for
1731
java.util.zip should go in @file{native/classpath/java-util}.  Classpath
1732
actually includes an all Java version of the zip classes, so no native
1733
code is required.
1734
 
1735
@end table
1736
 
1737
Each person working on a package get's his or her own ``directory
1738
space'' underneath each of the toplevel directories.  In addition to the
1739
general guidelines above, the following standards should be followed:
1740
 
1741
@itemize @bullet
1742
 
1743
@item
1744
Classes that need to load native code should load a library with the
1745
same name as the flattened package name, with all hyphens removed.  For
1746
example, the native library name specified in LoadLibrary for
1747
java-util would be ``javautil''.
1748
 
1749
@item
1750
Each package has its own shared library for native code (if any).
1751
 
1752
@item
1753
The main native method implementation for a given method in class should
1754
go in a file with the same name as the class with a ``.c'' extension.
1755
For example, the JNI implementation of the native methods in
1756
java.net.InetAddress would go in @file{native/jni/java-net/InetAddress.c}.
1757
``Internal'' native functions called from the main native method can
1758
reside in files of any name.
1759
@end itemize
1760
 
1761
@node Character Conversions, Localization, Naming Conventions, Top
1762
@comment node-name, next, previous, up
1763
@chapter Character Conversions
1764
 
1765
Java uses the Unicode character encoding system internally.  This is a
1766
sixteen bit (two byte) collection of characters encompassing most of the
1767
world's written languages.  However, Java programs must often deal with
1768
outside interfaces that are byte (eight bit) oriented.  For example, a
1769
Unix file, a stream of data from a network socket, etc.  Beginning with
1770
Java 1.1, the @code{Reader} and @code{Writer} classes provide functionality
1771
for dealing with character oriented streams.  The classes
1772
@code{InputStreamReader} and @code{OutputStreamWriter} bridge the gap
1773
between byte streams and character streams by converting bytes to
1774
Unicode characters and vice versa.
1775
 
1776
In Classpath, @code{InputStreamReader} and @code{OutputStreamWriter}
1777
rely on an internal class called @code{gnu.java.io.EncodingManager} to load
1778
translators that perform the actual conversion.  There are two types of
1779
converters, encoders and decoders.  Encoders are subclasses of
1780
@code{gnu.java.io.encoder.Encoder}.  This type of converter takes a Java
1781
(Unicode) character stream or buffer and converts it to bytes using
1782
a specified encoding scheme.  Decoders are a subclass of
1783
@code{gnu.java.io.decoder.Decoder}.  This type of converter takes a
1784
byte stream or buffer and converts it to Unicode characters.  The
1785
@code{Encoder} and @code{Decoder} classes are subclasses of
1786
@code{Writer} and @code{Reader} respectively, and so can be used in
1787
contexts that require character streams, but the Classpath implementation
1788
currently does not make use of them in this fashion.
1789
 
1790
The @code{EncodingManager} class searches for requested encoders and
1791
decoders by name.  Since encoders and decoders are separate in Classpath,
1792
it is possible to have a decoder without an encoder for a particular
1793
encoding scheme, or vice versa.  @code{EncodingManager} searches the
1794
package path specified by the @code{file.encoding.pkg} property.  The
1795
name of the encoder or decoder is appended to the search path to
1796
produce the required class name.  Note that @code{EncodingManager} knows
1797
about the default system encoding scheme, which it retrieves from the
1798
system property @code{file.encoding}, and it will return the proper
1799
translator for the default encoding if no scheme is specified.  Also, the
1800
Classpath standard translator library, which is the @code{gnu.java.io} package,
1801
is automatically appended to the end of the path.
1802
 
1803
For efficiency, @code{EncodingManager} maintains a cache of translators
1804
that it has loaded.  This eliminates the need to search for a commonly
1805
used translator each time it is requested.
1806
 
1807
Finally, @code{EncodingManager} supports aliasing of encoding scheme names.
1808
For example, the ISO Latin-1 encoding scheme can be referred to as
1809
''8859_1'' or ''ISO-8859-1''.  @code{EncodingManager} searches for
1810
aliases by looking for the existence of a system property called
1811
@code{gnu.java.io.encoding_scheme_alias.<encoding name>}.  If such a
1812
property exists.  The value of that property is assumed to be the
1813
canonical name of the encoding scheme, and a translator with that name is
1814
looked up instead of one with the original name.
1815
 
1816
Here is an example of how @code{EncodingManager} works.  A class requests
1817
a decoder for the ''UTF-8'' encoding scheme by calling
1818
@code{EncodingManager.getDecoder("UTF-8")}.  First, an alias is searched
1819
for by looking for the system property
1820
@code{gnu.java.io.encoding_scheme_alias.UTF-8}.  In our example, this
1821
property exists and has the value ''UTF8''.  That is the actual
1822
decoder that will be searched for.  Next, @code{EncodingManager} looks
1823
in its cache for this translator.  Assuming it does not find it, it
1824
searches the translator path, which is this example consists only of
1825
the default @code{gnu.java.io}.  The ''decoder'' package name is
1826
appended since we are looking for a decoder.  (''encoder'' would be
1827
used if we were looking for an encoder).  Then name name of the translator
1828
is appended.  So @code{EncodingManager} attempts to load a translator
1829
class called @code{gnu.java.io.decoder.UTF8}.  If that class is found,
1830
an instance of it is returned.  If it is not found, a
1831
@code{UnsupportedEncodingException}.
1832
 
1833
To write a new translator, it is only necessary to subclass
1834
@code{Encoder} and/or @code{Decoder}.  Only a handful of abstract
1835
methods need to be implemented.  In general, no methods need to be
1836
overridden.  The needed methods calculate the number of bytes/chars
1837
that the translation will generate, convert buffers to/from bytes,
1838
and read/write a requested number of characters to/from a stream.
1839
 
1840
Many common encoding schemes use only eight bits to encode characters.
1841
Writing a translator for these encodings is very easy.  There are
1842
abstract translator classes @code{gnu.java.io.decode.DecoderEightBitLookup}
1843
and @code{gnu.java.io.encode.EncoderEightBitLookup}.  These classes
1844
implement all of the necessary methods.  All that is necessary to
1845
create a lookup table array that maps bytes to Unicode characters and
1846
set the class variable @code{lookup_table} equal to it in a static
1847
initializer.  Also, a single constructor that takes an appropriate
1848
stream as an argument must be supplied.  These translators are
1849
exceptionally easy to create and there are several of them supplied
1850
in the Classpath distribution.
1851
 
1852
Writing multi-byte or variable-byte encodings is more difficult, but
1853
often not especially challenging.  The Classpath distribution ships with
1854
translators for the UTF8 encoding scheme which uses from one to three
1855
bytes to encode Unicode characters.  This can serve as an example of
1856
how to write such a translator.
1857
 
1858
Many more translators are needed.  All major character encodings should
1859
eventually be supported.
1860
 
1861
@node Localization,  , Character Conversions, Top
1862
@comment node-name, next, previous, up
1863
@chapter Localization
1864
 
1865
There are many parts of the Java standard runtime library that must
1866
be customized to the particular locale the program is being run in.
1867
These include the parsing and display of dates, times, and numbers;
1868
sorting words alphabetically; breaking sentences into words, etc.
1869
In general, Classpath uses general classes for performing these tasks,
1870
and customizes their behavior with configuration data specific to a
1871
given locale.
1872
 
1873
@menu
1874
* String Collation::            Sorting strings in different locales
1875
* Break Iteration::             Breaking up text into words, sentences, and lines
1876
* Date Formatting and Parsing::  Locale specific date handling
1877
* Decimal/Currency Formatting and Parsing::  Local specific number handling
1878
@end menu
1879
 
1880
In Classpath, all locale specific data is stored in a
1881
@code{ListResourceBundle} class in the package @code{gnu/java/locale}.
1882
The basename of the bundle is @code{LocaleInformation}.  See the
1883
documentation for the @code{java.util.ResourceBundle} class for details
1884
on how the specific locale classes should be named.
1885
 
1886
@code{ListResourceBundle}'s are used instead of
1887
@code{PropertyResourceBundle}'s because data more complex than simple
1888
strings need to be provided to configure certain Classpath components.
1889
Because @code{ListResourceBundle} allows an arbitrary Java object to
1890
be associated with a given configuration option, it provides the
1891
needed flexibility to accomodate Classpath's needs.
1892
 
1893
Each Java library component that can be localized requires that certain
1894
configuration options be specified in the resource bundle for it.  It is
1895
important that each and every option be supplied for a specific
1896
component or a critical runtime error will most likely result.
1897
 
1898
As a standard, each option should be assigned a name that is a string.
1899
If the value is stored in a class or instance variable, then the option
1900
should name should have the name name as the variable.  Also, the value
1901
associated with each option should be a Java object with the same name
1902
as the option name (unless a simple scalar value is used).  Here is an
1903
example:
1904
 
1905
A class loads a value for the @code{format_string} variable from the
1906
resource bundle in the specified locale.  Here is the code in the
1907
library class:
1908
 
1909
@example
1910
  ListResourceBundle lrb =
1911
    ListResourceBundle.getBundle ("gnu/java/locale/LocaleInformation", locale);
1912
  String format_string = lrb.getString ("format_string");
1913
@end example
1914
 
1915
In the actual resource bundle class, here is how the configuration option
1916
gets defined:
1917
 
1918
@example
1919
/**
1920
  * This is the format string used for displaying values
1921
  */
1922
private static final String format_string = "%s %d %i";
1923
 
1924
private static final Object[][] contents =
1925
@{
1926
  @{ "format_string", format_string @}
1927
@};
1928
@end example
1929
 
1930
Note that each variable should be @code{private}, @code{final}, and
1931
@code{static}.  Each variable should also have a description of what it
1932
does as a documentation comment.  The @code{getContents()} method returns
1933
the @code{contents} array.
1934
 
1935
There are many functional areas of the standard class library that are
1936
configured using this mechanism.  A given locale does not need to support
1937
each functional area.  But if a functional area is supported, then all
1938
of the specified entries for that area must be supplied.  In order to
1939
determine which functional areas are supported, there is a special key
1940
that is queried by the affected class or classes.  If this key exists,
1941
and has a value that is a @code{Boolean} object wrappering the
1942
@code{true} value, then full support is assumed.  Otherwise it is
1943
assumed that no support exists for this functional area.  Every class
1944
using resources for configuration must use this scheme and define a special
1945
scheme that indicates the functional area is supported.  Simply checking
1946
for the resource bundle's existence is not sufficient to ensure that a
1947
given functional area is supported.
1948
 
1949
The following sections define the functional areas that use resources
1950
for locale specific configuration in GNU Classpath.  Please refer to the
1951
documentation for the classes mentioned for details on how these values
1952
are used.  You may also wish to look at the source file for
1953
@file{gnu/java/locale/LocaleInformation_en} as an example.
1954
 
1955
@node String Collation, Break Iteration, Localization, Localization
1956
@comment node-name, next, previous, up
1957
@section String Collation
1958
 
1959
Collation involves the sorting of strings.  The Java class library provides
1960
a public class called @code{java.text.RuleBasedCollator} that performs
1961
sorting based on a set of sorting rules.
1962
 
1963
@itemize @bullet
1964
@item RuleBasedCollator - A @code{Boolean} wrappering @code{true} to indicate
1965
that this functional area is supported.
1966
@item collation_rules - The rules the specify how string collation is to
1967
be performed.
1968
@end itemize
1969
 
1970
Note that some languages might be too complex for @code{RuleBasedCollator}
1971
to handle.  In this case an entirely new class might need to be written in
1972
lieu of defining this rule string.
1973
 
1974
@node Break Iteration, Date Formatting and Parsing, String Collation, Localization
1975
@comment node-name, next, previous, up
1976
@section Break Iteration
1977
 
1978
The class @code{java.text.BreakIterator} breaks text into words, sentences,
1979
and lines.  It is configured with the following resource bundle entries:
1980
 
1981
@itemize @bullet
1982
@item BreakIterator - A @code{Boolean} wrappering @code{true} to indicate
1983
that this functional area is supported.
1984
@item word_breaks - A @code{String} array of word break character sequences.
1985
@item sentence_breaks - A @code{String} array of sentence break character
1986
sequences.
1987
@item line_breaks - A @code{String} array of line break character sequences.
1988
@end itemize
1989
 
1990
@node Date Formatting and Parsing, Decimal/Currency Formatting and Parsing, Break Iteration, Localization
1991
@comment node-name, next, previous, up
1992
@section Date Formatting and Parsing
1993
 
1994
Date formatting and parsing is handled by the
1995
@code{java.text.SimpleDateFormat} class in most locales.  This class is
1996
configured by attaching an instance of the @code{java.text.DateFormatSymbols}
1997
class.  That class simply reads properties from our locale specific
1998
resource bundle.  The following items are required (refer to the
1999
documentation of the @code{java.text.DateFormatSymbols} class for details
2000
io what the actual values should be):
2001
 
2002
@itemize @bullet
2003
@item DateFormatSymbols - A @code{Boolean} wrappering @code{true} to indicate
2004
that this functional area is supported.
2005
@item months - A @code{String} array of month names.
2006
@item shortMonths - A @code{String} array of abbreviated month names.
2007
@item weekdays - A @code{String} array of weekday names.
2008
@item shortWeekdays - A @code{String} array of abbreviated weekday names.
2009
@item ampms - A @code{String} array containing AM/PM names.
2010
@item eras - A @code{String} array containing era (i.e., BC/AD) names.
2011
@item zoneStrings - An array of information about valid timezones for this
2012
locale.
2013
@item localPatternChars - A @code{String} defining date/time pattern symbols.
2014
@item shortDateFormat - The format string for dates used by
2015
@code{DateFormat.SHORT}
2016
@item mediumDateFormat - The format string for dates used by
2017
@code{DateFormat.MEDIUM}
2018
@item longDateFormat - The format string for dates used by
2019
@code{DateFormat.LONG}
2020
@item fullDateFormat - The format string for dates used by
2021
@code{DateFormat.FULL}
2022
@item shortTimeFormat - The format string for times used by
2023
@code{DateFormat.SHORT}
2024
@item mediumTimeFormat - The format string for times used by
2025
@code{DateFormat.MEDIUM}
2026
@item longTimeFormat - The format string for times used by
2027
@code{DateFormat.LONG}
2028
@item fullTimeFormat - The format string for times used by
2029
@code{DateFormat.FULL}
2030
@end itemize
2031
 
2032
Note that it may not be possible to use this mechanism for all locales.
2033
In those cases a special purpose class may need to be written to handle
2034
date/time processing.
2035
 
2036
@node Decimal/Currency Formatting and Parsing,  , Date Formatting and Parsing, Localization
2037
@comment node-name, next, previous, up
2038
@section Decimal/Currency Formatting and Parsing
2039
 
2040
@code{NumberFormat} is an abstract class for formatting and parsing numbers.
2041
The class @code{DecimalFormat} provides a concrete subclass that handles
2042
this is in a locale independent manner.  As with @code{SimpleDateFormat},
2043
this class gets information on how to format numbers from a class that
2044
wrappers a collection of locale specific formatting values.  In this case,
2045
the class is @code{DecimalFormatSymbols}.  That class reads its default
2046
values for a locale from the resource bundle.  The required entries are:
2047
 
2048
@itemize @bullet
2049
@item DecimalFormatSymbols - A @code{Boolean} wrappering @code{true} to
2050
indicate that this functional area is supported.
2051
@item currencySymbol - The string representing the local currency.
2052
@item intlCurrencySymbol - The string representing the local currency in an
2053
international context.
2054
@item decimalSeparator - The character to use as the decimal point as a
2055
@code{String}.
2056
@item digit - The character used to represent digits in a format string,
2057
as a @code{String}.
2058
@item exponential - The char used to represent the exponent separator of a
2059
number written in scientific notation, as a @code{String}.
2060
@item groupingSeparator - The character used to separate groups of numbers
2061
in a large number, such as the ``,'' separator for thousands in the US, as
2062
a @code{String}.
2063
@item infinity - The string representing infinity.
2064
@item NaN - The string representing the Java not a number value.
2065
@item minusSign - The character representing the negative sign, as a
2066
@code{String}.
2067
@item monetarySeparator - The decimal point used in currency values, as a
2068
@code{String}.
2069
@item patternSeparator - The character used to separate positive and
2070
negative format patterns, as a @code{String}.
2071
@item percent - The percent sign, as a @code{String}.
2072
@item perMill - The per mille sign, as a @code{String}.
2073
@item zeroDigit - The character representing the digit zero, as a @code{String}.
2074
@end itemize
2075
 
2076
Note that several of these values are an individual character.  These should
2077
be wrappered in a @code{String} at character position 0, not in a
2078
@code{Character} object.
2079
 
2080
@bye
2081
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.