summaryrefslogtreecommitdiffstats
path: root/libjava/classpath/doc/hacking.texinfo
diff options
context:
space:
mode:
authordoko <doko@138bc75d-0d04-0410-961f-82ee72b054a4>2007-02-20 19:46:57 +0000
committerdoko <doko@138bc75d-0d04-0410-961f-82ee72b054a4>2007-02-20 19:46:57 +0000
commit707c3e73cc2c43e52f7892c8e76f310a623ed9e2 (patch)
treeaae88e448e141dd8326be37982ec5dec34305862 /libjava/classpath/doc/hacking.texinfo
parentf64551e5c5e11d51f69d934198a9f9be55b04aa4 (diff)
downloadppe42-gcc-707c3e73cc2c43e52f7892c8e76f310a623ed9e2.tar.gz
ppe42-gcc-707c3e73cc2c43e52f7892c8e76f310a623ed9e2.zip
ChangeLog
2007-02-20 Matthias Klose <doko@ubuntu.com> * doc/Makefile.am: Add rules to build and install man pages from texinfo docs. * doc/hacking.texinfo doc/tools.texinfo, doc/vmintegration.texinfo: Rename, prefix files with "cp-". * doc/cp-tools.texinfo: Add markup for man page generation, add documentation for command line options for gjar, gjavah, gnative2ascii, gorbd, grmid, grmiregistry, gserialver, gtnameserv. doc/texi2pod.pl: New, taken from the GCC sources. ChangeLog.gcj 2007-02-20 Matthias Klose <doko@ubuntu.com> * Merge doc update from classpath HEAD. * doc/texi2pod.pl: Not imported. * doc/Makefile.am: Use GCC's texi2pod.pl * doc/Makefile.in: Regenerate. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122170 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/classpath/doc/hacking.texinfo')
-rw-r--r--libjava/classpath/doc/hacking.texinfo1733
1 files changed, 0 insertions, 1733 deletions
diff --git a/libjava/classpath/doc/hacking.texinfo b/libjava/classpath/doc/hacking.texinfo
deleted file mode 100644
index efb7aa903c0..00000000000
--- a/libjava/classpath/doc/hacking.texinfo
+++ /dev/null
@@ -1,1733 +0,0 @@
-\input texinfo @c -*-texinfo-*-
-
-@c %**start of header
-@setfilename hacking.info
-@settitle GNU Classpath Hacker's Guide
-@c %**end of header
-
-@setchapternewpage off
-
-@ifinfo
-This file contains important information you will need to know if you
-are going to hack on the GNU Classpath project code.
-
-Copyright (C) 1998,1999,2000,2001,2002,2003,2004, 2005 Free Software Foundation, Inc.
-
-@ifnotplaintext
-@dircategory GNU Libraries
-@direntry
-* Classpath Hacking: (hacking). GNU Classpath Hacker's Guide
-@end direntry
-@end ifnotplaintext
-@end ifinfo
-
-@titlepage
-@title GNU Classpath Hacker's Guide
-@author Aaron M. Renn
-@author Paul N. Fisher
-@author John Keiser
-@author C. Brian Jones
-@author Mark J. Wielaard
-
-@page
-@vskip 0pt plus 1filll
-Copyright @copyright{} 1998,1999,2000,2001,2002,2003,2004 Free Software Foundation, Inc.
-@sp 2
-Permission is granted to make and distribute verbatim copies of
-this document provided the copyright notice and this permission notice
-are preserved on all copies.
-
-Permission is granted to copy and distribute modified versions of this
-document under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-
-Permission is granted to copy and distribute translations of this manual
-into another language, under the above conditions for modified versions,
-except that this permission notice may be stated in a translation
-approved by the Free Software Foundation.
-
-@end titlepage
-
-@ifinfo
-@node Top, Introduction, (dir), (dir)
-@top GNU Classpath Hacker's Guide
-
-This document contains important information you'll want to know if
-you want to hack on GNU Classpath, Essential Libraries for Java, to
-help create free core class libraries for use with virtual machines
-and compilers for the java programming language.
-@end ifinfo
-
-@menu
-* Introduction:: An introduction to the GNU Classpath project
-* Requirements:: Very important rules that must be followed
-* Volunteering:: So you want to help out
-* Project Goals:: Goals of the GNU Classpath project
-* Needed Tools and Libraries:: A list of programs and libraries you will need
-* Programming Standards:: Standards to use when writing code
-* Hacking Code:: Working on code, Working with others
-* Programming Goals:: What to consider when writing code
-* API Compatibility:: How to handle serialization and deprecated methods
-* Specification Sources:: Where to find class library specs
-* Naming Conventions:: How files and directories are named
-* Character Conversions:: Working on Character conversions
-* Localization:: How to handle localization/internationalization
-
-@detailmenu
- --- The Detailed Node Listing ---
-
-Programming Standards
-
-* Source Code Style Guide::
-
-Working on the code, Working with others
-
-* Branches::
-* Writing ChangeLogs::
-
-Working with branches
-
-* Writing ChangeLogs::
-
-Programming Goals
-
-* Portability:: Writing Portable Software
-* Utility Classes:: Reusing Software
-* Robustness:: Writing Robust Software
-* Java Efficiency:: Writing Efficient Java
-* Native Efficiency:: Writing Efficient JNI
-* Security:: Writing Secure Software
-
-API Compatibility
-
-* Serialization:: Serialization
-* Deprecated Methods:: Deprecated methods
-
-Localization
-
-* String Collation:: Sorting strings in different locales
-* Break Iteration:: Breaking up text into words, sentences, and lines
-* Date Formatting and Parsing:: Locale specific date handling
-* Decimal/Currency Formatting and Parsing:: Local specific number handling
-
-@end detailmenu
-@end menu
-
-@node Introduction, Requirements, Top, Top
-@comment node-name, next, previous, up
-@chapter Introduction
-
-The GNU Classpath Project is a dedicated to providing a 100% free,
-clean room implementation of the standard core class libraries for
-compilers and runtime environments for the java programming language.
-It offers free software developers an alternative core library
-implementation upon which larger java-like programming environments
-can be build. The GNU Classpath Project was started in the Spring of
-1998 as an official Free Software Foundation project. Most of the
-volunteers working on GNU Classpath do so in their spare time, but a
-couple of projects based on GNU Classpath have paid programmers to
-improve the core libraries. We appreciate everyone's efforts in the
-past to improve and help the project and look forward to future
-contributions by old and new members alike.
-
-@node Requirements, Volunteering, Introduction, Top
-@comment node-name, next, previous, up
-@chapter Requirements
-
-Although GNU Classpath is following an open development model where input
-from developers is welcome, there are certain base requirements that
-need to be met by anyone who wants to contribute code to this project.
-They are mostly dictated by legal requirements and are not arbitrary
-restrictions chosen by the GNU Classpath team.
-
-You will need to adhere to the following things if you want to donate
-code to the GNU Classpath project:
-
-@itemize @bullet
-@item
-@strong{Never under any circumstances refer to proprietary code while
-working on GNU Classpath.} It is best if you have never looked at
-alternative proprietary core library code at all. To reduce
-temptation, it would be best if you deleted the @file{src.zip} file
-from your proprietary JDK distribution (note that recent versions of
-GNU Classpath and the compilers and environments build on it are
-mature enough to not need any proprietary implementation at all when
-working on GNU Classpath, except in exceptional cases where you need
-to test compatibility issues pointed out by users). If you have
-signed Sun's non-disclosure statement, then you unfortunately cannot
-work on Classpath code at all. If you have any reason to believe that
-your code might be ``tainted'', please say something on the mailing
-list before writing anything. If it turns out that your code was not
-developed in a clean room environment, we could be very embarrassed
-someday in court. Please don't let that happen.
-
-@item
-@strong{Never decompile proprietary class library implementations.} While
-the wording of the license in Sun's Java 2 releases has changed, it is
-not acceptable, under any circumstances, for a person working on
-GNU Classpath to decompile Sun's class libraries. Allowing the use of
-decompilation in the GNU Classpath project would open up a giant can of
-legal worms, which we wish to avoid.
-
-@item
-Classpath is licensed under the terms of the
-@uref{http://www.fsf.org/copyleft/gpl.html,GNU General Public
-License}, with a special exception included to allow linking with
-non-GPL licensed works as long as no other license would restrict such
-linking. To preserve freedom for all users and to maintain uniform
-licensing of Classpath, we will not accept code into the main
-distribution that is not licensed under these terms. The exact
-wording of the license of the current version of GNU Classpath can be
-found online from the
-@uref{http://www.gnu.org/software/classpath/license.html, GNU
-Classpath license page} and is of course distributed with current
-snapshot release from @uref{ftp://ftp.gnu.org/gnu/classpath/} or by
-obtaining a copy of the current CVS tree.
-
-@item
-GNU Classpath is GNU software and this project is being officially sponsored
-by the @uref{http://www.fsf.org/,Free Software Foundation}. Because of
-this, the FSF will hold copyright to all code developed as part of
-GNU Classpath. This will allow them to pursue copyright violators in court,
-something an individual developer may neither have the time nor
-resources to do. Everyone contributing code to GNU Classpath will need to
-sign a copyright assignment statement. Additionally, if you are
-employed as a programmer, your employer may need to sign a copyright
-waiver disclaiming all interest in the software. This may sound harsh,
-but unfortunately, it is the only way to ensure that the code you write
-is legally yours to distribute.
-@end itemize
-
-@node Volunteering, Project Goals, Requirements, Top
-@comment node-name, next, previous, up
-@chapter Volunteering to Help
-
-The GNU Classpath project needs volunteers to help us out. People are
-needed to write unimplemented core packages, to test GNU Classpath on
-free software programs written in the java programming language, to
-test it on various platforms, and to port it to platforms that are
-currently unsupported.
-
-While pretty much all contributions are welcome (but see
-@pxref{Requirements}) it is always preferable that volunteers do the
-whole job when volunteering for a task. So when you volunteer to write
-a Java package, please be willing to do the following:
-
-@itemize @bullet
-@item
-Implement a complete drop-in replacement for the particular package.
-That means implementing any ``internal'' classes. For example, in the
-java.net package, there are non-public classes for implementing sockets.
-Without those classes, the public socket interface is useless. But do
-not feel obligated to completely implement all of the functionality at
-once. For example, in the java.net package, there are different types
-of protocol handlers for different types of URL's. Not all of these
-need to be written at once.
-
-@item
-Please write complete and thorough API documentation comments for
-every public and protected method and variable. These should be
-superior to Sun's and cover everything about the item being
-documented.
-
-@item
-Please write a regression test package that can be used to run tests
-of your package's functionality. GNU Classpath uses the
-@uref{http://sources.redhat.com/mauve/,Mauve project} for testing the
-functionality of the core class libraries. The Classpath Project is
-fast approaching the point in time where all modifications to the
-source code repository will require appropriate test cases in Mauve to
-ensure correctness and prevent regressions.
-@end itemize
-
-Writing good documentation, tests and fixing bugs should be every
-developer's top priority in order to reach the elusive release of
-version 1.0.
-
-@node Project Goals, Needed Tools and Libraries, Volunteering, Top
-@comment node-name, next, previous, up
-@chapter Project Goals
-
-The goal of the Classpath project is to produce a
-@uref{http://www.fsf.org/philosophy/free-sw.html,free} implementation of
-the standard class library for Java. However, there are other more
-specific goals as to which platforms should be supported.
-
-Classpath is targeted to support the following operating systems:
-
-@enumerate
-@item
-Free operating systems. This includes GNU/Linux, GNU/Hurd, and the free
-BSDs.
-
-@item
-Other Unix-like operating systems.
-
-@item
-Platforms which currently have no Java support at all.
-
-@item
-Other platforms such as MS-Windows.
-@end enumerate
-
-While free operating systems are the top priority, the other priorities
-can shift depending on whether or not there is a volunteer to port
-Classpath to those platforms and to test releases.
-
-Eventually we hope the Classpath will support all JVM's that provide
-JNI or CNI support. However, the top priority is free JVM's. A small
-list of Compiler/VM environments that are currently actively
-incorporating GNU Classpath is below. A more complete overview of
-projects based on GNU classpath can be found online at
-@uref{http://www.gnu.org/software/classpath/stories.html,the GNU
-Classpath stories page}.
-
-@enumerate
-@item
-@uref{http://gcc.gnu.org/java/,GCJ}
-@item
-@uref{http://jamvm.sourceforge.net/,jamvm}
-@item
-@uref{http://kissme.sourceforge.net/,Kissme}
-@item
-@uref{http://www.ibm.com/developerworks/oss/jikesrvm/,Jikes RVM}
-@item
-@uref{http://www.sablevm.org/,SableVM}
-@item
-@uref{http://www.kaffe.org/,Kaffe}
-@end enumerate
-
-As with OS platform support, this priority list could change if a
-volunteer comes forward to port, maintain, and test releases for a
-particular JVM. Since gcj is part of the GNU Compiler Collective it
-is one of the most important targets. But since it doesn't currently
-work out of the box with GNU Classpath it is currently not the easiest
-target. When hacking on GNU Classpath the easiest is to use
-compilers and runtime environments that that work out of the box with
-it, such as the jikes compiler and the runtime environments jamvm and
-kissme. But you can also work directly with targets like gcj and
-kaffe that have their own copy of GNU Classpath currently. In that
-case changes have to be merged back into GNU Classpath proper though,
-which is sometimes more work. SableVM is starting to migrate from an
-integrated GNU Classpath version to being usable with GNU Classpath
-out of the box.
-
-
-The initial target version for Classpath is the 1.1 spec. Higher
-versions can be implemented (and have been implemented, including lots
-of 1.4 functionality) if desired, but please do not create classes
-that depend on features in those packages unless GNU Classpath already
-contains those features. GNU Classpath has been free of any
-proprietary dependencies for a long time now and we like to keep it
-that way. But finishing, polishing up, documenting, testing and
-debugging current functionality is of higher priority then adding new
-functionality.
-
-@node Needed Tools and Libraries, Programming Standards, Project Goals, Top
-@comment node-name, next, previous, up
-@chapter Needed Tools and Libraries
-
-If you want to hack on Classpath, you should at least download and
-install the following tools. And try to familiarize yourself with
-them. Although in most cases having these tools installed will be all
-you really need to know about them. Also note that when working on
-(snapshot) releases only GCC 3.3+ (plus a free VM from the list above
-and the libraries listed below) is needed. The other tools are only
-needed when working directly on the CVS version.
-
-@itemize @bullet
-@item
-GCC 3.3+
-@item
-CVS 1.11+
-@item
-automake 1.7+
-@item
-autoconf 2.59+
-@item
-libtool 1.4.2+
-@item
-GNU m4 1.4
-@item
-texinfo 4.2+
-@end itemize
-
-All of these tools are available from
-@uref{ftp://gnudist.gnu.org/pub/gnu/,gnudist.gnu.org} via anonymous
-ftp, except CVS which is available from
-@uref{http://www.cvshome.org/,www.cvshome.org}. They are fully
-documented with texinfo manuals. Texinfo can be browsed with the
-Emacs editor, or with the text editor of your choice, or transformed
-into nicely printable Postscript.
-
-Here is a brief description of the purpose of those tools.
-
-@table @b
-
-@item GCC
-The GNU Compiler Collection. This contains a C compiler (gcc) for
-compiling the native C code and a compiler for the java programming
-language (gcj). You will need at least gcj version 3.3 or higher. If
-that version is not available for your platform you can try the
-@uref{http://www.jikes.org/, jikes compiler}. We try to keep all code
-compilable with both gcj and jikes at all times.
-
-@item CVS
-A version control system that maintains a centralized Internet
-repository of all code in the Classpath system.
-
-@item automake
-This tool automatically creates Makefile.in files from Makefile.am
-files. The Makefile.in is turned into a Makefile by autoconf. Why
-use this? Because it automatically generates every makefile target
-you would ever want (clean, install, dist, etc) in full compliance
-with the GNU coding standards. It also simplifies Makefile creation
-in a number of ways that cannot be described here. Read the docs for
-more info.
-
-@item autoconf
-Automatically configures a package for the platform on which it is
-being built and generates the Makefile for that platform.
-
-@item libtool
-Handles all of the zillions of hairy platform specific options needed
-to build shared libraries.
-
-@item m4
-The free GNU replacement for the standard Unix macro processor.
-Proprietary m4 programs are broken and so GNU m4 is required for
-autoconf to work though knowing a lot about GNU m4 is not required to
-work with autoconf.
-
-@item perl
-Larry Wall's scripting language. It is used internally by automake.
-
-@item texinfo
-Manuals and documentation (like this guide) are written in texinfo.
-Texinfo is the official documentation format of the GNU project.
-Texinfo uses a single source file to produce output in a number of formats,
-both online and printed (dvi, info, html, xml, etc.). This means that
-instead of writing different documents for online information and another
-for a printed manual, you need write only one document. And when the work
-is revised, you need revise only that one document.
-
-@end table
-
-
-For compiling the native AWT libraries you need to have the following
-libraries installed:
-
-@table @b
-@item GTK+ 2.2.x
-@uref{http://www.gtk.org/,GTK+} is a multi-platform toolkit for
-creating graphical user interfaces. It is used as the basis of the
-GNU desktop project GNOME.
-
-@item gdk-pixbuf
-@uref{http://www.gnome.org/start/,gdk-pixbuf} is a GNOME library for
-representing images.
-@end table
-
-
-GNU Classpath comes with a couple of libraries included in the source
-that are not part of GNU Classpath proper, but that have been included
-to provide certain needed functionality. All these external libraries
-should be clearly marked as such. In general we try to use as much as
-possible the clean upstream versions of these sources. That way
-merging in new versions will be easiest. You should always try to get
-bug fixes to these files accepted upstream first. Currently we
-include the following 'external' libraries. Most of these sources are
-included in the @file{external} directory. That directory also
-contains a @file{README} file explaining how to import newer versions.
-
-@table @b
-
-@item GNU jaxp
-Can be found in @file{external/jaxp}. Provides javax.xml, org.w3c and
-org.xml packages. Upstream is
-@uref{http://www.gnu.org/software/classpathx/,GNU ClasspathX}.
-
-@item fdlibm
-Can be found in @file{native/fdlibm}. Provides native implementations
-of some of the Float and Double operations. Upstream is
-@uref{http://gcc.gnu.org/java/,libgcj}, they sync again with the
-'real' upstream @uref{http://www.netlib.org/fdlibm/readme}. See also
-java.lang.StrictMath.
-
-@end table
-
-
-@node Programming Standards, Hacking Code, Needed Tools and Libraries, Top
-@comment node-name, next, previous, up
-@chapter Programming Standards
-
-For C source code, follow the
-@uref{http://www.gnu.org/prep/standards/,GNU Coding Standards}.
-The standards also specify various things like the install directory
-structure. These should be followed if possible.
-
-For Java source code, please follow the
-@uref{http://www.gnu.org/prep/standards/,GNU Coding
-Standards}, as much as possible. There are a number of exceptions to
-the GNU Coding Standards that we make for GNU Classpath as documented
-in this guide. We will hopefully be providing developers with a code
-formatting tool that closely matches those rules soon.
-
-For API documentation comments, please follow
-@uref{http://java.sun.com/products/jdk/javadoc/writingdoccomments.html,How
-to Write Doc Comments for Javadoc}. We would like to have a set of
-guidelines more tailored to GNU Classpath as part of this document.
-
-@menu
-* Source Code Style Guide::
-@end menu
-
-@node Source Code Style Guide, , Programming Standards, Programming Standards
-@comment node-name, next, previous, up
-@section Java source coding style
-
-Here is a list of some specific rules used when hacking on GNU
-Classpath java source code. We try to follow the standard
-@uref{http://www.gnu.org/prep/standards/,GNU Coding Standards}
-for that. There are lots of tools that can automatically generate it
-(although most tools assume C source, not java source code) and it
-seems as good a standard as any. There are a couple of exceptions and
-specific rules when hacking on GNU Classpath java source code however.
-The following lists how code is formatted (and some other code
-conventions):
-
-
-@itemize @bullet
-
-@item
-Java source files in GNU Classpath are encoded using UTF-8. However,
-ordinarily it is considered best practice to use the ASCII subset of
-UTF-8 and write non-ASCII characters using \u escapes.
-
-@item
-If possible, generate specific imports (expand) over java.io.* type
-imports. Order by gnu, java, javax, org. There must be one blank line
-between each group. The imports themselves are ordered alphabetically by
-package name. Classes and interfaces occur before sub-packages. The
-classes/interfaces are then also sorted alphabetical. Note that uppercase
-characters occur before lowercase characters.
-
-@example
-import gnu.java.awt.EmbeddedWindow;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import javax.swing.JFrame;
-@end example
-
-@item
-Blank line after package statement, last import statement, classes,
-interfaces, methods.
-
-@item
-Opening/closing brace for class and method is at the same level of
-indent as the declaration. All other braces are indented and content
-between braces indented again.
-
-@item
-Since method definitions don't start in column zero anyway (since they
-are always inside a class definition), the rational for easy grepping
-for ``^method_def'' is mostly gone already. Since it is customary for
-almost everybody who writes java source code to put modifiers, return
-value and method name on the same line, we do too.
-
-@c fixme Another rational for always indenting the method definition is that itmakes it a bit easier to distinguish methods in inner and anonymousclasses from code in their enclosing context. NEED EXAMPLE.
-
-@item
-Implements and extends on separate lines, throws too. Indent extends,
-implements, throws. Apply deep indentation for method arguments.
-
-@c fixme Needs example.
-
-@item
-Don't add a space between a method or constructor call/definition and
-the open-bracket. This is because often the return value is an object on
-which you want to apply another method or from which you want to access
-a field.
-
-Don't write:
-
-@example
- getToolkit ().createWindow (this);
-@end example
-
-But write:
-@example
- getToolkit().createWindow(this);
-@end example
-
-@item
-The GNU Coding Standard it gives examples for almost every construct
-(if, switch, do, while, etc.). One missing is the try-catch construct
-which should be formatted as:
-
-@example
- try
- @{
- //
- @}
- catch (...)
- @{
- //
- @}
-@end example
-
-@item
-Wrap lines at 80 characters after assignments and before operators.
-Wrap always before extends, implements, throws, and labels.
-
-@item
-Don't put multiple class definitions in the same file, except for
-inner classes. File names (plus .java) and class names should be the
-same.
-
-@item
-Don't catch a @code{NullPointerException} as an alternative to simply
-checking for @code{null}. It is clearer and usually more efficient
-to simply write an explicit check.
-
-For instance, don't write:
-
-@example
-try
- @{
- return foo.doit();
- @}
-catch (NullPointerException _)
- @{
- return 7;
- @}
-@end example
-
-If your intent above is to check whether @samp{foo} is @code{null},
-instead write:
-
-@example
-if (foo == null)
- return 7;
-else
- return foo.doit();
-@end example
-
-@item
-Don't use redundant modifiers or other redundant constructs. Here is
-some sample code that shows various redundant items in comments:
-
-@example
-/*import java.lang.Integer;*/
-/*abstract*/ interface I @{
- /*public abstract*/ void m();
- /*public static final*/ int i = 1;
- /*public static*/ class Inner @{@}
-@}
-final class C /*extends Object*/ @{
- /*final*/ void m() @{@}
-@}
-@end example
-
-Note that Jikes will generate warnings for redundant modifiers if you
-use @code{+Predundant-modifiers} on the command line.
-
-@item
-Modifiers should be listed in the standard order recommended by the
-JLS. Jikes will warn for this when given @code{+Pmodifier-order}.
-
-@item
-Because the output of different compilers differs, we have
-standardized on explicitly specifying @code{serialVersionUID} in
-@code{Serializable} classes in Classpath. This field should be
-declared as @code{private static final}. Note that a class may be
-@code{Serializable} without being explicitly marked as such, due to
-inheritance. For instance, all subclasses of @code{Throwable} need to
-have @code{serialVersionUID} declared.
-@c fixme index
-@c fixme link to the discussion
-
-@item
-Don't declare unchecked exceptions in the @code{throws} clause of a
-method. However, if throwing an unchecked exception is part of the
-method's API, you should mention it in the Javadoc. There is one
-important exception to this rule, which is that a stub method should
-be marked as throwing @code{gnu.classpath.NotImplementedException}.
-This will let our API comparison tools note that the method is not
-fully implemented.
-
-@item
-When overriding @code{Object.equals}, remember that @code{instanceof}
-filters out @code{null}, so an explicit check is not needed.
-
-@item
-When catching an exception and rethrowing a new exception you should
-``chain'' the Throwables. Don't just add the String representation of
-the caught exception.
-
-@example
- try
- @{
- // Some code that can throw
- @}
- catch (IOException ioe)
- @{
- throw (SQLException) new SQLException("Database corrupt").setCause(ioe);
- @}
-@end example
-
-@item
-Avoid the use of reserved words for identifiers. This is obvious with those
-such as @code{if} and @code{while} which have always been part of the Java
-programming language, but you should be careful about accidentally using
-words which have been added in later versions. Notable examples are
-@code{assert} (added in 1.4) and @code{enum} (added in 1.5). Jikes will warn
-of the use of the word @code{enum}, but, as it doesn't yet support the 1.5
-version of the language, it will still allow this usage through. A
-compiler which supports 1.5 (e.g. the Eclipse compiler, ecj) will simply
-fail to compile the offending source code.
-
-@c fixme Describe Anonymous classes (example).
-@c fixme Descibe Naming conventions when different from GNU Coding Standards.
-@c fixme Describee API doc javadoc tags used.
-
-@end itemize
-
-Some things are the same as in the normal GNU Coding Standards:
-
-@itemize @bullet
-
-@item
-Unnecessary braces can be removed, one line after an if, for, while as
-examples.
-
-@item
-Space around operators (assignment, logical, relational, bitwise,
-mathematical, shift).
-
-@item
-Blank line before single-line comments, multi-line comments, javadoc
-comments.
-
-@item
-If more than 2 blank lines, trim to 2.
-
-@item
-Don't keep commented out code. Just remove it or add a real comment
-describing what it used to do and why it is changed to the current
-implementation.
-@end itemize
-
-
-@node Hacking Code, Programming Goals, Programming Standards, Top
-@comment node-name, next, previous, up
-@chapter Working on the code, Working with others
-
-There are a lot of people helping out with GNU Classpath. Here are a
-couple of practical guidelines to make working together on the code
-smoother.
-
-The main thing is to always discuss what you are up to on the
-mailinglist. Making sure that everybody knows who is working on what
-is the most important thing to make sure we cooperate most
-effectively.
-
-We maintain a
-@uref{http://www.gnu.org/software/classpath/tasks.html,Task List}
-which contains items that you might want to work on.
-
-Before starting to work on something please make sure you read this
-complete guide. And discuss it on list to make sure your work does
-not duplicate or interferes with work someone else is already doing.
-Always make sure that you submit things that are your own work. And
-that you have paperwork on file (as stated in the requirements
-section) with the FSF authorizing the use of your additions.
-
-Technically the GNU Classpath project is hosted on
-@uref{http://savannah.gnu.org/,Savannah} a central point for
-development, distribution and maintenance of GNU Software. Here you
-will find the
-@uref{https://savannah.gnu.org/projects/classpath/,project page}, bug
-reports, pending patches, links to mailing lists, news items and CVS.
-
-You can find instructions on getting a CVS checkout for classpath at
-@uref{https://savannah.gnu.org/cvs/?group=classpath}.
-
-You don't have to get CVS commit write access to contribute, but it is
-sometimes more convenient to be able to add your changes directly to
-the project CVS. Please contact the GNU Classpath savannah admins to
-arrange CVS access if you would like to have it.
-
-Make sure to be subscribed to the commit-classpath mailinglist while
-you are actively hacking on Classpath. You have to send patches (cvs
-diff -uN) to this list before committing.
-
-We really want to have a pretty open check-in policy. But this means
-that you should be extra careful if you check something in. If at all
-in doubt or if you think that something might need extra explaining
-since it is not completely obvious please make a little announcement
-about the change on the mailinglist. And if you do commit something
-without discussing it first and another GNU Classpath hackers asks for
-extra explanation or suggests to revert a certain commit then please
-reply to the request by explaining why something should be so or if
-you agree to revert it. (Just reverting immediately is OK without
-discussion, but then please don't mix it with other changes and please
-say so on list.)
-
-Patches that are already approved for libgcj or also OK for Classpath.
-(But you still have to send a patch/diff to the list.) All other
-patches require you to think whether or not they are really OK and
-non-controversial, or if you would like some feedback first on them
-before committing. We might get real commit rules in the future, for
-now use your own judgment, but be a bit conservative.
-
-Always contact the GNU Classpath maintainer before adding anything
-non-trivial that you didn't write yourself and that does not come from
-libgcj or from another known GNU Classpath or libgcj hacker. If you
-have been assigned to commit changes on behalf of another project or
-a company always make sure they come from people who have signed the
-papers for the FSF and/or fall under the arrangement your company made
-with the FSF for contributions. Mention in the ChangeLog who actually
-wrote the patch.
-
-Commits for completely unrelated changes they should be committed
-separately (especially when doing a formatting change and a logical
-change, do them in two separate commits). But do try to do a commit of
-as much things/files that are done at the same time which can
-logically be seen as part of the same change/cleanup etc.
-
-When the change fixes an important bug or adds nice new functionality
-please write a short entry for inclusion in the @file{NEWS} file. If it
-changes the VM interface you must mention that in both the @file{NEWS} file
-and the VM Integration Guide.
-
-All the ``rules'' are really meant to make sure that GNU Classpath
-will be maintainable in the long run and to give all the projects that
-are now using GNU Classpath an accurate view of the changes we make to
-the code and to see what changed when. If you think the requirements
-are ``unworkable'' please try it first for a couple of weeks. If you
-still feel the same after having some more experience with the project
-please feel free to bring up suggestions for improvements on the list.
-But don't just ignore the rules! Other hackers depend on them being
-followed to be the most productive they can be (given the above
-constraints).
-
-@menu
-* Branches::
-* Writing ChangeLogs::
-@end menu
-
-@node Branches, Writing ChangeLogs, Hacking Code, Hacking Code
-@comment node-name, next, previous, up
-@section Working with branches
-
-Sometimes it is necessary to create branch of the source for doing new
-work that is disruptive to the other hackers, or that needs new
-language or libraries not yet (easily) available.
-
-After discussing the need for a branch on the main mailinglist with
-the other hackers explaining the need of a branch and suggestion of
-the particular branch rules (what will be done on the branch, who will
-work on it, will there be different commit guidelines then for the
-mainline trunk and when is the branch estimated to be finished and
-merged back into the trunk) every GNU Classpath hacker with commit
-access should feel free to create a branch. There are however a couple
-of rules that every branch should follow:
-
-@itemize @bullet
-
-@item All branches ought to be documented in the developer wiki at
-@uref{http://developer.classpath.org/mediation/ClasspathBranches}, so
-we can know which are live, who owns them, and when they die.
-
-@item Some rules can be changed on a branch. In particular the branch
-maintainer can change the review requirements, and the requirement of
-keeping things building, testing, etc, can also be lifted. (These
-should be documented along with the branch name and owner if they
-differ from the trunk.)
-
-@item Requirements for patch email to classpath-patches and for paperwork
-@strong{cannot} be lifted. See @ref{Requirements}.
-
-@item A branch should not be seen as ``private'' or
-``may be completely broken''. It should be as much as possible
-something that you work on with a team (and if there is no team - yet
-- then there is nothing as bad as having a completely broken build to
-get others to help out). There can of course be occasional breakage, but
-it should be planned and explained. And you can certainly have a rule
-like ``please ask me before committing to this branch''.
-
-@item Merges from the trunk to a branch are at the discretion of the
-branch maintainer.
-
-@item A merge from a branch to the trunk is treated like any other patch.
-In particular, it has to go through review, it must satisfy all the
-trunk requirements (build, regression test, documentation).
-
-@item There may be additional timing requirements on merging a branch to
-the trunk depending on the release schedule, etc. For instance we may
-not want to do a branch merge just before a release.
-
-@end itemize
-
-If any of these rules are unclear please discuss on the list first.
-
-@menu
-* Writing ChangeLogs::
-@end menu
-
-@node Writing ChangeLogs, , Branches, Hacking Code
-@comment node-name, next, previous, up
-@section Documenting what changed when with ChangeLog entries
-
-To keep track of who did what when we keep an explicit ChangeLog entry
-together with the code. This mirrors the CVS commit messages and in
-general the ChangeLog entry is the same as the CVS commit message.
-This provides an easy way for people getting a (snapshot) release or
-without access to the CVS server to see what happened when. We do not
-generate the ChangeLog file automatically from the CVS server since
-that is not reliable.
-
-A good ChangeLog entry guideline can be found in the Guile Manual at
-@uref{http://www.gnu.org/software/guile/changelogs/guile-changelogs_3.html}.
-
-Here are some example to explain what should or shouldn't be in a
-ChangeLog entry (and the corresponding commit message):
-
-@itemize @bullet
-
-@item
-The first line of a ChangeLog entry should be:
-
-@example
-[date] <two spaces> [full name] <two spaces> [email-contact]
-@end example
-
-The second line should be blank. All other lines should be indented
-with one tab.
-
-@item
-Just state what was changed. Why something is done as it is done in
-the current code should be either stated in the code itself or be
-added to one of the documentation files (like this Hacking Guide).
-
-So don't write:
-
-@example
- * java/awt/font/OpenType.java: Remove 'public static final'
- from OpenType tags, reverting the change of 2003-08-11. See
- Classpath discussion list of 2003-08-11.
-@end example
-
-Just state:
-
-@example
- * java/awt/font/OpenType.java: Remove 'public static final' from
- all member fields.
-@end example
-
-In this case the reason for the change was added to this guide.
-
-@item
-Just as with the normal code style guide, don't make lines longer then
-80 characters.
-
-@item
-Just as with comments in the code. The ChangeLog entry should be a
-full sentence, starting with a captital and ending with a period.
-
-@item
-Be precise in what changed, not the effect of the change (which should
-be clear from the code/patch). So don't write:
-
-@example
- * java/io/ObjectOutputStream.java : Allow putFields be called more
- than once.
-@end example
-
-But explain what changed and in which methods it was changed:
-
-@example
- * java/io/ObjectOutputStream.java (putFields): Don't call
- markFieldsWritten(). Only create new PutField when
- currentPutField is null.
- (writeFields): Call markFieldsWritten().
-@end example
-
-@end itemize
-
-The above are all just guidelines. We all appreciate the fact that writing
-ChangeLog entries, using a coding style that is not ``your own'' and the
-CVS, patch and diff tools do take some time to getting used to. So don't
-feel like you have to do it perfect right away or that contributions
-aren't welcome if they aren't ``perfect''. We all learn by doing and
-interacting with each other.
-
-
-@node Programming Goals, API Compatibility, Hacking Code, Top
-@comment node-name, next, previous, up
-@chapter Programming Goals
-
-When you write code for Classpath, write with three things in mind, and
-in the following order: portability, robustness, and efficiency.
-
-If efficiency breaks portability or robustness, then don't do it the
-efficient way. If robustness breaks portability, then bye-bye robust
-code. Of course, as a programmer you would probably like to find sneaky
-ways to get around the issue so that your code can be all three ... the
-following chapters will give some hints on how to do this.
-
-@menu
-* Portability:: Writing Portable Software
-* Utility Classes:: Reusing Software
-* Robustness:: Writing Robust Software
-* Java Efficiency:: Writing Efficient Java
-* Native Efficiency:: Writing Efficient JNI
-* Security:: Writing Secure Software
-@end menu
-
-@node Portability, Utility Classes, Programming Goals, Programming Goals
-@comment node-name, next, previous, up
-@section Portability
-
-The portability goal for Classpath is the following:
-
-@enumerate
-@item
-native functions for each platform that work across all VMs on that
-platform
-@item
-a single classfile set that work across all VMs on all platforms that
-support the native functions.
-@end enumerate
-
-For almost all of Classpath, this is a very feasible goal, using a
-combination of JNI and native interfaces. This is what you should shoot
-for. For those few places that require knowledge of the Virtual Machine
-beyond that provided by the Java standards, the VM Interface was designed.
-Read the Virtual Machine Integration Guide for more information.
-
-Right now the only supported platform is Linux. This will change as that
-version stabilizes and we begin the effort to port to many other
-platforms. Jikes RVM runs Classpath on AIX, and generally the Jikes
-RVM team fixes Classpath to work on that platform.
-
-@node Utility Classes, Robustness, Portability, Programming Goals
-@comment node-name, next, previous, up
-@section Utility Classes
-
-At the moment, we are not very good at reuse of the JNI code. There
-have been some attempts, called @dfn{libclasspath}, to
-create generally useful utility classes. The utility classes are in
-the directory @file{native/jni/classpath} and they are mostly declared
-in @file{native/jni/classpath/jcl.h}. These utility classes are
-currently only discussed in @ref{Robustness} and in @ref{Native
-Efficiency}.
-
-There are more utility classes available that could be factored out if
-a volunteer wants something nice to hack on. The error reporting and
-exception throwing functions and macros in
-@file{native/jni/gtk-peer/gthread-jni.c} might be good
-candidates for reuse. There are also some generally useful utility
-functions in @file{gnu_java_awt_peer_gtk_GtkMainThread.c} that could
-be split out and put into libclasspath.
-
-@node Robustness, Java Efficiency, Utility Classes, Programming Goals
-@comment node-name, next, previous, up
-@section Robustness
-
-Native code is very easy to make non-robust. (That's one reason Java is
-so much better!) Here are a few hints to make your native code more
-robust.
-
-Always check return values for standard functions. It's sometimes easy
-to forget to check that malloc() return for an error. Don't make that
-mistake. (In fact, use JCL_malloc() in the jcl library instead--it will
-check the return value and throw an exception if necessary.)
-
-Always check the return values of JNI functions, or call
-@code{ExceptionOccurred} to check whether an error occurred. You must
-do this after @emph{every} JNI call. JNI does not work well when an
-exception has been raised, and can have unpredictable behavior.
-
-Throw exceptions using @code{JCL_ThrowException}. This guarantees that if
-something is seriously wrong, the exception text will at least get out
-somewhere (even if it is stderr).
-
-Check for null values of @code{jclass}es before you send them to JNI functions.
-JNI does not behave nicely when you pass a null class to it: it
-terminates Java with a "JNI Panic."
-
-In general, try to use functions in @file{native/jni/classpath/jcl.h}. They
-check exceptions and return values and throw appropriate exceptions.
-
-@node Java Efficiency, Native Efficiency, Robustness, Programming Goals
-@comment node-name, next, previous, up
-@section Java Efficiency
-
-For methods which explicitly throw a @code{NullPointerException} when an
-argument is passed which is null, per a Sun specification, do not write
-code like:
-
-@example
-int
-strlen (String foo) throws NullPointerException
-@{
- if (foo == null)
- throw new NullPointerException ("foo is null");
- return foo.length ();
-@}
-@end example
-
-Instead, the code should be written as:
-
-@example
-int
-strlen (String foo) throws NullPointerException
-@{
- return foo.length ();
-@}
-@end example
-
-Explicitly comparing foo to null is unnecessary, as the virtual machine
-will throw a NullPointerException when length() is invoked. Classpath
-is designed to be as fast as possible -- every optimization, no matter
-how small, is important.
-
-@node Native Efficiency, Security, Java Efficiency, Programming Goals
-@comment node-name, next, previous, up
-@section Native Efficiency
-
-You might think that using native methods all over the place would give
-our implementation of Java speed, speed, blinding speed. You'd be
-thinking wrong. Would you believe me if I told you that an empty
-@emph{interpreted} Java method is typically about three and a half times
-@emph{faster} than the equivalent native method?
-
-Bottom line: JNI is overhead incarnate. In Sun's implementation, even
-the JNI functions you use once you get into Java are slow.
-
-A final problem is efficiency of native code when it comes to things
-like method calls, fields, finding classes, etc. Generally you should
-cache things like that in static C variables if you're going to use them
-over and over again. GetMethodID(), GetFieldID(), and FindClass() are
-@emph{slow}. Classpath provides utility libraries for caching methodIDs
-and fieldIDs in @file{native/jni/classpath/jnilink.h}. Other native data can
-be cached between method calls using functions found in
-@file{native/jni/classpath/native_state.h}.
-
-Here are a few tips on writing native code efficiently:
-
-Make as few native method calls as possible. Note that this is not the
-same thing as doing less in native method calls; it just means that, if
-given the choice between calling two native methods and writing a single
-native method that does the job of both, it will usually be better to
-write the single native method. You can even call the other two native
-methods directly from your native code and not incur the overhead of a
-method call from Java to C.
-
-Cache @code{jmethodID}s and @code{jfieldID}s wherever you can. String
-lookups are
-expensive. The best way to do this is to use the
-@file{native/jni/classpath/jnilink.h}
-library. It will ensure that @code{jmethodID}s are always valid, even if the
-class is unloaded at some point. In 1.1, jnilink simply caches a
-@code{NewGlobalRef()} to the method's underlying class; however, when 1.2 comes
-along, it will use a weak reference to allow the class to be unloaded
-and then re-resolve the @code{jmethodID} the next time it is used.
-
-Cache classes that you need to access often. jnilink will help with
-this as well. The issue here is the same as the methodID and fieldID
-issue--how to make certain the class reference remains valid.
-
-If you need to associate native C data with your class, use Paul
-Fisher's native_state library (NSA). It will allow you to get and set
-state fairly efficiently. Japhar now supports this library, making
-native state get and set calls as fast as accessing a C variable
-directly.
-
-If you are using native libraries defined outside of Classpath, then
-these should be wrapped by a Classpath function instead and defined
-within a library of their own. This makes porting Classpath's native
-libraries to new platforms easier in the long run. It would be nice
-to be able to use Mozilla's NSPR or Apache's APR, as these libraries
-are already ported to numerous systems and provide all the necessary
-system functions as well.
-
-@node Security, , Native Efficiency, Programming Goals
-@comment node-name, next, previous, up
-@section Security
-
-Security is such a huge topic it probably deserves its own chapter.
-Most of the current code needs to be audited for security to ensure
-all of the proper security checks are in place within the Java
-platform, but also to verify that native code is reasonably secure and
-avoids common pitfalls, buffer overflows, etc. A good source for
-information on secure programming is the excellent HOWTO by David
-Wheeler,
-@uref{http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/index.html,Secure
-Programming for Linux and Unix HOWTO}.
-
-@node API Compatibility, Specification Sources, Programming Goals, Top
-@comment node-name, next, previous, up
-@chapter API Compatibility
-
-@menu
-* Serialization:: Serialization
-* Deprecated Methods:: Deprecated methods
-@end menu
-
-@node Serialization, Deprecated Methods, API Compatibility, API Compatibility
-@comment node-name, next, previous, up
-@section Serialization
-
-Sun has produced documentation concerning much of the information
-needed to make Classpath serializable compatible with Sun
-implementations. Part of doing this is to make sure that every class
-that is Serializable actually defines a field named serialVersionUID
-with a value that matches the output of serialver on Sun's
-implementation. The reason for doing this is below.
-
-If a class has a field (of any accessibility) named serialVersionUID
-of type long, that is what serialver uses. Otherwise it computes a
-value using some sort of hash function on the names of all method
-signatures in the .class file. The fact that different compilers
-create different synthetic method signatures, such as access$0() if an
-inner class needs access to a private member of an enclosing class,
-make it impossible for two distinct compilers to reliably generate the
-same serial #, because their .class files differ. However, once you
-have a .class file, its serial # is unique, and the computation will
-give the same result no matter what platform you execute on.
-
-Serialization compatibility can be tested using tools provided with
-@uref{http://www.kaffe.org/~stuart/japi/,Japitools}. These
-tools can test binary serialization compatibility and also provide
-information about unknown serialized formats by writing these in XML
-instead. Japitools is also the primary means of checking API
-compatibility for GNU Classpath with Sun's Java Platform.
-
-@node Deprecated Methods, , Serialization, API Compatibility
-@comment node-name, next, previous, up
-@section Deprecated Methods
-
-Sun has a practice of creating ``alias'' methods, where a public or
-protected method is deprecated in favor of a new one that has the same
-function but a different name. Sun's reasons for doing this vary; as
-an example, the original name may contain a spelling error or it may
-not follow Java naming conventions.
-
-Unfortunately, this practice complicates class library code that calls
-these aliased methods. Library code must still call the deprecated
-method so that old client code that overrides it continues to work.
-But library code must also call the new version, because new code is
-expected to override the new method.
-
-The correct way to handle this (and the way Sun does it) may seem
-counterintuitive because it means that new code is less efficient than
-old code: the new method must call the deprecated method, and throughout
-the library code calls to the old method must be replaced with calls to
-the new one.
-
-Take the example of a newly-written container laying out a component and
-wanting to know its preferred size. The Component class has a
-deprecated preferredSize method and a new method, getPreferredSize.
-Assume that the container is laying out an old component that overrides
-preferredSize and a new component that overrides getPreferredSize. If
-the container calls getPreferredSize and the default implementation of
-getPreferredSize calls preferredSize, then the old component will have
-its preferredSize method called and new code will have its
-getPreferredSize method called.
-
-Even using this calling scheme, an old component may still be laid out
-improperly if it implements a method, getPreferredSize, that has the
-same signature as the new Component.getPreferredSize. But that is a
-general problem -- adding new public or protected methods to a
-widely-used class that calls those methods internally is risky, because
-existing client code may have already declared methods with the same
-signature.
-
-The solution may still seem counterintuitive -- why not have the
-deprecated method call the new method, then have the library always call
-the old method? One problem with that, using the preferred size example
-again, is that new containers, which will use the non-deprecated
-getPreferredSize, will not get the preferred size of old components.
-
-@node Specification Sources, Naming Conventions, API Compatibility, Top
-@comment node-name, next, previous, up
-@chapter Specification Sources
-
-There are a number of specification sources to use when working on
-Classpath. In general, the only place you'll find your classes
-specified is in the JavaDoc documentation or possibly in the
-corresponding white paper. In the case of java.lang, java.io and
-java.util, you should look at the Java Language Specification.
-
-Here, however, is a list of specs, in order of canonicality:
-
-@enumerate
-@item
-@uref{http://java.sun.com/docs/books/jls/clarify.html,Clarifications and Amendments to the JLS - 1.1}
-@item
-@uref{http://java.sun.com/docs/books/jls/html/1.1Update.html,JLS Updates
-- 1.1}
-@item
-@uref{http://java.sun.com/docs/books/jls/html/index.html,The 1.0 JLS}
-@item
-@uref{http://java.sun.com/docs/books/vmspec/index.html,JVM spec - 1.1}
-@item
-@uref{http://java.sun.com/products/jdk/1.1/docs/guide/jni/spec/jniTOC.doc.html,JNI spec - 1.1}
-@item
-@uref{http://java.sun.com/products/jdk/1.1/docs/api/packages.html,Sun's javadoc - 1.1}
-(since Sun's is the reference implementation, the javadoc is
-documentation for the Java platform itself.)
-@item
-@uref{http://java.sun.com/products/jdk/1.2/docs/guide/jvmdi/jvmdi.html,JVMDI spec - 1.2},
-@uref{http://java.sun.com/products/jdk/1.2/docs/guide/jni/jni-12.html,JNI spec - 1.2}
-(sometimes gives clues about unspecified things in 1.1; if
-it was not specified accurately in 1.1, then use the spec
-for 1.2; also, we are using JVMDI in this project.)
-@item
-@uref{http://java.sun.com/products/jdk/1.2/docs/api/frame.html,Sun's javadoc - 1.2}
-(sometimes gives clues about unspecified things in 1.1; if
-it was not specified accurately in 1.1, then use the spec
-for 1.2)
-@item
-@uref{http://developer.java.sun.com/developer/bugParade/index.html,The
-Bug Parade}: I have obtained a ton of useful information about how
-things do work and how they *should* work from the Bug Parade just by
-searching for related bugs. The submitters are very careful about their
-use of the spec. And if something is unspecified, usually you can find
-a request for specification or a response indicating how Sun thinks it
-should be specified here.
-@end enumerate
-
-You'll notice that in this document, white papers and specification
-papers are more canonical than the JavaDoc documentation. This is true
-in general.
-
-
-@node Naming Conventions, Character Conversions, Specification Sources, Top
-@comment node-name, next, previous, up
-@chapter Directory and File Naming Conventions
-
-The Classpath directory structure is laid out in the following manner:
-
-@example
-classpath
- |
- |---->java
- | |
- | |-->awt
- | |-->io
- | |-->lang
- | |-->util
- | | |
- | | |--->zip
- | | |--->jar
- | |-->net
- | |-->etc
- |
- |---->gnu
- | |
- | |-->java
- | |
- | |-->awt
- | |-->lang
- | |-->util
- | | |
- | | |-->zip
- | |-->etc
- |
- |---->native
- |
- |-->jni
- | |-->classpath
- | |-->gtk-peer
- | |-->java-io
- | |-->java-lang
- | |-->java-net
- | |-->java-util
- | |-->etc
- |-->cni
-
-@end example
-
-Here is a brief description of the toplevel directories and their contents.
-
-@table @b
-
-@item java
-Contains the source code to the Java packages that make up the core
-class library. Because this is the public interface to Java, it is
-important that the public classes, interfaces, methods, and variables
-are exactly the same as specified in Sun's documentation. The directory
-structure is laid out just like the java package names. For example,
-the class java.util.zip would be in the directory java-util.
-
-@item gnu/java
-Internal classes (roughly analogous to Sun's sun.* classes) should go
-under the @file{gnu/java} directory. Classes related to a particular public
-Java package should go in a directory named like that package. For
-example, classes related to java.util.zip should go under a directory
-@file{gnu/java/util/zip}. Sub-packages under the main package name are
-allowed. For classes spanning multiple public Java packages, pick an
-appropriate name and see what everybody else thinks.
-
-@item native
-This directory holds native code needed by the public Java packages.
-Each package has its own subdirectory, which is the ``flattened'' name
-of the package. For example, native method implementations for
-java.util.zip should go in @file{native/classpath/java-util}. Classpath
-actually includes an all Java version of the zip classes, so no native
-code is required.
-
-@end table
-
-Each person working on a package get's his or her own ``directory
-space'' underneath each of the toplevel directories. In addition to the
-general guidelines above, the following standards should be followed:
-
-@itemize @bullet
-
-@item
-Classes that need to load native code should load a library with the
-same name as the flattened package name, with all hyphens removed. For
-example, the native library name specified in LoadLibrary for
-java-util would be ``javautil''.
-
-@item
-Each package has its own shared library for native code (if any).
-
-@item
-The main native method implementation for a given method in class should
-go in a file with the same name as the class with a ``.c'' extension.
-For example, the JNI implementation of the native methods in
-java.net.InetAddress would go in @file{native/jni/java-net/InetAddress.c}.
-``Internal'' native functions called from the main native method can
-reside in files of any name.
-@end itemize
-
-@node Character Conversions, Localization, Naming Conventions, Top
-@comment node-name, next, previous, up
-@chapter Character Conversions
-
-Java uses the Unicode character encoding system internally. This is a
-sixteen bit (two byte) collection of characters encompassing most of the
-world's written languages. However, Java programs must often deal with
-outside interfaces that are byte (eight bit) oriented. For example, a
-Unix file, a stream of data from a network socket, etc. Beginning with
-Java 1.1, the @code{Reader} and @code{Writer} classes provide functionality
-for dealing with character oriented streams. The classes
-@code{InputStreamReader} and @code{OutputStreamWriter} bridge the gap
-between byte streams and character streams by converting bytes to
-Unicode characters and vice versa.
-
-In Classpath, @code{InputStreamReader} and @code{OutputStreamWriter}
-rely on an internal class called @code{gnu.java.io.EncodingManager} to load
-translaters that perform the actual conversion. There are two types of
-converters, encoders and decoders. Encoders are subclasses of
-@code{gnu.java.io.encoder.Encoder}. This type of converter takes a Java
-(Unicode) character stream or buffer and converts it to bytes using
-a specified encoding scheme. Decoders are a subclass of
-@code{gnu.java.io.decoder.Decoder}. This type of converter takes a
-byte stream or buffer and converts it to Unicode characters. The
-@code{Encoder} and @code{Decoder} classes are subclasses of
-@code{Writer} and @code{Reader} respectively, and so can be used in
-contexts that require character streams, but the Classpath implementation
-currently does not make use of them in this fashion.
-
-The @code{EncodingManager} class searches for requested encoders and
-decoders by name. Since encoders and decoders are separate in Classpath,
-it is possible to have a decoder without an encoder for a particular
-encoding scheme, or vice versa. @code{EncodingManager} searches the
-package path specified by the @code{file.encoding.pkg} property. The
-name of the encoder or decoder is appended to the search path to
-produce the required class name. Note that @code{EncodingManager} knows
-about the default system encoding scheme, which it retrieves from the
-system property @code{file.encoding}, and it will return the proper
-translator for the default encoding if no scheme is specified. Also, the
-Classpath standard translator library, which is the @code{gnu.java.io} package,
-is automatically appended to the end of the path.
-
-For efficiency, @code{EncodingManager} maintains a cache of translators
-that it has loaded. This eliminates the need to search for a commonly
-used translator each time it is requested.
-
-Finally, @code{EncodingManager} supports aliasing of encoding scheme names.
-For example, the ISO Latin-1 encoding scheme can be referred to as
-''8859_1'' or ''ISO-8859-1''. @code{EncodingManager} searches for
-aliases by looking for the existence of a system property called
-@code{gnu.java.io.encoding_scheme_alias.<encoding name>}. If such a
-property exists. The value of that property is assumed to be the
-canonical name of the encoding scheme, and a translator with that name is
-looked up instead of one with the original name.
-
-Here is an example of how @code{EncodingManager} works. A class requests
-a decoder for the ''UTF-8'' encoding scheme by calling
-@code{EncodingManager.getDecoder("UTF-8")}. First, an alias is searched
-for by looking for the system property
-@code{gnu.java.io.encoding_scheme_alias.UTF-8}. In our example, this
-property exists and has the value ''UTF8''. That is the actual
-decoder that will be searched for. Next, @code{EncodingManager} looks
-in its cache for this translator. Assuming it does not find it, it
-searches the translator path, which is this example consists only of
-the default @code{gnu.java.io}. The ''decoder'' package name is
-appended since we are looking for a decoder. (''encoder'' would be
-used if we were looking for an encoder). Then name name of the translator
-is appended. So @code{EncodingManager} attempts to load a translator
-class called @code{gnu.java.io.decoder.UTF8}. If that class is found,
-an instance of it is returned. If it is not found, a
-@code{UnsupportedEncodingException}.
-
-To write a new translator, it is only necessary to subclass
-@code{Encoder} and/or @code{Decoder}. Only a handful of abstract
-methods need to be implemented. In general, no methods need to be
-overridden. The needed methods calculate the number of bytes/chars
-that the translation will generate, convert buffers to/from bytes,
-and read/write a requested number of characters to/from a stream.
-
-Many common encoding schemes use only eight bits to encode characters.
-Writing a translator for these encodings is very easy. There are
-abstract translator classes @code{gnu.java.io.decode.DecoderEightBitLookup}
-and @code{gnu.java.io.encode.EncoderEightBitLookup}. These classes
-implement all of the necessary methods. All that is necessary to
-create a lookup table array that maps bytes to Unicode characters and
-set the class variable @code{lookup_table} equal to it in a static
-initializer. Also, a single constructor that takes an appropriate
-stream as an argument must be supplied. These translators are
-exceptionally easy to create and there are several of them supplied
-in the Classpath distribution.
-
-Writing multi-byte or variable-byte encodings is more difficult, but
-often not especially challenging. The Classpath distribution ships with
-translators for the UTF8 encoding scheme which uses from one to three
-bytes to encode Unicode characters. This can serve as an example of
-how to write such a translator.
-
-Many more translators are needed. All major character encodings should
-eventually be supported.
-
-@node Localization, , Character Conversions, Top
-@comment node-name, next, previous, up
-@chapter Localization
-
-There are many parts of the Java standard runtime library that must
-be customized to the particular locale the program is being run in.
-These include the parsing and display of dates, times, and numbers;
-sorting words alphabetically; breaking sentences into words, etc.
-In general, Classpath uses general classes for performing these tasks,
-and customizes their behavior with configuration data specific to a
-given locale.
-
-@menu
-* String Collation:: Sorting strings in different locales
-* Break Iteration:: Breaking up text into words, sentences, and lines
-* Date Formatting and Parsing:: Locale specific date handling
-* Decimal/Currency Formatting and Parsing:: Local specific number handling
-@end menu
-
-In Classpath, all locale specific data is stored in a
-@code{ListResourceBundle} class in the package @code{gnu/java/locale}.
-The basename of the bundle is @code{LocaleInformation}. See the
-documentation for the @code{java.util.ResourceBundle} class for details
-on how the specific locale classes should be named.
-
-@code{ListResourceBundle}'s are used instead of
-@code{PropertyResourceBundle}'s because data more complex than simple
-strings need to be provided to configure certain Classpath components.
-Because @code{ListResourceBundle} allows an arbitrary Java object to
-be associated with a given configuration option, it provides the
-needed flexibility to accomodate Classpath's needs.
-
-Each Java library component that can be localized requires that certain
-configuration options be specified in the resource bundle for it. It is
-important that each and every option be supplied for a specific
-component or a critical runtime error will most likely result.
-
-As a standard, each option should be assigned a name that is a string.
-If the value is stored in a class or instance variable, then the option
-should name should have the name name as the variable. Also, the value
-associated with each option should be a Java object with the same name
-as the option name (unless a simple scalar value is used). Here is an
-example:
-
-A class loads a value for the @code{format_string} variable from the
-resource bundle in the specified locale. Here is the code in the
-library class:
-
-@example
- ListResourceBundle lrb =
- ListResourceBundle.getBundle ("gnu/java/locale/LocaleInformation", locale);
- String format_string = lrb.getString ("format_string");
-@end example
-
-In the actual resource bundle class, here is how the configuration option
-gets defined:
-
-@example
-/**
- * This is the format string used for displaying values
- */
-private static final String format_string = "%s %d %i";
-
-private static final Object[][] contents =
-@{
- @{ "format_string", format_string @}
-@};
-@end example
-
-Note that each variable should be @code{private}, @code{final}, and
-@code{static}. Each variable should also have a description of what it
-does as a documentation comment. The @code{getContents()} method returns
-the @code{contents} array.
-
-There are many functional areas of the standard class library that are
-configured using this mechanism. A given locale does not need to support
-each functional area. But if a functional area is supported, then all
-of the specified entries for that area must be supplied. In order to
-determine which functional areas are supported, there is a special key
-that is queried by the affected class or classes. If this key exists,
-and has a value that is a @code{Boolean} object wrappering the
-@code{true} value, then full support is assumed. Otherwise it is
-assumed that no support exists for this functional area. Every class
-using resources for configuration must use this scheme and define a special
-scheme that indicates the functional area is supported. Simply checking
-for the resource bundle's existence is not sufficient to ensure that a
-given functional area is supported.
-
-The following sections define the functional areas that use resources
-for locale specific configuration in GNU Classpath. Please refer to the
-documentation for the classes mentioned for details on how these values
-are used. You may also wish to look at the source file for
-@file{gnu/java/locale/LocaleInformation_en} as an example.
-
-@node String Collation, Break Iteration, Localization, Localization
-@comment node-name, next, previous, up
-@section String Collation
-
-Collation involves the sorting of strings. The Java class library provides
-a public class called @code{java.text.RuleBasedCollator} that performs
-sorting based on a set of sorting rules.
-
-@itemize @bullet
-@item RuleBasedCollator - A @code{Boolean} wrappering @code{true} to indicate
-that this functional area is supported.
-@item collation_rules - The rules the specify how string collation is to
-be performed.
-@end itemize
-
-Note that some languages might be too complex for @code{RuleBasedCollator}
-to handle. In this case an entirely new class might need to be written in
-lieu of defining this rule string.
-
-@node Break Iteration, Date Formatting and Parsing, String Collation, Localization
-@comment node-name, next, previous, up
-@section Break Iteration
-
-The class @code{java.text.BreakIterator} breaks text into words, sentences,
-and lines. It is configured with the following resource bundle entries:
-
-@itemize @bullet
-@item BreakIterator - A @code{Boolean} wrappering @code{true} to indicate
-that this functional area is supported.
-@item word_breaks - A @code{String} array of word break character sequences.
-@item sentence_breaks - A @code{String} array of sentence break character
-sequences.
-@item line_breaks - A @code{String} array of line break character sequences.
-@end itemize
-
-@node Date Formatting and Parsing, Decimal/Currency Formatting and Parsing, Break Iteration, Localization
-@comment node-name, next, previous, up
-@section Date Formatting and Parsing
-
-Date formatting and parsing is handled by the
-@code{java.text.SimpleDateFormat} class in most locales. This class is
-configured by attaching an instance of the @code{java.text.DateFormatSymbols}
-class. That class simply reads properties from our locale specific
-resource bundle. The following items are required (refer to the
-documentation of the @code{java.text.DateFormatSymbols} class for details
-io what the actual values should be):
-
-@itemize @bullet
-@item DateFormatSymbols - A @code{Boolean} wrappering @code{true} to indicate
-that this functional area is supported.
-@item months - A @code{String} array of month names.
-@item shortMonths - A @code{String} array of abbreviated month names.
-@item weekdays - A @code{String} array of weekday names.
-@item shortWeekdays - A @code{String} array of abbreviated weekday names.
-@item ampms - A @code{String} array containing AM/PM names.
-@item eras - A @code{String} array containing era (ie, BC/AD) names.
-@item zoneStrings - An array of information about valid timezones for this
-locale.
-@item localPatternChars - A @code{String} defining date/time pattern symbols.
-@item shortDateFormat - The format string for dates used by
-@code{DateFormat.SHORT}
-@item mediumDateFormat - The format string for dates used by
-@code{DateFormat.MEDIUM}
-@item longDateFormat - The format string for dates used by
-@code{DateFormat.LONG}
-@item fullDateFormat - The format string for dates used by
-@code{DateFormat.FULL}
-@item shortTimeFormat - The format string for times used by
-@code{DateFormat.SHORT}
-@item mediumTimeFormat - The format string for times used by
-@code{DateFormat.MEDIUM}
-@item longTimeFormat - The format string for times used by
-@code{DateFormat.LONG}
-@item fullTimeFormat - The format string for times used by
-@code{DateFormat.FULL}
-@end itemize
-
-Note that it may not be possible to use this mechanism for all locales.
-In those cases a special purpose class may need to be written to handle
-date/time processing.
-
-@node Decimal/Currency Formatting and Parsing, , Date Formatting and Parsing, Localization
-@comment node-name, next, previous, up
-@section Decimal/Currency Formatting and Parsing
-
-@code{NumberFormat} is an abstract class for formatting and parsing numbers.
-The class @code{DecimalFormat} provides a concrete subclass that handles
-this is in a locale independent manner. As with @code{SimpleDateFormat},
-this class gets information on how to format numbers from a class that
-wrappers a collection of locale specific formatting values. In this case,
-the class is @code{DecimalFormatSymbols}. That class reads its default
-values for a locale from the resource bundle. The required entries are:
-
-@itemize @bullet
-@item DecimalFormatSymbols - A @code{Boolean} wrappering @code{true} to
-indicate that this functional area is supported.
-@item currencySymbol - The string representing the local currency.
-@item intlCurrencySymbol - The string representing the local currency in an
-international context.
-@item decimalSeparator - The character to use as the decimal point as a
-@code{String}.
-@item digit - The character used to represent digits in a format string,
-as a @code{String}.
-@item exponential - The char used to represent the exponent separator of a
-number written in scientific notation, as a @code{String}.
-@item groupingSeparator - The character used to separate groups of numbers
-in a large number, such as the ``,'' separator for thousands in the US, as
-a @code{String}.
-@item infinity - The string representing infinity.
-@item NaN - The string representing the Java not a number value.
-@item minusSign - The character representing the negative sign, as a
-@code{String}.
-@item monetarySeparator - The decimal point used in currency values, as a
-@code{String}.
-@item patternSeparator - The character used to separate positive and
-negative format patterns, as a @code{String}.
-@item percent - The percent sign, as a @code{String}.
-@item perMill - The per mille sign, as a @code{String}.
-@item zeroDigit - The character representing the digit zero, as a @code{String}.
-@end itemize
-
-Note that several of these values are an individual character. These should
-be wrappered in a @code{String} at character position 0, not in a
-@code{Character} object.
-
-@bye
-
OpenPOWER on IntegriCloud