You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by jb...@apache.org on 2012/11/30 17:09:44 UTC

svn commit: r1415718 - in /servicemix/smx4/bundles/trunk: ./ serp-1.14.1/ serp-1.14.1/src/ serp-1.14.1/src/main/ serp-1.14.1/src/main/resources/ serp-1.14.1/src/main/resources/OSGI-INF/

Author: jbonofre
Date: Fri Nov 30 16:09:43 2012
New Revision: 1415718

URL: http://svn.apache.org/viewvc?rev=1415718&view=rev
Log:
[SMX4-1310] Create OSGi bundle for serp 1.14.1

Added:
    servicemix/smx4/bundles/trunk/serp-1.14.1/
    servicemix/smx4/bundles/trunk/serp-1.14.1/pom.xml
    servicemix/smx4/bundles/trunk/serp-1.14.1/src/
    servicemix/smx4/bundles/trunk/serp-1.14.1/src/main/
    servicemix/smx4/bundles/trunk/serp-1.14.1/src/main/resources/
    servicemix/smx4/bundles/trunk/serp-1.14.1/src/main/resources/OSGI-INF/
    servicemix/smx4/bundles/trunk/serp-1.14.1/src/main/resources/OSGI-INF/bundle.info
Modified:
    servicemix/smx4/bundles/trunk/pom.xml

Modified: servicemix/smx4/bundles/trunk/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/bundles/trunk/pom.xml?rev=1415718&r1=1415717&r2=1415718&view=diff
==============================================================================
--- servicemix/smx4/bundles/trunk/pom.xml (original)
+++ servicemix/smx4/bundles/trunk/pom.xml Fri Nov 30 16:09:43 2012
@@ -102,6 +102,7 @@
         <module>rjc-0.6.3</module>
         <module>scala-compiler-2.9.2</module>
         <module>scalaj-collection-1.0</module>
+        <module>serp-1.14.1</module>
     </modules>
 
 </project>

Added: servicemix/smx4/bundles/trunk/serp-1.14.1/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/bundles/trunk/serp-1.14.1/pom.xml?rev=1415718&view=auto
==============================================================================
--- servicemix/smx4/bundles/trunk/serp-1.14.1/pom.xml (added)
+++ servicemix/smx4/bundles/trunk/serp-1.14.1/pom.xml Fri Nov 30 16:09:43 2012
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <!--
+
+         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.
+     -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <artifactId>bundles-pom</artifactId>
+        <groupId>org.apache.servicemix.bundles</groupId>
+        <version>10</version>
+        <relativePath>../bundles-pom/pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.servicemix.bundles</groupId>
+    <artifactId>org.apache.servicemix.bundles.serp</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache ServiceMix :: Bundles :: ${pkgArtifactId}</name>
+    <version>1.14.1_1-SNAPSHOT</version>
+    <description>This OSGi bundle wraps ${pkgArtifactId} ${pkgVersion} jar file.</description>
+
+    <properties>
+        <pkgGroupId>net.sourceforge.serp</pkgGroupId>
+        <pkgArtifactId>serp</pkgArtifactId>
+        <pkgVersion>1.14.1</pkgVersion>
+        <servicemix.osgi.export.pkg>
+            serp
+        </servicemix.osgi.export.pkg>
+        <servicemix.osgi.import.pkg>
+
+        </servicemix.osgi.import.pkg>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>${pkgGroupId}</groupId>
+            <artifactId>${pkgArtifactId}</artifactId>
+            <version>${pkgVersion}</version>
+            <optional>true</optional>
+        </dependency>
+
+        <!-- sources -->
+        <!-- Not available
+        <dependency>
+            <groupId>${pkgGroupId}</groupId>
+            <artifactId>${pkgArtifactId}</artifactId>
+            <version>${pkgVersion}</version>
+            <classifier>sources</classifier>
+            <optional>true</optional>
+        </dependency>
+        -->
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-shade-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <artifactSet>
+                                <includes>
+                                    <include>${pkgGroupId}:${pkgArtifactId}</include>
+                                </includes>
+                            </artifactSet>
+                            <filters>
+                                <filter>
+                                    <artifact>${pkgGroupId}:${pkgArtifactId}</artifact>
+                                    <excludes>
+                                        <exclude>**</exclude>
+                                    </excludes>
+                                </filter>
+                            </filters>
+                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
+                            <createDependencyReducedPom>true</createDependencyReducedPom>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

Added: servicemix/smx4/bundles/trunk/serp-1.14.1/src/main/resources/OSGI-INF/bundle.info
URL: http://svn.apache.org/viewvc/servicemix/smx4/bundles/trunk/serp-1.14.1/src/main/resources/OSGI-INF/bundle.info?rev=1415718&view=auto
==============================================================================
--- servicemix/smx4/bundles/trunk/serp-1.14.1/src/main/resources/OSGI-INF/bundle.info (added)
+++ servicemix/smx4/bundles/trunk/serp-1.14.1/src/main/resources/OSGI-INF/bundle.info Fri Nov 30 16:09:43 2012
@@ -0,0 +1,81 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.description}
+
+    Original Maven URL:
+        \u001B[33mmvn:${pkgGroupId}/${pkgArtifactId}/${pkgVersion}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    Serp is an open source framework for manipulating Java bytecode.
+
+    Bytecode manipulation is a powerful tool in the arsenal of the Java developer. It can be used for tasks from
+    compiling alternative programming languages to run in a JVM, to creating new classes on the fly at runtime, to
+    instrumenting classes for performance analysis, to debugging, to altering or enhancing the capabilities of existing
+    compiled classes. Traditionally, however, this power has come at a price: modifying bytecode has required an
+    in-depth knowledge of the class file structure and has necessitated very low-level programming techniques.
+    These costs have proven too much for most developers, and bytecode manipulation has been largely ignored by the
+    mainstream.
+
+    The goal of the serp bytecode framework is to tap the full power of bytecode modification while lowering its
+    associated costs. The framework provides a set of high-level APIs for manipulating all aspects of bytecode, from
+    large-scale structures like class member fields to the individual instructions that comprise the code of methods.
+    While in order to perform any advanced manipulation, some understanding of the class file format and especially
+    of the JVM instruction set is necessary, the framework makes it as easy as possible to enter the world of bytecode
+    development.
+
+    There are several other excellent bytecode frameworks available. Serp excels, however, in the following areas:
+
+        * Ease of use. Serp provides very high-level APIs for all normal bytecode modification functionality.
+          Additionally, the framework contains a large set of convenience methods to make code that uses it as clean
+          as possible. From overloading its methods to prevent you from having to make type conversions, to making
+          shortcuts for operations like adding default constructors, serp tries to take the pain out of bytecode
+          development.
+        * Power. Serp does not hide any of the power of bytecode manipulation behind a limited set of high-level
+          functions. In addition to its available high-level APIs, which themselves cover the functionality all but
+          the most advanced users will ever need, serp gives you direct access to the low-level details of the class
+          file and constant pool. You can even switch back and forth between low-level and high-level operations; serp
+          maintains complete consistency of the class structure at all times. A change to a method descriptor in the
+          constant pool, for example, will immediately change the return values of all the high-level APIs that describe
+          that method.
+        * Constant pool management. In the class file format, all constant values are stored in a constant pool of
+          shared entries to minimize the size of class structures. Serp gives you access to the constant pool directly,
+          but most of you will never use it; serp's high-level APIs completely abstract management of the constant pool.
+          Any time a new constant is needed, serp will automatically add it to the pool while ensuring that no
+          duplicates ever exist. Serp also does its best to manipulate the pool so that the effects of changing a
+          constant are as expected: i.e. changing one instruction to use the string "bar" instead of "foo" will not
+          affect other instructions that use the string "foo", but changing the name of a member field will instantly
+          change all instructions that reference that field to use the new name.
+        * Instruction morphing. Dealing with the individual instructions that make up method code is the most difficult
+          part of bytecode manipulation. To facilitate this process, most serp instruction representations have the
+          ability to change their underlying low-level opcodes on the fly as the you modify the parameters of the
+          instruction. For example, accessing the constant integer value 0 requires the opcode iconst0, while accessing
+          the string constant "foo" requires a different opcode, ldc, followed by the constant pool index of "foo".
+          In serp, however, there is only one instruction, constant. This instruction has setValue methods which use
+          the given value to automatically determine the correct opcodes and arguments -- iconst0 for a value of 0 and
+          ldc plus the proper constant pool index for the value of "foo".
+
+    Serp is not ideally suited to all applications. Here are a few disadvantages of serp:
+
+        * Speed. Serp is not built for speed. Though there are plans for performing incremental parsing, serp currently
+          fully parses class files when a class is loaded, which is a slow process. Also, serp's insistence on full-time
+          consistency between the low and high-level class structures slows down both access and mutator methods.
+          These factors are less of a concern, though, when creating new classes at runtime (rather than modifying
+          existing code), or when using serp as part of the compilation process. Serp excels in both of these scenarios.
+        * Memory. Serp's high-level structures for representing class bytecode are very memory-hungry.
+        * Multi-threaded modifications. The serp toolkit is not threadsafe. Multiple threads cannot safely make
+          modifications to the same classes the same time.
+        * Project-level modifications. Changes made in one class in a serp project are not yet automatically propogated
+          to other classes. However, there are plans to implement this, as well as plans to allow operations to modify
+          bytecode based on specified patterns, similar to aspect-oriented programming.
+
+    The first step to using bytecode modification is to get familiar with the inner workings of class files.
+    The class file format is covered here. Advanced manipulation involving changing or creating methods requires
+    knowledge of the JVM instruction set, outlined here. Finally, learn to use the javap standard Java tool.
+    Running javap -c on any class name will show you the opcodes of the class' methods -- this gives you an unlimited
+    supply of examples to work from when writing your own opcodes.
+
+    The first class you should study in the serp bytecode toolkit is the serp.bytecode.Project type. From there,
+    move onto the serp.bytecode.BCClass, and trace its APIs into serp.bytecode.BCField, serp.bytecode.BCMethod, and
+    finally into actual serp.bytecode.Code.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mhttp://serp.sourceforge.net/\u001B[0m