You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by eb...@apache.org on 2015/02/20 02:05:15 UTC
svn commit: r1661050 - in
/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile:
Attribute.java AttributeReader.java Code.java Field.java FieldOrMethod.java
Method.java Unknown.java UnknownAttributeReader.java
Author: ebourg
Date: Fri Feb 20 01:05:15 2015
New Revision: 1661050
URL: http://svn.apache.org/r1661050
Log:
Allow Attributes to be read from a DataInput
Added:
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java
- copied, changed from r1654901, commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/AttributeReader.java
Modified:
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Attribute.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/AttributeReader.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Code.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Field.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Method.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Unknown.java
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Attribute.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Attribute.java?rev=1661050&r1=1661049&r2=1661050&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Attribute.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Attribute.java Fri Feb 20 01:05:15 2015
@@ -17,6 +17,7 @@
*/
package org.apache.bcel.classfile;
+import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
@@ -90,7 +91,7 @@ public abstract class Attribute implemen
file.writeInt(length);
}
- private static final Map<String, AttributeReader> readers = new HashMap<String, AttributeReader>();
+ private static final Map<String, Object> readers = new HashMap<String, Object>();
/**
* Add an Attribute reader capable of parsing (user-defined) attributes
@@ -99,6 +100,7 @@ public abstract class Attribute implemen
*
* @param name the name of the attribute as stored in the class file
* @param r the reader object
+ * @deprecated Use {@link #addAttributeReader(String, UnknownAttributeReader)} instead
*/
public static void addAttributeReader(String name, AttributeReader r)
{
@@ -106,6 +108,19 @@ public abstract class Attribute implemen
}
/**
+ * Add an Attribute reader capable of parsing (user-defined) attributes
+ * named "name". You should not add readers for the standard attributes such
+ * as "LineNumberTable", because those are handled internally.
+ *
+ * @param name the name of the attribute as stored in the class file
+ * @param r the reader object
+ */
+ public static void addAttributeReader(String name, UnknownAttributeReader r)
+ {
+ readers.put(name, r);
+ }
+
+ /**
* Remove attribute reader
*
* @param name the name of the attribute as stored in the class file
@@ -132,6 +147,26 @@ public abstract class Attribute implemen
public static Attribute readAttribute(DataInputStream file, ConstantPool constant_pool)
throws IOException, ClassFormatException
{
+ return readAttribute((DataInput) file, constant_pool);
+ }
+
+ /**
+ * Class method reads one attribute from the input data stream. This method
+ * must not be accessible from the outside. It is called by the Field and
+ * Method constructor methods.
+ *
+ * @see Field
+ * @see Method
+ *
+ * @param file Input stream
+ * @param constant_pool Array of constants
+ * @return Attribute
+ * @throws IOException
+ * @throws ClassFormatException
+ */
+ public static Attribute readAttribute(DataInput file, ConstantPool constant_pool)
+ throws IOException, ClassFormatException
+ {
byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute
// Get class name from constant pool via `name_index' indirection
int name_index = file.readUnsignedShort();
@@ -155,10 +190,14 @@ public abstract class Attribute implemen
switch (tag)
{
case Constants.ATTR_UNKNOWN:
- AttributeReader r = readers.get(name);
- if (r != null)
+ Object r = readers.get(name);
+ if (r instanceof UnknownAttributeReader)
+ {
+ return ((UnknownAttributeReader) r).createAttribute(name_index, length, file, constant_pool);
+ }
+ else if (r instanceof AttributeReader && file instanceof DataInputStream)
{
- return r.createAttribute(name_index, length, file, constant_pool);
+ return ((AttributeReader) r).createAttribute(name_index, length, (DataInputStream) file, constant_pool);
}
return new Unknown(name_index, length, file, constant_pool);
case Constants.ATTR_CONSTANT_VALUE:
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/AttributeReader.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/AttributeReader.java?rev=1661050&r1=1661049&r2=1661050&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/AttributeReader.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/AttributeReader.java Fri Feb 20 01:05:15 2015
@@ -25,6 +25,8 @@ package org.apache.bcel.classfile;
* @see Attribute
* @version $Id$
* @author <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
+ *
+ * @deprecated Use UnknownAttributeReader instead
*/
public interface AttributeReader {
@@ -54,6 +56,5 @@ public interface AttributeReader {
@see Attribute#addAttributeReader( String, AttributeReader )
*/
- Attribute createAttribute( int name_index, int length, java.io.DataInputStream file,
- ConstantPool constant_pool );
+ Attribute createAttribute( int name_index, int length, java.io.DataInputStream file, ConstantPool constant_pool );
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Code.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Code.java?rev=1661050&r1=1661049&r2=1661050&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Code.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Code.java Fri Feb 20 01:05:15 2015
@@ -17,7 +17,7 @@
*/
package org.apache.bcel.classfile;
-import java.io.DataInputStream;
+import java.io.DataInput;
import java.io.DataOutputStream;
import java.io.IOException;
import org.apache.bcel.Constants;
@@ -70,7 +70,7 @@ public final class Code extends Attribut
* @param file Input stream
* @param constant_pool Array of constants
*/
- Code(int name_index, int length, DataInputStream file, ConstantPool constant_pool)
+ Code(int name_index, int length, DataInput file, ConstantPool constant_pool)
throws IOException {
// Initialize with some default values which will be overwritten later
this(name_index, length, file.readUnsignedShort(), file.readUnsignedShort(), (byte[]) null,
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Field.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Field.java?rev=1661050&r1=1661049&r2=1661050&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Field.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Field.java Fri Feb 20 01:05:15 2015
@@ -17,7 +17,7 @@
*/
package org.apache.bcel.classfile;
-import java.io.DataInputStream;
+import java.io.DataInput;
import java.io.IOException;
import org.apache.bcel.Constants;
import org.apache.bcel.generic.Type;
@@ -63,7 +63,7 @@ public final class Field extends FieldOr
* Construct object from file stream.
* @param file Input stream
*/
- Field(DataInputStream file, ConstantPool constant_pool) throws IOException,
+ Field(DataInput file, ConstantPool constant_pool) throws IOException,
ClassFormatException {
super(file, constant_pool);
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java?rev=1661050&r1=1661049&r2=1661050&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java Fri Feb 20 01:05:15 2015
@@ -17,6 +17,7 @@
*/
package org.apache.bcel.classfile;
+import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
@@ -68,9 +69,20 @@ public abstract class FieldOrMethod exte
* @param file Input stream
* @throws IOException
* @throws ClassFormatException
+ * @deprecated Use {@link #FieldOrMethod(java.io.DataInput, ConstantPool)} instead.
*/
protected FieldOrMethod(DataInputStream file, ConstantPool constant_pool) throws IOException,
ClassFormatException {
+ this((DataInput) file, constant_pool);
+ }
+
+ /**
+ * Construct object from file stream.
+ * @param file Input stream
+ * @throws IOException
+ * @throws ClassFormatException
+ */
+ protected FieldOrMethod(DataInput file, ConstantPool constant_pool) throws IOException, ClassFormatException {
this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), null,
constant_pool);
attributes_count = file.readUnsignedShort();
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Method.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Method.java?rev=1661050&r1=1661049&r2=1661050&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Method.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Method.java Fri Feb 20 01:05:15 2015
@@ -17,7 +17,7 @@
*/
package org.apache.bcel.classfile;
-import java.io.DataInputStream;
+import java.io.DataInput;
import java.io.IOException;
import org.apache.bcel.Constants;
import org.apache.bcel.generic.Type;
@@ -76,7 +76,7 @@ public final class Method extends FieldO
* @throws IOException
* @throws ClassFormatException
*/
- Method(DataInputStream file, ConstantPool constant_pool) throws IOException,
+ Method(DataInput file, ConstantPool constant_pool) throws IOException,
ClassFormatException {
super(file, constant_pool);
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Unknown.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Unknown.java?rev=1661050&r1=1661049&r2=1661050&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Unknown.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Unknown.java Fri Feb 20 01:05:15 2015
@@ -29,13 +29,13 @@ import org.apache.bcel.Constants;
* application-specific) attribute of a class. It is instantiated from the
* {@link Attribute#readAttribute(java.io.DataInput, ConstantPool)} method.
* Applications that need to read in application-specific attributes should create an
- * {@link AttributeReader} implementation and attach it via
- * {@link Attribute#addAttributeReader(String, AttributeReader)}.
+ * {@link UnknownAttributeReader} implementation and attach it via
+ * {@link Attribute#addAttributeReader(String, UnknownAttributeReader)}.
*
* @version $Id$
* @see org.apache.bcel.classfile.Attribute
- * @see org.apache.bcel.classfile.AttributeReader
+ * @see org.apache.bcel.classfile.UnknownAttributeReader
* @author <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
*/
public final class Unknown extends Attribute {
Copied: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java (from r1654901, commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/AttributeReader.java)
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java?p2=commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java&p1=commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/AttributeReader.java&r1=1654901&r2=1661050&rev=1661050&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/AttributeReader.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java Fri Feb 20 01:05:15 2015
@@ -13,47 +13,37 @@
* 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.bcel.classfile;
/**
* Unknown (non-standard) attributes may be read via user-defined factory
* objects that can be registered with the Attribute.addAttributeReader
* method. These factory objects should implement this interface.
-
+ *
* @see Attribute
* @version $Id$
- * @author <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
*/
-public interface AttributeReader {
+public interface UnknownAttributeReader {
/**
- When this attribute reader is added via the static method
- Attribute.addAttributeReader, an attribute name is associated with it.
- As the class file parser parses attributes, it will call various
- AttributeReaders based on the name of the attributes it is
- constructing.
-
- @param name_index An index into the constant pool, indexing a
- ConstantUtf8 that represents the name of the attribute.
-
- @param length The length of the data contained in the attribute. This
- is written into the constant pool and should agree with what the
- factory expects the length to be.
-
- @param file This is the data input stream that the factory needs to read
- its data from.
-
- @param constant_pool This is the constant pool associated with the
- Attribute that we are constructing.
-
- @return The user-defined AttributeReader should take this data and use
- it to construct an attribute. In the case of errors, a null can be
- returned which will cause the parsing of the class file to fail.
-
- @see Attribute#addAttributeReader( String, AttributeReader )
+ * When this attribute reader is added via the static method Attribute.addAttributeReader,
+ * an attribute name is associated with it. As the class file parser parses attributes,
+ * it will call various AttributeReaders based on the name of the attributes it is constructing.
+ *
+ * @param name_index An index into the constant pool, indexing a ConstantUtf8
+ * that represents the name of the attribute.
+ * @param length The length of the data contained in the attribute. This is written
+ * into the constant pool and should agree with what the factory expects the length to be.
+ * @param input This is the data input that the factory needs to read its data from.
+ * @param constant_pool This is the constant pool associated with the Attribute that we are constructing.
+ *
+ * @return The user-defined AttributeReader should take this data and use
+ * it to construct an attribute. In the case of errors, a null can be
+ * returned which will cause the parsing of the class file to fail.
+ *
+ * @see Attribute#addAttributeReader(String, UnknownAttributeReader)
*/
- Attribute createAttribute( int name_index, int length, java.io.DataInputStream file,
- ConstantPool constant_pool );
+ Attribute createAttribute( int name_index, int length, java.io.DataInput file, ConstantPool constant_pool );
}