From cd6d4007aa4f72b51756e4a571abf876fa3e3133 Mon Sep 17 00:00:00 2001
From: Matthias Klose <doko@gcc.gnu.org>
Date: Tue, 21 Oct 2008 17:55:01 +0000
Subject: re PR libgcj/37636 (java tools are unable to find resource files)

libjava/ChangeLog:

2008-10-21  Andrew John Hughes  <gnu_andrew@member.fsf.org>

        * sources.am, Makfile.in: Regenerate.

2008-10-17  Matthias Klose  <doko@ubuntu.com>

	* configure.ac: Fix bashisms.
	* configure: Regenerate.

2008-10-15  Matthias Klose  <doko@ubuntu.com>

	* configure.ac: Disable build of gjdoc, if configured without
	--with-antlr-jar or if no antlr.jar found.
	* configure: Regenerate.

2008-10-09  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* classpath/configure.ac,
	* classpath/m4/ac_prog_antlr.m4,
	* classpath/m4/ac_prog_java.m4,
	* classpath/tools/Makefile.am:
	Ported --regen-gjdoc-parser patch and
	cantlr support from GNU Classpath.

2008-10-06  Andrew Haley  <aph@redhat.com>

	* java/lang/Thread.java (Thread): Always create the ThreadLocalMap
	when creating a thread.
	(getThreadLocals) Don't lazily create the ThreadLocalMap.

2008-09-28  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* classpath/java/lang/ThreadLocalMap.java,
	* java/lang/ThreadLocalMap$Entry.h,
	* java/lang/ThreadLocalMap.h,
	* lib/java/lang/ThreadLocalMap.class,
	* lib/java/lang/ThreadLocalMap$Entry.class:
	Add the new files for the ThreadLocal patch.

2008-09-28  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* classpath/ChangeLog,
	* classpath/java/lang/InheritableThreadLocal.java,
	* classpath/java/lang/Thread.java,
	* classpath/java/lang/ThreadLocal.java:
	Merge Daniel Frampton's ThreadLocal patch.
	* gcj/javaprims.h: Updated.
	* java/lang/Thread.h: Regenerated.
	* java/lang/Thread.java:
	Replace WeakIdentityHashMap with ThreadLocalMap.
	(getThreadLocals()): Likewise.
	* java/lang/ThreadLocal.h: Regenerated.
	* java/lang/ThreadLocal.java:
	(computeNextHash()): New method.
	(ThreadLocal()): Initialise fastHash.
	(internalGet()): Updated to match Classpath's get().
	(internalSet(Object)): Likewise for set(Object).
	(internalRemove()): Likewise for remove().

2008-09-25  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* classpath/configure,
	* classpath/configure.ac:
	Resynchronise with Classpath's configure.
	* classpath/examples/Makefile.in:
	Add equivalent support for building as in
	tools/Makefile.in.
	* classpath/java/nio/Buffer.java,
	* classpath/java/nio/ByteBuffer.java,
	* classpath/java/nio/ByteBufferImpl.java,
	* classpath/java/nio/CharBuffer.java,
	* classpath/java/nio/CharBufferImpl.java,
	* classpath/java/nio/CharSequenceBuffer.java,
	* classpath/java/nio/CharViewBufferImpl.java,
	* classpath/java/nio/DirectByteBufferImpl.java,
	* classpath/java/nio/DoubleBuffer.java,
	* classpath/java/nio/DoubleBufferImpl.java,
	* classpath/java/nio/DoubleViewBufferImpl.java,
	* classpath/java/nio/FloatBuffer.java,
	* classpath/java/nio/FloatBufferImpl.java,
	* classpath/java/nio/FloatViewBufferImpl.java,
	* classpath/java/nio/IntBuffer.java,
	* classpath/java/nio/IntBufferImpl.java,
	* classpath/java/nio/IntViewBufferImpl.java,
	* classpath/java/nio/LongBuffer.java,
	* classpath/java/nio/LongBufferImpl.java,
	* classpath/java/nio/LongViewBufferImpl.java,
	* classpath/java/nio/MappedByteBuffer.java,
	* classpath/java/nio/MappedByteBufferImpl.java,
	* classpath/java/nio/ShortBuffer.java,
	* classpath/java/nio/ShortBufferImpl.java,
	* classpath/java/nio/ShortViewBufferImpl.java:
	Replace use of gnu.classpath.Pointer with gnu.gcj.RawData,
	and fix some formatting issues.
	* classpath/tools/gnu/classpath/tools/gjdoc/expr/JavaLexer.java,
	* classpath/tools/gnu/classpath/tools/gjdoc/expr/JavaLexer.smap,
	* classpath/tools/gnu/classpath/tools/gjdoc/expr/JavaRecognizer.java,
	* classpath/tools/gnu/classpath/tools/gjdoc/expr/JavaRecognizer.smap,
	* classpath/tools/gnu/classpath/tools/gjdoc/expr/JavaTokenTypes.java,
	* classpath/tools/gnu/classpath/tools/gjdoc/expr/JavaTokenTypes.txt:
	Regenerated (later version of antlr).
	* java/nio/Buffer.h: Regenerated.
	* java/nio/Buffer.java: Ported changes from Classpath.
	* java/nio/ByteBuffer.h,
	* java/nio/CharBuffer.h: Regenerated.
	* java/nio/DirectByteBufferImpl.java: Ported changes from
	Classpath.
	* java/nio/DoubleBuffer.h,
	* java/nio/FloatBuffer.h,
	* java/nio/IntBuffer.h,
	* java/nio/LongBuffer.h,
	* java/nio/MappedByteBuffer.h,
	* java/nio/MappedByteBufferImpl.h: Regenerated.
	* java/nio/MappedByteBufferImpl.java: Ported changes from
	Classpath.
	* java/nio/ShortBuffer.h: Regenerated.

2008-09-24  Matthias Klose  <doko@ubuntu.com>

	* configure.ac: Search for antlr.jar, if not configured.
	* configure: Regenerate.

2008-09-24  Matthias Klose  <doko@ubuntu.com>

	* Makefile.am: Build a gjdoc binary, if enabled.
	* configure.ac: Add options --disable-gjdoc, --with-antlr-jar=file.
	* Makefile.in, */Makefile.in, configure: Regenerate.

2008-09-22  Andrew Haley  <aph@redhat.com>

	* java/lang/String.java (toString(char[], int, int)): New method.

2008-09-14  Matthias Klose  <doko@ubuntu.com>

	Import GNU Classpath (libgcj-import-20080914).

	* Regenerate class and header files.
	* Regenerate auto* files.
	* configure.ac: Don't pass --disable-gjdoc to classpath.
	* sources.am: Regenerated.
	* HACKING: Mention to build gjdoc in maintainer builds.
	* gnu/classpath/Configuration.java: Update classpath version.
	* gcj/javaprims.h: Update.

2008-09-08  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* Makefile.am: Replace natStringBuffer.cc
	and natStringBuilder.cc with natAbstractStringBuffer.cc.
	* Makefile.in: Regenerated.
	* java/lang/AbstractStringBuffer.java:
	(append(int)): Made native.
	(regionMatches(int,String)): Likewise.
	* java/lang/StringBuffer.h: Regenerated.
	* java/lang/StringBuffer.java: Remerged with GNU Classpath.
	* java/lang/StringBuilder.h: Regenerated.
	* java/lang/StringBuilder.java: Remerged with GNU Classpath.
	* java/lang/natAbstractStringBuffer.cc: Provide common
	native methods for StringBuffer and StringBuilder.
	* java/lang/natStringBuffer.cc,
	* java/lang/natStringBuilder.cc: Removed.

2008-09-04  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* Makefile.in,
	* classpath/configure: Regenerated.
	* gnu/gcj/util/natDebug.cc,
	* gnu/gcj/xlib/natColormap.cc,
	* gnu/gcj/xlib/natDisplay.cc,
	* gnu/gcj/xlib/natDrawable.cc,
	* gnu/gcj/xlib/natFont.cc,
	* gnu/gcj/xlib/natWMSizeHints.cc,
	* gnu/gcj/xlib/natWindow.cc,
	* gnu/gcj/xlib/natXImage.cc:
	Add :: prefix to namespaces.
	* java/io/CharArrayWriter.h,
	* java/lang/StringBuffer.h:
	Regenerated using patched gjavah.
	* java/lang/natStringBuffer.cc:
	Fix naming of append(jint).
	* java/sql/Timestamp.h: Regenerated
	using patched gjavah.
	* jni.cc: Rename p to functions
	to match change in GNU Classpath.
	* scripts/makemake.tcl: Switch
	gnu.java.math to BC compilation.
	* sources.am: Regenerated.

2008-08-21  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* Makefile.in: Updated location of Configuration.java.
	* classpath/lib/gnu/java/locale/LocaleData.class: Regenerated.

2008-08-18  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* Makefile.in: Updated with new Java files.
	* classpath/configure: Regenerated.
	* classpath/tools/Makefile.am: Add missing
	use of GJDOC_EX so --disable-gjdoc works.
	* classpath/tools/Makefile.in: Regenerated.

2008-08-15  Matthias Klose  <doko@ubuntu.com>

	Import GNU Classpath (libgcj-import-20080811).

	* Regenerate class and header files.
	* Regenerate auto* files.
	* configure.ac: Don't pass --with-fastjar to classpath, substitute new
	dummy value in classpath/gnu/classpath/Configuration.java.in, pass
	--disable-gjdoc to classpath.
	* scripts/makemake.tcl:
	* sources.am: Regenerated.
	* java/lang/AbstractStringBuffer.java, gnu/java/lang/VMCPStringBuilder.java:
	New, copied from classpath, use System instead of VMSystem.
	* java/lang/StringBuffer.java: Merge from classpath.
	* java/lang/ClassLoader.java: Merge from classpath.
	* gcj/javaprims.h: Update class definitions,
	remove _Jv_jobjectRefType, jobjectRefType definitions.

libjava/classpath/ChangeLog.gcj:

2008-10-21  Matthias Klose  <doko@ubuntu.com>

        * classpath/tools/gnu/classpath/tools/gjdoc/expr/Java*: Move from ...
        * classpath/tools/generated/gnu/classpath/tools/gjdoc/expr/ ... here.
        * Update .class files.

2008-10-21  Andrew John Hughes  <gnu_andrew@member.fsf.org>

        * tools/Makefile.am:
        Always generate parser in the srcdir.

2008-10-21  Matthias Klose  <doko@ubuntu.com>

        * doc/Makefile.am (MAINTAINERCLEANFILES): Add gjdoc.1.
        * doc/Makefile.in: Regenerate.

2008-10-20  Matthias Klose  <doko@ubuntu.com>

	* configure.ac: Don't check for working java, if not configured
        with --enable-java-maintainer-mode.
	* configure: Regenerate.

2008-10-19  Matthias Klose  <doko@ubuntu.com>

	* m4/ac_prog_java.m4: Revert previous change.
	* m4/ac_prog_javac.m4: Apply it here.
	* configure: Regenerate.

2008-10-19  Matthias Klose  <doko@ubuntu.com>

	* m4/ac_prog_javac.m4: Don't check for working javac, if not configured
	with --enable-java-maintainer-mode.
	* configure: Regenerate.
	* Makefile.in, */Makefile.in: Regenerate.

2008-09-30  Matthias Klose  <doko@ubuntu.com>

	* m4/ac_prog_antlr.m4: Check for cantlr binary as well.

2008-09-29  Matthias Klose  <doko@ubuntu.com>

	* m4/ac_prog_antlr.m4: Check for antlr binary as well.

2008-09-28  Matthias Klose  <doko@ubuntu.com>

	* PR libgcj/37636. Revert:
	2008-02-20  Matthias Klose  <doko@ubuntu.com>

	* tools/Makefile.am ($(TOOLS_ZIP)): Revert part of previous change,
	Do copy resource files in JAVA_MAINTAINER_MODE only.
	* tools/Makefile.in: Regenerate.

2008-09-14  Matthias Klose  <doko@ubuntu.com>

	* m4/ac_prog_javac_works.m4, m4/ac_prog_javac.m4, m4/acinclude.m4:
	Revert local changes.
	* m4/ac_prog_antlr.m4: Check for an runantlr binary.
	* tools/Makefile.am, lib/Makefile.am: Revert local changes (JCOMPILER).
	* tools/Makefile.am: Remove USE_JAVAC_FLAGS, pass ANTLR_JAR in
	GLIBJ_CLASSPATH.

2008-09-14  Matthias Klose  <doko@ubuntu.com>

	Revert:
	Daniel Frampton  <zyridium at zyridium.net>

	* AUTHORS: Added.
	* java/lang/InheritableThreadLocal.java,
	* java/lang/Thread.java,
	* java/lang/ThreadLocal.java:
	Modified to use java.lang.ThreadLocalMap.
	* java/lang/ThreadLocalMap.java:
	New cheaper ThreadLocal-specific WeakHashMap.

2008-08-15  Matthias Klose  <doko@ubuntu.com>

	* m4/acinclude.m4 (CLASSPATH_JAVAC_MEM_CHECK): Remove unknown
	args for javac.

libjava/classpath/ChangeLog:

2008-10-20  Andrew John Hughes  <gnu_andrew@member.fsf.org>

        * m4/ac_prog_antlr.m4:
        Remove redundant checks.
        * tools/Makefile.am:
        Use gjdoc_gendir when calling antlr.

2008-10-15  Andrew John Hughes  <gnu_andrew@member.fsf.org>

        * configure.ac:
        Remove superfluous AC_PROG_JAVA call.

2008-10-06  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* m4/ac_prog_antlr:
	Check for cantlr as well.
	* tools/Makefile.am:
	Only build GJDoc parser when both
	CREATE_GJDOC and CREATE_GJDOC_PARSER
	are on.

2008-10-02  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* configure.ac:
	Add regen-gjdoc-parser option,
	and separate antlr tests.
	* m4/ac_prog_antlr.m4:
	Turn single test into AC_LIB_ANTLR
	and AC_PROG_ANTLR.
	* m4/ac_prog_java.m4:
	Quote tests.
	* tools/Makefile.am:
	Support CREATE_GJDOC_PARSER option.

2008-09-14  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* examples/Makefile.am:
        Check lib directly as well as glibj.zip
        for boot classes.
	* m4/acinclude.m4:
        Only require the class files to be built
        to allow the tools and examples to be built,
        not the installation of glibj.zip.
	* tools/Makefile.am:
	Check lib directly as well as glibj.zip
	for boot classes.

2008-09-13  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* examples/Makefile.am,
	* lib/Makefile.am:
	Add GCJ rules.
	* m4/ac_prog_javac.m4:
	Check whether JAVAC is gcj.
	* m4/ac_prog_javac_works.m4:
	Add GCJ rules.
	* m4/acinclude.m4:
	Don't bother checking for -J
	if using GCJ.
	* tools/Makefile.am:
	Add GCJ rules.

2007-08-23  Daniel Frampton  <zyridium@zyridium.net>

	* AUTHORS: Added.
	* java/lang/InheritableThreadLocal.java,
	* java/lang/Thread.java,
	* java/lang/ThreadLocal.java:
	Modified to use java.lang.ThreadLocalMap.
	* java/lang/ThreadLocalMap.java:
	New cheaper ThreadLocal-specific WeakHashMap.

2008-02-07  Ian Rogers  <ian.rogers@manchester.ac.uk>

	* java/util/zip/ZipEntry.java:
	Use byte fields instead of integer fields,
	store the time as well as the DOS time and
	don't retain a global Calendar instance.
	(setDOSTime(int)): Set KNOWN_DOSTIME instead
	of KNOWN_TIME, and unset KNOWN_TIME.
	(getDOSTime()): Compute DOS time from UNIX time
	only when needed.
	(clone()): Provide cloning via the ZipEntry constructor
	where possible.
	(setTime(long)): Don't compute DOS time at this point.
	(getCalendar()): Removed.

2008-09-09  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* tools/gnu/classpath/tools/getopt/Parser.java:
	(setHeader(String)): Make synchronized.
	(setFooter(String)): Likewise.
	* tools/gnu/classpath/tools/rmic/SourceGiopRmicCompiler.java,
	(reset()): Make synchronized.
	(name(Class)): Likewise.

2008-09-04  Robert Schuster  <robertschuster@fsfe.org>

	* gnu/java/nio/charset/ByteDecodeLoopHelper:
	(arrayDecodeLoop): Added new break label, escape to that label.
	* gnu/java/nio/charset/ByteEncodeLoopHelper:
	(arrayDecodeLoop): Added new break label, escape to that label.

2008-09-04  Robert Schuster  <robertschuster@fsfe.org>

	* java/text/DecimalFormat.java:
	(scanFix): Use 'i + 1' when looking at following character.
	(scanNegativePattern): Dito.

2008-09-02  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* tools/gnu/classpath/tools/javah/ClassWrapper.java:
	(makeVtable()): Populate methodNameMap.
	(printMethods(CniPrintStream)): Always use pre-populated
	methodNameMap for bridge targets.

2008-09-01  Mario Torre  <neugens@aicas.com>

	* gnu/java/awt/peer/x/XImage.java (XImageProducer): remove @Override
	annotation to allow compilation on javac < 1.6 and ecj < 3.4.

2008-09-01  Mario Torre  <neugens@aicas.com>

	* gnu/java/awt/peer/x/XGraphicsDevice.java (getDisplay): fix to support
	new Escher API.
	* gnu/java/awt/peer/x/XImage.java (getSource): method implemented.
	* gnu/java/awt/peer/x/XImage.java (XImageProducer): implement ImageProducer
	for getSource.

2008-09-01  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* gnu/java/util/regex/BacktrackStack.java,
	* gnu/java/util/regex/CharIndexed.java,
	* gnu/java/util/regex/CharIndexedCharArray.java,
	* gnu/java/util/regex/CharIndexedCharSequence.java,
	* gnu/java/util/regex/CharIndexedInputStream.java,
	* gnu/java/util/regex/CharIndexedString.java,
	* gnu/java/util/regex/CharIndexedStringBuffer.java,
	* gnu/java/util/regex/RE.java,
	* gnu/java/util/regex/REException.java,
	* gnu/java/util/regex/REFilterInputStream.java,
	* gnu/java/util/regex/REMatch.java,
	* gnu/java/util/regex/REMatchEnumeration.java,
	* gnu/java/util/regex/RESyntax.java,
	* gnu/java/util/regex/REToken.java,
	* gnu/java/util/regex/RETokenAny.java,
	* gnu/java/util/regex/RETokenBackRef.java,
	* gnu/java/util/regex/RETokenChar.java,
	* gnu/java/util/regex/RETokenEnd.java,
	* gnu/java/util/regex/RETokenEndOfPreviousMatch.java,
	* gnu/java/util/regex/RETokenEndSub.java,
	* gnu/java/util/regex/RETokenIndependent.java,
	* gnu/java/util/regex/RETokenLookAhead.java,
	* gnu/java/util/regex/RETokenLookBehind.java,
	* gnu/java/util/regex/RETokenNamedProperty.java,
	* gnu/java/util/regex/RETokenOneOf.java,
	* gnu/java/util/regex/RETokenPOSIX.java,
	* gnu/java/util/regex/RETokenRange.java,
	* gnu/java/util/regex/RETokenRepeated.java,
	* gnu/java/util/regex/RETokenStart.java,
	* gnu/java/util/regex/RETokenWordBoundary.java,
	* gnu/java/util/regex/UncheckedRE.java:
	Fix indentation.

2008-09-01  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* gnu/java/util/regex/RETokenStart.java:
	(getMaximumLength()): Add Override annotation.
	(matchThis(CharIndexed, REMatch)): Likewise.
	(returnsFixedLengthMatches()): Renamed from
	returnsFixedLengthmatches and added Override
	annotation.
	(findFixedLengthMatches(CharIndexed,REMatch,int)):
	Add Override annotation.
	(dump(CPStringBuilder)): Likewise.
	* gnu/javax/print/ipp/IppRequest.java:
	(RequestWriter.writeOperationAttributes(AttributeSet)):
	Throw exception, don't just create and drop it.
	* javax/management/MBeanServerPermission.java:
	(MBeanServerPermissionCollection.add(Permission)): Compare
	against individual Strings not the entire array, and
	store the result of replace.
	* javax/swing/text/html/StyleSheet.java:
	(setBaseFontSize(size)): Store result of trim().

2008-09-01  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* javax/tools/FileObject.java:
	(openReader(boolean)): Document new parameter.

2008-03-27  Michael Franz  <mvfranz@gmail.com>

	PR classpath/35690:
	* javax/tools/FileObject.java:
	(toUri()): Fix case from toURI.
	(openReader(boolean)): Add missing boolean argument.

2008-08-26  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	PR classpath/35487:
	* gnu/javax/management/Server.java:
	(beans): Change to ConcurrentHashMap.
	(defaultDomain): Make final.
	(outer): Likewise.
	(LazyListenersHolder): Added to wrap
	listeners, also now a ConcurrentHashMap,
	providing lazy initialisation safely.
	(sequenceNumber): Documented.
	(getBean(ObjectName)): Remove redundant cast.
	(addNotificationListener(ObjectName,NotificationListener,
	NotificationFilter,Object)): Remove map initialisation
	and use holder.
	(getObjectInstance(ObjectName)): Remove redundant cast.
	(registerMBean(Object,ObjectName)): Add bean atomically.
	(removeNotificationListener(ObjectName,NotificationListener)):
	Simplified.
	(removeNotificationListener(ObjectName,NotificationListener,
	NotificationFilter,Object)): Likewise.
	(notify(ObjectName,String)): Documented.

2008-08-26  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* gnu/javax/management/Server.java:
	Genericised.

2008-08-26  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* gnu/javax/management/Translator.java:
	Genericised.

2008-08-26  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* javax/management/DefaultLoaderRepository.java,
	* javax/management/JMX.java,
	* javax/management/MBeanAttributeInfo.java,
	* javax/management/MBeanConstructorInfo.java,
	* javax/management/MBeanOperationInfo.java,
	* javax/management/MBeanServerDelegate.java:
	Fix warnings due to generics.

2008-08-25  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* javax/management/MBeanPermission.java,
	* javax/management/MBeanServerDelegate.java,
	* javax/management/MBeanServerFactory.java,
	* javax/management/MBeanServerInvocationHandler.java,
	* javax/management/MBeanServerPermission.java:
	Fix warnings due to use of non-generic collections.

2008-08-25  Mario Torre  <neugens@aicas.com>

	* gnu/javax/rmi/CORBA/RmiUtilities.java (readValue): check if sender is
	null to avoid NPE.

2008-08-22  Mario Torre  <neugens@aicas.com>

	* gnu/CORBA/OrbFunctional.java (set_parameters): Fix
	NullPointerException checking when param is null.

2008-08-23  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* java/util/regex/Matcher.java:
	(reset()): Reset append position so
	we don't try and append to the end of
	the old input.

2008-08-22  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	PR classpath/32028:
	* m4/acinclude.m4:
	Also allow versions of GJDoc from 0.8* on, as
	CVS is 0.8.0-pre.

2008-08-21  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	PR classpath/32028:
	* m4/acinclude.m4:
	(CLASSPATH_WITH_GJDOC): Ensure version 0.7.9 is
	being used.

2008-08-20  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* tools/Makefile.am:
	Add taglets subdirectory to list of excluded
	paths when GJDoc is not compiled.

2008-08-19  David P Grove  <groved@us.ibm.com>

	* scripts/check_jni_methods.sh.in:
	Fix build issue on AIX by splitting generation
	of method list.

2008-08-18  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* native/jni/gstreamer-peer/gst_native_pipeline.c:
	(get_free_space(int)): Use #else not #elif when
	there is no condition.

2008-08-17  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	PR classpath/31895:
	* java/text/DecimalFormat.java:
	(setCurrency(Currency)): Update prefixes and
	suffixes when currency changes.
	* java/text/DecimalFormatSymbols.java:
	(DecimalFormatSymbols(Locale)): Set locale earlier
	so it can be used by setCurrency(Currency).
	(setCurrency(Currency)): Set the symbol correctly using
	the locale of the instance.
	* java/util/Currency.java:
	Throw error instead of just printing a message.

2008-08-17  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* javax/activation/ActivationDataFlavor.java:
	Suppress warnings from public API.
	(mimeType): Made final.
	(representationClass): Added generic type and
	made final.
	(normalizeMimeTypeParameter(String,String)):
	Use CPStringBuilder.
	* javax/activation/CommandInfo.java:
	(verb): Made final.
	(className): Made final.
	* javax/activation/DataHandler.java:
	(dataSource): Made final.
	* javax/activation/FileDataSource.java:
	(file): Made final.
	* javax/activation/MailcapCommandMap.java:
	Use generics on collections and CPStringBuilder
	instead of StringBuffer.
	* javax/activation/MimeType.java:
	(toString()): Use CPStringBuilder.
	(getBaseType()): Likewise.
	* javax/activation/MimeTypeParameterList.java:
	Use generics on collections and CPStringBuilder
	instead of StringBuffer.
	* javax/activation/MimeTypeParseException.java:
	(MimeTypeParseException(String,String)): Use
	CPStringBuilder.
	* javax/activation/MimetypesFileTypeMap.java:
	Use generics on collections and CPStringBuilder
	instead of StringBuffer.
	* javax/activation/URLDataSource.java:
	(url): Made final.

2008-08-17  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* gnu/javax/activation/viewers/ImageViewer.java,
	* gnu/javax/activation/viewers/TextEditor.java,
	* gnu/javax/activation/viewers/TextViewer.java,
	* javax/activation/ActivationDataFlavor.java,
	* javax/activation/CommandInfo.java,
	* javax/activation/CommandMap.java,
	* javax/activation/CommandObject.java,
	* javax/activation/DataContentHandler.java,
	* javax/activation/DataContentHandlerFactory.java,
	* javax/activation/DataHandler.java,
	* javax/activation/DataHandlerDataSource.java,
	* javax/activation/DataSource.java,
	* javax/activation/DataSourceDataContentHandler.java,
	* javax/activation/FileDataSource.java,
	* javax/activation/FileTypeMap.java,
	* javax/activation/MailcapCommandMap.java,
	* javax/activation/MimeType.java,
	* javax/activation/MimeTypeParameterList.java,
	* javax/activation/MimeTypeParseException.java,
	* javax/activation/MimetypesFileTypeMap.java,
	* javax/activation/ObjectDataContentHandler.java,
	* javax/activation/URLDataSource.java,
	* javax/activation/UnsupportedDataTypeException.java,
	* javax/activation/package.html,
	* resource/META-INF/mailcap.default,
	* resource/META-INF/mimetypes.default:
	Import GNU JAF CVS as of 17/08/2008.

2006-04-25  Archit Shah  <ashah@redhat.com>

	* javax/activation/MimeTypeParameterList.java:
	Insert ';' separator before parameter list.

2005-06-29  Xavier Poinsard  <xpoinsard@openpricer.com>

	* javax/activation/ObjectDataContentHandler.java:
	Fixed typo.

2005-05-28  Chris Burdess  <dog@bluezoo.org>

	* javax/activation/CommandMap.java,
	* javax/activation/MailcapCommandMap.java:
	Updated to JAF 1.1.

2004-06-09  Chris Burdess  <dog@bluezoo.org>

	* javax/activation/MailcapCommandMap.java:
	Fixed bug whereby x-java prefix was not
	attempted.

2008-08-17  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* AUTHORS: Added Laszlo.

2008-04-20  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	PR classpath/30436:
	* java/util/Scanner.java:
	Fix package to be java.util and correct
	indentation.

2007-07-25  Laszlo Andras Hernadi  <e0327023@student.tuwien.ac.at>

	PR classpath/30436:
	* java/util/Scanner.java:
	Initial implementation.

2008-08-17  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* java/util/regex/Matcher.java:
	(toMatchResult()): Implemented.

2008-08-13  Joshua Sumali  <jsumali@redhat.com>

	* doc/Makefile.am (gjdoc.pod): Generate gjdoc pod from cp-tools.texinfo
	instead of invoke.texi. Remove invoke.texi from EXTRA_DIST.
	* doc/invoke.texi: Removed and merged into ...
	* doc/cp-tools.texinfo: Here

2008-08-12  Robert Schuster  <robertschuster@fsfe.org>

	* native/jni/java-net/local.c
	(local_bind): Removed fprintf call, fixed access outside
	of array bounds.

From-SVN: r141271
---
 .../javax/activation/MailcapCommandMap.java        | 804 +++++++++++++++++++++
 1 file changed, 804 insertions(+)
 create mode 100644 libjava/classpath/javax/activation/MailcapCommandMap.java

(limited to 'libjava/classpath/javax/activation/MailcapCommandMap.java')

diff --git a/libjava/classpath/javax/activation/MailcapCommandMap.java b/libjava/classpath/javax/activation/MailcapCommandMap.java
new file mode 100644
index 0000000..cca5f04
--- /dev/null
+++ b/libjava/classpath/javax/activation/MailcapCommandMap.java
@@ -0,0 +1,804 @@
+/* MailcapCommandMap.java -- Command map implementation using a mailcap file.
+   Copyright (C) 2004 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+package javax.activation;
+
+import gnu.java.lang.CPStringBuilder;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.LinkedHashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Implementation of a command map using a <code>mailcap</code> file (RFC
+ * 1524). Mailcap files are searched for in the following places:
+ * <ol>
+ * <li>Programmatically added entries to this interface</li>
+ * <li>the file <tt>.mailcap</tt> in the user's home directory</li>
+ * <li>the file <i>&lt;java.home&gt;</i><tt>/lib/mailcap</tt></li>
+ * <li>the resource <tt>META-INF/mailcap</tt></li>
+ * <li>the resource <tt>META-INF/mailcap.default</tt> in the JAF
+ * distribution</li>
+ * </ol>
+ *
+ * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
+ * @version 1.1
+ */
+public class MailcapCommandMap
+    extends CommandMap
+{
+
+  private static final int PROG = 0;
+  private static final int HOME = 1;
+  private static final int SYS = 2;
+  private static final int JAR = 3;
+  private static final int DEF = 4;
+  private static boolean debug = false;
+  private static final int NORMAL = 0;
+  private static final int FALLBACK = 1;
+  
+  static 
+  {
+    try
+      {
+        String d = System.getProperty("javax.activation.debug");
+        debug = Boolean.valueOf(d).booleanValue();
+      }
+    catch (SecurityException e)
+      {
+      }
+  }
+  
+  private Map<String,Map<String,List<String>>>[][] mailcaps;
+  
+  /**
+   * Default constructor.
+   */
+  public MailcapCommandMap()
+  {
+    init(null);
+  }
+  
+  /**
+   * Constructor specifying a filename.
+   * @param fileName the name of the file to read mailcap entries from
+   */
+  public MailcapCommandMap(String fileName)
+    throws IOException
+  {
+    Reader in = null;
+    try
+      {
+        in = new FileReader(fileName);
+      }
+    catch (IOException e)
+      {
+      }
+    init(in);
+    if (in != null)
+      {
+        try
+          {
+            in.close();
+          }
+        catch (IOException e)
+          {
+          }
+      }
+  }
+  
+  /**
+   * Constructor specifying an input stream.
+   * @param is the input stream to read mailcap entries from
+   */
+  public MailcapCommandMap(InputStream is)
+  {
+    init(new InputStreamReader(is));
+  }
+
+  private void init(Reader in)
+  {
+    mailcaps = new Map[5][2];
+    for (int i = 0; i < 5; i++)
+      {
+        for (int j = 0; j < 2; j++)
+          {
+            mailcaps[i][j] =
+	      new LinkedHashMap<String,Map<String,List<String>>>();
+          }
+      }
+    if (in != null)
+      {
+        if (debug)
+          {
+            System.out.println("MailcapCommandMap: load PROG");
+          }
+        try
+          {
+            parse(PROG, in);
+          }
+        catch (IOException e)
+          {
+          }
+      }
+    
+    if (debug)
+      {
+        System.out.println("MailcapCommandMap: load HOME");
+      }
+    try
+      {
+        String home = System.getProperty("user.home");
+        if (home != null)
+          {
+            parseFile(HOME, new CPStringBuilder(home)
+                      .append(File.separatorChar)
+                      .append(".mailcap")
+                      .toString());
+          }
+      }
+    catch (SecurityException e)
+      {
+      }
+    
+    if (debug)
+      {
+        System.out.println("MailcapCommandMap: load SYS");
+      }
+    try
+      {
+        parseFile(SYS, 
+                  new CPStringBuilder(System.getProperty("java.home"))
+                  .append(File.separatorChar)                                                     
+		  .append("lib")
+                  .append(File.separatorChar)
+                  .append("mailcap")
+                  .toString());
+      }
+    catch (SecurityException e)
+      {
+      }
+    
+    if (debug)
+      {
+        System.out.println("MailcapCommandMap: load JAR");
+      }
+    List<URL> systemResources = getSystemResources("META-INF/mailcap");
+    int len = systemResources.size();
+    if (len > 0)
+      {
+        for (int i = 0; i < len ; i++)
+          {
+            Reader urlIn = null;
+            URL url = systemResources.get(i);
+            try
+              {
+                if (debug)
+                  {
+                    System.out.println("\t" + url.toString());
+                  }
+                urlIn = new InputStreamReader(url.openStream());
+                parse(JAR, urlIn);
+              }
+            catch (IOException e)
+              {
+                if (debug)
+                  {
+                    System.out.println(e.getClass().getName() + ": " +
+                                       e.getMessage());
+                  }
+              }
+            finally
+              {
+                if (urlIn != null)
+                  {
+                    try
+                      {
+                        urlIn.close();
+                      }
+                    catch (IOException e)
+                      {
+                      }
+                  }
+              }
+          }
+      }
+    else
+      {
+        parseResource(JAR, "/META-INF/mailcap");
+      }
+    
+    if (debug)
+      {
+        System.out.println("MailcapCommandMap: load DEF");
+      }
+    parseResource(DEF, "/META-INF/mailcap.default");
+  }
+  
+  /**
+   * Returns the list of preferred commands for a given MIME type.
+   * @param mimeType the MIME type
+   */
+  public synchronized CommandInfo[] getPreferredCommands(String mimeType)
+  {
+    List<CommandInfo> cmdList = new ArrayList<CommandInfo>();
+    List<String> verbList = new ArrayList<String>();
+    for (int i = 0; i < 2; i++)
+      {
+        for (int j = 0; j < 5; j++)
+          {
+            Map<String,List<String>> map = getCommands(mailcaps[j][i], mimeType);
+            if (map != null)
+              {
+                for (Map.Entry<String,List<String>> entry : map.entrySet())
+                  {
+                    String verb = entry.getKey();
+                    if (!verbList.contains(verb))
+                      {
+                        List<String> classNames = entry.getValue();
+                        String className = classNames.get(0);
+                        CommandInfo cmd = new CommandInfo(verb, className);
+                        cmdList.add(cmd);
+                        verbList.add(verb);
+                      }
+                  }
+              }
+          }
+      }
+    CommandInfo[] cmds = new CommandInfo[cmdList.size()];
+    cmdList.toArray(cmds);
+    return cmds;
+  }
+  
+  /**
+   * Returns all commands for the given MIME type.
+   * @param mimeType the MIME type
+   */
+  public synchronized CommandInfo[] getAllCommands(String mimeType)
+  {
+    List<CommandInfo> cmdList = new ArrayList<CommandInfo>();
+    for (int i = 0; i < 2; i++)
+      {
+        for (int j = 0; j < 5; j++)
+          {
+            Map<String,List<String>> map = getCommands(mailcaps[j][i], mimeType);
+            if (map != null)
+              {
+                for (Map.Entry<String,List<String>> entry : map.entrySet())
+                  {
+                    String verb = entry.getKey();
+                    List<String> classNames = entry.getValue();
+                    int len = classNames.size();
+                    for (int l = 0; l < len; l++)
+                      {
+                        String className = classNames.get(l);
+                        CommandInfo cmd = new CommandInfo(verb, className);
+                        cmdList.add(cmd);
+                      }
+                  }
+              }
+          }
+      }
+    CommandInfo[] cmds = new CommandInfo[cmdList.size()];
+    cmdList.toArray(cmds);
+    return cmds;
+  }
+
+  /**
+   * Returns the command with the specified name for the given MIME type.
+   * @param mimeType the MIME type
+   * @param cmdName the command verb
+   */
+  public synchronized CommandInfo getCommand(String mimeType,
+                                             String cmdName)
+  {
+    for (int i = 0; i < 2; i++)
+      {
+        for (int j = 0; j < 5; j++)
+          {
+            Map<String,List<String>> map =
+	      getCommands(mailcaps[j][i], mimeType);
+            if (map != null)
+              {
+                List<String> classNames = map.get(cmdName);
+                if (classNames == null)
+                  {
+                    classNames = map.get("x-java-" + cmdName);
+                  }
+                if (classNames != null)
+                  {
+                    String className = classNames.get(0);
+                    return new CommandInfo(cmdName, className);
+                  }
+              }
+          }
+      }
+    return null;
+  }
+
+  /**
+   * Adds entries programmatically to the registry.
+   * @param mailcap a mailcap string
+   */
+  public synchronized void addMailcap(String mailcap)
+  {
+    if (debug)
+      {
+        System.out.println("MailcapCommandMap: add to PROG");
+      }
+    try
+      {
+        parse(PROG, new StringReader(mailcap));
+      }
+    catch (IOException e)
+      {
+      }
+  }
+
+  /**
+   * Returns the DCH for the specified MIME type.
+   * @param mimeType the MIME type
+   */
+  public synchronized DataContentHandler
+    createDataContentHandler(String mimeType)
+  {
+    if (debug)
+      {
+        System.out.println("MailcapCommandMap: " +
+                           "createDataContentHandler for " + mimeType);
+      }
+    for (int i = 0; i < 2; i++)
+      {
+        for (int j = 0; j < 5; j++)
+          {
+            if (debug)
+              {
+                System.out.println("  search DB #" + i);
+              }
+            Map<String,List<String>> map = getCommands(mailcaps[j][i], mimeType);
+            if (map != null)
+              {
+                List<String> classNames = map.get("content-handler");
+                if (classNames == null)
+                  {
+                    classNames = map.get("x-java-content-handler");
+                  }
+                if (classNames != null)
+                  {
+                    String className = classNames.get(0);
+                    if (debug)
+                      {
+                        System.out.println("  In " + nameOf(j) +
+                                           ", content-handler=" + className);
+                      }
+                    try
+                      {
+                        Class<?> clazz = Class.forName(className);
+                        return (DataContentHandler)clazz.newInstance();
+                      }
+                    catch (IllegalAccessException e)
+                      {
+                        if (debug)
+                          {
+                            e.printStackTrace();
+                          }
+                      }
+                    catch (ClassNotFoundException e)
+                      {
+                        if (debug)
+                      {
+                        e.printStackTrace();
+                      }
+                      }
+                    catch (InstantiationException e)
+                      {
+                        if (debug)
+                          {
+                            e.printStackTrace();
+                          }
+                      }
+                  }
+              }
+          }
+      }
+    return null;
+  }
+    
+  /**
+   * Get the native commands for the given MIME type.
+   * Returns an array of strings where each string is
+   * an entire mailcap file entry.  The application
+   * will need to parse the entry to extract the actual
+   * command as well as any attributes it needs. See
+   * <a href="http://www.ietf.org/rfc/rfc1524.txt">RFC 1524</a>
+   * for details of the mailcap entry syntax.  Only mailcap
+   * entries that specify a view command for the specified
+   * MIME type are returned.
+   * @return array of native command entries
+   * @since JAF 1.1
+   */
+  public String[] getNativeCommands(String mimeType)
+  {
+    List<String> acc = new ArrayList<String>();
+    for (int i = 0; i < 2; i++)
+      {
+        for (int j = 0; j < 5; j++)
+          {
+            addNativeCommands(acc, mailcaps[j][i], mimeType);
+          }
+      }
+    String[] ret = new String[acc.size()];
+    acc.toArray(ret);
+    return ret;
+  }
+
+  private void addNativeCommands(List<String> acc,
+				 Map<String,Map<String,List<String>>> mailcap,
+				 String mimeType)
+  {
+    for (Map.Entry<String,Map<String,List<String>>> mEntry : mailcap.entrySet())
+      {
+        String entryMimeType = mEntry.getKey();
+        if (!entryMimeType.equals(mimeType))
+          {
+            continue;
+          }
+        Map<String,List<String>> commands = mEntry.getValue();
+        String viewCommand = commands.get("view-command").get(0);
+        if (viewCommand == null)
+          {
+            continue;
+          }
+        CPStringBuilder buf = new CPStringBuilder();
+        buf.append(mimeType);
+        buf.append(';');
+        buf.append(' ');
+        buf.append(viewCommand);
+        for (Map.Entry<String,List<String>> cEntry : commands.entrySet())
+          {
+            String verb = cEntry.getKey();
+            List<String> classNames = cEntry.getValue();
+            if (!"view-command".equals(verb))
+              {
+                for (String command : classNames)
+                  {
+                    buf.append(';');
+                    buf.append(' ');
+                    buf.append(verb);
+                    buf.append('=');
+                    buf.append(command);
+                  }
+              }
+          }
+        if (buf.length() > 0)
+          {
+            acc.add(buf.toString());
+          }
+      }
+  }
+  
+  private static String nameOf(int mailcap)
+  {
+    switch (mailcap)
+      {
+      case PROG:
+        return "PROG";
+      case HOME:
+        return "HOME";
+      case SYS:
+        return "SYS";
+      case JAR:
+        return "JAR";
+      case DEF:
+        return "DEF";
+      default:
+        return "ERR";
+      }   
+  }
+
+  private void parseFile(int index, String filename)
+  {
+    Reader in = null;
+    try
+      {
+        if (debug)
+          {
+            System.out.println("\t" + filename);
+          }
+        in = new FileReader(filename);
+        parse(index, in);
+      }
+    catch (IOException e)
+      {
+        if (debug)
+          {
+            System.out.println(e.getClass().getName() + ": " +
+                               e.getMessage());
+          }
+      }
+    finally
+      {
+        if (in != null)
+          {
+            try
+              {
+                in.close();
+              }
+            catch (IOException e)
+              {
+              }
+          }
+      }
+  }
+  
+  private void parseResource(int index, String name)
+  {
+    Reader in = null;
+    try
+      {
+        InputStream is = getClass().getResourceAsStream(name);
+        if (is != null)
+          {
+            if (debug)
+              {
+                System.out.println("\t" + name);
+              }
+            in = new InputStreamReader(is);
+            parse(index, in);
+          }
+      }
+    catch (IOException e)
+      {
+        if (debug)
+          {
+            System.out.println(e.getClass().getName() + ": " +
+                               e.getMessage());
+          }
+      }
+    finally
+      {
+        if (in != null)
+          {
+            try
+              {
+                in.close();
+              }
+            catch (IOException e)
+              {
+              }
+          }
+      }
+  }
+  
+  private void parse(int index, Reader in)
+    throws IOException
+  {
+    BufferedReader br = new BufferedReader(in);
+    CPStringBuilder buf = null;
+    for (String line = br.readLine(); line != null; line = br.readLine())
+      {
+        line = line.trim();
+        int len = line.length();
+        if (len == 0 || line.charAt(0) == '#')
+          {
+            continue; // Comment
+          }
+        if (line.charAt(len - 1) == '\\')
+          {
+            if (buf == null)
+              {
+                buf = new CPStringBuilder();
+              }
+            buf.append(line.substring(0, len - 1));
+          }
+        else if (buf != null)
+          {
+            buf.append(line);
+            parseEntry(index, buf.toString());
+            buf = null;
+          }
+        else
+          {
+            parseEntry(index, line);
+          }
+      }
+  }
+  
+  private void parseEntry(int index, String line)
+  {
+    // Tokenize entry into fields
+    char[] chars = line.toCharArray();
+    int len = chars.length;
+    boolean inQuotedString = false;
+    boolean fallback = false;
+    CPStringBuilder buffer = new CPStringBuilder();
+    List<String> fields = new ArrayList<String>();
+    for (int i = 0; i < len; i++)
+      {
+        char c = chars[i];
+        if (c == '\\')
+          {
+            c = chars[++i]; // qchar
+          }
+        if (c == ';' && !inQuotedString)
+          {
+            String field = buffer.toString().trim();
+            if ("x-java-fallback-entry".equals(field))
+              {
+                fallback = true;
+              }
+            fields.add(field);
+            buffer.setLength(0);
+          }
+        else
+          {
+            if (c == '"')
+              {
+                inQuotedString = !inQuotedString;
+              }
+            buffer.append(c);
+          }
+      }
+    String field = buffer.toString().trim();
+    if ("x-java-fallback-entry".equals(field))
+      {
+        fallback = true;
+      }
+    fields.add(field);
+    
+    len = fields.size();
+    if (len < 2)
+      {
+        if (debug)
+          {
+            System.err.println("Invalid mailcap entry: " + line);
+          }
+        return;
+      }
+    
+    Map<String,Map<String,List<String>>> mailcap =
+      fallback ? mailcaps[index][FALLBACK] : mailcaps[index][NORMAL];
+    String mimeType = fields.get(0);
+    addField(mailcap, mimeType, "view-command", (String) fields.get(1));
+    for (int i = 2; i < len; i++)
+      {
+        addField(mailcap, mimeType, null, (String) fields.get(i));
+      }
+  }
+    
+  private void addField(Map<String,Map<String,List<String>>> mailcap,
+			String mimeType, String verb, String command)
+  {
+    if (verb == null)
+      {
+        int ei = command.indexOf('=');
+        if (ei != -1)
+          {
+            verb = command.substring(0, ei);
+            command = command.substring(ei + 1);
+          }
+      }
+    if (command.length() == 0 || verb == null || verb.length() == 0)
+      {
+        return; // Invalid field or flag
+      }
+      
+    Map<String,List<String>> commands = mailcap.get(mimeType);
+    if (commands == null)
+      {
+        commands = new LinkedHashMap<String,List<String>>();
+        mailcap.put(mimeType, commands);
+      }
+    List<String> classNames = commands.get(verb);
+    if (classNames == null)
+      {
+        classNames = new ArrayList<String>();
+        commands.put(verb, classNames);
+      }
+    classNames.add(command);
+  }
+  
+  private Map<String,List<String>>
+    getCommands(Map<String,Map<String,List<String>>> mailcap,
+		String mimeType)
+  {
+    int si = mimeType.indexOf('/');
+    String genericMimeType = new CPStringBuilder(mimeType.substring(0, si))
+      .append('/')
+      .append('*')
+      .toString();
+    Map<String,List<String>> specific = mailcap.get(mimeType);
+    Map<String,List<String>> generic = mailcap.get(genericMimeType);
+    if (generic == null)
+      {
+        return specific;
+      }
+    if (specific == null)
+      {
+        return generic;
+      }
+    Map<String,List<String>> combined = new LinkedHashMap<String,List<String>>();
+    combined.putAll(specific);
+    for (String verb : generic.keySet())
+      {
+        List<String> genericClassNames = generic.get(verb);
+        List<String> classNames = combined.get(verb);
+        if (classNames == null)
+          {
+            combined.put(verb, genericClassNames);
+          }
+        else
+          {
+            classNames.addAll(genericClassNames);
+          }
+      }
+    return combined;
+  }
+
+  // -- Utility methods --
+  
+  private List<URL> getSystemResources(String name)
+  {
+    List<URL> acc = new ArrayList<URL>();
+    try
+      {
+        for (Enumeration<URL> i = ClassLoader.getSystemResources(name);
+             i.hasMoreElements(); )
+          {
+            acc.add(i.nextElement());
+          }
+      }
+    catch (IOException e)
+      {
+      }
+    return acc;
+  }
+  
+}
+
-- 
cgit v1.1