Author: nbelaevski
Date: 2009-07-22 19:38:22 -0400 (Wed, 22 Jul 2009)
New Revision: 14978
Added:
root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/NumericDataInputStream.java
root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/NumericDataOutputStream.java
root/framework/trunk/impl/src/main/java/org/richfaces/resource/AnimatedTestResource.java
root/framework/trunk/impl/src/main/resources/META-INF/org.richfaces.resource.AnimatedTestResource.resource.properties
root/framework/trunk/impl/src/test/java/org/ajax4jsf/util/NumericStreamsTest.java
Removed:
root/framework/trunk/impl/src/main/java/org/ajax4jsf/resource/AnimationResource.java
root/framework/trunk/impl/src/main/java/org/ajax4jsf/resource/image/animatedgif/
root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/GifEncoder.java
root/framework/trunk/impl/src/test/java/org/ajax4jsf/util/Zipper2Test.java
Modified:
root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/Zipper.java
root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/Zipper2.java
root/framework/trunk/impl/src/main/java/org/richfaces/resource/TestResource2.java
Log:
Remove Gif image format SPI ( included in the JDK 5 and late ) -
https://jira.jboss.org/jira/browse/RF-7555
Zipper/Zipper2 deprecated in favor to NumericDataInputStream/NumericDataOutputStream
Deleted:
root/framework/trunk/impl/src/main/java/org/ajax4jsf/resource/AnimationResource.java
===================================================================
---
root/framework/trunk/impl/src/main/java/org/ajax4jsf/resource/AnimationResource.java 2009-07-22
16:39:10 UTC (rev 14977)
+++
root/framework/trunk/impl/src/main/java/org/ajax4jsf/resource/AnimationResource.java 2009-07-22
23:38:22 UTC (rev 14978)
@@ -1,102 +0,0 @@
-/**
- * License Agreement.
- *
- * Rich Faces - Natural Ajax for Java Server Faces (JSF)
- *
- * Copyright (C) 2007 Exadel, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-package org.ajax4jsf.resource;
-
-import java.awt.Dimension;
-import java.awt.Graphics2D;
-import java.awt.image.BufferedImage;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Date;
-
-import org.ajax4jsf.resource.image.animatedgif.AnimatedGifEncoder;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-public abstract class AnimationResource extends InternetResourceBase {
-
- private static final Log log = LogFactory.getLog(AnimationResource.class);
-
- protected abstract Dimension getFrameSize(ResourceContext resourceContext);
-
- public AnimationResource() {
- setRenderer(new GifRenderer());
- setLastModified(new Date(InternetResourceBuilder.getInstance().getStartTime()));
- }
-
- protected abstract int getNumberOfFrames();
-
- protected int getRepeat() {
- return -1;
- }
-
- private int[] delays;
-
- protected int[] getFrameDelays() {
- if (delays == null) {
- delays = new int[getNumberOfFrames()];
- Arrays.fill(delays, 0);
- }
-
- return delays;
- }
-
- private int currFrameIndex = 0;
-
- public void send(ResourceContext context) throws IOException {
- try {
- DataOutputStream output = new DataOutputStream(context.getOutputStream());
- Dimension frameSize = getFrameSize(context);
- int numberOfFrames = getNumberOfFrames();
- BufferedImage frame = null;
- currFrameIndex = 0;
- if (frameSize.getHeight() > 0.0 && frameSize.getWidth() > 0.0
- && numberOfFrames > 0) {
- AnimatedGifEncoder encoder = new AnimatedGifEncoder();
- encoder.start(output);
- encoder.setRepeat(getRepeat());
- int[] delays = getFrameDelays();
- ImageRenderer renderer = (ImageRenderer) getRenderer(null);
- while (currFrameIndex < numberOfFrames) {
- frame = renderer.createImage(frameSize.width,
- frameSize.height);
- Graphics2D graphics = frame.createGraphics();
- paint(context, graphics, currFrameIndex++);
- graphics.dispose();
- encoder.addFrame(frame);
- if (delays != null && delays.length > currFrameIndex) {
- encoder.setDelay(delays[currFrameIndex]);
- }
- }
- encoder.finish();
- }
- output.flush();
- output.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-
- protected abstract void paint(ResourceContext context, Graphics2D graphics2D, int
frameIndex);
-
-}
Deleted: root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/GifEncoder.java
===================================================================
--- root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/GifEncoder.java 2009-07-22
16:39:10 UTC (rev 14977)
+++ root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/GifEncoder.java 2009-07-22
23:38:22 UTC (rev 14978)
@@ -1,545 +0,0 @@
-package org.ajax4jsf.util;
-
-import java.awt.Image;
-import java.awt.image.ColorModel;
-import java.awt.image.IndexColorModel;
-import java.awt.image.PixelGrabber;
-import java.io.IOException;
-import java.io.OutputStream;
-
-import org.ajax4jsf.Messages;
-
-/** GifEncoder - writes out an image as a GIF.
- *
- * Transparency handling and variable bit size courtesy of Jack Palevich.
- *
- * Copyright (C) 1996 by Jef Poskanzer <jef(a)acme.com>. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * Visit the ACME Labs Java page for up-to-date versions of this and other
- * fine Java utilities:
http://www.acme.com/java/
- */
-
-public class GifEncoder {
-
- private boolean interlace = false;
-
- private int width, height;
-
- private byte[] pixels;
-
- private byte[] r, g, b; // the color look-up table
-
- private int pixelIndex;
-
- private int numPixels;
-
- private int transparentPixel = -1; // hpm
-
- /**
- * Constructs a new GifEncoder.
- * @param width The image width.
- * @param height The image height.
- * @param pixels The pixel data.
- * @param r The red look-up table.
- * @param g The green look-up table.
- * @param b The blue look-up table.
- */
- public GifEncoder(int width, int height, byte[] pixels, byte[] r, byte[] g, byte[] b) {
- this.width = width;
- this.height = height;
- this.pixels = pixels;
- this.r = r;
- this.g = g;
- this.b = b;
- interlace = false;
- pixelIndex = 0;
- numPixels = width * height;
- }
-
- /** Constructs a new GifEncoder using an 8-bit AWT Image.
- The image is assumed to be fully loaded. */
- public GifEncoder(Image img) {
- width = img.getWidth(null);
- height = img.getHeight(null);
- pixels = new byte[width * height];
- PixelGrabber pg = new PixelGrabber(img, 0, 0, width, height, false);
- try {
- pg.grabPixels();
- } catch (InterruptedException e) {
- System.err.println(e);
- }
- ColorModel cm = pg.getColorModel();
- if (cm instanceof IndexColorModel) {
- pixels = (byte[]) (pg.getPixels());
- // hpm
- IndexColorModel icm = (IndexColorModel) cm;
- setTransparentPixel(icm.getTransparentPixel());
- } else
- throw new IllegalArgumentException(Messages.getMessage(Messages.IMAGE_ERROR));
- IndexColorModel m = (IndexColorModel) cm;
- int mapSize = m.getMapSize();
- r = new byte[mapSize];
- g = new byte[mapSize];
- b = new byte[mapSize];
- m.getReds(r);
- m.getGreens(g);
- m.getBlues(b);
- interlace = false;
- pixelIndex = 0;
- numPixels = width * height;
- }
-
- /** Saves the image as a GIF file. */
- public void write(OutputStream out) throws IOException {
- // Figure out how many bits to use.
- int numColors = r.length;
- int BitsPerPixel;
- if (numColors <= 2)
- BitsPerPixel = 1;
- else if (numColors <= 4)
- BitsPerPixel = 2;
- else if (numColors <= 16)
- BitsPerPixel = 4;
- else
- BitsPerPixel = 8;
-
- int ColorMapSize = 1 << BitsPerPixel;
- byte[] reds = new byte[ColorMapSize];
- byte[] grns = new byte[ColorMapSize];
- byte[] blus = new byte[ColorMapSize];
- for (int i = 0; i < numColors; i++) {
- reds[i] = r[i];
- grns[i] = g[i];
- blus[i] = b[i];
- }
-
- // hpm
- GIFEncode(out, width, height, interlace, (byte) 0, getTransparentPixel(), BitsPerPixel,
reds, grns, blus);
- }
-
- // hpm
- public void setTransparentPixel(int pixel) {
- transparentPixel = pixel;
- }
-
- // hpm
- public int getTransparentPixel() {
- return transparentPixel;
- }
-
- static void writeString(OutputStream out, String str) throws IOException {
- byte[] buf = str.getBytes();
- out.write(buf);
- }
-
- // Adapted from ppmtogif, which is based on GIFENCOD by David
- // Rowley <mgardi(a)watdscu.waterloo.edu>. Lempel-Zim compression
- // based on "compress".
-
- int Width, Height;
-
- boolean Interlace;
-
- void GIFEncode(OutputStream outs, int Width, int Height, boolean Interlace,
- byte Background, int Transparent, int BitsPerPixel, byte[] Red,
- byte[] Green, byte[] Blue) throws IOException {
- byte B;
- int LeftOfs, TopOfs;
- int ColorMapSize;
- int InitCodeSize;
- int i;
-
- this.Width = Width;
- this.Height = Height;
- this.Interlace = Interlace;
- ColorMapSize = 1 << BitsPerPixel;
- LeftOfs = TopOfs = 0;
-
- // The initial code size
- if (BitsPerPixel <= 1)
- InitCodeSize = 2;
- else
- InitCodeSize = BitsPerPixel;
-
- // Write the Magic header
- writeString(outs, "GIF89a");
-
- // Write out the screen width and height
- Putword(Width, outs);
- Putword(Height, outs);
-
- // Indicate that there is a global colour map
- B = (byte) 0x80; // Yes, there is a color map
- // OR in the resolution
- B |= (byte) ((8 - 1) << 4);
- // Not sorted
- // OR in the Bits per Pixel
- B |= (byte) ((BitsPerPixel - 1));
-
- // Write it out
- Putbyte(B, outs);
-
- // Write out the Background colour
- Putbyte(Background, outs);
-
- // Pixel aspect ratio - 1:1.
- //Putbyte( (byte) 49, outs );
- // Java's GIF reader currently has a bug, if the aspect ratio byte is
- // not zero it throws an ImageFormatException. It doesn't know that
- // 49 means a 1:1 aspect ratio. Well, whatever, zero works with all
- // the other decoders I've tried so it probably doesn't hurt.
- Putbyte((byte) 0, outs);
-
- // Write out the Global Colour Map
- for (i = 0; i < ColorMapSize; ++i) {
- Putbyte(Red[i], outs);
- Putbyte(Green[i], outs);
- Putbyte(Blue[i], outs);
- }
-
- // Write out extension for transparent colour index, if necessary.
- if (Transparent != -1) {
- Putbyte((byte) '!', outs);
- Putbyte((byte) 0xf9, outs);
- Putbyte((byte) 4, outs);
- Putbyte((byte) 1, outs);
- Putbyte((byte) 0, outs);
- Putbyte((byte) 0, outs);
- Putbyte((byte) Transparent, outs);
- Putbyte((byte) 0, outs);
- }
-
- // Write an Image separator
- Putbyte((byte) ',', outs);
-
- // Write the Image header
- Putword(LeftOfs, outs);
- Putword(TopOfs, outs);
- Putword(Width, outs);
- Putword(Height, outs);
-
- // Write out whether or not the image is interlaced
- if (Interlace)
- Putbyte((byte) 0x40, outs);
- else
- Putbyte((byte) 0x00, outs);
-
- // Write out the initial code size
- Putbyte((byte) InitCodeSize, outs);
-
- // Go and actually compress the data
- compress(InitCodeSize + 1, outs);
-
- // Write out a Zero-length packet (to end the series)
- Putbyte((byte) 0, outs);
-
- // Write the GIF file terminator
- Putbyte((byte) ';', outs);
- }
-
- static final int EOF = -1;
-
- // Return the next pixel from the image
- int GIFNextPixel() throws IOException {
- if (pixelIndex == numPixels)
- return EOF;
- else
- return ((byte[]) pixels)[pixelIndex++] & 0xff;
- }
-
- // Write out a word to the GIF file
- void Putword(int w, OutputStream outs) throws IOException {
- Putbyte((byte) (w & 0xff), outs);
- Putbyte((byte) ((w >> 8) & 0xff), outs);
- }
-
- // Write out a byte to the GIF file
- void Putbyte(byte b, OutputStream outs) throws IOException {
- outs.write(b);
- }
-
- // GIFCOMPR.C - GIF Image compression routines
- //
- // Lempel-Ziv compression based on 'compress'. GIF modifications by
- // David Rowley (mgardi(a)watdcsu.waterloo.edu)
-
- // General DEFINEs
-
- static final int BITS = 12;
-
- static final int HSIZE = 5003; // 80% occupancy
-
- // GIF Image compression - modified 'compress'
- //
- // Based on: compress.c - File compression ala IEEE Computer, June 1984.
- //
- // By Authors: Spencer W. Thomas (decvax!harpo!utah-cs!utah-gr!thomas)
- // Jim McKie (decvax!mcvax!jim)
- // Steve Davies (decvax!vax135!petsd!peora!srd)
- // Ken Turkowski (decvax!decwrl!turtlevax!ken)
- // James A. Woods (decvax!ihnp4!ames!jaw)
- // Joe Orost (decvax!vax135!petsd!joe)
-
- int n_bits; // number of bits/code
-
- int maxbits = BITS; // user settable max # bits/code
-
- int maxcode; // maximum code, given n_bits
-
- int maxmaxcode = 1 << BITS; // should NEVER generate this code
-
- final int MAXCODE(int n_bits) {
- return (1 << n_bits) - 1;
- }
-
- int[] htab = new int[HSIZE];
-
- int[] codetab = new int[HSIZE];
-
- int hsize = HSIZE; // for dynamic table sizing
-
- int free_ent = 0; // first unused entry
-
- // block compression parameters -- after all codes are used up,
- // and compression rate changes, start over.
- boolean clear_flg = false;
-
- // Algorithm: use open addressing double hashing (no chaining) on the
- // prefix code / next character combination. We do a variant of Knuth's
- // algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime
- // secondary probe. Here, the modular division first probe is gives way
- // to a faster exclusive-or manipulation. Also do block compression with
- // an adaptive reset, whereby the code table is cleared when the compression
- // ratio decreases, but after the table fills. The variable-length output
- // codes are re-sized at this point, and a special CLEAR code is generated
- // for the decompressor. Late addition: construct the table according to
- // file size for noticeable speed improvement on small files. Please direct
- // questions about this implementation to ames!jaw.
-
- int g_init_bits;
-
- int ClearCode;
-
- int EOFCode;
-
- void compress(int init_bits, OutputStream outs) throws IOException {
- int fcode;
- int i /* = 0 */;
- int c;
- int ent;
- int disp;
- int hsize_reg;
- int hshift;
-
- // Set up the globals: g_init_bits - initial number of bits
- g_init_bits = init_bits;
-
- // Set up the necessary values
- clear_flg = false;
- n_bits = g_init_bits;
- maxcode = MAXCODE(n_bits);
-
- ClearCode = 1 << (init_bits - 1);
- EOFCode = ClearCode + 1;
- free_ent = ClearCode + 2;
-
- char_init();
-
- ent = GIFNextPixel();
-
- hshift = 0;
- for (fcode = hsize; fcode < 65536; fcode *= 2)
- ++hshift;
- hshift = 8 - hshift; // set hash code range bound
-
- hsize_reg = hsize;
- cl_hash(hsize_reg); // clear hash table
-
- output(ClearCode, outs);
-
- outer_loop: while ((c = GIFNextPixel()) != EOF) {
- fcode = (c << maxbits) + ent;
- i = (c << hshift) ^ ent; // xor hashing
-
- if (htab[i] == fcode) {
- ent = codetab[i];
- continue;
- } else if (htab[i] >= 0) // non-empty slot
- {
- disp = hsize_reg - i; // secondary hash (after G. Knott)
- if (i == 0)
- disp = 1;
- do {
- if ((i -= disp) < 0)
- i += hsize_reg;
-
- if (htab[i] == fcode) {
- ent = codetab[i];
- continue outer_loop;
- }
- } while (htab[i] >= 0);
- }
- output(ent, outs);
- ent = c;
- if (free_ent < maxmaxcode) {
- codetab[i] = free_ent++; // code -> hashtable
- htab[i] = fcode;
- } else
- cl_block(outs);
- }
- // Put out the final code.
- output(ent, outs);
- output(EOFCode, outs);
- }
-
- // output
- //
- // Output the given code.
- // Inputs:
- // code: A n_bits-bit integer. If == -1, then EOF. This assumes
- // that n_bits =< wordsize - 1.
- // Outputs:
- // Outputs code to the file.
- // Assumptions:
- // Chars are 8 bits long.
- // Algorithm:
- // Maintain a BITS character long buffer (so that 8 codes will
- // fit in it exactly). Use the VAX insv instruction to insert each
- // code in turn. When the buffer fills up empty it and start over.
-
- int cur_accum = 0;
-
- int cur_bits = 0;
-
- int masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F,
- 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF,
- 0x7FFF, 0xFFFF };
-
- void output(int code, OutputStream outs) throws IOException {
- cur_accum &= masks[cur_bits];
-
- if (cur_bits > 0)
- cur_accum |= (code << cur_bits);
- else
- cur_accum = code;
-
- cur_bits += n_bits;
-
- while (cur_bits >= 8) {
- char_out((byte) (cur_accum & 0xff), outs);
- cur_accum >>= 8;
- cur_bits -= 8;
- }
-
- // If the next entry is going to be too big for the code size,
- // then increase it, if possible.
- if (free_ent > maxcode || clear_flg) {
- if (clear_flg) {
- maxcode = MAXCODE(n_bits = g_init_bits);
- clear_flg = false;
- } else {
- ++n_bits;
- if (n_bits == maxbits)
- maxcode = maxmaxcode;
- else
- maxcode = MAXCODE(n_bits);
- }
- }
-
- if (code == EOFCode) {
- // At EOF, write the rest of the buffer.
- while (cur_bits > 0) {
- char_out((byte) (cur_accum & 0xff), outs);
- cur_accum >>= 8;
- cur_bits -= 8;
- }
-
- flush_char(outs);
- }
- }
-
- // Clear out the hash table
-
- // table clear for block compress
- void cl_block(OutputStream outs) throws IOException {
- cl_hash(hsize);
- free_ent = ClearCode + 2;
- clear_flg = true;
-
- output(ClearCode, outs);
- }
-
- // reset code table
- void cl_hash(int hsize) {
- for (int i = 0; i < hsize; ++i)
- htab[i] = -1;
- }
-
- // GIF Specific routines
-
- // Number of characters so far in this 'packet'
- int a_count;
-
- // Set up the 'byte output' routine
- void char_init() {
- a_count = 0;
- }
-
- // Define the storage for the packet accumulator
- byte[] accum = new byte[256];
-
- // Add a character to the end of the current packet, and if it is 254
- // characters, flush the packet to disk.
- void char_out(byte c, OutputStream outs) throws IOException {
- accum[a_count++] = c;
- if (a_count >= 254)
- flush_char(outs);
- }
-
- // Flush the packet to disk, and reset the accumulator
- void flush_char(OutputStream outs) throws IOException {
- if (a_count > 0) {
- outs.write(a_count);
- outs.write(accum, 0, a_count);
- a_count = 0;
- }
- }
-
-}
-
-class GifEncoderHashitem {
- public int rgb;
- public int count;
- public int index;
- public boolean isTransparent;
-
- public GifEncoderHashitem(int rgb, int count, int index,
- boolean isTransparent) {
- this.rgb = rgb;
- this.count = count;
- this.index = index;
- this.isTransparent = isTransparent;
- }
-
-}
Added:
root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/NumericDataInputStream.java
===================================================================
--- root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/NumericDataInputStream.java
(rev 0)
+++
root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/NumericDataInputStream.java 2009-07-22
23:38:22 UTC (rev 14978)
@@ -0,0 +1,108 @@
+/**
+ * License Agreement.
+ *
+ * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.ajax4jsf.util;
+
+import java.awt.Color;
+import java.io.ByteArrayInputStream;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Original idea by Igor Shabalov
+ *
+ * @author Nick Belaevski
+ * @since 4.0
+ */
+public class NumericDataInputStream {
+
+ static final int BYTES_IN_INT = Integer.SIZE >> 3;
+
+ static final int BYTES_IN_SHORT = Short.SIZE >> 3;
+
+ static final int BYTES_IN_COLOR = BYTES_IN_INT - 1;
+
+ //the size of maximum object in bytes that this stream can operate (int)
+ static final int MAX_BYTES = BYTES_IN_INT;
+
+ static final ByteOrder BUFFER_BYTES_ORDER = ByteOrder.LITTLE_ENDIAN;
+
+ private ByteArrayInputStream byteArrayStream;
+
+ private byte[] bytes = new byte[MAX_BYTES];
+
+ private ByteBuffer buffer = ByteBuffer.wrap(bytes).order(BUFFER_BYTES_ORDER);
+
+ public NumericDataInputStream(byte[] buf, int offset, int length) {
+ super();
+
+ byteArrayStream = new ByteArrayInputStream(buf, offset, length);
+ }
+
+ public NumericDataInputStream(byte[] buf) {
+ super();
+
+ byteArrayStream = new ByteArrayInputStream(buf);
+ }
+
+ public byte readByte() {
+ int read = byteArrayStream.read();
+ if (read >= 0) {
+ return (byte) read;
+ } else {
+ throw new IllegalStateException("Data is invalid or corrupted");
+ }
+ }
+
+ public short readShort() {
+ int read = byteArrayStream.read(bytes, 0, BYTES_IN_SHORT);
+ if (read == BYTES_IN_SHORT) {
+ buffer.rewind();
+ return buffer.asShortBuffer().get();
+ } else {
+ throw new IllegalStateException("Data is invalid or corrupted");
+ }
+ }
+
+ public int readInt() {
+ int read = byteArrayStream.read(bytes, 0, BYTES_IN_INT);
+ if (read == BYTES_IN_INT) {
+ buffer.rewind();
+ return buffer.asIntBuffer().get();
+ } else {
+ throw new IllegalStateException("Data is invalid or corrupted");
+ }
+ }
+
+ public int readIntColor() {
+ int read = byteArrayStream.read(bytes, 0, BYTES_IN_COLOR);
+ if (read == BYTES_IN_COLOR) {
+ buffer.rewind();
+ return buffer.asIntBuffer().get() & 0x00FFFFFF;
+ } else {
+ throw new IllegalStateException("Data is invalid or corrupted");
+ }
+ }
+
+ public Color readColor() {
+ return new Color(readIntColor());
+ }
+}
Added:
root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/NumericDataOutputStream.java
===================================================================
---
root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/NumericDataOutputStream.java
(rev 0)
+++
root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/NumericDataOutputStream.java 2009-07-22
23:38:22 UTC (rev 14978)
@@ -0,0 +1,80 @@
+/**
+ * License Agreement.
+ *
+ * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.ajax4jsf.util;
+
+import java.awt.Color;
+import java.io.ByteArrayOutputStream;
+import java.nio.ByteBuffer;
+import static org.ajax4jsf.util.NumericDataInputStream.*;
+
+/**
+ * Original idea by Igor Shabalov
+ *
+ * @author Nick Belaevski
+ * @since 4.0
+ */
+public class NumericDataOutputStream {
+
+ private ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
+
+ private byte[] bytes = new byte[MAX_BYTES];
+
+ private ByteBuffer buffer = ByteBuffer.wrap(bytes)
+ .order(BUFFER_BYTES_ORDER);
+
+ public NumericDataOutputStream writeByte(byte value) {
+ byteStream.write(value);
+ return this;
+ }
+
+ public NumericDataOutputStream writeShort(short value) {
+ buffer.rewind();
+ buffer.asShortBuffer().put(value);
+ byteStream.write(bytes, 0, BYTES_IN_SHORT);
+ return this;
+ }
+
+ private void writeInteger(int value, int numBytes) {
+ buffer.rewind();
+ buffer.asIntBuffer().put(value);
+ byteStream.write(bytes, 0, numBytes);
+ }
+
+ public NumericDataOutputStream writeInt(int value) {
+ writeInteger(value, BYTES_IN_INT);
+ return this;
+ }
+
+ public NumericDataOutputStream writeIntColor(int value) {
+ writeInteger(value, BYTES_IN_COLOR);
+ return this;
+ }
+
+ public NumericDataOutputStream writeColor(Color value) {
+ writeIntColor(value.getRGB());
+ return this;
+ }
+
+ public byte[] getBytes() {
+ return byteStream.toByteArray();
+ }
+}
Modified: root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/Zipper.java
===================================================================
--- root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/Zipper.java 2009-07-22
16:39:10 UTC (rev 14977)
+++ root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/Zipper.java 2009-07-22
23:38:22 UTC (rev 14978)
@@ -20,6 +20,7 @@
*/
package org.ajax4jsf.util;
+@Deprecated
public class Zipper {
public static void zip(byte[] buf, int value, int offset) {
buf[offset] = (byte)(value & 0x0ff);
Modified: root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/Zipper2.java
===================================================================
--- root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/Zipper2.java 2009-07-22
16:39:10 UTC (rev 14977)
+++ root/framework/trunk/impl/src/main/java/org/ajax4jsf/util/Zipper2.java 2009-07-22
23:38:22 UTC (rev 14978)
@@ -32,7 +32,7 @@
* @author Nick Belaevski
* @since 3.1
*/
-
+@Deprecated
public class Zipper2 {
private byte[] buffer;
Added:
root/framework/trunk/impl/src/main/java/org/richfaces/resource/AnimatedTestResource.java
===================================================================
---
root/framework/trunk/impl/src/main/java/org/richfaces/resource/AnimatedTestResource.java
(rev 0)
+++
root/framework/trunk/impl/src/main/java/org/richfaces/resource/AnimatedTestResource.java 2009-07-22
23:38:22 UTC (rev 14978)
@@ -0,0 +1,167 @@
+/**
+ * License Agreement.
+ *
+ * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.richfaces.resource;
+
+import java.awt.Color;
+import java.awt.GradientPaint;
+import java.awt.Graphics2D;
+import java.awt.GraphicsEnvironment;
+import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Iterator;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageTypeSpecifier;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.metadata.IIOMetadataNode;
+import javax.imageio.stream.ImageOutputStream;
+
+import org.w3c.dom.Node;
+
+public class AnimatedTestResource extends TestResource2 {
+
+ private int FRAMES_COUNT = 10;
+
+ private int delayTime = 500;
+
+ private ImageWriter getImageWriter() {
+ ImageWriter result = null;
+
+ Iterator<ImageWriter> imageWriters =
ImageIO.getImageWritersByFormatName("gif");
+ while (imageWriters.hasNext() && result == null) {
+ ImageWriter imageWriter = imageWriters.next();
+ if (imageWriter.canWriteSequence()) {
+ result = imageWriter;
+ }
+ }
+
+ return result;
+ }
+
+ private static Node getOrCreateChild(Node root, String name) {
+ Node result = null;
+
+ for (Node node = root.getFirstChild(); node != null && result == null; node
= node.getNextSibling()) {
+ if (name.equals(node.getNodeName())) {
+ result = node;
+ }
+ }
+
+ if (result == null) {
+ result = new IIOMetadataNode(name);
+ root.appendChild(result);
+ }
+
+ return result;
+ }
+
+ @Override
+ public String getContentType() {
+ return "image/gif";
+ }
+
+ @Override
+ public InputStream getInputStream() {
+ GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
+ BufferedImage image = new BufferedImage(dimension.width, dimension.height,
ColorSpace.TYPE_RGB);
+ Graphics2D g2d = environment.createGraphics(image);
+
+ ImageWriter sequenceCapableImageWriter = getImageWriter();
+ if (sequenceCapableImageWriter == null) {
+ throw new IllegalStateException("No sequence-capable image writers exit");
+ }
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ImageOutputStream imageOutputStream = null;;
+
+ try {
+ imageOutputStream = ImageIO.createImageOutputStream(baos);
+ sequenceCapableImageWriter.setOutput(imageOutputStream);
+ ImageWriteParam defaultImageWriteParam =
sequenceCapableImageWriter.getDefaultWriteParam();
+ ImageTypeSpecifier imageTypeSpecifier =
ImageTypeSpecifier.createFromBufferedImageType(image.getType());
+ IIOMetadata imageMetaData = sequenceCapableImageWriter.
+ getDefaultImageMetadata(imageTypeSpecifier, defaultImageWriteParam);
+
+ String metaFormatName = imageMetaData.getNativeMetadataFormatName();
+ Node root = imageMetaData.getAsTree(metaFormatName);
+ IIOMetadataNode graphicsControlExtensionNode = (IIOMetadataNode)
getOrCreateChild(root, "GraphicControlExtension");
+
+ //
http://java.sun.com/javase/6/docs/api/javax/imageio/metadata/doc-files/gi...
+ graphicsControlExtensionNode.setAttribute("disposalMethod",
"none");
+ graphicsControlExtensionNode.setAttribute("userInputFlag",
"FALSE");
+ graphicsControlExtensionNode.setAttribute("transparentColorFlag",
"FALSE");
+ graphicsControlExtensionNode.setAttribute("delayTime",
+ Integer.toString(delayTime / 10));
+ graphicsControlExtensionNode.setAttribute("transparentColorIndex",
"0");
+
+ boolean loopContinuously = false;
+ Node applicationExtensionsNode = getOrCreateChild(root,
"ApplicationExtensions");
+ IIOMetadataNode netscapeExtension = new
IIOMetadataNode("ApplicationExtension");
+
+ netscapeExtension.setAttribute("applicationID", "NETSCAPE");
+ netscapeExtension.setAttribute("authenticationCode", "2.0");
+
+ byte numLoops = (byte) (loopContinuously ? 0x0 : 0x1);
+ netscapeExtension.setUserObject(new byte[] {0x1, numLoops, 0x0});
+ applicationExtensionsNode.appendChild(netscapeExtension);
+
+ imageMetaData.setFromTree(metaFormatName, root);
+
+ sequenceCapableImageWriter.prepareWriteSequence(null);
+
+ for (int i = 1; i <= FRAMES_COUNT; i++) {
+ g2d.setPaint(new GradientPaint(0, i * dimension.height / FRAMES_COUNT, Color.WHITE,
0, dimension.height, color));
+ g2d.fillRect(0, 0, dimension.width, dimension.height);
+
+ sequenceCapableImageWriter.writeToSequence(new IIOImage(image, null, imageMetaData),
+ defaultImageWriteParam);
+ }
+
+ sequenceCapableImageWriter.endWriteSequence();
+
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } finally {
+ if (imageOutputStream != null) {
+ try {
+ imageOutputStream.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ g2d.dispose();
+ sequenceCapableImageWriter.dispose();
+ }
+
+ return new ByteArrayInputStream(baos.toByteArray());
+ }
+
+}
Modified:
root/framework/trunk/impl/src/main/java/org/richfaces/resource/TestResource2.java
===================================================================
---
root/framework/trunk/impl/src/main/java/org/richfaces/resource/TestResource2.java 2009-07-22
16:39:10 UTC (rev 14977)
+++
root/framework/trunk/impl/src/main/java/org/richfaces/resource/TestResource2.java 2009-07-22
23:38:22 UTC (rev 14978)
@@ -39,14 +39,15 @@
import javax.imageio.ImageIO;
import org.ajax4jsf.util.HtmlColor;
-import org.ajax4jsf.util.Zipper2;
+import org.ajax4jsf.util.NumericDataInputStream;
+import org.ajax4jsf.util.NumericDataOutputStream;
import org.richfaces.VersionBean;
import org.richfaces.skin.Skin;
import org.richfaces.skin.SkinFactory;
public class TestResource2 extends AbstractBaseResource implements StateHolder {
- private Color color;
+ protected Color color;
public TestResource2() {
FacesContext context = FacesContext.getCurrentInstance();
@@ -60,7 +61,7 @@
return "image/png";
}
- private Dimension dimension = new Dimension(20, 150);
+ protected Dimension dimension = new Dimension(20, 150);
@Override
public InputStream getInputStream() {
@@ -92,15 +93,11 @@
public void restoreState(FacesContext context, Object state) {
byte[] bytes = (byte[]) state;
- this.color = new Zipper2(bytes).nextColor();
+ this.color = new NumericDataInputStream(bytes).readColor();
}
public Object saveState(FacesContext context) {
- byte[] bytes = new byte[3];
- Zipper2 zipper2 = new Zipper2(bytes);
-
- zipper2.addColor(color);
- return bytes;
+ return new NumericDataOutputStream().writeColor(color).getBytes();
}
public void setTransient(boolean newTransientValue) {
Added:
root/framework/trunk/impl/src/main/resources/META-INF/org.richfaces.resource.AnimatedTestResource.resource.properties
===================================================================
Copied: root/framework/trunk/impl/src/test/java/org/ajax4jsf/util/NumericStreamsTest.java
(from rev 14972,
root/framework/trunk/impl/src/test/java/org/ajax4jsf/util/Zipper2Test.java)
===================================================================
--- root/framework/trunk/impl/src/test/java/org/ajax4jsf/util/NumericStreamsTest.java
(rev 0)
+++
root/framework/trunk/impl/src/test/java/org/ajax4jsf/util/NumericStreamsTest.java 2009-07-22
23:38:22 UTC (rev 14978)
@@ -0,0 +1,75 @@
+/**
+ * License Agreement.
+ *
+ * JBoss RichFaces - Ajax4jsf Component Library
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.ajax4jsf.util;
+
+import java.awt.Color;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Nick Belaevski
+ * @since 4.0
+ */
+
+public class NumericStreamsTest extends TestCase {
+
+ public void testByte() throws Exception {
+ byte[] bytes = new NumericDataOutputStream().writeByte((byte) 0xDF).writeByte((byte)
0x90).
+ writeByte((byte) 0xAA).getBytes();
+
+ NumericDataInputStream inputStream = new NumericDataInputStream(bytes);
+ assertEquals((byte) 0xDF, inputStream.readByte());
+ assertEquals((byte) 0x90, inputStream.readByte());
+ assertEquals((byte) 0xAA, inputStream.readByte());
+ }
+
+ public void testShort() throws Exception {
+ byte[] bytes = new NumericDataOutputStream().writeShort((short)
0xA7DF).writeShort((short) 0xFE90).
+ writeShort((short) 0x34AA).getBytes();
+
+ NumericDataInputStream inputStream = new NumericDataInputStream(bytes);
+ assertEquals((short) 0xA7DF, inputStream.readShort());
+ assertEquals((short) 0xFE90, inputStream.readShort());
+ assertEquals((short) 0x34AA, inputStream.readShort());
+ }
+
+ public void testColor() throws Exception {
+ byte[] bytes = new NumericDataOutputStream().writeColor(new Color(0xA7DFE0)).
+ writeIntColor(0xE2349A).writeColor(new Color(0x4812F9)).getBytes();
+
+ NumericDataInputStream inputStream = new NumericDataInputStream(bytes);
+ assertEquals(0xA7DFE0, inputStream.readIntColor());
+ assertEquals(new Color(0xE2349A), inputStream.readColor());
+ assertEquals(0x4812F9, inputStream.readIntColor());
+ }
+
+ public void testInt() throws Exception {
+ byte[] bytes = new
NumericDataOutputStream().writeInt(0x12A7DFE0).writeInt(0x67E2349A).
+ writeInt(0xBD4812F9).getBytes();
+
+ NumericDataInputStream inputStream = new NumericDataInputStream(bytes);
+ assertEquals(0x12A7DFE0, inputStream.readInt());
+ assertEquals(0x67E2349A, inputStream.readInt());
+ assertEquals(0xBD4812F9, inputStream.readInt());
+ }
+
+}
Deleted: root/framework/trunk/impl/src/test/java/org/ajax4jsf/util/Zipper2Test.java
===================================================================
--- root/framework/trunk/impl/src/test/java/org/ajax4jsf/util/Zipper2Test.java 2009-07-22
16:39:10 UTC (rev 14977)
+++ root/framework/trunk/impl/src/test/java/org/ajax4jsf/util/Zipper2Test.java 2009-07-22
23:38:22 UTC (rev 14978)
@@ -1,98 +0,0 @@
-/**
- * License Agreement.
- *
- * JBoss RichFaces - Ajax4jsf Component Library
- *
- * Copyright (C) 2007 Exadel, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-package org.ajax4jsf.util;
-
-import java.awt.Color;
-import java.util.Arrays;
-
-import junit.framework.TestCase;
-
-/**
- *
- * <br /><br />
- *
- * Created 21.08.2007
- * @author Nick Belaevski
- * @since 3.1
- */
-
-public class Zipper2Test extends TestCase {
-
- /* (non-Javadoc)
- * @see junit.framework.TestCase#setUp()
- */
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- /* (non-Javadoc)
- * @see junit.framework.TestCase#tearDown()
- */
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- public void testByte() throws Exception {
- byte[] b = new byte[3];
- new Zipper2(b).addByte((byte) 0xDF).addByte((byte) 0x90).addByte((byte) 0xAA);
- Zipper2 zipper2 = new Zipper2(b);
- assertEquals((byte) 0xDF, zipper2.nextByte());
- assertEquals((byte) 0x90, zipper2.nextByte());
- assertEquals((byte) 0xAA, zipper2.nextByte());
- }
-
- public void testShort() throws Exception {
- byte[] b = new byte[6];
- new Zipper2(b).addShort((short) 0xA7DF).addShort((short) 0xFE90).addShort((short)
0x34AA);
- Zipper2 zipper2 = new Zipper2(b);
- assertEquals((short) 0xA7DF, zipper2.nextShort());
- assertEquals((short) 0xFE90, zipper2.nextShort());
- assertEquals((short) 0x34AA, zipper2.nextShort());
- }
-
- public void testColor() throws Exception {
- byte[] b = new byte[9];
- new Zipper2(b).addColor(new Color(0xA7DFE0)).addColor(0xE2349A).addColor(new
Color(0x4812F9));
- Zipper2 zipper2 = new Zipper2(b);
- assertEquals(0xA7DFE0, zipper2.nextIntColor());
- assertEquals(new Color(0xE2349A), zipper2.nextColor());
- assertEquals(0x4812F9, zipper2.nextIntColor());
- }
-
- public void testInt() throws Exception {
- byte[] b = new byte[12];
- new Zipper2(b).addInt(0x12A7DFE0).addInt(0x67E2349A).addInt(0xBD4812F9);
- Zipper2 zipper2 = new Zipper2(b);
- assertEquals(0x12A7DFE0, zipper2.nextInt());
- assertEquals(0x67E2349A, zipper2.nextInt());
- assertEquals(0xBD4812F9, zipper2.nextInt());
- }
-
- public void testBytes() throws Exception {
- byte[] b = new byte[6];
- byte[] bs = new byte[] {(byte) 0x98, (byte) 0x63};
- new Zipper2(b).addInt(0x08FECDB6).addBytes(bs);
- Zipper2 zipper2 = new Zipper2(b);
- assertEquals(0x08FECDB6, zipper2.nextInt());
- assertTrue(Arrays.equals(bs, zipper2.nextBytes()));
- }
-}