Imported Classpath 0.18.

* sources.am, Makefile.in: Updated.
	* Makefile.am (nat_source_files): Removed natProxy.cc.
	* java/lang/reflect/natProxy.cc: Removed.
	* gnu/classpath/jdwp/VMFrame.java,
	gnu/classpath/jdwp/VMIdManager.java,
	gnu/classpath/jdwp/VMVirtualMachine.java,
	java/lang/reflect/VMProxy.java: New files.

2005-09-23  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* scripts/makemake.tcl (verbose): Add gnu/java/awt/peer/qt to BC
	list.

2005-09-23  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* gnu/java/net/DefaultContentHandlerFactory.java (getContent):
	Remove ClasspathToolkit references.

2005-09-23  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* gnu/awt/xlib/XCanvasPeer.java: Add new peer methods.
	* gnu/awt/xlib/XFramePeer.java: Likewise.
	* gnu/awt/xlib/XGraphicsConfiguration.java: Likewise.

2005-09-23  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* Makefile.am (libgcjawt_la_SOURCES): Remove jawt.c.  Add
	classpath/native/jawt/jawt.c.
	* Makefile.in: Regenerate.
	* jawt.c: Remove file.
	* include/Makefile.am (tool_include__HEADERS): Remove jawt.h and
	jawt_md.h.  Add ../classpath/include/jawt.h and
	../classpath/include/jawt_md.h.
	* include/Makefile.in: Regenerate.
	* include/jawt.h: Regenerate.
	* include/jawt_md.h: Regenerate.

From-SVN: r104586
This commit is contained in:
Tom Tromey 2005-09-23 21:31:04 +00:00
parent 9b044d1951
commit 1ea63ef8be
544 changed files with 34724 additions and 14512 deletions

View file

@ -412,13 +412,25 @@ public class AWTKeyStroke implements Serializable
{
token = t.nextToken();
if ("shift".equals(token))
modifiers |= KeyEvent.SHIFT_DOWN_MASK;
{
modifiers |= KeyEvent.SHIFT_MASK;
modifiers |= KeyEvent.SHIFT_DOWN_MASK;
}
else if ("ctrl".equals(token) || "control".equals(token))
modifiers |= KeyEvent.CTRL_DOWN_MASK;
{
modifiers |= KeyEvent.CTRL_MASK;
modifiers |= KeyEvent.CTRL_DOWN_MASK;
}
else if ("meta".equals(token))
modifiers |= KeyEvent.META_DOWN_MASK;
{
modifiers |= KeyEvent.META_MASK;
modifiers |= KeyEvent.META_DOWN_MASK;
}
else if ("alt".equals(token))
modifiers |= KeyEvent.ALT_DOWN_MASK;
{
modifiers |= KeyEvent.ALT_MASK;
modifiers |= KeyEvent.ALT_DOWN_MASK;
}
else if ("button1".equals(token))
modifiers |= KeyEvent.BUTTON1_DOWN_MASK;
else if ("button2".equals(token))

File diff suppressed because it is too large Load diff

View file

@ -897,9 +897,21 @@ public abstract class Component
if(!isVisible())
{
this.visible = true;
if (peer != null)
peer.setVisible(true);
invalidate();
// Avoid NullPointerExceptions by creating a local reference.
ComponentPeer currentPeer=peer;
if (currentPeer != null)
currentPeer.setVisible(true);
// Invalidate the parent if we have one. The component itself must
// not be invalidated. We also avoid NullPointerException with
// a local reference here.
Container currentParent = parent;
if (currentParent != null)
{
currentParent.invalidate();
currentParent.repaint();
}
ComponentEvent ce =
new ComponentEvent(this,ComponentEvent.COMPONENT_SHOWN);
getToolkit().getSystemEventQueue().postEvent(ce);
@ -930,10 +942,23 @@ public abstract class Component
{
if (isVisible())
{
if (peer != null)
peer.setVisible(false);
// Avoid NullPointerExceptions by creating a local reference.
ComponentPeer currentPeer=peer;
if (currentPeer != null)
currentPeer.setVisible(false);
this.visible = false;
invalidate();
// Invalidate the parent if we have one. The component itself must
// not be invalidated. We also avoid NullPointerException with
// a local reference here.
Container currentParent = parent;
if (currentParent != null)
{
currentParent.invalidate();
currentParent.repaint();
}
ComponentEvent ce =
new ComponentEvent(this,ComponentEvent.COMPONENT_HIDDEN);
getToolkit().getSystemEventQueue().postEvent(ce);
@ -963,10 +988,12 @@ public abstract class Component
*/
public void setForeground(Color c)
{
firePropertyChange("foreground", foreground, c);
if (peer != null)
peer.setForeground(c);
Color previous = foreground;
foreground = c;
firePropertyChange("foreground", previous, c);
}
/**
@ -992,7 +1019,7 @@ public abstract class Component
{
if (background != null)
return background;
return parent == null ? SystemColor.window : parent.getBackground();
return parent == null ? null : parent.getBackground();
}
/**
@ -1006,16 +1033,18 @@ public abstract class Component
public void setBackground(Color c)
{
// return if the background is already set to that color.
if (background != null && c != null)
if (background.equals(c))
return;
if ((c != null) && c.equals(background))
return;
// If c is null, inherit from closest ancestor whose bg is set.
if (c == null && parent != null)
c = parent.getBackground();
firePropertyChange("background", background, c);
if (peer != null && c != null)
peer.setBackground(c);
Color previous = background;
background = c;
firePropertyChange("background", previous, c);
}
/**
@ -1039,13 +1068,15 @@ public abstract class Component
*/
public Font getFont()
{
if (font != null)
return font;
Font f = font;
if (f != null)
return f;
if (parent != null)
return parent.getFont ();
Component p = parent;
if (p != null)
return p.getFont();
else
return new Font ("Dialog", Font.PLAIN, 12);
return new Font("Dialog", Font.PLAIN, 12);
}
/**
@ -1058,15 +1089,16 @@ public abstract class Component
*/
public void setFont(Font newFont)
{
if (font == newFont)
return;
Font oldFont = font;
font = newFont;
if (peer != null)
peer.setFont(font);
firePropertyChange("font", oldFont, newFont);
invalidate();
if((newFont != null && (font == null || !font.equals(newFont)))
|| newFont == null)
{
Font oldFont = font;
font = newFont;
if (peer != null)
peer.setFont(font);
firePropertyChange("font", oldFont, newFont);
invalidate();
}
}
/**
@ -1372,9 +1404,6 @@ public abstract class Component
// Erase old bounds and repaint new bounds for lightweights.
if (isLightweight() && isShowing ())
{
boolean shouldRepaintParent = false;
boolean shouldRepaintSelf = false;
if (parent != null)
{
Rectangle parentBounds = parent.getBounds();
@ -1384,14 +1413,11 @@ public abstract class Component
Rectangle newBounds = new Rectangle(parent.getX() + x,
parent.getY() + y,
width, height);
shouldRepaintParent = parentBounds.intersects(oldBounds);
shouldRepaintSelf = parentBounds.intersects(newBounds);
Rectangle destroyed = oldBounds.union(newBounds);
if (!destroyed.isEmpty())
parent.repaint(0, destroyed.x, destroyed.y, destroyed.width,
destroyed.height);
}
if (shouldRepaintParent && parent != null)
parent.repaint(oldx, oldy, oldwidth, oldheight);
if (shouldRepaintSelf)
repaint();
}
// Only post event if this component is visible and has changed size.
@ -1798,9 +1824,8 @@ public abstract class Component
*/
public void paint(Graphics g)
{
// Paint the heavyweight peer
if (!isLightweight() && peer != null)
peer.paint(g);
// This is a callback method and is meant to be overridden by subclasses
// that want to perform custom painting.
}
/**
@ -1816,10 +1841,20 @@ public abstract class Component
*
* @see #paint(Graphics)
* @see #repaint()
*
* @specnote In contrast to what the spec says, tests show that the exact
* behaviour is to clear the background on lightweight and
* top-level components only. Heavyweight components are not
* affected by this method and only call paint().
*/
public void update(Graphics g)
{
if (!isLightweight())
// Tests show that the clearing of the background is only done in
// two cases:
// - If the component is lightweight (yes this is in contrast to the spec).
// or
// - If the component is a toplevel container.
if (isLightweight() || getParent() == null)
{
Rectangle clip = g.getClipBounds();
if (clip == null)
@ -1827,7 +1862,6 @@ public abstract class Component
else
g.clearRect(clip.x, clip.y, clip.width, clip.height);
}
paint(g);
}
@ -1854,7 +1888,14 @@ public abstract class Component
*/
public void repaint()
{
repaint(0, 0, 0, width, height);
if(!isShowing())
{
Component p = parent;
if (p != null)
p.repaint(0, getX(), getY(), width, height);
}
else
repaint(0, 0, 0, width, height);
}
/**
@ -1868,7 +1909,14 @@ public abstract class Component
*/
public void repaint(long tm)
{
repaint(tm, 0, 0, width, height);
if(!isShowing())
{
Component p = parent;
if (p != null)
p.repaint(tm, getX(), getY(), width, height);
}
else
repaint(tm, 0, 0, width, height);
}
/**
@ -1885,7 +1933,14 @@ public abstract class Component
*/
public void repaint(int x, int y, int w, int h)
{
repaint(0, x, y, w, h);
if(!isShowing())
{
Component p = parent;
if (p != null)
p.repaint(0, x + getX(), y + getY(), width, height);
}
else
repaint(0, x, y, w, h);
}
/**
@ -1903,14 +1958,18 @@ public abstract class Component
*/
public void repaint(long tm, int x, int y, int width, int height)
{
// Handle lightweight repainting by forwarding to native parent
if (isLightweight() && parent != null)
if(!isShowing())
{
if (parent != null)
parent.repaint(tm, x + getX(), y + getY(), width, height);
Component p = parent;
if (p != null)
p.repaint(tm, x + getX(), y + getY(), width, height);
}
else
{
ComponentPeer p = peer;
if (p != null)
p.repaint(tm, x, y, width, height);
}
else if (peer != null)
peer.repaint(tm, x, y, width, height);
}
/**
@ -1971,7 +2030,7 @@ public abstract class Component
public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h)
{
if ((flags & (FRAMEBITS | ALLBITS)) != 0)
repaint ();
repaint();
else if ((flags & SOMEBITS) != 0)
{
if (incrementalDraw)
@ -1981,10 +2040,10 @@ public abstract class Component
long tm = redrawRate.longValue();
if (tm < 0)
tm = 0;
repaint (tm);
repaint(tm);
}
else
repaint (100);
repaint(100);
}
}
return (flags & (ALLBITS | ABORT | ERROR)) == 0;
@ -2282,8 +2341,6 @@ public abstract class Component
// Some subclasses in the AWT package need to override this behavior,
// hence the use of dispatchEventImpl().
dispatchEventImpl(e);
if (peer != null && ! e.consumed)
peer.handleEvent(e);
}
/**
@ -4183,6 +4240,10 @@ public abstract class Component
param.append(",translucent");
if (isDoubleBuffered())
param.append(",doublebuffered");
if (parent == null)
param.append(",parent==null");
else
param.append(",parent==").append(parent.getName());
return param.toString();
}
@ -4742,7 +4803,7 @@ p * <li>the set of backward traversal keys
* @param e the event to dispatch
*/
void dispatchEventImpl (AWTEvent e)
void dispatchEventImpl(AWTEvent e)
{
Event oldEvent = translateEvent (e);
@ -4776,8 +4837,12 @@ p * <li>the set of backward traversal keys
break;
}
}
processEvent (e);
if (e.id != PaintEvent.PAINT && e.id != PaintEvent.UPDATE)
processEvent(e);
}
if (peer != null)
peer.handleEvent(e);
}
/**

View file

@ -42,6 +42,7 @@ import java.awt.event.ContainerEvent;
import java.awt.event.ContainerListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.peer.ComponentPeer;
import java.awt.peer.ContainerPeer;
import java.awt.peer.LightweightPeer;
import java.beans.PropertyChangeListener;
@ -59,7 +60,8 @@ import java.util.Iterator;
import java.util.Set;
import javax.accessibility.Accessible;
import javax.swing.SwingUtilities;
import gnu.java.awt.AWTUtilities;
/**
* A generic window toolkit object that acts as a container for other objects.
@ -338,8 +340,12 @@ public class Container extends Component
if (comp.parent != null)
comp.parent.remove(comp);
comp.parent = this;
if (peer != null)
{
// Notify the component that it has a new parent.
comp.addNotify();
if (comp.isLightweight ())
{
enableEvents (comp.eventMask);
@ -348,7 +354,8 @@ public class Container extends Component
}
}
invalidate();
// Invalidate the layout of the added component and its ancestors.
comp.invalidate();
if (component == null)
component = new Component[4]; // FIXME, better initial size?
@ -394,6 +401,9 @@ public class Container extends Component
ContainerEvent.COMPONENT_ADDED,
comp);
getToolkit().getSystemEventQueue().postEvent(ce);
// Repaint this container.
repaint();
}
}
}
@ -429,6 +439,9 @@ public class Container extends Component
ContainerEvent.COMPONENT_REMOVED,
r);
getToolkit().getSystemEventQueue().postEvent(ce);
// Repaint this container.
repaint();
}
}
}
@ -513,6 +526,11 @@ public class Container extends Component
public void invalidate()
{
super.invalidate();
if (layoutMgr != null && layoutMgr instanceof LayoutManager2)
{
LayoutManager2 lm2 = (LayoutManager2) layoutMgr;
lm2.invalidateLayout(this);
}
}
/**
@ -534,6 +552,7 @@ public class Container extends Component
*/
void invalidateTree()
{
super.invalidate(); // Clean cached layout state.
for (int i = 0; i < ncomponents; i++)
{
Component comp = component[i];
@ -541,6 +560,12 @@ public class Container extends Component
if (comp instanceof Container)
((Container) comp).invalidateTree();
}
if (layoutMgr != null && layoutMgr instanceof LayoutManager2)
{
LayoutManager2 lm2 = (LayoutManager2) layoutMgr;
lm2.invalidateLayout(this);
}
}
/**
@ -596,11 +621,15 @@ public class Container extends Component
public void setFont(Font f)
{
super.setFont(f);
// FIXME: Although it might make more sense to invalidate only
// those children whose font == null, Sun invalidates all children.
// So we'll do the same.
invalidateTree();
if( (f != null && (font == null || !font.equals(f)))
|| f == null)
{
super.setFont(f);
// FIXME: Although it might make more sense to invalidate only
// those children whose font == null, Sun invalidates all children.
// So we'll do the same.
invalidateTree();
}
}
/**
@ -622,10 +651,21 @@ public class Container extends Component
*/
public Dimension preferredSize()
{
if (layoutMgr != null)
return layoutMgr.preferredLayoutSize (this);
else
return super.preferredSize ();
synchronized(treeLock)
{
if(valid && prefSize != null)
return new Dimension(prefSize);
LayoutManager layout = getLayout();
if (layout != null)
{
Dimension layoutSize = layout.preferredLayoutSize(this);
if(valid)
prefSize = layoutSize;
return new Dimension(layoutSize);
}
else
return super.preferredSize ();
}
}
/**
@ -647,8 +687,15 @@ public class Container extends Component
*/
public Dimension minimumSize()
{
if (layoutMgr != null)
return layoutMgr.minimumLayoutSize (this);
if(valid && minSize != null)
return new Dimension(minSize);
LayoutManager layout = getLayout();
if (layout != null)
{
minSize = layout.minimumLayoutSize (this);
return minSize;
}
else
return super.minimumSize ();
}
@ -660,10 +707,15 @@ public class Container extends Component
*/
public Dimension getMaximumSize()
{
if (layoutMgr != null && layoutMgr instanceof LayoutManager2)
if (valid && maxSize != null)
return new Dimension(maxSize);
LayoutManager layout = getLayout();
if (layout != null && layout instanceof LayoutManager2)
{
LayoutManager2 lm2 = (LayoutManager2) layoutMgr;
return lm2.maximumLayoutSize(this);
LayoutManager2 lm2 = (LayoutManager2) layout;
maxSize = lm2.maximumLayoutSize(this);
return maxSize;
}
else
return super.getMaximumSize();
@ -678,13 +730,7 @@ public class Container extends Component
*/
public float getAlignmentX()
{
if (layoutMgr instanceof LayoutManager2)
{
LayoutManager2 lm2 = (LayoutManager2) layoutMgr;
return lm2.getLayoutAlignmentX(this);
}
else
return super.getAlignmentX();
return super.getAlignmentX();
}
/**
@ -696,13 +742,7 @@ public class Container extends Component
*/
public float getAlignmentY()
{
if (layoutMgr instanceof LayoutManager2)
{
LayoutManager2 lm2 = (LayoutManager2) layoutMgr;
return lm2.getLayoutAlignmentY(this);
}
else
return super.getAlignmentY();
return super.getAlignmentY();
}
/**
@ -718,8 +758,7 @@ public class Container extends Component
{
if (!isShowing())
return;
// Paint self first.
super.paint(g);
// Visit heavyweights as well, in case they were
// erased when we cleared the background for this container.
visitChildren(g, GfxPaintVisitor.INSTANCE, false);
@ -733,10 +772,30 @@ public class Container extends Component
* drawn.
*
* @param g The graphics context for this update.
*
* @specnote The specification suggests that this method forwards the
* update() call to all its lightweight children. Tests show
* that this is not done either in the JDK. The exact behaviour
* seems to be that the background is cleared in heavyweight
* Containers, and all other containers
* directly call paint(), causing the (lightweight) children to
* be painted.
*/
public void update(Graphics g)
{
super.update(g);
// It seems that the JDK clears the background of containers like Panel
// and Window (within this method) but not of 'plain' Containers or
// JComponents. This could
// lead to the assumption that it only clears heavyweight containers.
// However that is not quite true. In a test with a custom Container
// that overrides isLightweight() to return false, the background is
// also not cleared. So we do a check on !(peer instanceof LightweightPeer)
// instead.
ComponentPeer p = peer;
if (p != null && !(p instanceof LightweightPeer))
g.clearRect(0, 0, getWidth(), getHeight());
paint(g);
}
/**
@ -1198,7 +1257,7 @@ public class Container extends Component
}
if (focusTraversalKeys == null)
focusTraversalKeys = new Set[3];
focusTraversalKeys = new Set[4];
keystrokes = Collections.unmodifiableSet (new HashSet (keystrokes));
firePropertyChange (name, focusTraversalKeys[id], keystrokes);
@ -1465,12 +1524,8 @@ public class Container extends Component
for (int i = ncomponents - 1; i >= 0; --i)
{
Component comp = component[i];
// If we're visiting heavyweights as well,
// don't recurse into Containers here. This avoids
// painting the same nested child multiple times.
boolean applicable = comp.isVisible()
&& (comp.isLightweight()
|| !lightweightOnly && ! (comp instanceof Container));
&& (comp.isLightweight() || !lightweightOnly);
if (applicable)
visitChild(gfx, visitor, comp);
@ -1525,11 +1580,9 @@ public class Container extends Component
void dispatchEventImpl(AWTEvent e)
{
// Give lightweight dispatcher a chance to handle it.
if (eventTypeEnabled (e.id)
&& dispatcher != null
&& dispatcher.handleEvent (e))
if (dispatcher != null && dispatcher.handleEvent (e))
return;
if ((e.id <= ContainerEvent.CONTAINER_LAST
&& e.id >= ContainerEvent.CONTAINER_FIRST)
&& (containerListener != null
@ -1539,6 +1592,26 @@ public class Container extends Component
super.dispatchEventImpl(e);
}
/**
* Tests if this container has an interest in the given event id.
*
* @param eventId The event id to check.
*
* @return <code>true</code> if a listener for the event id exists or
* if the eventMask is set for the event id.
*
* @see java.awt.Component#eventTypeEnabled(int)
*/
boolean eventTypeEnabled(int eventId)
{
if(eventId <= ContainerEvent.CONTAINER_LAST
&& eventId >= ContainerEvent.CONTAINER_FIRST)
return containerListener != null
|| (eventMask & AWTEvent.CONTAINER_EVENT_MASK) != 0;
else
return super.eventTypeEnabled(eventId);
}
// This is used to implement Component.transferFocus.
Component findNextFocusComponent(Component child)
{
@ -1603,12 +1676,11 @@ public class Container extends Component
// If we're not lightweight, and we just got a lightweight
// child, we need a lightweight dispatcher to feed it events.
if (! this.isLightweight())
{
if (dispatcher == null)
dispatcher = new LightweightDispatcher (this);
}
if (!this.isLightweight() && dispatcher == null)
dispatcher = new LightweightDispatcher (this);
if (dispatcher != null)
dispatcher.enableEvents(component[i].eventMask);
enableEvents(component[i].eventMask);
if (peer != null && !isLightweight ())
@ -1862,7 +1934,6 @@ public class Container extends Component
* rather than mimic it exactly we write something which does "roughly
* the same thing".
*/
class LightweightDispatcher implements Serializable
{
private static final long serialVersionUID = 5184291520170872969L;
@ -1870,10 +1941,8 @@ class LightweightDispatcher implements Serializable
private Cursor nativeCursor;
private long eventMask;
private transient Component mouseEventTarget;
private transient Component pressedComponent;
private transient Component lastComponentEntered;
private transient Component tempComponent;
private transient int pressCount;
LightweightDispatcher(Container c)
@ -1881,11 +1950,17 @@ class LightweightDispatcher implements Serializable
nativeContainer = c;
}
void acquireComponentForMouseEvent(MouseEvent me)
void enableEvents(long l)
{
eventMask |= l;
}
Component acquireComponentForMouseEvent(MouseEvent me)
{
int x = me.getX ();
int y = me.getY ();
Component mouseEventTarget = null;
// Find the candidate which should receive this event.
Component parent = nativeContainer;
Component candidate = null;
@ -1893,13 +1968,13 @@ class LightweightDispatcher implements Serializable
while (candidate == null && parent != null)
{
candidate =
SwingUtilities.getDeepestComponentAt(parent, p.x, p.y);
AWTUtilities.getDeepestComponentAt(parent, p.x, p.y);
if (candidate == null || (candidate.eventMask & me.getID()) == 0)
{
candidate = null;
p = SwingUtilities.convertPoint(parent, p.x, p.y, parent.parent);
parent = parent.parent;
}
{
candidate = null;
p = AWTUtilities.convertPoint(parent, p.x, p.y, parent.parent);
parent = parent.parent;
}
}
// If the only candidate we found was the native container itself,
@ -1915,25 +1990,24 @@ class LightweightDispatcher implements Serializable
{
// Old candidate could have been removed from
// the nativeContainer so we check first.
if (SwingUtilities.isDescendingFrom(lastComponentEntered, nativeContainer))
{
Point tp =
SwingUtilities.convertPoint(nativeContainer,
x, y, lastComponentEntered);
MouseEvent exited = new MouseEvent (lastComponentEntered,
MouseEvent.MOUSE_EXITED,
me.getWhen (),
me.getModifiersEx (),
tp.x, tp.y,
me.getClickCount (),
me.isPopupTrigger (),
me.getButton ());
tempComponent = lastComponentEntered;
lastComponentEntered = null;
tempComponent.dispatchEvent(exited);
}
if (AWTUtilities.isDescendingFrom(lastComponentEntered,
nativeContainer))
{
Point tp = AWTUtilities.convertPoint(nativeContainer,
x, y, lastComponentEntered);
MouseEvent exited = new MouseEvent (lastComponentEntered,
MouseEvent.MOUSE_EXITED,
me.getWhen (),
me.getModifiersEx (),
tp.x, tp.y,
me.getClickCount (),
me.isPopupTrigger (),
me.getButton ());
lastComponentEntered.dispatchEvent (exited);
}
lastComponentEntered = null;
}
// If we have a candidate, maybe enter it.
if (candidate != null)
{
@ -1942,10 +2016,10 @@ class LightweightDispatcher implements Serializable
&& candidate.isShowing()
&& candidate != nativeContainer
&& candidate != lastComponentEntered)
{
{
lastComponentEntered = mouseEventTarget;
Point cp = SwingUtilities.convertPoint(nativeContainer,
x, y, lastComponentEntered);
Point cp = AWTUtilities.convertPoint(nativeContainer,
x, y, lastComponentEntered);
MouseEvent entered = new MouseEvent (lastComponentEntered,
MouseEvent.MOUSE_ENTERED,
me.getWhen (),
@ -1958,17 +2032,38 @@ class LightweightDispatcher implements Serializable
}
}
// Check which buttons where pressed except the last button that
// changed state.
int modifiers = me.getModifiersEx() & (MouseEvent.BUTTON1_DOWN_MASK
| MouseEvent.BUTTON2_DOWN_MASK
| MouseEvent.BUTTON3_DOWN_MASK);
switch(me.getButton())
{
case MouseEvent.BUTTON1:
modifiers &= ~MouseEvent.BUTTON1_DOWN_MASK;
break;
case MouseEvent.BUTTON2:
modifiers &= ~MouseEvent.BUTTON2_DOWN_MASK;
break;
case MouseEvent.BUTTON3:
modifiers &= ~MouseEvent.BUTTON3_DOWN_MASK;
break;
}
if (me.getID() == MouseEvent.MOUSE_RELEASED
|| me.getID() == MouseEvent.MOUSE_PRESSED && pressCount > 0
|| me.getID() == MouseEvent.MOUSE_PRESSED && modifiers > 0
|| me.getID() == MouseEvent.MOUSE_DRAGGED)
// If any of the following events occur while a button is held down,
// they should be dispatched to the same component to which the
// original MOUSE_PRESSED event was dispatched:
// - MOUSE_RELEASED
// - MOUSE_PRESSED: another button pressed while the first is held down
// - MOUSE_DRAGGED
if (SwingUtilities.isDescendingFrom(pressedComponent, nativeContainer))
mouseEventTarget = pressedComponent;
{
// If any of the following events occur while a button is held down,
// they should be dispatched to the same component to which the
// original MOUSE_PRESSED event was dispatched:
// - MOUSE_RELEASED
// - MOUSE_PRESSED: another button pressed while the first is held
// down
// - MOUSE_DRAGGED
if (AWTUtilities.isDescendingFrom(pressedComponent, nativeContainer))
mouseEventTarget = pressedComponent;
}
else if (me.getID() == MouseEvent.MOUSE_CLICKED)
{
// Don't dispatch CLICKED events whose target is not the same as the
@ -1978,6 +2073,7 @@ class LightweightDispatcher implements Serializable
else if (pressCount == 0)
pressedComponent = null;
}
return mouseEventTarget;
}
boolean handleEvent(AWTEvent e)
@ -1986,41 +2082,42 @@ class LightweightDispatcher implements Serializable
{
MouseEvent me = (MouseEvent) e;
acquireComponentForMouseEvent(me);
// Make the LightWeightDispatcher reentrant. This is necessary when
// a lightweight component does its own modal event queue.
Component mouseEventTarget = acquireComponentForMouseEvent(me);
// Avoid dispatching ENTERED and EXITED events twice.
if (mouseEventTarget != null
&& mouseEventTarget.isShowing()
&& e.getID() != MouseEvent.MOUSE_ENTERED
&& e.getID() != MouseEvent.MOUSE_EXITED)
{
MouseEvent newEvt =
SwingUtilities.convertMouseEvent(nativeContainer, me,
mouseEventTarget);
mouseEventTarget.dispatchEvent(newEvt);
switch (e.getID())
{
case MouseEvent.MOUSE_PRESSED:
if (pressCount++ == 0)
pressedComponent = mouseEventTarget;
break;
case MouseEvent.MOUSE_RELEASED:
// Clear our memory of the original PRESSED event, only if
// we're not expecting a CLICKED event after this. If
// there is a CLICKED event after this, it will do clean up.
if (--pressCount == 0
&& mouseEventTarget != pressedComponent)
pressedComponent = null;
break;
case MouseEvent.MOUSE_PRESSED:
if (pressCount++ == 0)
pressedComponent = mouseEventTarget;
break;
case MouseEvent.MOUSE_RELEASED:
// Clear our memory of the original PRESSED event, only if
// we're not expecting a CLICKED event after this. If
// there is a CLICKED event after this, it will do clean up.
if (--pressCount == 0
&& mouseEventTarget != pressedComponent)
pressedComponent = null;
break;
}
if (newEvt.isConsumed())
e.consume();
MouseEvent newEvt =
AWTUtilities.convertMouseEvent(nativeContainer, me,
mouseEventTarget);
mouseEventTarget.dispatchEvent(newEvt);
if (newEvt.isConsumed())
e.consume();
}
}
return e.isConsumed();
}
} // class LightweightDispatcher
}

View file

@ -38,8 +38,6 @@ exception statement from your version. */
package java.awt;
import gnu.java.awt.ClasspathToolkit;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.InputMethodEvent;
@ -78,10 +76,7 @@ public class EventQueue
private EventDispatchThread dispatchThread = new EventDispatchThread(this);
private boolean shutdown = false;
private long lastNativeQueueAccess = 0;
private long humanLatencyThreshold = 100;
synchronized void setShutdown (boolean b)
synchronized private void setShutdown (boolean b)
{
shutdown = b;
}
@ -94,8 +89,8 @@ public class EventQueue
// This is the exact self-shutdown condition specified in J2SE:
// http://java.sun.com/j2se/1.4.2/docs/api/java/awt/doc-files/AWTThreadIssues.html
if (peekEvent() == null
&& ((ClasspathToolkit) Toolkit.getDefaultToolkit()).nativeQueueEmpty())
// FIXME: check somewhere that the native queue is empty
if (peekEvent() == null)
{
Frame[] frames = Frame.getFrames();
for (int i = 0; i < frames.length; ++i)
@ -127,50 +122,22 @@ public class EventQueue
{
if (next != null)
return next.getNextEvent();
ClasspathToolkit tk = ((ClasspathToolkit) Toolkit.getDefaultToolkit());
long curr = System.currentTimeMillis();
if (! tk.nativeQueueEmpty() &&
(curr - lastNativeQueueAccess > humanLatencyThreshold))
{
tk.iterateNativeQueue(this, false);
lastNativeQueueAccess = curr;
}
while (next_in == next_out)
{
// Only the EventDispatchThread associated with the top of the stack is
// allowed to get events from the native source; everyone else just
// waits on the head of the queue.
// We are not allowed to return null from this method, yet it
// is possible that we actually have run out of native events
// in the enclosing while() loop, and none of the native events
// happened to cause AWT events. We therefore ought to check
// the isShutdown() condition here, before risking a "native
// wait". If we check it before entering this function we may
// wait forever for events after the shutdown condition has
// arisen.
if (isDispatchThread())
{
// We are not allowed to return null from this method, yet it
// is possible that we actually have run out of native events
// in the enclosing while() loop, and none of the native events
// happened to cause AWT events. We therefore ought to check
// the isShutdown() condition here, before risking a "native
// wait". If we check it before entering this function we may
// wait forever for events after the shutdown condition has
// arisen.
if (isShutdown())
throw new InterruptedException();
if (isShutdown())
throw new InterruptedException();
tk.iterateNativeQueue(this, true);
lastNativeQueueAccess = System.currentTimeMillis();
}
else
{
try
{
wait();
}
catch (InterruptedException ie)
{
}
}
wait();
}
AWTEvent res = queue[next_out];
@ -298,15 +265,6 @@ public class EventQueue
dispatchThread.start();
}
// Window events might represent the closing of a window, which
// might cause the end of the dispatch thread's life, so we'll wake
// it up here to give it a chance to check for shutdown.
if (!isDispatchThread()
|| (evt.getID() == WindowEvent.WINDOW_CLOSED)
|| (evt.getID() == WindowEvent.WINDOW_CLOSING))
((ClasspathToolkit) Toolkit.getDefaultToolkit()).wakeNativeQueue();
notify();
}
@ -478,7 +436,6 @@ public class EventQueue
next_in = 0;
next_out = 0;
((ClasspathToolkit) Toolkit.getDefaultToolkit()).wakeNativeQueue();
setShutdown(true);
dispatchThread = null;
this.notifyAll();

View file

@ -205,12 +205,12 @@ public class FlowLayout implements LayoutManager, Serializable
else if (align == TRAILING)
myalign = left_to_right ? RIGHT : LEFT;
if (myalign == LEFT)
x = ins.left + hgap;
if (myalign == RIGHT)
x = ins.left + (d.width - new_w) + hgap;
else if (myalign == CENTER)
x = ins.left + (d.width - new_w) / 2 + hgap;
else
x = ins.left + (d.width - new_w) + hgap;
else // LEFT and all other values of align.
x = ins.left + hgap;
for (int k = i; k < j; ++k)
{
@ -269,9 +269,9 @@ public class FlowLayout implements LayoutManager, Serializable
*/
public void setAlignment (int align)
{
if (align != LEFT && align != RIGHT && align != CENTER
&& align != LEADING && align != TRAILING)
throw new IllegalArgumentException ("invalid alignment: " + align);
// The JDK accepts invalid values and treats them as
// LEFT during layout, so do we. The invalid value is even stored,
// getAlignment() returns the same invalid value.
this.align = align;
}

View file

@ -353,9 +353,11 @@ private static final long serialVersionUID = -4206021311591459213L;
this(null, attrs);
}
/* This extra constructor is here to permit ClasspathToolkit and to build
a font with a "logical name" as well as attrs. */
public Font (String name, Map attrs)
/* This extra constructor is here to permit ClasspathToolkit and to
build a font with a "logical name" as well as attrs.
ClasspathToolkit.getFont(String,Map) uses reflection to call this
package-private constructor. */
Font (String name, Map attrs)
{
// If attrs is null, setting it to an empty HashMap will give this
// Font default attributes.

View file

@ -193,7 +193,8 @@ public abstract class FontMetrics implements java.io.Serializable
*/
public int charWidth(int ch)
{
return charWidth((char) ch);
char[] chars = Character.toChars(ch);
return charsWidth(chars, 0, chars.length);
}
/**
@ -235,7 +236,8 @@ public abstract class FontMetrics implements java.io.Serializable
public int charsWidth(char[] buf, int offset, int len)
{
int total_width = 0;
for (int i = offset; i < len; i++)
int endOffset = offset + len;
for (int i = offset; i < endOffset; i++)
total_width += charWidth(buf[i]);
return total_width;
}

View file

@ -401,20 +401,6 @@ remove(MenuComponent menu)
menuBar.remove(menu);
}
/**
* Notifies this frame that it should create its native peer.
*/
private static void fireDummyEvent()
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
// Do nothing here.
}
});
}
public void
addNotify()
{
@ -423,11 +409,6 @@ addNotify()
if (peer == null)
peer = getToolkit ().createFrame (this);
// We now know there's a Frame (us) with a live peer, so we can start the
// fundamental queue and dispatch thread, by inserting a dummy event.
if (parent != null && parent.isDisplayable())
fireDummyEvent();
super.addNotify();
}
@ -436,12 +417,6 @@ public void removeNotify()
if (menuBar != null)
menuBar.removeNotify();
super.removeNotify();
// By now we've been disconnected from the peer, and the peer set to
// null. This is formally the same as saying "we just became
// un-displayable", so we wake up the event queue with a dummy event to
// see if it's time to shut down.
fireDummyEvent();
}
/**

View file

@ -125,6 +125,22 @@ public abstract class GraphicsConfiguration
throw new AWTException("not implemented");
}
/**
* Returns a buffered volatile image optimized to this device, and
* with the given transparency. Because the buffer is volatile, it
* can be optimized by native graphics accelerators.
*
* @param w the width of the buffer
* @param h the height of the buffer
* @param transparency the transparency value for the buffer
* @return the buffered image, or null if none is supported
* @throws AWTException if the capabilities cannot be met
* @since 1.5
*/
public abstract VolatileImage createCompatibleVolatileImage(int width,
int height,
int transparency);
/**
* Returns a buffered image optimized to this device, and with the specified
* transparency, so that blitting can be supported in the buffered image.

View file

@ -192,16 +192,12 @@ public class GridBagLayout
if (clone.gridwidth == 0)
clone.gridwidth = GridBagConstraints.REMAINDER;
else if (clone.gridwidth < 0
&& clone.gridwidth != GridBagConstraints.REMAINDER
&& clone.gridwidth != GridBagConstraints.RELATIVE)
else if (clone.gridwidth < 0)
clone.gridwidth = 1;
if (clone.gridheight == 0)
clone.gridheight = GridBagConstraints.REMAINDER;
else if (clone.gridheight < 0
&& clone.gridheight != GridBagConstraints.REMAINDER
&& clone.gridheight != GridBagConstraints.RELATIVE)
else if (clone.gridheight < 0)
clone.gridheight = 1;
comptable.put (component, clone);
@ -913,7 +909,7 @@ public class GridBagLayout
sizes[start] = Math.max(sizes[start], size);
weights[start] = Math.max(weights[start], weight);
}
else
else if (span > 1)
{
int numOccupied = span;
int lastOccupied = -1;

View file

@ -215,12 +215,17 @@ getText()
public synchronized void
setText(String text)
{
this.text = text;
if (peer != null)
if ((this.text == null && text != null)
|| (this.text != null && ! this.text.equals(text)))
{
LabelPeer lp = (LabelPeer) peer;
lp.setText (text);
this.text = text;
if (peer != null)
{
LabelPeer lp = (LabelPeer) peer;
lp.setText (text);
}
invalidate();
}
}

View file

@ -163,6 +163,7 @@ List(int rows, boolean multipleMode)
{
this.rows = rows;
this.multipleMode = multipleMode;
selected = new int[0];
if (GraphicsEnvironment.isHeadless())
throw new HeadlessException ();

View file

@ -179,14 +179,11 @@ private transient ActionListener action_listeners;
*/
public boolean setCurrentAccessibleValue(Number number)
{
if (number.intValue() == 0)
{
setEnabled(false);
return false;
}
setEnabled(true);
return true;
boolean result = (number.intValue() != 0);
// this. is required by javac 1.3, otherwise it is confused with
// MenuItem.this.setEnabled.
this.setEnabled(result);
return result;
}
/* (non-Javadoc)

View file

@ -475,7 +475,7 @@ select(int selectionStart, int selectionEnd)
if (selectionEnd > text.length())
selectionEnd = text.length();
if (selectionStart > getSelectionEnd())
if (selectionStart > selectionEnd)
selectionStart = selectionEnd;
this.selectionStart = selectionStart;

View file

@ -790,6 +790,9 @@ public abstract class Toolkit
{
// Presumably the only reason this isn't abstract is for backwards
// compatibility? FIXME?
if (GraphicsEnvironment.isHeadless())
throw new HeadlessException("No custom cursor in an headless graphics "
+ "environment.");
return null;
}
@ -801,6 +804,9 @@ public abstract class Toolkit
*/
public Dimension getBestCursorSize(int preferredWidth, int preferredHeight)
{
if (GraphicsEnvironment.isHeadless())
throw new HeadlessException("No best cursor size in an headless "
+ "graphics environment.");
return new Dimension (0,0);
}

View file

@ -155,6 +155,9 @@ public class Window extends Container implements Accessible
}
}
});
GraphicsEnvironment g = GraphicsEnvironment.getLocalGraphicsEnvironment();
graphicsConfiguration = g.getDefaultScreenDevice().getDefaultConfiguration();
}
Window(GraphicsConfiguration gc)
@ -619,6 +622,8 @@ public class Window extends Container implements Accessible
|| windowStateListener != null
|| (eventMask & AWTEvent.WINDOW_EVENT_MASK) != 0))
processEvent(e);
else if (e.id == ComponentEvent.COMPONENT_RESIZED)
validate ();
else
super.dispatchEventImpl(e);
}
@ -741,7 +746,25 @@ public class Window extends Container implements Accessible
if (activeWindow == this)
return manager.getFocusOwner ();
else
return windowFocusOwner;
return null;
}
/**
* Returns the child component of this window that would receive
* focus if this window were to become focused. If the window
* already has the top-level focus, then this method returns the
* same component as getFocusOwner. If no child component has
* requested focus within the window, then the initial focus owner
* is returned. If this is a non-focusable window, this method
* returns null.
*
* @return the child component of this window that most recently had
* the focus, or <code>null</code>
* @since 1.4
*/
public Component getMostRecentFocusOwner ()
{
return windowFocusOwner;
}
/**
@ -1070,44 +1093,6 @@ public class Window extends Container implements Accessible
this.focusableWindowState = focusableWindowState;
}
// setBoundsCallback is needed so that when a user moves a window,
// the Window's location can be updated without calling the peer's
// setBounds method. When a user moves a window the peer window's
// location is updated automatically and the windowing system sends
// a message back to the application informing it of its updated
// dimensions. We must update the AWT Window class with these new
// dimensions. But we don't want to call the peer's setBounds
// method, because the peer's dimensions have already been updated.
// (Under X, having this method prevents Configure event loops when
// moving windows: Component.setBounds -> peer.setBounds ->
// postConfigureEvent -> Component.setBounds -> ... In some cases
// Configure event loops cause windows to jitter back and forth
// continuously).
void setBoundsCallback (int x, int y, int w, int h)
{
if (this.x == x && this.y == y && width == w && height == h)
return;
invalidate();
boolean resized = width != w || height != h;
boolean moved = this.x != x || this.y != y;
this.x = x;
this.y = y;
width = w;
height = h;
if (resized && isShowing ())
{
ComponentEvent ce =
new ComponentEvent(this, ComponentEvent.COMPONENT_RESIZED);
getToolkit().getSystemEventQueue().postEvent(ce);
}
if (moved && isShowing ())
{
ComponentEvent ce =
new ComponentEvent(this, ComponentEvent.COMPONENT_MOVED);
getToolkit().getSystemEventQueue().postEvent(ce);
}
}
/**
* Generate a unique name for this window.
*

View file

@ -1,5 +1,5 @@
/* Clipboard.java -- Class for transferring data via cut and paste.
Copyright (C) 1999, 2001 Free Software Foundation, Inc.
Copyright (C) 1999, 2001, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -38,16 +38,21 @@ exception statement from your version. */
package java.awt.datatransfer;
import java.io.IOException;
import java.util.ArrayList;
/**
* This class allows data to be transferred using a cut and paste type
* mechanism.
*
* @author Aaron M. Renn (arenn@urbanophile.com)
* @author Mark J. Wielaard (mark@klomp.org)
*/
public class Clipboard
{
/**
* The data being transferred.
* The data currently on this clipboard. For use by
* subclasses. Also returned by the public method getContents().
*/
protected Transferable contents;
@ -57,7 +62,10 @@ public class Clipboard
protected ClipboardOwner owner;
// The clipboard name
private String name;
private final String name;
// The flavor listeners (most likely small).
private final ArrayList listeners = new ArrayList(3);
/**
* Initializes a new instance of <code>Clipboard</code> with the
@ -81,7 +89,8 @@ public class Clipboard
/**
* Returns the contents of the clipboard.
*
* @param requestor The object requesting the contents.
* @param requestor The object requesting the contents. This
* implementation ignores this parameter.
*
* @exception IllegalStateException If the clipboard is currently unavailable
*/
@ -91,24 +100,108 @@ public class Clipboard
}
/**
* Sets the content and owner of this clipboard.
* If the given owner is different from the current owner
* then lostOwnership is called on the current owner.
* XXX - is this called with the old or new contents.
* Sets the content and owner of this clipboard. If the given owner
* is different from the current owner then <code>lostOwnership()</code>
* is called on the current owner with the old contents of the given
* clipboard.
*
* @param contents The new clipboard contents.
* @param owner The new clipboard owner
*
* @exception IllegalStateException If the clipboard is currently unavailable
*/
public synchronized void setContents(Transferable contents, ClipboardOwner owner)
public synchronized void setContents(Transferable contents,
ClipboardOwner owner)
{
if (this.owner != owner)
if (this.owner != null)
this.owner.lostOwnership(this, contents);
this.owner = owner;
Transferable oldContents = getContents(null);
this.contents = contents;
if (this.owner != owner)
{
ClipboardOwner oldOwner = this.owner;
this.owner = owner;
if (oldOwner != null)
oldOwner.lostOwnership(this, oldContents);
}
FlavorListener[] fs = getFlavorListeners();
if (fs.length > 0)
{
// We are a bit optimistic here. We assume DataFlavors will be
// given in the same order. If the number of flavors is
// different or the order of the DataFlavors in the list then
// fire a change event.
boolean newFlavors = ((contents != null && oldContents == null)
|| (contents == null && oldContents != null));
if (!newFlavors && contents != null && oldContents != null)
{
DataFlavor[] df1 = contents.getTransferDataFlavors();
DataFlavor[] df2 = oldContents.getTransferDataFlavors();
newFlavors = df1.length != df2.length;
for (int i = 0; !newFlavors && i < df1.length; i++)
newFlavors = !df1[i].equals(df2[i]);
}
if (newFlavors)
{
FlavorEvent e = new FlavorEvent(this);
for (int i = 0; i < fs.length; i++)
fs[i].flavorsChanged(e);
}
}
}
public DataFlavor[] getAvailableDataFlavors()
{
Transferable c = getContents(null);
if (c == null)
return new DataFlavor[0];
else
return c.getTransferDataFlavors();
}
public boolean isDataFlavorAvailable(DataFlavor flavor)
{
DataFlavor[] fs = getAvailableDataFlavors();
for (int i = 0; i < fs.length; i++)
if (flavor.equals(fs[i]))
return true;
return false;
}
public Object getData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException
{
Transferable c = getContents(null);
if (c == null)
throw new UnsupportedFlavorException(flavor);
else
return c.getTransferData(flavor);
}
public void addFlavorListener(FlavorListener listener)
{
synchronized(listeners)
{
listeners.add(listener);
}
}
public void removeFlavorListener(FlavorListener listener)
{
synchronized(listeners)
{
listeners.remove(listener);
}
}
public FlavorListener[] getFlavorListeners()
{
synchronized(listeners)
{
return (FlavorListener[])
listeners.toArray(new FlavorListener[listeners.size()]);
}
}
}

View file

@ -49,6 +49,7 @@ import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.rmi.Remote;
/**
* This class represents a particular data format used for transferring
@ -127,10 +128,9 @@ static
javaFileListFlavor
= new DataFlavor(java.util.List.class,
"application/x-java-file-list; class=java.util.List",
"Java File List");
// javaFileListFlavor.mimeType = "application/x-java-file-list";
imageFlavor
= new DataFlavor(java.awt.Image.class,
"Java Image");
@ -335,7 +335,8 @@ getRepresentationClassFromMime(String mimeString, ClassLoader classLoader)
public
DataFlavor(String mimeType, String humanPresentableName)
{
this (getRepresentationClassFromMime (mimeType, null), humanPresentableName);
this (getRepresentationClassFromMime (mimeType, null),
mimeType, humanPresentableName);
}
/*************************************************************************/
@ -426,17 +427,15 @@ getPrimaryType()
public String
getSubType()
{
int idx = mimeType.indexOf("/");
if (idx == -1)
return("");
int start = mimeType.indexOf("/");
if (start == -1)
return "";
String subtype = mimeType.substring(idx + 1);
idx = subtype.indexOf(" ");
if (idx == -1)
return(subtype);
int end = mimeType.indexOf(";", start + 1);
if (end == -1)
return mimeType.substring(start + 1);
else
return(subtype.substring(0, idx));
return mimeType.substring(start + 1, end);
}
/*************************************************************************/
@ -480,6 +479,9 @@ getParameter(String paramName, String mimeString)
public String
getParameter(String paramName)
{
if ("humanPresentableName".equals(paramName))
return getHumanPresentableName();
return getParameter(paramName, mimeType);
}
@ -500,21 +502,28 @@ setHumanPresentableName(String humanPresentableName)
/**
* Tests the MIME type of this object for equality against the specified
* MIME type.
* MIME type. Ignores parameters.
*
* @param mimeType The MIME type to test against.
*
* @return <code>true</code> if the MIME type is equal to this object's
* MIME type, <code>false</code> otherwise.
* MIME type (ignoring parameters), <code>false</code> otherwise.
*
* @exception NullPointerException If mimeType is null.
*/
public boolean
isMimeTypeEqual(String mimeType)
{
// FIXME: Need to handle default attributes and parameters
String mime = getMimeType();
int i = mime.indexOf(";");
if (i != -1)
mime = mime.substring(0, i);
return(this.mimeType.equals(mimeType));
i = mimeType.indexOf(";");
if (i != -1)
mimeType = mimeType.substring(0, i);
return mime.equals(mimeType);
}
/*************************************************************************/
@ -599,8 +608,7 @@ isRepresentationClassSerializable()
public boolean
isRepresentationClassRemote()
{
// FIXME: Implement
throw new RuntimeException("Not implemented");
return Remote.class.isAssignableFrom (representationClass);
}
/*************************************************************************/
@ -852,12 +860,11 @@ readExternal(ObjectInput stream) throws IOException, ClassNotFoundException
public String
toString()
{
return("DataFlavor[representationClass="
+ representationClass.getName()
+ ",mimeType="
+ mimeType
+ "humanPresentableName="
+ humanPresentableName);
return(getClass().getName()
+ "[representationClass=" + getRepresentationClass().getName()
+ ",mimeType=" + getMimeType()
+ ",humanPresentableName=" + getHumanPresentableName()
+ "]");
}
/*************************************************************************/

View file

@ -49,7 +49,7 @@ import javax.swing.Scrollable;
/**
* This event is generated for a mouse wheel rotation. The wheel (the middle
* mouse button on most modern mice) can be rotated towards or away from the
* user, and is ofteh used for scrolling.
* user, and is often used for scrolling.
*
* <p>Because of the special use for scrolling components, MouseWheelEvents
* often affect a different component than the one located at the point of

View file

@ -80,6 +80,7 @@ public class AreaAveragingScaleFilter extends ReplicateScaleFilter
*/
public void setHints(int flags)
{
if (consumer != null)
consumer.setHints(flags);
}
@ -100,6 +101,7 @@ public class AreaAveragingScaleFilter extends ReplicateScaleFilter
public void setPixels(int x, int y, int w, int h,
ColorModel model, byte[] pixels, int offset, int scansize)
{
if (consumer != null)
consumer.setPixels(x, y, w, h, model, pixels, offset, scansize);
}
@ -120,6 +122,7 @@ public class AreaAveragingScaleFilter extends ReplicateScaleFilter
public void setPixels(int x, int y, int w, int h,
ColorModel model, int[] pixels, int offset, int scansize)
{
if (consumer != null)
consumer.setPixels(x, y, w, h, model, pixels, offset, scansize);
}

View file

@ -1,5 +1,5 @@
/* ConvolveOp.java --
Copyright (C) 2004 Free Software Foundation -- ConvolveOp
Copyright (C) 2004, 2005 Free Software Foundation -- ConvolveOp
This file is part of GNU Classpath.
@ -177,11 +177,13 @@ public class ConvolveOp implements BufferedImageOp, RasterOp
}
/**
* Returns (a clone of) the convolution kernel.
*
* @return The convolution kernel.
*/
public Kernel getKernel()
{
return kernel;
return (Kernel) kernel.clone();
}
/* (non-Javadoc)
@ -189,8 +191,6 @@ public class ConvolveOp implements BufferedImageOp, RasterOp
* java.awt.image.WritableRaster)
*/
public WritableRaster filter(Raster src, WritableRaster dest) {
if (src.numBands != dest.numBands)
throw new ImagingOpException(null);
if (src == dest)
throw new IllegalArgumentException();
if (src.getWidth() < kernel.getWidth() ||
@ -199,6 +199,8 @@ public class ConvolveOp implements BufferedImageOp, RasterOp
if (dest == null)
dest = createCompatibleDestRaster(src);
else if (src.numBands != dest.numBands)
throw new ImagingOpException(null);
// Deal with bottom edge
if (edge == EDGE_ZERO_FILL)

View file

@ -79,6 +79,7 @@ public class CropImageFilter extends ImageFilter
*/
public void setDimensions(int width, int height)
{
if (consumer != null)
consumer.setDimensions(this.width, this.height);
}
@ -93,7 +94,8 @@ public class CropImageFilter extends ImageFilter
public void setProperties(Hashtable props)
{
props.put("filters", "CropImageFilter");
consumer.setProperties(props);
if (consumer != null)
consumer.setProperties(props);
}
/**
@ -130,9 +132,10 @@ public class CropImageFilter extends ImageFilter
cropped[i * bounds.width + j] = pixels[start + bounds.x + j];
}
consumer.setPixels(bounds.x, bounds.y,
bounds.width, bounds.height,
model, cropped, 0, bounds.width);
if (consumer != null)
consumer.setPixels(0, 0,
bounds.width, bounds.height,
model, cropped, 0, bounds.width);
}
}
@ -170,9 +173,10 @@ public class CropImageFilter extends ImageFilter
cropped[i * bounds.width + j] = pixels[start + bounds.x + j];
}
consumer.setPixels(bounds.x, bounds.y,
bounds.width, bounds.height,
model, cropped, 0, bounds.width);
if (consumer != null)
consumer.setPixels(0, 0,
bounds.width, bounds.height,
model, cropped, 0, bounds.width);
}
}

View file

@ -348,9 +348,24 @@ public class DirectColorModel extends PackedColorModel
{
return getComponents(getPixelFromArray(pixel), components, offset);
}
/**
* Creates a <code>WriteableRaster</code> that has a <code>SampleModel</code>
* that is compatible with this <code>ColorModel</code>.
*
* @param w the width of the writeable raster to create
* @param h the height of the writeable raster to create
*
* @throws IllegalArgumentException if <code>w</code> or <code>h</code>
* is less than or equal to zero
*/
public final WritableRaster createCompatibleWritableRaster(int w, int h)
{
// Sun also makes this check here.
if(w <= 0 || h <= 0)
throw new IllegalArgumentException("width (=" + w + ") and height (="
+ h + ") must be > 0");
SampleModel sm = createCompatibleSampleModel(w, h);
Point origin = new Point(0, 0);
return Raster.createWritableRaster(sm, origin);
@ -418,3 +433,4 @@ public class DirectColorModel extends PackedColorModel
return super.toString();
}
}

View file

@ -125,6 +125,7 @@ public class ImageFilter implements ImageConsumer, Cloneable
*/
public void setDimensions(int width, int height)
{
if (consumer != null)
consumer.setDimensions(width, height);
}
@ -137,7 +138,8 @@ public class ImageFilter implements ImageConsumer, Cloneable
public void setProperties(Hashtable props)
{
props.put("filters", "ImageFilter");
consumer.setProperties(props);
if (consumer != null)
consumer.setProperties(props);
}
/**
@ -149,6 +151,7 @@ public class ImageFilter implements ImageConsumer, Cloneable
* @see ColorModel */
public void setColorModel(ColorModel model)
{
if (consumer != null)
consumer.setColorModel(model);
}
@ -164,6 +167,7 @@ public class ImageFilter implements ImageConsumer, Cloneable
*/
public void setHints(int flags)
{
if (consumer != null)
consumer.setHints(flags);
}
@ -184,6 +188,7 @@ public class ImageFilter implements ImageConsumer, Cloneable
public void setPixels(int x, int y, int w, int h,
ColorModel model, byte[] pixels, int offset, int scansize)
{
if (consumer != null)
consumer.setPixels(x, y, w, h, model, pixels, offset, scansize);
}
@ -204,6 +209,7 @@ public class ImageFilter implements ImageConsumer, Cloneable
public void setPixels(int x, int y, int w, int h,
ColorModel model, int[] pixels, int offset, int scansize)
{
if (consumer != null)
consumer.setPixels(x, y, w, h, model, pixels, offset, scansize);
}
@ -215,6 +221,7 @@ public class ImageFilter implements ImageConsumer, Cloneable
*/
public void imageComplete(int status)
{
if (consumer != null)
consumer.imageComplete(status);
}
}

View file

@ -131,6 +131,9 @@ public class PixelGrabber implements ImageConsumer
public PixelGrabber(ImageProducer ip, int x, int y, int w, int h,
int pix[], int off, int scansize)
{
if (ip == null)
throw new NullPointerException("The ImageProducer must not be null.");
this.ip = ip;
this.x = x;
this.y = y;
@ -179,6 +182,10 @@ public class PixelGrabber implements ImageConsumer
boolean forceRGB)
{
this.ip = img.getSource();
if (this.ip == null)
throw new NullPointerException("The ImageProducer must not be null.");
this.x = x;
this.y = y;
width = w;
@ -209,7 +216,15 @@ public class PixelGrabber implements ImageConsumer
{
public void run ()
{
ip.startProduction (PixelGrabber.this);
try
{
ip.startProduction (PixelGrabber.this);
}
catch (Exception ex)
{
ex.printStackTrace();
imageComplete(ImageConsumer.IMAGEABORTED);
}
}
};
grabberThread.start ();
@ -601,7 +616,8 @@ public class PixelGrabber implements ImageConsumer
consumerStatus = status;
setObserverStatus ();
grabbing = false;
ip.removeConsumer (this);
if (ip != null)
ip.removeConsumer (this);
notifyAll ();
}

View file

@ -79,10 +79,12 @@ public abstract class RGBImageFilter extends ImageFilter
if( ( model instanceof IndexColorModel) && canFilterIndexColorModel ) {
newmodel = filterIndexColorModel( (IndexColorModel) model );
consumer.setColorModel(newmodel);
if (consumer != null)
consumer.setColorModel(newmodel);
}
else {
consumer.setColorModel(ColorModel.getRGBdefault());
if (consumer != null)
consumer.setColorModel(ColorModel.getRGBdefault());
}
}
@ -178,6 +180,7 @@ public abstract class RGBImageFilter extends ImageFilter
{
if(model == origmodel && (model instanceof IndexColorModel) && canFilterIndexColorModel)
{
if (consumer != null)
consumer.setPixels(x, y, w, h, newmodel, pixels, offset, scansize);
}
else
@ -185,7 +188,8 @@ public abstract class RGBImageFilter extends ImageFilter
int intPixels[] =
convertColorModelToDefault( x, y, w, h, model, pixels, offset, scansize );
filterRGBPixels( x, y, w, h, intPixels, offset, scansize );
consumer.setPixels(x, y, w, h, ColorModel.getRGBdefault(), intPixels, offset, scansize);
if (consumer != null)
consumer.setPixels(x, y, w, h, ColorModel.getRGBdefault(), intPixels, offset, scansize);
}
}
@ -209,6 +213,7 @@ public abstract class RGBImageFilter extends ImageFilter
{
if(model == origmodel && (model instanceof IndexColorModel) && canFilterIndexColorModel)
{
if (consumer != null)
consumer.setPixels(x, y, w, h, newmodel, pixels, offset, scansize);
}
else
@ -216,7 +221,8 @@ public abstract class RGBImageFilter extends ImageFilter
//FIXME: Store the filtered pixels in a separate temporary buffer?
convertColorModelToDefault( x, y, w, h, model, pixels, offset, scansize );
filterRGBPixels( x, y, w, h, pixels, offset, scansize );
consumer.setPixels(x, y, w, h, ColorModel.getRGBdefault(), pixels, offset, scansize);
if (consumer != null)
consumer.setPixels(x, y, w, h, ColorModel.getRGBdefault(), pixels, offset, scansize);
}
}

View file

@ -124,7 +124,8 @@ public class ReplicateScaleFilter extends ImageFilter
destHeight = (int) (height * ((double) destWidth / srcWidth));
}
consumer.setDimensions(destWidth, destHeight);
if (consumer != null)
consumer.setDimensions(destWidth, destHeight);
}
/**
@ -136,7 +137,8 @@ public class ReplicateScaleFilter extends ImageFilter
public void setProperties(Hashtable props)
{
props.put("filters", "ReplicateScaleFilter");
consumer.setProperties(props);
if (consumer != null)
consumer.setProperties(props);
}
/**
@ -165,9 +167,10 @@ public class ReplicateScaleFilter extends ImageFilter
model, pixels, offset, scansize,
rx, ry, destScansize);
consumer.setPixels((int) Math.floor(x/rx), (int) Math.floor(y/ry),
(int) Math.ceil(w/rx), (int) Math.ceil(h/ry),
model, destPixels, 0, destScansize);
if (consumer != null)
consumer.setPixels((int) Math.floor(x/rx), (int) Math.floor(y/ry),
(int) Math.ceil(w/rx), (int) Math.ceil(h/ry),
model, destPixels, 0, destScansize);
}
/**
@ -196,9 +199,10 @@ public class ReplicateScaleFilter extends ImageFilter
model, pixels, offset, scansize,
rx, ry, destScansize);
consumer.setPixels((int) Math.floor(x/rx), (int) Math.floor(y/ry),
(int) Math.ceil(w/rx), (int) Math.ceil(h/ry),
model, destPixels, 0, destScansize);
if (consumer != null)
consumer.setPixels((int) Math.floor(x/rx), (int) Math.floor(y/ry),
(int) Math.ceil(w/rx), (int) Math.ceil(h/ry),
model, destPixels, 0, destScansize);
}
private byte[] replicatePixels(int srcx, int srcy, int srcw, int srch,

View file

@ -51,6 +51,7 @@ import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.PaintEvent;
import java.awt.image.ColorModel;
@ -184,4 +185,48 @@ public interface ComponentPeer
* @since 1.2
*/
void destroyBuffers();
/**
* Get the bounds of this component peer.
*
* @return component peer bounds
* @since 1.5
*/
Rectangle getBounds();
/**
* Reparent this component under another container.
*
* @param parent
* @since 1.5
*/
void reparent(ContainerPeer parent);
/**
* Set the bounds of this component peer.
*
* @param x the new x co-ordinate
* @param y the new y co-ordinate
* @param width the new width
* @param height the new height
* @param z the new stacking level
* @since 1.5
*/
void setBounds (int x, int y, int width, int height, int z);
/**
* Check if this component supports being reparented.
*
* @return true if this component can be reparented,
* false otherwise.
* @since 1.5
*/
boolean isReparentSupported();
/**
* Layout this component peer.
*
* @since 1.5
*/
void layout();
}

View file

@ -54,6 +54,31 @@ public interface ContainerPeer extends ComponentPeer
void endLayout();
boolean isPaintPending();
/**
* Check if this container peer can be restacked.
*
* @return true if this container peer supports being restacked, false otherwise
* @since 1.5
*/
boolean isRestackSupported();
/**
* Cancel a pending paint event on a region of this container.
*
* @param x the x co-ordinate of the region
* @param y the y co-ordinate of the region
* @param width the width of the region
* @param height the height of the region
* @since 1.5
*/
void cancelPendingPaint(int x, int y, int width, int height);
/**
* Restack the component peers in this container peer.
*
* @since 1.5
*/
void restack();
} // interface ContainerPeer

View file

@ -51,5 +51,25 @@ public interface FramePeer extends WindowPeer
int getState();
void setState(int state);
void setMaximizedBounds(Rectangle r);
/**
* Check if this frame peer supports being restacked.
*
* @return true if this frame peer can be restacked,
* false otherwise
* @since 1.5
*/
boolean isRestackSupported();
/**
* Sets the bounds of this frame peer.
*
* @param x the new x co-ordinate
* @param y the new y co-ordinate
* @param width the new width
* @param height the new height
* @since 1.5
*/
void setBoundsPrivate(int x, int y, int width, int height);
} // interface FramePeer

View file

@ -42,6 +42,7 @@ import java.awt.Menu;
public interface MenuBarPeer extends MenuComponentPeer
{
void addMenu(Menu m);
void addHelpMenu(Menu menu);
void delMenu(int index);
} // interface MenuBarPeer

View file

@ -38,8 +38,18 @@ exception statement from your version. */
package java.awt.peer;
import java.awt.Font;
public interface MenuComponentPeer
{
void dispose();
/**
* Set the font on this menu component peer.
*
* @param font the new font
* @since 1.5
*/
void setFont (Font font);
} // interface MenuComponentPeer

View file

@ -43,6 +43,7 @@ import java.awt.MenuItem;
public interface MenuPeer extends MenuItemPeer
{
void addItem (MenuItem item);
void addSeparator ();
void delItem (int index);
}

View file

@ -39,6 +39,7 @@ exception statement from your version. */
package java.awt.peer;
import java.awt.Rectangle;
import java.awt.im.InputMethodRequests;
public interface TextComponentPeer extends ComponentPeer
{
@ -53,5 +54,13 @@ public interface TextComponentPeer extends ComponentPeer
int getIndexAtPoint(int x, int y);
Rectangle getCharacterBounds(int pos);
long filterEvents(long filter);
/**
* Retrieve this text component peer's input method requests.
*
* @return the input method requests made by this text component peer
* @since 1.5
*/
InputMethodRequests getInputMethodRequests();
} // interface TextComponentPeer

View file

@ -42,5 +42,19 @@ public interface WindowPeer extends ContainerPeer
{
void toBack();
void toFront();
/**
* FIXME: unknown.
* @since 1.5
*/
void updateAlwaysOnTop();
/**
* Request that this window peer be given the window focus.
*
* @return true if the window received focus, false otherwise
* @since 1.5
*/
boolean requestWindowFocus();
} // interface WindowPeer

View file

@ -1,5 +1,5 @@
/* java.beans.Expression
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -51,7 +51,7 @@ public class Expression extends Statement
{
// This is a placeholder to indicate that value hasn't been set
// yet;
private static final Object unset = new Object();
private static final Object UNSET = new Object();
// The value to return. This is equal to unset until getValue is called.
private Object value;
@ -89,7 +89,7 @@ public class Expression extends Statement
public Expression(Object target, String methodName, Object[] arguments)
{
super(target, methodName, arguments);
this.value = unset;
this.value = UNSET;
}
/**
@ -105,7 +105,7 @@ public class Expression extends Statement
*/
public Object getValue() throws Exception
{
if (value == unset)
if (value == UNSET)
value = doExecute();
return value;
}
@ -126,7 +126,7 @@ public class Expression extends Statement
public String toString()
{
String result = super.toString();
if (value != unset)
if (value != UNSET)
return value.getClass().getName() + " " + result;
return result;
}

View file

@ -1,5 +1,5 @@
/* java.beans.Statement
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -42,6 +42,9 @@ import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.WeakHashMap;
/**
* class Statement
*
@ -54,6 +57,11 @@ import java.lang.reflect.Method;
*/
public class Statement
{
/** Nested map for the relation between a class, its instances and their
* names.
*/
private static HashMap classMaps = new HashMap();
private Object target;
private String methodName;
private Object[] arguments;
@ -64,8 +72,11 @@ public class Statement
private transient Constructor ctor;
/**
* Constructs a statement representing the invocation of
* object.methodName(arg[0], arg[1], ...);
* <p>Constructs a statement representing the invocation of
* object.methodName(arg[0], arg[1], ...);</p>
*
* <p>If the argument array is null it is replaced with an
* array of zero length.</p>
*
* @param target The object to invoke the method on.
* @param methodName The object method to invoke.
@ -75,7 +86,41 @@ public class Statement
{
this.target = target;
this.methodName = methodName;
this.arguments = arguments;
this.arguments = (arguments != null) ? arguments : new Object[0];
storeTargetName(target);
}
/** Creates a name for the target instance or does nothing if the object's
* name is already known. This makes sure that there *is* a name for every
* target instance.
*/
private static synchronized void storeTargetName(Object obj)
{
Class klass = obj.getClass();
WeakHashMap names = (WeakHashMap) classMaps.get(klass);
if ( names == null )
{
names = new WeakHashMap();
names.put(obj,
( klass == String.class ? ("\"" + obj + "\"") :
(klass.getName() + names.size()) ));
classMaps.put(klass, names);
return;
}
String targetName = (String) names.get(obj);
if ( targetName == null )
{
names.put(obj,
( klass == String.class ? ("\"" + obj + "\"") :
(klass.getName() + names.size()) ));
}
// Nothing to do. The given object was already stored.
}
/**
@ -234,15 +279,7 @@ public class Statement
{
// Skip methods with wrong number of args.
Class ptypes[] = ctors[i].getParameterTypes();
System.out.println("ptypeslen = " + ptypes.length);
System.out.println("ptypes = " + ptypes);
System.out.println("ctor = " + ctors[i].getName());
for (int j=0; j < ptypes.length; j++) {
System.out.println("param = " + ptypes[i].getName());
}
if (ptypes.length != args.length)
continue;
@ -313,14 +350,24 @@ public class Statement
/** Return a string representation. */
public String toString()
{
String result = target.getClass().getName() + "." + methodName + "(";
StringBuffer result = new StringBuffer();
Class klass = target.getClass();
result.append( ((WeakHashMap) classMaps.get(klass)).get(target));
result.append(".");
result.append(methodName);
result.append("(");
String sep = "";
for (int i = 0; i < arguments.length; i++)
{
result = result + sep + arguments[i].getClass().getName();
sep = ", ";
result.append(sep);
result.append(arguments[i].getClass().getName());
sep = ", ";
}
result = result + ")";
return result;
result.append(")");
return result.toString();
}
}

View file

@ -501,8 +501,7 @@ public class ObjectInputStream extends InputStream
flags, fields);
assignNewHandle(osc);
if (callersClassLoader == null)
callersClassLoader = currentLoader();
ClassLoader callersClassLoader = currentLoader();
for (int i = 0; i < field_count; i++)
{
@ -528,36 +527,7 @@ public class ObjectInputStream extends InputStream
/* Now that fields have been read we may resolve the class
* (and read annotation if needed). */
Class clazz;
try
{
clazz = resolveClass(osc);
}
catch (ClassNotFoundException cnfe)
{
// Maybe it was an primitive class?
if (name.equals("void"))
clazz = Void.TYPE;
else if (name.equals("boolean"))
clazz = Boolean.TYPE;
else if (name.equals("byte"))
clazz = Byte.TYPE;
else if (name.equals("short"))
clazz = Short.TYPE;
else if (name.equals("char"))
clazz = Character.TYPE;
else if (name.equals("int"))
clazz = Integer.TYPE;
else if (name.equals("long"))
clazz = Long.TYPE;
else if (name.equals("float"))
clazz = Float.TYPE;
else if (name.equals("double"))
clazz = Double.TYPE;
else
throw cnfe;
}
Class clazz = resolveClass(osc);
boolean oldmode = setBlockDataMode(true);
osc.setClass(clazz, lookupClass(clazz.getSuperclass()));
classLookupTable.put(clazz, osc);
@ -770,16 +740,34 @@ public class ObjectInputStream extends InputStream
protected Class resolveClass(ObjectStreamClass osc)
throws ClassNotFoundException, IOException
{
if (callersClassLoader == null)
String name = osc.getName();
try
{
callersClassLoader = currentLoader ();
if (DEBUG && dump)
{
dumpElementln ("CallersClassLoader = " + callersClassLoader);
}
return Class.forName(name, true, currentLoader());
}
catch(ClassNotFoundException x)
{
if (name.equals("void"))
return Void.TYPE;
else if (name.equals("boolean"))
return Boolean.TYPE;
else if (name.equals("byte"))
return Byte.TYPE;
else if (name.equals("char"))
return Character.TYPE;
else if (name.equals("short"))
return Short.TYPE;
else if (name.equals("int"))
return Integer.TYPE;
else if (name.equals("long"))
return Long.TYPE;
else if (name.equals("float"))
return Float.TYPE;
else if (name.equals("double"))
return Double.TYPE;
else
throw x;
}
return Class.forName(osc.getName(), true, callersClassLoader);
}
/**
@ -957,19 +945,13 @@ public class ObjectInputStream extends InputStream
{
if (this.readDataFromBlock)
{
if (this.blockDataPosition + length > this.blockDataBytes)
{
int remain = this.blockDataBytes - this.blockDataPosition;
if (remain != 0)
{
System.arraycopy(this.blockData, this.blockDataPosition,
data, offset, remain);
offset += remain;
length -= remain;
}
readNextBlock ();
}
int remain = this.blockDataBytes - this.blockDataPosition;
if (remain == 0)
{
readNextBlock();
remain = this.blockDataBytes - this.blockDataPosition;
}
length = Math.min(length, remain);
System.arraycopy(this.blockData, this.blockDataPosition,
data, offset, length);
this.blockDataPosition += length;
@ -1281,7 +1263,7 @@ public class ObjectInputStream extends InputStream
}
catch (NoSuchFieldException e)
{
throw new IllegalArgumentException(e.getMessage());
throw new IllegalArgumentException(e);
}
}
@ -1426,6 +1408,7 @@ public class ObjectInputStream extends InputStream
ObjectStreamField field = clazz.getField(name);
boolean illegal = false;
// XXX This code is horrible and needs to be rewritten!
try
{
try
@ -1485,7 +1468,7 @@ public class ObjectInputStream extends InputStream
catch (NoSuchFieldException e)
{
if (field == null)
throw new IllegalArgumentException(e.getMessage());
throw new IllegalArgumentException(e);
}
}
@ -1829,8 +1812,8 @@ public class ObjectInputStream extends InputStream
}
catch (InstantiationException e)
{
throw new ClassNotFoundException
("Instance of " + real_class + " could not be created");
throw (ClassNotFoundException) new ClassNotFoundException
("Instance of " + real_class + " could not be created").initCause(e);
}
}
@ -1871,13 +1854,13 @@ public class ObjectInputStream extends InputStream
if (exception instanceof ClassNotFoundException)
throw (ClassNotFoundException) exception;
throw new IOException("Exception thrown from readObject() on " +
klass + ": " + exception.getClass().getName());
throw (IOException) new IOException(
"Exception thrown from readObject() on " + klass).initCause(x);
}
catch (Exception x)
{
throw new IOException("Failure invoking readObject() on " +
klass + ": " + x.getClass().getName());
throw (IOException) new IOException(
"Failure invoking readObject() on " + klass).initCause(x);
}
// Invalidate fields which has been read through readFields.
@ -1905,7 +1888,6 @@ public class ObjectInputStream extends InputStream
private Hashtable classLookupTable;
private GetField prereadFields;
private ClassLoader callersClassLoader;
private static boolean dump;
// The nesting depth for debugging output

View file

@ -1456,6 +1456,57 @@ public final class Character implements Serializable, Comparable
*/
private static final int MIRROR_MASK = 0x40;
/**
* Min value for supplementary code point.
*
* @since 1.5
*/
public static final int MIN_SUPPLEMENTARY_CODE_POINT = 0x10000;
/**
* Min value for code point.
*
* @since 1.5
*/
public static final int MIN_CODE_POINT = 0;
/**
* Max value for code point.
*
* @since 1.5
*/
public static final int MAX_CODE_POINT = 0x010ffff;
/**
* Minimum high surrrogate code in UTF-16 encoding.
*
* @since 1.5
*/
public static final char MIN_HIGH_SURROGATE = '\ud800';
/**
* Maximum high surrrogate code in UTF-16 encoding.
*
* @since 1.5
*/
public static final char MAX_HIGH_SURROGATE = '\udbff';
/**
* Minimum low surrrogate code in UTF-16 encoding.
*
* @since 1.5
*/
public static final char MIN_LOW_SURROGATE = '\udc00';
/**
* Maximum low surrrogate code in UTF-16 encoding.
*
* @since 1.5
*/
public static final char MAX_LOW_SURROGATE = '\udfff';
/**
* Grabs an attribute offset from the Unicode attribute database. The lower
* 5 bits are the character type, the next 2 bits are flags, and the top
@ -2250,4 +2301,118 @@ public final class Character implements Serializable, Comparable
{
return compareTo((Character) o);
}
/**
* Converts a unicode code point to a UTF-16 representation of that
* code point.
*
* @param codePoint the unicode code point
*
* @return the UTF-16 representation of that code point
*
* @throws IllegalArgumentException if the code point is not a valid
* unicode code point
*
* @since 1.5
*/
public static char[] toChars(int codePoint)
{
char[] result = new char[charCount(codePoint)];
int ignore = toChars(codePoint, result, 0);
return result;
}
/**
* Converts a unicode code point to its UTF-16 representation.
*
* @param codePoint the unicode code point
* @param dst the target char array
* @param dstIndex the start index for the target
*
* @return number of characters written to <code>dst</code>
*
* @throws IllegalArgumentException if <code>codePoint</code> is not a
* valid unicode code point
* @throws NullPointerException if <code>dst</code> is <code>null</code>
* @throws IndexOutOfBoundsException if <code>dstIndex</code> is not valid
* in <code>dst</code> or if the UTF-16 representation does not
* fit into <code>dst</code>
*
* @since 1.5
*/
public static int toChars(int codePoint, char[] dst, int dstIndex)
{
if (!isValidCodePoint(codePoint))
{
throw new IllegalArgumentException("not a valid code point: "
+ codePoint);
}
int result;
if (isSupplementaryCodePoint(codePoint))
{
// Write second char first to cause IndexOutOfBoundsException
// immediately.
dst[dstIndex + 1] = (char) ((codePoint & 0x3ff)
+ (int) MIN_LOW_SURROGATE );
dst[dstIndex] = (char) ((codePoint >> 10) + (int) MIN_HIGH_SURROGATE);
result = 2;
}
else
{
dst[dstIndex] = (char) codePoint;
result = 1;
}
return result;
}
/**
* Return number of 16-bit characters required to represent the given
* code point.
*
* @param codePoint a uncode code point
*
* @return 2 if codePoint >= 0x10000, 1 otherwise.
*
* @since 1.5
*/
public static int charCount(int codePoint)
{
return
(codePoint >= MIN_SUPPLEMENTARY_CODE_POINT)
? 2
: 1;
}
/**
* Determines whether the specified code point is
* in the range 0x10000 .. 0x10FFFF, i.e. the character is within the Unicode
* supplementary character range.
*
* @param codePoint a Unicode code point
*
* @return <code>true</code> if code point is in supplementary range
*
* @since 1.5
*/
public static boolean isSupplementaryCodePoint(int codePoint)
{
return codePoint >= MIN_SUPPLEMENTARY_CODE_POINT
&& codePoint <= MAX_CODE_POINT;
}
/**
* Determines whether the specified code point is
* in the range 0x0000 .. 0x10FFFF, i.e. it is a valid Unicode code point.
*
* @param codePoint a Unicode code point
*
* @return <code>true</code> if code point is valid
*
* @since 1.5
*/
public static boolean isValidCodePoint(int codePoint)
{
return codePoint >= MIN_CODE_POINT && codePoint <= MAX_CODE_POINT;
}
} // class Character

View file

@ -156,11 +156,7 @@ public final class Class implements Serializable
*/
public static Class forName(String name) throws ClassNotFoundException
{
Class result = VMClass.forName (name);
if (result == null)
result = Class.forName(name, true,
VMStackWalker.getCallingClassLoader());
return result;
return VMClass.forName(name, true, VMStackWalker.getCallingClassLoader());
}
/**
@ -205,24 +201,8 @@ public final class Class implements Serializable
if (cl != null)
sm.checkPermission(new RuntimePermission("getClassLoader"));
}
if (name.startsWith("["))
return VMClass.loadArrayClass(name, null);
Class c = VMClassLoader.loadClass(name, true);
if (c != null)
{
if (initialize)
VMClass.initialize(c);
return c;
}
throw new ClassNotFoundException(name);
}
if (name.startsWith("["))
return VMClass.loadArrayClass(name, classloader);
Class c = classloader.loadClass(name);
classloader.resolveClass(c);
if (initialize)
VMClass.initialize(c);
return c;
return VMClass.forName(name, initialize, classloader);
}
/**

View file

@ -123,14 +123,6 @@ import java.util.StringTokenizer;
*/
public abstract class ClassLoader
{
/**
* All classes loaded by this classloader. VM's may choose to implement
* this cache natively; but it is here available for use if necessary. It
* is not private in order to allow native code (and trusted subclasses)
* access to this field.
*/
final HashMap loadedClasses = new HashMap();
/**
* All packages defined by this classloader. It is not private in order to
* allow native code (and trusted subclasses) access to this field.
@ -472,15 +464,11 @@ public abstract class ClassLoader
ProtectionDomain domain)
throws ClassFormatError
{
checkInitialized();
if (domain == null)
domain = StaticData.defaultProtectionDomain;
if (! initialized)
throw new SecurityException("attempt to define class from uninitialized class loader");
Class retval = VMClassLoader.defineClass(this, name, data,
offset, len, domain);
loadedClasses.put(retval.getName(), retval);
return retval;
return VMClassLoader.defineClass(this, name, data, offset, len, domain);
}
/**
@ -493,6 +481,7 @@ public abstract class ClassLoader
*/
protected final void resolveClass(Class c)
{
checkInitialized();
VMClassLoader.resolveClass(c);
}
@ -508,6 +497,7 @@ public abstract class ClassLoader
protected final Class findSystemClass(String name)
throws ClassNotFoundException
{
checkInitialized();
return Class.forName(name, false, StaticData.systemClassLoader);
}
@ -544,6 +534,7 @@ public abstract class ClassLoader
*/
protected final void setSigners(Class c, Object[] signers)
{
checkInitialized();
c.setSigners(signers);
}
@ -556,9 +547,8 @@ public abstract class ClassLoader
*/
protected final synchronized Class findLoadedClass(String name)
{
// NOTE: If the VM is keeping its own cache, it may make sense to have
// this method be native.
return (Class) loadedClasses.get(name);
checkInitialized();
return VMClassLoader.findLoadedClass(this, name);
}
/**
@ -1113,4 +1103,16 @@ public abstract class ClassLoader
.initCause(e);
}
}
/**
* Before doing anything "dangerous" please call this method to make sure
* this class loader instance was properly constructed (and not obtained
* by exploiting the finalizer attack)
* @see #initialized
*/
private void checkInitialized()
{
if (! initialized)
throw new SecurityException("attempt to use uninitialized class loader");
}
}

View file

@ -47,7 +47,8 @@ package java.lang;
*
* @author Brian Jones
* @author Warren Levy (warrenl@cygnus.com)
* @status updated to 1.4
* @author Andrew John Hughes (gnu_andrew@member.fsf.org)
* @status updated to 1.5
*/
public class IllegalArgumentException extends RuntimeException
{
@ -72,4 +73,57 @@ public class IllegalArgumentException extends RuntimeException
{
super(s);
}
/**
* <p>
* Constructs a <code>IllegalArgumentException</code> using
* the specified error message, which should give further details
* as to the reason for this exception. The specified cause
* <code>Throwable</code> may be used to provide additional history,
* with regards to the root of the problem. It is perfectly valid
* for this to be null, if the cause of the problem is unknown.
* </p>
* <p>
* <strong>Note</strong>: the detail message from the cause is not
* automatically incorporated into the resulting detail message of
* this exception.
* </p>
*
* @param message the detail message, which should give the reason for
* this exception being thrown.
* @param cause the cause of this exception, or null if the cause
* is unknown.
* @since 1.5
*/
public IllegalArgumentException(String message, Throwable cause)
{
super(message, cause);
}
/**
* <p>
* Constructs a <code>IllegalArgumentException</code> using
* the specified cause <code>Throwable</code>, which may be used
* to provide additional history, with regards to the root of the
* problem. It is perfectly valid for this to be null, if the
* cause of the problem is unknown.
* </p>
* <p>
* The detail message is automatically constructed from the detail
* message of the supplied causal exception. If the cause is null,
* then the detail message will also be null. Otherwise, the detail
* message of this exception will be that of the causal exception.
* This makes this constructor very useful for simply wrapping another
* exception.
* </p>
*
* @param cause the cause of this exception, or null if the cause
* is unknown.
* @since 1.5
*/
public IllegalArgumentException(Throwable cause)
{
super(cause);
}
}

View file

@ -51,8 +51,9 @@ package java.lang;
*
* @author Brian Jones
* @author Warren Levy (warrenl@cygnus.com)
* @author Andrew John Hughes (gnu_andrew@member.fsf.org)
* @since 1.1
* @status updated to 1.4
* @status updated to 1.5
*/
public class IllegalStateException extends RuntimeException
{
@ -77,4 +78,58 @@ public class IllegalStateException extends RuntimeException
{
super(s);
}
/**
* <p>
* Constructs a <code>IllegalStateException</code> using
* the specified error message, which should give further details
* as to the reason for this exception. The specified cause
* <code>Throwable</code> may be used to provide additional history,
* with regards to the root of the problem. It is perfectly valid
* for this to be null, if the cause of the problem is unknown.
* </p>
* <p>
* <strong>Note</strong>: the detail message from the cause is not
* automatically incorporated into the resulting detail message of
* this exception.
* </p>
*
* @param message the detail message, which should give the reason for
* this exception being thrown.
* @param cause the cause of this exception, or null if the cause
* is unknown.
* @since 1.5
*/
public IllegalStateException(String message, Throwable cause)
{
super(message, cause);
}
/**
* <p>
* Constructs a <code>IllegalStateException</code> using
* the specified cause <code>Throwable</code>, which may be used
* to provide additional history, with regards to the root of the
* problem. It is perfectly valid for this to be null, if the
* cause of the problem is unknown.
* </p>
* <p>
* The detail message is automatically constructed from the detail
* message of the supplied causal exception. If the cause is null,
* then the detail message will also be null. Otherwise, the detail
* message of this exception will be that of the causal exception.
* This makes this constructor very useful for simply wrapping another
* exception.
* </p>
*
* @param cause the cause of this exception, or null if the cause
* is unknown.
* @since 1.5
*/
public IllegalStateException(Throwable cause)
{
super(cause);
}
}

View file

@ -718,12 +718,12 @@ public final class Integer extends Number implements Comparable
int len = str.length();
boolean isNeg = false;
if (len == 0)
throw new NumberFormatException();
throw new NumberFormatException("string length is null");
int ch = str.charAt(index);
if (ch == '-')
{
if (len == 1)
throw new NumberFormatException();
throw new NumberFormatException("pure '-'");
isNeg = true;
ch = str.charAt(++index);
}
@ -748,7 +748,7 @@ public final class Integer extends Number implements Comparable
}
}
if (index == len)
throw new NumberFormatException();
throw new NumberFormatException("non terminated number: " + str);
int max = MAX_VALUE / radix;
// We can't directly write `max = (MAX_VALUE + 1) / radix'.
@ -760,12 +760,12 @@ public final class Integer extends Number implements Comparable
while (index < len)
{
if (val < 0 || val > max)
throw new NumberFormatException();
throw new NumberFormatException("number overflow (pos=" + index + ") : " + str);
ch = Character.digit(str.charAt(index++), radix);
val = val * radix + ch;
if (ch < 0 || (val < 0 && (! isNeg || val != MIN_VALUE)))
throw new NumberFormatException();
throw new NumberFormatException("invalid character at position " + index + " in " + str);
}
return isNeg ? -val : val;
}

View file

@ -45,8 +45,9 @@ package java.lang;
*
* @author Brian Jones
* @author Warren Levy (warrenl@cygnus.com)
* @author Andrew John Hughes (gnu_andrew@member.fsf.org)
* @see SecurityManager
* @status updated to 1.4
* @status updated to 1.5
*/
public class SecurityException extends RuntimeException
{
@ -71,4 +72,57 @@ public class SecurityException extends RuntimeException
{
super(s);
}
/**
* <p>
* Constructs a <code>SecurityException</code> using
* the specified error message, which should give further details
* as to the reason for this exception. The specified cause
* <code>Throwable</code> may be used to provide additional history,
* with regards to the root of the problem. It is perfectly valid
* for this to be null, if the cause of the problem is unknown.
* </p>
* <p>
* <strong>Note</strong>: the detail message from the cause is not
* automatically incorporated into the resulting detail message of
* this exception.
* </p>
*
* @param message the detail message, which should give the reason for
* this exception being thrown.
* @param cause the cause of this exception, or null if the cause
* is unknown.
* @since 1.5
*/
public SecurityException(String message, Throwable cause)
{
super(message, cause);
}
/**
* <p>
* Constructs a <code>SecurityException</code> using
* the specified cause <code>Throwable</code>, which may be used
* to provide additional history, with regards to the root of the
* problem. It is perfectly valid for this to be null, if the
* cause of the problem is unknown.
* </p>
* <p>
* The detail message is automatically constructed from the detail
* message of the supplied causal exception. If the cause is null,
* then the detail message will also be null. Otherwise, the detail
* message of this exception will be that of the causal exception.
* This makes this constructor very useful for simply wrapping another
* exception.
* </p>
*
* @param cause the cause of this exception, or null if the cause
* is unknown.
* @since 1.5
*/
public SecurityException(Throwable cause)
{
super(cause);
}
}

View file

@ -44,8 +44,9 @@ package java.lang;
* requested of it that it does not support.
*
* @author Warren Levy (warrenl@cygnus.com)
* @author Andrew John Hughes (gnu_andrew@member.fsf.org)
* @since 1.2
* @status updated to 1.4
* @status updated to 1.5
*/
public class UnsupportedOperationException extends RuntimeException
{
@ -70,4 +71,57 @@ public class UnsupportedOperationException extends RuntimeException
{
super(s);
}
/**
* <p>
* Constructs a <code>UnsupportedOperationException</code> using
* the specified error message, which should give further details
* as to the reason for this exception. The specified cause
* <code>Throwable</code> may be used to provide additional history,
* with regards to the root of the problem. It is perfectly valid
* for this to be null, if the cause of the problem is unknown.
* </p>
* <p>
* <strong>Note</strong>: the detail message from the cause is not
* automatically incorporated into the resulting detail message of
* this exception.
* </p>
*
* @param message the detail message, which should give the reason for
* this exception being thrown.
* @param cause the cause of this exception, or null if the cause
* is unknown.
* @since 1.5
*/
public UnsupportedOperationException(String message, Throwable cause)
{
super(message, cause);
}
/**
* <p>
* Constructs a <code>UnsupportedOperationException</code> using
* the specified cause <code>Throwable</code>, which may be used
* to provide additional history, with regards to the root of the
* problem. It is perfectly valid for this to be null, if the
* cause of the problem is unknown.
* </p>
* <p>
* The detail message is automatically constructed from the detail
* message of the supplied causal exception. If the cause is null,
* then the detail message will also be null. Otherwise, the detail
* message of this exception will be that of the causal exception.
* This makes this constructor very useful for simply wrapping another
* exception.
* </p>
*
* @param cause the cause of this exception, or null if the cause
* is unknown.
* @since 1.5
*/
public UnsupportedOperationException(Throwable cause)
{
super(cause);
}
}

View file

@ -38,7 +38,6 @@ exception statement from your version. */
package java.lang.reflect;
import gnu.classpath.Configuration;
import gnu.java.lang.reflect.TypeSignature;
import java.io.Serializable;
@ -263,16 +262,16 @@ public class Proxy implements Serializable
Class clazz = (Class) proxyClasses.get(pt);
if (clazz == null)
{
if (Configuration.HAVE_NATIVE_GET_PROXY_CLASS)
clazz = getProxyClass0(loader, interfaces);
if (VMProxy.HAVE_NATIVE_GET_PROXY_CLASS)
clazz = VMProxy.getProxyClass(loader, interfaces);
else
{
ProxyData data = (Configuration.HAVE_NATIVE_GET_PROXY_DATA
? getProxyData0(loader, interfaces)
ProxyData data = (VMProxy.HAVE_NATIVE_GET_PROXY_DATA
? VMProxy.getProxyData(loader, interfaces)
: ProxyData.getProxyData(pt));
clazz = (Configuration.HAVE_NATIVE_GENERATE_PROXY_CLASS
? generateProxyClass0(loader, data)
clazz = (VMProxy.HAVE_NATIVE_GENERATE_PROXY_CLASS
? VMProxy.generateProxyClass(loader, data)
: new ClassFactory(data).generate(loader));
}
@ -387,74 +386,6 @@ public class Proxy implements Serializable
return ((Proxy) proxy).h;
}
/**
* Optional native method to replace (and speed up) the pure Java
* implementation of getProxyClass. Only needed if
* Configuration.HAVE_NATIVE_GET_PROXY_CLASS is true, this does the
* work of both getProxyData0 and generateProxyClass0 with no
* intermediate form in Java. The native code may safely assume that
* this class must be created, and does not already exist.
*
* @param loader the class loader to define the proxy class in; null
* implies the bootstrap class loader
* @param interfaces the interfaces the class will extend
* @return the generated proxy class
* @throws IllegalArgumentException if the constraints for getProxyClass
* were violated, except for problems with null
* @throws NullPointerException if `interfaces' is null or contains
* a null entry, or if handler is null
* @see Configuration#HAVE_NATIVE_GET_PROXY_CLASS
* @see #getProxyClass(ClassLoader, Class[])
* @see #getProxyData0(ClassLoader, Class[])
* @see #generateProxyClass0(ProxyData)
*/
private static native Class getProxyClass0(ClassLoader loader,
Class[] interfaces);
/**
* Optional native method to replace (and speed up) the pure Java
* implementation of getProxyData. Only needed if
* Configuration.HAVE_NATIVE_GET_PROXY_DATA is true. The native code
* may safely assume that a new ProxyData object must be created which
* does not duplicate any existing ones.
*
* @param loader the class loader to define the proxy class in; null
* implies the bootstrap class loader
* @param interfaces the interfaces the class will extend
* @return all data that is required to make this proxy class
* @throws IllegalArgumentException if the constraints for getProxyClass
* were violated, except for problems with null
* @throws NullPointerException if `interfaces' is null or contains
* a null entry, or if handler is null
* @see Configuration.HAVE_NATIVE_GET_PROXY_DATA
* @see #getProxyClass(ClassLoader, Class[])
* @see #getProxyClass0(ClassLoader, Class[])
* @see ProxyType#getProxyData()
*/
private static native ProxyData getProxyData0(ClassLoader loader,
Class[] interfaces);
/**
* Optional native method to replace (and speed up) the pure Java
* implementation of generateProxyClass. Only needed if
* Configuration.HAVE_NATIVE_GENERATE_PROXY_CLASS is true. The native
* code may safely assume that a new Class must be created, and that
* the ProxyData object does not describe any existing class.
*
* @param loader the class loader to define the proxy class in; null
* implies the bootstrap class loader
* @param data the struct of information to convert to a Class. This
* has already been verified for all problems except exceeding
* VM limitations
* @return the newly generated class
* @throws IllegalArgumentException if VM limitations are exceeded
* @see #getProxyClass(ClassLoader, Class[])
* @see #getProxyClass0(ClassLoader, Class[])
* @see ProxyData#generateProxyClass(ClassLoader)
*/
private static native Class generateProxyClass0(ClassLoader loader,
ProxyData data);
/**
* Helper class for mapping unique ClassLoader and interface combinations
* to proxy classes.
@ -502,49 +433,6 @@ public class Proxy implements Serializable
return hash;
}
// A more comprehensive comparison of two arrays,
// ignore array element order, and
// ignore redundant elements
private static boolean sameTypes(Class arr1[], Class arr2[]) {
if (arr1.length == 1 && arr2.length == 1) {
return arr1[0] == arr2[0];
}
// total occurrance of elements of arr1 in arr2
int total_occ_of_arr1_in_arr2 = 0;
each_type:
for (int i = arr1.length; --i >= 0; )
{
Class t = arr1[i];
for (int j = i; --j >= 0; )
{
if (t == arr1[j])
{ //found duplicate type
continue each_type;
}
}
// count c(a unique element of arr1)'s
// occurrences in arr2
int occ_in_arr2 = 0;
for (int j = arr2.length; --j >= 0; )
{
if (t == arr2[j])
{
++occ_in_arr2;
}
}
if (occ_in_arr2 == 0)
{ // t does not occur in arr2
return false;
}
total_occ_of_arr1_in_arr2 += occ_in_arr2;
}
// now, each element of arr2 must have been visited
return total_occ_of_arr1_in_arr2 == arr2.length;
}
/**
* Calculates equality.
*
@ -556,7 +444,10 @@ public class Proxy implements Serializable
ProxyType pt = (ProxyType) other;
if (loader != pt.loader || interfaces.length != pt.interfaces.length)
return false;
return sameTypes(interfaces, pt.interfaces);
for (int i = 0; i < interfaces.length; i++)
if (interfaces[i] != pt.interfaces[i])
return false;
return true;
}
} // class ProxyType
@ -720,7 +611,7 @@ public class Proxy implements Serializable
*
* @author Eric Blake (ebb9@email.byu.edu)
*/
private static final class ProxyData
static final class ProxyData
{
/**
* The package this class is in <b>including the trailing dot</b>
@ -876,7 +767,6 @@ public class Proxy implements Serializable
private static final class ClassFactory
{
/** Constants for assisting the compilation */
private static final byte POOL = 0;
private static final byte FIELD = 1;
private static final byte METHOD = 2;
private static final byte INTERFACE = 3;
@ -909,7 +799,6 @@ public class Proxy implements Serializable
private static final char GETFIELD = 180;
private static final char INVOKEVIRTUAL = 182;
private static final char INVOKESPECIAL = 183;
private static final char INVOKESTATIC = 184;
private static final char INVOKEINTERFACE = 185;
private static final char NEW = 187;
private static final char ANEWARRAY = 189;

View file

@ -1,5 +1,5 @@
/* DatagramSocket.java -- A class to model UDP sockets
Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004
Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -38,6 +38,8 @@ exception statement from your version. */
package java.net;
import gnu.classpath.SystemProperties;
import gnu.java.net.PlainDatagramSocketImpl;
import gnu.java.nio.DatagramChannelImpl;
@ -172,7 +174,7 @@ public class DatagramSocket
*/
public DatagramSocket(SocketAddress address) throws SocketException
{
String propVal = System.getProperty("impl.prefix");
String propVal = SystemProperties.getProperty("impl.prefix");
if (propVal == null || propVal.equals(""))
impl = new PlainDatagramSocketImpl();
else

View file

@ -142,7 +142,7 @@ public final class Inet4Address extends InetAddress
*/
public boolean isMCNodeLocal()
{
return isMCNodeLocal();
return super.isMCNodeLocal();
}
/**
@ -172,7 +172,7 @@ public final class Inet4Address extends InetAddress
*/
public boolean isMCOrgLocal()
{
return isMCOrgLocal();
return super.isMCOrgLocal();
}
/**

View file

@ -1,5 +1,5 @@
/* JarURLConnection.java -- Class for manipulating remote jar files
Copyright (C) 1998, 2002, 2003 Free Software Foundation, Inc.
Copyright (C) 1998, 2002, 2003, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -151,8 +151,9 @@ public abstract class JarURLConnection extends URLConnection
*/
public JarEntry getJarEntry() throws IOException
{
if (entryName == null)
return null;
JarFile jarFile = getJarFile();
return jarFile != null ? jarFile.getJarEntry(entryName) : null;
}

View file

@ -38,7 +38,12 @@ exception statement from your version. */
package java.net;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;
/**
@ -143,9 +148,7 @@ public final class NetworkInterface
public static NetworkInterface getByName(String name)
throws SocketException
{
Vector networkInterfaces = VMNetworkInterface.getInterfaces();
for (Enumeration e = networkInterfaces.elements(); e.hasMoreElements();)
for (Enumeration e = getNetworkInterfaces(); e.hasMoreElements();)
{
NetworkInterface tmp = (NetworkInterface) e.nextElement();
@ -170,9 +173,7 @@ public final class NetworkInterface
public static NetworkInterface getByInetAddress(InetAddress addr)
throws SocketException
{
Vector networkInterfaces = VMNetworkInterface.getInterfaces();
for (Enumeration interfaces = networkInterfaces.elements();
for (Enumeration interfaces = getNetworkInterfaces();
interfaces.hasMoreElements();)
{
NetworkInterface tmp = (NetworkInterface) interfaces.nextElement();
@ -188,6 +189,41 @@ public final class NetworkInterface
throw new SocketException("no network interface is bound to such an IP address");
}
static private Collection condense(Collection interfaces)
{
final Map condensed = new HashMap();
final Iterator interfs = interfaces.iterator();
while (interfs.hasNext()) {
final NetworkInterface face = (NetworkInterface) interfs.next();
final String name = face.getName();
if (condensed.containsKey(name))
{
final NetworkInterface conface = (NetworkInterface) condensed.get(name);
if (!conface.inetAddresses.containsAll(face.inetAddresses))
{
final Iterator faceAddresses = face.inetAddresses.iterator();
while (faceAddresses.hasNext())
{
final InetAddress faceAddress = (InetAddress) faceAddresses.next();
if (!conface.inetAddresses.contains(faceAddress))
{
conface.inetAddresses.add(faceAddress);
}
}
}
}
else
{
condensed.put(name, face);
}
}
return condensed.values();
}
/**
* Return an <code>Enumeration</code> of all available network interfaces
*
@ -202,7 +238,9 @@ public final class NetworkInterface
if (networkInterfaces.isEmpty())
return null;
return networkInterfaces.elements();
Collection condensed = condense(networkInterfaces);
return Collections.enumeration(condensed);
}
/**

View file

@ -588,10 +588,10 @@ public class URLClassLoader extends SecureClassLoader
* in the order given to the URLClassLoader which uses these URLs to
* load classes and resources (after using the default parent ClassLoader).
*
* @exception SecurityException if the SecurityManager disallows the
* creation of a ClassLoader.
* @param urls Locations that should be searched by this ClassLoader when
* resolving Classes or Resources.
* @exception SecurityException if the SecurityManager disallows the
* creation of a ClassLoader.
* @see SecureClassLoader
*/
public URLClassLoader(URL[] urls) throws SecurityException
@ -610,13 +610,13 @@ public class URLClassLoader extends SecureClassLoader
* can throw a SecurityException. Then the supplied URLs are added
* in the order given to the URLClassLoader which uses these URLs to
* load classes and resources (after using the supplied parent ClassLoader).
* @exception SecurityException if the SecurityManager disallows the
* creation of a ClassLoader.
* @exception SecurityException
* @param urls Locations that should be searched by this ClassLoader when
* resolving Classes or Resources.
* @param parent The parent class loader used before trying this class
* loader.
* @exception SecurityException if the SecurityManager disallows the
* creation of a ClassLoader.
* @exception SecurityException
* @see SecureClassLoader
*/
public URLClassLoader(URL[] urls, ClassLoader parent)
@ -658,14 +658,14 @@ public class URLClassLoader extends SecureClassLoader
* load classes and resources (after using the supplied parent ClassLoader).
* It will use the supplied <CODE>URLStreamHandlerFactory</CODE> to get the
* protocol handlers of the supplied URLs.
* @exception SecurityException if the SecurityManager disallows the
* creation of a ClassLoader.
* @exception SecurityException
* @param urls Locations that should be searched by this ClassLoader when
* resolving Classes or Resources.
* @param parent The parent class loader used before trying this class
* loader.
* @param factory Used to get the protocol handler for the URLs.
* @exception SecurityException if the SecurityManager disallows the
* creation of a ClassLoader.
* @exception SecurityException
* @see SecureClassLoader
*/
public URLClassLoader(URL[] urls, ClassLoader parent,
@ -764,12 +764,12 @@ public class URLClassLoader extends SecureClassLoader
* package is sealed. If the Manifest indicates that the package is sealed
* then the Package will be sealed with respect to the supplied URL.
*
* @exception IllegalArgumentException If this package name already exists
* in this class loader
* @param name The name of the package
* @param manifest The manifest describing the specification,
* implementation and sealing details of the package
* @param url the code source url to seal the package
* @exception IllegalArgumentException If this package name already exists
* in this class loader
* @return the defined Package
*/
protected Package definePackage(String name, Manifest manifest, URL url)
@ -900,7 +900,11 @@ public class URLClassLoader extends SecureClassLoader
else
result = defineClass(className, classData, 0, classData.length, source);
super.setSigners(result, resource.getCertificates());
// Avoid NullPointerExceptions.
Certificate[] resourceCertificates = resource.getCertificates();
if(resourceCertificates != null)
super.setSigners(result, resourceCertificates);
return result;
}
catch (IOException ioe)
@ -1016,11 +1020,11 @@ public class URLClassLoader extends SecureClassLoader
/**
* Finds all the resources with a particular name from all the locations.
*
* @exception IOException when an error occurs accessing one of the
* locations
* @param resourceName the name of the resource to lookup
* @return a (possible empty) enumeration of URLs where the resource can be
* found
* @exception IOException when an error occurs accessing one of the
* locations
*/
public Enumeration findResources(String resourceName)
throws IOException
@ -1055,7 +1059,7 @@ public class URLClassLoader extends SecureClassLoader
*
* @param source The codesource that needs the permissions to be accessed
* @return the collection of permissions needed to access the code resource
* @see java.security.SecureClassLoader#getPermissions()
* @see java.security.SecureClassLoader#getPermissions(CodeSource)
*/
protected PermissionCollection getPermissions(CodeSource source)
{

View file

@ -38,7 +38,7 @@ exception statement from your version. */
package java.nio;
import gnu.classpath.RawData;
import gnu.classpath.Pointer;
/**
* @since 1.4
@ -49,7 +49,7 @@ public abstract class Buffer
int limit = 0;
int pos = 0;
int mark = -1;
RawData address;
Pointer address;
/**
* Creates a new Buffer.

View file

@ -1,4 +1,4 @@
/* DirectByteBufferImpl.java --
/* DirectByteBufferImpl.java --
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -38,7 +38,7 @@ exception statement from your version. */
package java.nio;
import gnu.classpath.RawData;
import gnu.classpath.Pointer;
abstract class DirectByteBufferImpl extends ByteBuffer
{
@ -59,9 +59,9 @@ abstract class DirectByteBufferImpl extends ByteBuffer
static final class ReadOnly extends DirectByteBufferImpl
{
ReadOnly(Object owner, RawData address,
int capacity, int limit,
int position)
ReadOnly(Object owner, Pointer address,
int capacity, int limit,
int position)
{
super(owner, address, capacity, limit, position);
}
@ -89,9 +89,9 @@ abstract class DirectByteBufferImpl extends ByteBuffer
super(capacity);
}
ReadWrite(Object owner, RawData address,
int capacity, int limit,
int position)
ReadWrite(Object owner, Pointer address,
int capacity, int limit,
int position)
{
super(owner, address, capacity, limit, position);
}
@ -109,9 +109,9 @@ abstract class DirectByteBufferImpl extends ByteBuffer
this.address = VMDirectByteBuffer.allocate(capacity);
}
DirectByteBufferImpl(Object owner, RawData address,
int capacity, int limit,
int position)
DirectByteBufferImpl(Object owner, Pointer address,
int capacity, int limit,
int position)
{
super(capacity, limit, position, -1);
this.owner = owner;
@ -120,7 +120,7 @@ abstract class DirectByteBufferImpl extends ByteBuffer
/**
* Allocates a new direct byte buffer.
*/
*/
public static ByteBuffer allocate(int capacity)
{
return new DirectByteBufferImpl.ReadWrite(capacity);
@ -131,7 +131,7 @@ abstract class DirectByteBufferImpl extends ByteBuffer
if (owner == this)
VMDirectByteBuffer.free(address);
}
public byte get()
{
checkForUnderflow();
@ -170,7 +170,7 @@ abstract class DirectByteBufferImpl extends ByteBuffer
position(pos + 1);
return this;
}
public ByteBuffer put(int index, byte value)
{
checkIndex(index);
@ -178,12 +178,24 @@ abstract class DirectByteBufferImpl extends ByteBuffer
VMDirectByteBuffer.put(address, index, value);
return this;
}
public ByteBuffer put (byte[] src, int offset, int length)
{
checkArraySize (src.length, offset, length);
checkForUnderflow (length);
int index = position ();
VMDirectByteBuffer.put (address, index, src, offset, length);
position (index + length);
return this;
}
void shiftDown(int dst_offset, int src_offset, int count)
{
VMDirectByteBuffer.shiftDown(address, dst_offset, src_offset, count);
}
public ByteBuffer compact()
{
checkIfReadOnly();
@ -191,15 +203,15 @@ abstract class DirectByteBufferImpl extends ByteBuffer
int pos = position();
if (pos > 0)
{
int count = remaining();
VMDirectByteBuffer.shiftDown(address, 0, pos, count);
position(count);
limit(capacity());
int count = remaining();
VMDirectByteBuffer.shiftDown(address, 0, pos, count);
position(count);
limit(capacity());
}
else
{
position(limit());
limit(capacity());
position(limit());
limit(capacity());
}
return this;
}
@ -233,9 +245,9 @@ abstract class DirectByteBufferImpl extends ByteBuffer
if (mark != pos)
{
result.position(mark);
result.mark();
result.position(pos);
result.position(mark);
result.mark();
result.position(pos);
}
return result;
}
@ -289,18 +301,18 @@ abstract class DirectByteBufferImpl extends ByteBuffer
{
return ByteBufferHelper.getChar(this, order());
}
public ByteBuffer putChar(char value)
{
ByteBufferHelper.putChar(this, value, order());
return this;
}
public char getChar(int index)
{
return ByteBufferHelper.getChar(this, index, order());
}
public ByteBuffer putChar(int index, char value)
{
ByteBufferHelper.putChar(this, index, value, order());
@ -311,18 +323,18 @@ abstract class DirectByteBufferImpl extends ByteBuffer
{
return ByteBufferHelper.getShort(this, order());
}
public ByteBuffer putShort(short value)
{
ByteBufferHelper.putShort(this, value, order());
return this;
}
public short getShort(int index)
{
return ByteBufferHelper.getShort(this, index, order());
}
public ByteBuffer putShort(int index, short value)
{
ByteBufferHelper.putShort(this, index, value, order());
@ -333,18 +345,18 @@ abstract class DirectByteBufferImpl extends ByteBuffer
{
return ByteBufferHelper.getInt(this, order());
}
public ByteBuffer putInt(int value)
{
ByteBufferHelper.putInt(this, value, order());
return this;
}
public int getInt(int index)
{
return ByteBufferHelper.getInt(this, index, order());
}
public ByteBuffer putInt(int index, int value)
{
ByteBufferHelper.putInt(this, index, value, order());
@ -355,18 +367,18 @@ abstract class DirectByteBufferImpl extends ByteBuffer
{
return ByteBufferHelper.getLong(this, order());
}
public ByteBuffer putLong(long value)
{
ByteBufferHelper.putLong(this, value, order());
return this;
}
public long getLong(int index)
{
return ByteBufferHelper.getLong(this, index, order());
}
public ByteBuffer putLong(int index, long value)
{
ByteBufferHelper.putLong(this, index, value, order());
@ -377,13 +389,13 @@ abstract class DirectByteBufferImpl extends ByteBuffer
{
return ByteBufferHelper.getFloat(this, order());
}
public ByteBuffer putFloat(float value)
{
ByteBufferHelper.putFloat(this, value, order());
return this;
}
public float getFloat(int index)
{
return ByteBufferHelper.getFloat(this, index, order());
@ -405,12 +417,12 @@ abstract class DirectByteBufferImpl extends ByteBuffer
ByteBufferHelper.putDouble(this, value, order());
return this;
}
public double getDouble(int index)
{
return ByteBufferHelper.getDouble(this, index, order());
}
public ByteBuffer putDouble(int index, double value)
{
ByteBufferHelper.putDouble(this, index, value, order());

View file

@ -38,7 +38,7 @@ exception statement from your version. */
package java.nio;
import gnu.classpath.RawData;
import gnu.classpath.Pointer;
import java.io.IOException;
@ -48,12 +48,12 @@ final class MappedByteBufferImpl extends MappedByteBuffer
/** Posix uses this for the pointer returned by mmap;
* Win32 uses it for the pointer returned by MapViewOfFile. */
public RawData implPtr;
public Pointer implPtr;
/** Posix uses this for the actual length passed to mmap;
* Win32 uses it for the pointer returned by CreateFileMapping. */
public long implLen;
public MappedByteBufferImpl(RawData address, int size, boolean readOnly)
public MappedByteBufferImpl(Pointer address, int size, boolean readOnly)
throws IOException
{
super(size, size, 0, -1);

View file

@ -45,10 +45,10 @@ import java.io.IOException;
*/
public abstract class FileLock
{
FileChannel channel;
long position;
long size;
boolean shared;
private final FileChannel channel;
private final long position;
private final long size;
private final boolean shared;
/**
* Initializes the file lock.

View file

@ -68,9 +68,9 @@ public abstract class Charset implements Comparable
{
private CharsetEncoder cachedEncoder;
private CharsetDecoder cachedDecoder;
/**
* Charset providers.
* Extra Charset providers.
*/
private static CharsetProvider[] providers;
@ -204,13 +204,19 @@ public abstract class Charset implements Comparable
private static Charset charsetForName(String charsetName)
{
checkName (charsetName);
Charset cs = null;
CharsetProvider[] providers = providers2();
for (int i = 0; i < providers.length; i++)
// Try the default provider first
// (so we don't need to load external providers unless really necessary)
// if it is an exotic charset try loading the external providers.
Charset cs = provider().charsetForName(charsetName);
if (cs == null)
{
cs = providers[i].charsetForName(charsetName);
if (cs != null)
break;
CharsetProvider[] providers = providers2();
for (int i = 0; i < providers.length; i++)
{
cs = providers[i].charsetForName(charsetName);
if (cs != null)
break;
}
}
return cs;
}
@ -218,6 +224,11 @@ public abstract class Charset implements Comparable
public static SortedMap availableCharsets()
{
TreeMap charsets = new TreeMap(String.CASE_INSENSITIVE_ORDER);
for (Iterator i = provider().charsets(); i.hasNext(); )
{
Charset cs = (Charset) i.next();
charsets.put(cs.name(), cs);
}
CharsetProvider[] providers = providers2();
for (int j = 0; j < providers.length; j++)
@ -246,7 +257,7 @@ public abstract class Charset implements Comparable
/**
* We need to support multiple providers, reading them from
* java.nio.charset.spi.CharsetProvider in the resource directory
* META-INF/services.
* META-INF/services. This returns the "extra" charset providers.
*/
private static CharsetProvider[] providers2()
{
@ -257,7 +268,6 @@ public abstract class Charset implements Comparable
Enumeration en = ClassLoader.getSystemResources
("META-INF/services/java.nio.charset.spi.CharsetProvider");
LinkedHashSet set = new LinkedHashSet();
set.add(provider());
while (en.hasMoreElements())
{
BufferedReader rdr = new BufferedReader(new InputStreamReader

View file

@ -214,7 +214,7 @@ public class RMIClassLoader
//try context class loader first
try
{
return loader.loadClass (name);
return Class.forName(name, false, loader);
}
catch (ClassNotFoundException e)
{
@ -237,7 +237,7 @@ public class RMIClassLoader
") at codebase (" + codebases + ")");
}
return loader.loadClass (name);
return Class.forName(name, false, loader);
}
/**

View file

@ -1,5 +1,5 @@
/* KeyPairGenerator.java --- Key Pair Generator Class
Copyright (C) 1999, 2002, 2003, 2004 Free Software Foundation, Inc.
Copyright (C) 1999, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -300,7 +300,6 @@ public abstract class KeyPairGenerator extends KeyPairGeneratorSpi
*/
public void initialize(int keysize, SecureRandom random)
{
initialize(keysize, random);
}
/**

View file

@ -1,5 +1,5 @@
/* X509CertSelector.java -- selects X.509 certificates by criteria.
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -915,7 +915,7 @@ public class X509CertSelector implements CertSelector, Cloneable
}
if (sigId != null)
{
if (!sigId.equals(cert.getSigAlgOID()))
if (!sigId.toString().equals(cert.getSigAlgOID()))
return false;
}
if (subjectKeyId != null)

View file

@ -1,5 +1,5 @@
/* Date.java -- Wrapper around java.util.Date
Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc.
Copyright (C) 1999, 2000, 2003, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -154,8 +154,6 @@ public class Date extends java.util.Date
*
* @param str The string to parse.
* @return The resulting <code>java.sql.Date</code> value.
*
* @deprecated
*/
public static Date valueOf (String str)
{
@ -178,8 +176,6 @@ public class Date extends java.util.Date
* This method returns this date in JDBC format.
*
* @return This date as a string.
*
* @deprecated
*/
public String toString()
{

View file

@ -1,5 +1,5 @@
/* Time.java -- Wrapper around java.util.Date
Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
Copyright (C) 1999, 2000, 2002, 2003, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -139,8 +139,6 @@ public class Time extends java.util.Date
*
* @param str The string to parse.
* @return The resulting <code>java.sql.Time</code> value.
*
* @deprecated
*/
public static Time valueOf (String str)
{
@ -193,8 +191,6 @@ public class Time extends java.util.Date
* This method returns this date in JDBC format.
*
* @return This date as a string.
*
* @deprecated
*/
public String toString ()
{

View file

@ -58,7 +58,7 @@ import java.util.Set;
public interface AttributedCharacterIterator extends CharacterIterator
{
/**
* This class defines attribute keys that are used as text attributes.
* Defines attribute keys that are used as text attributes.
*/
public static class Attribute implements Serializable
{
@ -74,7 +74,8 @@ public interface AttributedCharacterIterator extends CharacterIterator
* This is the attribute for the reading form of text. This is used
* for storing pronunciation along with the written text for languages
* which need it. The value of attributes of this key type are
* instances of <code>Annotation</code> which wrappers a <code>String</code>.
* instances of <code>Annotation</code> which wrappers a
* <code>String</code>.
*/
public static final Attribute READING = new Attribute ("READING");
@ -87,14 +88,13 @@ public interface AttributedCharacterIterator extends CharacterIterator
new Attribute ("INPUT_METHOD_SEGMENT");
/**
* This is the name of the attribute key
* The name of the attribute key
* @serial
*/
private String name;
/**
* This method initializes a new instance of this class with the specified
* name.
* Initializes a new instance of this class with the specified name.
*
* @param name The name of this attribute key.
*/
@ -104,7 +104,7 @@ public interface AttributedCharacterIterator extends CharacterIterator
}
/**
* This method returns the name of this attribute.
* Returns the name of this attribute.
*
* @return The attribute name
*/
@ -114,14 +114,16 @@ public interface AttributedCharacterIterator extends CharacterIterator
}
/**
* This method resolves an instance of <code>AttributedCharacterIterator.Attribute</code>
* Resolves an instance of
* <code>AttributedCharacterIterator.Attribute</code>
* that is being deserialized to one of the three pre-defined attribute
* constants. It does this by comparing the names of the attributes. The
* constant that the deserialized object resolves to is returned.
*
* @return The resolved contant value
*
* @exception InvalidObjectException If the object being deserialized cannot be resolved.
* @exception InvalidObjectException If the object being deserialized
* cannot be resolved.
*/
protected Object readResolve() throws InvalidObjectException
{
@ -134,21 +136,25 @@ public interface AttributedCharacterIterator extends CharacterIterator
if (this.equals (INPUT_METHOD_SEGMENT))
return INPUT_METHOD_SEGMENT;
throw new InvalidObjectException ("Can't resolve Attribute: " + getName());
throw new InvalidObjectException ("Can't resolve Attribute: "
+ getName());
}
/**
* This method tests this object for equality against the specified object.
* Tests this object for equality against the specified object.
* The two objects will be considered equal if and only if:
* <ul>
* <li>The specified object is not <code>null</code>.
* <li>The specified object is an instance of <code>AttributedCharacterIterator.Attribute</code>.
* <li>The specified object is an instance of
* <code>AttributedCharacterIterator.Attribute</code>.
* <li>The specified object has the same attribute name as this object.
* </ul>
*
* @param The <code>Object</code> to test for equality against this object.
* @param obj the <code>Object</code> to test for equality against this
* object.
*
* @return <code>true</code> if the specified object is equal to this one, <code>false</code> otherwise.
* @return <code>true</code> if the specified object is equal to this one,
* <code>false</code> otherwise.
*/
public final boolean equals (Object obj)
{
@ -159,7 +165,7 @@ public interface AttributedCharacterIterator extends CharacterIterator
}
/**
* This method returns a hash value for this object.
* Returns a hash value for this object.
*
* @return A hash value for this object.
*/
@ -169,7 +175,7 @@ public interface AttributedCharacterIterator extends CharacterIterator
}
/**
* This method returns a <code>String</code> representation of this object.
* Returns a <code>String</code> representation of this object.
*
* @return A <code>String</code> representation of this object.
*/
@ -181,7 +187,7 @@ public interface AttributedCharacterIterator extends CharacterIterator
} // Inner class Attribute
/**
* This method returns a list of all keys that are defined for the
* Returns a list of all keys that are defined for the
* text range. This can be an empty list if no attributes are defined.
*
* @return A list of keys
@ -189,15 +195,15 @@ public interface AttributedCharacterIterator extends CharacterIterator
Set getAllAttributeKeys();
/**
* This method returns a <code>Map</code> of the attributed defined for
* the current character.
* Returns a <code>Map</code> of the attributes defined for the current
* character.
*
* @return A <code>Map</code> of the attributes for the current character.
*/
Map getAttributes();
/**
* This method returns the value of the specified attribute for the
* Returns the value of the specified attribute for the
* current character. If the attribute is not defined for the current
* character, <code>null</code> is returned.
*
@ -208,7 +214,7 @@ public interface AttributedCharacterIterator extends CharacterIterator
Object getAttribute (AttributedCharacterIterator.Attribute attrib);
/**
* This method returns the index of the first character in the run that
* Returns the index of the first character in the run that
* contains all attributes defined for the current character.
*
* @return The start index of the run
@ -216,7 +222,7 @@ public interface AttributedCharacterIterator extends CharacterIterator
int getRunStart();
/**
* This method returns the index of the first character in the run that
* Returns the index of the first character in the run that
* contains all attributes in the specified <code>Set</code> defined for
* the current character.
*
@ -227,7 +233,7 @@ public interface AttributedCharacterIterator extends CharacterIterator
int getRunStart (Set attribs);
/**
* This method returns the index of the first character in the run that
* Returns the index of the first character in the run that
* contains the specified attribute defined for the current character.
*
* @param attrib The attribute.
@ -237,15 +243,15 @@ public interface AttributedCharacterIterator extends CharacterIterator
int getRunStart (AttributedCharacterIterator.Attribute attrib);
/**
* This method returns the index of the character after the end of the run
* that contains all attributed defined for the current character.
* Returns the index of the character after the end of the run
* that contains all attributes defined for the current character.
*
* @return The end index of the run.
*/
int getRunLimit();
/**
* This method returns the index of the character after the end of the run
* Returns the index of the character after the end of the run
* that contains all attributes in the specified <code>Set</code> defined
* for the current character.
*
@ -256,7 +262,7 @@ public interface AttributedCharacterIterator extends CharacterIterator
int getRunLimit (Set attribs);
/**
* This methods returns the index of the character after the end of the run
* Returns the index of the character after the end of the run
* that contains the specified attribute defined for the current character.
*
* @param attrib The attribute.

View file

@ -1,5 +1,5 @@
/* AttributedString.java -- Models text with attributes
Copyright (C) 1998, 1999, 2004 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2004, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -47,379 +47,326 @@ import java.util.Map;
import java.util.Set;
/**
* This class models a <code>String</code> with attributes over various
* subranges of the string. It allows applications to access this
* information via the <code>AttributedCharcterIterator</code> interface.
*
* @version 0.0
*
* @author Aaron M. Renn (arenn@urbanophile.com)
*/
* This class models a <code>String</code> with attributes over various
* subranges of the string. It allows applications to access this
* information via the <code>AttributedCharcterIterator</code> interface.
*
* @author Aaron M. Renn (arenn@urbanophile.com)
*/
public class AttributedString
{
/*************************************************************************/
/**
* The attributes and ranges of text over which those attributes apply.
*/
final class AttributeRange
{
/*
* Inner Classes
*/
/** A Map of the attributes */
Map attribs;
/**
* This class contains the attributes and ranges of text over which
* that attributes apply.
*/
final class AttributeRange
{
/** The beginning index of the attributes */
int begin_index;
/*
* Instance Variables
*/
/** The ending index of the attributes */
int end_index;
/**
* A Map of the attributes
*/
Map attribs;
/**
* The beginning index of the attributes
*/
int begin_index;
/**
* The ending index of the attributes
*/
int end_index;
/*************************************************************************/
/*
* Constructors
*/
AttributeRange(Map attribs, int begin_index, int end_index)
{
this.attribs = attribs;
this.begin_index = begin_index;
this.end_index = end_index;
}
} // Inner class AttributeRange
/*************************************************************************/
/*
* Instance Variables
*/
/**
* This object holds the string we are representing.
*/
private StringCharacterIterator sci;
/**
* This is the attribute information
*/
private AttributeRange[] attribs;
/*************************************************************************/
/*
* Constructors
*/
/**
* This method initializes a new instance of <code>AttributedString</code>
* that represents the specified <code>String</code> with no attributes.
*
* @param str The <code>String</code> to be attributed.
*/
public
AttributedString(String str)
{
sci = new StringCharacterIterator(str);
attribs = new AttributeRange[0];
}
/*************************************************************************/
/**
* This method initializes a new instance of <code>AttributedString</code>
* that represents that specified <code>String</code> with the specified
* attributes over the entire length of the <code>String</code>.
*
* @param str The <code>String</code> to be attributed.
* @param attributes The attribute list.
*/
public
AttributedString(String str, Map attributes)
{
this(str);
attribs = new AttributeRange[1];
attribs[0] = new AttributeRange(attributes, 0, str.length());
}
/*************************************************************************/
/**
* This method initializes a new instance of <code>AttributedString</code>
* that will use the text and attribute information from the specified
* <code>AttributedCharacterIterator</code>.
*
* @param aci The <code>AttributedCharacterIterator</code> containing the text and attribute information.
*/
public
AttributedString(AttributedCharacterIterator aci)
{
this(aci, aci.getBeginIndex(), aci.getEndIndex(), null);
}
/*************************************************************************/
/**
* This method initializes a new instance of <code>AttributedString</code>
* that will use the text and attribute information from the specified
* subrange of the specified <code>AttributedCharacterIterator</code>.
*
* @param aci The <code>AttributedCharacterIterator</code> containing the text and attribute information.
* @param begin_index The beginning index of the text subrange.
* @param end_index The ending index of the text subrange.
*/
public
AttributedString(AttributedCharacterIterator aci, int begin_index,
int end_index)
{
this(aci, begin_index, end_index, null);
}
/*************************************************************************/
/**
* This method initializes a new instance of <code>AttributedString</code>
* that will use the text and attribute information from the specified
* subrange of the specified <code>AttributedCharacterIterator</code>.
* Only attributes from the source iterator that are present in the
* specified array of attributes will be included in the attribute list
* for this object.
*
* @param aci The <code>AttributedCharacterIterator</code> containing the text and attribute information.
* @param begin_index The beginning index of the text subrange.
* @param end_index The ending index of the text subrange.
* @param attributes A list of attributes to include from the iterator, or <code>null</code> to include all attributes.
*/
public
AttributedString(AttributedCharacterIterator aci, int begin_index,
int end_index, AttributedCharacterIterator.Attribute[] attributes)
{
// Validate some arguments
if ((begin_index < 0) || (end_index < begin_index))
throw new IllegalArgumentException("Bad index values");
StringBuffer sb = new StringBuffer("");
// Get the valid attribute list
Set all_attribs = aci.getAllAttributeKeys();
if (attributes != null)
all_attribs.retainAll(Arrays.asList(attributes));
// Loop through and extract the attributes
char c = aci.setIndex(begin_index);
ArrayList accum = new ArrayList();
do
{
sb.append(c);
Iterator iter = all_attribs.iterator();
while(iter.hasNext())
{
Object obj = iter.next();
// What should we do if this is not true?
if (!(obj instanceof AttributedCharacterIterator.Attribute))
continue;
AttributedCharacterIterator.Attribute attrib =
(AttributedCharacterIterator.Attribute)obj;
// Make sure the attribute is defined.
int rl = aci.getRunLimit(attrib);
if (rl == -1)
continue;
if (rl > end_index)
rl = end_index;
rl -= begin_index;
// Check to see if we already processed this one
int rs = aci.getRunStart(attrib);
if ((rs < aci.getIndex()) && (aci.getIndex() != begin_index))
continue;
// If the attribute run starts before the beginning index, we
// need to junk it if it is an Annotation.
Object attrib_obj = aci.getAttribute(attrib);
if (rs < begin_index)
{
if (attrib_obj instanceof Annotation)
continue;
rs = begin_index;
}
else
{
rs -= begin_index;
}
// Create a map object. Yes this will only contain one attribute
Map new_map = new Hashtable();
new_map.put(attrib, attrib_obj);
// Add it to the attribute list.
accum.add(new AttributeRange(new_map, rs, rl));
}
c = aci.next();
/**
* Creates a new attribute range.
*
* @param attribs the attributes.
* @param begin_index the start index.
* @param end_index the end index.
*/
AttributeRange(Map attribs, int begin_index, int end_index)
{
this.attribs = attribs;
this.begin_index = begin_index;
this.end_index = end_index;
}
while(c != CharacterIterator.DONE);
attribs = new AttributeRange[accum.size()];
attribs = (AttributeRange[]) accum.toArray(attribs);
} // Inner class AttributeRange
sci = new StringCharacterIterator(sb.toString());
}
/** The string we are representing. */
private StringCharacterIterator sci;
/*************************************************************************/
/** The attribute information */
private AttributeRange[] attribs;
/*
* Instance Methods
*/
/**
* Creates a new instance of <code>AttributedString</code>
* that represents the specified <code>String</code> with no attributes.
*
* @param str The <code>String</code> to be attributed (<code>null</code> not
* permitted).
*
* @throws NullPointerException if <code>str</code> is <code>null</code>.
*/
public AttributedString(String str)
{
sci = new StringCharacterIterator(str);
attribs = new AttributeRange[0];
}
/**
* This method adds a new attribute that will cover the entire string.
*
* @param attrib The attribute to add.
* @param value The value of the attribute.
*/
public void
addAttribute(AttributedCharacterIterator.Attribute attrib, Object value)
{
addAttribute(attrib, value, 0, sci.getEndIndex());
}
/**
* Creates a new instance of <code>AttributedString</code>
* that represents that specified <code>String</code> with the specified
* attributes over the entire length of the <code>String</code>.
*
* @param str The <code>String</code> to be attributed.
* @param attributes The attribute list.
*/
public AttributedString(String str, Map attributes)
{
this(str);
/*************************************************************************/
attribs = new AttributeRange[1];
attribs[0] = new AttributeRange(attributes, 0, str.length());
}
/**
* This method adds a new attribute that will cover the specified subrange
* of the string.
*
* @param attrib The attribute to add.
* @param value The value of the attribute, which may be null.
* @param begin_index The beginning index of the subrange.
* @param end_index The ending index of the subrange.
*
* @exception IllegalArgumentException If attribute is <code>null</code> or the subrange is not valid.
*/
public void
addAttribute(AttributedCharacterIterator.Attribute attrib, Object value,
int begin_index, int end_index)
{
if (attrib == null)
throw new IllegalArgumentException("null attribute");
/**
* Initializes a new instance of <code>AttributedString</code>
* that will use the text and attribute information from the specified
* <code>AttributedCharacterIterator</code>.
*
* @param aci The <code>AttributedCharacterIterator</code> containing the
* text and attribute information (<code>null</code> not
* permitted).
*
* @throws NullPointerException if <code>aci</code> is <code>null</code>.
*/
public AttributedString(AttributedCharacterIterator aci)
{
this(aci, aci.getBeginIndex(), aci.getEndIndex(), null);
}
HashMap hm = new HashMap();
hm.put(attrib, value);
/**
* Initializes a new instance of <code>AttributedString</code>
* that will use the text and attribute information from the specified
* subrange of the specified <code>AttributedCharacterIterator</code>.
*
* @param aci The <code>AttributedCharacterIterator</code> containing the
* text and attribute information.
* @param begin_index The beginning index of the text subrange.
* @param end_index The ending index of the text subrange.
*/
public AttributedString(AttributedCharacterIterator aci, int begin_index,
int end_index)
{
this(aci, begin_index, end_index, null);
}
addAttributes(hm, begin_index, end_index);
}
/**
* Initializes a new instance of <code>AttributedString</code>
* that will use the text and attribute information from the specified
* subrange of the specified <code>AttributedCharacterIterator</code>.
* Only attributes from the source iterator that are present in the
* specified array of attributes will be included in the attribute list
* for this object.
*
* @param aci The <code>AttributedCharacterIterator</code> containing the
* text and attribute information.
* @param begin_index The beginning index of the text subrange.
* @param end_index The ending index of the text subrange.
* @param attributes A list of attributes to include from the iterator, or
* <code>null</code> to include all attributes.
*/
public AttributedString(AttributedCharacterIterator aci, int begin_index,
int end_index, AttributedCharacterIterator.Attribute[] attributes)
{
// Validate some arguments
if ((begin_index < 0) || (end_index < begin_index))
throw new IllegalArgumentException("Bad index values");
/*************************************************************************/
StringBuffer sb = new StringBuffer("");
/**
* This method adds all of the attributes in the specified list to the
* specified subrange of the string.
*
* @param attributes The list of attributes.
* @param begin_index The beginning index.
* @param end_index The ending index
*
* @param IllegalArgumentException If the list is <code>null</code> or the subrange is not valid.
*/
public void
addAttributes(Map attributes, int begin_index, int end_index)
{
if (attributes == null)
throw new IllegalArgumentException("null attribute");
// Get the valid attribute list
Set all_attribs = aci.getAllAttributeKeys();
if (attributes != null)
all_attribs.retainAll(Arrays.asList(attributes));
if ((begin_index < 0) || (end_index > sci.getEndIndex()) ||
(end_index < begin_index))
throw new IllegalArgumentException("bad range");
// Loop through and extract the attributes
char c = aci.setIndex(begin_index);
AttributeRange[] new_list = new AttributeRange[attribs.length + 1];
System.arraycopy(attribs, 0, new_list, 0, attribs.length);
attribs = new_list;
attribs[attribs.length - 1] = new AttributeRange(attributes, begin_index,
end_index);
}
ArrayList accum = new ArrayList();
do
{
sb.append(c);
/*************************************************************************/
Iterator iter = all_attribs.iterator();
while(iter.hasNext())
{
Object obj = iter.next();
/**
* This method returns an <code>AttributedCharacterIterator</code> that
* will iterate over the entire string.
*
* @return An <code>AttributedCharacterIterator</code> for the entire string.
*/
public AttributedCharacterIterator
getIterator()
{
return(new AttributedStringIterator(sci, attribs, 0, sci.getEndIndex(), null));
}
// What should we do if this is not true?
if (!(obj instanceof AttributedCharacterIterator.Attribute))
continue;
/*************************************************************************/
AttributedCharacterIterator.Attribute attrib =
(AttributedCharacterIterator.Attribute)obj;
/**
* This method returns an <code>AttributedCharacterIterator</code> that
* will iterate over the entire string. This iterator will return information
* about the list of attributes in the specified array. Attributes not in
* the array may or may not be returned by the iterator. If the specified
* array is <code>null</code>, all attributes will be returned.
*
* @param attributes A list of attributes to include in the returned iterator.
*
* @return An <code>AttributedCharacterIterator</code> for this string.
*/
public AttributedCharacterIterator
getIterator(AttributedCharacterIterator.Attribute[] attributes)
{
return(getIterator(attributes, 0, sci.getEndIndex()));
}
// Make sure the attribute is defined.
int rl = aci.getRunLimit(attrib);
if (rl == -1)
continue;
if (rl > end_index)
rl = end_index;
rl -= begin_index;
/*************************************************************************/
// Check to see if we already processed this one
int rs = aci.getRunStart(attrib);
if ((rs < aci.getIndex()) && (aci.getIndex() != begin_index))
continue;
/**
* This method returns an <code>AttributedCharacterIterator</code> that
* will iterate over the specified subrange. This iterator will return information
* about the list of attributes in the specified array. Attributes not in
* the array may or may not be returned by the iterator. If the specified
* array is <code>null</code>, all attributes will be returned.
*
* @param attributes A list of attributes to include in the returned iterator.
* @param begin_index The beginning index of the subrange.
* @param end_index The ending index of the subrange.
*
* @return An <code>AttributedCharacterIterator</code> for this string.
*/
public AttributedCharacterIterator
getIterator(AttributedCharacterIterator.Attribute[] attributes,
int begin_index, int end_index)
{
if ((begin_index < 0) || (end_index > sci.getEndIndex()) ||
(end_index < begin_index))
throw new IllegalArgumentException("bad range");
// If the attribute run starts before the beginning index, we
// need to junk it if it is an Annotation.
Object attrib_obj = aci.getAttribute(attrib);
if (rs < begin_index)
{
if (attrib_obj instanceof Annotation)
continue;
return(new AttributedStringIterator(sci, attribs, begin_index, end_index,
attributes));
}
rs = begin_index;
}
else
{
rs -= begin_index;
}
// Create a map object. Yes this will only contain one attribute
Map new_map = new Hashtable();
new_map.put(attrib, attrib_obj);
// Add it to the attribute list.
accum.add(new AttributeRange(new_map, rs, rl));
}
c = aci.next();
}
while(c != CharacterIterator.DONE);
attribs = new AttributeRange[accum.size()];
attribs = (AttributeRange[]) accum.toArray(attribs);
sci = new StringCharacterIterator(sb.toString());
}
/**
* Adds a new attribute that will cover the entire string.
*
* @param attrib The attribute to add.
* @param value The value of the attribute.
*/
public void addAttribute(AttributedCharacterIterator.Attribute attrib,
Object value)
{
addAttribute(attrib, value, 0, sci.getEndIndex());
}
/**
* Adds a new attribute that will cover the specified subrange
* of the string.
*
* @param attrib The attribute to add.
* @param value The value of the attribute, which may be <code>null</code>.
* @param begin_index The beginning index of the subrange.
* @param end_index The ending index of the subrange.
*
* @exception IllegalArgumentException If attribute is <code>null</code> or
* the subrange is not valid.
*/
public void addAttribute(AttributedCharacterIterator.Attribute attrib,
Object value, int begin_index, int end_index)
{
if (attrib == null)
throw new IllegalArgumentException("null attribute");
HashMap hm = new HashMap();
hm.put(attrib, value);
addAttributes(hm, begin_index, end_index);
}
/**
* Adds all of the attributes in the specified list to the
* specified subrange of the string.
*
* @param attributes The list of attributes.
* @param begin_index The beginning index.
* @param end_index The ending index
*
* @throws IllegalArgumentException If the list is <code>null</code> or the
* subrange is not valid.
*/
public void addAttributes(Map attributes, int begin_index, int end_index)
{
if (attributes == null)
throw new IllegalArgumentException("null attribute");
if ((begin_index < 0) || (end_index > sci.getEndIndex()) ||
(end_index < begin_index))
throw new IllegalArgumentException("bad range");
AttributeRange[] new_list = new AttributeRange[attribs.length + 1];
System.arraycopy(attribs, 0, new_list, 0, attribs.length);
attribs = new_list;
attribs[attribs.length - 1] = new AttributeRange(attributes, begin_index,
end_index);
}
/**
* Returns an <code>AttributedCharacterIterator</code> that
* will iterate over the entire string.
*
* @return An <code>AttributedCharacterIterator</code> for the entire string.
*/
public AttributedCharacterIterator getIterator()
{
return(new AttributedStringIterator(sci, attribs, 0, sci.getEndIndex(),
null));
}
/**
* Returns an <code>AttributedCharacterIterator</code> that
* will iterate over the entire string. This iterator will return information
* about the list of attributes in the specified array. Attributes not in
* the array may or may not be returned by the iterator. If the specified
* array is <code>null</code>, all attributes will be returned.
*
* @param attributes A list of attributes to include in the returned iterator.
*
* @return An <code>AttributedCharacterIterator</code> for this string.
*/
public AttributedCharacterIterator getIterator(
AttributedCharacterIterator.Attribute[] attributes)
{
return(getIterator(attributes, 0, sci.getEndIndex()));
}
/**
* Returns an <code>AttributedCharacterIterator</code> that
* will iterate over the specified subrange. This iterator will return
* information about the list of attributes in the specified array.
* Attributes not in the array may or may not be returned by the iterator.
* If the specified array is <code>null</code>, all attributes will be
* returned.
*
* @param attributes A list of attributes to include in the returned iterator.
* @param begin_index The beginning index of the subrange.
* @param end_index The ending index of the subrange.
*
* @return An <code>AttributedCharacterIterator</code> for this string.
*/
public AttributedCharacterIterator getIterator(
AttributedCharacterIterator.Attribute[] attributes,
int begin_index, int end_index)
{
if ((begin_index < 0) || (end_index > sci.getEndIndex()) ||
(end_index < begin_index))
throw new IllegalArgumentException("bad range");
return(new AttributedStringIterator(sci, attribs, begin_index, end_index,
attributes));
}
} // class AttributedString

View file

@ -55,129 +55,102 @@ import java.util.Set;
class AttributedStringIterator implements AttributedCharacterIterator
{
/*************************************************************************/
/*************************************************************************/
/**
* Instance Variables
*/
/** The character iterator containing the text */
private CharacterIterator ci;
/**
* The character iterator containing the text
*/
private CharacterIterator ci;
/** The list of attributes and ranges */
private AttributedString.AttributeRange[] attribs;
/**
* The list of attributes and ranges
*/
private AttributedString.AttributeRange[] attribs;
/**
* The list of attributes that the user is interested in. We may,
* at our option, not return any other attributes.
*/
private AttributedCharacterIterator.Attribute[] restricts;
/**
* The list of attributes that the user is interested in. We may,
* at our option, not return any other attributes.
*/
private AttributedCharacterIterator.Attribute[] restricts;
/*************************************************************************/
/*************************************************************************/
AttributedStringIterator(StringCharacterIterator sci,
AttributedString.AttributeRange[] attribs,
int begin_index, int end_index,
AttributedCharacterIterator.Attribute[] restricts)
{
this.ci = new StringCharacterIterator(sci, begin_index, end_index);
this.attribs = attribs;
this.restricts = restricts;
}
/*
* Constructors
*/
/*************************************************************************/
AttributedStringIterator(StringCharacterIterator sci,
AttributedString.AttributeRange[] attribs,
int begin_index, int end_index,
AttributedCharacterIterator.Attribute[] restricts)
{
this.ci = new StringCharacterIterator(sci, begin_index, end_index);
this.attribs = attribs;
this.restricts = restricts;
}
// First we have a bunch of stupid redirects. If StringCharacterIterator
// weren't final, I just would have extended that for this class. Alas, no.
/*************************************************************************/
public Object clone()
{
return(ci.clone());
}
/*
* Instance Methods
*/
public char current()
{
return(ci.current());
}
// First we have a bunch of stupid redirects. If StringCharacterIterator
// weren't final, I just would have extended that for this class. Alas, no.
public char next()
{
return(ci.next());
}
public Object
clone()
{
return(ci.clone());
}
public char previous()
{
return(ci.previous());
}
public char
current()
{
return(ci.current());
}
public char first()
{
return(ci.first());
}
public char
next()
{
return(ci.next());
}
public char last()
{
return(ci.last());
}
public char
previous()
{
return(ci.previous());
}
public int getIndex()
{
return(ci.getIndex());
}
public char
first()
{
return(ci.first());
}
public char setIndex(int index)
{
return(ci.setIndex(index));
}
public char
last()
{
return(ci.last());
}
public int getBeginIndex()
{
return(ci.getBeginIndex());
}
public int
getIndex()
{
return(ci.getIndex());
}
public int getEndIndex()
{
return(ci.getEndIndex());
}
public char
setIndex(int index)
{
return(ci.setIndex(index));
}
/*
* Here is where the AttributedCharacterIterator methods start.
*/
public int
getBeginIndex()
{
return(ci.getBeginIndex());
}
/*************************************************************************/
public int
getEndIndex()
{
return(ci.getEndIndex());
}
/*
* Here is where the AttributedCharacterIterator methods start.
*/
/*************************************************************************/
/**
* Returns a list of all the attribute keys that are defined anywhere
* on this string.
*/
public Set
getAllAttributeKeys()
{
HashSet s = new HashSet();
if (attribs == null)
return(s);
/**
* Returns a list of all the attribute keys that are defined anywhere
* on this string.
*/
public Set getAllAttributeKeys()
{
HashSet s = new HashSet();
if (attribs == null)
return(s);
for (int i = 0; i < attribs.length; i++)
{
@ -193,156 +166,146 @@ getAllAttributeKeys()
}
}
return(s);
}
return(s);
}
/*************************************************************************/
/*************************************************************************/
/**
* Various methods that determine how far the run extends for various
* attribute combinations.
*/
/**
* Various methods that determine how far the run extends for various
* attribute combinations.
*/
public int
getRunLimit()
{
return(getRunLimit(getAttributes().keySet()));
}
public int getRunLimit()
{
return(getRunLimit(getAttributes().keySet()));
}
public int
getRunLimit(AttributedCharacterIterator.Attribute attrib)
{
HashSet s = new HashSet();
s.add(attrib);
public int getRunLimit(AttributedCharacterIterator.Attribute attrib)
{
HashSet s = new HashSet();
s.add(attrib);
return(getRunLimit(s));
}
return(getRunLimit(s));
}
public synchronized int getRunLimit(Set attribute_set)
{
boolean hit = false;
int runLimit = ci.getEndIndex ();
int pos = ci.getIndex ();
public synchronized int
getRunLimit(Set attribute_set)
{
boolean hit = false;
int runLimit = ci.getEndIndex ();
int pos = ci.getIndex ();
for (int i = 0; i < attribs.length; ++i)
{
if (pos >= attribs[i].begin_index &&
pos < attribs[i].end_index)
{
Iterator iter = attribute_set.iterator();
while(iter.hasNext())
if (attribs[i].attribs.containsKey(iter.next()))
{
hit = true;
runLimit = Math.min(runLimit, attribs[i].end_index);
}
}
}
if (hit)
return runLimit;
else
return ci.getEndIndex();
}
for (int i = 0; i < attribs.length; ++i)
{
if (pos >= attribs[i].begin_index &&
pos < attribs[i].end_index)
{
Iterator iter = attribute_set.iterator();
while(iter.hasNext())
if (attribs[i].attribs.containsKey(iter.next()))
{
hit = true;
runLimit = Math.min(runLimit, attribs[i].end_index);
}
}
}
if (hit)
return runLimit;
else
return ci.getEndIndex();
}
/*************************************************************************/
/*************************************************************************/
/**
* Various methods that determine where the run begins for various
* attribute combinations.
*/
/**
* Various methods that determine where the run begins for various
* attribute combinations.
*/
public int getRunStart()
{
return(getRunStart(getAttributes().keySet()));
}
public int
getRunStart()
{
return(getRunStart(getAttributes().keySet()));
}
public int getRunStart(AttributedCharacterIterator.Attribute attrib)
{
HashSet s = new HashSet();
s.add(attrib);
public int
getRunStart(AttributedCharacterIterator.Attribute attrib)
{
HashSet s = new HashSet();
s.add(attrib);
return(getRunStart(s));
}
return(getRunStart(s));
}
public int getRunStart(Set attribute_set)
{
boolean hit = false;
int runBegin = 0;
int pos = ci.getIndex();
public int
getRunStart(Set attribute_set)
{
boolean hit = false;
int runBegin = 0;
int pos = ci.getIndex ();
for (int i = 0; i < attribs.length; ++i)
{
if (pos >= attribs[i].begin_index &&
pos <= attribs[i].end_index)
{
Iterator iter = attribute_set.iterator();
while(iter.hasNext())
if (attribs[i].attribs.containsKey(iter.next()))
{
hit = true;
runBegin = Math.max(runBegin, attribs[i].begin_index);
}
}
}
if (hit)
return runBegin;
else
return -1;
}
for (int i = 0; i < attribs.length; ++i)
{
if (pos >= attribs[i].begin_index &&
pos <= attribs[i].end_index)
{
Iterator iter = attribute_set.iterator();
while(iter.hasNext())
if (attribs[i].attribs.containsKey(iter.next()))
{
hit = true;
runBegin = Math.max(runBegin, attribs[i].begin_index);
}
}
}
if (hit)
return runBegin;
else
return -1;
}
/*************************************************************************/
/*************************************************************************/
public Object getAttribute(AttributedCharacterIterator.Attribute attrib)
{
if (attribs == null)
return(null);
for (int i = 0; i < attribs.length; i++)
{
Set key_set = attribs[i].attribs.keySet();
Iterator iter = key_set.iterator();
while (iter.hasNext())
{
Object obj = iter.next();
// Check for attribute match and range match
if (obj.equals(attrib))
if ((ci.getIndex() >= attribs[i].begin_index) &&
(ci.getIndex() < attribs[i].end_index))
return(attribs[i].attribs.get(obj));
}
}
public Object
getAttribute(AttributedCharacterIterator.Attribute attrib)
{
if (attribs == null)
return(null);
}
for (int i = 0; i < attribs.length; i++)
{
Set key_set = attribs[i].attribs.keySet();
Iterator iter = key_set.iterator();
while (iter.hasNext())
{
Object obj = iter.next();
/*************************************************************************/
// Check for attribute match and range match
if (obj.equals(attrib))
if ((ci.getIndex() >= attribs[i].begin_index) &&
(ci.getIndex() < attribs[i].end_index))
return(attribs[i].attribs.get(obj));
}
}
return(null);
}
/*************************************************************************/
/**
* Return a list of all the attributes and values defined for this
* character
*/
public Map
getAttributes()
{
HashMap m = new HashMap();
if (attribs == null)
return(m);
/**
* Return a list of all the attributes and values defined for this
* character
*/
public Map getAttributes()
{
HashMap m = new HashMap();
if (attribs == null)
return(m);
for (int i = 0; i < attribs.length; i++)
{
if ((ci.getIndex() >= attribs[i].begin_index) &&
(ci.getIndex() < attribs[i].end_index))
m.putAll(attribs[i].attribs);
}
for (int i = 0; i < attribs.length; i++)
{
if ((ci.getIndex() >= attribs[i].begin_index) &&
(ci.getIndex() < attribs[i].end_index))
m.putAll(attribs[i].attribs);
}
return(m);
}
return(m);
}
} // class AttributedStringIterator

View file

@ -114,9 +114,9 @@ public abstract class BreakIterator implements Cloneable
* This methdod returns the offset of the text element boundary following
* the specified offset.
*
* @param offset The text index from which to find the next text boundary.
* @param pos The text index from which to find the next text boundary.
*
* @param The next text boundary following the specified index.
* @return The next text boundary following the specified index.
*/
public abstract int following (int pos);
@ -186,9 +186,9 @@ public abstract class BreakIterator implements Cloneable
*
* @return A <code>BreakIterator</code> instance for the default locale.
*/
public static BreakIterator getCharacterInstance (Locale loc)
public static BreakIterator getCharacterInstance (Locale locale)
{
BreakIterator r = getInstance ("CharacterIterator", loc);
BreakIterator r = getInstance ("CharacterIterator", locale);
if (r == null)
r = new gnu.java.text.CharacterBreakIterator ();
return r;
@ -214,9 +214,9 @@ public abstract class BreakIterator implements Cloneable
*
* @return A <code>BreakIterator</code> instance for the default locale.
*/
public static BreakIterator getLineInstance (Locale loc)
public static BreakIterator getLineInstance (Locale locale)
{
BreakIterator r = getInstance ("LineIterator", loc);
BreakIterator r = getInstance ("LineIterator", locale);
if (r == null)
r = new gnu.java.text.LineBreakIterator ();
return r;
@ -242,9 +242,9 @@ public abstract class BreakIterator implements Cloneable
*
* @return A <code>BreakIterator</code> instance for the default locale.
*/
public static BreakIterator getSentenceInstance (Locale loc)
public static BreakIterator getSentenceInstance (Locale locale)
{
BreakIterator r = getInstance ("SentenceIterator", loc);
BreakIterator r = getInstance ("SentenceIterator", locale);
if (r == null)
r = new gnu.java.text.SentenceBreakIterator ();
return r;
@ -254,7 +254,7 @@ public abstract class BreakIterator implements Cloneable
* This method returns the text this object is iterating over as a
* <code>CharacterIterator</code>.
*
* @param The text being iterated over.
* @return The text being iterated over.
*/
public abstract CharacterIterator getText ();
@ -278,9 +278,9 @@ public abstract class BreakIterator implements Cloneable
*
* @return A <code>BreakIterator</code> instance for the default locale.
*/
public static BreakIterator getWordInstance (Locale loc)
public static BreakIterator getWordInstance (Locale locale)
{
BreakIterator r = getInstance ("WordIterator", loc);
BreakIterator r = getInstance ("WordIterator", locale);
if (r == null)
r = new gnu.java.text.WordBreakIterator ();
return r;
@ -290,7 +290,7 @@ public abstract class BreakIterator implements Cloneable
* This method tests whether or not the specified position is a text
* element boundary.
*
* @param offset The text position to test.
* @param pos The text position to test.
*
* @return <code>true</code> if the position is a boundary,
* <code>false</code> otherwise.
@ -332,8 +332,7 @@ public abstract class BreakIterator implements Cloneable
* This methdod returns the offset of the text element boundary preceding
* the specified offset.
*
* @param offset The text index from which to find the preceding
* text boundary.
* @param pos The text index from which to find the preceding text boundary.
*
* @returns The next text boundary preceding the specified index.
*/
@ -357,7 +356,7 @@ public abstract class BreakIterator implements Cloneable
/**
* This method sets the text string to iterate over.
*
* @param str The <code>String</code> to iterate over.
* @param newText The <code>String</code> to iterate over.
*/
public void setText (String newText)
{
@ -368,7 +367,7 @@ public abstract class BreakIterator implements Cloneable
* This method sets the text to iterate over from the specified
* <code>CharacterIterator</code>.
*
* @param ci The desired <code>CharacterIterator</code>.
* @param newText The desired <code>CharacterIterator</code>.
*/
public abstract void setText (CharacterIterator newText);
}

View file

@ -1,5 +1,5 @@
/* CharacterIterator.java -- Iterate over a character range
Copyright (C) 1998, 2001 Free Software Foundation, Inc.
Copyright (C) 1998, 2001, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -64,8 +64,8 @@ public interface CharacterIterator extends Cloneable
/**
* This method increments the current index and then returns the character
* at the new index value. If the index is already at <code>getEndIndex() - 1</code>,
* it will not be incremented.
* at the new index value. If the index is already at
* <code>getEndIndex() - 1</code>, it will not be incremented.
*
* @return The character at the position of the incremented index value,
* or <code>DONE</code> if the index has reached getEndIndex() - 1
@ -78,7 +78,8 @@ public interface CharacterIterator extends Cloneable
* index, it will not be decremented.
*
* @return The character at the position of the decremented index value,
* or <code>DONE</code> if index was already equal to the beginning index value.
* or {@link #DONE} if index was already equal to the beginning index
* value.
*/
char previous();
@ -86,7 +87,8 @@ public interface CharacterIterator extends Cloneable
* This method sets the index value to the beginning of the range and returns
* the character there.
*
* @return The character at the beginning of the range, or <code>DONE</code> if the range is empty.
* @return The character at the beginning of the range, or {@link #DONE} if
* the range is empty.
*/
char first();
@ -95,7 +97,8 @@ public interface CharacterIterator extends Cloneable
* returns the character there. If the range is empty, then the index value
* will be set equal to the beginning index.
*
* @return The character at the end of the range, or <code>DONE</code> if the range is empty.
* @return The character at the end of the range, or {@link #DONE} if the
* range is empty.
*/
char last();
@ -112,7 +115,8 @@ public interface CharacterIterator extends Cloneable
*
* @param index The new index value.
*
* @return The character at the new index value or <code>DONE</code> if the index value is equal to <code>getEndIndex</code>.
* @return The character at the new index value or {@link #DONE} if the index
* value is equal to {@link #getEndIndex()}.
*/
char setIndex (int index) throws IllegalArgumentException;

View file

@ -86,7 +86,7 @@ public class ChoiceFormat extends NumberFormat
* object based on the specified pattern. This pattern is of the form
* "term#string|term#string...". For example "1#Sunday|2#Monday|#Tuesday".
*
* @param pattern The pattern of terminators and format strings.
* @param newPattern The pattern of terminators and format strings.
*
* @exception IllegalArgumentException If the pattern is not valid
*/
@ -170,7 +170,7 @@ public class ChoiceFormat extends NumberFormat
* This is the same pattern type used by the <code>applyPattern</code>
* method.
*
* @param pattern The pattern of terminators and format strings.
* @param newPattern The pattern of terminators and format strings.
*
* @exception IllegalArgumentException If the pattern is not valid
*/
@ -229,10 +229,11 @@ public class ChoiceFormat extends NumberFormat
* <code>StringBuffer</code> based on the supplied <code>long</code>
* argument.
*
* @param number The number used for determine (based on the range
* @param num The number used for determine (based on the range
* terminators) which format string to append.
* @param sb The <code>StringBuffer</code> to append the format string to.
* @param status Unused.
* @param appendBuf The <code>StringBuffer</code> to append the format string
* to.
* @param pos Unused.
*
* @return The <code>StringBuffer</code> with the format string appended.
*/
@ -247,10 +248,10 @@ public class ChoiceFormat extends NumberFormat
* <code>StringBuffer</code> based on the supplied <code>double</code>
* argument.
*
* @param number The number used for determine (based on the range
* @param num The number used for determine (based on the range
* terminators) which format string to append.
* @param sb The <code>StringBuffer</code> to append the format string to.
* @param status Unused.
* @param appendBuf The <code>StringBuffer</code> to append the format string to.
* @param pos Unused.
*
* @return The <code>StringBuffer</code> with the format string appended.
*/
@ -333,7 +334,7 @@ public class ChoiceFormat extends NumberFormat
* double less than the specified double will be returned.
*
* @param d The specified double
* @param positive <code>true</code> to return the next highest
* @param next <code>true</code> to return the next highest
* double, <code>false</code> otherwise.
*
* @return The next highest or lowest double value.

View file

@ -177,9 +177,11 @@ public final class CollationElementIterator
* This method returns the primary order value for the given collation
* value.
*
* @param value The collation value returned from <code>next()</code> or <code>previous()</code>.
* @param order The collation value returned from <code>next()</code> or
* <code>previous()</code>.
*
* @return The primary order value of the specified collation value. This is the high 16 bits.
* @return The primary order value of the specified collation value. This is
* the high 16 bits.
*/
public static int primaryOrder(int order)
{
@ -201,9 +203,11 @@ public final class CollationElementIterator
* This method returns the secondary order value for the given collation
* value.
*
* @param value The collation value returned from <code>next()</code> or <code>previous()</code>.
* @param order The collation value returned from <code>next()</code> or
* <code>previous()</code>.
*
* @return The secondary order value of the specified collation value. This is the bits 8-15.
* @return The secondary order value of the specified collation value. This
* is the bits 8-15.
*/
public static short secondaryOrder(int order)
{
@ -215,9 +219,11 @@ public final class CollationElementIterator
* This method returns the tertiary order value for the given collation
* value.
*
* @param value The collation value returned from <code>next()</code> or <code>previous()</code>.
* @param order The collation value returned from <code>next()</code> or
* <code>previous()</code>.
*
* @return The tertiary order value of the specified collation value. This is the low eight bits.
* @return The tertiary order value of the specified collation value. This
* is the low eight bits.
*/
public static short tertiaryOrder(int order)
{
@ -458,7 +464,7 @@ public final class CollationElementIterator
*
* @param value The collation order value
*
* @param The maximum length of an expansion sequence.
* @return The maximum length of an expansion sequence.
*/
public int getMaxExpansion(int value)
{

View file

@ -38,6 +38,8 @@ exception statement from your version. */
package java.text;
import java.util.Arrays;
/* Written using "Java Class Libraries", 2nd edition, plus online
* API docs for JDK 1.2 from http://www.javasoft.com.
* Status: Believed complete and correct.
@ -154,7 +156,7 @@ public final class CollationKey implements Comparable
if (!ck.getSourceString ().equals (getSourceString ()))
return false;
if (!ck.toByteArray ().equals (toByteArray ()))
if (! Arrays.equals (ck.toByteArray (), toByteArray ()))
return false;
return true;
@ -190,7 +192,7 @@ public final class CollationKey implements Comparable
/**
* This method returns the collation bit sequence as a byte array.
*
* @param A byte array containing the collation bit sequence.
* @return A byte array containing the collation bit sequence.
*/
public byte[] toByteArray()
{

View file

@ -150,8 +150,8 @@ public abstract class Collator implements Comparator, Cloneable
* <code>Collator</code> and the strength and decomposition rules in
* effect.
*
* @param str1 The first object to compare
* @param str2 The second object to compare
* @param source The first object to compare
* @param target The second object to compare
*
* @return A negative integer if str1 &lt; str2, 0 if str1 == str2, or
* a positive integer if str1 &gt; str2.
@ -164,8 +164,8 @@ public abstract class Collator implements Comparator, Cloneable
* equal to, or greater than the second argument. These two objects
* must be <code>String</code>'s or an exception will be thrown.
*
* @param obj1 The first object to compare
* @param obj2 The second object to compare
* @param o1 The first object to compare
* @param o2 The second object to compare
*
* @return A negative integer if obj1 &lt; obj2, 0 if obj1 == obj2, or
* a positive integer if obj1 &gt; obj2.
@ -208,8 +208,8 @@ public abstract class Collator implements Comparator, Cloneable
* according to the collation rules for the locale of this object and
* the current strength and decomposition settings.
*
* @param str1 The first <code>String</code> to compare
* @param str2 The second <code>String</code> to compare
* @param source The first <code>String</code> to compare
* @param target The second <code>String</code> to compare
*
* @return <code>true</code> if the two strings are equal,
* <code>false</code> otherwise.
@ -256,7 +256,7 @@ public abstract class Collator implements Comparator, Cloneable
* comparisons against a string might be performed multiple times, such
* as during a sort operation.
*
* @param str The <code>String</code> to convert.
* @param source The <code>String</code> to convert.
*
* @return A <code>CollationKey</code> for the specified <code>String</code>.
*/
@ -292,7 +292,7 @@ public abstract class Collator implements Comparator, Cloneable
* specified locale. If no <code>Collator</code> exists for the desired
* locale, a <code>Collator</code> for the default locale will be returned.
*
* @param locale The desired localed to load a <code>Collator</code> for.
* @param loc The desired localed to load a <code>Collator</code> for.
*
* @return A <code>Collator</code> for the requested locale
*/
@ -347,7 +347,7 @@ public abstract class Collator implements Comparator, Cloneable
* exception will be thrown. See the documentation for those
* contants for an explanation of this setting.
*
* @param decmp The new decomposition setting.
* @param mode The new decomposition setting.
*
* @exception IllegalArgumentException If the requested
* decomposition setting is not valid.

View file

@ -405,8 +405,18 @@ public abstract class DateFormat extends Format implements Cloneable
* <ul>
* <li>Is not <code>null</code>.</li>
* <li>Is an instance of <code>DateFormat</code>.</li>
* <li>Has the same numberFormat field value as this object.</li>
* <li>Has equal numberFormat field as this object.</li>
* <li>Has equal (Calendar) TimeZone rules as this object.</li>
* <li>Has equal (Calendar) isLenient results.</li>
* <li>Has equal Calendar first day of week and minimal days in week
* values.</li>
* </ul>
* Note that not all properties of the Calendar are relevant for a
* DateFormat. For formatting only the fact whether or not the
* TimeZone has the same rules and whether the calendar is lenient
* and has the same week rules is compared for this implementation
* of equals. Other properties of the Calendar (such as the time)
* are not taken into account.
*
* @param obj The object to test for equality against.
*
@ -419,8 +429,24 @@ public abstract class DateFormat extends Format implements Cloneable
return false;
DateFormat d = (DateFormat) obj;
TimeZone tz = getTimeZone();
TimeZone tzd = d.getTimeZone();
if (tz.hasSameRules(tzd))
if (isLenient() == d.isLenient())
{
Calendar c = getCalendar();
Calendar cd = d.getCalendar();
if ((c == null && cd == null)
||
(c.getFirstDayOfWeek() == cd.getFirstDayOfWeek()
&&
c.getMinimalDaysInFirstWeek()
== cd.getMinimalDaysInFirstWeek()))
return ((numberFormat == null && d.numberFormat == null)
|| numberFormat.equals(d.numberFormat));
}
return numberFormat.equals(d.numberFormat);
return false;
}
/**
@ -442,9 +468,9 @@ public abstract class DateFormat extends Format implements Cloneable
* thrown.
*
* @param obj The <code>Object</code> to format.
* @param toAppendTo The <code>StringBuffer</code> to append the resultant
* @param buf The <code>StringBuffer</code> to append the resultant
* <code>String</code> to.
* @param fieldPosition Is updated to the start and end index of the
* @param pos Is updated to the start and end index of the
* specified field.
*
* @return The <code>StringBuffer</code> supplied on input, with the
@ -479,9 +505,9 @@ public abstract class DateFormat extends Format implements Cloneable
* to the specified <code>StringBuffer</code>.
*
* @param date The <code>Date</code> value to format.
* @param toAppendTo The <code>StringBuffer</code> to append the resultant
* @param buf The <code>StringBuffer</code> to append the resultant
* <code>String</code> to.
* @param fieldPosition Is updated to the start and end index of the
* @param pos Is updated to the start and end index of the
* specified field.
*
* @return The <code>StringBuffer</code> supplied on input, with the
@ -643,7 +669,7 @@ public abstract class DateFormat extends Format implements Cloneable
* localed will be used in place of the default.
*
* @param style The type of formatting to perform.
* @param aLocale The desired locale.
* @param loc The desired locale.
*
* @return A new <code>DateFormat</code> instance.
*/
@ -744,7 +770,7 @@ public abstract class DateFormat extends Format implements Cloneable
* localed will be used in place of the default.
*
* @param style The type of formatting to perform.
* @param aLocale The desired locale.
* @param loc The desired locale.
*
* @return A new <code>DateFormat</code> instance.
*/
@ -818,7 +844,7 @@ public abstract class DateFormat extends Format implements Cloneable
* starting parse position on method entry and the ending parse
* position on method exit.
*
* @param text The string to parse.
* @param source The string to parse.
* @param pos The starting parse position in entry, the ending parse
* position on exit.
*
@ -848,7 +874,7 @@ public abstract class DateFormat extends Format implements Cloneable
* This method specified the <code>Calendar</code> that should be used
* by this object to parse/format datetimes.
*
* @param The new <code>Calendar</code> for this object.
* @param calendar The new <code>Calendar</code> for this object.
*
* @see java.util.Calendar
*/
@ -873,7 +899,7 @@ public abstract class DateFormat extends Format implements Cloneable
* This method specifies the <code>NumberFormat</code> object that should
* be used by this object to parse/format times.
*
* @param The <code>NumberFormat</code> in use by this object.
* @param numberFormat The <code>NumberFormat</code> in use by this object.
*/
public void setNumberFormat (NumberFormat numberFormat)
{
@ -883,7 +909,7 @@ public abstract class DateFormat extends Format implements Cloneable
/**
* This method sets the time zone that should be used by this object.
*
* @param The new time zone.
* @param timeZone The new time zone.
*/
public void setTimeZone (TimeZone timeZone)
{

View file

@ -41,7 +41,6 @@ package java.text;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.StringTokenizer;
/**
* This class acts as container for locale specific date/time formatting
@ -289,7 +288,7 @@ public class DateFormatSymbols implements java.io.Serializable, Cloneable
* This is a two element <code>String</code> array indexed by
* <code>Calendar.AM</code> and <code>Calendar.PM</code>
*
* @param ampms The new list of AM/PM display strings.
* @param value The new list of AM/PM display strings.
*/
public void setAmPmStrings (String[] value)
{
@ -302,11 +301,11 @@ public class DateFormatSymbols implements java.io.Serializable, Cloneable
* This is a two element <code>String</code>
* array indexed by <code>Calendar.BC</code> and <code>Calendar.AD</code>.
*
* @param eras The new list of era disply strings.
* @param labels The new list of era display strings.
*/
public void setEras (String[] value)
public void setEras (String[] labels)
{
eras = value;
eras = labels;
}
/**
@ -340,11 +339,11 @@ public class DateFormatSymbols implements java.io.Serializable, Cloneable
* <li>17 - time zone (z)</li>
* </ul>
*
* @param localPatternChars The new format patter characters
* @param chars The new format pattern characters
*/
public void setLocalPatternChars (String value)
public void setLocalPatternChars (String chars)
{
localPatternChars = value;
localPatternChars = chars;
}
/**
@ -354,11 +353,11 @@ public class DateFormatSymbols implements java.io.Serializable, Cloneable
* <code>Calendar.UNDECEMBER</code>. Note that there are thirteen
* elements because some calendars have thriteen months.
*
* @param months The list of month display strings.
* @param labels The list of month display strings.
*/
public void setMonths (String[] value)
public void setMonths (String[] labels)
{
months = value;
months = labels;
}
/**
@ -369,11 +368,11 @@ public class DateFormatSymbols implements java.io.Serializable, Cloneable
* through <code>Calendar.UNDECEMBER</code>. Note that there are thirteen
* elements because some calendars have thirteen months.
*
* @param shortMonths The new list of abbreviated month display strings.
* @param labels The new list of abbreviated month display strings.
*/
public void setShortMonths (String[] value)
public void setShortMonths (String[] labels)
{
shortMonths = value;
shortMonths = labels;
}
/**
@ -384,11 +383,11 @@ public class DateFormatSymbols implements java.io.Serializable, Cloneable
* through <code>Calendar.SATURDAY</code>. Note that the first element
* of this array is ignored.
*
* @param shortWeekdays This list of abbreviated weekday display strings.
* @param labels This list of abbreviated weekday display strings.
*/
public void setShortWeekdays (String[] value)
public void setShortWeekdays (String[] labels)
{
shortWeekdays = value;
shortWeekdays = labels;
}
/**
@ -398,11 +397,11 @@ public class DateFormatSymbols implements java.io.Serializable, Cloneable
* through <code>Calendar.SATURDAY</code>. Note that the first element
* of this array is ignored.
*
* @param weekdays This list of weekday display strings.
* @param labels This list of weekday display strings.
*/
public void setWeekdays (String[] value)
public void setWeekdays (String[] labels)
{
weekdays = value;
weekdays = labels;
}
/**
@ -418,11 +417,11 @@ public class DateFormatSymbols implements java.io.Serializable, Cloneable
* <li>4 - the short name of the time zone (daylight savings time).</li>
* </ul>
*
* @return The list of time zone display strings.
* @params zones The list of time zone display strings.
*/
public void setZoneStrings (String[][] value)
public void setZoneStrings (String[][] zones)
{
zoneStrings = value;
zoneStrings = zones;
}
/* Does a "deep" equality test - recurses into arrays. */
@ -492,7 +491,7 @@ public class DateFormatSymbols implements java.io.Serializable, Cloneable
/**
* Returns a new copy of this object.
*
* @param A copy of this object
* @return A copy of this object
*/
public Object clone ()
{

View file

@ -139,7 +139,7 @@ public final class DecimalFormatSymbols implements Cloneable, Serializable
* locales (those with no specified country), such as
* <code>Locale.ENGLISH</code>.
*
* @param locale The local to load symbols for.
* @param loc The local to load symbols for.
* @throws NullPointerException if the locale is null.
*/
public DecimalFormatSymbols (Locale loc)
@ -422,7 +422,7 @@ public final class DecimalFormatSymbols implements Cloneable, Serializable
/**
* This method sets the currency symbol to the specified value.
*
* @param currencySymbol The new currency symbol
* @param currency The new currency symbol
*/
public void setCurrencySymbol (String currency)
{
@ -432,7 +432,7 @@ public final class DecimalFormatSymbols implements Cloneable, Serializable
/**
* This method sets the decimal point character to the specified value.
*
* @param decimalSeparator The new decimal point character
* @param decimalSep The new decimal point character
*/
public void setDecimalSeparator (char decimalSep)
{
@ -464,7 +464,7 @@ public final class DecimalFormatSymbols implements Cloneable, Serializable
/**
* This method sets the character used to separate groups of digits.
*
* @param groupingSeparator The character used to separate groups of digits.
* @param groupSep The character used to separate groups of digits.
*/
public void setGroupingSeparator (char groupSep)
{
@ -523,8 +523,7 @@ public final class DecimalFormatSymbols implements Cloneable, Serializable
* This method sets the character used for the decimal point in currency
* values.
*
* @param monetarySeparator The decimal point character used in
* currency values.
* @param decimalSep The decimal point character used in currency values.
*/
public void setMonetaryDecimalSeparator (char decimalSep)
{
@ -535,7 +534,7 @@ public final class DecimalFormatSymbols implements Cloneable, Serializable
* This method sets the string used to represent the NaN (not a
* number) value.
*
* @param NaN The string used to represent NaN
* @param nan The string used to represent NaN
*/
public void setNaN (String nan)
{
@ -546,7 +545,7 @@ public final class DecimalFormatSymbols implements Cloneable, Serializable
* This method sets the character used to separate positive and negative
* subpatterns in a format pattern.
*
* @param patternSeparator The character used to separate positive and
* @param patternSep The character used to separate positive and
* negative subpatterns in a format pattern.
*/
public void setPatternSeparator (char patternSep)

View file

@ -334,7 +334,7 @@ public class MessageFormat extends Format
/**
* Applies the specified pattern to this MessageFormat.
*
* @param aPattern The Pattern
* @param newPattern The Pattern
*/
public void applyPattern (String newPattern)
{
@ -378,7 +378,6 @@ public class MessageFormat extends Format
/**
* A convinience method to format patterns.
*
* @param aPattern The pattern used when formatting.
* @param arguments The array containing the objects to be formatted.
*/
public AttributedCharacterIterator formatToCharacterIterator (Object arguments)
@ -394,7 +393,7 @@ public class MessageFormat extends Format
/**
* A convinience method to format patterns.
*
* @param aPattern The pattern used when formatting.
* @param pattern The pattern used when formatting.
* @param arguments The array containing the objects to be formatted.
*/
public static String format (String pattern, Object arguments[])
@ -408,8 +407,8 @@ public class MessageFormat extends Format
/**
* Returns the pattern with the formatted objects.
*
* @param source The array containing the objects to be formatted.
* @param result The StringBuffer where the text is appened.
* @param arguments The array containing the objects to be formatted.
* @param appendBuf The StringBuffer where the text is appened.
* @param fp A FieldPosition object (it is ignored).
*/
public final StringBuffer format (Object arguments[], StringBuffer appendBuf,
@ -709,8 +708,8 @@ public class MessageFormat extends Format
* Sets the format for the argument at an specified
* index.
*
* @param index The index.
* @format The Format object.
* @param variableNum The index.
* @param newFormat The Format object.
*/
public void setFormat (int variableNum, Format newFormat)
{
@ -720,7 +719,7 @@ public class MessageFormat extends Format
/**
* Sets the formats for the arguments.
*
* @param formats An array of Format objects.
* @param newFormats An array of Format objects.
*/
public void setFormats (Format[] newFormats)
{
@ -735,7 +734,7 @@ public class MessageFormat extends Format
/**
* Sets the locale.
*
* @param locale A Locale
* @param loc A Locale
*/
public void setLocale (Locale loc)
{

View file

@ -237,7 +237,8 @@ public abstract class NumberFormat extends Format implements Cloneable
* a <code>StringBuffer</code>.
*
* @param number The <code>double</code> to format.
* @param sb The <code>StringBuffer</code> to append the formatted number to.
* @param sbuf The <code>StringBuffer</code> to append the formatted number
* to.
* @param pos The desired <code>FieldPosition</code>.
*
* @return The <code>StringBuffer</code> with the appended number.
@ -250,7 +251,8 @@ public abstract class NumberFormat extends Format implements Cloneable
* a <code>StringBuffer</code>.
*
* @param number The <code>long</code> to format.
* @param sb The <code>StringBuffer</code> to append the formatted number to.
* @param sbuf The <code>StringBuffer</code> to append the formatted number
* to.
* @param pos The desired <code>FieldPosition</code>.
*
* @return The <code>StringBuffer</code> with the appended number.
@ -371,7 +373,7 @@ public abstract class NumberFormat extends Format implements Cloneable
* will be a concrete subclass of <code>NumberFormat</code>, but the
* actual class returned is dependent on the locale.
*
* @param locale The desired locale.
* @param loc The desired locale.
*
* @return An instance of the default <code>NumberFormat</code> class.
*/
@ -434,8 +436,6 @@ public abstract class NumberFormat extends Format implements Cloneable
* will be a concrete subclass of <code>NumberFormat</code>, but the
* actual class returned is dependent on the locale.
*
* @param locale The desired locale.
*
* @return An instance of the default <code>NumberFormat</code> class.
*/
public static final NumberFormat getNumberInstance ()
@ -502,7 +502,7 @@ public abstract class NumberFormat extends Format implements Cloneable
* This method returns an instance of <code>NumberFormat</code> suitable
* for formatting and parsing percentage values in the specified locale.
*
* @param locale The desired locale.
* @param loc The desired locale.
*
* @return An instance of <code>NumberFormat</code> for handling percentages.
*/
@ -571,8 +571,8 @@ public abstract class NumberFormat extends Format implements Cloneable
* <code>Double</code>. If no number can be parsed, no exception is
* thrown. Instead, the parse position remains at its initial index.
*
* @param str The string to parse.
* @param pp The desired <code>ParsePosition</code>.
* @param sourceStr The string to parse.
* @param pos The desired <code>ParsePosition</code>.
*
* @return The parsed <code>Number</code>
*/
@ -584,7 +584,7 @@ public abstract class NumberFormat extends Format implements Cloneable
* <code>Double</code>. If no number can be parsed, an exception will be
* thrown.
*
* @param str The string to parse.
* @param sourceStr The string to parse.
*
* @return The parsed <code>Number</code>
*
@ -610,8 +610,8 @@ public abstract class NumberFormat extends Format implements Cloneable
* <code>Double</code>. If no number can be parsed, no exception is
* thrown. Instead, the parse position remains at its initial index.
*
* @param str The string to parse.
* @param pp The desired <code>ParsePosition</code>.
* @param sourceStr The string to parse.
* @param pos The desired <code>ParsePosition</code>.
*
* @return The parsed <code>Object</code>
*/
@ -629,7 +629,7 @@ public abstract class NumberFormat extends Format implements Cloneable
* might appear as "1,000,000". (Both of these assume the US English
* locale).
*
* @param groupingUsed <code>true</code> to enable grouping,
* @param newValue <code>true</code> to enable grouping,
* <code>false</code> to disable it.
*/
public void setGroupingUsed (boolean newValue)
@ -643,11 +643,11 @@ public abstract class NumberFormat extends Format implements Cloneable
* current minimum allowed digits, the minimum allowed digits value will
* be lowered to be equal to the new maximum allowed digits value.
*
* @param maximumFractionDigits The new maximum fraction digits value.
* @param digits The new maximum fraction digits value.
*/
public void setMaximumFractionDigits (int newValue)
public void setMaximumFractionDigits (int digits)
{
maximumFractionDigits = newValue;
maximumFractionDigits = digits;
if (getMinimumFractionDigits () > maximumFractionDigits)
setMinimumFractionDigits (maximumFractionDigits);
}
@ -658,11 +658,11 @@ public abstract class NumberFormat extends Format implements Cloneable
* current minimum allowed digits, the minimum allowed digits value will
* be lowered to be equal to the new maximum allowed digits value.
*
* @param maximumIntegerDigits The new maximum integer digits value.
* @param digits The new maximum integer digits value.
*/
public void setMaximumIntegerDigits (int newValue)
public void setMaximumIntegerDigits (int digits)
{
maximumIntegerDigits = newValue;
maximumIntegerDigits = digits;
if (getMinimumIntegerDigits () > maximumIntegerDigits)
setMinimumIntegerDigits (maximumIntegerDigits);
}
@ -673,11 +673,11 @@ public abstract class NumberFormat extends Format implements Cloneable
* current maximum allowed digits, the maximum allowed digits value will
* be raised to be equal to the new minimum allowed digits value.
*
* @param minimumFractionDigits The new minimum fraction digits value.
* @param digits The new minimum fraction digits value.
*/
public void setMinimumFractionDigits (int newValue)
public void setMinimumFractionDigits (int digits)
{
minimumFractionDigits = newValue;
minimumFractionDigits = digits;
if (getMaximumFractionDigits () < minimumFractionDigits)
setMaximumFractionDigits (minimumFractionDigits);
}
@ -688,11 +688,11 @@ public abstract class NumberFormat extends Format implements Cloneable
* current maximum allowed digits, the maximum allowed digits value will
* be raised to be equal to the new minimum allowed digits value.
*
* @param minimumIntegerDigits The new minimum integer digits value.
* @param digits The new minimum integer digits value.
*/
public void setMinimumIntegerDigits (int newValue)
public void setMinimumIntegerDigits (int digits)
{
minimumIntegerDigits = newValue;
minimumIntegerDigits = digits;
if (getMaximumIntegerDigits () < minimumIntegerDigits)
setMaximumIntegerDigits (minimumIntegerDigits);
}
@ -701,7 +701,7 @@ public abstract class NumberFormat extends Format implements Cloneable
* This method sets the parsing behavior of this object to parse only
* integers or not.
*
* @param parseIntegerOnly <code>true</code> to parse only integers,
* @param value <code>true</code> to parse only integers,
* <code>false</code> otherwise.
*/
public void setParseIntegerOnly (boolean value)

View file

@ -65,7 +65,7 @@ public class ParseException extends Exception
* This method initializes a new instance of <code>ParseException</code>
* with a detailed error message and a error position.
*
* @param msg the descriptive message describing the error
* @param s the descriptive message describing the error
* @param offset the position where the error was encountered
*/
public ParseException(String s, int offset)

View file

@ -180,8 +180,8 @@ public class SimpleDateFormat extends DateFormat
* years to be interpreted as representing
* the years between 2004 and 2104.
*
* @see get2DigitYearStart()
* @see set2DigitYearStart(java.util.Date)
* @see #get2DigitYearStart()
* @see #set2DigitYearStart(java.util.Date)
* @see Date
* @serial The start date of the century for parsing two digit years.
* May not be null.
@ -192,8 +192,8 @@ public class SimpleDateFormat extends DateFormat
* The year at which interpretation of two
* digit years starts.
*
* @see get2DigitYearStart()
* @see set2DigitYearStart(java.util.Date)
* @see #get2DigitYearStart()
* @see #set2DigitYearStart(java.util.Date)
* @serial Ignored.
*/
private transient int defaultCentury;
@ -204,10 +204,10 @@ public class SimpleDateFormat extends DateFormat
* stored in standardChars. Localized patterns
* are translated to this form.
*
* @see applyPattern(String)
* @see applyLocalizedPattern(String)
* @see toPattern()
* @see toLocalizedPattern()
* @see #applyPattern(String)
* @see #applyLocalizedPattern(String)
* @see #toPattern()
* @see #toLocalizedPattern()
* @serial The non-localized pattern string. May not be null.
*/
private String pattern;
@ -294,44 +294,73 @@ public class SimpleDateFormat extends DateFormat
int field;
CompiledField current = null;
for (int i=0; i<pattern.length(); i++) {
thisChar = pattern.charAt(i);
field = standardChars.indexOf(thisChar);
if (field == -1) {
current = null;
if ((thisChar >= 'A' && thisChar <= 'Z')
|| (thisChar >= 'a' && thisChar <= 'z')) {
// Not a valid letter
throw new IllegalArgumentException("Invalid letter " + thisChar +
"encountered at character " + i
+ ".");
} else if (thisChar == '\'') {
// Quoted text section; skip to next single quote
pos = pattern.indexOf('\'',i+1);
if (pos == -1) {
throw new IllegalArgumentException("Quotes starting at character "
+ i + " not closed.");
for (int i = 0; i < pattern.length(); i++)
{
thisChar = pattern.charAt(i);
field = standardChars.indexOf(thisChar);
if (field == -1)
{
current = null;
if ((thisChar >= 'A' && thisChar <= 'Z')
|| (thisChar >= 'a' && thisChar <= 'z'))
{
// Not a valid letter
throw new IllegalArgumentException("Invalid letter "
+ thisChar +
"encountered at character "
+ i + ".");
}
else if (thisChar == '\'')
{
// Quoted text section; skip to next single quote
pos = pattern.indexOf('\'', i + 1);
// First look for '' -- meaning a single quote.
if (pos == i + 1)
tokens.add("'");
else
{
// Look for the terminating quote. However, if we
// see a '', that represents a literal quote and
// we must iterate.
StringBuffer buf = new StringBuffer();
int oldPos = i + 1;
do
{
if (pos == -1)
throw new IllegalArgumentException("Quotes starting at character "
+ i +
" not closed.");
buf.append(pattern.substring(oldPos, pos));
if (pos + 1 >= pattern.length()
|| pattern.charAt(pos + 1) != '\'')
break;
buf.append('\'');
oldPos = pos + 2;
pos = pattern.indexOf('\'', pos + 2);
}
while (true);
tokens.add(buf.toString());
}
i = pos;
}
else
{
// A special character
tokens.add(new Character(thisChar));
}
}
if ((pos+1 < pattern.length()) && (pattern.charAt(pos+1) == '\'')) {
tokens.add(pattern.substring(i+1,pos+1));
} else {
tokens.add(pattern.substring(i+1,pos));
else
{
// A valid field
if ((current != null) && (field == current.field))
current.size++;
else
{
current = new CompiledField(field, 1, thisChar);
tokens.add(current);
}
}
i = pos;
} else {
// A special character
tokens.add(new Character(thisChar));
}
} else {
// A valid field
if ((current != null) && (field == current.field)) {
current.size++;
} else {
current = new CompiledField(field,1,thisChar);
tokens.add(current);
}
}
}
}
/**
@ -611,7 +640,7 @@ public class SimpleDateFormat extends DateFormat
* <li>Is using the same century for two digit years.</li>
* </ul>
*
* @param obj The object to compare for equality against.
* @param o The object to compare for equality against.
*
* @return <code>true</code> if the specified object is equal to this object,
* <code>false</code> otherwise.

View file

@ -76,7 +76,10 @@ public final class StringCharacterIterator implements CharacterIterator
* text of the specified <code>String</code>. The initial index
* value will be set to the first character in the string.
*
* @param text The <code>String</code> to iterate through.
* @param text The <code>String</code> to iterate through (<code>null</code>
* not permitted).
*
* @throws NullPointerException if <code>text</code> is <code>null</code>.
*/
public StringCharacterIterator (String text)
{
@ -113,7 +116,7 @@ public final class StringCharacterIterator implements CharacterIterator
* @param end The ending position in the character range.
* @param index The initial index position.
*
* @param IllegalArgumentException If any of the range values are
* @throws IllegalArgumentException If any of the range values are
* invalid.
*/
public StringCharacterIterator (String text, int begin, int end, int index)

View file

@ -77,6 +77,8 @@ public class Observable
*/
public synchronized void addObserver(Observer observer)
{
if (observer == null)
throw new NullPointerException("can't add null observer");
observers.add(observer);
}

View file

@ -209,8 +209,12 @@ label = Name:\\u0020</pre>
{
if (pos == line.length())
{
// The line continues on the next line.
// The line continues on the next line. If there
// is no next line, just treat it as a key with an
// empty value.
line = reader.readLine();
if (line == null)
line = "";
pos = 0;
while (pos < line.length()
&& Character.isWhitespace(c = line.charAt(pos)))
@ -410,7 +414,17 @@ label = Name:\\u0020</pre>
*/
public String getProperty(String key)
{
return getProperty(key, null);
Properties prop = this;
// Eliminate tail recursion.
do
{
String value = (String) prop.get(key);
if (value != null)
return value;
prop = prop.defaults;
}
while (prop != null);
return null;
}
/**
@ -429,17 +443,10 @@ label = Name:\\u0020</pre>
*/
public String getProperty(String key, String defaultValue)
{
Properties prop = this;
// Eliminate tail recursion.
do
{
String value = (String) prop.get(key);
if (value != null)
return value;
prop = prop.defaults;
}
while (prop != null);
return defaultValue;
String prop = getProperty(key);
if (prop == null)
prop = defaultValue;
return prop;
}
/**

View file

@ -197,6 +197,7 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("MST", tz);
timezones0.put("MST7MDT", tz);
timezones0.put("America/Boise", tz);
timezones0.put("America/Cambridge_Bay", tz);
timezones0.put("America/Chihuahua", tz);
timezones0.put("America/Denver", tz);
timezones0.put("America/Edmonton", tz);
@ -216,15 +217,15 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600);
timezones0.put("CST", tz);
timezones0.put("CST6CDT", tz);
timezones0.put("America/Cambridge_Bay", tz);
timezones0.put("America/Cancun", tz);
timezones0.put("America/Chicago", tz);
timezones0.put("America/Menominee", tz);
timezones0.put("America/Merida", tz);
timezones0.put("America/Mexico_City", tz);
timezones0.put("America/Monterrey", tz);
timezones0.put("America/North_Dakota/Center", tz);
timezones0.put("America/Rainy_River", tz);
timezones0.put("America/Winnipeg", tz);
timezones0.put("America/Rankin_Inlet", tz);
tz = new SimpleTimeZone(-6000 * 3600, "America/Belize");
timezones0.put("America/Belize", tz);
timezones0.put("America/Costa_Rica", tz);
@ -235,16 +236,25 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("America/Swift_Current", tz);
timezones0.put("America/Tegucigalpa", tz);
timezones0.put("Pacific/Galapagos", tz);
tz = new SimpleTimeZone
(-6000 * 3600, "America/Winnipeg",
Calendar.APRIL, 1, Calendar.SUNDAY, 2000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("America/Winnipeg", tz);
tz = new SimpleTimeZone
(-6000 * 3600, "Pacific/Easter",
Calendar.OCTOBER, 9, -Calendar.SUNDAY, 0 * 3600,
Calendar.MARCH, 9, -Calendar.SUNDAY, 0 * 3600);
Calendar.OCTOBER, 2, Calendar.SATURDAY, 23000 * 3600,
Calendar.MARCH, 2, Calendar.SATURDAY, 22000 * 3600);
timezones0.put("Pacific/Easter", tz);
tz = new SimpleTimeZone
(-5000 * 3600, "America/Grand_Turk",
Calendar.APRIL, 1, Calendar.SUNDAY, 0 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 0 * 3600);
timezones0.put("America/Grand_Turk", tz);
tz = new SimpleTimeZone
(-5000 * 3600, "America/Havana",
Calendar.APRIL, 1, Calendar.SUNDAY, 1000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 1000 * 3600);
timezones0.put("America/Havana", tz);
tz = new SimpleTimeZone(-5000 * 3600, "EST5");
timezones0.put("EST5", tz);
@ -258,14 +268,11 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("America/Indiana/Marengo", tz);
timezones0.put("America/Indiana/Vevay", tz);
timezones0.put("America/Indianapolis", tz);
timezones0.put("America/Iqaluit", tz);
timezones0.put("America/Jamaica", tz);
timezones0.put("America/Lima", tz);
timezones0.put("America/Panama", tz);
timezones0.put("America/Pangnirtung", tz);
timezones0.put("America/Port-au-Prince", tz);
timezones0.put("America/Porto_Acre", tz);
timezones0.put("America/Rankin_Inlet", tz);
timezones0.put("America/Rio_Branco", tz);
tz = new SimpleTimeZone
(-5000 * 3600, "EST",
Calendar.APRIL, 1, Calendar.SUNDAY, 2000 * 3600,
@ -273,6 +280,7 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("EST", tz);
timezones0.put("EST5EDT", tz);
timezones0.put("America/Detroit", tz);
timezones0.put("America/Iqaluit", tz);
timezones0.put("America/Kentucky/Louisville", tz);
timezones0.put("America/Kentucky/Monticello", tz);
timezones0.put("America/Louisville", tz);
@ -280,7 +288,9 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("America/Nassau", tz);
timezones0.put("America/New_York", tz);
timezones0.put("America/Nipigon", tz);
timezones0.put("America/Pangnirtung", tz);
timezones0.put("America/Thunder_Bay", tz);
timezones0.put("America/Toronto", tz);
tz = new SimpleTimeZone(-4000 * 3600, "PRT");
timezones0.put("PRT", tz);
timezones0.put("America/Anguilla", tz);
@ -309,19 +319,25 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("America/Tortola", tz);
tz = new SimpleTimeZone
(-4000 * 3600, "America/Asuncion",
Calendar.OCTOBER, 1, Calendar.SUNDAY, 0 * 3600,
Calendar.FEBRUARY, -1, Calendar.SUNDAY, 0 * 3600);
Calendar.OCTOBER, 3, Calendar.SUNDAY, 0 * 3600,
Calendar.MARCH, 2, Calendar.SUNDAY, 0 * 3600);
timezones0.put("America/Asuncion", tz);
tz = new SimpleTimeZone
(-4000 * 3600, "America/Cuiaba",
Calendar.OCTOBER, 2, Calendar.SUNDAY, 0 * 3600,
(-4000 * 3600, "America/Campo_Grande",
Calendar.OCTOBER, 3, Calendar.SUNDAY, 0 * 3600,
Calendar.FEBRUARY, 3, Calendar.SUNDAY, 0 * 3600);
timezones0.put("America/Campo_Grande", tz);
timezones0.put("America/Cuiaba", tz);
tz = new SimpleTimeZone
(-4000 * 3600, "America/Goose_Bay",
Calendar.APRIL, 1, Calendar.SUNDAY, 60000,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 60000);
timezones0.put("America/Goose_Bay", tz);
tz = new SimpleTimeZone
(-4000 * 3600, "America/Santiago",
Calendar.OCTOBER, 9, -Calendar.SUNDAY, 1000 * 3600,
Calendar.MARCH, 9, -Calendar.SUNDAY, 0 * 3600);
timezones0.put("America/Santiago", tz);
tz = new SimpleTimeZone
(-4000 * 3600, "America/Glace_Bay",
Calendar.APRIL, 1, Calendar.SUNDAY, 2000 * 3600,
@ -331,15 +347,14 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("America/Thule", tz);
timezones0.put("Atlantic/Bermuda", tz);
tz = new SimpleTimeZone
(-4000 * 3600, "America/Santiago",
(-4000 * 3600, "Antarctica/Palmer",
Calendar.OCTOBER, 9, -Calendar.SUNDAY, 0 * 3600,
Calendar.MARCH, 9, -Calendar.SUNDAY, 0 * 3600);
timezones0.put("America/Santiago", tz);
timezones0.put("Antarctica/Palmer", tz);
tz = new SimpleTimeZone
(-4000 * 3600, "Atlantic/Stanley",
Calendar.SEPTEMBER, 2, Calendar.SUNDAY, 0 * 3600,
Calendar.APRIL, 16, -Calendar.SUNDAY, 0 * 3600);
Calendar.SEPTEMBER, 1, Calendar.SUNDAY, 2000 * 3600,
Calendar.APRIL, 3, Calendar.SUNDAY, 2000 * 3600);
timezones0.put("Atlantic/Stanley", tz);
tz = new SimpleTimeZone
(-3500 * 3600, "CNT",
@ -347,49 +362,55 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
Calendar.OCTOBER, -1, Calendar.SUNDAY, 60000);
timezones0.put("CNT", tz);
timezones0.put("America/St_Johns", tz);
tz = new SimpleTimeZone
(-3000 * 3600, "America/Araguaina",
Calendar.OCTOBER, 2, Calendar.SUNDAY, 0 * 3600,
Calendar.FEBRUARY, 3, Calendar.SUNDAY, 0 * 3600);
timezones0.put("America/Araguaina", tz);
timezones0.put("America/Sao_Paulo", tz);
tz = new SimpleTimeZone(-3000 * 3600, "AGT");
timezones0.put("AGT", tz);
timezones0.put("America/Belem", tz);
timezones0.put("America/Buenos_Aires", tz);
timezones0.put("America/Catamarca", tz);
timezones0.put("America/Cayenne", tz);
timezones0.put("America/Cordoba", tz);
timezones0.put("America/Fortaleza", tz);
timezones0.put("America/Jujuy", tz);
timezones0.put("America/Maceio", tz);
timezones0.put("America/Mendoza", tz);
timezones0.put("America/Montevideo", tz);
timezones0.put("America/Paramaribo", tz);
timezones0.put("America/Recife", tz);
timezones0.put("America/Rosario", tz);
tz = new SimpleTimeZone
(-3000 * 3600, "America/Godthab",
Calendar.MARCH, 30, -Calendar.SATURDAY, 22000 * 3600,
Calendar.OCTOBER, 30, -Calendar.SATURDAY, 22000 * 3600);
Calendar.MARCH, 30, -Calendar.SATURDAY, 23000 * 3600,
Calendar.OCTOBER, 30, -Calendar.SATURDAY, 23000 * 3600);
timezones0.put("America/Godthab", tz);
tz = new SimpleTimeZone
(-3000 * 3600, "America/Miquelon",
Calendar.APRIL, 1, Calendar.SUNDAY, 2000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600);
timezones0.put("America/Miquelon", tz);
tz = new SimpleTimeZone
(-3000 * 3600, "America/Sao_Paulo",
Calendar.OCTOBER, 3, Calendar.SUNDAY, 0 * 3600,
Calendar.FEBRUARY, 3, Calendar.SUNDAY, 0 * 3600);
timezones0.put("America/Sao_Paulo", tz);
tz = new SimpleTimeZone(-3000 * 3600, "AGT");
timezones0.put("AGT", tz);
timezones0.put("America/Araguaina", tz);
timezones0.put("America/Argentina/Buenos_Aires", tz);
timezones0.put("America/Argentina/Catamarca", tz);
timezones0.put("America/Argentina/ComodRivadavia", tz);
timezones0.put("America/Argentina/Cordoba", tz);
timezones0.put("America/Argentina/Jujuy", tz);
timezones0.put("America/Argentina/La_Rioja", tz);
timezones0.put("America/Argentina/Mendoza", tz);
timezones0.put("America/Argentina/Rio_Gallegos", tz);
timezones0.put("America/Argentina/San_Juan", tz);
timezones0.put("America/Argentina/Tucuman", tz);
timezones0.put("America/Argentina/Ushuaia", tz);
timezones0.put("America/Bahia", tz);
timezones0.put("America/Belem", tz);
timezones0.put("America/Cayenne", tz);
timezones0.put("America/Fortaleza", tz);
timezones0.put("America/Maceio", tz);
timezones0.put("America/Montevideo", tz);
timezones0.put("America/Paramaribo", tz);
timezones0.put("America/Recife", tz);
timezones0.put("Antarctica/Rothera", tz);
tz = new SimpleTimeZone(-2000 * 3600, "America/Noronha");
timezones0.put("America/Noronha", tz);
timezones0.put("Atlantic/South_Georgia", tz);
tz = new SimpleTimeZone
(-1000 * 3600, "America/Scoresbysund",
Calendar.MARCH, -1, Calendar.SUNDAY, 0 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 0 * 3600);
Calendar.MARCH, -1, Calendar.SUNDAY, 1000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 1000 * 3600);
timezones0.put("America/Scoresbysund", tz);
timezones0.put("Atlantic/Azores", tz);
tz = new SimpleTimeZone(-1000 * 3600, "Atlantic/Cape_Verde");
timezones0.put("Atlantic/Cape_Verde", tz);
timezones0.put("Atlantic/Jan_Mayen", tz);
tz = new SimpleTimeZone(0 * 3600, "GMT");
timezones0.put("GMT", tz);
timezones0.put("UTC", tz);
@ -409,6 +430,7 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("Africa/Ouagadougou", tz);
timezones0.put("Africa/Sao_Tome", tz);
timezones0.put("Africa/Timbuktu", tz);
timezones0.put("America/Danmarkshavn", tz);
timezones0.put("Atlantic/Reykjavik", tz);
timezones0.put("Atlantic/St_Helena", tz);
timezones0.put("Europe/Belfast", tz);
@ -416,8 +438,8 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("Europe/London", tz);
tz = new SimpleTimeZone
(0 * 3600, "WET",
Calendar.MARCH, -1, Calendar.SUNDAY, 1000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 1000 * 3600);
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600);
timezones0.put("WET", tz);
timezones0.put("Atlantic/Canary", tz);
timezones0.put("Atlantic/Faeroe", tz);
@ -444,14 +466,14 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("Africa/Windhoek", tz);
tz = new SimpleTimeZone
(1000 * 3600, "CET",
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600);
Calendar.MARCH, -1, Calendar.SUNDAY, 3000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("CET", tz);
timezones0.put("CEST", tz);
timezones0.put("ECT", tz);
timezones0.put("MET", tz);
timezones0.put("Africa/Ceuta", tz);
timezones0.put("Arctic/Longyearbyen", tz);
timezones0.put("Atlantic/Jan_Mayen", tz);
timezones0.put("Europe/Amsterdam", tz);
timezones0.put("Europe/Andorra", tz);
timezones0.put("Europe/Belgrade", tz);
@ -483,8 +505,8 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("Europe/Zurich", tz);
tz = new SimpleTimeZone
(2000 * 3600, "ART",
Calendar.APRIL, -1, Calendar.FRIDAY, 0 * 3600,
Calendar.SEPTEMBER, -1, Calendar.THURSDAY, 23000 * 3600);
Calendar.APRIL, -1, Calendar.FRIDAY, 1000 * 3600,
Calendar.SEPTEMBER, -1, Calendar.THURSDAY, 24000 * 3600);
timezones0.put("ART", tz);
timezones0.put("Africa/Cairo", tz);
tz = new SimpleTimeZone(2000 * 3600, "CAT");
@ -501,13 +523,11 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("Africa/Maseru", tz);
timezones0.put("Africa/Mbabane", tz);
timezones0.put("Africa/Tripoli", tz);
timezones0.put("Europe/Riga", tz);
timezones0.put("Europe/Tallinn", tz);
timezones0.put("Europe/Vilnius", tz);
timezones0.put("Asia/Jerusalem", tz);
tz = new SimpleTimeZone
(2000 * 3600, "Asia/Amman",
Calendar.MARCH, -1, Calendar.THURSDAY, 0 * 3600,
Calendar.SEPTEMBER, -1, Calendar.THURSDAY, 0 * 3600);
Calendar.MARCH, -1, Calendar.THURSDAY, 1000 * 3600,
Calendar.SEPTEMBER, -1, Calendar.THURSDAY, 1000 * 3600);
timezones0.put("Asia/Amman", tz);
tz = new SimpleTimeZone
(2000 * 3600, "Asia/Beirut",
@ -524,15 +544,10 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
Calendar.APRIL, 3, Calendar.FRIDAY, 0 * 3600,
Calendar.OCTOBER, 3, Calendar.FRIDAY, 0 * 3600);
timezones0.put("Asia/Gaza", tz);
tz = new SimpleTimeZone
(2000 * 3600, "Asia/Jerusalem",
Calendar.APRIL, 1, 0, 1000 * 3600,
Calendar.OCTOBER, 1, 0, 1000 * 3600);
timezones0.put("Asia/Jerusalem", tz);
tz = new SimpleTimeZone
(2000 * 3600, "EET",
Calendar.MARCH, -1, Calendar.SUNDAY, 3000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 3000 * 3600);
Calendar.MARCH, -1, Calendar.SUNDAY, 4000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 4000 * 3600);
timezones0.put("EET", tz);
timezones0.put("Asia/Istanbul", tz);
timezones0.put("Asia/Nicosia", tz);
@ -542,28 +557,32 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("Europe/Helsinki", tz);
timezones0.put("Europe/Istanbul", tz);
timezones0.put("Europe/Kiev", tz);
timezones0.put("Europe/Mariehamn", tz);
timezones0.put("Europe/Nicosia", tz);
timezones0.put("Europe/Riga", tz);
timezones0.put("Europe/Simferopol", tz);
timezones0.put("Europe/Sofia", tz);
timezones0.put("Europe/Tallinn", tz);
timezones0.put("Europe/Uzhgorod", tz);
timezones0.put("Europe/Vilnius", tz);
timezones0.put("Europe/Zaporozhye", tz);
tz = new SimpleTimeZone
(2000 * 3600, "Europe/Kaliningrad",
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600);
Calendar.MARCH, -1, Calendar.SUNDAY, 3000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("Europe/Kaliningrad", tz);
timezones0.put("Europe/Minsk", tz);
tz = new SimpleTimeZone
(3000 * 3600, "Asia/Baghdad",
Calendar.APRIL, 1, 0, 3000 * 3600,
Calendar.OCTOBER, 1, 0, 3000 * 3600);
Calendar.APRIL, 1, 0, 4000 * 3600,
Calendar.OCTOBER, 1, 0, 4000 * 3600);
timezones0.put("Asia/Baghdad", tz);
tz = new SimpleTimeZone
(3000 * 3600, "Europe/Moscow",
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600);
(3000 * 3600, "Asia/Tbilisi",
Calendar.MARCH, -1, Calendar.SUNDAY, 3000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("Asia/Tbilisi", tz);
timezones0.put("Europe/Moscow", tz);
timezones0.put("Europe/Tiraspol", tz);
tz = new SimpleTimeZone(3000 * 3600, "EAT");
timezones0.put("EAT", tz);
timezones0.put("Africa/Addis_Ababa", tz);
@ -590,32 +609,23 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
Calendar.MARCH, -1, Calendar.SUNDAY, 1000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 1000 * 3600);
timezones0.put("Asia/Baku", tz);
tz = new SimpleTimeZone
(4000 * 3600, "Asia/Aqtau",
Calendar.MARCH, -1, Calendar.SUNDAY, 0 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 0 * 3600);
timezones0.put("Asia/Aqtau", tz);
timezones0.put("Asia/Tbilisi", tz);
tz = new SimpleTimeZone
(4000 * 3600, "Asia/Yerevan",
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600);
Calendar.MARCH, -1, Calendar.SUNDAY, 3000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("Asia/Yerevan", tz);
timezones0.put("Europe/Samara", tz);
tz = new SimpleTimeZone(4000 * 3600, "NET");
timezones0.put("NET", tz);
timezones0.put("Asia/Aqtau", tz);
timezones0.put("Asia/Dubai", tz);
timezones0.put("Asia/Muscat", tz);
timezones0.put("Asia/Oral", tz);
timezones0.put("Indian/Mahe", tz);
timezones0.put("Indian/Mauritius", tz);
timezones0.put("Indian/Reunion", tz);
tz = new SimpleTimeZone(4500 * 3600, "Asia/Kabul");
timezones0.put("Asia/Kabul", tz);
tz = new SimpleTimeZone
(5000 * 3600, "Asia/Aqtobe",
Calendar.MARCH, -1, Calendar.SUNDAY, 0 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 0 * 3600);
timezones0.put("Asia/Aqtobe", tz);
tz = new SimpleTimeZone
(5000 * 3600, "Asia/Bishkek",
Calendar.MARCH, -1, Calendar.SUNDAY, 2500 * 3600,
@ -623,17 +633,17 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("Asia/Bishkek", tz);
tz = new SimpleTimeZone
(5000 * 3600, "Asia/Yekaterinburg",
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600);
Calendar.MARCH, -1, Calendar.SUNDAY, 3000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("Asia/Yekaterinburg", tz);
tz = new SimpleTimeZone(5000 * 3600, "PLT");
timezones0.put("PLT", tz);
timezones0.put("Asia/Aqtobe", tz);
timezones0.put("Asia/Ashgabat", tz);
timezones0.put("Asia/Dushanbe", tz);
timezones0.put("Asia/Karachi", tz);
timezones0.put("Asia/Samarkand", tz);
timezones0.put("Asia/Tashkent", tz);
timezones0.put("Indian/Chagos", tz);
timezones0.put("Indian/Kerguelen", tz);
timezones0.put("Indian/Maldives", tz);
tz = new SimpleTimeZone(5500 * 3600, "IST");
@ -644,18 +654,17 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
tz = new SimpleTimeZone(6000 * 3600, "BST");
timezones0.put("BST", tz);
timezones0.put("Antarctica/Mawson", tz);
timezones0.put("Antarctica/Vostok", tz);
timezones0.put("Asia/Almaty", tz);
timezones0.put("Asia/Colombo", tz);
timezones0.put("Asia/Dhaka", tz);
timezones0.put("Asia/Qyzylorda", tz);
timezones0.put("Asia/Thimphu", tz);
tz = new SimpleTimeZone
(6000 * 3600, "Asia/Almaty",
Calendar.MARCH, -1, Calendar.SUNDAY, 0 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 0 * 3600);
timezones0.put("Asia/Almaty", tz);
timezones0.put("Indian/Chagos", tz);
tz = new SimpleTimeZone
(6000 * 3600, "Asia/Novosibirsk",
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600);
Calendar.MARCH, -1, Calendar.SUNDAY, 3000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("Asia/Novosibirsk", tz);
timezones0.put("Asia/Omsk", tz);
tz = new SimpleTimeZone(6500 * 3600, "Asia/Rangoon");
@ -665,41 +674,55 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("VST", tz);
timezones0.put("Antarctica/Davis", tz);
timezones0.put("Asia/Bangkok", tz);
timezones0.put("Asia/Hovd", tz);
timezones0.put("Asia/Jakarta", tz);
timezones0.put("Asia/Phnom_Penh", tz);
timezones0.put("Asia/Pontianak", tz);
timezones0.put("Asia/Saigon", tz);
timezones0.put("Asia/Vientiane", tz);
timezones0.put("Indian/Christmas", tz);
tz = new SimpleTimeZone
(7000 * 3600, "Asia/Hovd",
Calendar.MARCH, -1, Calendar.SATURDAY, 2000 * 3600,
Calendar.SEPTEMBER, -1, Calendar.SATURDAY, 2000 * 3600);
timezones0.put("Asia/Hovd", tz);
tz = new SimpleTimeZone
(7000 * 3600, "Asia/Krasnoyarsk",
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600);
Calendar.MARCH, -1, Calendar.SUNDAY, 3000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("Asia/Krasnoyarsk", tz);
tz = new SimpleTimeZone(8000 * 3600, "CTT");
timezones0.put("CTT", tz);
timezones0.put("Antarctica/Casey", tz);
timezones0.put("Asia/Brunei", tz);
timezones0.put("Asia/Chungking", tz);
timezones0.put("Asia/Chongqing", tz);
timezones0.put("Asia/Harbin", tz);
timezones0.put("Asia/Hong_Kong", tz);
timezones0.put("Asia/Kashgar", tz);
timezones0.put("Asia/Kuala_Lumpur", tz);
timezones0.put("Asia/Kuching", tz);
timezones0.put("Asia/Macao", tz);
timezones0.put("Asia/Macau", tz);
timezones0.put("Asia/Makassar", tz);
timezones0.put("Asia/Manila", tz);
timezones0.put("Asia/Shanghai", tz);
timezones0.put("Asia/Singapore", tz);
timezones0.put("Asia/Taipei", tz);
timezones0.put("Asia/Ujung_Pandang", tz);
timezones0.put("Asia/Ulaanbaatar", tz);
timezones0.put("Asia/Urumqi", tz);
timezones0.put("Australia/Perth", tz);
tz = new SimpleTimeZone
(8000 * 3600, "Asia/Irkutsk",
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600);
Calendar.MARCH, -1, Calendar.SUNDAY, 3000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("Asia/Irkutsk", tz);
tz = new SimpleTimeZone
(8000 * 3600, "Asia/Ulaanbaatar",
Calendar.MARCH, -1, Calendar.SATURDAY, 2000 * 3600,
Calendar.SEPTEMBER, -1, Calendar.SATURDAY, 2000 * 3600);
timezones0.put("Asia/Ulaanbaatar", tz);
tz = new SimpleTimeZone
(9000 * 3600, "Asia/Choibalsan",
Calendar.MARCH, -1, Calendar.SATURDAY, 2000 * 3600,
Calendar.SEPTEMBER, -1, Calendar.SATURDAY, 2000 * 3600);
timezones0.put("Asia/Choibalsan", tz);
tz = new SimpleTimeZone(9000 * 3600, "JST");
timezones0.put("JST", tz);
timezones0.put("Asia/Dili", tz);
@ -710,13 +733,13 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("Pacific/Palau", tz);
tz = new SimpleTimeZone
(9000 * 3600, "Asia/Yakutsk",
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600);
Calendar.MARCH, -1, Calendar.SUNDAY, 3000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("Asia/Yakutsk", tz);
tz = new SimpleTimeZone
(9500 * 3600, "Australia/Adelaide",
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600);
Calendar.OCTOBER, -1, Calendar.SUNDAY, 3000 * 3600,
Calendar.MARCH, -1, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("Australia/Adelaide", tz);
timezones0.put("Australia/Broken_Hill", tz);
tz = new SimpleTimeZone(9500 * 3600, "ACT");
@ -732,31 +755,32 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("Pacific/Truk", tz);
timezones0.put("Pacific/Yap", tz);
tz = new SimpleTimeZone
(10000 * 3600, "Asia/Vladivostok",
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600);
(10000 * 3600, "Asia/Sakhalin",
Calendar.MARCH, -1, Calendar.SUNDAY, 3000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("Asia/Sakhalin", tz);
timezones0.put("Asia/Vladivostok", tz);
tz = new SimpleTimeZone
(10000 * 3600, "Australia/Hobart",
Calendar.OCTOBER, 1, Calendar.SUNDAY, 2000 * 3600,
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600);
Calendar.OCTOBER, 1, Calendar.SUNDAY, 3000 * 3600,
Calendar.MARCH, -1, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("Australia/Hobart", tz);
tz = new SimpleTimeZone
(10000 * 3600, "AET",
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600);
Calendar.OCTOBER, -1, Calendar.SUNDAY, 3000 * 3600,
Calendar.MARCH, -1, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("AET", tz);
timezones0.put("Australia/Melbourne", tz);
timezones0.put("Australia/Sydney", tz);
tz = new SimpleTimeZone
(10500 * 3600, "Australia/Lord_Howe",
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600, 500 * 3600);
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600, 500 * 3600);
timezones0.put("Australia/Lord_Howe", tz);
tz = new SimpleTimeZone
(11000 * 3600, "Asia/Magadan",
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600);
Calendar.MARCH, -1, Calendar.SUNDAY, 3000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("Asia/Magadan", tz);
tz = new SimpleTimeZone(11000 * 3600, "SST");
timezones0.put("SST", tz);
@ -769,16 +793,16 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("Pacific/Norfolk", tz);
tz = new SimpleTimeZone
(12000 * 3600, "NST",
Calendar.OCTOBER, 1, Calendar.SUNDAY, 2000 * 3600,
Calendar.MARCH, 3, Calendar.SUNDAY, 2000 * 3600);
Calendar.OCTOBER, 1, Calendar.SUNDAY, 3000 * 3600,
Calendar.MARCH, 3, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("NST", tz);
timezones0.put("Antarctica/McMurdo", tz);
timezones0.put("Antarctica/South_Pole", tz);
timezones0.put("Pacific/Auckland", tz);
tz = new SimpleTimeZone
(12000 * 3600, "Asia/Anadyr",
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600);
Calendar.MARCH, -1, Calendar.SUNDAY, 3000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 3000 * 3600);
timezones0.put("Asia/Anadyr", tz);
timezones0.put("Asia/Kamchatka", tz);
tz = new SimpleTimeZone(12000 * 3600, "Pacific/Fiji");
@ -792,8 +816,8 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
timezones0.put("Pacific/Wallis", tz);
tz = new SimpleTimeZone
(12750 * 3600, "Pacific/Chatham",
Calendar.OCTOBER, 1, Calendar.SUNDAY, 2750 * 3600,
Calendar.MARCH, 3, Calendar.SUNDAY, 2750 * 3600);
Calendar.OCTOBER, 1, Calendar.SUNDAY, 3750 * 3600,
Calendar.MARCH, 3, Calendar.SUNDAY, 3750 * 3600);
timezones0.put("Pacific/Chatham", tz);
tz = new SimpleTimeZone(13000 * 3600, "Pacific/Enderbury");
timezones0.put("Pacific/Enderbury", tz);

View file

@ -164,10 +164,10 @@ public class Vector extends AbstractList
}
/**
* Copies the contents of a provided array into the Vector. If the
* array is too large to fit in the Vector, an IndexOutOfBoundsException
* is thrown without modifying the array. Old elements in the Vector are
* overwritten by the new elements.
* Copies the contents of the Vector into the provided array. If the
* array is too small to fit all the elements in the Vector, an
* {@link IndexOutOfBoundsException} is thrown without modifying the array.
* Old elements in the array are overwritten by the new elements.
*
* @param a target array for the copy
* @throws IndexOutOfBoundsException the array is not large enough

View file

@ -1,5 +1,5 @@
/* JarFile.java - Representation of a jar file
Copyright (C) 2000, 2003, 2004 Free Software Foundation, Inc.
Copyright (C) 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -351,7 +351,7 @@ public class JarFile extends ZipFile
synchronized(jarfile)
{
if (!jarfile.signaturesRead)
if (jarfile.verify && !jarfile.signaturesRead)
try
{
jarfile.readSignatures();
@ -408,7 +408,7 @@ public class JarFile extends ZipFile
jarEntry.attr = manifest.getAttributes(name);
}
if (!signaturesRead)
if (verify && !signaturesRead)
try
{
readSignatures();

View file

@ -577,7 +577,8 @@ public class Logger
public void log(Level level, String message)
{
log(level, message, (Object[]) null);
if (isLoggable(level))
log(level, message, (Object[]) null);
}
@ -585,12 +586,15 @@ public class Logger
String message,
Object param)
{
StackTraceElement caller = getCallerStackFrame();
logp(level,
caller != null ? caller.getClassName() : "<unknown>",
caller != null ? caller.getMethodName() : "<unknown>",
message,
param);
if (isLoggable(level))
{
StackTraceElement caller = getCallerStackFrame();
logp(level,
caller != null ? caller.getClassName() : "<unknown>",
caller != null ? caller.getMethodName() : "<unknown>",
message,
param);
}
}
@ -598,12 +602,15 @@ public class Logger
String message,
Object[] params)
{
StackTraceElement caller = getCallerStackFrame();
logp(level,
caller != null ? caller.getClassName() : "<unknown>",
caller != null ? caller.getMethodName() : "<unknown>",
message,
params);
if (isLoggable(level))
{
StackTraceElement caller = getCallerStackFrame();
logp(level,
caller != null ? caller.getClassName() : "<unknown>",
caller != null ? caller.getMethodName() : "<unknown>",
message,
params);
}
}
@ -611,12 +618,15 @@ public class Logger
String message,
Throwable thrown)
{
StackTraceElement caller = getCallerStackFrame();
logp(level,
caller != null ? caller.getClassName() : "<unknown>",
caller != null ? caller.getMethodName() : "<unknown>",
message,
thrown);
if (isLoggable(level))
{
StackTraceElement caller = getCallerStackFrame();
logp(level,
caller != null ? caller.getClassName() : "<unknown>",
caller != null ? caller.getMethodName() : "<unknown>",
message,
thrown);
}
}

View file

@ -1,5 +1,5 @@
/* DeflaterHuffman.java --
Copyright (C) 2001, 2004 Free Software Foundation, Inc.
Copyright (C) 2001, 2004, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -59,7 +59,7 @@ class DeflaterHuffman
private static final int[] BL_ORDER =
{ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };
private static String bit4Reverse =
private static final String bit4Reverse =
"\000\010\004\014\002\012\006\016\001\011\005\015\003\013\007\017";
class Tree {

View file

@ -1,5 +1,5 @@
/* DeflaterOutputStream.java - Output filter for compressing.
Copyright (C) 1999, 2000, 2001, 2004 Free Software Foundation, Inc.
Copyright (C) 1999, 2000, 2001, 2004, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -100,7 +100,7 @@ public class DeflaterOutputStream extends FilterOutputStream
*/
public DeflaterOutputStream(OutputStream out)
{
this(out, new Deflater(), 512);
this(out, new Deflater(), 4096);
}
/**
@ -111,7 +111,7 @@ public class DeflaterOutputStream extends FilterOutputStream
*/
public DeflaterOutputStream(OutputStream out, Deflater defl)
{
this(out, defl, 512);
this(out, defl, 4096);
}
/**

View file

@ -39,7 +39,6 @@ exception statement from your version. */
package java.util.zip;
import java.util.Calendar;
import java.util.Date;
/**
* This class represents a member of a zip archive. ZipFile and
@ -173,7 +172,7 @@ public class ZipEntry implements ZipConstants, Cloneable
Calendar cal = getCalendar();
synchronized (cal)
{
cal.setTime(new Date(time));
cal.setTimeInMillis(time);
dostime = (cal.get(Calendar.YEAR) - 1980 & 0x7f) << 25
| (cal.get(Calendar.MONTH) + 1) << 21
| (cal.get(Calendar.DAY_OF_MONTH)) << 16
@ -190,12 +189,12 @@ public class ZipEntry implements ZipConstants, Cloneable
*/
public long getTime()
{
// The extra bytes might contain the time (posix/unix extension)
parseExtra();
if ((known & KNOWN_TIME) == 0)
return -1;
// The extra bytes might contain the time (posix/unix extension)
parseExtra ();
int sec = 2 * (dostime & 0x1f);
int min = (dostime >> 5) & 0x3f;
int hrs = (dostime >> 11) & 0x1f;
@ -209,7 +208,7 @@ public class ZipEntry implements ZipConstants, Cloneable
synchronized (cal)
{
cal.set(year, mon, day, hrs, min, sec);
return cal.getTime().getTime();
return cal.getTimeInMillis();
}
}
catch (RuntimeException ex)
@ -367,10 +366,10 @@ public class ZipEntry implements ZipConstants, Cloneable
catch (ArrayIndexOutOfBoundsException ex)
{
/* be lenient */
return;
}
known |= KNOWN_EXTRA;
return;
}
/**

View file

@ -48,6 +48,7 @@ import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
@ -284,7 +285,15 @@ public class ZipFile implements ZipConstants
buffer = new byte[needBuffer];
raf.readFully(buffer, 0, nameLen);
String name = new String(buffer, 0, 0, nameLen);
String name;
try
{
name = new String(buffer, 0, nameLen, "UTF-8");
}
catch (UnsupportedEncodingException uee)
{
throw new AssertionError(uee);
}
ZipEntry entry = new ZipEntry(name);
entry.setMethod(method);
@ -301,7 +310,14 @@ public class ZipFile implements ZipConstants
if (commentLen > 0)
{
raf.readFully(buffer, 0, commentLen);
entry.setComment(new String(buffer, 0, commentLen));
try
{
entry.setComment(new String(buffer, 0, commentLen, "UTF-8"));
}
catch (UnsupportedEncodingException uee)
{
throw new AssertionError(uee);
}
}
entry.offset = offset;
entries.put(name, entry);
@ -317,6 +333,10 @@ public class ZipFile implements ZipConstants
*/
public void close() throws IOException
{
RandomAccessFile raf = this.raf;
if (raf == null)
return;
synchronized (raf)
{
closed = true;

View file

@ -1,5 +1,5 @@
/* ZipInputStream.java --
Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -41,6 +41,7 @@ package java.util.zip;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
/**
* This is a FilterInputStream that reads the files in an zip archive
@ -171,7 +172,15 @@ public class ZipInputStream extends InflaterInputStream implements ZipConstants
byte[] buffer = new byte[nameLen];
readFully(buffer);
String name = new String(buffer);
String name;
try
{
name = new String(buffer, "UTF-8");
}
catch (UnsupportedEncodingException uee)
{
throw new AssertionError(uee);
}
entry = createZipEntry(name);
entryAtEOF = false;

View file

@ -1,5 +1,5 @@
/* ZipOutputStream.java --
Copyright (C) 2001, 2004 Free Software Foundation, Inc.
Copyright (C) 2001, 2004, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -40,6 +40,7 @@ package java.util.zip;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Vector;
@ -102,7 +103,14 @@ public class ZipOutputStream extends DeflaterOutputStream implements ZipConstant
public void setComment(String comment)
{
byte[] commentBytes;
commentBytes = comment.getBytes();
try
{
commentBytes = comment.getBytes("UTF-8");
}
catch (UnsupportedEncodingException uee)
{
throw new AssertionError(uee);
}
if (commentBytes.length > 0xffff)
throw new IllegalArgumentException("Comment too long.");
zipComment = commentBytes;
@ -226,7 +234,15 @@ public class ZipOutputStream extends DeflaterOutputStream implements ZipConstant
writeLeInt(0);
writeLeInt(0);
}
byte[] name = entry.getName().getBytes();
byte[] name;
try
{
name = entry.getName().getBytes("UTF-8");
}
catch (UnsupportedEncodingException uee)
{
throw new AssertionError(uee);
}
if (name.length > 0xffff)
throw new ZipException("Name too long.");
byte[] extra = entry.getExtra();
@ -357,15 +373,30 @@ public class ZipOutputStream extends DeflaterOutputStream implements ZipConstant
writeLeInt((int)entry.getCompressedSize());
writeLeInt((int)entry.getSize());
byte[] name = entry.getName().getBytes();
byte[] name;
try
{
name = entry.getName().getBytes("UTF-8");
}
catch (UnsupportedEncodingException uee)
{
throw new AssertionError(uee);
}
if (name.length > 0xffff)
throw new ZipException("Name too long.");
byte[] extra = entry.getExtra();
if (extra == null)
extra = new byte[0];
String strComment = entry.getComment();
byte[] comment = strComment != null
? strComment.getBytes() : new byte[0];
String str = entry.getComment();
byte[] comment;
try
{
comment = str != null ? str.getBytes("UTF-8") : new byte[0];
}
catch (UnsupportedEncodingException uee)
{
throw new AssertionError(uee);
}
if (comment.length > 0xffff)
throw new ZipException("Comment too long.");