You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by py...@apache.org on 2006/10/19 12:27:14 UTC
svn commit: r465556 - in
/incubator/harmony/enhanced/classlib/trunk/modules/archive/src:
main/java/java/util/zip/
main/java/org/apache/harmony/archive/internal/pack200/
test/java/org/apache/harmony/archive/tests/internal/pack200/
Author: pyang
Date: Thu Oct 19 03:27:10 2006
New Revision: 465556
URL: http://svn.apache.org/viewvc?view=rev&rev=465556
Log:
Apply patch for HARMONY-1871([classlib][pack200] Ongoing improvements to pack200; work-in-progress)
Added:
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/AttributeLayout.java (with props)
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/AttributeLayoutMap.java (with props)
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassConstantPool.java (with props)
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassFile.java (with props)
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassFileEntry.java (with props)
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ConstantPoolEntry.java (with props)
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AttributeLayoutMapTest.java (with props)
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AttributeLayoutTest.java (with props)
Modified:
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/java/util/zip/InflaterInputStream.java
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/BHSDCodec.java
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/Codec.java
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/CodecEncoding.java
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/Pack200Exception.java
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/PopulationCodec.java
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/RunCodec.java
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/Segment.java
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/SegmentOptions.java
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AllTests.java
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/CodecEncodingTest.java
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/CodecTest.java
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/HelloWorld.java
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/PopulationCodecTest.java
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/SegmentOptionsTest.java
incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/SegmentTest.java
Modified: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/java/util/zip/InflaterInputStream.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/java/util/zip/InflaterInputStream.java?view=diff&rev=465556&r1=465555&r2=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/java/util/zip/InflaterInputStream.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/java/util/zip/InflaterInputStream.java Thu Oct 19 03:27:10 2006
@@ -258,8 +258,8 @@
* of no use
*/
@Override
- public void mark(@SuppressWarnings("unused")
- int readlimit) {
+ @SuppressWarnings("unused")
+ public void mark(int readlimit) {
// do nothing
}
Added: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/AttributeLayout.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/AttributeLayout.java?view=auto&rev=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/AttributeLayout.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/AttributeLayout.java Thu Oct 19 03:27:10 2006
@@ -0,0 +1,198 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.harmony.archive.internal.pack200;
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
+import org.apache.harmony.archive.internal.pack200.Segment.SegmentConstantPool;
+
+public class AttributeLayout {
+ static class Key {
+ public Key(String name, int context) throws Pack200Exception {
+ if (name == null || name.length() == 0)
+ throw new Pack200Exception("Cannot have an unnamed layout");
+ if (context != CONTEXT_CLASS && context != CONTEXT_CODE
+ && context != CONTEXT_FIELD && context != CONTEXT_METHOD)
+ throw new Pack200Exception("Attribute context out of range: "
+ + context);
+ this.name = name;
+ this.context = context;
+
+ }
+
+ private int context;
+
+ private String name;
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = PRIME * result + context;
+ result = PRIME * result + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final Key other = (Key) obj;
+ if (context != other.context)
+ return false;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ return true;
+ }
+
+ public String toString() {
+ return contextNames[context] + ": " + name;
+ }
+
+ }
+
+ private String layout;
+
+ Key key;
+
+ private long mask;
+
+ public static final int CONTEXT_CODE = 1 << 4;
+
+ public static final int CONTEXT_CLASS = 1 << 0;
+
+ public static final int CONTEXT_FIELD = 1 << 2;
+
+ public static final int CONTEXT_METHOD = 1 << 3;
+
+ private static final String[] contextNames = { "Class", "Field", "Method",
+ "Code", };
+
+ public Codec getCodec() {
+ if (layout.indexOf("O") >= 0) {
+ return Codec.BRANCH5;
+ } else if (layout.indexOf("P") >= 0) {
+ return Codec.BCI5;
+ } else if (layout.indexOf("S") >= 0 && layout.indexOf("KS") < 0
+ && layout.indexOf("RS") < 0) {
+ return Codec.SIGNED5;
+ } else if (layout.indexOf("B") >= 0) {
+ return Codec.BYTE1;
+ }
+ /*
+ * TODO Add this as a test (and don't commit since this is copyright
+ * text) && ) If the layout contains 'O', use BRANCH5. Otherwise, if the
+ * layout contains 'P', use BCI5. Otherwise, if the layout contains 'S'
+ * but not 'KS' or 'RS', use SIGNED5. Otherwise, if the layout contains
+ * 'B', use BYTE1. For all other layouts use UNSIGNED5.
+ */
+ else {
+ return Codec.UNSIGNED5;
+ }
+ }
+
+ public Object getValue(long value, Segment segment) throws Pack200Exception {
+ if (layout.startsWith("R")) {
+ // references
+ if (layout.indexOf('N') != -1)
+ value--;
+ SegmentConstantPool pool = segment.getConstantPool();
+ if (layout.startsWith("RU")) {
+ return pool.getValue(SegmentConstantPool.UTF_8, value);
+ } else if (layout.startsWith("RS")) {
+ return pool.getValue(SegmentConstantPool.SIGNATURE, value);
+ }
+ }
+ throw new Pack200Exception("Unknown layout encoding: " + layout);
+ }
+
+ public AttributeLayout(String name, int context, String layout, int index)
+ throws Pack200Exception {
+ super();
+ this.key = new Key(name, context);
+ if (index >= 0) {
+ this.mask = 1L << index;
+ } else {
+ this.mask = 0;
+ }
+ if (layout == null) // || layout.length() == 0)
+ throw new Pack200Exception("Cannot have a null layout");
+ this.layout = layout;
+ }
+
+ public boolean isCode() {
+ return key.context == CONTEXT_CODE;
+ }
+
+ public boolean isClass() {
+ return key.context == CONTEXT_CLASS;
+ }
+
+ public boolean isMethod() {
+ return key.context == CONTEXT_METHOD;
+ }
+
+ public boolean isField() {
+ return key.context == CONTEXT_FIELD;
+ }
+
+ public int hashCode() {
+ return key.hashCode();
+ }
+
+ public boolean matches(long value) {
+ return (value & mask) != 0;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final AttributeLayout other = (AttributeLayout) obj;
+ if (key == null) {
+ if (other.key != null)
+ return false;
+ } else if (!key.equals(other.key))
+ return false;
+ if (layout == null) {
+ if (other.layout != null)
+ return false;
+ } else if (!layout.equals(other.layout))
+ return false;
+ return true;
+ }
+
+ public String toString() {
+ return key.toString();
+ }
+
+ public String getLayout() {
+ return layout;
+ }
+
+}
Propchange: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/AttributeLayout.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/AttributeLayoutMap.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/AttributeLayoutMap.java?view=auto&rev=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/AttributeLayoutMap.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/AttributeLayoutMap.java Thu Oct 19 03:27:10 2006
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.harmony.archive.internal.pack200;
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Stores a mapping from attribute names to their corresponding layout types.
+ * Note that names of attribute layouts and their formats are <emph>not</emph>
+ * internationalised, and should not be translated.
+ */
+public class AttributeLayoutMap {
+ // private static final String METADATA = "[NH[(1)]][RSHNH[RUH(1)]][TB(66,67,73,83,90)[KIH](68)[KDH](70)[KFH](74)[KJH](99)[RSH](101)[RSHRUH](115)[RUH](91)[NH[(0)]](64)[RSH[RUH(0)]]()[]]";
+
+ // create a whole bunch of AttributeLayouts here
+ private static AttributeLayout[] getDefaultAttributeLayouts()
+ throws Pack200Exception {
+ return new AttributeLayout[] {
+ new AttributeLayout("LineNumberTable",
+ AttributeLayout.CONTEXT_CODE, "NH[PHH]", 1),
+ new AttributeLayout("LocalVariableTable",
+ AttributeLayout.CONTEXT_CODE, "NH[PHOHRUHRSHH]", 2),
+ new AttributeLayout("LocalVariableTypeTable",
+ AttributeLayout.CONTEXT_CODE, "NH[PHOHRUHRSHH]", 3),
+ new AttributeLayout("SourceFile",
+ AttributeLayout.CONTEXT_CLASS, "RUNH", 17),
+ new AttributeLayout("ConstantValue",
+ AttributeLayout.CONTEXT_FIELD, "KQH", 17),
+ new AttributeLayout("Code", AttributeLayout.CONTEXT_METHOD,
+ "*", 17),
+ new AttributeLayout("EnclosingMethod",
+ AttributeLayout.CONTEXT_CLASS, "RCHRDNH", 18),
+ new AttributeLayout("Exceptions",
+ AttributeLayout.CONTEXT_METHOD, "NH[RCH]", 18),
+ new AttributeLayout("Signature", AttributeLayout.CONTEXT_CLASS,
+ "RSH", 19),
+ new AttributeLayout("Signature", AttributeLayout.CONTEXT_FIELD,
+ "RSH", 19),
+ new AttributeLayout("Signature",
+ AttributeLayout.CONTEXT_METHOD, "RSH", 19),
+ new AttributeLayout("Deprecated",
+ AttributeLayout.CONTEXT_CLASS, "", 20),
+ new AttributeLayout("Deprecated",
+ AttributeLayout.CONTEXT_FIELD, "", 20),
+ new AttributeLayout("Deprecated",
+ AttributeLayout.CONTEXT_METHOD, "", 20),
+ new AttributeLayout("RuntimeVisibleAnnotations",
+ AttributeLayout.CONTEXT_CLASS, "*", 21),
+ new AttributeLayout("RuntimeVisibleAnnotations",
+ AttributeLayout.CONTEXT_FIELD, "*", 21),
+ new AttributeLayout("RuntimeVisibleAnnotations",
+ AttributeLayout.CONTEXT_METHOD, "*", 21),
+ new AttributeLayout("RuntimeInvisibleAnnotations",
+ AttributeLayout.CONTEXT_CLASS, "*", 22),
+ new AttributeLayout("RuntimeInvisibleAnnotations",
+ AttributeLayout.CONTEXT_FIELD, "*", 22),
+ new AttributeLayout("RuntimeInvisibleAnnotations",
+ AttributeLayout.CONTEXT_METHOD, "*", 22),
+ new AttributeLayout("InnerClasses",
+ AttributeLayout.CONTEXT_CLASS, "*", 23),
+ new AttributeLayout("RuntimeVisibleParameterAnnotations",
+ AttributeLayout.CONTEXT_METHOD, "*", 23),
+ new AttributeLayout("class-file version",
+ AttributeLayout.CONTEXT_CLASS, "*", 24),
+ new AttributeLayout("RuntimeInvisibleParameterAnnotations",
+ AttributeLayout.CONTEXT_METHOD, "*", 24),
+ new AttributeLayout("AnnotationDefault",
+ AttributeLayout.CONTEXT_METHOD, "*", 25) };
+ }
+
+ private Map layouts;
+
+ public AttributeLayoutMap() throws Pack200Exception {
+ this.layouts = new HashMap();
+ AttributeLayout[] defaultAttributeLayouts = getDefaultAttributeLayouts();
+ for (int i = 0; i < defaultAttributeLayouts.length; i++) {
+ add(defaultAttributeLayouts[i]);
+ }
+ }
+
+ public void add(AttributeLayout layout) {
+ layouts.put(layout.key, layout);
+ }
+
+ public AttributeLayout getAttributeLayout(String name, int context)
+ throws Pack200Exception {
+ return (AttributeLayout) layouts.get(new AttributeLayout.Key(name,
+ context));
+ }
+}
Propchange: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/AttributeLayoutMap.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/BHSDCodec.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/BHSDCodec.java?view=diff&rev=465556&r1=465555&r2=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/BHSDCodec.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/BHSDCodec.java Thu Oct 19 03:27:10 2006
@@ -15,13 +15,13 @@
* limitations under the License.
*/
package org.apache.harmony.archive.internal.pack200;
-
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
-import org.apache.harmony.archive.internal.nls.Messages;
-
/**
* TODO Comment -- quite a lot can be nicked from Codec, since this was created
* from it
@@ -102,17 +102,17 @@
*/
public BHSDCodec(int b, int h, int s, int d) {
if (b < 1 || b > 5)
- throw new IllegalArgumentException(Messages.getString("archive.15")); //$NON-NLS-1$
+ throw new IllegalArgumentException("1<=b<=5");
if (h < 1 || h > 256)
- throw new IllegalArgumentException(Messages.getString("archive.16")); //$NON-NLS-1$
+ throw new IllegalArgumentException("1<=h<=256");
if (s < 0 || s > 2)
- throw new IllegalArgumentException(Messages.getString("archive.17")); //$NON-NLS-1$
+ throw new IllegalArgumentException("0<=s<=2");
if (d < 0 || d > 1)
- throw new IllegalArgumentException(Messages.getString("archive.18")); //$NON-NLS-1$
+ throw new IllegalArgumentException("0<=d<=1");
if (b == 1 && h != 256)
- throw new IllegalArgumentException(Messages.getString("archive.19")); //$NON-NLS-1$
+ throw new IllegalArgumentException("b=1 -> h=256");
if (h == 256 && b == 5)
- throw new IllegalArgumentException(Messages.getString("archive.1A")); //$NON-NLS-1$
+ throw new IllegalArgumentException("h=256 -> b!=5");
this.b = b;
this.h = h;
this.s = s;
@@ -129,15 +129,16 @@
public long cardinality() {
if (h > 1) {
return (long) (l * Math.pow(1 - h, b) / (1 - h) + Math.pow(h, b));
+ } else {
+ return (b * 255) + 1;
}
- return (b * 255) + 1;
}
@Override
public long decode(InputStream in) throws IOException, Pack200Exception {
if (d != 0)
throw new Pack200Exception(
- Messages.getString("archive.1B")); //$NON-NLS-1$
+ "Delta encoding used without passing in last value; this is a coding error");
return decode(in, 0);
}
@@ -150,7 +151,7 @@
do {
x = in.read();
if (x == -1)
- throw new EOFException(Messages.getString("archive.1C")); //$NON-NLS-1$
+ throw new EOFException("End of stream reached whilst decoding");
z += x * Math.pow(h, n);
} while (++n < b && x >= l);
// This looks more complicated than it is
@@ -215,7 +216,7 @@
} else if (s == 2) {
result = (3L * cardinality()) / 4 - 1;
} else {
- throw new Error(Messages.getString("archive.1D")); //$NON-NLS-1$
+ throw new Error("Unknown s value");
}
}
return Math.min((s == 0 ? ((long) Integer.MAX_VALUE) << 1
@@ -243,19 +244,18 @@
* Returns the codec in the form (1,256) or (1,64,1,1). Note that trailing
* zero fields are not shown.
*/
- @Override
- public String toString() {
+ public String toString() {
StringBuffer buffer = new StringBuffer(11);
buffer.append('(');
buffer.append(b);
buffer.append(',');
buffer.append(h);
if (s != 0 || d != 0) {
- buffer.append(","); //$NON-NLS-1$
+ buffer.append(',');
buffer.append(s);
}
if (d != 0) {
- buffer.append(","); //$NON-NLS-1$
+ buffer.append(',');
buffer.append(d);
}
buffer.append(')');
Added: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassConstantPool.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassConstantPool.java?view=auto&rev=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassConstantPool.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassConstantPool.java Thu Oct 19 03:27:10 2006
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.harmony.archive.internal.pack200;
+
+// NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+// NOTE: Do not extract strings as messages; this code is still a
+// work-in-progress
+// NOTE: Also, don't get rid of 'else' statements for the hell of it ...
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class ClassConstantPool {
+ private List others = new ArrayList();
+
+ private List entries = new ArrayList();
+
+ public void add(ClassFileEntry entry) {
+ // TODO this should be a set - we don't want duplicates
+ // Only add in constant pools, but resolve all types since they may
+ // introduce new constant pool entries
+ if (entry instanceof ConstantPoolEntry) {
+ if (!entries.contains(entry))
+ entries.add(entry);
+ } else {
+ if (!others.contains(entry))
+ others.add(entry);
+ }
+ ClassFileEntry[] nestedEntries = entry.getNestedClassFileEntries();
+ for (int i = 0; i < nestedEntries.length; i++) {
+ add(nestedEntries[i]);
+ }
+ }
+
+ public int indexOf(ClassFileEntry entry) {
+ return entries.indexOf(entry) + 1;
+ }
+
+ public int size() {
+ return entries.size();
+ }
+
+ public ClassFileEntry get(int i) {
+ return (ClassFileEntry) entries.get(--i);
+ }
+
+ public void resolve() {
+ Iterator it = entries.iterator();
+ while (it.hasNext()) {
+ ClassFileEntry entry = (ClassFileEntry) it.next();
+ entry.resolve(this);
+ }
+ it = others.iterator();
+ while (it.hasNext()) {
+ ClassFileEntry entry = (ClassFileEntry) it.next();
+ entry.resolve(this);
+ }
+ }
+
+}
Propchange: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassConstantPool.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassFile.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassFile.java?view=auto&rev=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassFile.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassFile.java Thu Oct 19 03:27:10 2006
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.harmony.archive.internal.pack200;
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+import org.apache.harmony.archive.internal.pack200.ClassFileEntry.Attribute;
+
+public class ClassFile {
+ int major;
+ int minor;
+ private int magic = 0xCAFEBABE;
+ ClassConstantPool pool = new ClassConstantPool();
+ int accessFlags;
+ int thisClass;
+ int superClass;
+ int[] interfaces;
+ int[] fields;
+ int[] methods;
+ Attribute[] attributes;
+ public void write(DataOutputStream dos) throws IOException {
+ dos.writeInt(magic);
+ dos.writeShort(minor);
+ dos.writeShort(major);
+ dos.writeShort(pool.size()+1);
+ for(int i=1;i<=pool.size();i++) {
+ ConstantPoolEntry entry;
+ (entry = (ConstantPoolEntry)pool.get(i)).write(dos);
+ // Doubles and longs take up two spaces in the pool, but only one gets written
+ if (entry.getTag() == ConstantPoolEntry.CP_Double || entry.getTag() == ConstantPoolEntry.CP_Long)
+ i++;
+ };
+ dos.writeShort(accessFlags);
+ dos.writeShort(thisClass);
+ dos.writeShort(superClass);
+ dos.writeShort(interfaces.length);
+ for(int i=0;i<interfaces.length;i++) {
+ dos.writeShort(interfaces[i]);
+ }
+ dos.writeShort(fields.length);
+ for(int i=0;i<fields.length;i++) {
+ // dos.write
+ // write field info
+ }
+ dos.writeShort(methods.length);
+ for(int i=0;i<fields.length;i++) {
+ // write method info
+ }
+ dos.writeShort(attributes.length);
+ for(int i=0;i<attributes.length;i++) {
+ Attribute a = attributes[i];
+ a.write(dos);
+ }
+ }
+}
Propchange: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassFile.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassFileEntry.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassFileEntry.java?view=auto&rev=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassFileEntry.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassFileEntry.java Thu Oct 19 03:27:10 2006
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.harmony.archive.internal.pack200;
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+import org.apache.harmony.archive.internal.pack200.ConstantPoolEntry.UTF8;
+
+
+public abstract class ClassFileEntry {
+ static abstract class Attribute extends ClassFileEntry {
+ public Attribute(String attributeName) {
+ this.attributeName = new UTF8(attributeName);
+ }
+ private UTF8 attributeName;
+ private int attributeNameIndex;
+ protected UTF8 getAttributeName() {
+ return attributeName;
+ }
+ protected void resolve(ClassConstantPool pool) {
+ super.resolve(pool);
+ attributeNameIndex = pool.indexOf(attributeName);
+ }
+ protected abstract int getLength();
+ public void write(DataOutputStream dos) throws IOException {
+ dos.writeShort(attributeNameIndex);
+ dos.writeInt(getLength());
+ writeBody(dos);
+ }
+ protected abstract void writeBody(DataOutputStream dos) throws IOException;
+
+ }
+ static class SourceFile extends Attribute {
+ private UTF8 name;
+ public int nameIndex;
+ public SourceFile(String name) {
+ super("SourceFile"); //$NON-NLS-1$
+ this.name = new UTF8(name);
+ }
+
+ protected ClassFileEntry[] getNestedClassFileEntries() {
+ return new ClassFileEntry[] { getAttributeName(), name };
+ }
+ protected void resolve(ClassConstantPool pool) {
+ super.resolve(pool);
+ nameIndex = pool.indexOf(name);
+ }
+ protected void writeBody(DataOutputStream dos) throws IOException {
+ dos.writeShort(nameIndex);
+ }
+
+ @Override
+ protected int getLength() {
+ return 2;
+ }
+ }
+ private static final ClassFileEntry[] NONE = new ClassFileEntry[0];
+ protected ClassFileEntry[] getNestedClassFileEntries() {
+ return NONE;
+ }
+ /**
+ * Allows the constant pool entries to resolve their nested entries
+ *
+ * @param pool
+ */
+ protected void resolve(ClassConstantPool pool) {
+ }
+ public abstract void write(DataOutputStream dos) throws IOException;
+
+}
Propchange: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ClassFileEntry.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/Codec.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/Codec.java?view=diff&rev=465556&r1=465555&r2=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/Codec.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/Codec.java Thu Oct 19 03:27:10 2006
@@ -15,7 +15,9 @@
* limitations under the License.
*/
package org.apache.harmony.archive.internal.pack200;
-
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
import java.io.IOException;
import java.io.InputStream;
Modified: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/CodecEncoding.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/CodecEncoding.java?view=diff&rev=465556&r1=465555&r2=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/CodecEncoding.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/CodecEncoding.java Thu Oct 19 03:27:10 2006
@@ -15,13 +15,13 @@
* limitations under the License.
*/
package org.apache.harmony.archive.internal.pack200;
-
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
-import org.apache.harmony.archive.internal.nls.Messages;
-
public class CodecEncoding {
/**
* The canonical encodings are defined to allow a single byte to represent
@@ -103,10 +103,10 @@
// Sanity check to make sure that no-one's been buggering with
// the canonical codecs, which would really cause havoc
if (canonicalCodec.length != 116)
- throw new Error(Messages.getString("archive.00")); //$NON-NLS-1$
+ throw new Error("Canonical encodings have been incorrectly modified");
if (value < 0) {
throw new IllegalArgumentException(
- Messages.getString("archive.01")); //$NON-NLS-1$
+ "Encoding cannot be less than zero");
} else if (value == 0) {
return defaultCodec;
} else if (value <= 115) {
@@ -114,13 +114,13 @@
} else if (value == 116) {
int code = in.read();
if (code == -1)
- throw new EOFException(Messages.getString("archive.02")); //$NON-NLS-1$
+ throw new EOFException("End of buffer read whilst trying to decode codec");
int d = (code & 0x01);
int s = (code >> 1 & 0x03);
int b = (code >> 3 & 0x07) + 1; // this might result in an invalid number, but it's checked in the Codec constructor
code = in.read();
if (code == -1)
- throw new EOFException(Messages.getString("archive.03")); //$NON-NLS-1$
+ throw new EOFException("End of buffer read whilst trying to decode codec");
int h = code + 1;
// This handles the special cases for invalid combinations of data.
return new BHSDCodec(b,h,s,d);
@@ -132,7 +132,7 @@
boolean bdef = (offset >> 4 & 1) == 1;
// If both A and B use the default encoding, what's the point of having a run of default values followed by default values
if (adef && bdef)
- throw new Pack200Exception(Messages.getString("archive.04")); //$NON-NLS-1$
+ throw new Pack200Exception("ADef and BDef should never both be true");
int kb = (kbflag ? in.read() : 3);
int k = (kb+1) * (int)Math.pow(16, kx);
Codec aCodec, bCodec;
@@ -165,13 +165,14 @@
// number of items read from the fCodec. So we don't know in advance what
// the codec will be.
return new PopulationCodec(fCodec,l,uCodec);
+ } else {
+ Codec fCodec = (fdef ? defaultCodec : getCodec(in.read(),in,defaultCodec) );
+ Codec uCodec = (udef ? defaultCodec : getCodec(in.read(),in,defaultCodec) );
+ Codec tCodec = getCodec(in.read(),in,defaultCodec);
+ return new PopulationCodec(fCodec,uCodec,tCodec);
}
- Codec fCodec = (fdef ? defaultCodec : getCodec(in.read(),in,defaultCodec) );
- Codec uCodec = (udef ? defaultCodec : getCodec(in.read(),in,defaultCodec) );
- Codec tCodec = getCodec(in.read(),in,defaultCodec);
- return new PopulationCodec(fCodec,uCodec,tCodec);
} else {
- throw new Pack200Exception(Messages.getString("archive.05", value)); //$NON-NLS-1$
+ throw new Pack200Exception("Invalid codec encoding byte (" + value + ") found" );
}
}
}
Added: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ConstantPoolEntry.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ConstantPoolEntry.java?view=auto&rev=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ConstantPoolEntry.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ConstantPoolEntry.java Thu Oct 19 03:27:10 2006
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.harmony.archive.internal.pack200;
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * @author alex
+ *
+ */
+abstract class ConstantPoolEntry extends ClassFileEntry {
+ static class Class extends ConstantPoolEntry {
+ private int index;
+
+ public String name;
+
+ private UTF8 utf8;
+
+ Class(String name) {
+ super(CP_Class);
+ this.name = name;
+ this.utf8 = new UTF8(name);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final Class other = (Class) obj;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ if (utf8 == null) {
+ if (other.utf8 != null)
+ return false;
+ } else if (!utf8.equals(other.utf8))
+ return false;
+ return true;
+ }
+
+ protected ClassFileEntry[] getNestedClassFileEntries() {
+ return new ClassFileEntry[] { utf8, };
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = PRIME * result + ((name == null) ? 0 : name.hashCode());
+ result = PRIME * result + ((utf8 == null) ? 0 : utf8.hashCode());
+ return result;
+ }
+
+ protected void resolve(ClassConstantPool pool) {
+ super.resolve(pool);
+ index = pool.indexOf(utf8);
+ }
+
+ void writeBody(DataOutputStream dos) throws IOException {
+ dos.writeShort(index);
+ }
+ }
+
+ static class UTF8 extends ConstantPoolEntry {
+ private String utf8;
+
+ UTF8(String utf8) {
+ super(CP_UTF8);
+ this.utf8 = utf8;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final UTF8 other = (UTF8) obj;
+ if (utf8 == null) {
+ if (other.utf8 != null)
+ return false;
+ } else if (!utf8.equals(other.utf8))
+ return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = PRIME * result + ((utf8 == null) ? 0 : utf8.hashCode());
+ return result;
+ }
+
+ void writeBody(DataOutputStream dos) throws IOException {
+ byte[] bytes;
+ try {
+ // TODO Check that this is the right UTF-8 for bytes
+ if (utf8 == null) {
+ bytes = new byte[0];
+ } else {
+ bytes = utf8.getBytes("UTF-8");
+ }
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException("Couldn't convert string " + utf8
+ + " to UTF-8");
+ }
+ dos.writeShort(bytes.length);
+ dos.write(bytes);
+ }
+
+ }
+
+ public static final byte CP_Class = 7;
+
+ public static final byte CP_Double = 6;
+
+ public static final byte CP_Fieldref = 9;
+
+ public static final byte CP_Float = 4;
+
+ public static final byte CP_Integer = 3;
+
+ /*
+ * class MemberRef extends ConstantPoolEntry { private int index;
+ *
+ * Class(String name) { super(CP_Class); index = pool.indexOf(name); }
+ *
+ * void writeBody(DataOutputStream dos) throws IOException {
+ * dos.writeShort(index); }
+ * }
+ */
+
+ public static final byte CP_InterfaceMethodref = 11;
+
+ public static final byte CP_Long = 5;
+
+ public static final byte CP_Methodref = 10;
+
+ public static final byte CP_NameAndType = 12;
+
+ public static final byte CP_String = 8;
+
+ public static final byte CP_UTF8 = 1;
+
+ byte tag;
+
+ ConstantPoolEntry(byte tag) {
+ this.tag = tag;
+ }
+
+ public abstract boolean equals(Object obj);
+
+ public byte getTag() {
+ return tag;
+ }
+
+ public abstract int hashCode();
+
+ public void write(DataOutputStream dos) throws IOException {
+ dos.writeByte(tag);
+ writeBody(dos);
+ }
+
+ abstract void writeBody(DataOutputStream dos) throws IOException;
+}
Propchange: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/ConstantPoolEntry.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/Pack200Exception.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/Pack200Exception.java?view=diff&rev=465556&r1=465555&r2=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/Pack200Exception.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/Pack200Exception.java Thu Oct 19 03:27:10 2006
@@ -15,7 +15,9 @@
* limitations under the License.
*/
package org.apache.harmony.archive.internal.pack200;
-
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
/**
* Represents a problem with a Pack200 coding/decoding issue.
*
@@ -26,7 +28,7 @@
private static final long serialVersionUID = 5168177401552611803L;
- /**
+ /**
* Create a new Pack200 exception with the given message and cause
*
* @param message
Modified: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/PopulationCodec.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/PopulationCodec.java?view=diff&rev=465556&r1=465555&r2=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/PopulationCodec.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/PopulationCodec.java Thu Oct 19 03:27:10 2006
@@ -14,14 +14,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package org.apache.harmony.archive.internal.pack200;
-
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
import java.io.IOException;
import java.io.InputStream;
-import org.apache.harmony.archive.internal.nls.Messages;
-
public class PopulationCodec extends Codec {
private Codec favouredCodec;
private Codec tokenCodec;
@@ -36,7 +35,7 @@
public PopulationCodec(Codec favouredCodec, int l, Codec unvafouredCodec) {
if (l >= 256 || l <=0)
- throw new IllegalArgumentException(Messages.getString("archive.0F")); //$NON-NLS-1$
+ throw new IllegalArgumentException("L must be between 1..255");
this.favouredCodec = favouredCodec;
this.l = l;
this.unvafouredCodec = unvafouredCodec;
@@ -44,13 +43,13 @@
@Override
public long decode(InputStream in) throws IOException, Pack200Exception {
- throw new Pack200Exception(Messages.getString("archive.10")); //$NON-NLS-1$
+ throw new Pack200Exception("Population encoding does not work unless the number of elements are known");
}
@Override
public long decode(InputStream in, long last) throws IOException,
Pack200Exception {
- throw new Pack200Exception(Messages.getString("archive.10")); //$NON-NLS-1$
+ throw new Pack200Exception("Population encoding does not work unless the number of elements are known");
}
@Override
@@ -88,7 +87,7 @@
tokenCodec = codec;
}
if (tokenCodec == null)
- throw new Pack200Exception(Messages.getString("archive.11", new Integer(k), new Integer(l))); //$NON-NLS-1$
+ throw new Pack200Exception("Cannot calculate token codec from " + k + " and " + l);
}
}
// read favourites
Modified: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/RunCodec.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/RunCodec.java?view=diff&rev=465556&r1=465555&r2=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/RunCodec.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/RunCodec.java Thu Oct 19 03:27:10 2006
@@ -15,12 +15,12 @@
* limitations under the License.
*/
package org.apache.harmony.archive.internal.pack200;
-
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
import java.io.IOException;
import java.io.InputStream;
-import org.apache.harmony.archive.internal.nls.Messages;
-
/**
* A run codec is a grouping of two nested codecs; K values are decoded from
* the first codec, and the remaining codes are decoded from the remaining
@@ -38,32 +38,28 @@
public RunCodec(int k, Codec aCodec, Codec bCodec) throws Pack200Exception {
if (k <= 0)
- throw new Pack200Exception(Messages.getString("archive.12")); //$NON-NLS-1$
+ throw new Pack200Exception("Cannot have a RunCodec for a negative number of numbers");
if (aCodec == null || bCodec == null)
- throw new Pack200Exception(Messages.getString("archive.13")); //$NON-NLS-1$
+ throw new Pack200Exception("Must supply both codecs for a RunCodec");
this.k = k;
this.aCodec = aCodec;
this.bCodec = bCodec;
}
-
- @Override
- public long decode(InputStream in) throws IOException, Pack200Exception {
+ public long decode(InputStream in) throws IOException, Pack200Exception {
return decode(in,this.last);
}
- @Override
- public long decode(InputStream in, long last) throws IOException, Pack200Exception {
+ public long decode(InputStream in, long last) throws IOException, Pack200Exception {
if(--k>=0) {
long value = aCodec.decode(in,last);
this.last = (k == 0 ? 0 : value);
return value;
+ } else {
+ this.last = bCodec.decode(in,last);
+ return this.last;
}
- this.last = bCodec.decode(in,last);
- return this.last;
}
-
- @Override
- public String toString() {
- return "RunCodec[k="+k+";aCodec="+aCodec+"bCodec="+bCodec+"]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ public String toString() {
+ return "RunCodec[k="+k+";aCodec="+aCodec+"bCodec="+bCodec+"]";
}
}
Modified: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/Segment.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/Segment.java?view=diff&rev=465556&r1=465555&r2=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/Segment.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/Segment.java Thu Oct 19 03:27:10 2006
@@ -15,15 +15,20 @@
* limitations under the License.
*/
package org.apache.harmony.archive.internal.pack200;
-
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
import java.io.ByteArrayInputStream;
+import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
import java.util.zip.GZIPInputStream;
-import org.apache.harmony.archive.internal.nls.Messages;
+import org.apache.harmony.archive.internal.pack200.ClassFileEntry.SourceFile;
/**
* A Pack200 archive consists of one (or more) segments. Each segment is
@@ -57,6 +62,29 @@
* @version $Revision: $
*/
public class Segment {
+ public class SegmentConstantPool {
+ public static final int ALL = 0;
+
+ public static final int SIGNATURE = 2; // TODO and more to come --
+ // define in archive order
+
+ public static final int UTF_8 = 1;
+
+ public Object getValue(int cp, long value) throws Pack200Exception {
+ int index = (int)value;
+ if (index == -1)
+ return null;
+ if (index < 0)
+ throw new Pack200Exception("Cannot have a negative range");
+ if (cp == UTF_8)
+ return cpUTF8[index];
+ if (cp == SIGNATURE)
+ return cpSignature[index];
+ // etc
+ throw new Error("Get value incomplete");
+ }
+ }
+
/**
* The magic header for a Pack200 Segment is 0xCAFED00D. I wonder where they
* get their inspiration from ...
@@ -106,12 +134,12 @@
throws IOException, Pack200Exception {
int total = in.read(data);
if (total == -1)
- throw new EOFException(Messages.getString("archive.0E")); //$NON-NLS-1$
+ throw new EOFException("Failed to read any data from input stream");
while (total < data.length) {
int delta = in.read(data, total, data.length - total);
if (delta == -1)
throw new EOFException(
- Messages.getString("archive.0D")); //$NON-NLS-1$
+ "Failed to read some data from input stream");
total += delta;
}
}
@@ -126,16 +154,22 @@
private String[] attributeDefinitionLayout;
+ private AttributeLayoutMap attributeDefinitionMap;
+
private String[] attributeDefinitionName;
private InputStream bandHeadersInputStream;
private int bandHeadersSize;
+ private int classAttrCount;
+
private int classCount;
private int[] classFieldCount;
+ private long[] classFlags;
+
private String[][] classInterfaces;
private int[] classMethodCount;
@@ -228,7 +262,7 @@
private int innerClassCount;
- private int major;
+ private int archiveMajor;
private int methodAttrCount;
@@ -236,17 +270,15 @@
private long[][] methodFlags;
- private int minor;
+ private int archiveMinor;
private int numberOfFiles;
private SegmentOptions options;
- private int segmentsRemaining;
-
- private int classAttrCount;
+ private final SegmentConstantPool pool = new SegmentConstantPool();
- private long[] classFlags;
+ private int segmentsRemaining;
/**
* This is a local debugging message to aid the developer in writing this
@@ -258,7 +290,7 @@
* @deprecated this should be removed from production code
*/
@Deprecated
- private void debug(String message) {
+ private void debug(String message) {
if (System.getProperty("debug.pack200") != null) {
System.err.println(message);
}
@@ -423,9 +455,96 @@
}
+ public SegmentConstantPool getConstantPool() {
+ return pool;
+ }
+
public int getNumberOfFiles() {
return numberOfFiles;
}
+ /**
+ * Writes the segment to an output stream. The output stream should be pre-buffered for
+ * efficiency. Also takes the same input stream for reading, since the file bits may
+ * not be loaded and thus just copied from one stream to another.
+ * Doesn't close the output stream when finished, in case there are more entries (e.g.
+ * further segments) to be written.
+ * @param out the JarOutputStream to write data to
+ * @param in the same InputStream that was used to parse the segment
+ * @throws IOException if an error occurs whilst reading or writing to the streams
+ * @throws Pack200Exception if an error occurs whilst unpacking data
+ */
+ public void writeJar(JarOutputStream out, InputStream in ) throws IOException, Pack200Exception {
+ processFileBits(in);
+ DataOutputStream dos = new DataOutputStream(out);
+ // out.setLevel(JarEntry.DEFLATED)
+ // now write the files out
+ int classNum = 0;
+ for(int i=0;i<numberOfFiles;i++) {
+ String name = fileName[i];
+ long modtime = archiveModtime + fileModtime[i];
+ boolean deflate = (fileOptions[i] & 1) == 1 || options.shouldDeflate();
+ boolean isClass = (fileOptions[i] & 2) == 2 || name == null || name.equals("");
+ if (isClass) {
+ // pull from headers
+ if (name == null || name.equals(""))
+ name = cpClass[classNum] + ".class";
+ };
+ JarEntry entry = new JarEntry(name);
+ if (deflate)
+ entry.setMethod(JarEntry.DEFLATED);
+ entry.setTime(modtime);
+ out.putNextEntry(entry);
+
+ if(isClass){
+ // write to dos
+ ClassFile classFile = buildClassFile(classNum);
+ classFile.write(dos);
+ dos.flush();
+ classNum++;
+ } else {
+ long size = fileSize[i];
+ entry.setSize(size);
+ // TODO pull from in
+ byte[] data = fileBits[i];
+ out.write(data);
+ }
+ }
+ dos.flush();
+ out.finish();
+ out.flush();
+ }
+
+ private ClassFile buildClassFile(int classNum) {
+ ClassFile classFile = new ClassFile();
+ classFile.major = defaultClassMajorVersion; // TODO If classVersionMajor[] use that instead
+ classFile.minor = defaultClassMinorVersion; // TODO if classVersionMinor[] use that instead
+ // build constant pool
+ ClassFileEntry cfThis = new ConstantPoolEntry.Class(classThis[classNum]);
+ ClassFileEntry cfSuper = new ConstantPoolEntry.Class(classSuper[classNum]);
+ ClassFileEntry cfInterfaces[] = new ClassFileEntry[classInterfaces[classNum].length];
+ for(int i=0;i<cfInterfaces.length;i++) {
+ cfInterfaces[i] = new ConstantPoolEntry.Class(classInterfaces[classNum][i]);
+ }
+ ClassConstantPool cp = classFile.pool;
+ cp.add(cfThis);
+ cp.add(cfSuper);
+ // build up remainder of file
+ classFile.accessFlags = (int) classFlags[classNum];
+ classFile.thisClass = cp.indexOf(cfThis);
+ classFile.superClass = cp.indexOf(cfSuper);
+ // TODO placate format of file for writing purposes
+ classFile.interfaces = new int[0];
+ classFile.fields = new int[0];
+ classFile.methods = new int[0];
+ SourceFile sf;
+ classFile.attributes = new ClassFileEntry.Attribute[] { sf = new ClassFileEntry.SourceFile(classThis[classNum] + ".java") };
+ cp.add(sf);
+
+ // sort CP according to cp_All
+ cp.resolve();
+
+ return classFile;
+ }
private SegmentOptions getOptions() {
return options;
@@ -482,7 +601,8 @@
attributeDefinitionLayout = parseReferences("attr_definition_layout",
in, Codec.UNSIGNED5, attributeDefinitionCount, cpUTF8);
if (attributeDefinitionCount > 0)
- throw new Error(Messages.getString("archive.0C")); //$NON-NLS-1$
+ throw new Error("No idea what the adc is for yet");
+ attributeDefinitionMap = new AttributeLayoutMap();
}
private void parseBcBands(InputStream in) {
@@ -499,10 +619,22 @@
classAttrCount++;
}
if (classAttrCount > 0)
- throw new Error(Messages.getString("archive.0A")); //$NON-NLS-1$
+ throw new Error(
+ "There are attribute flags, and I don't know what to do with them");
debug("unimplemented class_attr_count");
debug("unimplemented class_attr_indexes");
debug("unimplemented class_attr_calls");
+ AttributeLayout layout = attributeDefinitionMap.getAttributeLayout(
+ "SourceFile", AttributeLayout.CONTEXT_CLASS);
+ for (int i = 0; i < classCount; i++) {
+ long flag = classFlags[i];
+ if (layout.matches(flag)) {
+ // we've got a value to read
+ long result = layout.getCodec().decode(in);
+ Object value = layout.getValue(result, this);
+ debug("Processed value " + value + " for SourceFile");
+ }
+ }
debug("unimplemented class_SourceFile_RUN");
debug("unimplemented class_EnclosingMethod_RC");
debug("unimplemented class_EnclosingMethod_RDN");
@@ -550,18 +682,6 @@
setClassCount(decodeScalar("class_count", in, Codec.UNSIGNED5));
}
- private void parseCodeBands(InputStream in) {
- debug("unimplemented code_headers");
- debug("unimplemented code_max_stack");
- debug("unimplemented code_max_na_locals");
- debug("unimplemented code_hander_count");
- debug("unimplemented code_hander_start_P");
- debug("unimplemented code_hander_end_PO");
- debug("unimplemented code_hander_catch_PO");
- debug("unimplemented code_hander_class_RC");
- parseCodeAttrBands(in);
- }
-
private void parseCodeAttrBands(InputStream in) {
debug("unimplemented code_flags");
debug("unimplemented code_attr_count");
@@ -582,6 +702,18 @@
}
}
+ private void parseCodeBands(InputStream in) {
+ debug("unimplemented code_headers");
+ debug("unimplemented code_max_stack");
+ debug("unimplemented code_max_na_locals");
+ debug("unimplemented code_hander_count");
+ debug("unimplemented code_hander_start_P");
+ debug("unimplemented code_hander_end_PO");
+ debug("unimplemented code_hander_catch_PO");
+ debug("unimplemented code_hander_class_RC");
+ parseCodeAttrBands(in);
+ }
+
/**
* Parses the constant pool class names, using {@link #cpClassCount} to
* populate {@link #cpClass} from {@link #cpUTF8}.
@@ -779,7 +911,7 @@
String form = cpSignatureForm[i];
int len = form.length();
StringBuffer signature = new StringBuffer(64);
- ArrayList<String> list = new ArrayList<String>();
+ ArrayList list = new ArrayList();
for (int j = 0; j < len; j++) {
char c = form.charAt(j);
signature.append(c);
@@ -1005,38 +1137,6 @@
cpUTF8);
}
- private void parseMethodBands(InputStream in) throws IOException,
- Pack200Exception {
- methodDescr = new String[classCount][];
- for (int i = 0; i < classCount; i++) {
- methodDescr[i] = parseReferences("method_descr", in, Codec.MDELTA5,
- classMethodCount[i], cpDescriptor);
- }
- methodFlags = new long[classCount][];
- for (int i = 0; i < classCount; i++) {
- methodFlags[i] = parseFlags("method_flags", in,
- classMethodCount[i], Codec.UNSIGNED5, options
- .hasMethodFlagsHi());
- }
- for (int i = 0; i < classCount; i++) {
- for (int j = 0; j < methodFlags[i].length; j++) {
- long flag = methodFlags[i][j];
- if ((flag & (1 << 16)) != 0)
- methodAttrCount++;
- }
- }
- if (methodAttrCount > 0)
- throw new Error(
- "There are method attribute flags, and I don't know what to do with them");
- debug("unimplemented method_attr_count");
- debug("unimplemented method_attr_indexes");
- debug("unimplemented method_attr_calls");
- debug("unimplemented method_Exceptions_N");
- debug("unimplemented method_Exceptions_RC");
- debug("unimplemented method_Signature_RS");
- parseMetadataBands("method");
- }
-
private void parseMetadataBands(String unit) throws Pack200Exception {
String[] RxA;
if ("method".equals(unit)) {
@@ -1073,6 +1173,38 @@
}
}
+ private void parseMethodBands(InputStream in) throws IOException,
+ Pack200Exception {
+ methodDescr = new String[classCount][];
+ for (int i = 0; i < classCount; i++) {
+ methodDescr[i] = parseReferences("method_descr", in, Codec.MDELTA5,
+ classMethodCount[i], cpDescriptor);
+ }
+ methodFlags = new long[classCount][];
+ for (int i = 0; i < classCount; i++) {
+ methodFlags[i] = parseFlags("method_flags", in,
+ classMethodCount[i], Codec.UNSIGNED5, options
+ .hasMethodFlagsHi());
+ }
+ for (int i = 0; i < classCount; i++) {
+ for (int j = 0; j < methodFlags[i].length; j++) {
+ long flag = methodFlags[i][j];
+ if ((flag & (1 << 16)) != 0)
+ methodAttrCount++;
+ }
+ }
+ if (methodAttrCount > 0)
+ throw new Error(
+ "There are method attribute flags, and I don't know what to do with them");
+ debug("unimplemented method_attr_count");
+ debug("unimplemented method_attr_indexes");
+ debug("unimplemented method_attr_calls");
+ debug("unimplemented method_Exceptions_N");
+ debug("unimplemented method_Exceptions_RC");
+ debug("unimplemented method_Signature_RS");
+ parseMetadataBands("method");
+ }
+
/**
* Helper method to parse <i>count</i> references from <code>in</code>,
* using <code>codec</code> to decode the values as indexes into
@@ -1107,7 +1239,7 @@
int index = decode[i];
if (index < 0 || index >= reference.length)
throw new Pack200Exception(
- Messages.getString("archive.06")); //$NON-NLS-1$
+ "Something has gone wrong during parsing references");
result[i] = reference[index];
}
return result;
@@ -1130,7 +1262,7 @@
debug("-------");
parseSegmentHeader(in);
if (bandHeadersSize > 0) {
- byte[] bandHeaders = new byte[bandHeadersSize];
+ byte[] bandHeaders = new byte[(int) bandHeadersSize];
readFully(in, bandHeaders);
setBandHeadersData(bandHeaders);
}
@@ -1151,9 +1283,7 @@
parseClassBands(in);
parseBcBands(in);
// TODO Re-enable these after completing class/bytecode bands
- // parseFileBands(in);
- // processFileBits(in); // this just caches them in file_bits; it should
- // probably start writing here?
+ parseFileBands(in);
}
private void parseSegmentHeader(InputStream in) throws IOException,
@@ -1162,10 +1292,10 @@
magic.length);
for (int m = 0; m < magic.length; m++)
if (word[m] != magic[m])
- throw new Error(Messages.getString("archive.07")); //$NON-NLS-1$
- setMinorVersion((int) decodeScalar("archive_minver", in,
+ throw new Error("Bad header");
+ setArchiveMinorVersion((int) decodeScalar("archive_minver", in,
Codec.UNSIGNED5));
- setMajorVersion((int) decodeScalar("archive_majver", in,
+ setArchiveMajorVersion((int) decodeScalar("archive_majver", in,
Codec.UNSIGNED5));
setOptions(new SegmentOptions((int) decodeScalar("archive_options", in,
Codec.UNSIGNED5)));
@@ -1283,10 +1413,10 @@
* @throws Pack200Exception
* if the major version is not 150
*/
- private void setMajorVersion(int version) throws Pack200Exception {
+ private void setArchiveMajorVersion(int version) throws Pack200Exception {
if (version != 150)
- throw new Pack200Exception(Messages.getString("archive.08")); //$NON-NLS-1$
- major = version;
+ throw new Pack200Exception("Invalid segment major version");
+ archiveMajor = version;
}
/**
@@ -1297,10 +1427,10 @@
* @throws Pack200Exception
* if the minor version is not 7
*/
- private void setMinorVersion(int version) throws Pack200Exception {
+ private void setArchiveMinorVersion(int version) throws Pack200Exception {
if (version != 7)
- throw new Pack200Exception(Messages.getString("archive.09")); //$NON-NLS-1$
- minor = version;
+ throw new Pack200Exception("Invalid segment minor version");
+ archiveMinor = version;
}
public void setNumberOfFiles(long value) {
Modified: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/SegmentOptions.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/SegmentOptions.java?view=diff&rev=465556&r1=465555&r2=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/SegmentOptions.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/internal/pack200/SegmentOptions.java Thu Oct 19 03:27:10 2006
@@ -15,9 +15,9 @@
* limitations under the License.
*/
package org.apache.harmony.archive.internal.pack200;
-
-import org.apache.harmony.archive.internal.nls.Messages;
-
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
/**
* Stores the combinations of bit flags that can be used in the segment header
* options. Whilst this could be defined in {@link Segment}, it's cleaner to
@@ -74,7 +74,7 @@
*/
public SegmentOptions(int options) throws Pack200Exception {
if ((options & UNUSED) != 0)
- throw new Pack200Exception(Messages.getString("archive.14")); //$NON-NLS-1$
+ throw new Pack200Exception("Some unused flags are non-zero");
this.options = options;
}
Modified: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AllTests.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AllTests.java?view=diff&rev=465556&r1=465555&r2=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AllTests.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AllTests.java Thu Oct 19 03:27:10 2006
@@ -1,25 +1,25 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
*/
-
package org.apache.harmony.archive.tests.internal.pack200;
-
+// NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+// NOTE: Do not extract strings as messages; this code is still a work-in-progress
+// NOTE: Also, don't get rid of 'else' statements for the hell of it ...
import junit.framework.Test;
import junit.framework.TestSuite;
-
/**
* Test suite for org.apache.harmony.archive.internal.pack200 package.
*/
@@ -33,6 +33,8 @@
TestSuite suite = new TestSuite(
"Suite org.apache.harmony.archive.tests.internal.pack200");
// $JUnit-BEGIN$
+ suite.addTestSuite(AttributeLayoutMapTest.class);
+ suite.addTestSuite(AttributeLayoutTest.class);
suite.addTestSuite(CodecEncodingTest.class);
suite.addTestSuite(CodecTest.class);
suite.addTestSuite(PopulationCodecTest.class);
Added: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AttributeLayoutMapTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AttributeLayoutMapTest.java?view=auto&rev=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AttributeLayoutMapTest.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AttributeLayoutMapTest.java Thu Oct 19 03:27:10 2006
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.harmony.archive.tests.internal.pack200;
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
+import junit.framework.TestCase;
+
+import org.apache.harmony.archive.internal.pack200.AttributeLayout;
+import org.apache.harmony.archive.internal.pack200.AttributeLayoutMap;
+import org.apache.harmony.archive.internal.pack200.Pack200Exception;
+
+public class AttributeLayoutMapTest extends TestCase {
+ public void testRepeatable() throws Pack200Exception {
+ // Check we can retrieve a default layout
+ AttributeLayoutMap a = new AttributeLayoutMap();
+ AttributeLayout layout = a.getAttributeLayout("SourceFile", AttributeLayout.CONTEXT_CLASS);
+ assertNotNull(layout);
+ assertEquals("RUNH",layout.getLayout());
+ // and that we can change it
+ a.add(new AttributeLayout("SourceFile",AttributeLayout.CONTEXT_CLASS,"FROG",15));
+ layout = a.getAttributeLayout("SourceFile", AttributeLayout.CONTEXT_CLASS);
+ assertNotNull(layout);
+ assertEquals("FROG",layout.getLayout());
+ assertTrue(layout.matches(1<<15));
+ assertFalse(layout.matches(1<<16));
+ assertTrue(layout.matches(-1));
+ assertFalse(layout.matches(0));
+ // and that changes don't affect subsequent defaults
+ AttributeLayoutMap b = new AttributeLayoutMap();
+ layout = b.getAttributeLayout("SourceFile", AttributeLayout.CONTEXT_CLASS);
+ assertNotNull(layout);
+ assertEquals("RUNH",layout.getLayout());
+
+ }
+}
Propchange: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AttributeLayoutMapTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AttributeLayoutTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AttributeLayoutTest.java?view=auto&rev=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AttributeLayoutTest.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AttributeLayoutTest.java Thu Oct 19 03:27:10 2006
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.harmony.archive.tests.internal.pack200;
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
+import junit.framework.TestCase;
+
+import org.apache.harmony.archive.internal.pack200.AttributeLayout;
+import org.apache.harmony.archive.internal.pack200.Pack200Exception;
+import org.apache.harmony.archive.internal.pack200.Segment;
+
+public class AttributeLayoutTest extends TestCase {
+ public class TestSegment extends Segment {
+ public SegmentConstantPool getConstantPool() {
+ final Object[][] data = new Object[][] {
+ { }, // ALL
+ { "Zero", "One" }, // UTF-8
+ { "Ein", "Zwei" }, // Signature
+ };
+ return new SegmentConstantPool() {
+ public Object getValue(int cp, long index) {
+ if (index == -1)
+ return null;
+ return data[cp][(int)index];
+ }
+
+ };
+ }
+ }
+ public void testBadData() {
+ assertTrue(throwsException(null,AttributeLayout.CONTEXT_CLASS,""));
+ assertTrue(throwsException("",AttributeLayout.CONTEXT_CLASS,""));
+ assertTrue(!throwsException("name",AttributeLayout.CONTEXT_CLASS,""));
+ assertTrue(!throwsException("name",AttributeLayout.CONTEXT_METHOD,""));
+ assertTrue(!throwsException("name",AttributeLayout.CONTEXT_FIELD,""));
+ assertTrue(!throwsException("name",AttributeLayout.CONTEXT_CODE,""));
+ assertTrue(throwsException("name",-1,""));
+ assertTrue(throwsException("name",1234,""));
+ }
+ public void testLayoutRU() throws Pack200Exception {
+ AttributeLayout layout = new AttributeLayout("RU",AttributeLayout.CONTEXT_CLASS,"RU", 1);
+ Segment segment = new TestSegment();
+ assertNull(layout.getValue(-1, segment));
+ assertEquals("Zero",layout.getValue(0, segment));
+ assertEquals("One",layout.getValue(1, segment));
+ }
+ public void testLayoutRUN() throws Pack200Exception {
+ AttributeLayout layout = new AttributeLayout("RUN",AttributeLayout.CONTEXT_CLASS,"RUN", 1);
+ Segment segment = new TestSegment();
+ assertNull(layout.getValue(0, segment));
+ assertEquals("Zero",layout.getValue(1, segment));
+ assertEquals("One",layout.getValue(2, segment));
+ }
+ public void testLayoutRS() throws Pack200Exception {
+ AttributeLayout layout = new AttributeLayout("RS",AttributeLayout.CONTEXT_CLASS,"RS", 1);
+ Segment segment = new TestSegment();
+ assertNull(layout.getValue(-1, segment));
+ assertEquals("Ein",layout.getValue(0, segment));
+ assertEquals("Zwei",layout.getValue(1, segment));
+ }
+ public void testLayoutRSN() throws Pack200Exception {
+ AttributeLayout layout = new AttributeLayout("RSN",AttributeLayout.CONTEXT_CLASS,"RSN", 1);
+ Segment segment = new TestSegment();
+ assertNull(layout.getValue(0, segment));
+ assertEquals("Ein",layout.getValue(1, segment));
+ assertEquals("Zwei",layout.getValue(2, segment));
+ }
+ public boolean throwsException(String name, int context, String layout) {
+ try {
+ new AttributeLayout(name,context,layout,-1);
+ return false;
+ } catch (Pack200Exception e) {
+ return true;
+ }
+ }
+}
Propchange: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/AttributeLayoutTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/CodecEncodingTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/CodecEncodingTest.java?view=diff&rev=465556&r1=465555&r2=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/CodecEncodingTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/CodecEncodingTest.java Thu Oct 19 03:27:10 2006
@@ -15,7 +15,9 @@
* limitations under the License.
*/
package org.apache.harmony.archive.tests.internal.pack200;
-
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.HashMap;
@@ -36,7 +38,7 @@
public void testCanonicalEncodings() throws IOException, Pack200Exception {
Codec defaultCodec = new BHSDCodec(2,16,0,0);
assertEquals(defaultCodec,CodecEncoding.getCodec(0,null, defaultCodec));
- Map<Integer, String> map = new HashMap<Integer, String>();
+ Map map = new HashMap();
// These are the canonical encodings specified by the Pack200 spec
map.put(new Integer(1), "(1,256)");
map.put(new Integer(2), "(1,256,1)");
Modified: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/CodecTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/CodecTest.java?view=diff&rev=465556&r1=465555&r2=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/CodecTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/CodecTest.java Thu Oct 19 03:27:10 2006
@@ -15,7 +15,9 @@
* limitations under the License.
*/
package org.apache.harmony.archive.tests.internal.pack200;
-
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
import java.io.ByteArrayInputStream;
import java.io.EOFException;
import java.io.IOException;
Modified: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/HelloWorld.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/HelloWorld.java?view=diff&rev=465556&r1=465555&r2=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/HelloWorld.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/HelloWorld.java Thu Oct 19 03:27:10 2006
@@ -15,7 +15,9 @@
* limitations under the License.
*/
package org.apache.harmony.archive.tests.internal.pack200;
-
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
/**
* This is intended to be used as a test class for unpacking a packed Jar file.
* @author Alex Blewitt
Modified: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/PopulationCodecTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/PopulationCodecTest.java?view=diff&rev=465556&r1=465555&r2=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/PopulationCodecTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/PopulationCodecTest.java Thu Oct 19 03:27:10 2006
@@ -15,7 +15,9 @@
* limitations under the License.
*/
package org.apache.harmony.archive.tests.internal.pack200;
-
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
Modified: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/SegmentOptionsTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/SegmentOptionsTest.java?view=diff&rev=465556&r1=465555&r2=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/SegmentOptionsTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/SegmentOptionsTest.java Thu Oct 19 03:27:10 2006
@@ -15,7 +15,9 @@
* limitations under the License.
*/
package org.apache.harmony.archive.tests.internal.pack200;
-
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
import junit.framework.TestCase;
import org.apache.harmony.archive.internal.pack200.Pack200Exception;
Modified: incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/SegmentTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/SegmentTest.java?view=diff&rev=465556&r1=465555&r2=465556
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/SegmentTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/archive/src/test/java/org/apache/harmony/archive/tests/internal/pack200/SegmentTest.java Thu Oct 19 03:27:10 2006
@@ -15,7 +15,9 @@
* limitations under the License.
*/
package org.apache.harmony.archive.tests.internal.pack200;
-
+//NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
+//NOTE: Do not extract strings as messages; this code is still a work-in-progress
+//NOTE: Also, don't get rid of 'else' statements for the hell of it ...
import org.apache.harmony.archive.internal.pack200.Segment;
import junit.framework.TestCase;