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:
parent
9b044d1951
commit
1ea63ef8be
544 changed files with 34724 additions and 14512 deletions
|
@ -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
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 ();
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
+ "]");
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 ();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@ import java.awt.MenuItem;
|
|||
public interface MenuPeer extends MenuItemPeer
|
||||
{
|
||||
void addItem (MenuItem item);
|
||||
void addSeparator ();
|
||||
void delItem (int index);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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 ()
|
||||
{
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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 < str2, 0 if str1 == str2, or
|
||||
* a positive integer if str1 > 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 < obj2, 0 if obj1 == obj2, or
|
||||
* a positive integer if obj1 > 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.
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 ()
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.");
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue