You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cl...@apache.org on 2009/08/22 11:11:19 UTC
svn commit: r806819 -
/felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java
Author: clement
Date: Sat Aug 22 09:11:19 2009
New Revision: 806819
URL: http://svn.apache.org/viewvc?rev=806819&view=rev
Log:
Fix FELIX-1518
Improve the performance of the manipulator by avoiding to read useless classes when annotations are ignored.
Modified:
felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java
Modified: felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java?rev=806819&r1=806818&r2=806819&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java (original)
+++ felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java Sat Aug 22 09:11:19 2009
@@ -452,6 +452,28 @@
}
}
+
+ /**
+ * Reads the entry to extract the byte array.
+ * This method should be called only if the class has to be read.
+ * The cost of this method is not negligible.
+ * @param name name of the entry to read from the input jar
+ * @return the read byte array
+ * @throws IOException occurs when the entry cannot be read
+ */
+ private byte[] readEntry(String name) throws IOException {
+ InputStream currIn = getInputStream(name);
+ byte[] in = new byte[0];
+ int c;
+ while ((c = currIn.read()) >= 0) {
+ byte[] in2 = new byte[in.length + 1];
+ System.arraycopy(in, 0, in2, 0, in.length);
+ in2[in.length] = (byte) c;
+ in = in2;
+ }
+ currIn.close();
+ return in;
+ }
/**
* Manipulate classes of the input Jar.
@@ -462,17 +484,10 @@
while (entries.hasMoreElements()) {
String curName = (String) entries.nextElement();
try {
- InputStream currIn = getInputStream(curName);
- byte[] in = new byte[0];
- int c;
- while ((c = currIn.read()) >= 0) {
- byte[] in2 = new byte[in.length + 1];
- System.arraycopy(in, 0, in2, 0, in.length);
- in2[in.length] = (byte) c;
- in = in2;
- }
- currIn.close();
+ byte[] in = null; // Will store the bytes of the entry if required.
if (!m_ignoreAnnotations) {
+ // If we need to process annotations, all classes has to be read.
+ in = readEntry(curName);
computeAnnotations(in); // This method adds the class to the
// component list.
}
@@ -480,6 +495,11 @@
for (int i = 0; i < m_components.size(); i++) {
ComponentInfo ci = (ComponentInfo) m_components.get(i);
if (ci.m_classname.equals(curName)) {
+ // So, we have to manipulate the class, if not already read, read the input class
+ // Else reuse the same one.
+ if (in == null) {
+ in = readEntry(curName);
+ }
byte[] outClazz = manipulateComponent(in, ci);
m_classes.put(ci.m_classname, outClazz);