diff --git a/dist/pom.xml b/dist/pom.xml
index 753bc1f..03cd9db 100644
--- a/dist/pom.xml
+++ b/dist/pom.xml
@@ -125,6 +125,17 @@
     </dependency>
   </dependencies>
 
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-deploy-plugin</artifactId>
+        <configuration>
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
   <profiles>
     <profile>
       <id>release</id>
diff --git a/trunk/LICENSE.txt b/trunk/LICENSE.txt
deleted file mode 100644
index 6b0b127..0000000
--- a/trunk/LICENSE.txt
+++ /dev/null
@@ -1,203 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed 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.
-
diff --git a/trunk/NOTICE.txt b/trunk/NOTICE.txt
deleted file mode 100644
index a7aa9ed..0000000
--- a/trunk/NOTICE.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Apache Commons Weaver
-Copyright 2012-2014 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
diff --git a/trunk/RELEASE-NOTES.txt b/trunk/RELEASE-NOTES.txt
deleted file mode 100755
index 053d708..0000000
--- a/trunk/RELEASE-NOTES.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-
-              Apache Commons Weaver 1.0
-                  RELEASE NOTES
-
-The Apache Commons team is pleased to announce the release of Apache Commons Weaver 1.0
-
-Apache Commons Weaver provides an easy way to enhance compiled classes with
-new functionality by generating ("weaving") bytecode into those classes.
-
-Initial release
-
-No changes defined in this version.
-
-Historical list of changes: http://commons.apache.org/commons-weaver-parent/changes-report.html
-
-For complete information on Apache Commons Weaver Parent POM, including instructions on how to submit bug reports,
-patches, or suggestions for improvement, see the Apache Apache Commons Weaver Parent POM website:
-
-http://commons.apache.org/commons-weaver-parent/
diff --git a/trunk/ant/lib/pom.xml b/trunk/ant/lib/pom.xml
deleted file mode 100644
index ccd8706..0000000
--- a/trunk/ant/lib/pom.xml
+++ /dev/null
@@ -1,179 +0,0 @@
-<?xml version="1.0"?>
-<!--
-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.
--->
-<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">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-weaver-antlib-parent</artifactId>
-    <version>1.0</version>
-  </parent>
-
-  <artifactId>commons-weaver-antlib</artifactId>
-  <name>Apache Commons Weaver Antlib</name>
-  <description>Apache Commons Weaver Ant task library</description>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <commons.osgi.import />
-  </properties>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/ant/lib</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/ant/lib</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/weaver/tags/1.0_RC2/ant/lib</url>
-  </scm>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-processor</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-      <version>3.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>${ant.version}</version>
-      <scope>provided</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <!-- shade plugin creates but does not clean ${basedir}/dependency-reduced-pom.xml -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-clean-plugin</artifactId>
-        <configuration>
-          <filesets>
-            <fileset>
-              <directory>${basedir}</directory>
-              <includes>
-                <include>dependency-reduced-pom.xml</include>
-              </includes>
-            </fileset>
-          </filesets>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-source-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>attach-test-sources</id>
-            <phase />
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase />
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-shade-plugin</artifactId>
-        <version>2.1</version>
-        <executions>
-          <execution>
-            <id>shade</id>
-            <goals>
-              <goal>shade</goal>
-            </goals>
-            <configuration>
-              <minimizeJar>true</minimizeJar>
-              <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-              <relocations>
-                <relocation>
-                  <pattern>org.apache.commons.lang3.</pattern>
-                  <shadedPattern>org.apache.commons.weaver.ant._lang3.</shadedPattern>
-                </relocation>
-                <relocation>
-                  <pattern>org.apache.commons.io.</pattern>
-                  <shadedPattern>org.apache.commons.weaver.ant._io.</shadedPattern>
-                </relocation>
-                <relocation>
-                  <pattern>org.apache.xbean.</pattern>
-                  <shadedPattern>org.apache.commons.weaver.ant._xbean.</shadedPattern>
-                </relocation>
-              </relocations>
-              <filters>
-                <filter>
-                  <artifact>org.apache.commons:commons-lang3</artifact>
-                  <excludes>
-                    <exclude>META-INF/**</exclude>
-                  </excludes>
-                </filter>
-                <filter>
-                  <artifact>commons-io:commons-io</artifact>
-                  <excludes>
-                    <exclude>META-INF/**</exclude>
-                  </excludes>
-                </filter>
-                <filter>
-                  <artifact>org.apache.xbean:*</artifact>
-                  <excludes>
-                    <exclude>META-INF/**</exclude>
-                  </excludes>
-                </filter>
-              </filters>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-pmd-plugin</artifactId>
-         <configuration>
-          <rulesets>
-            <ruleset>/org/apache/commons/weaver/pmd.xml</ruleset>
-          </rulesets>
-        </configuration>
-     </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-checkstyle-plugin</artifactId>
-        <version>${checkstyle.version}</version>
-        <configuration>
-          <configLocation>org/apache/commons/weaver/checkstyle.xml</configLocation>
-          <headerLocation>org/apache/commons/weaver/license-header.txt</headerLocation>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>findbugs-maven-plugin</artifactId>
-        <configuration>
-          <xmlOutput>true</xmlOutput>
-          <excludeFilterFile>/org/apache/commons/weaver/findbugs-exclude-filter.xml</excludeFilterFile>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
-</project>
diff --git a/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/AbstractWeaverTask.java b/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/AbstractWeaverTask.java
deleted file mode 100644
index fde4f9e..0000000
--- a/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/AbstractWeaverTask.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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.commons.weaver.ant;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.types.Reference;
-
-/**
- * Abstract weaver Ant task. Manages settings for filesystem-based weaving.
- */
-public abstract class AbstractWeaverTask extends Task {
-    private WeaverSettings settings;
-
-    /**
-     * Create a new {@link AbstractWeaverTask} instance.
-     * @param project owner
-     */
-    protected AbstractWeaverTask(final Project project) {
-        super();
-        setProject(project);
-    }
-
-    /**
-     * Add a nested {@link WeaverSettings}.
-     * @param settings to add
-     */
-    public void add(final WeaverSettings settings) {
-        if (this.settings != null) {
-            throw new BuildException("settings already specified");
-        }
-        this.settings = settings;
-    }
-
-    /**
-     * Get the {@link WeaverSettings} in use.
-     * @return {@link WeaverSettings}
-     */
-    public WeaverSettings getSettings() {
-        return settings;
-    }
-
-    /**
-     * Set a project reference to a {@link WeaverSettings} object.
-     * @param refid key
-     */
-    public void setSettingsRef(final String refid) {
-        final WeaverSettings settings = new WeaverSettings(getProject());
-        settings.setRefid(new Reference(getProject(), refid));
-        add(settings);
-    }
-
-}
\ No newline at end of file
diff --git a/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/CleanTask.java b/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/CleanTask.java
deleted file mode 100644
index a91f9da..0000000
--- a/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/CleanTask.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.commons.weaver.ant;
-
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.weaver.CleanProcessor;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-
-/**
- * Clean Ant task.
- */
-public class CleanTask extends AbstractWeaverTask {
-    /**
-     * Create a new {@link CleanTask} instance.
-     * @param project owner
-     */
-    public CleanTask(final Project project) {
-        super(project);
-    }
-
-    /**
-     * Execute the clean task.
-     */
-    @Override
-    public void execute() {
-        try {
-            final WeaverSettings settings = Validate.notNull(getSettings(), "settings");
-            final CleanProcessor cleanProcessor =
-                new CleanProcessor(settings.getClasspathEntries(), settings.getTarget(), settings.getProperties());
-            cleanProcessor.clean();
-        } catch (final Exception e) {
-            throw new BuildException(e);
-        }
-    }
-}
diff --git a/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/InlineProperties.java b/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/InlineProperties.java
deleted file mode 100644
index 8f4ac1e..0000000
--- a/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/InlineProperties.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * 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.commons.weaver.ant;
-
-import java.util.Properties;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.tools.ant.DynamicElementNS;
-
-/**
- * <p>Structure to allow inline specification of properties.</p>
- * <p>Example:
- * {pre}&lt;foo&gt;foo-value&lt;/foo&gt;
- * &lt;bar&gt;bar-value&lt;/bar&gt;
- * &lt;baz&gt;baz
- * -nextline-value&lt;/baz&gt;
- * {/pre}
- * </p>
- */
-public class InlineProperties implements DynamicElementNS {
-    /**
-     * Represents a single inline property.
-     */
-    public final class InlineProperty {
-        private final String name;
-
-        private InlineProperty(final String name) {
-            this.name = name;
-        }
-
-        /**
-         * Add text to this property.
-         * @param text to add
-         */
-        public void addText(final String text) {
-            final String value;
-            if (properties.containsKey(name)) {
-                value = StringUtils.join(properties.getProperty(name), text);
-            } else {
-                value = text;
-            }
-            properties.setProperty(name, value);
-        }
-    }
-
-    /**
-     * {@link Properties} object maintained by the {@link InlineProperties}.
-     */
-    final Properties properties = new Properties();
-
-    /**
-     * Handle the specified nested element.
-     * @param uri String URI
-     * @param localName local element name
-     * @param qName qualified name
-     * @return InlineProperty
-     */
-    @Override
-    public InlineProperty createDynamicElement(final String uri, final String localName, final String qName) {
-        return new InlineProperty(localName);
-    }
-}
\ No newline at end of file
diff --git a/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaveTask.java b/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaveTask.java
deleted file mode 100644
index 414bfb7..0000000
--- a/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaveTask.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.commons.weaver.ant;
-
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.weaver.WeaveProcessor;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-
-/**
- * Weave Ant task.
- */
-public class WeaveTask extends AbstractWeaverTask {
-    /**
-     * Create a new {@link WeaveTask} instance.
-     * @param project owner
-     */
-    public WeaveTask(final Project project) {
-        super(project);
-    }
-
-    /**
-     * Execute the weave task.
-     */
-    @Override
-    public void execute() {
-        try {
-            final WeaverSettings settings = Validate.notNull(getSettings(), "settings");
-            final WeaveProcessor weaveProcessor =
-                new WeaveProcessor(settings.getClasspathEntries(), settings.getTarget(), settings.getProperties());
-            weaveProcessor.weave();
-        } catch (final Exception e) {
-            throw new BuildException(e);
-        }
-    }
-}
diff --git a/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaverSettings.java b/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaverSettings.java
deleted file mode 100644
index dd3104b..0000000
--- a/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaverSettings.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * 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.commons.weaver.ant;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.types.DataType;
-import org.apache.tools.ant.types.EnumeratedAttribute;
-import org.apache.tools.ant.types.Path;
-import org.apache.tools.ant.types.PropertySet;
-import org.apache.tools.ant.types.Reference;
-import org.apache.tools.ant.types.PropertySet.BuiltinPropertySetName;
-
-/**
- * Standalone weaver settings datatype. Handles:
- * <ul>
- * <li>{@code target} attribute - {@link File}</li>
- * <li>{@code classpath} attribute - {@link Path} (incompatible with {@code classpathref})</li>
- * <li>{@code classpathref} attribute - {@link String} (incompatible with {@code classpath})</li>
- * <li>nested {@code propertyset} - {@link PropertySet}</li>
- * <li>nested {@code properties} - {@link InlineProperties}</li>
- * </ul>
- * {@code propertyset} and {@code properties} are merged, with the latter taking precedence.
- */
-public class WeaverSettings extends DataType {
-    private File target;
-    private Path classpath;
-    private String classpathref;
-    private PropertySet propertySet;
-    private InlineProperties inlineProperties;
-
-    /**
-     * Create a new {@link WeaverSettings} object.
-     * @param project owner
-     */
-    public WeaverSettings(final Project project) {
-        super();
-        setProject(project);
-    }
-
-    /**
-     * Get the {@code target} directory.
-     * @return {@link File}
-     */
-    public File getTarget() {
-        if (isReference()) {
-            return getRef().getTarget();
-        }
-        return target;
-    }
-
-    /**
-     * Set the {@code target} directory.
-     * @param target {@link File}
-     */
-    public void setTarget(final File target) {
-        if (isReference()) {
-            throw tooManyAttributes();
-        }
-        this.target = target;
-    }
-
-    /**
-     * Get the {@code classpathref}.
-     * @return {@link String}
-     */
-    public String getClasspathref() {
-        if (isReference()) {
-            return getRef().getClasspathref();
-        }
-        return classpathref;
-    }
-
-    /**
-     * Set the {@code classpathref}.
-     * @param classpathref {@link String}
-     */
-    public void setClasspathRef(final String classpathref) {
-        if (isReference()) {
-            throw tooManyAttributes();
-        }
-        this.classpathref = classpathref;
-    }
-
-    /**
-     * Return the effective classpath (system classpath + configured classpath) as a {@link List} of {@link String}
-     * filesystem paths.
-     * @return List<String>
-     */
-    public List<String> getClasspathEntries() {
-        final Path path = new Path(getProject());
-        final Path classpath = getClasspath();
-        if (classpath != null) {
-            path.add(classpath);
-        }
-        path.add(Path.systemClasspath);
-
-        return Arrays.asList(path.list());
-    }
-
-    /**
-     * Get the {@code classpath}.
-     * @return {@link Path}
-     */
-    public Path getClasspath() {
-        if (isReference()) {
-            return getRef().getClasspath();
-        }
-        if (classpath == null) {
-            if (getClasspathref() != null) {
-                final Path ref = new Path(getProject());
-                ref.setRefid(new Reference(getProject(), getClasspathref()));
-                return ref;
-            }
-        } else if (StringUtils.isNotBlank(getClasspathref())) {
-            throw new BuildException("Only one of classpathref|classpath is permitted.");
-        }
-        return classpath;
-    }
-
-    /**
-     * Set the {@code classpath}.
-     * @param classpath {@link Path}
-     */
-    public void setClasspath(final Path classpath) {
-        if (isReference()) {
-            throw tooManyAttributes();
-        }
-        if (this.classpath != null) {
-            throw new BuildException("classpath already set");
-        }
-        this.classpath = classpath;
-    }
-
-    /**
-     * Create the nested {@code properties}.
-     * @return {@link InlineProperties}
-     */
-    public InlineProperties createProperties() {
-        if (isReference()) {
-            throw noChildrenAllowed();
-        }
-        if (inlineProperties != null) {
-            throw new BuildException("properties already specified");
-        }
-        inlineProperties = new InlineProperties();
-        return inlineProperties;
-    }
-
-    /**
-     * Create a nested {@code propertyset}.
-     * @return {@link PropertySet}
-     */
-    public PropertySet createPropertySet() {
-        if (isReference()) {
-            throw noChildrenAllowed();
-        }
-        if (propertySet != null) {
-            throw new BuildException("propertyset already specified");
-        }
-        propertySet = new PropertySet();
-        propertySet.setProject(getProject());
-        return propertySet;
-    }
-
-    /**
-     * Merge nested {@code propertyset} and {@code properties}; latter takes precedence.
-     * @return Properties
-     */
-    public Properties getProperties() {
-        if (isReference()) {
-            return getRef().getProperties();
-        }
-        if (propertySet == null && inlineProperties == null) {
-            createPropertySet().appendBuiltin(
-                (BuiltinPropertySetName) EnumeratedAttribute.getInstance(BuiltinPropertySetName.class, "all"));
-        }
-        final Properties result = new Properties();
-        if (propertySet != null) {
-            result.putAll(propertySet.getProperties());
-        }
-        if (inlineProperties != null) {
-            for (final Map.Entry<Object, Object> entry : inlineProperties.properties.entrySet()) {
-                result.put(entry.getKey(), StringUtils.trim((String) entry.getValue()));
-            }
-        }
-        return result;
-    }
-
-    private WeaverSettings getRef() {
-        return getCheckedRef(WeaverSettings.class, "settings");
-    }
-
-}
\ No newline at end of file
diff --git a/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/package-info.java b/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/package-info.java
deleted file mode 100644
index 7ecdb2f..0000000
--- a/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * Integration with Apache Ant.
- */
-package org.apache.commons.weaver.ant;
\ No newline at end of file
diff --git a/trunk/ant/lib/src/main/resources/org/apache/commons/weaver/ant/antlib.xml b/trunk/ant/lib/src/main/resources/org/apache/commons/weaver/ant/antlib.xml
deleted file mode 100644
index aa3e353..0000000
--- a/trunk/ant/lib/src/main/resources/org/apache/commons/weaver/ant/antlib.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0"?>
-<!--
-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.
--->
-<antlib>
-  <typedef name="settings" classname="org.apache.commons.weaver.ant.WeaverSettings" />
-  <taskdef name="clean" classname="org.apache.commons.weaver.ant.CleanTask" />
-  <taskdef name="weave" classname="org.apache.commons.weaver.ant.WeaveTask" />
-</antlib>
diff --git a/trunk/ant/lib/src/site/markdown/index.md b/trunk/ant/lib/src/site/markdown/index.md
deleted file mode 100644
index 6bbb5fc..0000000
--- a/trunk/ant/lib/src/site/markdown/index.md
+++ /dev/null
@@ -1,50 +0,0 @@
-<!--
-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.
--->
-
-## Apache Commons Weaver Antlib
-
-Provides an Antlib in the `antlib:org.apache.commons.weaver` namespace,
-consisting of the following tasks:
-
-### clean
-
-Invokes available [Cleaner][cleaner] implementations.
-
-### weave
-
-Invokes available [Weaver][weaver] implementations.
-
-
-Both the **weave** and **clean** tasks are parameterized either by
-nesting or by reference (via the `settingsref` attribute) with a
-custom type:
-
-### settings
-
- * `target` attribute - specifies the location of the classfiles to weave
- * `classpath` attribute - path string (incompatible with `classpathref`)
- * `classpathref` attribute - refid of an Ant **path**
- (incompatible with `classpath`)
- * nested `propertyset` - Ant **PropertySet**
- * nested `properties` - specifies properties using the names and text values
- of nested elements (looks like Maven POM properties)
-
-
-[cleaner]: ../../apidocs/org/apache/commons/weaver/spi/Cleaner.html
-[weaver]: ../../apidocs/org/apache/commons/weaver/spi/Weaver.html
diff --git a/trunk/ant/pom.xml b/trunk/ant/pom.xml
deleted file mode 100644
index d3c1bdd..0000000
--- a/trunk/ant/pom.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<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">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-weaver-parent</artifactId>
-    <version>1.0</version>
-  </parent>
-
-  <artifactId>commons-weaver-antlib-parent</artifactId>
-  <name>Apache Commons Weaver Antlib Parent</name>
-  <packaging>pom</packaging>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/ant</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/ant</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/weaver/tags/1.0_RC2/ant</url>
-  </scm>
-
-  <modules>
-    <module>lib</module>
-    <module>test</module>
-  </modules>
-</project>
diff --git a/trunk/ant/test/pom.xml b/trunk/ant/test/pom.xml
deleted file mode 100644
index d779ad0..0000000
--- a/trunk/ant/test/pom.xml
+++ /dev/null
@@ -1,302 +0,0 @@
-<?xml version="1.0"?>
-<!--
-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.
--->
-<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">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-weaver-antlib-parent</artifactId>
-    <version>1.0</version>
-  </parent>
-
-  <artifactId>commons-weaver-antlib-test</artifactId>
-  <name>Apache Commons Weaver Antlib Test</name>
-  <description>Uses the privilizer example to test the antlib</description>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <privilizer.policy>DYNAMIC</privilizer.policy>
-  </properties>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/ant/test</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/ant/test</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/weaver/tags/1.0_RC2/ant/test</url>
-  </scm>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-privilizer-api</artifactId>
-      <version>${project.version}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-  <profiles>
-    <profile>
-      <id>antlib-test</id>
-      <activation>
-        <property>
-          <name>!antlib-test-skip</name>
-        </property>
-      </activation>
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-dependency-plugin</artifactId>
-            <executions>
-              <execution>
-                <id>unpack-example-sources</id>
-                <phase>generate-sources</phase>
-                <goals>
-                  <goal>unpack</goal>
-                </goals>
-                <configuration>
-                  <artifactItems>
-                    <artifactItems>
-                      <groupId>org.apache.commons</groupId>
-                      <artifactId>commons-weaver-example</artifactId>
-                      <version>${project.version}</version>
-                      <classifier>sources</classifier>
-                      <includes>**/*.java</includes>
-                      <outputDirectory>${project.build.directory}/example-sources</outputDirectory>
-                    </artifactItems>
-                  </artifactItems>
-                </configuration>
-              </execution>
-              <execution>
-                <id>copy-dependencies</id>
-                <phase>generate-sources</phase>
-                <goals>
-                  <goal>copy-dependencies</goal>
-                </goals>
-                <configuration>
-                  <outputDirectory>${project.build.directory}/compile-classpath</outputDirectory>
-                  <includeArtifactIds>commons-weaver-antlib,commons-weaver-privilizer,commons-weaver-privilizer-api,commons-io,asm,asm-commons,asm-tree,asm-util</includeArtifactIds>
-                </configuration>
-              </execution>
-              <execution>
-                <id>unpack-example-test-sources</id>
-                <phase>generate-test-sources</phase>
-                <goals>
-                  <goal>unpack</goal>
-                </goals>
-                <configuration>
-                  <artifactItems>
-                    <artifactItems>
-                      <groupId>org.apache.commons</groupId>
-                      <artifactId>commons-weaver-example</artifactId>
-                      <version>${project.version}</version>
-                      <classifier>test-sources</classifier>
-                      <includes>**/*.java</includes>
-                      <outputDirectory>${project.build.directory}/example-test-sources</outputDirectory>
-                    </artifactItems>
-                  </artifactItems>
-                </configuration>
-              </execution>
-              <execution>
-                <id>unpack-example-test-resources</id>
-                <phase>generate-test-resources</phase>
-                <goals>
-                  <goal>unpack</goal>
-                </goals>
-                <configuration>
-                  <artifactItems>
-                    <artifactItems>
-                      <groupId>org.apache.commons</groupId>
-                      <artifactId>commons-weaver-example</artifactId>
-                      <version>${project.version}</version>
-                      <classifier>test-sources</classifier>
-                      <includes>java.policy</includes>
-                      <outputDirectory>${project.build.directory}/example-test-resources</outputDirectory>
-                    </artifactItems>
-                  </artifactItems>
-                </configuration>
-              </execution>
-            </executions>
-          </plugin>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-antrun-plugin</artifactId>
-            <executions>
-              <execution>
-                <id>clean</id>
-                <phase>process-sources</phase>
-                <goals>
-                  <goal>run</goal>
-                </goals>
-                <configuration>
-                  <target>
-                    <sequential xmlns:cw="antlib:org.apache.commons.weaver.ant">
-                      <path id="cp">
-                        <fileset dir="${project.build.directory}/compile-classpath" erroronmissingdir="false" />
-                      </path>
-                      <typedef uri="antlib:org.apache.commons.weaver.ant" resource="org/apache/commons/weaver/ant/antlib.xml" classpathref="cp" />
-
-                      <cw:clean>
-                        <cw:settings target="${project.build.outputDirectory}" classpathref="cp">
-                          <properties>
-                            <privilizer.policy>${privilizer.policy}</privilizer.policy>
-                            <privilizer.accessLevel>PACKAGE</privilizer.accessLevel>
-                          </properties>
-                        </cw:settings>
-                      </cw:clean>
-                    </sequential>
-                  </target>
-                </configuration>
-              </execution>
-              <execution>
-                <id>weave</id>
-                <phase>process-classes</phase>
-                <goals>
-                  <goal>run</goal>
-                </goals>
-                <configuration>
-                  <target>
-                    <sequential xmlns:cw="antlib:org.apache.commons.weaver.ant">
-                      <path id="cp">
-                        <fileset dir="${project.build.directory}/compile-classpath" />
-                      </path>
-                      <typedef uri="antlib:org.apache.commons.weaver.ant" resource="org/apache/commons/weaver/ant/antlib.xml" classpathref="cp" />
-
-                      <cw:weave>
-                        <cw:settings target="${project.build.outputDirectory}" classpathref="cp">
-                          <properties>
-                            <privilizer.policy>${privilizer.policy}</privilizer.policy>
-                            <privilizer.accessLevel>PACKAGE</privilizer.accessLevel>
-                          </properties>
-                        </cw:settings>
-                      </cw:weave>
-                    </sequential>
-                  </target>
-                </configuration>
-              </execution>
-            </executions>
-            <dependencies>
-              <dependency>
-                <groupId>org.apache.commons</groupId>
-                <artifactId>commons-weaver-antlib</artifactId>
-                <version>${project.version}</version>
-              </dependency>
-              <dependency>
-                <groupId>org.apache.commons</groupId>
-                <artifactId>commons-weaver-privilizer</artifactId>
-                <version>${project.version}</version>
-              </dependency>
-              <dependency>
-                <groupId>org.apache.ant</groupId>
-                <artifactId>ant</artifactId>
-                <version>${ant.version}</version>
-              </dependency>
-            </dependencies>
-          </plugin>
-          <plugin>
-            <groupId>org.codehaus.mojo</groupId>
-            <artifactId>build-helper-maven-plugin</artifactId>
-            <executions>
-              <execution>
-                <id>add-sources</id>
-                <phase>generate-sources</phase>
-                <goals>
-                  <goal>add-source</goal>
-                </goals>
-                <configuration>
-                  <sources>
-                    <source>${project.build.directory}/example-sources</source>
-                  </sources>
-                </configuration>
-              </execution>
-              <execution>
-                <id>add-test-sources</id>
-                <phase>generate-test-sources</phase>
-                <goals>
-                  <goal>add-test-source</goal>
-                </goals>
-                <configuration>
-                  <sources>
-                    <source>${project.build.directory}/example-test-sources</source>
-                  </sources>
-                </configuration>
-              </execution>
-            </executions>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-    <profile>
-      <id>sec</id>
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-antrun-plugin</artifactId>
-            <executions>
-              <execution>
-                <id>filter-testResources</id>
-                <phase>process-test-resources</phase>
-                <goals>
-                  <goal>run</goal>
-                </goals>
-                <configuration>
-                  <target>
-                    <mkdir dir="${project.build.testOutputDirectory}" />
-                    <condition property="slash" value="/" else="">
-                      <os family="windows" />
-                    </condition>
-                    <copy todir="${project.build.testOutputDirectory}" overwrite="true">
-                      <fileset dir="${project.build.directory}/example-test-resources" erroronmissingdir="false" />
-                      <filterchain>
-                        <expandproperties />
-                        <!-- append extra slash on windows only -->
-                        <replacestring from="file://" to="file://${slash}" />
-                        <replacestring from="${file.separator}" to="/" />
-                        <!-- preserve system-specific file separator -->
-                        <replacestring from="$${preserve.project.build.directory}" to="${project.build.directory}" />
-                      </filterchain>
-                    </copy>
-                  </target>
-                </configuration>
-              </execution>
-            </executions>
-            <dependencies>
-              <dependency>
-                <groupId>org.apache.ant</groupId>
-                <artifactId>ant</artifactId>
-                <version>${ant.version}</version>
-              </dependency>
-            </dependencies>
-          </plugin>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-surefire-plugin</artifactId>
-            <configuration>
-              <argLine>-Djava.security.manager -Djava.security.policy=${project.build.testOutputDirectory}/java.policy</argLine>
-            </configuration>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-  </profiles>
-</project>
diff --git a/trunk/build-tools/pom.xml b/trunk/build-tools/pom.xml
deleted file mode 100644
index b8f42e2..0000000
--- a/trunk/build-tools/pom.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<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">
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-weaver-parent</artifactId>
-    <version>1.0</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>commons-weaver-build-tools</artifactId>
-  <name>Apache Commons Weaver Build Tools</name>
-  <description>Provide common setup, from http://maven.apache.org/plugins/maven-checkstyle-plugin/examples/multi-module-config.html</description>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/build-tools</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/build-tools</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/weaver/tags/1.0_RC2/build-tools</url>
-  </scm>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-source-plugin</artifactId>
-        <configuration>
-          <skipSource>true</skipSource>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>attach-test-jar</id>
-            <phase />
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-javadoc-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>create-javadoc-jar</id>
-            <phase />
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/trunk/build-tools/src/main/resources/org/apache/commons/weaver/checkstyle.xml b/trunk/build-tools/src/main/resources/org/apache/commons/weaver/checkstyle.xml
deleted file mode 100644
index 9cdb3c0..0000000
--- a/trunk/build-tools/src/main/resources/org/apache/commons/weaver/checkstyle.xml
+++ /dev/null
@@ -1,207 +0,0 @@
-<?xml version="1.0"?>
-<!--
-   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.
--->
-<!DOCTYPE module PUBLIC
-    "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
-    "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
-
-<!--
-
-  Checkstyle configuration that checks the sun coding conventions from:
-
-    - the Java Language Specification at
-      http://java.sun.com/docs/books/jls/second_edition/html/index.html
-
-    - the Sun Code Conventions at http://java.sun.com/docs/codeconv/
-
-    - the Javadoc guidelines at
-      http://java.sun.com/j2se/javadoc/writingdoccomments/index.html
-
-    - the JDK Api documentation http://java.sun.com/j2se/docs/api/index.html
-
-    - some best practices
-
-  Checkstyle is very configurable. Be sure to read the documentation at
-  http://checkstyle.sf.net (or in your downloaded distribution).
-
-  Most Checks are configurable, be sure to consult the documentation.
-
-  To completely disable a check, just comment it out or delete it from the file.
-
-  Finally, it is worth reading the documentation.
-
--->
-
-<module name="Checker">
-    <!--
-        If you set the basedir property below, then all reported file
-        names will be relative to the specified directory. See
-        http://checkstyle.sourceforge.net/5.x/config.html#Checker
-
-        <property name="basedir" value="${basedir}" />
-    -->
-
-    <!-- Checks that each Java package has a Javadoc file used for commenting. -->
-    <!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocPackage       -->
-    <module name="JavadocPackage" />
-
-    <!-- Checks that property files contain the same keys.         -->
-    <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
-    <module name="Translation" />
-
-    <module name="FileLength" />
-
-    <!-- Following interprets the header file as regular expressions. -->
-    <!-- <module name="RegexpHeader" />                                -->
-
-    <module name="FileTabCharacter">
-        <property name="eachLine" value="true" />
-    </module>
-
-    <module name="RegexpSingleline">
-        <!-- \s matches whitespace character, $ matches end of line. -->
-        <property name="format" value="\s+$" />
-        <property name="message" value="Line has trailing spaces." />
-    </module>
-
-    <module name="TreeWalker">
-
-        <property name="cacheFile" value="${checkstyle.cache.file}" />
-
-        <!-- Checks for Javadoc comments.                     -->
-        <!-- See http://checkstyle.sf.net/config_javadoc.html -->
-        <module name="JavadocMethod">
-            <property name="scope" value="protected" />
-            <property name="allowUndeclaredRTE" value="true" />
-        </module>
-        <module name="JavadocType">
-            <property name="scope" value="protected" />
-        </module>
-        <module name="JavadocVariable">
-            <property name="scope" value="protected" />
-        </module>
-        <module name="JavadocStyle" />
-
-
-        <!-- Checks for Naming Conventions.                  -->
-        <!-- See http://checkstyle.sf.net/config_naming.html -->
-        <module name="ConstantName" />
-        <module name="LocalFinalVariableName" />
-        <module name="LocalVariableName" />
-        <module name="MemberName" />
-        <module name="MethodName" />
-        <module name="PackageName" />
-        <module name="ParameterName" />
-        <module name="StaticVariableName" />
-        <module name="TypeName" />
-
-
-        <!-- Checks for Headers                                -->
-        <!-- See http://checkstyle.sf.net/config_header.html   -->
-        <!-- <module name="Header">                            -->
-            <!-- The follow property value demonstrates the ability     -->
-            <!-- to have access to ANT properties. In this case it uses -->
-            <!-- the ${basedir} property to allow Checkstyle to be run  -->
-            <!-- from any directory within a project. See property      -->
-            <!-- expansion,                                             -->
-            <!-- http://checkstyle.sf.net/config.html#properties        -->
-            <!-- <property                                              -->
-            <!--     name="headerFile"                                  -->
-            <!--     value="${basedir}/java.header" />                   -->
-        <!-- </module> -->
-
-
-        <!-- Checks for imports                              -->
-        <!-- See http://checkstyle.sf.net/config_import.html -->
-        <module name="AvoidStarImport" />
-        <module name="IllegalImport" /> <!-- defaults to sun.* packages -->
-        <module name="RedundantImport" />
-        <module name="UnusedImports">
-            <property name="processJavadoc" value="true" />
-        </module>
-
-
-        <!-- Checks for Size Violations.                    -->
-        <!-- See http://checkstyle.sf.net/config_sizes.html -->
-        <module name="LineLength">
-            <property name="max" value="120" />
-        </module>
-        <module name="MethodLength" />
-        <module name="ParameterNumber" />
-
-
-        <!-- Checks for whitespace                               -->
-        <!-- See http://checkstyle.sf.net/config_whitespace.html -->
-        <module name="EmptyForIteratorPad" />
-        <module name="MethodParamPad" />
-        <module name="NoWhitespaceAfter">
-            <property name="tokens" value="BNOT,DEC,DOT,INC,LNOT,UNARY_MINUS,UNARY_PLUS" />
-        </module>
-        <module name="NoWhitespaceBefore" />
-        <module name="OperatorWrap" />
-        <module name="ParenPad" />
-        <module name="TypecastParenPad" />
-        <module name="WhitespaceAfter" />
-        <module name="WhitespaceAround" />
-
-
-        <!-- Modifier Checks                                    -->
-        <!-- See http://checkstyle.sf.net/config_modifiers.html -->
-        <module name="ModifierOrder" />
-        <module name="RedundantModifier" />
-
-
-        <!-- Checks for blocks. You know, those {}'s         -->
-        <!-- See http://checkstyle.sf.net/config_blocks.html -->
-        <module name="EmptyBlock">
-            <property name="option" value="text" />
-        </module>
-        <module name="LeftCurly" />
-        <module name="NeedBraces" />
-        <module name="RightCurly" />
-
-
-        <!-- Checks for common coding problems               -->
-        <!-- See http://checkstyle.sf.net/config_coding.html -->
-        <module name="EmptyStatement" />
-        <module name="EqualsHashCode" />
-        <module name="IllegalInstantiation" />
-        <module name="InnerAssignment" />
-        <module name="MissingSwitchDefault" />
-        <module name="ModifiedControlVariable" />
-        <module name="ParameterAssignment" />
-        <module name="RedundantThrows" />
-        <module name="SimplifyBooleanExpression" />
-        <module name="SimplifyBooleanReturn" />
-        <module name="StringLiteralEquality" />
-
-        <!-- Checks for class design                         -->
-        <!-- See http://checkstyle.sf.net/config_design.html -->
-        <module name="FinalClass" />
-        <module name="HideUtilityClassConstructor" />
-        <module name="InterfaceIsType" />
-
-
-        <!-- Miscellaneous other checks.                   -->
-        <!-- See http://checkstyle.sf.net/config_misc.html -->
-        <module name="ArrayTypeStyle" />
-        <module name="TodoComment" />
-        <module name="UpperEll" />
-
-    </module>
-
-</module>
diff --git a/trunk/build-tools/src/main/resources/org/apache/commons/weaver/findbugs-exclude-filter.xml b/trunk/build-tools/src/main/resources/org/apache/commons/weaver/findbugs-exclude-filter.xml
deleted file mode 100644
index 91a25ce..0000000
--- a/trunk/build-tools/src/main/resources/org/apache/commons/weaver/findbugs-exclude-filter.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0"?>
-<!--
-   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.
--->
-
-<!--
-  This file contains some false positive bugs detected by findbugs. Their
-  false positive nature has been analyzed individually and they have been
-  put here to instruct findbugs it must ignore them.
--->
-<FindBugsFilter>
-
-  <!-- Reason: require that code execution hierarchy invoking CleanProcessor
-       has privileges directly assigned
-   -->
-  <Match>
-    <Class name="org.apache.commons.weaver.CleanProcessor" />
-    <Method name="clean" />
-    <Bug pattern="DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED" />
-  </Match>
-
-  <!-- Reason: require that code execution hierarchy invoking WeaveProcessor
-       has privileges directly assigned
-   -->
-  <Match>
-    <Class name="org.apache.commons.weaver.WeaveProcessor" />
-    <Method name="weave" />
-    <Bug pattern="DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED" />
-  </Match>
-
-  <!-- Reason: generated code -->
-  <Match>
-    <Class name="org.apache.commons.weaver.maven.HelpMojo" />
-  </Match>
-</FindBugsFilter>
diff --git a/trunk/build-tools/src/main/resources/org/apache/commons/weaver/license-header.txt b/trunk/build-tools/src/main/resources/org/apache/commons/weaver/license-header.txt
deleted file mode 100644
index f974c9a..0000000
--- a/trunk/build-tools/src/main/resources/org/apache/commons/weaver/license-header.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * 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.
- */
\ No newline at end of file
diff --git a/trunk/build-tools/src/main/resources/org/apache/commons/weaver/pmd.xml b/trunk/build-tools/src/main/resources/org/apache/commons/weaver/pmd.xml
deleted file mode 100644
index 1aee97c..0000000
--- a/trunk/build-tools/src/main/resources/org/apache/commons/weaver/pmd.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0"?>
-<!--
-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.
--->
-<ruleset name="mybraces"
-    xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
-  <description>Custom PMD setup for Apache Commons Weaver</description>
-
-  <rule ref="rulesets/java/basic.xml">
-    <exclude name="AvoidBranchingStatementAsLastInLoop" />
-  </rule>
-
-  <rule ref="rulesets/java/design.xml">
-    <exclude name="AccessorClassGeneration" />
-    <exclude name="CompareObjectsWithEquals" />
-    <exclude name="NonStaticInitializer" />
-    <exclude name="ConfusingTernary" />
-    <exclude name="AvoidSynchronizedAtMethodLevel" />
-    <exclude name="UnnecessaryLocalBeforeReturn" />
-    <exclude name="PreserveStackTrace" />
-    <exclude name="EmptyMethodInAbstractClassShouldBeAbstract" />
-    <exclude name="FieldDeclarationsShouldBeAtStartOfClass" />
-    <exclude name="GodClass" />
-  </rule>
-
-  <rule ref="rulesets/java/empty.xml" />
-  <rule ref="rulesets/java/imports.xml" />
-  <rule ref="rulesets/java/migrating.xml">
-    <exclude name="JUnit4TestShouldUseTestAnnotation" />
-  </rule>
-  <rule ref="rulesets/java/naming.xml">
-    <exclude name="AbstractNaming" />
-    <exclude name="AvoidFieldNameMatchingMethodName" />
-    <exclude name="GenericsNaming" />
-    <exclude name="LongVariable" />
-    <exclude name="ShortClassName" />
-    <exclude name="ShortMethodName" />
-  </rule>
-  <rule ref="rulesets/java/optimizations.xml">
-    <exclude name="AvoidInstantiatingObjectsInLoops" />
-    <exclude name="PrematureDeclaration" />
-  </rule>
-  <rule ref="rulesets/java/strings.xml">
-    <exclude name="AvoidDuplicateLiterals" />
-  </rule>
-  <rule ref="rulesets/java/strings.xml/AvoidDuplicateLiterals">
-    <properties>
-      <property name="exceptionList" value="unchecked,rawtypes" />
-    </properties>
-  </rule>
-
-  <rule ref="rulesets/java/sunsecure.xml" />
-  <rule ref="rulesets/java/typeresolution.xml" />
-  <rule ref="rulesets/java/unnecessary.xml" />
-  <rule ref="rulesets/java/unusedcode.xml" />
-
-  <rule ref="rulesets/java/controversial.xml/UnnecessaryConstructor" />
-  <rule ref="rulesets/java/controversial.xml/AssignmentInOperand" />
-  <rule ref="rulesets/java/controversial.xml/DontImportSun" />
-  <rule ref="rulesets/java/controversial.xml/UnnecessaryParentheses" />
-  <rule ref="rulesets/java/controversial.xml/BooleanInversion" />
-</ruleset>
diff --git a/trunk/dist/pom.xml b/trunk/dist/pom.xml
deleted file mode 100644
index 03cd9db..0000000
--- a/trunk/dist/pom.xml
+++ /dev/null
@@ -1,168 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<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">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-weaver-parent</artifactId>
-    <version>1.0</version>
-  </parent>
-
-  <artifactId>commons-weaver</artifactId>
-  <packaging>pom</packaging>
-  <name>Apache Commons Weaver Distribution</name>
-  <description>
-    Creates the Apache Commons Weaver multimodule distribution.
-  </description>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/dist</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/dist</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/weaver/tags/1.0_RC2/dist</url>
-  </scm>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-processor</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-processor</artifactId>
-      <classifier>sources</classifier>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-processor</artifactId>
-      <classifier>javadoc</classifier>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-privilizer-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-privilizer-api</artifactId>
-      <classifier>sources</classifier>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-privilizer-api</artifactId>
-      <classifier>javadoc</classifier>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-privilizer</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-privilizer</artifactId>
-      <classifier>sources</classifier>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-privilizer</artifactId>
-      <classifier>javadoc</classifier>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-normalizer</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-normalizer</artifactId>
-      <classifier>sources</classifier>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-normalizer</artifactId>
-      <classifier>javadoc</classifier>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-maven-plugin</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-maven-plugin</artifactId>
-      <classifier>sources</classifier>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-maven-plugin</artifactId>
-      <classifier>javadoc</classifier>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-antlib</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-antlib</artifactId>
-      <classifier>sources</classifier>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-antlib</artifactId>
-      <classifier>javadoc</classifier>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-deploy-plugin</artifactId>
-        <configuration>
-          <skip>true</skip>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-  <profiles>
-    <profile>
-      <id>release</id>
-      <build>
-        <plugins>
-          <plugin>
-            <artifactId>maven-assembly-plugin</artifactId>
-            <version>2.4</version>
-            <executions>
-              <execution>
-                <id>create-distribution</id>
-                <phase>package</phase>
-                <goals>
-                  <goal>single</goal>
-                </goals>
-                <configuration>
-                  <descriptors>
-                    <descriptor>src/assembly/bin.xml</descriptor>
-                    <descriptor>src/assembly/src.xml</descriptor>
-                  </descriptors>
-                  <tarLongFileMode>gnu</tarLongFileMode>
-                </configuration>
-              </execution>
-            </executions>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-  </profiles>
-</project>
diff --git a/trunk/dist/src/assembly/bin.xml b/trunk/dist/src/assembly/bin.xml
deleted file mode 100644
index 2ab3c22..0000000
--- a/trunk/dist/src/assembly/bin.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<!--
- 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.
--->
-<assembly>
-  <id>bin</id>
-  <formats>
-    <format>tar.gz</format>
-    <format>zip</format>
-  </formats>
-  <baseDirectory>${project.artifactId}-${commons.release.version}</baseDirectory>
-  <includeSiteDirectory>false</includeSiteDirectory>
-  <dependencySets>
-    <dependencySet>
-      <useProjectArtifact>false</useProjectArtifact>
-      <useTransitiveDependencies>false</useTransitiveDependencies>
-    </dependencySet>
-  </dependencySets>
-
-  <fileSets>
-    <fileSet>
-      <directory>${project.basedir}/..</directory>
-      <includes>
-        <include>LICENSE.txt</include>
-        <include>NOTICE.txt</include>
-        <include>RELEASE-NOTES.txt</include>
-      </includes>
-    </fileSet>
-  </fileSets>
-</assembly>
diff --git a/trunk/dist/src/assembly/src.xml b/trunk/dist/src/assembly/src.xml
deleted file mode 100644
index aa8ab44..0000000
--- a/trunk/dist/src/assembly/src.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<!--
- 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.
--->
-<assembly>
-  <id>src</id>
-  <formats>
-    <format>tar.gz</format>
-    <format>zip</format>
-  </formats>
-  <baseDirectory>${project.artifactId}-${commons.release.version}-src</baseDirectory>
-  <fileSets>
-    <fileSet>
-      <directory>${project.basedir}/..</directory>
-      <excludes>
-        <exclude>${project.build.directory}/**</exclude>
-        <exclude>.*/**</exclude>
-        <exclude>**/${project.build.directory}/**</exclude>
-        <exclude>**/.*/**</exclude>
-        <exclude>**/dependency-reduced-pom.xml</exclude>
-      </excludes>
-    </fileSet>
-  </fileSets>
-</assembly>
diff --git a/trunk/example/pom.xml b/trunk/example/pom.xml
deleted file mode 100644
index 4b6ad9a..0000000
--- a/trunk/example/pom.xml
+++ /dev/null
@@ -1,169 +0,0 @@
-<?xml version="1.0"?>
-<!--
-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.
--->
-<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">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-parent</artifactId>
-    <version>1.0</version>
-  </parent>
-  <artifactId>commons-weaver-example</artifactId>
-  <name>Apache Commons Weaver Privilizer Example</name>
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <privilizer.policy>ON_INIT</privilizer.policy>
-    <privilizer.verify>true</privilizer.verify>
-  </properties>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/example</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/example</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/weaver/tags/1.0_RC2/example</url>
-  </scm>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-privilizer-api</artifactId>
-      <version>${project.version}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-maven-plugin</artifactId>
-        <version>${project.version}</version>
-        <configuration>
-          <weaverConfig>
-            <privilizer.accessLevel>PACKAGE</privilizer.accessLevel>
-            <privilizer.policy>${privilizer.policy}</privilizer.policy>
-            <privilizer.verify>${privilizer.verify}</privilizer.verify>
-          </weaverConfig>
-        </configuration>
-        <executions>
-          <execution>
-            <goals>
-              <goal>prepare</goal>
-              <goal>weave</goal>
-            </goals>
-          </execution>
-        </executions>
-        <dependencies>
-          <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-weaver-privilizer</artifactId>
-            <version>${project.version}</version>
-          </dependency>
-        </dependencies>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <redirectTestOutputToFile>true</redirectTestOutputToFile>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-  <profiles>
-    <profile>
-      <id>sec</id>
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-resources-plugin</artifactId>
-            <executions>
-              <execution>
-                <id>default-testResources</id>
-                <phase />
-                <goals>
-                  <goal>testResources</goal>
-                </goals>
-              </execution>
-            </executions>
-          </plugin>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-antrun-plugin</artifactId>
-            <executions>
-              <execution>
-                <id>filter-testResources</id>
-                <phase>process-test-resources</phase>
-                <goals>
-                  <goal>run</goal>
-                </goals>
-                <configuration>
-                  <target>
-                    <mkdir dir="${project.build.testOutputDirectory}" />
-                    <condition property="slash" value="/" else="">
-                      <os family="windows" />
-                    </condition>
-                    <copy todir="${project.build.testOutputDirectory}" overwrite="true">
-                      <fileset dir="${project.basedir}/src/test/resources" erroronmissingdir="false" />
-                      <filterchain>
-                        <expandproperties />
-                        <!-- append extra slash on windows only -->
-                        <replacestring from="file://" to="file://${slash}" />
-                        <replacestring from="${file.separator}" to="/" />
-                        <!-- preserve system-specific file separator -->
-                        <expandproperties>
-                          <propertyset>
-                            <propertyref prefix="project." />
-                            <globmapper from="*" to="preserve.*" />
-                          </propertyset>
-                        </expandproperties>
-                      </filterchain>
-                    </copy>
-                  </target>
-                </configuration>
-              </execution>
-            </executions>
-            <dependencies>
-              <dependency>
-                <groupId>org.apache.ant</groupId>
-                <artifactId>ant</artifactId>
-                <version>${ant.version}</version>
-              </dependency>
-            </dependencies>
-          </plugin>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-surefire-plugin</artifactId>
-            <configuration>
-              <argLine>-Djava.security.manager -Djava.security.policy=${project.build.testOutputDirectory}/java.policy</argLine>
-            </configuration>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-  </profiles>
-</project>
diff --git a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/NoArgs.java b/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/NoArgs.java
deleted file mode 100644
index ff3072a..0000000
--- a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/NoArgs.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import org.apache.commons.weaver.privilizer.Privileged;
-
-public class NoArgs {
-
-    @Privileged
-    void throwAwayFoo() {
-        System.getProperty("foo");
-    }
-
-    @Privileged
-    String getFoo() {
-        return System.getProperty("foo");
-    }
-
-    @Privileged
-    Boolean getTrue() {
-        System.getProperty("foo");
-        return Boolean.TRUE;
-    }
-
-    @Privileged
-    boolean getFalse() {
-        System.getProperty("foo");
-        return false;
-    }
-
-    public static class CheckedException1 extends Exception {
-        private static final long serialVersionUID = 1L;
-    }
-
-    public static class CheckedException2 extends Exception {
-        private static final long serialVersionUID = 1L;
-    }
-
-    @Privileged
-    void throwingCheckedException1() throws CheckedException1 {
-        System.getProperty("foo");
-        throw new CheckedException1();
-    }
-
-    @Privileged
-    Integer throwingCheckedException2() throws CheckedException1, CheckedException2 {
-        System.getProperty("foo");
-        throw new CheckedException2();
-    }
-}
diff --git a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/Overloading.java b/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/Overloading.java
deleted file mode 100644
index 264b65e..0000000
--- a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/Overloading.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import org.apache.commons.weaver.privilizer.Privileged;
-
-public class Overloading {
-
-    @Privileged
-    String get() {
-        return System.getProperty("foo");
-    }
-
-    @Privileged
-    String get(String s) {
-        return System.getProperty(s);
-    }
-
-    @Privileged
-    String get(int i, char c, short s) {
-        return System.getProperty(new String(new char[] { (char) i, c, (char) s }));
-    }
-}
diff --git a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/PrivateMethods.java b/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/PrivateMethods.java
deleted file mode 100644
index 771efc7..0000000
--- a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/PrivateMethods.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import org.apache.commons.weaver.privilizer.Privileged;
-
-public class PrivateMethods {
-    public String get(String s) {
-        return getProperty(s);
-    }
-
-    @Privileged
-    private String getProperty(String s) {
-        return System.getProperty(s);
-    }
-}
diff --git a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/Setup.java b/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/Setup.java
deleted file mode 100644
index cbcc981..0000000
--- a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/Setup.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright the original author or authors.
- *
- *  Licensed 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.commons.weaver.privilizer.example;
-
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-final class Setup {
-    private Setup() {
-    }
-
-    /**
-     * This simply allows us to to set up test classes by doing
-     * privileged things without granting privileges to the test
-     * code itself and thus making it impossible to test the effects
-     * of privilization.
-     */
-    public static void setProperty(final String name, final String value) {
-        AccessController.doPrivileged(new PrivilegedAction<Void>() {
-            public Void run() {
-                System.setProperty(name, value);
-                return null;
-            }
-        });
-    }
-}
diff --git a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/StaticNoArgs.java b/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/StaticNoArgs.java
deleted file mode 100644
index afd5931..0000000
--- a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/StaticNoArgs.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import org.apache.commons.weaver.privilizer.Privileged;
-
-public abstract class StaticNoArgs {
-    private StaticNoArgs() {
-    }
-
-    @Privileged
-    static void throwAwayFoo() {
-        System.getProperty("foo");
-    }
-
-    @Privileged
-    static String getFoo() {
-        return System.getProperty("foo");
-    }
-
-    @Privileged
-    static Boolean getTrue() {
-        System.getProperty("foo");
-        return Boolean.TRUE;
-    }
-
-    @Privileged
-    static boolean getFalse() {
-        System.getProperty("foo");
-        return false;
-    }
-
-    public static class CheckedException1 extends Exception {
-        private static final long serialVersionUID = 1L;
-    }
-
-    public static class CheckedException2 extends Exception {
-        private static final long serialVersionUID = 1L;
-    }
-
-    @Privileged
-    static void throwingCheckedException1() throws CheckedException1 {
-        System.getProperty("foo");
-        throw new CheckedException1();
-    }
-
-    @Privileged
-    static Integer throwingCheckedException2() throws CheckedException1, CheckedException2 {
-        System.getProperty("foo");
-        throw new CheckedException2();
-    }
-}
diff --git a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/StaticOverloading.java b/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/StaticOverloading.java
deleted file mode 100644
index 481317e..0000000
--- a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/StaticOverloading.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import org.apache.commons.weaver.privilizer.Privileged;
-
-public abstract class StaticOverloading {
-    private StaticOverloading() {
-    }
-
-    @Privileged
-    static String get() {
-        return System.getProperty("foo");
-    }
-
-    @Privileged
-    static String get(String s) {
-        return System.getProperty(s);
-    }
-
-    @Privileged
-    static String get(int i, char c, short s) {
-        return System.getProperty(new String(new char[] { (char) i, c, (char) s }));
-    }
-}
diff --git a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/StaticPrivateMethods.java b/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/StaticPrivateMethods.java
deleted file mode 100644
index 05c6dcc..0000000
--- a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/StaticPrivateMethods.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import org.apache.commons.weaver.privilizer.Privileged;
-
-public abstract class StaticPrivateMethods {
-    private StaticPrivateMethods() {
-    }
-
-    public static String get(String s) {
-        return getProperty(s);
-    }
-
-    @Privileged
-    private static String getProperty(String s) {
-        return System.getProperty(s);
-    }
-}
diff --git a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/StaticUsingArgs.java b/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/StaticUsingArgs.java
deleted file mode 100644
index c9aa778..0000000
--- a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/StaticUsingArgs.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import java.util.ArrayList;
-
-import org.apache.commons.weaver.privilizer.Privileged;
-
-
-
-public abstract class StaticUsingArgs {
-
-    private StaticUsingArgs() {
-    }
-
-    @Privileged
-    static String getProperty(String name) {
-        return System.getProperty(name);
-    }
-
-    @Privileged
-    static String[] getProperties(String... names) {
-        if (names == null) {
-            return null;
-        }
-        final ArrayList<String> result = new ArrayList<String>();
-        // in reality one would delegate to #getProperty to minimize the scope
-        // of the privileged action
-        for (String name : names) {
-            result.add(System.getProperty(name));
-        }
-        return result.toArray(new String[result.size()]);
-    }
-
-    @Privileged
-    static void throwAwayProperty(int first, String middle, char last) {
-        System.getProperty(new StringBuilder().append((char) first).append(middle).append(last).toString());
-    }
-
-    @Privileged
-    static Object assembleAndGetProperty(char first, CharSequence middle, int last) {
-        return System.getProperty(new StringBuilder().append(first).append(middle).append((char) last).toString());
-    }
-
-    public static class CheckedException1 extends Exception {
-        private static final long serialVersionUID = 1L;
-    }
-
-    public static class CheckedException2 extends Exception {
-        private static final long serialVersionUID = 1L;
-    }
-
-    @Privileged
-    static int throwingCheckedException(int which, String propertyToGet) throws CheckedException1, CheckedException2 {
-        System.getProperty(propertyToGet);
-        switch (which) {
-        case 1:
-            throw new CheckedException1();
-        case 2:
-            throw new CheckedException2();
-        default:
-            return which;
-        }
-    }
-}
diff --git a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/UsingArgs.java b/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/UsingArgs.java
deleted file mode 100644
index 582267e..0000000
--- a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/UsingArgs.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import java.util.ArrayList;
-
-import org.apache.commons.weaver.privilizer.Privileged;
-
-public class UsingArgs {
-
-    @Privileged
-    String getProperty(String name) {
-        return System.getProperty(name);
-    }
-
-    @Privileged
-    String[] getProperties(String... names) {
-        if (names == null) {
-            return null;
-        }
-        final ArrayList<String> result = new ArrayList<String>();
-        // in reality one would delegate to #getProperty to minimize the scope
-        // of the privileged action
-        for (String name : names) {
-            result.add(System.getProperty(name));
-        }
-        return result.toArray(new String[result.size()]);
-    }
-
-    @Privileged
-    void throwAwayProperty(int first, String middle, char last) {
-        System.getProperty(new StringBuilder().append((char) first).append(middle).append(last).toString());
-    }
-
-    @Privileged
-    Object assembleAndGetProperty(char first, CharSequence middle, int last) {
-        return System.getProperty(new StringBuilder().append(first).append(middle).append((char) last).toString());
-    }
-
-    public static class CheckedException1 extends Exception {
-        private static final long serialVersionUID = 1L;
-    }
-
-    public static class CheckedException2 extends Exception {
-        private static final long serialVersionUID = 1L;
-    }
-
-    @Privileged
-    int throwingCheckedException(int which, String propertyToGet) throws CheckedException1, CheckedException2 {
-        System.getProperty(propertyToGet);
-        switch (which) {
-        case 1:
-            throw new CheckedException1();
-        case 2:
-            throw new CheckedException2();
-        default:
-            return which;
-        }
-    }
-}
diff --git a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/UsingBlueprints.java b/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/UsingBlueprints.java
deleted file mode 100644
index f9bec65..0000000
--- a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/UsingBlueprints.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import org.apache.commons.weaver.privilizer.Privilizing;
-import org.apache.commons.weaver.privilizer.Privilizing.CallTo;
-
-@Privilizing({ @CallTo(Utils.class), @CallTo(value = Utils.More.class, methods = "getProperty") })
-public class UsingBlueprints {
-
-    public String utilsReadPublicConstant() {
-        return Utils.readPublicConstant();
-    }
-
-    public int utilsReadPrivateField() {
-        return Utils.readPrivateField();
-    }
-
-    public String utilsGetProperty() {
-        return Utils.getProperty();
-    }
-
-    public String utilsGetProperty(int i, String key) {
-        return Utils.getProperty(i, key);
-    }
-
-    public String utilsGetProperty(String key) {
-        return Utils.getProperty(key);
-    }
-
-    public String moreGetProperty() {
-        return Utils.More.getProperty();
-    }
-
-    public String moreGetTopStackElementClassName() {
-        return Utils.More.getTopStackElementClassName();
-    }
-}
diff --git a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/Utils.java b/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/Utils.java
deleted file mode 100644
index 67ceff2..0000000
--- a/trunk/example/src/main/java/org/apache/commons/weaver/privilizer/example/Utils.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-public final class Utils {
-    public static final class More {
-        private More() {
-        }
-
-        public static String getProperty() {
-            return Utils.getProperty("bar");
-        }
-
-        public static String getTopStackElementClassName() {
-            return Thread.currentThread().getStackTrace()[1].getClassName();
-        }
-    }
-
-    private Utils() {
-    }
-
-    public static final String FOO = "foo".intern();
-
-    public static String readPublicConstant() {
-        return FOO;
-    }
-
-    public static String getProperty() {
-        return getProperty("foo");
-    }
-
-    public static String getProperty(int i, String key) {
-        if (i <= 0) {
-            return getProperty(key);
-        }
-        int counter = i;
-        return getProperty(--counter, key);
-    }
-
-    public static String getProperty(String key) {
-        return System.getProperty(key);
-    }
-
-    private static Integer n;
-    static {
-        n = Integer.valueOf(999);
-    }
-
-    public static int readPrivateField() {
-        return n;
-    }
-}
diff --git a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/NoArgsTest.java b/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/NoArgsTest.java
deleted file mode 100644
index c117999..0000000
--- a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/NoArgsTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.fail;
-
-import org.apache.commons.weaver.privilizer.example.NoArgs.CheckedException1;
-import org.apache.commons.weaver.privilizer.example.NoArgs.CheckedException2;
-import org.junit.Before;
-import org.junit.Test;
-
-public class NoArgsTest {
-    private NoArgs noArgs;
-
-    @Before
-    public void setUp() throws Exception {
-        Setup.setProperty("foo", "foo-value");
-        noArgs = new NoArgs();
-    }
-
-    @Test
-    public void testThrowAwayFoo() {
-        noArgs.throwAwayFoo();
-    }
-
-    @Test
-    public void testGetFoo() {
-        assertEquals("foo-value", noArgs.getFoo());
-    }
-
-    @Test
-    public void testGetTrue() {
-        assertSame(Boolean.TRUE, noArgs.getTrue());
-    }
-
-    @Test
-    public void testGetFalse() {
-        assertFalse(noArgs.getFalse());
-    }
-
-    @Test
-    public void testThrowingCheckedException1() {
-        try {
-            noArgs.throwingCheckedException1();
-            fail();
-        } catch (CheckedException1 e) {
-        }
-    }
-
-    @Test
-    public void testThrowingCheckedException2() {
-        try {
-            noArgs.throwingCheckedException2();
-        } catch (CheckedException1 e) {
-        } catch (CheckedException2 e) {
-            return;
-        }
-        fail();
-    }
-}
diff --git a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/OverloadingTest.java b/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/OverloadingTest.java
deleted file mode 100644
index 4df3e06..0000000
--- a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/OverloadingTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class OverloadingTest {
-    private Overloading overloading;
-
-    @Before
-    public void setUp() throws Exception {
-        Setup.setProperty("foo", "foo-value");
-        Setup.setProperty("bar", "bar-value");
-        Setup.setProperty("baz", "baz-value");
-        overloading = new Overloading();
-    }
-
-    @Test
-    public void testNoArgs() {
-        assertEquals("foo-value", overloading.get());
-    }
-
-    @Test
-    public void testStringArg() {
-        assertEquals("bar-value", overloading.get("bar"));
-    }
-
-    @Test
-    public void testCharishArgs() {
-        assertEquals("baz-value", overloading.get('b', 'a', (short) 'z'));
-    }
-}
diff --git a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/PrivateMethodsTest.java b/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/PrivateMethodsTest.java
deleted file mode 100644
index 205da5c..0000000
--- a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/PrivateMethodsTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class PrivateMethodsTest {
-    private PrivateMethods privateMethods;
-
-    @Before
-    public void setUp() throws Exception {
-        Setup.setProperty("foo", "foo-value");
-        Setup.setProperty("bar", "bar-value");
-        Setup.setProperty("baz", "baz-value");
-        privateMethods = new PrivateMethods();
-    }
-
-    @Test
-    public void testGet() {
-        assertEquals("foo-value", privateMethods.get("foo"));
-        assertEquals("bar-value", privateMethods.get("bar"));
-        assertEquals("baz-value", privateMethods.get("baz"));
-    }
-}
diff --git a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/StaticNoArgsTest.java b/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/StaticNoArgsTest.java
deleted file mode 100644
index f3f99d2..0000000
--- a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/StaticNoArgsTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.fail;
-
-import org.apache.commons.weaver.privilizer.example.StaticNoArgs.CheckedException1;
-import org.apache.commons.weaver.privilizer.example.StaticNoArgs.CheckedException2;
-import org.junit.Before;
-import org.junit.Test;
-
-public class StaticNoArgsTest {
-    @Before
-    public void setUp() throws Exception {
-        Setup.setProperty("foo", "foo-value");
-    }
-
-    @Test
-    public void testThrowAwayFoo() {
-        StaticNoArgs.throwAwayFoo();
-    }
-
-    @Test
-    public void testGetFoo() {
-        assertEquals("foo-value", StaticNoArgs.getFoo());
-    }
-
-    @Test
-    public void testGetTrue() {
-        assertSame(Boolean.TRUE, StaticNoArgs.getTrue());
-    }
-
-    @Test
-    public void testGetFalse() {
-        assertFalse(StaticNoArgs.getFalse());
-    }
-
-    @Test
-    public void testThrowingCheckedException1() {
-        try {
-            StaticNoArgs.throwingCheckedException1();
-            fail();
-        } catch (CheckedException1 e) {
-        }
-    }
-
-    @Test
-    public void testThrowingCheckedException2() {
-        try {
-            StaticNoArgs.throwingCheckedException2();
-        } catch (CheckedException1 e) {
-        } catch (CheckedException2 e) {
-            return;
-        }
-        fail();
-    }
-}
diff --git a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/StaticOverloadingTest.java b/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/StaticOverloadingTest.java
deleted file mode 100644
index 8ee591d..0000000
--- a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/StaticOverloadingTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class StaticOverloadingTest {
-
-    @Before
-    public void setUp() throws Exception {
-        Setup.setProperty("foo", "foo-value");
-        Setup.setProperty("bar", "bar-value");
-        Setup.setProperty("baz", "baz-value");
-    }
-
-    @Test
-    public void testNoArgs() {
-        assertEquals("foo-value", StaticOverloading.get());
-    }
-
-    @Test
-    public void testStringArg() {
-        assertEquals("bar-value", StaticOverloading.get("bar"));
-    }
-
-    @Test
-    public void testCharishArgs() {
-        assertEquals("baz-value", StaticOverloading.get('b', 'a', (short) 'z'));
-    }
-}
diff --git a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/StaticPrivateMethodsTest.java b/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/StaticPrivateMethodsTest.java
deleted file mode 100644
index 56f3e5e..0000000
--- a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/StaticPrivateMethodsTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class StaticPrivateMethodsTest {
-
-    @Before
-    public void setUp() throws Exception {
-        Setup.setProperty("foo", "foo-value");
-        Setup.setProperty("bar", "bar-value");
-        Setup.setProperty("baz", "baz-value");
-    }
-
-    @Test
-    public void testGet() {
-        assertEquals("foo-value", StaticPrivateMethods.get("foo"));
-        assertEquals("bar-value", StaticPrivateMethods.get("bar"));
-        assertEquals("baz-value", StaticPrivateMethods.get("baz"));
-    }
-}
diff --git a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/StaticUsingArgsTest.java b/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/StaticUsingArgsTest.java
deleted file mode 100644
index 6818409..0000000
--- a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/StaticUsingArgsTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Arrays;
-
-import org.apache.commons.weaver.privilizer.example.StaticUsingArgs.CheckedException1;
-import org.apache.commons.weaver.privilizer.example.StaticUsingArgs.CheckedException2;
-import org.junit.Before;
-import org.junit.Test;
-
-public class StaticUsingArgsTest {
-
-    @Before
-    public void setUp() throws Exception {
-        Setup.setProperty("foo", "foo-value");
-        Setup.setProperty("bar", "bar-value");
-        Setup.setProperty("baz", "baz-value");
-    }
-
-    @Test
-    public void testGetProperty() {
-        assertEquals("foo-value", StaticUsingArgs.getProperty("foo"));
-        assertEquals("bar-value", StaticUsingArgs.getProperty("bar"));
-        assertEquals("baz-value", StaticUsingArgs.getProperty("baz"));
-    }
-
-    @Test
-    public void testGetProperties() {
-        assertTrue(Arrays.equals(new String[] { "foo-value", "bar-value", "baz-value" },
-            StaticUsingArgs.getProperties("foo", "bar", "baz")));
-        assertEquals(0, StaticUsingArgs.getProperties().length);
-        assertNull(StaticUsingArgs.getProperties((String[]) null));
-    }
-
-    @Test
-    public void testThrowAwayProperty() {
-        StaticUsingArgs.throwAwayProperty('f', "o", 'o');
-    }
-
-    @Test
-    public void testAssembleAndGetProperty() {
-        assertEquals("foo-value", StaticUsingArgs.assembleAndGetProperty('f', new StringBuilder().append('o'), 'o'));
-        assertEquals("bar-value", StaticUsingArgs.assembleAndGetProperty('b', new StringBuilder().append('a'), 'r'));
-        assertEquals("baz-value", StaticUsingArgs.assembleAndGetProperty('b', new StringBuilder().append('a'), 'z'));
-    }
-
-    @Test
-    public void testThrowingCheckedException() throws CheckedException1, CheckedException2 {
-        assertEquals(0, StaticUsingArgs.throwingCheckedException(0, "foo"));
-        try {
-            StaticUsingArgs.throwingCheckedException(1, "bar");
-        } catch (CheckedException1 e) {
-        }
-        try {
-            StaticUsingArgs.throwingCheckedException(2, "baz");
-        } catch (CheckedException2 e) {
-        }
-    }
-}
diff --git a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/UsingArgsTest.java b/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/UsingArgsTest.java
deleted file mode 100644
index d38cce1..0000000
--- a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/UsingArgsTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Arrays;
-
-import org.apache.commons.weaver.privilizer.example.UsingArgs.CheckedException1;
-import org.apache.commons.weaver.privilizer.example.UsingArgs.CheckedException2;
-import org.junit.Before;
-import org.junit.Test;
-
-public class UsingArgsTest {
-    private UsingArgs usingArgs;
-
-    @Before
-    public void setUp() throws Exception {
-        Setup.setProperty("foo", "foo-value");
-        Setup.setProperty("bar", "bar-value");
-        Setup.setProperty("baz", "baz-value");
-        usingArgs = new UsingArgs();
-    }
-
-    @Test
-    public void testGetProperty() {
-        assertEquals("foo-value", usingArgs.getProperty("foo"));
-        assertEquals("bar-value", usingArgs.getProperty("bar"));
-        assertEquals("baz-value", usingArgs.getProperty("baz"));
-    }
-
-    @Test
-    public void testGetProperties() {
-        assertTrue(Arrays.equals(new String[] { "foo-value", "bar-value", "baz-value" },
-            usingArgs.getProperties("foo", "bar", "baz")));
-        assertEquals(0, usingArgs.getProperties().length);
-        assertNull(usingArgs.getProperties((String[]) null));
-    }
-
-    @Test
-    public void testThrowAwayProperty() {
-        usingArgs.throwAwayProperty('f', "o", 'o');
-    }
-
-    @Test
-    public void testAssembleAndGetProperty() {
-        assertEquals("foo-value", usingArgs.assembleAndGetProperty('f', new StringBuilder().append('o'), 'o'));
-        assertEquals("bar-value", usingArgs.assembleAndGetProperty('b', new StringBuilder().append('a'), 'r'));
-        assertEquals("baz-value", usingArgs.assembleAndGetProperty('b', new StringBuilder().append('a'), 'z'));
-    }
-
-    @Test
-    public void testThrowingCheckedException() throws CheckedException1, CheckedException2 {
-        assertEquals(0, usingArgs.throwingCheckedException(0, "foo"));
-        try {
-            usingArgs.throwingCheckedException(1, "bar");
-        } catch (CheckedException1 e) {
-        }
-        try {
-            usingArgs.throwingCheckedException(2, "baz");
-        } catch (CheckedException2 e) {
-        }
-    }
-}
diff --git a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/UsingBlueprintsTest.java b/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/UsingBlueprintsTest.java
deleted file mode 100644
index 5bb0d6b..0000000
--- a/trunk/example/src/test/java/org/apache/commons/weaver/privilizer/example/UsingBlueprintsTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.commons.weaver.privilizer.example;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class UsingBlueprintsTest {
-
-    private UsingBlueprints usingBlueprints;
-
-    @Before
-    public void setUp() throws Exception {
-        Setup.setProperty("foo", "foo-value");
-        Setup.setProperty("bar", "bar-value");
-        Setup.setProperty("baz", "baz-value");
-        usingBlueprints = new UsingBlueprints();
-    }
-
-    @Test
-    public void testUtilsReadPublicConstant() {
-        assertEquals(Utils.FOO, usingBlueprints.utilsReadPublicConstant());
-    }
-
-    @Test
-    public void testUtilsReadPrivateField() {
-        assertEquals(999, usingBlueprints.utilsReadPrivateField());
-    }
-
-    @Test
-    public void testUtilsGetProperty() {
-        assertEquals("foo-value", usingBlueprints.utilsGetProperty());
-    }
-
-    @Test
-    public void testUtilsGetProperty_String() {
-        assertEquals("foo-value", usingBlueprints.utilsGetProperty("foo"));
-        assertEquals("bar-value", usingBlueprints.utilsGetProperty("bar"));
-        assertEquals("baz-value", usingBlueprints.utilsGetProperty("baz"));
-    }
-
-    @Test
-    public void testUtilsGetProperty_int_String() {
-        assertEquals("foo-value", usingBlueprints.utilsGetProperty(2, "foo"));
-        assertEquals("bar-value", usingBlueprints.utilsGetProperty(2, "bar"));
-        assertEquals("baz-value", usingBlueprints.utilsGetProperty(2, "baz"));
-    }
-
-    @Test
-    public void testMoreGetProperty() {
-        assertEquals("bar-value", usingBlueprints.moreGetProperty());
-    }
-
-    @Test
-    public void testMoreGetTopStackElementClassName() {
-        assertEquals(Utils.More.class.getName(), usingBlueprints.moreGetTopStackElementClassName());
-    }
-
-}
diff --git a/trunk/example/src/test/resources/java.policy b/trunk/example/src/test/resources/java.policy
deleted file mode 100644
index 7f496f2..0000000
--- a/trunk/example/src/test/resources/java.policy
+++ /dev/null
@@ -1,54 +0,0 @@
-// 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.
-//
-// Allows unit tests to run with a Java Security Manager
-//
-
-grant
-{
-  // let everyone read target dir
-  permission java.io.FilePermission "${preserve.project.build.directory}${/}-", "read";
-};
-
-// we don't care about the permissions of the testing infrastructure,
-// including maven;
-grant codeBase "file://${user.home}/.m2/repository/org/apache/maven/-"
-{
-  permission java.security.AllPermission;
-};
-
-// junit;
-grant codeBase "file://${user.home}/.m2/repository/junit/-"
-{
-  permission java.security.AllPermission;
-};
-
-// surefire booter;
-grant codeBase "file://${project.build.directory}/surefire/-"
-{
-  permission java.security.AllPermission;
-};
-
-// classes under test
-grant codeBase "file://${project.build.outputDirectory}/-"
-{
-  permission java.util.PropertyPermission "foo", "read,write";
-  permission java.util.PropertyPermission "bar", "read,write";
-  permission java.util.PropertyPermission "baz", "read,write";
-  permission java.lang.RuntimePermission "accessDeclaredMembers";
-  permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
-};
diff --git a/trunk/maven-plugin/pom.xml b/trunk/maven-plugin/pom.xml
deleted file mode 100644
index c82e5f2..0000000
--- a/trunk/maven-plugin/pom.xml
+++ /dev/null
@@ -1,157 +0,0 @@
-<?xml version="1.0"?>
-<!--
-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.
--->
-<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">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-weaver-parent</artifactId>
-    <version>1.0</version>
-  </parent>
-
-  <artifactId>commons-weaver-maven-plugin</artifactId>
-  <packaging>maven-plugin</packaging>
-
-  <name>Apache Commons Weaver Maven Plugin</name>
-  <description>Weaving Maven goals</description>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <maven.version>3.0.4</maven.version>
-    <maven.plugin.version>3.1</maven.plugin.version>
-  </properties>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/maven-plugin</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/maven-plugin</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/weaver/tags/1.0_RC2/maven-plugin</url>
-  </scm>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-processor</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-      <version>${maven.version}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-core</artifactId>
-      <version>${maven.version}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven.plugin-tools</groupId>
-      <artifactId>maven-plugin-annotations</artifactId>
-      <version>${maven.plugin.version}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-utils</artifactId>
-      <version>2.0.6</version>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <configuration>
-          <supportedProjectTypes>
-            <supportedProjectType>maven-plugin</supportedProjectType>
-          </supportedProjectTypes>
-        </configuration>
-      </plugin>
-      <plugin>
-        <artifactId>maven-plugin-plugin</artifactId>
-        <version>${maven.plugin.version}</version>
-        <configuration>
-          <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
-        </configuration>
-        <executions>
-          <execution>
-            <id>mojo-descriptor</id>
-            <goals>
-              <goal>descriptor</goal>
-            </goals>
-          </execution>
-          <!-- if you want to generate help goal -->
-          <execution>
-            <id>help-goal</id>
-            <goals>
-              <goal>helpmojo</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-source-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>attach-test-sources</id>
-            <phase />
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-plugin-plugin</artifactId>
-        <version>${maven.plugin.version}</version>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-pmd-plugin</artifactId>
-        <configuration>
-          <rulesets>
-            <ruleset>/org/apache/commons/weaver/pmd.xml</ruleset>
-          </rulesets>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-checkstyle-plugin</artifactId>
-        <version>${checkstyle.version}</version>
-        <configuration>
-          <configLocation>org/apache/commons/weaver/checkstyle.xml</configLocation>
-          <headerLocation>org/apache/commons/weaver/license-header.txt</headerLocation>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>findbugs-maven-plugin</artifactId>
-        <configuration>
-          <xmlOutput>true</xmlOutput>
-          <excludeFilterFile>/org/apache/commons/weaver/findbugs-exclude-filter.xml</excludeFilterFile>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
-
-</project>
diff --git a/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/AbstractPrepareMojo.java b/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/AbstractPrepareMojo.java
deleted file mode 100644
index 06456fd..0000000
--- a/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/AbstractPrepareMojo.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * 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.commons.weaver.maven;
-
-import java.io.File;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.commons.weaver.CleanProcessor;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.annotations.Parameter;
-
-/**
- * Defines common properties.
- */
-public abstract class AbstractPrepareMojo extends AbstractMojo {
-
-    /**
-     * {@code verbose} parameter.
-     */
-    @Parameter(defaultValue = "false")
-    protected boolean verbose;
-
-    /**
-     * {@code weaver.config} parameter.
-     */
-    @Parameter(property = "weaver.config", required = false)
-    protected Properties weaverConfig;
-
-    /**
-     * Get the classpath for this prepare mojo.
-     * @return {@link List} of {@link String}
-     */
-    protected abstract List<String> getClasspath();
-
-    /**
-     * Get the target directory for this prepare mojo.
-     * @return {@link File}
-     */
-    protected abstract File getTarget();
-
-    /**
-     * Execute this mojo.
-     * @throws MojoExecutionException in the event of failure
-     */
-    @Override
-    public void execute() throws MojoExecutionException {
-        if (!getTarget().isDirectory()) {
-            return;
-        }
-        final JavaLoggingToMojoLoggingRedirector logRedirector = new JavaLoggingToMojoLoggingRedirector(getLog());
-        logRedirector.activate();
-
-        final List<String> classpath = getClasspath();
-        final File target = getTarget();
-        final Properties config = weaverConfig == null ? new Properties() : weaverConfig;
-
-        getLog().debug(String.format("classpath=%s%ntarget=%s%nconfig=%s", classpath, target, config));
-
-        try {
-            final CleanProcessor cleanProcessor = new CleanProcessor(classpath, target, config);
-            cleanProcessor.clean();
-        } catch (Exception e) {
-            throw new MojoExecutionException("cleaning failed due to " + e.getMessage(), e);
-        } finally {
-            logRedirector.deactivate();
-        }
-    }
-
-}
diff --git a/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/AbstractWeaveMojo.java b/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/AbstractWeaveMojo.java
deleted file mode 100644
index beee1b0..0000000
--- a/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/AbstractWeaveMojo.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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.commons.weaver.maven;
-
-import java.io.File;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.commons.weaver.WeaveProcessor;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.annotations.Parameter;
-
-/**
- * Defines common properties.
- */
-public abstract class AbstractWeaveMojo extends AbstractMojo {
-
-    /**
-     * {@code verbose} parameter.
-     */
-    @Parameter(defaultValue = "false")
-    protected boolean verbose;
-
-    /**
-     * {@code weaver.config} parameter.
-     */
-    @Parameter(property = "weaver.config", required = false)
-    protected Properties weaverConfig;
-
-    /**
-     * Get the classpath for this weave mojo.
-     * @return {@link List} of {@link String}
-     */
-    protected abstract List<String> getClasspath();
-
-    /**
-     * Get the target directory for this weave mojo.
-     * @return {@link File}
-     */
-    protected abstract File getTarget();
-
-    /**
-     * Execute this mojo.
-     * @throws MojoExecutionException in the event of failure
-     */
-    @Override
-    public void execute() throws MojoExecutionException {
-        final JavaLoggingToMojoLoggingRedirector logRedirector = new JavaLoggingToMojoLoggingRedirector(getLog());
-        logRedirector.activate();
-
-        final List<String> classpath = getClasspath();
-        final File target = getTarget();
-        final Properties config = weaverConfig == null ? new Properties() : weaverConfig;
-
-        getLog().debug(String.format("classpath=%s%ntarget=%s%nconfig=%s", classpath, target, config));
-
-        try {
-            final WeaveProcessor weaveProcessor = new WeaveProcessor(classpath, target, config);
-            weaveProcessor.weave();
-        } catch (Exception e) {
-            throw new MojoExecutionException("weaving failed due to " + e.getMessage(), e);
-        } finally {
-            logRedirector.deactivate();
-        }
-    }
-
-}
diff --git a/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/JavaLoggingToMojoLoggingRedirector.java b/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/JavaLoggingToMojoLoggingRedirector.java
deleted file mode 100644
index 69f5313..0000000
--- a/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/JavaLoggingToMojoLoggingRedirector.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * 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.commons.weaver.maven;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ResourceBundle;
-import java.util.logging.Handler;
-import java.util.logging.Level;
-import java.util.logging.LogManager;
-import java.util.logging.LogRecord;
-import java.util.logging.Logger;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.logging.Log;
-
-/**
- * This class redirects calls to java.util Logging to Mojo logging.
- */
-public class JavaLoggingToMojoLoggingRedirector {
-    private final List<Handler> removedHandlers = new ArrayList<Handler>();
-
-    /**
-     * The Maven mojo logger to delegate messages to.
-     */
-    private final Log mojoLogger;
-
-    private JDKLogHandler activeHandler;
-
-    /**
-     * @param mojoLogger
-     *            the Maven mojo logger to delegate messages to.
-     */
-    public JavaLoggingToMojoLoggingRedirector(final Log mojoLogger) {
-        this.mojoLogger = mojoLogger;
-    }
-
-    /**
-     * Activates this feature.
-     * @throws MojoExecutionException in the event of failure
-     */
-    public void activate() throws MojoExecutionException {
-        try {
-            final Logger rootLogger = LogManager.getLogManager().getLogger("");
-            // remove old handlers
-            for (final Handler handler : rootLogger.getHandlers()) {
-                rootLogger.removeHandler(handler);
-                removedHandlers.add(handler);
-            }
-            if (removedHandlers.isEmpty()) {
-                throw new MojoExecutionException("could not remove any handler. aborting.");
-            }
-
-            // add our own
-            activeHandler = new JDKLogHandler();
-            activeHandler.setLevel(Level.ALL);
-            rootLogger.setLevel(Level.ALL);
-
-            rootLogger.addHandler(activeHandler);
-        } catch (Exception exc) {
-            throw new MojoExecutionException("failed to activate the jul logging redirector", exc);
-        }
-    }
-
-    /**
-     * Deactivate the redirection and put the original Handlers back in place
-     * again.
-     */
-    public void deactivate() {
-        final Logger rootLogger = LogManager.getLogManager().getLogger("");
-        // remove old handlers
-        for (final Handler handler : rootLogger.getHandlers()) {
-            if (handler == activeHandler) {
-                rootLogger.removeHandler(handler);
-            }
-        }
-
-        for (final Handler oldHandler : removedHandlers) {
-            rootLogger.addHandler(oldHandler);
-        }
-    }
-
-    private class JDKLogHandler extends Handler {
-
-        @Override
-        public void publish(final LogRecord record) {
-            final Throwable exception = record.getThrown();
-            final Level level = record.getLevel();
-            if (level == Level.SEVERE && mojoLogger.isErrorEnabled()) {
-                if (exception == null) {
-                    mojoLogger.error(getMessage(record));
-                } else {
-                    mojoLogger.error(getMessage(record), exception);
-                }
-            } else if (level == Level.WARNING && mojoLogger.isWarnEnabled()) {
-                if (exception == null) {
-                    mojoLogger.warn(getMessage(record));
-                } else {
-                    mojoLogger.warn(getMessage(record), exception);
-                }
-            } else if (level == Level.INFO && mojoLogger.isInfoEnabled()) {
-                if (exception == null) {
-                    mojoLogger.info(getMessage(record));
-                } else {
-                    mojoLogger.info(getMessage(record), exception);
-                }
-            } else if (mojoLogger.isDebugEnabled()) {
-                if (exception == null) {
-                    mojoLogger.debug(getMessage(record));
-                } else {
-                    mojoLogger.debug(getMessage(record), exception);
-                }
-            }
-        }
-
-        private String getMessage(final LogRecord record) {
-            final ResourceBundle bundle = record.getResourceBundle();
-            final Object[] params = record.getParameters();
-            final String message;
-            if (bundle != null && bundle.containsKey(record.getMessage())) {
-                // todo: cannot enforce Locale.ENGLISH here
-                message = bundle.getString(record.getMessage());
-            } else {
-                message = record.getMessage();
-            }
-            if (ArrayUtils.isNotEmpty(params)) {
-                return new MessageFormat(message).format(params);
-            }
-            return message;
-        }
-
-        @Override
-        public void flush() {
-            // nothing to do
-        }
-
-        @Override
-        public void close() {
-            // nothing to do
-        }
-
-    }
-
-}
diff --git a/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/PrepareMojo.java b/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/PrepareMojo.java
deleted file mode 100644
index abb43e3..0000000
--- a/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/PrepareMojo.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.commons.weaver.maven;
-
-import java.io.File;
-import java.util.List;
-
-import org.apache.maven.model.Build;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProject;
-
-/**
- * Goal to clean woven classes.
- */
-@Mojo(
-    name = "prepare",
-    defaultPhase = LifecyclePhase.INITIALIZE,
-    requiresDependencyCollection = ResolutionScope.COMPILE
-)
-public class PrepareMojo extends AbstractPrepareMojo {
-    /**
-     * {@link MavenProject#getCompileClasspathElements()}.
-     */
-    @Parameter(readonly = true, required = true, defaultValue = "${project.compileClasspathElements}")
-    protected List<String> classpath;
-
-    /**
-     * {@link Build#getOutputDirectory()}.
-     */
-    @Parameter(readonly = true, required = true, defaultValue = "${project.build.outputDirectory}")
-    protected File target;
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected List<String> getClasspath() {
-        return classpath;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected File getTarget() {
-        return target;
-    }
-
-}
diff --git a/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/TestPrepareMojo.java b/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/TestPrepareMojo.java
deleted file mode 100644
index 134385a..0000000
--- a/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/TestPrepareMojo.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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.commons.weaver.maven;
-
-import java.io.File;
-import java.util.List;
-
-import org.apache.maven.model.Build;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProject;
-
-/**
- * Goal to clean woven test classes.
- */
-@Mojo(
-    name = "test-prepare",
-    defaultPhase = LifecyclePhase.INITIALIZE,
-    requiresDependencyCollection = ResolutionScope.TEST
-)
-public class TestPrepareMojo extends AbstractPrepareMojo {
-
-    /**
-     * {@link MavenProject#getTestClasspathElements()}.
-     */
-    @Parameter(readonly = true, required = true, defaultValue = "${project.testClasspathElements}")
-    protected List<String> classpath;
-
-    /**
-     * {@link Build#getTestOutputDirectory()}.
-     */
-    @Parameter(readonly = true, required = true, defaultValue = "${project.build.testOutputDirectory}")
-    protected File target;
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected List<String> getClasspath() {
-        return classpath;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected File getTarget() {
-        return target;
-    }
-
-}
diff --git a/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/TestWeaveMojo.java b/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/TestWeaveMojo.java
deleted file mode 100644
index aab1310..0000000
--- a/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/TestWeaveMojo.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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.commons.weaver.maven;
-
-import java.io.File;
-import java.util.List;
-
-import org.apache.maven.model.Build;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProject;
-
-/**
- * Goal to weave test classes.
- */
-@Mojo(
-    name = "test-weave",
-    defaultPhase = LifecyclePhase.PROCESS_TEST_CLASSES,
-    requiresDependencyCollection = ResolutionScope.TEST
-)
-public class TestWeaveMojo extends AbstractWeaveMojo {
-
-    /**
-     * {@link MavenProject#getTestClasspathElements()}.
-     */
-    @Parameter(readonly = true, required = true, defaultValue = "${project.testClasspathElements}")
-    protected List<String> classpath;
-
-    /**
-     * {@link Build#getTestOutputDirectory()}.
-     */
-    @Parameter(readonly = true, required = true, defaultValue = "${project.build.testOutputDirectory}")
-    protected File target;
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected List<String> getClasspath() {
-        return classpath;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected File getTarget() {
-        return target;
-    }
-
-}
diff --git a/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/WeaveMojo.java b/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/WeaveMojo.java
deleted file mode 100644
index 00844cf..0000000
--- a/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/WeaveMojo.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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.commons.weaver.maven;
-
-import java.io.File;
-import java.util.List;
-
-import org.apache.maven.model.Build;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProject;
-
-/**
- * Goal to weave classes.
- */
-@Mojo(
-    name = "weave",
-    defaultPhase = LifecyclePhase.PROCESS_CLASSES,
-    requiresDependencyCollection = ResolutionScope.COMPILE
-)
-public class WeaveMojo extends AbstractWeaveMojo {
-
-    /**
-     * {@link MavenProject#getCompileClasspathElements()}.
-     */
-    @Parameter(readonly = true, required = true, defaultValue = "${project.compileClasspathElements}")
-    protected List<String> classpath;
-
-    /**
-     * {@link Build#getOutputDirectory()}.
-     */
-    @Parameter(readonly = true, required = true, defaultValue = "${project.build.outputDirectory}")
-    protected File target;
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected List<String> getClasspath() {
-        return classpath;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected File getTarget() {
-        return target;
-    }
-
-}
diff --git a/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/package-info.java b/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/package-info.java
deleted file mode 100644
index 52057ee..0000000
--- a/trunk/maven-plugin/src/main/java/org/apache/commons/weaver/maven/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * Integration with Apache Maven.
- */
-package org.apache.commons.weaver.maven;
\ No newline at end of file
diff --git a/trunk/maven-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml b/trunk/maven-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml
deleted file mode 100644
index 730992d..0000000
--- a/trunk/maven-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0"?>
-<!--
-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.
--->
-<lifecycleMappingMetadata>
-  <pluginExecutions>
-    <pluginExecution>
-      <pluginExecutionFilter>
-        <goals>
-          <goal>prepare</goal>
-          <goal>test-prepare</goal>
-        </goals>
-      </pluginExecutionFilter>
-      <action>
-        <execute>
-          <runOnIncremental>true</runOnIncremental>
-          <runOnConfiguration>true</runOnConfiguration>
-        </execute>
-      </action>
-    </pluginExecution>
-    <pluginExecution>
-      <pluginExecutionFilter>
-        <goals>
-          <goal>weave</goal>
-          <goal>test-weave</goal>
-        </goals>
-      </pluginExecutionFilter>
-      <action>
-        <execute>
-          <runOnIncremental>true</runOnIncremental>
-          <runOnConfiguration>false</runOnConfiguration>
-        </execute>
-      </action>
-    </pluginExecution>
-  </pluginExecutions>
-</lifecycleMappingMetadata>
\ No newline at end of file
diff --git a/trunk/modules/normalizer/example/pom.xml b/trunk/modules/normalizer/example/pom.xml
deleted file mode 100644
index 709ebef..0000000
--- a/trunk/modules/normalizer/example/pom.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-<?xml version="1.0"?>
-<!--
-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.
--->
-<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">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-weaver-normalizer-parent</artifactId>
-    <version>1.0</version>
-  </parent>
-  <artifactId>commons-weaver-normalizer-example</artifactId>
-  <name>Apache Commons Weaver Normalizer Example</name>
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-  </properties>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/modules/normalizer/example</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/modules/normalizer/example</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/weaver/tags/1.0_RC2/modules/normalizer/example</url>
-  </scm>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-maven-plugin</artifactId>
-        <version>${project.version}</version>
-        <configuration>
-          <weaverConfig>
-            <normalizer.superTypes>
-              org.apache.commons.lang3.reflect.TypeLiteral,
-              org.apache.commons.weaver.normalizer.example.ContrivedWrapper
-            </normalizer.superTypes>
-            <normalizer.targetPackage>org.apache.commons.weaver.normalizer.example.normalized</normalizer.targetPackage>
-          </weaverConfig>
-        </configuration>
-        <executions>
-          <execution>
-            <goals>
-              <goal>prepare</goal>
-              <goal>weave</goal>
-            </goals>
-          </execution>
-        </executions>
-        <dependencies>
-          <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-weaver-normalizer</artifactId>
-            <version>${project.version}</version>
-            <exclusions>
-              <exclusion>
-                <groupId>org.ow2.asm</groupId>
-                <artifactId>asm</artifactId>
-              </exclusion>
-              <exclusion>
-                <groupId>org.ow2.asm</groupId>
-                <artifactId>asm-commons</artifactId>
-              </exclusion>
-              <exclusion>
-                <groupId>org.ow2.asm</groupId>
-                <artifactId>asm-tree</artifactId>
-              </exclusion>
-              <exclusion>
-                <groupId>org.ow2.asm</groupId>
-                <artifactId>asm-util</artifactId>
-              </exclusion>
-            </exclusions>
-          </dependency>
-          <dependency>
-            <groupId>org.ow2.asm</groupId>
-            <artifactId>asm-debug-all</artifactId>
-            <version>${asm.version}</version>
-          </dependency>
-        </dependencies>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/trunk/modules/normalizer/example/src/main/java/org/apache/commons/weaver/normalizer/example/ContrivedWrapper.java b/trunk/modules/normalizer/example/src/main/java/org/apache/commons/weaver/normalizer/example/ContrivedWrapper.java
deleted file mode 100644
index 42e9b28..0000000
--- a/trunk/modules/normalizer/example/src/main/java/org/apache/commons/weaver/normalizer/example/ContrivedWrapper.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.commons.weaver.normalizer.example;
-
-public abstract class ContrivedWrapper {
-    public final Object value;
-
-    protected ContrivedWrapper(Object value) {
-        this.value = value;
-    }
-
-    protected ContrivedWrapper(int value) {
-        this.value = Integer.valueOf(value);
-    }
-
-    @Override
-    public final boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-        if (!(obj instanceof ContrivedWrapper)) {
-            return false;
-        }
-        final ContrivedWrapper other = (ContrivedWrapper) obj;
-        return value.equals(other.value);
-    }
-
-    @Override
-    public int hashCode() {
-        return 41 << 4 | value.hashCode();
-    }
-
-}
diff --git a/trunk/modules/normalizer/example/src/main/java/org/apache/commons/weaver/normalizer/example/InstanceMembers.java b/trunk/modules/normalizer/example/src/main/java/org/apache/commons/weaver/normalizer/example/InstanceMembers.java
deleted file mode 100644
index 0a58b4f..0000000
--- a/trunk/modules/normalizer/example/src/main/java/org/apache/commons/weaver/normalizer/example/InstanceMembers.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.commons.weaver.normalizer.example;
-
-import org.apache.commons.lang3.reflect.TypeLiteral;
-
-public class InstanceMembers {
-    public final TypeLiteral<String> stringType = new TypeLiteral<String>() { };
-    public final TypeLiteral<String> stringType2 = new TypeLiteral<String>() { };
-    public final TypeLiteral<Iterable<Integer>> integerIterableType = new TypeLiteral<Iterable<Integer>>() { };
-
-    public final ContrivedWrapper wrappedObject = new ContrivedWrapper(new Object()) { };
-    public final ContrivedWrapper wrappedString = new ContrivedWrapper("foo") { };
-    public final ContrivedWrapper wrappedString2 = new ContrivedWrapper("foo") { };
-    public final ContrivedWrapper wrappedInteger = new ContrivedWrapper(Integer.valueOf(1)) { };
-    public final ContrivedWrapper wrappedInt = new ContrivedWrapper(1) { };
-}
diff --git a/trunk/modules/normalizer/example/src/main/java/org/apache/commons/weaver/normalizer/example/StaticMembers.java b/trunk/modules/normalizer/example/src/main/java/org/apache/commons/weaver/normalizer/example/StaticMembers.java
deleted file mode 100644
index 78e3bc9..0000000
--- a/trunk/modules/normalizer/example/src/main/java/org/apache/commons/weaver/normalizer/example/StaticMembers.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.commons.weaver.normalizer.example;
-
-import org.apache.commons.lang3.reflect.TypeLiteral;
-
-public final class StaticMembers {
-    private StaticMembers() {
-    }
-
-    public static final TypeLiteral<String> STRING_TYPE = new TypeLiteral<String>() { };
-    public static final TypeLiteral<String> STRING_TYPE2 = new TypeLiteral<String>() { };
-    public static final TypeLiteral<Iterable<Integer>> INTEGER_ITERABLE_TYPE = new TypeLiteral<Iterable<Integer>>() { };
-
-    public static final ContrivedWrapper WRAPPED_OBJECT = new ContrivedWrapper(new Object()) { };
-    public static final ContrivedWrapper WRAPPED_STRING = new ContrivedWrapper("foo") { };
-    public static final ContrivedWrapper WRAPPED_STRING2 = new ContrivedWrapper("foo") { };
-    public static final ContrivedWrapper WRAPPED_INTEGER = new ContrivedWrapper(Integer.valueOf(1)) { };
-    public static final ContrivedWrapper WRAPPED_INT = new ContrivedWrapper(1) { };
-}
diff --git a/trunk/modules/normalizer/example/src/test/java/org/apache/commons/weaver/normalizer/example/NormalizerTest.java b/trunk/modules/normalizer/example/src/test/java/org/apache/commons/weaver/normalizer/example/NormalizerTest.java
deleted file mode 100644
index eae71c2..0000000
--- a/trunk/modules/normalizer/example/src/test/java/org/apache/commons/weaver/normalizer/example/NormalizerTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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.commons.weaver.normalizer.example;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class NormalizerTest {
-    private InstanceMembers instanceMembers;
-
-    @Before
-    public void setup() {
-        instanceMembers = new InstanceMembers();
-    }
-
-    @Test
-    public void testGenericType() {
-        final Class<?> stringLiteral = StaticMembers.STRING_TYPE.getClass();
-        assertTrue(stringLiteral.isInstance(StaticMembers.STRING_TYPE2));
-        assertFalse(stringLiteral.isInstance(StaticMembers.INTEGER_ITERABLE_TYPE));
-        assertTrue(stringLiteral.isInstance(instanceMembers.stringType));
-        assertTrue(stringLiteral.isInstance(instanceMembers.stringType2));
-        assertFalse(stringLiteral.isInstance(instanceMembers.integerIterableType));
-
-        final Class<?> integerIterable = StaticMembers.INTEGER_ITERABLE_TYPE.getClass();
-        assertTrue(integerIterable.isInstance(instanceMembers.integerIterableType));
-    }
-
-    @Test
-    public void testAlternateConstructors() {
-        final Class<?> objectWrapper = StaticMembers.WRAPPED_OBJECT.getClass();
-        assertTrue(objectWrapper.isInstance(StaticMembers.WRAPPED_STRING));
-        assertTrue(objectWrapper.isInstance(StaticMembers.WRAPPED_STRING2));
-        assertTrue(objectWrapper.isInstance(StaticMembers.WRAPPED_INTEGER));
-        assertFalse(objectWrapper.isInstance(StaticMembers.WRAPPED_INT));
-        assertTrue(objectWrapper.isInstance(instanceMembers.wrappedObject));
-        assertTrue(objectWrapper.isInstance(instanceMembers.wrappedString));
-        assertTrue(objectWrapper.isInstance(instanceMembers.wrappedString2));
-        assertTrue(objectWrapper.isInstance(instanceMembers.wrappedInteger));
-        assertFalse(objectWrapper.isInstance(instanceMembers.wrappedInt));
-        final Class<?> intWrapper = StaticMembers.WRAPPED_INT.getClass();
-        assertTrue(intWrapper.isInstance(instanceMembers.wrappedInt));
-    }
-}
diff --git a/trunk/modules/normalizer/pom.xml b/trunk/modules/normalizer/pom.xml
deleted file mode 100644
index 9f9fdb8..0000000
--- a/trunk/modules/normalizer/pom.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<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">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-weaver-modules-parent</artifactId>
-    <version>1.0</version>
-  </parent>
-
-  <artifactId>commons-weaver-normalizer-parent</artifactId>
-  <packaging>pom</packaging>
-
-  <name>Apache Commons Weaver Normalizer Parent POM</name>
-
-  <description>
-    The Normalizer module merges identical anonymous class definitions into
-    a single type, thereby "normalizing" them and reducing their
-    collective footprint on your archive and more importantly on your JVM.
-  </description>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/modules/normalizer</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/modules/normalizer</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/weaver/tags/1.0_RC2/modules/normalizer</url>
-  </scm>
-
-  <modules>
-    <module>weaver</module>
-    <module>example</module>
-  </modules>
-</project>
-
diff --git a/trunk/modules/normalizer/src/site/markdown/index.md b/trunk/modules/normalizer/src/site/markdown/index.md
deleted file mode 100644
index 3505434..0000000
--- a/trunk/modules/normalizer/src/site/markdown/index.md
+++ /dev/null
@@ -1,46 +0,0 @@
-<!--
-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.
--->
-
-## Apache Commons Weaver Normalizer
-
-The Normalizer module merges identical anonymous class definitions into
-a single type, thereby "normalizing" them and reducing their
-collective footprint on your archive and more importantly on your JVM.
-
-Considers only the simplest case in which:
-
- - no methods are implemented
-
- - the constructor only calls the super constructor
-
-An anonymous class which violates these restrictions will be considered
-too complex and skipped in the interest of correctness.
-
-
-### Configuration
-The [NormalizerWeaver][normalizerWeaver] supports the following options:
-
-- `normalizer.superTypes` : comma-delimited list of types whose
- subclasses/implementations should be normalized, e.g.
- `javax.enterprise.util.TypeLiteral`.
-
-- `normalizer.targetPackage` : package to which merged types should be added.
-
-
-[normalizerWeaver]: ../../apidocs/org/apache/commons/weaver/normalizer/NormalizerWeaver.html
diff --git a/trunk/modules/normalizer/weaver/pom.xml b/trunk/modules/normalizer/weaver/pom.xml
deleted file mode 100644
index e7cab43..0000000
--- a/trunk/modules/normalizer/weaver/pom.xml
+++ /dev/null
@@ -1,197 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<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">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-weaver-normalizer-parent</artifactId>
-    <version>1.0</version>
-  </parent>
-  <artifactId>commons-weaver-normalizer</artifactId>
-  <name>Apache Commons Weaver Normalizer</name>
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-  </properties>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/modules/normalizer/weaver</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/modules/normalizer/weaver</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/weaver/tags/1.0_RC2/modules/normalizer/weaver</url>
-  </scm>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-processor</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-  <profiles>
-    <profile>
-      <id>basic</id>
-      <activation>
-        <activeByDefault>true</activeByDefault>
-      </activation>
-      <dependencies>
-        <dependency>
-          <groupId>org.ow2.asm</groupId>
-          <artifactId>asm</artifactId>
-        </dependency>
-        <dependency>
-          <groupId>org.ow2.asm</groupId>
-          <artifactId>asm-commons</artifactId>
-        </dependency>
-        <dependency>
-          <groupId>org.ow2.asm</groupId>
-          <artifactId>asm-tree</artifactId>
-        </dependency>
-      </dependencies>
-    </profile>
-    <profile>
-      <id>dev</id>
-      <dependencies>
-        <dependency>
-          <groupId>org.ow2.asm</groupId>
-          <artifactId>asm-debug-all</artifactId>
-        </dependency>
-      </dependencies>
-    </profile>
-  </profiles>
-  <build>
-    <plugins>
-      <!-- shade plugin creates but does not clean ${basedir}/dependency-reduced-pom.xml -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-clean-plugin</artifactId>
-        <configuration>
-          <filesets>
-            <fileset>
-              <directory>${basedir}</directory>
-              <includes>
-                <include>dependency-reduced-pom.xml</include>
-              </includes>
-            </fileset>
-          </filesets>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-shade-plugin</artifactId>
-        <version>2.1</version>
-        <executions>
-          <execution>
-            <id>shade</id>
-            <goals>
-              <goal>shade</goal>
-            </goals>
-            <configuration>
-              <minimizeJar>true</minimizeJar>
-              <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-              <artifactSet>
-                <includes>
-                  <include>org.apache.commons:commons-lang3</include>
-                  <include>commons-io:commons-io</include>
-                  <include>org.ow2.asm:*</include>
-                </includes>
-              </artifactSet>
-              <relocations>
-                <relocation>
-                  <pattern>org.apache.commons.lang3.</pattern>
-                  <shadedPattern>org.apache.commons.weaver.normalizer._lang3.</shadedPattern>
-                </relocation>
-                <relocation>
-                  <pattern>org.apache.commons.io.</pattern>
-                  <shadedPattern>org.apache.commons.weaver.normalizer._io.</shadedPattern>
-                </relocation>
-                <relocation>
-                  <pattern>org.objectweb.asm.</pattern>
-                  <shadedPattern>org.apache.commons.weaver.normalizer._asm.</shadedPattern>
-                </relocation>
-              </relocations>
-              <filters>
-                <filter>
-                  <artifact>org.apache.commons:commons-lang3</artifact>
-                  <excludes>
-                    <exclude>META-INF/**</exclude>
-                  </excludes>
-                </filter>
-                <filter>
-                  <artifact>commons-io:commons-io</artifact>
-                  <excludes>
-                    <exclude>META-INF/**</exclude>
-                  </excludes>
-                </filter>
-                <filter>
-                  <artifact>org.ow2.asm:*</artifact>
-                  <excludes>
-                    <exclude>META-INF/**</exclude>
-                  </excludes>
-                </filter>
-              </filters>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-pmd-plugin</artifactId>
-        <configuration>
-          <rulesets>
-            <ruleset>/org/apache/commons/weaver/pmd.xml</ruleset>
-          </rulesets>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-checkstyle-plugin</artifactId>
-        <version>${checkstyle.version}</version>
-        <configuration>
-          <configLocation>org/apache/commons/weaver/checkstyle.xml</configLocation>
-          <headerLocation>org/apache/commons/weaver/license-header.txt</headerLocation>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>findbugs-maven-plugin</artifactId>
-        <configuration>
-          <xmlOutput>true</xmlOutput>
-          <excludeFilterFile>/org/apache/commons/weaver/findbugs-exclude-filter.xml</excludeFilterFile>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
-</project>
diff --git a/trunk/modules/normalizer/weaver/src/main/java/org/apache/commons/weaver/normalizer/Normalizer.java b/trunk/modules/normalizer/weaver/src/main/java/org/apache/commons/weaver/normalizer/Normalizer.java
deleted file mode 100644
index dab0895..0000000
--- a/trunk/modules/normalizer/weaver/src/main/java/org/apache/commons/weaver/normalizer/Normalizer.java
+++ /dev/null
@@ -1,566 +0,0 @@
-/*
- * 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.commons.weaver.normalizer;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Target;
-import java.nio.charset.Charset;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.text.MessageFormat;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.Map;
-import java.util.Set;
-
-import javax.activation.DataSource;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.CharEncoding;
-import org.apache.commons.lang3.Conversion;
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.lang3.mutable.MutableBoolean;
-import org.apache.commons.lang3.tuple.MutablePair;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.commons.weaver.model.ScanRequest;
-import org.apache.commons.weaver.model.ScanResult;
-import org.apache.commons.weaver.model.Scanner;
-import org.apache.commons.weaver.model.WeavableClass;
-import org.apache.commons.weaver.model.WeaveEnvironment;
-import org.apache.commons.weaver.spi.Weaver;
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.commons.GeneratorAdapter;
-import org.objectweb.asm.commons.Method;
-import org.objectweb.asm.commons.Remapper;
-import org.objectweb.asm.commons.RemappingClassAdapter;
-import org.objectweb.asm.commons.SimpleRemapper;
-
-/**
- * Handles the work of "normalizing" anonymous class definitions.
- */
-public class Normalizer {
-    private static final String INIT = "<init>";
-
-    private static final Type OBJECT_TYPE = Type.getType(Object.class);
-
-    /**
-     * Marker annotation.
-     */
-    @Target(ElementType.TYPE)
-    private @interface Marker {
-    }
-
-    private static class ClassWrapper {
-        final Class<?> wrapped;
-        final boolean mustRewriteConstructor;
-
-        ClassWrapper(final Class<?> wrapped, final boolean mustRewriteConstructor) {
-            this.wrapped = wrapped;
-            this.mustRewriteConstructor = mustRewriteConstructor;
-        }
-    }
-
-    private class WriteClass extends ClassVisitor {
-        private String className;
-
-        WriteClass() {
-            super(Opcodes.ASM4, new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS));
-        }
-
-        WriteClass(final ClassReader reader) {
-            super(Opcodes.ASM4, new ClassWriter(reader, 0));
-        }
-
-        @Override
-        public void visit(final int version, final int access, final String name, final String signature,
-            final String superName, final String[] intrfces) {
-            super.visit(version, access, name, signature, superName, intrfces);
-            className = name;
-        }
-
-        @Override
-        public void visitEnd() {
-            super.visitEnd();
-            final byte[] bytecode = ((ClassWriter) cv).toByteArray();
-
-            final DataSource classfile = env.getClassfile(className);
-            env.debug("Writing class %s to %s", className, classfile.getName());
-            OutputStream outputStream = null;
-            try {
-                outputStream = classfile.getOutputStream();
-                IOUtils.write(bytecode, outputStream);
-            } catch (final IOException e) {
-                throw new RuntimeException(e);
-            } finally {
-                IOUtils.closeQuietly(outputStream);
-            }
-        }
-    }
-
-    private enum IneligibilityReason {
-        NOT_ANONYMOUS, TOO_MANY_CONSTRUCTORS, IMPLEMENTS_METHODS, TOO_BUSY_CONSTRUCTOR;
-    }
-
-    /**
-     * Configuration prefix for this {@link Weaver}.
-     */
-    public static final String CONFIG_WEAVER = "normalizer.";
-
-    /**
-     * Property name referencing a comma-delimited list of types whose subclasses/implementations should be normalized,
-     * e.g. {@code javax.enterprise.util.TypeLiteral}.
-     */
-    public static final String CONFIG_SUPER_TYPES = CONFIG_WEAVER + "superTypes";
-
-    /**
-     * Property name referencing a package name to which merged types should be added.
-     */
-    public static final String CONFIG_TARGET_PACKAGE = CONFIG_WEAVER + "targetPackage";
-
-    private static final Charset UTF8 = Charset.forName(CharEncoding.UTF_8);
-
-    private final WeaveEnvironment env;
-
-    private final Set<Class<?>> normalizeTypes;
-    private final String targetPackage;
-
-    /**
-     * Create a new {@link Normalizer} instance.
-     * @param env {@link WeaveEnvironment}
-     */
-    public Normalizer(final WeaveEnvironment env) {
-        this.env = env;
-
-        this.targetPackage =
-            Utils.validatePackageName(Validate.notBlank(env.config.getProperty(CONFIG_TARGET_PACKAGE),
-                "missing target package name"));
-        this.normalizeTypes =
-            Utils.parseTypes(
-                Validate.notEmpty(env.config.getProperty(CONFIG_SUPER_TYPES), "no types specified for normalization"),
-                env.classLoader);
-    }
-
-    /**
-     * Normalize the classes found using the specified {@link Scanner}.
-     * @param scanner to scan with
-     * @return whether any work was done
-     */
-    public boolean normalize(final Scanner scanner) {
-        boolean result = false;
-        for (final Class<?> supertype : normalizeTypes) {
-            final Set<Class<?>> subtypes = getBroadlyEligibleSubclasses(supertype, scanner);
-            try {
-                final Map<Pair<String, String>, Set<ClassWrapper>> segregatedSubtypes = segregate(subtypes);
-                for (final Map.Entry<Pair<String, String>, Set<ClassWrapper>> entry : segregatedSubtypes.entrySet()) {
-                    final Set<ClassWrapper> likeTypes = entry.getValue();
-                    if (likeTypes.size() > 1) {
-                        result = true;
-                        rewrite(entry.getKey(), likeTypes);
-                    }
-                }
-            } catch (final RuntimeException e) {
-                throw e;
-            } catch (final Exception e) {
-                throw new RuntimeException(e);
-            }
-        }
-        return result;
-    }
-
-    /**
-     * Map a set of classes by their enclosing class.
-     * @param sort values
-     * @return {@link Map} of enclosing classname to {@link Map} of internal name to {@link ClassWrapper}
-     */
-    private Map<String, Map<String, ClassWrapper>> byEnclosingClass(final Set<ClassWrapper> sort) {
-        final Map<String, Map<String, ClassWrapper>> result = new HashMap<String, Map<String, ClassWrapper>>();
-        for (final ClassWrapper wrapper : sort) {
-            final String outer = wrapper.wrapped.getEnclosingClass().getName();
-            Map<String, ClassWrapper> map = result.get(outer);
-            if (map == null) {
-                map = new LinkedHashMap<String, Normalizer.ClassWrapper>();
-                result.put(outer, map);
-            }
-            map.put(wrapper.wrapped.getName().replace('.', '/'), wrapper);
-        }
-        return result;
-    }
-
-    /**
-     * Rewrite classes as indicated by one entry of {@link #segregate(Iterable)}.
-     * @param key {@link String} {@link Pair} indicating supertype and constructor signature
-     * @param toMerge matching classes
-     * @throws IOException on I/O error
-     * @throws ClassNotFoundException if class not found
-     */
-    private void rewrite(final Pair<String, String> key, final Set<ClassWrapper> toMerge) throws IOException,
-        ClassNotFoundException {
-        final String target = copy(key, toMerge.iterator().next());
-        env.info("Merging %s identical %s implementations with constructor %s to type %s", toMerge.size(),
-            key.getLeft(), key.getRight(), target);
-
-        final Map<String, Map<String, ClassWrapper>> byEnclosingClass = byEnclosingClass(toMerge);
-        for (final Map.Entry<String, Map<String, ClassWrapper>> entry : byEnclosingClass.entrySet()) {
-            final String outer = entry.getKey();
-            env.debug("Normalizing %s inner classes of %s", entry.getValue().size(), outer);
-            final Map<String, String> classMap = new HashMap<String, String>();
-            for (final String merged : entry.getValue().keySet()) {
-                classMap.put(merged, target);
-            }
-            final Remapper remapper = new SimpleRemapper(classMap);
-
-            InputStream enclosingBytecode = null;
-            try {
-                enclosingBytecode = env.getClassfile(outer).getInputStream();
-                final ClassReader reader = new ClassReader(enclosingBytecode);
-
-                final ClassVisitor cv = // NOPMD
-                        new RemappingClassAdapter(new WriteClass(reader), remapper) {
-
-                    @Override
-                    public void visitInnerClass(final String name, final String outerName, final String innerName,
-                        final int access) {
-                        if (!classMap.containsKey(name)) {
-                            super.visitInnerClass(name, outerName, innerName, access);
-                        }
-                    }
-
-                    @Override
-                    public MethodVisitor visitMethod(final int access, final String name, final String desc,
-                        final String signature, final String[] exceptions) {
-                        final MethodVisitor mv = // NOPMD
-                                super.visitMethod(access, name, desc, signature, exceptions);
-                        return new MethodVisitor(Opcodes.ASM4, mv) {
-                            @Override
-                            public void visitMethodInsn(final int opcode, final String owner, final String name,
-                                final String desc) {
-                                String useDescriptor = desc;
-                                if (INIT.equals(name)) {
-                                    final ClassWrapper wrapper = entry.getValue().get(owner);
-                                    if (wrapper != null && wrapper.mustRewriteConstructor) {
-                                        // simply replace first argument type with OBJECT_TYPE:
-                                        final Type[] args = Type.getArgumentTypes(desc);
-                                        args[0] = OBJECT_TYPE;
-                                        useDescriptor = new Method(INIT, Type.VOID_TYPE, args).getDescriptor();
-                                    }
-                                }
-                                super.visitMethodInsn(opcode, owner, name, useDescriptor);
-                            }
-                        };
-                    }
-                };
-
-                reader.accept(cv, 0);
-            } finally {
-                IOUtils.closeQuietly(enclosingBytecode);
-            }
-            for (final String merged : entry.getValue().keySet()) {
-                if (env.deleteClassfile(merged)) {
-                    env.debug("Deleted class %s", merged);
-                } else {
-                    env.warn("Unable to delete class %s", merged);
-                }
-            }
-        }
-
-    }
-
-    /**
-     * <p>Find subclasses/implementors of {code supertype} that:
-     * <ul>
-     * <li>are anonymous</li>
-     * <li>declare a single constructor (probably redundant in the case of an anonymous class)</li>
-     * <li>do not implement any methods</li>
-     * </ul>
-     * </p><p>
-     * Considered "broadly" eligible because the instructions in the implemented constructor may remove the class from
-     * consideration later on.
-     * </p>
-     * @param supertype whose subtypes are sought
-     * @param scanner to use
-     * @return {@link Set} of {@link Class}
-     * @see #segregate(Iterable)
-     */
-    private Set<Class<?>> getBroadlyEligibleSubclasses(final Class<?> supertype, final Scanner scanner) {
-        final ScanResult scanResult = scanner.scan(new ScanRequest().addSupertypes(supertype));
-        final Set<Class<?>> result = new LinkedHashSet<Class<?>>();
-        for (final WeavableClass<?> cls : scanResult.getClasses()) {
-            final Class<?> subtype = cls.getTarget();
-            final IneligibilityReason reason;
-            if (!subtype.isAnonymousClass()) {
-                reason = IneligibilityReason.NOT_ANONYMOUS;
-            } else if (subtype.getDeclaredConstructors().length != 1) {
-                reason = IneligibilityReason.TOO_MANY_CONSTRUCTORS;
-            } else if (subtype.getDeclaredMethods().length > 0) {
-                reason = IneligibilityReason.IMPLEMENTS_METHODS;
-            } else {
-                result.add(subtype);
-                continue;
-            }
-            env.debug("Removed %s from consideration due to %s", subtype, reason);
-        }
-        return result;
-    }
-
-    /**
-     * <p>Segregate a number of classes (presumed subclasses/implementors of a
-     * common supertype/interface). The keys of the map consist of the important
-     * parts for identifying similar anonymous types: the "signature" and the
-     * invoked superclass constructor. For our purposes, the signature consists
-     * of the first applicable item of:
-     * <ol>
-     * <li>The generic signature of the class</li>
-     * <li>The sole implemented interface</li>
-     * <li>The superclass</li>
-     * </ol>
-     * </p><p>
-     * The class will be considered ineligible if its constructor is too "busy" as its side effects cannot be
-     * anticipated; the normalizer will err on the side of caution.
-     * </p><p>
-     * Further, we will here avail ourselves of the opportunity to discard any types we have already normalized.
-     * </p>
-     * @param subtypes
-     * @return Map of Pair<String, String> to Set of Classes
-     * @throws IOException
-     */
-    private Map<Pair<String, String>, Set<ClassWrapper>> segregate(final Iterable<Class<?>> subtypes)
-        throws IOException {
-        final Map<Pair<String, String>, Set<ClassWrapper>> classMap =
-            new LinkedHashMap<Pair<String, String>, Set<ClassWrapper>>();
-        for (final Class<?> subtype : subtypes) {
-            final MutablePair<String, String> key = new MutablePair<String, String>();
-            final MutableBoolean ignore = new MutableBoolean(false);
-            final MutableBoolean valid = new MutableBoolean(true);
-            final MutableBoolean mustRewriteConstructor = new MutableBoolean();
-            InputStream bytecode = null;
-
-            try {
-                bytecode = env.getClassfile(subtype).getInputStream();
-                new ClassReader(bytecode).accept(new ClassVisitor(Opcodes.ASM4) {
-                    String superName;
-
-                    @Override
-                    public void visit(final int version, final int access, final String name, final String signature,
-                        final String superName, final String[] interfaces) {
-                        super.visit(version, access, name, signature, superName, interfaces);
-                        this.superName = superName;
-                        final String left;
-                        if (signature != null) {
-                            left = signature;
-                        } else if (ArrayUtils.getLength(interfaces) == 1) {
-                            left = interfaces[0];
-                        } else {
-                            left = superName;
-                        }
-                        key.setLeft(left);
-                    }
-
-                    @Override
-                    public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
-                        if (Type.getType(Marker.class).getDescriptor().equals(desc)) {
-                            ignore.setValue(true);
-                        }
-                        return null;
-                    }
-
-                    @Override
-                    public MethodVisitor visitMethod(final int access, final String name, final String desc,
-                        final String signature, final String[] exceptions) {
-                        if (INIT.equals(name)) {
-                            return new MethodVisitor(Opcodes.ASM4) {
-                                @Override
-                                public void visitMethodInsn(final int opcode, final String owner, final String name,
-                                    final String desc) {
-                                    if (INIT.equals(name) && owner.equals(superName)) {
-                                        key.setRight(desc);
-                                    } else {
-                                        valid.setValue(false);
-                                    }
-                                }
-
-                                @Override
-                                public void visitFieldInsn(final int opcode, final String owner, final String name,
-                                    final String desc) {
-                                    if ("this$0".equals(name) && opcode == Opcodes.PUTFIELD) {
-                                        mustRewriteConstructor.setValue(true);
-                                        return;
-                                    }
-                                    valid.setValue(false);
-                                }
-                            };
-                        }
-                        return null;
-                    }
-                }, 0);
-            } finally {
-                IOUtils.closeQuietly(bytecode);
-            }
-            if (ignore.booleanValue()) {
-                continue;
-            }
-            if (valid.booleanValue()) {
-                Set<ClassWrapper> set = classMap.get(key);
-                if (set == null) {
-                    set = new LinkedHashSet<ClassWrapper>();
-                    classMap.put(key, set);
-                }
-                set.add(new ClassWrapper(subtype, mustRewriteConstructor.booleanValue()));
-            } else {
-                env.debug("%s is ineligible for normalization due to %s", subtype,
-                    IneligibilityReason.TOO_BUSY_CONSTRUCTOR);
-            }
-        }
-        return classMap;
-    }
-
-    /**
-     * Create the normalized version of a given class in the configured target package. The {@link Normalizer} will
-     * gladly do so in a package from which the normalized class will not actually be able to reference any types upon
-     * which it relies; in such a situation you must specify the target package as the package of the supertype.
-     * @param key used to generate the normalized classname.
-     * @param classWrapper
-     * @return the generated classname.
-     * @throws IOException
-     * @throws ClassNotFoundException
-     */
-    private String copy(final Pair<String, String> key, final ClassWrapper classWrapper) throws IOException,
-        ClassNotFoundException {
-        final MessageDigest md5;
-        try {
-            md5 = MessageDigest.getInstance("MD5");
-        } catch (final NoSuchAlgorithmException e) {
-            throw new RuntimeException(e);
-        }
-        md5.update(key.getLeft().getBytes(UTF8));
-        md5.update(key.getRight().getBytes(UTF8));
-
-        final long digest = Conversion.byteArrayToLong(md5.digest(), 0, 0L, 0, Long.SIZE / Byte.SIZE);
-
-        final String result = MessageFormat.format("{0}/$normalized{1,number,0;_0}", targetPackage, digest);
-
-        env.debug("Copying class %s to %s", classWrapper.wrapped.getName(), result);
-
-        InputStream bytecode = null;
-
-        try {
-            bytecode = env.getClassfile(classWrapper.wrapped).getInputStream();
-            final ClassReader reader = new ClassReader(bytecode);
-
-            final ClassVisitor writeClass = new WriteClass();
-
-            // we're doing most of this by hand; we only read the original class to hijack signature, ctor exceptions,
-            // etc.:
-
-            reader.accept(new ClassVisitor(Opcodes.ASM4) {
-                Type supertype;
-
-                @Override
-                public void visit(final int version, final int access, final String name, final String signature,
-                    final String superName, final String[] interfaces) {
-                    supertype = Type.getObjectType(superName);
-                    writeClass.visit(version, Opcodes.ACC_PUBLIC, result, signature, superName, interfaces);
-
-                    visitAnnotation(Type.getType(Marker.class).getDescriptor(), false);
-                }
-
-                @Override
-                public MethodVisitor visitMethod(final int access, final String name, final String desc,
-                    final String signature, final String[] exceptions) {
-                    if (INIT.equals(name)) {
-
-                        final Method staticCtor = new Method(INIT, key.getRight());
-                        final Type[] argumentTypes = staticCtor.getArgumentTypes();
-                        final Type[] exceptionTypes = toObjectTypes(exceptions);
-
-                        {
-                            final GeneratorAdapter mgen =
-                                new GeneratorAdapter(Opcodes.ACC_PUBLIC, staticCtor, signature, exceptionTypes,
-                                    writeClass);
-                            mgen.visitCode();
-                            mgen.loadThis();
-                            for (int i = 0; i < argumentTypes.length; i++) {
-                                mgen.loadArg(i);
-                            }
-                            mgen.invokeConstructor(supertype, staticCtor);
-                            mgen.returnValue();
-                            mgen.endMethod();
-                        }
-                        /*
-                         * now declare a dummy constructor that will match, and discard,
-                         * any originally inner-class bound constructor i.e. that set up a this$0 field.
-                         * By doing this we can avoid playing with the stack that originally
-                         * invoked such a constructor and simply rewrite the method
-                         */
-                        {
-                            final Method instanceCtor =
-                                new Method(INIT, Type.VOID_TYPE, ArrayUtils.add(argumentTypes, 0, OBJECT_TYPE));
-                            final GeneratorAdapter mgen =
-                                new GeneratorAdapter(Opcodes.ACC_PUBLIC, instanceCtor, signature, exceptionTypes,
-                                    writeClass);
-                            mgen.visitCode();
-                            mgen.loadThis();
-                            for (int i = 0; i < argumentTypes.length; i++) {
-                                mgen.loadArg(i + 1);
-                            }
-                            mgen.invokeConstructor(supertype, staticCtor);
-                            mgen.returnValue();
-                            mgen.endMethod();
-                        }
-                        return null;
-                    }
-                    return null;
-                }
-
-                @Override
-                public void visitEnd() {
-                    writeClass.visitEnd();
-                }
-            }, 0);
-        } finally {
-            IOUtils.closeQuietly(bytecode);
-        }
-        return result;
-    }
-
-    /**
-     * Translate internal names to Java type names.
-     * @param types to translate
-     * @return {@link Type}[]
-     * @see Type#getObjectType(String)
-     */
-    private static Type[] toObjectTypes(final String[] types) {
-        if (types == null) {
-            return null;
-        }
-        final Type[] result = new Type[types.length];
-        for (int i = 0; i < types.length; i++) {
-            result[i] = Type.getObjectType(types[i]);
-        }
-        return result;
-    }
-}
diff --git a/trunk/modules/normalizer/weaver/src/main/java/org/apache/commons/weaver/normalizer/NormalizerWeaver.java b/trunk/modules/normalizer/weaver/src/main/java/org/apache/commons/weaver/normalizer/NormalizerWeaver.java
deleted file mode 100644
index 0b8693a..0000000
--- a/trunk/modules/normalizer/weaver/src/main/java/org/apache/commons/weaver/normalizer/NormalizerWeaver.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.commons.weaver.normalizer;
-
-import org.apache.commons.weaver.model.Scanner;
-import org.apache.commons.weaver.model.WeaveEnvironment;
-import org.apache.commons.weaver.spi.Weaver;
-
-/**
- * The purpose of the normalizer module is to merge identical anonymous class definitions into a single type, thereby
- * "normalizing" them and reducing their collective footprint on your archive and more importantly on your JVM.
- */
-public class NormalizerWeaver implements Weaver {
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean process(final WeaveEnvironment environment, final Scanner scanner) {
-        return new Normalizer(environment).normalize(scanner);
-    }
-
-}
diff --git a/trunk/modules/normalizer/weaver/src/main/java/org/apache/commons/weaver/normalizer/Utils.java b/trunk/modules/normalizer/weaver/src/main/java/org/apache/commons/weaver/normalizer/Utils.java
deleted file mode 100644
index 93d1bea..0000000
--- a/trunk/modules/normalizer/weaver/src/main/java/org/apache/commons/weaver/normalizer/Utils.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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.commons.weaver.normalizer;
-
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-import org.apache.commons.lang3.ClassUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.Validate;
-
-/**
- * Normalization utilities.
- */
-final class Utils {
-    private Utils() {
-    }
-
-    /**
-     * Validate a package name.
-     * @param pkg to validate
-     * @return {@code pkg}, ({@code ""} if {@code null}), having replaced
-     *         {@code '.'} with {@code '/'} and removed any terminating separator
-     * @throws IllegalArgumentException if invalid
-     */
-    static String validatePackageName(final String pkg) {
-        if (StringUtils.isBlank(pkg)) {
-            return "";
-        }
-        String result = pkg.trim();
-
-        final String unexpected = "Unexpected character %s at pos %s of package name \"%s\"";
-
-        boolean next = true;
-        for (int pos = 0; pos < result.length(); pos++) {
-            final char chr = result.charAt(pos);
-            if (next) {
-                next = false;
-                Validate.isTrue(Character.isJavaIdentifierStart(chr), unexpected, chr, pos, result);
-                continue;
-            }
-            if (chr == '/' || chr == '.') {
-                next = true;
-                continue;
-            }
-            Validate.isTrue(Character.isJavaIdentifierPart(chr), unexpected, chr, pos, result);
-        }
-
-        result = result.replace('.', '/');
-        final int last = result.length() - 1;
-        if (result.charAt(last) == '/') {
-            result = result.substring(0, last);
-        }
-        return result;
-    }
-
-    /**
-     * Parse a number of Java types speciified as a comma-delimited
-     * {@link String} of fully-qualified or internal names (i.e., slashes are
-     * legal).
-     * @param types to parse
-     * @param classLoader {@link ClassLoader} to search
-     * @return {@link Set} of {@link Class}
-     */
-    static Set<Class<?>> parseTypes(final String types, final ClassLoader classLoader) {
-        final Set<Class<?>> result = new LinkedHashSet<Class<?>>();
-        for (final String token : StringUtils.splitByWholeSeparatorPreserveAllTokens(types, ",")) {
-            try {
-                result.add(ClassUtils.getClass(classLoader, token.trim().replace('/', '.')));
-            } catch (final ClassNotFoundException e) {
-                throw new IllegalArgumentException(e);
-            }
-        }
-        return result;
-    }
-}
diff --git a/trunk/modules/normalizer/weaver/src/main/java/org/apache/commons/weaver/normalizer/package-info.java b/trunk/modules/normalizer/weaver/src/main/java/org/apache/commons/weaver/normalizer/package-info.java
deleted file mode 100644
index 584b015..0000000
--- a/trunk/modules/normalizer/weaver/src/main/java/org/apache/commons/weaver/normalizer/package-info.java
+++ /dev/null
@@ -1,5 +0,0 @@
-/**
- * Implements the Normalizer weaver, whose purpose is to collapse identical
- * anonymous class definitions into a single one.
- */
-package org.apache.commons.weaver.normalizer;
\ No newline at end of file
diff --git a/trunk/modules/normalizer/weaver/src/main/resources/META-INF/services/org.apache.commons.weaver.spi.Weaver b/trunk/modules/normalizer/weaver/src/main/resources/META-INF/services/org.apache.commons.weaver.spi.Weaver
deleted file mode 100644
index 12a05ca..0000000
--- a/trunk/modules/normalizer/weaver/src/main/resources/META-INF/services/org.apache.commons.weaver.spi.Weaver
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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.
-
-# this class gets picked up by the WeaveProcessor
-org.apache.commons.weaver.normalizer.NormalizerWeaver
diff --git a/trunk/modules/normalizer/weaver/src/test/java/org/apache/commons/weaver/normalizer/UtilsTest.java b/trunk/modules/normalizer/weaver/src/test/java/org/apache/commons/weaver/normalizer/UtilsTest.java
deleted file mode 100644
index d12eac2..0000000
--- a/trunk/modules/normalizer/weaver/src/test/java/org/apache/commons/weaver/normalizer/UtilsTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * 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.commons.weaver.normalizer;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.junit.Test;
-
-public class UtilsTest {
-    @Test
-    public void testValidatePackageName() {
-        assertEquals("", Utils.validatePackageName(""));
-        assertEquals("", Utils.validatePackageName("    "));
-        assertEquals("foo", Utils.validatePackageName("foo"));
-        assertEquals("foo/bar", Utils.validatePackageName("foo.bar"));
-        assertEquals("foo/bar", Utils.validatePackageName("foo/bar"));
-        assertEquals("foo/bar/baz", Utils.validatePackageName("foo.bar.baz"));
-        assertEquals("foo/bar/baz", Utils.validatePackageName("foo.bar/baz"));
-        assertEquals("foo/bar/baz", Utils.validatePackageName("foo/bar.baz"));
-        assertEquals("foo/bar/baz", Utils.validatePackageName("foo/bar/baz"));
-        assertEquals("$foo", Utils.validatePackageName("$foo"));
-        assertEquals("_foo", Utils.validatePackageName("_foo"));
-        assertEquals("foo2", Utils.validatePackageName("foo2"));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testValidatePackageNameStartsWithDigit() {
-        Utils.validatePackageName("2foo");
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testValidatePackageNameEmbeddedWhitespace() {
-        Utils.validatePackageName("foo bar");
-    }
-
-    @Test
-    public void testParseTypes() {
-        assertContainsInOrder(Utils.parseTypes(" java.lang.Number ", getClass().getClassLoader()), Number.class);
-        assertContainsInOrder(
-            Utils.parseTypes("java.lang.Number,java.lang.String,java.util.Map", getClass().getClassLoader()),
-            Number.class, String.class, Map.class);
-        assertContainsInOrder(
-            Utils.parseTypes("java.lang.Number, java.lang.String, java.util.Map", getClass().getClassLoader()),
-            Number.class, String.class, Map.class);
-        assertContainsInOrder(
-            Utils.parseTypes("java/lang/Number, java/lang/String, java/util/Map", getClass().getClassLoader()),
-            Number.class, String.class, Map.class);
-        assertContainsInOrder(
-            Utils.parseTypes("java.lang.Number,\njava.lang.String,\njava.util.Map", getClass().getClassLoader()),
-            Number.class, String.class, Map.class);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testParseUnknownType() {
-        Utils.parseTypes("gobbledygook", getClass().getClassLoader());
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testParseMissingFirstType() {
-        Utils.parseTypes(",java.lang.Object", getClass().getClassLoader());
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void testParseMissingLastType() {
-        Utils.parseTypes("java.lang.Object,", getClass().getClassLoader());
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testParseMissingType() {
-        Utils.parseTypes("java.lang.Object,,java.lang.Iterable", getClass().getClassLoader());
-    }
-    
-    <E> void assertContainsInOrder(Iterable<E> iterable, E... expectedElements) {
-        final Iterator<E> iterator = iterable.iterator();
-        for (E e : expectedElements) {
-            assertTrue(iterator.hasNext());
-            assertEquals(e, iterator.next());
-        }
-        assertFalse(iterator.hasNext());
-    }
-}
diff --git a/trunk/modules/pom.xml b/trunk/modules/pom.xml
deleted file mode 100644
index fa1245e..0000000
--- a/trunk/modules/pom.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<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">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>commons-weaver-parent</artifactId>
-    <groupId>org.apache.commons</groupId>
-    <version>1.0</version>
-  </parent>
-
-  <artifactId>commons-weaver-modules-parent</artifactId>
-  <packaging>pom</packaging>
-
-  <name>Apache Commons Weaver Modules aggregator project</name>
-  <description>Hosts weaver modules.</description>
-  <modules>
-    <module>privilizer</module>
-    <module>normalizer</module>
-  </modules>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/modules</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/modules</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/weaver/tags/1.0_RC2/modules</url>
-  </scm>
-
-  <dependencies>
-    <dependency>
-          <!-- we need this dependency for the reactor to correctly resolve the build order -->
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-maven-plugin</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/trunk/modules/privilizer/api/pom.xml b/trunk/modules/privilizer/api/pom.xml
deleted file mode 100644
index 953f51c..0000000
--- a/trunk/modules/privilizer/api/pom.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0"?>
-<!--
-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.
--->
-<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">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-weaver-privilizer-parent</artifactId>
-    <version>1.0</version>
-  </parent>
-
-  <artifactId>commons-weaver-privilizer-api</artifactId>
-  <name>Apache Commons Weaver Privilizer API</name>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/modules/privilizer/api</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/modules/privilizer/api</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/weaver/tags/1.0_RC2/modules/privilizer/api</url>
-  </scm>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-source-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>attach-test-sources</id>
-            <phase />
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase />
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-checkstyle-plugin</artifactId>
-        <version>${checkstyle.version}</version>
-        <configuration>
-          <configLocation>org/apache/commons/weaver/checkstyle.xml</configLocation>
-          <headerLocation>org/apache/commons/weaver/license-header.txt</headerLocation>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
-</project>
diff --git a/trunk/modules/privilizer/api/src/main/java/org/apache/commons/weaver/privilizer/Privileged.java b/trunk/modules/privilizer/api/src/main/java/org/apache/commons/weaver/privilizer/Privileged.java
deleted file mode 100644
index 08f0564..0000000
--- a/trunk/modules/privilizer/api/src/main/java/org/apache/commons/weaver/privilizer/Privileged.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.commons.weaver.privilizer;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Marks a method as needing to execute in a privileged fashion in secured
- * environments.
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.CLASS)
-public @interface Privileged {
-}
diff --git a/trunk/modules/privilizer/api/src/main/java/org/apache/commons/weaver/privilizer/Privilizing.java b/trunk/modules/privilizer/api/src/main/java/org/apache/commons/weaver/privilizer/Privilizing.java
deleted file mode 100644
index e4604b9..0000000
--- a/trunk/modules/privilizer/api/src/main/java/org/apache/commons/weaver/privilizer/Privilizing.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.commons.weaver.privilizer;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Target;
-
-/**
- * Indicates that a certain set of method calls should be "blueprint privilized," i.e.,
- * their method bodies should be (recursively) copied for privileged invocation
- * per the privilizer policy with which the blueprint privilizer weaver is invoked.
- */
-@Target(ElementType.TYPE)
-public @interface Privilizing {
-    /**
-     * Models calls to blueprint methods defined on a specific class.
-     */
-    public @interface CallTo {
-        /**
-         * The class owning one or more blueprint method.
-         */
-        Class<?> value();
-
-        /**
-         * The names of the blueprint methods.
-         */
-        String[] methods() default { };
-    }
-
-    /**
-     * List of blueprint calls.
-     */
-    CallTo[] value();
-}
diff --git a/trunk/modules/privilizer/api/src/main/java/org/apache/commons/weaver/privilizer/package-info.java b/trunk/modules/privilizer/api/src/main/java/org/apache/commons/weaver/privilizer/package-info.java
deleted file mode 100644
index 9b5fb44..0000000
--- a/trunk/modules/privilizer/api/src/main/java/org/apache/commons/weaver/privilizer/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * Defines the annotations that drive the privilizer weaver.
- */
-package org.apache.commons.weaver.privilizer;
\ No newline at end of file
diff --git a/trunk/modules/privilizer/pom.xml b/trunk/modules/privilizer/pom.xml
deleted file mode 100644
index 5e5a727..0000000
--- a/trunk/modules/privilizer/pom.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<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">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-weaver-modules-parent</artifactId>
-    <version>1.0</version>
-  </parent>
-
-  <artifactId>commons-weaver-privilizer-parent</artifactId>
-  <packaging>pom</packaging>
-
-  <name>Apache Commons Weaver Privilizer Parent POM</name>
-
-  <description>
-    Privilizer provides machinery to automate the handling of Java Security access controls in code.
-  </description>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/modules/privilizer</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/modules/privilizer</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/weaver/tags/1.0_RC2/modules/privilizer</url>
-  </scm>
-
-  <modules>
-    <module>api</module>
-    <module>weaver</module>
-  </modules>
-</project>
diff --git a/trunk/modules/privilizer/src/site/markdown/index.md b/trunk/modules/privilizer/src/site/markdown/index.md
deleted file mode 100644
index 54ff2c3..0000000
--- a/trunk/modules/privilizer/src/site/markdown/index.md
+++ /dev/null
@@ -1,118 +0,0 @@
-<!--
-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.
--->
-
-## Apache Commons Weaver Privilizer
-
-Provides machinery to automate the handling of Java Security access
-controls in code.  This involves wrapping calls that may trigger
-`java.lang.SecurityException`s in `PrivilegedAction` objects.
-Unfortunately this is quite an expensive operation and slows code
-down considerably; when executed in an environment that has no
-`SecurityManager` activated it is an utter waste.
-The typical pattern to cope with this is:
-
-```java
-if (System.getSecurityManager() != null) {
-  AccessController.doPrivileged(new PrivilegedAction<Void>() {
-    public Void run() {
-      doSomethingThatRequiresPermissions();
-      return null;
-    }
-  });
-} else {
-  doSomethingThatRequiresPermissions();
-}
-```
-
-This becomes tedious in short order.  The immediate response of a
-typical developer:  relegate the repetitive code to a set of
-utility methods.  In the case of Java security, however, this
-approach is considered risky.  The purpose of the Privilizer, then,
-is to instrument compiled methods originally annotated with our
-`@Privileged` annotation.  This annotation is retained in the
-classfiles, but not available at runtime, and there are no runtime
-dependencies.
-
-### Basic Privilization
-
-```java
-
-@Privileged
-private void doSomethingThatRequiresPermissions() {
-  ...
-}
-```
-
-Annotating a method with the [@Privileged][privileged] annotation will cause
-the [PrivilizerWeaver][privilizerWeaver] to generate these checks automatically,
-leaving you to simply implement the code!
-
-### Blueprint Privilization
-The so-called "blueprint" feature returns to the concept of static utility
-methods.  Why are these considered a liability?  Because your trusted code
-presumptuously extends your trust via public methods to any class in the JVM,
-almost certainly contrary to the wishes of the owner of that JVM. Our
-blueprint technique allows you to define (or reuse) static utility methods
-in a secure way:  simply define these utility methods in a
-`SecurityManager`-agnostic manner and let the consuming class request that
-calls to them be treated as blueprints for `@Privileged` methods:
-
-```java
-public class Utils {
-  public static void doSomethingThatRequiresPrivileges() {
-    ...
-  }
-}
-
-@Privilizing(CallTo(Utils.class))
-public class UtilsClient {
-  public void foo() {
-    Utils.doSomethingThatRequiresPrivileges();
-  }
-}
-```
-
-The static methods of the `Utils` class will be called as though they had been
-locally declared and annotated with `@Privileged`. See the documentation of the
-[@Privilizing][privilizing] annotation for more information on how to specify
-multiple classes, restrict to only certain methods, etc.
-
-*Q:* What if my utility methods access static variables of their declaring class?
-
-*A:* The imported methods reference those fields via reflection; i.e. the
-    original fields are used.
-
-*Q:* Does this modify the accessibility of those fields?
-
-*A:* Yes, but only for the duration of the method implementation.  The fields'
-    accessibility is checked before execution, and if a given field is not
-    accessible on the way in, it will be restored to its original state in
-    a `finally` block.
-
-### Configuration
-The `PrivilizerWeaver` supports the following options:
-
-- `privilizer.accessLevel` : name of the highest [AccessLevel][accessLevel] to privilize (default `PRIVATE`)
-- `privilizer.policy` : name of the [Policy][policy] (determines when to check for a `SecurityManager`)
-
-[privileged]: ../../apidocs/org/apache/commons/weaver/privilizer/Privileged.html
-[privilizerWeaver]: ../../apidocs/org/apache/commons/weaver/privilizer/PrivilizerWeaver.html
-[privilizing]: ../../apidocs/org/apache/commons/weaver/privilizer/Privilizing.html
-[policy]: ../../apidocs/org/apache/commons/weaver/privilizer/Policy.html
-[accessLevel]: ../../apidocs/org/apache/commons/weaver/privilizer/AccessLevel.html
diff --git a/trunk/modules/privilizer/weaver/pom.xml b/trunk/modules/privilizer/weaver/pom.xml
deleted file mode 100644
index b5c67d3..0000000
--- a/trunk/modules/privilizer/weaver/pom.xml
+++ /dev/null
@@ -1,226 +0,0 @@
-<?xml version="1.0"?>
-<!--
-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.
--->
-<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">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-weaver-privilizer-parent</artifactId>
-    <version>1.0</version>
-  </parent>
-
-  <artifactId>commons-weaver-privilizer</artifactId>
-  <name>Apache Commons Weaver Privilizer Weaver</name>
-  <description>
-    Implements the Apache Commons Weaver SPI for the Privilizer module.
-  </description>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/modules/privilizer/weaver</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/modules/privilizer/weaver</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/weaver/tags/1.0_RC2/modules/privilizer/weaver</url>
-  </scm>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-privilizer-api</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-weaver-processor</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-    </dependency>
-  </dependencies>
-  <profiles>
-    <profile>
-      <id>basic</id>
-      <activation>
-        <activeByDefault>true</activeByDefault>
-      </activation>
-      <dependencies>
-        <dependency>
-          <groupId>org.ow2.asm</groupId>
-          <artifactId>asm</artifactId>
-        </dependency>
-        <dependency>
-          <groupId>org.ow2.asm</groupId>
-          <artifactId>asm-commons</artifactId>
-        </dependency>
-        <dependency>
-          <groupId>org.ow2.asm</groupId>
-          <artifactId>asm-tree</artifactId>
-        </dependency>
-        <dependency>
-          <groupId>org.ow2.asm</groupId>
-          <artifactId>asm-util</artifactId>
-        </dependency>
-        <dependency>
-          <groupId>org.ow2.asm</groupId>
-          <artifactId>asm-analysis</artifactId>
-        </dependency>
-      </dependencies>
-    </profile>
-    <profile>
-      <id>dev</id>
-      <dependencies>
-        <dependency>
-          <groupId>org.ow2.asm</groupId>
-          <artifactId>asm-debug-all</artifactId>
-        </dependency>
-      </dependencies>
-    </profile>
-  </profiles>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-source-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>attach-test-sources</id>
-            <phase />
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase />
-          </execution>
-        </executions>
-      </plugin>
-      <!-- shade plugin creates but does not clean ${basedir}/dependency-reduced-pom.xml -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-clean-plugin</artifactId>
-        <configuration>
-          <filesets>
-            <fileset>
-              <directory>${basedir}</directory>
-              <includes>
-                <include>dependency-reduced-pom.xml</include>
-              </includes>
-            </fileset>
-          </filesets>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-shade-plugin</artifactId>
-        <version>2.1</version>
-        <executions>
-          <execution>
-            <id>shade</id>
-            <goals>
-              <goal>shade</goal>
-            </goals>
-            <configuration>
-              <minimizeJar>true</minimizeJar>
-              <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-              <artifactSet>
-                <includes>
-                  <include>org.apache.commons:commons-lang3</include>
-                  <include>commons-io:commons-io</include>
-                  <include>org.ow2.asm:*</include>
-                </includes>
-              </artifactSet>
-              <relocations>
-                <relocation>
-                  <pattern>org.apache.commons.lang3.</pattern>
-                  <shadedPattern>org.apache.commons.weaver.privilizer._lang3.</shadedPattern>
-                </relocation>
-                <relocation>
-                  <pattern>org.apache.commons.io.</pattern>
-                  <shadedPattern>org.apache.commons.weaver.privilizer._io.</shadedPattern>
-                </relocation>
-                <relocation>
-                  <pattern>org.objectweb.asm.</pattern>
-                  <shadedPattern>org.apache.commons.weaver.privilizer._asm.</shadedPattern>
-                </relocation>
-              </relocations>
-              <filters>
-                <filter>
-                  <artifact>org.apache.commons:commons-lang3</artifact>
-                  <excludes>
-                    <exclude>META-INF/**</exclude>
-                  </excludes>
-                </filter>
-                <filter>
-                  <artifact>commons-io:commons-io</artifact>
-                  <excludes>
-                    <exclude>META-INF/**</exclude>
-                  </excludes>
-                </filter>
-                <filter>
-                  <artifact>org.ow2.asm:*</artifact>
-                  <excludes>
-                    <exclude>META-INF/**</exclude>
-                  </excludes>
-                </filter>
-              </filters>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-pmd-plugin</artifactId>
-        <configuration>
-          <rulesets>
-            <ruleset>/org/apache/commons/weaver/pmd.xml</ruleset>
-          </rulesets>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-checkstyle-plugin</artifactId>
-        <version>${checkstyle.version}</version>
-        <configuration>
-          <configLocation>org/apache/commons/weaver/checkstyle.xml</configLocation>
-          <headerLocation>org/apache/commons/weaver/license-header.txt</headerLocation>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>findbugs-maven-plugin</artifactId>
-        <configuration>
-          <xmlOutput>true</xmlOutput>
-          <excludeFilterFile>/org/apache/commons/weaver/findbugs-exclude-filter.xml</excludeFilterFile>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
-</project>
diff --git a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/AccessLevel.java b/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/AccessLevel.java
deleted file mode 100644
index 28e01af..0000000
--- a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/AccessLevel.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * 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.commons.weaver.privilizer;
-
-import java.lang.reflect.Modifier;
-import java.util.EnumSet;
-import java.util.Locale;
-import java.util.Set;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.Validate;
-
-/**
- * Enumerates the Java access levels.
- */
-public enum AccessLevel {
-    /**
-     * {@code public}.
-     */
-    PUBLIC(Modifier.PUBLIC),
-
-    /**
-     * {@code protected}.
-     */
-    PROTECTED(Modifier.PROTECTED),
-
-    /**
-     * {@code ""}.
-     */
-    PACKAGE(0),
-
-    /**
-     * {@code private}.
-     */
-    PRIVATE(Modifier.PRIVATE);
-
-    private final int flag;
-
-    private AccessLevel(final int flag) {
-        this.flag = flag;
-    }
-
-    /**
-     * Get the {@link AccessLevel} specified by a Java modifier.
-     * @param mod from which to extract
-     * @return {@link AccessLevel}
-     * @throws IllegalArgumentException if multiple access modifiers specified
-     */
-    public static AccessLevel of(final int mod) {
-        final Set<AccessLevel> matched = EnumSet.noneOf(AccessLevel.class);
-        if (Modifier.isPublic(mod)) {
-            matched.add(PUBLIC);
-        }
-        if (Modifier.isProtected(mod)) {
-            matched.add(PROTECTED);
-        }
-        if (Modifier.isPrivate(mod)) {
-            matched.add(PRIVATE);
-        }
-        if (matched.isEmpty()) {
-            return PACKAGE;
-        }
-        Validate.isTrue(matched.size() == 1, "%s seems to declare multiple access modifiers: %s", mod, matched);
-        return matched.iterator().next();
-    }
-
-    /**
-     * Overlay this {@link AccessLevel} onto a Java modifier value.
-     * @param mod input
-     * @return {@code mod}, with this {@link AccessLevel}
-     */
-    public int merge(final int mod) {
-        int remove = 0;
-        for (final AccessLevel accessLevel : EnumSet.complementOf(EnumSet.of(this))) {
-            remove |= accessLevel.flag;
-        }
-        return mod & ~remove | flag;
-    }
-
-    /**
-     * Render this {@link AccessLevel} as a {@link String}.
-     * @return {@link String}
-     */
-    @Override
-    public String toString() {
-        return name().toLowerCase(Locale.US);
-    }
-
-    /**
-     * Get the {@link AccessLevel} value that should be used as a default.
-     * This is <em>not</em> "default"/{@code package} access, but rather the default
-     * value that should be used for privilizer weaving.
-     * @return {@link AccessLevel#PRIVATE}
-     */
-    public static AccessLevel defaultValue() {
-        return AccessLevel.PRIVATE;
-    }
-
-    /**
-     * Parse from a {@link String} returning {@link #defaultValue()} for blank/null input.
-     * @param str to parse
-     * @return {@link AccessLevel}
-     */
-    public static AccessLevel parse(final String str) {
-        if (StringUtils.isBlank(str)) {
-            return defaultValue();
-        }
-        return valueOf(str.trim().toUpperCase(Locale.US));
-    }
-}
diff --git a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/ActionGenerator.java b/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/ActionGenerator.java
deleted file mode 100644
index 710bd0f..0000000
--- a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/ActionGenerator.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * 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.commons.weaver.privilizer;
-
-import java.lang.reflect.Modifier;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedExceptionAction;
-import java.util.Map;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.lang3.builder.Builder;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.commons.GeneratorAdapter;
-import org.objectweb.asm.commons.Method;
-import org.objectweb.asm.signature.SignatureReader;
-import org.objectweb.asm.signature.SignatureVisitor;
-import org.objectweb.asm.signature.SignatureWriter;
-
-/**
- * Generates the Privileged[Exception?]Action class to privilize a given Method.
- */
-class ActionGenerator extends Privilizer.WriteClass implements Builder<Type> {
-    final PrivilizingVisitor owner;
-    final Method methd;
-    final boolean exc;
-    final Type[] exceptions;
-    final String simpleName;
-    final Type action;
-    final Method impl;
-    final int index;
-    final boolean implIsStatic;
-    final Method helper;
-    final Type result;
-    final Field[] fields;
-    private final Type actionInterface;
-
-    /**
-     * Create a new {@link ActionGenerator}.
-     * @param access modifier
-     * @param methd {@link Method} to implement
-     * @param exceptions thrown
-     * @param owner of the action class
-     */
-    ActionGenerator(final int access, final Method methd, final String[] exceptions, final PrivilizingVisitor owner) {
-        owner.privilizer().super(new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES));
-        this.methd = methd;
-        this.exc = ArrayUtils.isNotEmpty(exceptions);
-        this.exceptions = exc ? new Type[] { Type.getType(Exception.class) } : null;
-        this.owner = owner;
-        this.simpleName = generateName(methd);
-        this.action = Type.getObjectType(owner.className + '$' + simpleName);
-
-        int privilegedAccessIndex = -1;
-        String implName = null;
-        for (final Map.Entry<Method, String> entry : owner.privilegedMethods.entrySet()) {
-            privilegedAccessIndex++;
-            if (entry.getKey().equals(methd)) {
-                implName = entry.getValue();
-                break;
-            }
-        }
-        Validate.validState(implName != null);
-
-        this.index = privilegedAccessIndex;
-
-        this.impl = new Method(implName, methd.getDescriptor());
-        this.implIsStatic = Modifier.isStatic(access);
-        final Type[] args =
-            implIsStatic ? methd.getArgumentTypes() : ArrayUtils.add(methd.getArgumentTypes(), 0, owner.target);
-        this.helper = new Method(privilizer().generateName("access$" + index), methd.getReturnType(), args);
-        this.result = privilizer().wrap(methd.getReturnType());
-        this.fields = fields(args);
-        this.actionInterface = Type.getType(exc ? PrivilegedExceptionAction.class : PrivilegedAction.class);
-    }
-
-    private static String generateName(final Method methd) {
-        final StringBuilder buf = new StringBuilder(methd.getName());
-        if (methd.getArgumentTypes().length > 0) {
-            buf.append("$$");
-            for (final Type arg : methd.getArgumentTypes()) {
-                buf.append(arg.getDescriptor().replace("[", "arrayOf").replace('/', '_').replace(';', '$'));
-            }
-        }
-        return buf.append("_ACTION").toString();
-    }
-
-    private static Field[] fields(final Type[] args) {
-        final Field[] result = new Field[args.length];
-
-        for (int i = 0; i < args.length; i++) {
-            final String name = new StringBuilder("f").append(i + 1).toString();
-            result[i] = new Field(Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL, name, args[i]);
-        }
-        return result;
-    }
-
-    @Override
-    public Type build() {
-        generateHelper();
-        begin();
-        init();
-        impl();
-        visitEnd();
-        owner.privilizer().env.debug("Generated %s implementation %s to call %s#%s", actionInterface.getClassName(),
-            action.getClassName(), owner.target.getClassName(), helper);
-        return action;
-    }
-
-    /**
-     * We must add special methods for inner classes to invoke their owners' methods, according to the scheme "access$n"
-     * where n is the index into this (ordered) map. Additionally we will prefix the whole thing like we usually do
-     * (__privileged_):
-     */
-    private void generateHelper() {
-        owner.privilizer().env.debug("Generating static helper method %s.%s to call %s", owner.target.getClassName(),
-            helper, impl);
-        final GeneratorAdapter mgen =
-            new GeneratorAdapter(Opcodes.ACC_STATIC | Opcodes.ACC_SYNTHETIC, helper, null, exceptions, owner);
-
-        mgen.visitCode();
-        mgen.loadArgs();
-        if (implIsStatic) {
-            mgen.invokeStatic(owner.target, impl);
-        } else {
-            mgen.invokeVirtual(owner.target, impl);
-        }
-        mgen.returnValue();
-        mgen.endMethod();
-    }
-
-    private void begin() {
-        owner.visitInnerClass(action.getInternalName(), owner.className, simpleName, Opcodes.ACC_PRIVATE
-            | Opcodes.ACC_STATIC);
-
-        final SignatureWriter type = new SignatureWriter();
-        final SignatureVisitor actionImplemented = type.visitInterface();
-        actionImplemented.visitClassType(actionInterface.getInternalName());
-        final SignatureVisitor visitTypeArgument = actionImplemented.visitTypeArgument('=');
-        final SignatureReader result = new SignatureReader(privilizer().wrap(methd.getReturnType()).getDescriptor());
-        result.accept(visitTypeArgument);
-        actionImplemented.visitEnd();
-
-        final String signature = type.toString();
-
-        visit(Opcodes.V1_5, Opcodes.ACC_SUPER | Opcodes.ACC_SYNTHETIC | Opcodes.ACC_FINAL, action.getInternalName(),
-            signature, Type.getType(Object.class).getInternalName(),
-            new String[] { actionInterface.getInternalName() });
-    }
-
-    /**
-     * Add fields and generate constructor.
-     */
-    private void init() {
-        for (final Field field : fields) {
-            visitField(field.access, field.name, field.type.getDescriptor(), null, null).visitEnd();
-        }
-        final Method init = new Method("<init>", Type.VOID_TYPE, helper.getArgumentTypes());
-
-        final GeneratorAdapter mgen =
-            new GeneratorAdapter(0, init, null, Privilizer.EMPTY_TYPE_ARRAY, this);
-
-        mgen.visitCode();
-        final Label begin = mgen.mark();
-
-        // invoke super constructor
-        mgen.loadThis();
-        mgen.invokeConstructor(Type.getType(Object.class), Method.getMethod("void <init> ()"));
-        // assign remaining fields
-
-        int arg = 0;
-        for (final Field field : fields) {
-            mgen.loadThis();
-            mgen.loadArg(arg++);
-            mgen.putField(action, field.name, field.type);
-        }
-
-        mgen.returnValue();
-        final Label end = mgen.mark();
-
-        // declare local vars
-        mgen.visitLocalVariable("this", action.getDescriptor(), null, begin, end, 0);
-        arg = 1;
-        for (final Field field : fields) {
-            mgen.visitLocalVariable("arg" + arg, field.type.getDescriptor(), null, begin, end, arg++);
-        }
-        mgen.endMethod();
-    }
-
-    /**
-     * Generate impl method.
-     */
-    private void impl() {
-        final Method run = Method.getMethod("Object run()");
-
-        final GeneratorAdapter mgen = new GeneratorAdapter(Opcodes.ACC_PUBLIC, run, null, exceptions, this);
-
-        for (final Field field : fields) {
-            mgen.loadThis();
-            mgen.getField(action, field.name, field.type);
-        }
-
-        mgen.invokeStatic(owner.target, helper);
-
-        if (methd.getReturnType().getSort() < Type.ARRAY) {
-            mgen.valueOf(methd.getReturnType());
-        }
-
-        mgen.returnValue();
-
-        mgen.endMethod();
-    }
-
-}
diff --git a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/BlueprintingVisitor.java b/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/BlueprintingVisitor.java
deleted file mode 100644
index 6311709..0000000
--- a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/BlueprintingVisitor.java
+++ /dev/null
@@ -1,494 +0,0 @@
-/*
- * 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.commons.weaver.privilizer;
-
-import java.io.InputStream;
-import java.lang.reflect.Modifier;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.BitSet;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.lang3.mutable.MutableObject;
-import org.apache.commons.lang3.tuple.Pair;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.commons.AdviceAdapter;
-import org.objectweb.asm.commons.GeneratorAdapter;
-import org.objectweb.asm.commons.Method;
-import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.tree.MethodNode;
-
-/**
- * {@link ClassVisitor} to import so-called "blueprint methods".
- */
-class BlueprintingVisitor extends Privilizer.PrivilizerClassVisitor {
-
-    private final Set<Type> blueprintTypes = new HashSet<Type>();
-    private final Map<Pair<Type, Method>, MethodNode> blueprintRegistry = new HashMap<Pair<Type, Method>, MethodNode>();
-
-    private final Map<Pair<Type, Method>, String> importedMethods = new HashMap<Pair<Type, Method>, String>();
-
-    private final Map<Type, Map<Method, MethodNode>> methodCache = new HashMap<Type, Map<Method, MethodNode>>();
-    private final Map<Pair<Type, String>, FieldAccess> fieldAccessMap = new HashMap<Pair<Type, String>, FieldAccess>();
-
-    private final ClassVisitor next;
-
-    /**
-     * Create a new {@link BlueprintingVisitor}.
-     * @param privilizer owner
-     * @param cv wrapped
-     * @param config annotation
-     */
-    BlueprintingVisitor(final Privilizer privilizer,
-        final ClassVisitor cv, //NOPMD
-        final Privilizing config) {
-        privilizer.super(new ClassNode(Opcodes.ASM4));
-        this.next = cv;
-
-        // load up blueprint methods:
-        for (final Privilizing.CallTo callTo : config.value()) {
-            final Type blueprintType = Type.getType(callTo.value());
-            blueprintTypes.add(blueprintType);
-            for (final Map.Entry<Method, MethodNode> entry : getMethods(blueprintType).entrySet()) {
-                boolean found = false;
-                if (callTo.methods().length == 0) {
-                    found = true;
-                } else {
-                    for (final String name : callTo.methods()) {
-                        if (entry.getKey().getName().equals(name)) {
-                            found = true;
-                            break;
-                        }
-                    }
-                }
-                if (found) {
-                    blueprintRegistry.put(Pair.of(blueprintType, entry.getKey()), entry.getValue());
-                }
-            }
-        }
-    }
-
-    private Map<Method, MethodNode> getMethods(final Type type) {
-        if (methodCache.containsKey(type)) {
-            return methodCache.get(type);
-        }
-        final ClassNode classNode = read(type.getClassName());
-        final Map<Method, MethodNode> result = new HashMap<Method, MethodNode>();
-
-        @SuppressWarnings("unchecked")
-        final List<MethodNode> methods = classNode.methods;
-
-        for (final MethodNode methodNode : methods) {
-            if (Modifier.isStatic(methodNode.access) && !"<clinit>".equals(methodNode.name)) {
-                result.put(new Method(methodNode.name, methodNode.desc), methodNode);
-            }
-        }
-        methodCache.put(type, result);
-        return result;
-    }
-
-    private ClassNode read(final String className) {
-        final ClassNode result = new ClassNode(Opcodes.ASM4);
-        InputStream bytecode = null;
-        try {
-            bytecode = privilizer().env.getClassfile(className).getInputStream();
-            new ClassReader(bytecode).accept(result, ClassReader.SKIP_DEBUG | ClassReader.EXPAND_FRAMES);
-        } catch (final Exception e) {
-            throw new RuntimeException(e);
-        } finally {
-            IOUtils.closeQuietly(bytecode);
-        }
-        return result;
-    }
-
-    @Override
-    public void visit(final int version, final int access, final String name, final String signature,
-        final String superName, final String[] interfaces) {
-        Validate.isTrue(!blueprintTypes.contains(Type.getObjectType(name)),
-            "Class %s cannot declare itself as a blueprint!", name);
-        super.visit(version, access, name, signature, superName, interfaces);
-    }
-
-    @Override
-    public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature,
-        final String[] exceptions) {
-        final MethodVisitor toWrap = super.visitMethod(access, name, desc, signature, exceptions);
-        return new MethodInvocationHandler(toWrap) {
-            @Override
-            boolean shouldImport(final Pair<Type, Method> methodKey) {
-                return blueprintRegistry.containsKey(methodKey);
-            }
-        };
-    }
-
-    private String importMethod(final Pair<Type, Method> key) {
-        if (importedMethods.containsKey(key)) {
-            return importedMethods.get(key);
-        }
-        final String result =
-            new StringBuilder(key.getLeft().getInternalName().replace('/', '_')).append("$$")
-                .append(key.getRight().getName()).toString();
-        importedMethods.put(key, result);
-        privilizer().env.debug("importing %s#%s as %s", key.getLeft().getClassName(), key.getRight(), result);
-        final int access = Opcodes.ACC_PRIVATE + Opcodes.ACC_STATIC + Opcodes.ACC_SYNTHETIC;
-
-        final MethodNode source = getMethods(key.getLeft()).get(key.getRight());
-
-        @SuppressWarnings("unchecked")
-        final String[] exceptions = (String[]) source.exceptions.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
-
-        // non-public fields accessed
-        final Set<FieldAccess> fieldAccesses = new LinkedHashSet<FieldAccess>();
-
-        source.accept(new MethodVisitor(Opcodes.ASM4) {
-            @Override
-            public void visitFieldInsn(final int opcode, final String owner, final String name, final String desc) {
-                final FieldAccess fieldAccess = fieldAccess(Type.getObjectType(owner), name);
-
-                super.visitFieldInsn(opcode, owner, name, desc);
-                if (!Modifier.isPublic(fieldAccess.access)) {
-                    fieldAccesses.add(fieldAccess);
-                }
-            }
-        });
-
-        final MethodNode withAccessibleAdvice =
-            new MethodNode(access, result, source.desc, source.signature, exceptions);
-
-        // spider own methods:
-        MethodVisitor mv = new NestedMethodInvocationHandler(withAccessibleAdvice, key.getLeft()); //NOPMD
-
-        if (!fieldAccesses.isEmpty()) {
-            // accessesNonPublicFields = true;
-            mv = new AccessibleAdvisor(mv, access, result, source.desc, new ArrayList<FieldAccess>(fieldAccesses));
-        }
-
-        source.accept(mv);
-
-        // private can only be called by other privileged methods, so no need to mark as privileged
-        if (!Modifier.isPrivate(source.access)) {
-            withAccessibleAdvice.visitAnnotation(Type.getType(Privileged.class).getDescriptor(), false).visitEnd();
-        }
-
-        withAccessibleAdvice.accept(this.cv);
-
-        return result;
-    }
-
-    private FieldAccess fieldAccess(final Type owner, final String name) {
-        final Pair<Type, String> key = Pair.of(owner, name);
-        if (!fieldAccessMap.containsKey(key)) {
-            try {
-                final MutableObject<Type> next = new MutableObject<Type>(owner);
-                final Deque<Type> stk = new ArrayDeque<Type>();
-                while (next.getValue() != null) {
-                    stk.push(next.getValue());
-                    InputStream bytecode = null;
-                    try {
-                        bytecode = privilizer().env.getClassfile(next.getValue().getInternalName()).getInputStream();
-                        new ClassReader(bytecode).accept(privilizer().new PrivilizerClassVisitor() {
-                            @Override
-                            public void visit(final int version, final int access, final String name,
-                                final String signature, final String superName, final String[] interfaces) {
-                                super.visit(version, access, name, signature, superName, interfaces);
-                                next.setValue(Type.getObjectType(superName));
-                            }
-
-                            @Override
-                            public FieldVisitor visitField(final int access, final String name, final String desc,
-                                final String signature, final Object value) {
-                                for (final Type type : stk) {
-                                    final Pair<Type, String> key = Pair.of(type, name);
-                                    // skip shadowed fields:
-                                    if (!fieldAccessMap.containsKey(key)) {
-                                        fieldAccessMap.put(key,
-                                            new FieldAccess(access, target, name, Type.getType(desc)));
-                                    }
-                                }
-                                return null;
-                            }
-                        }, ClassReader.SKIP_CODE);
-                    } finally {
-                        IOUtils.closeQuietly(bytecode);
-                    }
-                    if (fieldAccessMap.containsKey(key)) {
-                        break;
-                    }
-                }
-            } catch (final Exception e) {
-                throw new RuntimeException(e);
-            }
-            Validate.isTrue(fieldAccessMap.containsKey(key), "Could not locate %s.%s", owner.getClassName(), name);
-        }
-        return fieldAccessMap.get(key);
-    }
-
-    @Override
-    public void visitEnd() {
-        super.visitEnd();
-        ((ClassNode) cv).accept(next);
-    }
-
-    private abstract class MethodInvocationHandler extends MethodVisitor {
-        MethodInvocationHandler(final MethodVisitor mvr) {
-            super(Opcodes.ASM4, mvr);
-        }
-
-        @Override
-        public void visitMethodInsn(final int opcode, final String owner, final String name, final String desc) {
-            if (opcode == Opcodes.INVOKESTATIC) {
-                final Method methd = new Method(name, desc);
-                final Pair<Type, Method> methodKey = Pair.of(Type.getObjectType(owner), methd);
-                if (shouldImport(methodKey)) {
-                    final String importedName = importMethod(methodKey);
-                    super.visitMethodInsn(opcode, className, importedName, desc);
-                    return;
-                }
-            }
-            super.visitMethodInsn(opcode, owner, name, desc);
-        }
-
-        abstract boolean shouldImport(Pair<Type, Method> methodKey);
-    }
-
-    class NestedMethodInvocationHandler extends MethodInvocationHandler {
-        final Type owner;
-
-        NestedMethodInvocationHandler(final MethodVisitor mvr, final Type owner) {
-            super(mvr);
-            this.owner = owner;
-        }
-
-        @Override
-        boolean shouldImport(final Pair<Type, Method> methodKey) {
-            // call anything called within a class hierarchy:
-            final Type called = methodKey.getLeft();
-            // "I prefer the short cut":
-            if (called.equals(owner)) {
-                return true;
-            }
-            try {
-                final Class<?> inner = load(called);
-                final Class<?> outer = load(owner);
-                return inner.isAssignableFrom(outer);
-            } catch (final ClassNotFoundException e) {
-                return false;
-            }
-        }
-
-        private Class<?> load(final Type type) throws ClassNotFoundException {
-            return privilizer().env.classLoader.loadClass(type.getClassName());
-        }
-    }
-
-    /**
-     * For every non-public referenced field of an imported method, replaces with reflective calls. Additionally, for
-     * every such field that is not accessible, sets the field's accessibility and clears it as the method exits.
-     */
-    private class AccessibleAdvisor extends AdviceAdapter {
-        final Type bitSetType = Type.getType(BitSet.class);
-        final Type classType = Type.getType(Class.class);
-        final Type fieldType = Type.getType(java.lang.reflect.Field.class);
-        final Type fieldArrayType = Type.getType(java.lang.reflect.Field[].class);
-        final Type stringType = Type.getType(String.class);
-
-        final List<FieldAccess> fieldAccesses;
-        final Label begin = new Label();
-        int localFieldArray;
-        int bitSet;
-        int fieldCounter;
-
-        AccessibleAdvisor(final MethodVisitor mvr, final int access, final String name, final String desc,
-            final List<FieldAccess> fieldAccesses) {
-            super(ASM4, mvr, access, name, desc);
-            this.fieldAccesses = fieldAccesses;
-        }
-
-        @Override
-        protected void onMethodEnter() {
-            localFieldArray = newLocal(fieldArrayType);
-            bitSet = newLocal(bitSetType);
-            fieldCounter = newLocal(Type.INT_TYPE);
-
-            // create localFieldArray
-            push(fieldAccesses.size());
-            newArray(fieldArrayType.getElementType());
-            storeLocal(localFieldArray);
-
-            // create bitSet
-            newInstance(bitSetType);
-            dup();
-            push(fieldAccesses.size());
-            invokeConstructor(bitSetType, Method.getMethod("void <init>(int)"));
-            storeLocal(bitSet);
-
-            // populate localFieldArray
-            push(0);
-            storeLocal(fieldCounter);
-            for (final FieldAccess access : fieldAccesses) {
-                prehandle(access);
-                iinc(fieldCounter, 1);
-            }
-            mark(begin);
-        }
-
-        private void prehandle(final FieldAccess access) {
-            // push owner.class literal
-            visitLdcInsn(access.owner);
-            push(access.name);
-            final Label next = new Label();
-            invokeVirtual(classType, new Method("getDeclaredField", fieldType, new Type[] { stringType }));
-
-            dup();
-            // store the field at localFieldArray[fieldCounter]:
-            loadLocal(localFieldArray);
-            swap();
-            loadLocal(fieldCounter);
-            swap();
-            arrayStore(fieldArrayType.getElementType());
-
-            dup();
-            invokeVirtual(fieldArrayType.getElementType(), Method.getMethod("boolean isAccessible()"));
-
-            final Label setAccessible = new Label();
-            // if false, setAccessible:
-            ifZCmp(EQ, setAccessible);
-
-            // else pop field instance
-            pop();
-            // and record that he was already accessible:
-            loadLocal(bitSet);
-            loadLocal(fieldCounter);
-            invokeVirtual(bitSetType, Method.getMethod("void set(int)"));
-            goTo(next);
-
-            mark(setAccessible);
-            push(true);
-            invokeVirtual(fieldArrayType.getElementType(), Method.getMethod("void setAccessible(boolean)"));
-
-            mark(next);
-        }
-
-        @Override
-        public void visitFieldInsn(final int opcode, final String owner, final String name, final String desc) {
-            final Pair<Type, String> key = Pair.of(Type.getObjectType(owner), name);
-            final FieldAccess fieldAccess = fieldAccessMap.get(key);
-            Validate.isTrue(fieldAccesses.contains(fieldAccess), "Cannot find field %s", key);
-            final int fieldIndex = fieldAccesses.indexOf(fieldAccess);
-            visitInsn(NOP);
-            loadLocal(localFieldArray);
-            push(fieldIndex);
-            arrayLoad(fieldArrayType.getElementType());
-            checkCast(fieldType);
-
-            final Method access;
-            if (opcode == PUTSTATIC) {
-                // value should have been at top of stack on entry; position the field under the value:
-                swap();
-                // add null object for static field deref and swap under value:
-                push((String) null);
-                swap();
-                if (fieldAccess.type.getSort() < Type.ARRAY) {
-                    // box value:
-                    valueOf(fieldAccess.type);
-                }
-                access = Method.getMethod("void set(Object, Object)");
-            } else {
-                access = Method.getMethod("Object get(Object)");
-                // add null object for static field deref:
-                push((String) null);
-            }
-
-            invokeVirtual(fieldType, access);
-
-            if (opcode == GETSTATIC) {
-                checkCast(privilizer().wrap(fieldAccess.type));
-                if (fieldAccess.type.getSort() < Type.ARRAY) {
-                    unbox(fieldAccess.type);
-                }
-            }
-        }
-
-        @Override
-        public void visitMaxs(final int maxStack, final int maxLocals) {
-            // put try-finally around the whole method
-            final Label fny = mark();
-            // null exception type signifies finally block:
-            final Type exceptionType = null;
-            catchException(begin, fny, exceptionType);
-            onFinally();
-            throwException();
-            super.visitMaxs(maxStack, maxLocals);
-        }
-
-        @Override
-        protected void onMethodExit(final int opcode) {
-            if (opcode != ATHROW) {
-                onFinally();
-            }
-        }
-
-        private void onFinally() {
-            // loop over fields and return any non-null element to being inaccessible:
-            push(0);
-            storeLocal(fieldCounter);
-
-            final Label test = mark();
-            final Label increment = new Label();
-            final Label endFinally = new Label();
-
-            loadLocal(fieldCounter);
-            push(fieldAccesses.size());
-            ifCmp(Type.INT_TYPE, GeneratorAdapter.GE, endFinally);
-
-            loadLocal(bitSet);
-            loadLocal(fieldCounter);
-            invokeVirtual(bitSetType, Method.getMethod("boolean get(int)"));
-
-            // if true, increment:
-            ifZCmp(NE, increment);
-
-            loadLocal(localFieldArray);
-            loadLocal(fieldCounter);
-            arrayLoad(fieldArrayType.getElementType());
-            push(false);
-            invokeVirtual(fieldArrayType.getElementType(), Method.getMethod("void setAccessible(boolean)"));
-
-            mark(increment);
-            iinc(fieldCounter, 1);
-            goTo(test);
-            mark(endFinally);
-        }
-    }
-}
diff --git a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Field.java b/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Field.java
deleted file mode 100644
index afa5915..0000000
--- a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Field.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * 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.commons.weaver.privilizer;
-
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.Validate;
-import org.objectweb.asm.Type;
-
-/**
- * Represents a Java field.
- */
-public class Field {
-    /**
-     * Access modifier.
-     */
-    public final int access;
-
-    /**
-     * Field name.
-     */
-    public final String name;
-
-    /**
-     * Field type.
-     */
-    public final Type type;
-
-    /**
-     * Create a new {@link Field}.
-     * @param access modifier
-     * @param name of field
-     * @param type of field
-     */
-    public Field(final int access, final String name, final Type type) {
-        super();
-        this.access = access;
-        this.name = Validate.notNull(name);
-        this.type = Validate.notNull(type);
-    }
-
-    /**
-     * Considers name and type.
-     * @param obj to check for equality
-     * @return whether equal
-     */
-    @SuppressWarnings("deprecation")
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj == this) {
-            return true;
-        }
-        if (!(obj instanceof Field)) {
-            return false;
-        }
-        final Field other = (Field) obj;
-        return StringUtils.equals(other.name, name) && ObjectUtils.equals(other.type, type);
-    }
-
-    /**
-     * Considers name and type.
-     * @return hashCode
-     */
-    @Override
-    public int hashCode() {
-        int result = 57 << 2;
-        result |= name.hashCode();
-        result <<= 4;
-        result |= type.hashCode();
-        return result;
-    }
-}
diff --git a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/FieldAccess.java b/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/FieldAccess.java
deleted file mode 100644
index ba5554c..0000000
--- a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/FieldAccess.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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.commons.weaver.privilizer;
-
-import org.objectweb.asm.Type;
-
-/**
- * Models the action of accessing a field by extending {@link Field} with an
- * accessing type.
- */
-public class FieldAccess extends Field {
-    /**
-     * {@link Type} from which field is accessed.
-     */
-    public final Type owner;
-
-    /**
-     * Create a new {@link FieldAccess}.
-     * @param access operation
-     * @param owner {@link Type} from which field is accessed.
-     * @param name of field
-     * @param type of field
-     */
-    public FieldAccess(final int access, final Type owner, final String name, final Type type) {
-        super(access, name, type);
-        this.owner = owner;
-    }
-
-    /**
-     * Compare against {@code obj} for equality.
-     * @param obj to compare
-     * @return whether Objects are equal
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj == this) {
-            return true;
-        }
-        if (!(obj instanceof FieldAccess)) {
-            return false;
-        }
-        return super.equals(obj) && ((FieldAccess) obj).owner.equals(owner);
-    }
-
-    /**
-     * Generate a hashCode.
-     * @return int
-     */
-    @Override
-    public int hashCode() {
-        final int result = super.hashCode() << 4;
-        return result | owner.hashCode();
-    }
-
-}
diff --git a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/InlineNestedPrivilegedCalls.java b/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/InlineNestedPrivilegedCalls.java
deleted file mode 100644
index f462e22..0000000
--- a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/InlineNestedPrivilegedCalls.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * 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.commons.weaver.privilizer;
-
-import java.util.Map;
-
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.commons.Method;
-import org.objectweb.asm.tree.ClassNode;
-
-/**
- * For any privileged method called from another privileged method (actually the internal implementation method copied
- * from the original method body) the call is replaced by a call to the target's internal implementation method, thus
- * avoiding nested privileged invocations when possible. Persists everything to a tree model until the parent is
- * complete; allowing us to use a tree model while yet building the high-level view as a stack of visitors.
- */
-class InlineNestedPrivilegedCalls extends ClassNode {
-    private final Privilizer privilizer;
-
-    private final ClassVisitor next;
-
-    /**
-     * Map of original method to name of internal implementation method.
-     */
-    private final Map<Method, String> privilegedMethods;
-
-    /**
-     * Create a new {@link InlineNestedPrivilegedCalls} object.
-     * @param privilizer owner
-     * @param privilegedMethods map of original method to name of internal implementation method
-     * @param next visitor
-     */
-    InlineNestedPrivilegedCalls(final Privilizer privilizer, final Map<Method, String> privilegedMethods,
-        final ClassVisitor next) {
-        super(Opcodes.ASM4);
-        this.privilizer = privilizer;
-        this.privilegedMethods = privilegedMethods;
-        this.next = next;
-    }
-
-    @Override
-    public void visitEnd() {
-        super.visitEnd();
-
-        accept(new ClassVisitor(Opcodes.ASM4, next) {
-            @Override
-            public MethodVisitor visitMethod(final int access, final String name, final String desc,
-                final String signature, final String[] exceptions) {
-                final Method outer = new Method(name, desc);
-                final MethodVisitor orig = super.visitMethod(access, name, desc, signature, exceptions);
-                if (!privilegedMethods.containsValue(name)) {
-                    return orig;
-                }
-                return new MethodVisitor(Opcodes.ASM4, orig) {
-                    @Override
-                    public void visitMethodInsn(final int opcode, final String owner, final String name,
-                        final String desc) {
-                        String useName = name;
-                        if (owner.equals(InlineNestedPrivilegedCalls.this.name)) {
-                            final Method methd = new Method(name, desc);
-                            if (privilegedMethods.containsKey(methd)) {
-                                useName = privilegedMethods.get(methd);
-                                privilizer.env.debug("Inlining call from %s to %s as %s", outer, methd,
-                                    useName);
-                            }
-                        }
-                        super.visitMethodInsn(opcode, owner, useName, desc);
-                    }
-                };
-            }
-        });
-    }
-}
diff --git a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Policy.java b/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Policy.java
deleted file mode 100644
index cef9344..0000000
--- a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Policy.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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.commons.weaver.privilizer;
-
-import java.security.PrivilegedAction;
-import java.util.Locale;
-
-import org.apache.commons.lang3.StringUtils;
-
-/**
- * Weaving policy: when to use {@link PrivilegedAction}s.
- */
-public enum Policy {
-    /**
-     * Disables weaving.
-     */
-    NEVER,
-
-    /**
-     * Weaves such that the check for an active {@link SecurityManager} is done once only.
-     */
-    ON_INIT,
-
-    /**
-     * Weaves such that the check for an active {@link SecurityManager} is done for each {@link Privileged} method
-     * execution.
-     */
-    DYNAMIC,
-
-    /**
-     * Weaves such that {@link Privileged} methods are always executed as such.
-     */
-    ALWAYS;
-
-    /**
-     * Get the {@link Policy} value that should be used as a default.
-     * @return {@link Policy#DYNAMIC}
-     */
-    public static Policy defaultValue() {
-        return DYNAMIC;
-    }
-
-    /**
-     * Parse from a {@link String} returning {@link #defaultValue()} for blank/null input.
-     * @param str to parse
-     * @return {@link Policy}
-     */
-    public static Policy parse(final String str) {
-        if (StringUtils.isBlank(str)) {
-            return defaultValue();
-        }
-        return valueOf(str.trim().toUpperCase(Locale.US));
-    }
-
-    /**
-     * Learn whether this is a conditional {@link Policy}.
-     * @return {@code this == ON_INIT || this == DYNAMIC}
-     */
-    public boolean isConditional() {
-        return this == ON_INIT || this == DYNAMIC;
-    }
-
-}
\ No newline at end of file
diff --git a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Privilized.java b/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Privilized.java
deleted file mode 100644
index 6e1e5cb..0000000
--- a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Privilized.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.commons.weaver.privilizer;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Target;
-
-/**
- * Class-retention annotation to mark privilized classes.
- */
-@Target(ElementType.TYPE)
-public @interface Privilized {
-    /**
-     * Name of {@link Policy} with which privilized weaving was performed.
-     */
-    String value();
-}
\ No newline at end of file
diff --git a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Privilizer.java b/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Privilizer.java
deleted file mode 100644
index 8d732b7..0000000
--- a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Privilizer.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * 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.commons.weaver.privilizer;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.activation.DataSource;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.BooleanUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.weaver.model.WeaveEnvironment;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.util.CheckClassAdapter;
-import org.objectweb.asm.util.TraceClassVisitor;
-
-/**
- * Coordinates privilization activities.
- */
-public class Privilizer {
-    /**
-     * An ASM {@link ClassVisitor} for privilization.
-     */
-    abstract class PrivilizerClassVisitor extends ClassVisitor {
-        String className;
-        Type target;
-
-        protected PrivilizerClassVisitor() {
-            this(null);
-        }
-
-        protected PrivilizerClassVisitor(final ClassVisitor cv) { //NOPMD
-            super(Opcodes.ASM4, cv);
-        }
-
-        protected Privilizer privilizer() {
-            return Privilizer.this;
-        }
-
-        @Override
-        public void visit(final int version, final int access, final String name, final String signature,
-            final String superName, final String[] interfaces) {
-            super.visit(version, access, name, signature, superName, interfaces);
-            className = name;
-            target = Type.getObjectType(name);
-        }
-    }
-
-    /**
-     * Convenient {@link ClassVisitor} layer to write classfiles into the {@link WeaveEnvironment}.
-     */
-    class WriteClass extends PrivilizerClassVisitor {
-        WriteClass(final ClassWriter classWriter) {
-            super(classWriter);
-        }
-
-        @Override
-        public void visitEnd() {
-            super.visitEnd();
-            final byte[] bytecode = ((ClassWriter) cv).toByteArray();
-
-            if (verify) {
-                verify(className, bytecode);
-            }
-
-            final DataSource classfile = env.getClassfile(className);
-            env.debug("Writing class %s to resource %s", className, classfile.getName());
-            OutputStream outputStream = null;
-            try {
-                outputStream = classfile.getOutputStream();
-                IOUtils.write(bytecode, outputStream);
-            } catch (final IOException e) {
-                throw new RuntimeException(e);
-            } finally {
-                IOUtils.closeQuietly(outputStream);
-            }
-        }
-    }
-
-    /**
-     * Privilizer weaver configuration prefix.
-     */
-    public static final String CONFIG_WEAVER = "privilizer.";
-
-    /**
-     * {@link AccessLevel} configuration key.
-     * @see AccessLevel#parse(String)
-     */
-    public static final String CONFIG_ACCESS_LEVEL = CONFIG_WEAVER + "accessLevel";
-
-    /**
-     * Weave {@link Policy} configuration key.
-     * @see Policy#parse(String)
-     */
-    public static final String CONFIG_POLICY = CONFIG_WEAVER + "policy";
-
-    /**
-     * Verification configuration key.
-     * @see BooleanUtils#toBoolean(String)
-     */
-    public static final String CONFIG_VERIFY = CONFIG_WEAVER + "verify";
-
-    private static final String GENERATE_NAME = "__privileged_%s";
-
-    static final Type[] EMPTY_TYPE_ARRAY = new Type[0];
-
-    final WeaveEnvironment env;
-    final AccessLevel accessLevel;
-    final Policy policy;
-    final boolean verify;
-
-    /**
-     * Create a new {@link Privilizer}.
-     * @param env to use
-     */
-    public Privilizer(final WeaveEnvironment env) {
-        super();
-        this.env = env;
-        this.policy = Policy.parse(env.config.getProperty(CONFIG_POLICY));
-        this.accessLevel = AccessLevel.parse(env.config.getProperty(CONFIG_ACCESS_LEVEL));
-        verify = BooleanUtils.toBoolean(env.config.getProperty(CONFIG_VERIFY));
-    }
-
-    String generateName(final String simple) {
-        return String.format(GENERATE_NAME, simple);
-    }
-
-    Type wrap(final Type type) {
-        switch (type.getSort()) {
-        case Type.BOOLEAN:
-            return Type.getType(Boolean.class);
-        case Type.BYTE:
-            return Type.getType(Byte.class);
-        case Type.SHORT:
-            return Type.getType(Short.class);
-        case Type.INT:
-            return Type.getType(Integer.class);
-        case Type.CHAR:
-            return Type.getType(Character.class);
-        case Type.LONG:
-            return Type.getType(Long.class);
-        case Type.FLOAT:
-            return Type.getType(Float.class);
-        case Type.DOUBLE:
-            return Type.getType(Double.class);
-        case Type.VOID:
-            return Type.getType(Void.class);
-        default:
-            return type;
-        }
-    }
-
-    void blueprint(final Class<?> type, final Privilizing privilizing) {
-        final Object[] args = { type.getName(), privilizing };
-        env.debug("blueprinting class %s %s", args);
-        InputStream bytecode = null;
-        try {
-            bytecode = env.getClassfile(type).getInputStream();
-            final ClassReader classReader = new ClassReader(bytecode);
-
-            ClassVisitor cvr;
-            cvr = new WriteClass(new ClassWriter(classReader, ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS));
-            cvr = new PrivilizingVisitor(this, cvr);
-            cvr = new BlueprintingVisitor(this, cvr, privilizing);
-
-            classReader.accept(cvr, ClassReader.EXPAND_FRAMES);
-        } catch (final Exception e) {
-            throw new RuntimeException(e);
-        } finally {
-            IOUtils.closeQuietly(bytecode);
-        }
-    }
-
-    void privilize(final Class<?> type) {
-        final Object[] args = { type.getName() };
-        env.debug("privilizing class %s", args);
-        InputStream bytecode = null;
-        try {
-            bytecode = env.getClassfile(type).getInputStream();
-            final ClassReader classReader = new ClassReader(bytecode);
-            ClassVisitor cv; //NOPMD
-            cv = new WriteClass(new ClassWriter(classReader, ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS));
-            cv = new PrivilizingVisitor(this, cv);
-
-            classReader.accept(cv, ClassReader.EXPAND_FRAMES);
-        } catch (final Exception e) {
-            throw new RuntimeException(e);
-        } finally {
-            IOUtils.closeQuietly(bytecode);
-        }
-    }
-
-    void verify(final String className, final byte[] bytecode) {
-        final ClassReader reader = new ClassReader(bytecode);
-
-        env.debug("Verifying bytecode for class %s", className);
-        final StringWriter w = new StringWriter(); //NOPMD
-        CheckClassAdapter.verify(reader, env.classLoader, false, new PrintWriter(w));
-        final String error = w.toString();
-        if (!error.isEmpty()) {
-            env.error(error);
-            final StringWriter trace = new StringWriter();
-            reader.accept(new TraceClassVisitor(new PrintWriter(trace)), ClassReader.SKIP_DEBUG);
-            env.debug(trace.toString());
-            throw new IllegalStateException();
-        }
-        Validate.validState(StringUtils.isBlank(error), error);
-
-        final ClassVisitor checkInnerClasses = new ClassVisitor(Opcodes.ASM4, null) {
-            final Set<String> innerNames = new HashSet<String>();
-
-            @Override
-            public void visitInnerClass(final String name, final String outerName, final String innerName,
-                final int access) {
-                super.visitInnerClass(name, outerName, innerName, access);
-                Validate.validState(innerNames.add(innerName), "%s already defined", innerName);
-            }
-        };
-        reader.accept(checkInnerClasses, ClassReader.SKIP_CODE);
-    }
-}
diff --git a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerCleaner.java b/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerCleaner.java
deleted file mode 100644
index e9578f1..0000000
--- a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerCleaner.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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.commons.weaver.privilizer;
-
-import java.io.InputStream;
-import java.lang.annotation.ElementType;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.weaver.model.ScanRequest;
-import org.apache.commons.weaver.model.Scanner;
-import org.apache.commons.weaver.model.WeavableClass;
-import org.apache.commons.weaver.model.WeaveEnvironment;
-import org.apache.commons.weaver.model.WeaveInterest;
-import org.apache.commons.weaver.spi.Cleaner;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.Opcodes;
-
-/**
- * Removes classes privilized with a different policy.
- */
-public class PrivilizerCleaner implements Cleaner {
-
-    @Override
-    public boolean clean(final WeaveEnvironment environment, final Scanner scanner) {
-        final Privilizer privilizer = new Privilizer(environment);
-
-        final List<String> toDelete = new ArrayList<String>();
-
-        final ScanRequest scanRequest = new ScanRequest().add(WeaveInterest.of(Privilized.class, ElementType.TYPE));
-
-        environment.debug("Cleaning classes privilized with policy other than %s", privilizer.policy);
-        for (final WeavableClass<?> weavableClass : scanner.scan(scanRequest).getClasses().with(Privilized.class)) {
-            final Policy privilizedPolicy = Policy.valueOf(weavableClass.getAnnotation(Privilized.class).value());
-            if (privilizedPolicy == privilizer.policy) {
-                continue;
-            }
-            final String className = weavableClass.getTarget().getName();
-            environment.debug("Class %s privilized with %s; deleting.", className, privilizedPolicy);
-
-            InputStream bytecode = null;
-            try {
-                bytecode = privilizer.env.getClassfile(className).getInputStream();
-                final ClassReader classReader = new ClassReader(bytecode);
-                classReader.accept(new ClassVisitor(Opcodes.ASM4) {
-                    @Override
-                    public void visit(final int version, final int access, final String name, final String signature,
-                        final String superName, final String[] interfaces) {
-                        toDelete.add(name);
-                    }
-
-                    @Override
-                    public void visitInnerClass(final String name, final String outerName, final String innerName,
-                        final int access) {
-                        if (toDelete.contains(outerName)) {
-                            toDelete.add(name);
-                        }
-                    }
-                }, ClassReader.SKIP_CODE + ClassReader.SKIP_DEBUG + ClassReader.SKIP_FRAMES);
-            } catch (final Exception e) {
-                throw new RuntimeException(e);
-            } finally {
-                IOUtils.closeQuietly(bytecode);
-            }
-        }
-        boolean result = false;
-        for (final String className : toDelete) {
-            final String resourcePath = toResourcePath(className);
-            final boolean success = environment.deleteResource(resourcePath);
-            environment.debug("Deletion of resource %s was %ssuccessful.", resourcePath, success ? "" : "un");
-            result |= success;
-        }
-        return result;
-    }
-
-    private static String toResourcePath(final String className) {
-        return className.replace('.', '/') + ".class";
-    }
-
-}
diff --git a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerWeaver.java b/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerWeaver.java
deleted file mode 100644
index e7e7149..0000000
--- a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerWeaver.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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.commons.weaver.privilizer;
-
-import java.lang.annotation.ElementType;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.weaver.model.ScanRequest;
-import org.apache.commons.weaver.model.Scanner;
-import org.apache.commons.weaver.model.WeavableClass;
-import org.apache.commons.weaver.model.WeaveEnvironment;
-import org.apache.commons.weaver.model.WeaveInterest;
-import org.apache.commons.weaver.spi.Weaver;
-
-/**
- * Privilizer {@link Weaver} implementation.
- */
-public class PrivilizerWeaver implements Weaver {
-    @Override
-    public boolean process(final WeaveEnvironment weaveEnvironment, final Scanner scanner) {
-        final Privilizer privilizer = new Privilizer(weaveEnvironment);
-
-        final Set<Class<?>> privilizedTypes = new LinkedHashSet<Class<?>>();
-
-        // handle blueprints:
-        for (final WeavableClass<?> type : scanner.scan(
-            new ScanRequest().add(WeaveInterest.of(Privilizing.class, ElementType.TYPE))).getClasses()) {
-
-            final Class<?> target = type.getTarget();
-            if (privilizedTypes.add(target) && validateRequest(privilizer, type)) {
-                privilizer.blueprint(target, type.getAnnotation(Privilizing.class));
-            }
-        }
-
-        // handle remaining classes declaring @Privileged methods:
-
-        for (final WeavableClass<?> type : scanner.scan(
-            new ScanRequest().add(WeaveInterest.of(Privileged.class, ElementType.METHOD))).getClasses()) {
-            final Class<?> target = type.getTarget();
-            if (privilizedTypes.add(target) && validateRequest(privilizer, type)) {
-                privilizer.privilize(target);
-            }
-        }
-        return !privilizedTypes.isEmpty();
-    }
-
-    /**
-     * Validate a weaving request for a given target type.
-     * @param privilizer whose configuration to consult
-     * @param type target
-     * @return whether weaving should proceed
-     * @throws IllegalStateException if class has already been woven with some other policy
-     */
-    private boolean validateRequest(final Privilizer privilizer, final WeavableClass<?> type) {
-        final Privilized marker = type.getAnnotation(Privilized.class);
-        if (marker == null) {
-            return privilizer.policy != Policy.NEVER;
-        }
-        Validate.validState(privilizer.policy.name().equals(marker.value()), "%s already privilized with policy %s",
-            type.getTarget().getName(), marker.value());
-
-        return false;
-    }
-}
diff --git a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizingVisitor.java b/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizingVisitor.java
deleted file mode 100644
index 59887ed..0000000
--- a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizingVisitor.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * 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.commons.weaver.privilizer;
-
-import java.lang.reflect.Modifier;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.commons.GeneratorAdapter;
-import org.objectweb.asm.commons.Method;
-import org.objectweb.asm.commons.StaticInitMerger;
-
-/**
- * ASM {@link ClassVisitor} to privilize {@link Privileged} methods.
- */
-class PrivilizingVisitor extends Privilizer.PrivilizerClassVisitor {
-    final Map<Method, String> privilegedMethods = new LinkedHashMap<Method, String>();
-    boolean annotated;
-    final Policy policy;
-    final AccessLevel accessLevel;
-
-    /**
-     * Create a new {@link PrivilizingVisitor}.
-     * @param privilizer owner
-     * @param cv next
-     */
-    PrivilizingVisitor(final Privilizer privilizer, final ClassVisitor cv) { //NOPMD
-        privilizer.super();
-        this.policy = privilizer.policy;
-        this.accessLevel = privilizer.accessLevel;
-        this.cv =
-            new InlineNestedPrivilegedCalls(privilizer, privilegedMethods, new StaticInitMerger(
-                privilizer.generateName("clinit"), cv));
-    }
-
-    private void annotate() {
-        if (!annotated) {
-            annotated = true;
-            final AnnotationVisitor privilizedVisitor =
-                super.visitAnnotation(Type.getType(Privilized.class).getDescriptor(), false);
-            privilizedVisitor.visit("value", policy.name());
-            privilizedVisitor.visitEnd();
-        }
-    }
-
-    @Override
-    public void visitInnerClass(final String name, final String outerName, final String innerName, final int access) {
-        annotate();
-        super.visitInnerClass(name, outerName, innerName, access);
-    }
-
-    @Override
-    public FieldVisitor visitField(final int access, final String name, final String desc, final String signature,
-        final Object value) {
-        annotate();
-        return super.visitField(access, name, desc, signature, value);
-    }
-
-    @Override
-    public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature,
-        final String[] exceptions) {
-        annotate();
-        final MethodVisitor originalMethod = super.visitMethod(access, name, desc, signature, exceptions);
-        final Method methd = new Method(name, desc);
-
-        return new GeneratorAdapter(Opcodes.ASM4, originalMethod, access, name, desc) {
-
-            @Override
-            public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
-                if (Type.getType(Privileged.class).getDescriptor().equals(desc)) {
-                    final AccessLevel localAccessLevel = AccessLevel.of(access);
-                    if (accessLevel.compareTo(localAccessLevel) > 0) {
-                        throw new RuntimeException(new IllegalAccessException("Method " + className + "#" + methd
-                            + " must have maximum access level '" + accessLevel + "' but is defined wider ('"
-                            + localAccessLevel + "')"));
-                    }
-                    if (AccessLevel.PACKAGE.compareTo(accessLevel) > 0) {
-                        privilizer().env.warn("Possible security leak: granting privileges to %s method %s.%s",
-                            localAccessLevel, className, methd);
-                    }
-                    privilegedMethods.put(methd, privilizer().generateName(name));
-                }
-                return super.visitAnnotation(desc, visible);
-            }
-
-            @Override
-            public void visitCode() {
-                super.visitCode();
-                if (!privilegedMethods.containsKey(methd)) {
-                    return;
-                }
-                final String impl = privilegedMethods.get(methd);
-                final boolean instanceMethod = !Modifier.isStatic(access);
-
-                if (policy.isConditional()) {
-                    privilizer().env.debug("setting up conditional execution due to policy %s", policy);
-                    // test, loading boolean
-                    if (policy == Policy.ON_INIT) {
-                        getStatic(target, privilizer().generateName("hasSecurityManager"), Type.BOOLEAN_TYPE);
-                    } else if (policy == Policy.DYNAMIC) {
-                        checkSecurityManager(this);
-                    }
-                    final Label doPrivileged = new Label();
-
-                    // if true, goto doPrivileged:
-                    ifZCmp(NE, doPrivileged);
-
-                    final Method implMethod = new Method(impl, desc);
-                    if (instanceMethod) {
-                        loadThis();
-                        loadArgs();
-                        invokeVirtual(target, implMethod);
-                    } else {
-                        loadArgs();
-                        invokeStatic(target, implMethod);
-                    }
-                    returnValue();
-                    mark(doPrivileged);
-                } else {
-                    privilizer().env.debug("setting up unconditional privileged execution due to policy %s", policy);
-                }
-
-                // generate action:
-                final Type[] ctorArgs;
-                if (instanceMethod) {
-                    ctorArgs = ArrayUtils.add(methd.getArgumentTypes(), 0, target);
-                } else {
-                    ctorArgs = methd.getArgumentTypes();
-                }
-                final Type actionType = new ActionGenerator(access, methd, exceptions, PrivilizingVisitor.this).build();
-                newInstance(actionType);
-                dup();
-                if (instanceMethod) {
-                    loadThis();
-                }
-                loadArgs();
-                invokeConstructor(actionType, new Method("<init>", Type.VOID_TYPE, ctorArgs));
-
-                final boolean exc = ArrayUtils.isNotEmpty(exceptions);
-                // mark try if needed
-                final Label privTry = exc ? mark() : null;
-
-                // execute action
-                final Type arg =
-                    exc ? Type.getType(PrivilegedExceptionAction.class) : Type.getType(PrivilegedAction.class);
-                final Method doPrivileged = new Method("doPrivileged", Type.getType(Object.class), new Type[] { arg });
-                invokeStatic(Type.getType(AccessController.class), doPrivileged);
-
-                unbox(methd.getReturnType());
-                returnValue();
-
-                if (exc) {
-                    final Type caught = Type.getType(PrivilegedActionException.class);
-                    // end try
-                    final Label privCatch = mark();
-                    // catch
-                    catchException(privTry, privCatch, caught);
-                    // unwrap
-                    invokeVirtual(caught, new Method("getException", Type.getType(Exception.class),
-                        Privilizer.EMPTY_TYPE_ARRAY));
-                    // throw
-                    throwException();
-                }
-
-                // end original method
-                endMethod();
-
-                // substitute an impl visitor and continue
-                mv = cv.visitMethod(AccessLevel.PRIVATE.merge(access), impl, desc, signature, exceptions);
-                mv.visitCode();
-            }
-        };
-
-    }
-
-    @Override
-    public void visitEnd() {
-        annotate();
-        if (privilizer().policy == Policy.ON_INIT) {
-            final String fieldName = privilizer().generateName("hasSecurityManager");
-
-            visitField(Opcodes.ACC_PRIVATE + Opcodes.ACC_STATIC + Opcodes.ACC_FINAL, fieldName,
-                Type.BOOLEAN_TYPE.getDescriptor(), null, null).visitEnd();
-
-            final GeneratorAdapter mgen =
-                new GeneratorAdapter(Opcodes.ACC_STATIC, new Method("<clinit>", "()V"), null,
-                    Privilizer.EMPTY_TYPE_ARRAY, this);
-            checkSecurityManager(mgen);
-            mgen.putStatic(target, fieldName, Type.BOOLEAN_TYPE);
-            mgen.returnValue();
-            mgen.endMethod();
-        }
-        super.visitEnd();
-    }
-
-    /**
-     * Generates the instructions to push onto the stack whether there is a
-     * security manager available.
-     * @param mgen to control
-     */
-    private static void checkSecurityManager(final GeneratorAdapter mgen) {
-        final Label setFalse = new Label();
-        final Label done = new Label();
-        mgen.invokeStatic(Type.getType(System.class),
-            new Method("getSecurityManager", Type.getType(SecurityManager.class), Privilizer.EMPTY_TYPE_ARRAY));
-        mgen.ifNull(setFalse);
-        mgen.push(true);
-        mgen.goTo(done);
-        mgen.mark(setFalse);
-        mgen.push(false);
-        mgen.mark(done);
-    }
-}
diff --git a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/package-info.java b/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/package-info.java
deleted file mode 100644
index 3b74d58..0000000
--- a/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * Defines the Privilizer Weaver.
- */
-package org.apache.commons.weaver.privilizer;
\ No newline at end of file
diff --git a/trunk/modules/privilizer/weaver/src/main/resources/META-INF/services/org.apache.commons.weaver.spi.Cleaner b/trunk/modules/privilizer/weaver/src/main/resources/META-INF/services/org.apache.commons.weaver.spi.Cleaner
deleted file mode 100644
index 0d22498..0000000
--- a/trunk/modules/privilizer/weaver/src/main/resources/META-INF/services/org.apache.commons.weaver.spi.Cleaner
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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.
-
-# this class gets picked up by the CleanProcessor
-org.apache.commons.weaver.privilizer.PrivilizerCleaner
diff --git a/trunk/modules/privilizer/weaver/src/main/resources/META-INF/services/org.apache.commons.weaver.spi.Weaver b/trunk/modules/privilizer/weaver/src/main/resources/META-INF/services/org.apache.commons.weaver.spi.Weaver
deleted file mode 100644
index 1324768..0000000
--- a/trunk/modules/privilizer/weaver/src/main/resources/META-INF/services/org.apache.commons.weaver.spi.Weaver
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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.
-
-# this class gets picked up by the WeaveProcessor
-org.apache.commons.weaver.privilizer.PrivilizerWeaver
diff --git a/trunk/modules/src/site/markdown/index.md b/trunk/modules/src/site/markdown/index.md
deleted file mode 100644
index ee51390..0000000
--- a/trunk/modules/src/site/markdown/index.md
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
-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.
--->
-
-## Apache Commons Weaver Modules
-
-This is the parent Apache Maven module for the weaver modules provided
-with Apache Commons Weaver. See [Modules](modules.html).
diff --git a/trunk/pom.xml b/trunk/pom.xml
deleted file mode 100644
index 3d320d8..0000000
--- a/trunk/pom.xml
+++ /dev/null
@@ -1,641 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<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">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-parent</artifactId>
-    <version>33</version>
-  </parent>
-
-  <artifactId>commons-weaver-parent</artifactId>
-  <version>1.0</version>
-  <packaging>pom</packaging>
-
-  <name>Apache Commons Weaver</name>
-
-  <description>
-    Apache Commons Weaver provides an easy way to enhance compiled classes with
-    new functionality by generating ("weaving") bytecode into those classes.
-  </description>
-
-  <url>http://commons.apache.org/proper/commons-weaver</url>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-
-    <maven.compiler.source>1.6</maven.compiler.source>
-    <maven.compiler.target>1.6</maven.compiler.target>
-
-    <commons.componentid>weaver</commons.componentid>
-    <commons.release.version>1.0</commons.release.version>
-    <commons.rc.version>RC2</commons.rc.version>
-    <commons.jira.id>WEAVER</commons.jira.id>
-    <commons.jira.pid>12315320</commons.jira.pid>
-    <commons.site.path>commons-weaver</commons.site.path>
-    <asm.version>4.2</asm.version>
-    <commons.scmPubUrl>https://svn.apache.org/repos/infra/websites/production/commons/content/proper/${commons.site.path}</commons.scmPubUrl>
-    <commons.project-info.version>2.6</commons.project-info.version>
-
-    <ant.version>1.9.3</ant.version>
-    <checkstyle.version>2.11</checkstyle.version>
-  </properties>
-
-  <developers>
-    <developer>
-      <id>mbenson</id>
-      <name>Matt Benson</name>
-      <email>mbenson AT apache DOT org</email>
-      <organization>Apache</organization>
-    </developer>
-    <developer>
-      <id>struberg</id>
-      <name>Mark Struberg</name>
-      <email>struberg AT apache DOT org</email>
-      <organization>Apache</organization>
-    </developer>
-  </developers>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/weaver/tags/1.0_RC2</url>
-  </scm>
-
-  <distributionManagement>
-    <site>
-      <id>commons.site</id>
-      <name>Apache Commons Site SVN</name>
-      <url>scm:svn:${commons.scmPubUrl}</url>
-    </site>
-  </distributionManagement>
-
-  <dependencyManagement>
-    <dependencies>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-processor</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-processor</artifactId>
-        <classifier>sources</classifier>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-processor</artifactId>
-        <classifier>javadoc</classifier>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-privilizer-api</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-privilizer-api</artifactId>
-        <classifier>sources</classifier>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-privilizer-api</artifactId>
-        <classifier>javadoc</classifier>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-privilizer</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-privilizer</artifactId>
-        <classifier>sources</classifier>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-privilizer</artifactId>
-        <classifier>javadoc</classifier>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-normalizer</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-normalizer</artifactId>
-        <classifier>sources</classifier>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-normalizer</artifactId>
-        <classifier>javadoc</classifier>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-maven-plugin</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-maven-plugin</artifactId>
-        <classifier>sources</classifier>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-maven-plugin</artifactId>
-        <classifier>javadoc</classifier>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-antlib</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-antlib</artifactId>
-        <classifier>sources</classifier>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-antlib</artifactId>
-        <classifier>javadoc</classifier>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.xbean</groupId>
-        <artifactId>xbean-finder-shaded</artifactId>
-        <version>3.14</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-lang3</artifactId>
-        <version>3.2</version>
-      </dependency>
-      <dependency>
-        <groupId>commons-io</groupId>
-        <artifactId>commons-io</artifactId>
-        <version>2.4</version>
-      </dependency>
-      <dependency>
-        <groupId>org.javassist</groupId>
-        <artifactId>javassist</artifactId>
-        <version>3.17.1-GA</version>
-      </dependency>
-      <dependency>
-        <groupId>org.ow2.asm</groupId>
-        <artifactId>asm</artifactId>
-        <version>${asm.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.ow2.asm</groupId>
-        <artifactId>asm-commons</artifactId>
-        <version>${asm.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.ow2.asm</groupId>
-        <artifactId>asm-tree</artifactId>
-        <version>${asm.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.ow2.asm</groupId>
-        <artifactId>asm-util</artifactId>
-        <version>${asm.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.ow2.asm</groupId>
-        <artifactId>asm-analysis</artifactId>
-        <version>${asm.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.ow2.asm</groupId>
-        <artifactId>asm-debug-all</artifactId>
-        <version>${asm.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>junit</groupId>
-        <artifactId>junit</artifactId>
-        <version>4.11</version>
-        <scope>test</scope>
-      </dependency>
-    </dependencies>
-  </dependencyManagement>
-
-  <build>
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-dependency-plugin</artifactId>
-          <version>2.8</version>
-        </plugin>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-pmd-plugin</artifactId>
-          <version>3.0.1</version>
-        </plugin>
-        <plugin>
-          <groupId>org.codehaus.mojo</groupId>
-          <artifactId>build-helper-maven-plugin</artifactId>
-          <version>1.8</version>
-        </plugin>
-        <plugin>
-          <groupId>org.codehaus.mojo</groupId>
-          <artifactId>findbugs-maven-plugin</artifactId>
-          <version>2.5.3</version>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-antrun-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>copy-notices</id>
-            <phase>generate-sources</phase>
-            <goals>
-              <goal>run</goal>
-            </goals>
-            <configuration>
-              <target xmlns:if="ant:if" xmlns:unless="ant:unless">
-                <presetdef name="truth">
-                  <condition value="true" else="false" />
-                </presetdef>
-
-                <macrodef name="seek">
-                  <attribute name="name" />
-                  <attribute name="addto" />
-                  <sequential>
-                    <union id="@{name}-ws" />
-                    <step dir="${user.dir}" name="@{name}" addto="@{addto}" ws="@{name}-ws" />
-                  </sequential>
-                </macrodef>
-
-                <macrodef name="step">
-                  <attribute name="name" />
-                  <attribute name="dir" />
-                  <attribute name="addto" />
-                  <attribute name="ws" />
-                  <sequential>
-                    <local name="seenDir" />
-                    <truth property="seenDir">
-                      <resourcecount when="gt" count="0">
-                        <intersect id="intersection">
-                          <resources refid="@{ws}" />
-                          <file name="@{dir}" />
-                        </intersect>
-                      </resourcecount>
-                    </truth>
-                    <sequential unless:true="${seenDir}">
-                      <augment id="@{ws}">
-                        <file file="@{dir}" />
-                      </augment>
-                      <local name="exists" />
-                      <truth property="exists">
-                        <available file="@{dir}/@{name}" />
-                      </truth>
-
-                      <sequential if:true="${exists}">
-                        <augment id="@{addto}">
-                          <file file="@{dir}/@{name}" />
-                        </augment>
-                      </sequential>
-                      <sequential unless:true="${exists}">
-                        <local name="parent.dir" />
-                        <dirname property="parent.dir" file="@{dir}" />
-                        <step dir="${parent.dir}" name="@{name}" addto="@{addto}" ws="@{ws}" />
-                      </sequential>
-                    </sequential>
-                  </sequential>
-                </macrodef>
-
-                <truth property="pom-only">
-                  <equals arg1="${project.packaging}" arg2="pom" />
-                </truth>
-                <sequential unless:true="${pom-only}">
-                  <union id="notices" />
-                  <seek name="LICENSE.txt" addto="notices" />
-                  <seek name="NOTICE.txt" addto="notices" />
-
-                  <mkdir dir="${project.build.directory}/generated-resources/notices/META-INF" />
-                  <copy verbose="true" todir="${project.build.directory}/generated-resources/notices/META-INF">
-                    <resources refid="notices" />
-                  </copy>
-
-                  <mkdir dir="${project.build.directory}/generated-test-resources/notices/META-INF" />
-                  <copy verbose="true" todir="${project.build.directory}/generated-test-resources/notices/META-INF">
-                    <resources refid="notices" />
-                  </copy>
-
-                  <mkdir dir="${project.build.directory}/apidocs/META-INF" />
-                  <copy verbose="true" todir="${project.build.directory}/apidocs/META-INF">
-                    <resources refid="notices" />
-                  </copy>
-                </sequential>
-              </target>
-            </configuration>
-          </execution>
-        </executions>
-        <dependencies>
-          <dependency>
-            <groupId>org.apache.ant</groupId>
-            <artifactId>ant</artifactId>
-            <version>${ant.version}</version>
-          </dependency>
-        </dependencies>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-checkstyle-plugin</artifactId>
-        <version>${checkstyle.version}</version>
-        <dependencies>
-          <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>commons-weaver-build-tools</artifactId>
-            <version>${project.version}</version>
-          </dependency>
-        </dependencies>
-        <configuration>
-          <configLocation>org/apache/commons/weaver/checkstyle.xml</configLocation>
-          <headerLocation>org/apache/commons/weaver/license-header.txt</headerLocation>
-        </configuration>
-      </plugin>
-      <!-- Unfortunately the much simpler
-           <prerequisites><maven>3.0</maven></prerequisites>  
-           is not inherited so we have to use the enforcer plugin
-      -->
-      <plugin>
-        <inherited>true</inherited>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-enforcer-plugin</artifactId>
-        <version>1.3.1</version>
-        <executions>
-          <execution>
-            <id>enforce-maven-3</id>
-            <goals>
-              <goal>enforce</goal>
-            </goals>
-            <configuration>
-              <rules>
-                <requireMavenVersion>
-                  <version>3.0.0</version>
-                </requireMavenVersion>                
-              </rules>
-              <fail>true</fail>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>attach-test-jar</id>
-            <phase>package</phase>
-            <goals>
-              <goal>test-jar</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <skipIfEmpty>true</skipIfEmpty>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-javadoc-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>create-javadoc-jar</id>
-            <goals>
-              <goal>javadoc</goal>
-              <goal>jar</goal>
-            </goals>
-            <phase>package</phase>
-          </execution>
-        </executions>
-        <configuration>
-          <source>${maven.compiler.source}</source>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-pmd-plugin</artifactId>
-        <dependencies>
-          <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>commons-weaver-build-tools</artifactId>
-            <version>${project.version}</version>
-          </dependency>
-        </dependencies>
-        <configuration>
-          <rulesets>
-            <ruleset>/org/apache/commons/weaver/pmd.xml</ruleset>
-          </rulesets>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-release-plugin</artifactId>
-        <configuration>
-          <autoVersionSubmodules>true</autoVersionSubmodules>
-          <tag>${commons.release.version}_${commons.rc.version}</tag>
-          <preparationGoals>changes:changes-check</preparationGoals>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-scm-publish-plugin</artifactId>
-        <configuration>
-          <content>${project.build.directory}/staging</content>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-site-plugin</artifactId>
-        <version>3.3</version>
-        <dependencies>
-          <dependency>
-            <groupId>org.apache.maven.doxia</groupId>
-            <artifactId>doxia-module-markdown</artifactId>
-            <version>1.3</version>
-          </dependency>
-        </dependencies>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-source-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>attach-sources</id>
-            <goals>
-              <goal>jar-no-fork</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>attach-test-sources</id>
-            <goals>
-              <goal>test-jar-no-fork</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>add-source-notices</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>add-resource</goal>
-            </goals>
-            <configuration>
-              <resources>
-                <resource>
-                  <directory>${project.build.directory}/generated-resources/notices</directory>
-                </resource>
-              </resources>
-            </configuration>
-          </execution>
-          <execution>
-            <id>add-test-notices</id>
-            <phase>generate-test-resources</phase>
-            <goals>
-              <goal>add-test-resource</goal>
-            </goals>
-            <configuration>
-              <resources>
-                <resource>
-                  <directory>${project.build.directory}/generated-test-resources/notices</directory>
-                </resource>
-              </resources>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>findbugs-maven-plugin</artifactId>
-        <dependencies>
-          <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>commons-weaver-build-tools</artifactId>
-            <version>${project.version}</version>
-          </dependency>
-        </dependencies>
-        <configuration>
-          <excludeFilterFile>/org/apache/commons/weaver/findbugs-exclude-filter.xml</excludeFilterFile>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-javadoc-plugin</artifactId>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-report-plugin</artifactId>
-        <configuration>
-          <aggregate>true</aggregate>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
-
-  <profiles>
-    <profile>
-      <id>release</id>
-      <build>
-        <plugins>
-          <plugin>
-            <artifactId>maven-assembly-plugin</artifactId>
-            <inherited>false</inherited>
-            <executions>
-              <execution>
-                <goals>
-                  <goal>single</goal>
-                </goals>
-                <!-- disable assembly:single from commons-parent
-                     release profile; multimodule assembly handled
-                     by dist module -->
-                <phase />
-              </execution>
-            </executions>
-          </plugin>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-source-plugin</artifactId>
-            <executions>
-              <execution>
-                <id>create-source-jar</id>
-                <!-- suppress execution specified by parent profile -->
-                <phase />
-              </execution>
-            </executions>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-    <profile>
-      <id>site</id>
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-javadoc-plugin</artifactId>
-            <configuration>
-              <aggregate>true</aggregate>
-            </configuration>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-  </profiles>
-
-  <modules>
-    <module>build-tools</module>
-    <module>processor</module>
-    <module>modules</module>
-    <module>maven-plugin</module>
-    <module>example</module>
-    <module>ant</module>
-    <module>dist</module>
-  </modules>
-</project>
diff --git a/trunk/processor/pom.xml b/trunk/processor/pom.xml
deleted file mode 100644
index 7fb69cd..0000000
--- a/trunk/processor/pom.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<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">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-weaver-parent</artifactId>
-    <version>1.0</version>
-  </parent>
-
-  <artifactId>commons-weaver-processor</artifactId>
-  <name>Apache Commons Weaver Processor</name>
-  <description>
-    Defines the Apache Commons Weaver SPI as well as the basic build-time
-    (filesystem-based) processors that detect, configure, and invoke
-    available modules.
-  </description>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/processor</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/weaver/tags/1.0_RC2/processor</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/weaver/tags/1.0_RC2/processor</url>
-  </scm>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.xbean</groupId>
-      <artifactId>xbean-finder-shaded</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-pmd-plugin</artifactId>
-        <configuration>
-          <rulesets>
-            <ruleset>/org/apache/commons/weaver/pmd.xml</ruleset>
-          </rulesets>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-checkstyle-plugin</artifactId>
-        <version>${checkstyle.version}</version>
-        <configuration>
-          <configLocation>org/apache/commons/weaver/checkstyle.xml</configLocation>
-          <headerLocation>org/apache/commons/weaver/license-header.txt</headerLocation>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>findbugs-maven-plugin</artifactId>
-        <configuration>
-          <xmlOutput>true</xmlOutput>
-          <excludeFilterFile>/org/apache/commons/weaver/findbugs-exclude-filter.xml</excludeFilterFile>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
-</project>
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/CleanProcessor.java b/trunk/processor/src/main/java/org/apache/commons/weaver/CleanProcessor.java
deleted file mode 100644
index 00075f8..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/CleanProcessor.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * 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.commons.weaver;
-
-import java.io.File;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.ServiceLoader;
-import java.util.Set;
-import java.util.logging.Logger;
-
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.weaver.model.WeaveEnvironment;
-import org.apache.commons.weaver.spi.Cleaner;
-import org.apache.commons.weaver.utils.URLArray;
-import org.apache.xbean.finder.archive.FileArchive;
-
-/**
- * This class discovers and invokes available {@link Cleaner} plugins.
- */
-public class CleanProcessor {
-    private static final Logger LOG = Logger.getLogger(CleanProcessor.class.getName());
-
-    /**
-     * List of picked up cleaner plugins.
-     */
-    private static final List<Cleaner> CLEANERS;
-
-    static {
-        final List<Cleaner> cleaners = new ArrayList<Cleaner>();
-        for (final Cleaner cleaner : ServiceLoader.load(Cleaner.class)) {
-            cleaners.add(cleaner);
-        }
-        CLEANERS = Collections.unmodifiableList(cleaners);
-    }
-
-    /**
-     * The classpath which will be used to look up cross references during cleaning.
-     */
-    private final List<String> classpath;
-
-    /**
-     * The actual path to be woven, replacing any affected classes.
-     */
-    private final File target;
-
-    /**
-     * Properties for configuring discovered plugin modules.
-     */
-    private final Properties configuration;
-
-    /**
-     * Create a new {@link CleanProcessor} instance.
-     *
-     * @param classpath not {@code null}
-     * @param target not {@code null}
-     * @param configuration not {@code null}
-     */
-    public CleanProcessor(final List<String> classpath, final File target, final Properties configuration) {
-        super();
-        this.classpath = Validate.notNull(classpath, "classpath");
-        this.target = Validate.notNull(target, "target");
-        Validate.isTrue(!target.exists() || target.isDirectory(), "%s is not a directory", target);
-        this.configuration = Validate.notNull(configuration, "configuration");
-    }
-
-    /**
-     * Clean specified targets.
-     */
-    public void clean() {
-        if (!target.exists()) {
-            LOG.warning("Target directory " + target + " does not exist; nothing to do!");
-        }
-        final Set<String> finderClasspath = new LinkedHashSet<String>();
-        finderClasspath.add(target.getAbsolutePath());
-        finderClasspath.addAll(classpath);
-        final ClassLoader classLoader = new URLClassLoader(URLArray.fromPaths(finderClasspath));
-        final Finder finder = new Finder(new FileArchive(classLoader, target));
-        for (final Cleaner cleaner : CLEANERS) {
-            final WeaveEnvironment env =
-                new LocalWeaveEnvironment(target, classLoader, configuration, Logger.getLogger(cleaner.getClass()
-                    .getName()));
-            cleaner.clean(env, finder);
-        }
-    }
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/Finder.java b/trunk/processor/src/main/java/org/apache/commons/weaver/Finder.java
deleted file mode 100644
index 2a6d624..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/Finder.java
+++ /dev/null
@@ -1,746 +0,0 @@
-/*
- * 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.commons.weaver;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Array;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Member;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.IdentityHashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.weaver.model.ScanRequest;
-import org.apache.commons.weaver.model.ScanResult;
-import org.apache.commons.weaver.model.Scanner;
-import org.apache.commons.weaver.model.WeaveInterest;
-import org.apache.commons.weaver.utils.Annotations;
-import org.apache.xbean.asm4.AnnotationVisitor;
-import org.apache.xbean.asm4.ClassReader;
-import org.apache.xbean.asm4.ClassVisitor;
-import org.apache.xbean.asm4.FieldVisitor;
-import org.apache.xbean.asm4.MethodVisitor;
-import org.apache.xbean.asm4.Opcodes;
-import org.apache.xbean.asm4.Type;
-import org.apache.xbean.finder.Annotated;
-import org.apache.xbean.finder.AnnotationFinder;
-import org.apache.xbean.finder.Parameter;
-import org.apache.xbean.finder.archive.Archive;
-
-/**
- * Scanner implementation.
- */
-class Finder extends AnnotationFinder implements Scanner {
-
-    private abstract class AnnotationInflater extends AnnotationCapturer {
-        final Class<? extends Annotation> annotationType;
-        final Map<String, Object> elements = new LinkedHashMap<String, Object>();
-
-        AnnotationInflater(final String desc, final AnnotationVisitor wrapped) {
-            super(wrapped);
-            this.annotationType = toClass(Type.getType(desc)).asSubclass(Annotation.class);
-        }
-
-        Annotation inflate() {
-            return Annotations.instanceOf(annotationType, elements);
-        }
-
-        @Override
-        protected void storeValue(final String name, final Object value) {
-            Object toStore = value;
-            Validate.notNull(toStore, "null annotation element");
-            if (toStore.getClass().isArray()) {
-                final Class<?> requiredType;
-                try {
-                    requiredType = annotationType.getDeclaredMethod(name).getReturnType();
-                } catch (final Exception e) {
-                    throw new RuntimeException(e);
-                }
-                if (!requiredType.isInstance(toStore)) {
-                    final int len = Array.getLength(toStore);
-                    final Object typedArray = Array.newInstance(requiredType.getComponentType(), len);
-                    for (int i = 0; i < len; i++) {
-                        Object element = Array.get(toStore, i);
-                        if (element instanceof Type) {
-                            element = toClass((Type) element);
-                        }
-                        Array.set(typedArray, i, element);
-                    }
-                    toStore = typedArray;
-                }
-            } else if (toStore instanceof Type) {
-                toStore = toClass((Type) toStore);
-            }
-            elements.put(name, toStore);
-        }
-    }
-
-    private abstract class AnnotationCapturer extends AnnotationVisitor {
-        public AnnotationCapturer(final AnnotationVisitor wrapped) {
-            super(Opcodes.ASM4, wrapped);
-        }
-
-        /**
-         * Template method for storing an annotation value.
-         * @param name
-         * @param value
-         */
-        protected abstract void storeValue(String name, Object value);
-
-        @Override
-        public void visit(final String name, final Object value) {
-            storeValue(name, value);
-        }
-
-        @Override
-        public AnnotationVisitor visitAnnotation(final String name, final String desc) {
-            final AnnotationCapturer owner = this;
-            return new AnnotationInflater(desc, super.visitAnnotation(name, desc)) {
-
-                @Override
-                public void visitEnd() {
-                    owner.storeValue(name, inflate());
-                }
-            };
-        }
-
-        @Override
-        public AnnotationVisitor visitArray(final String name) {
-            final AnnotationCapturer owner = this;
-            final List<Object> values = new ArrayList<Object>();
-            return new AnnotationCapturer(super.visitArray(name)) {
-
-                @Override
-                public void visitEnd() {
-                    owner.storeValue(name, values.toArray());
-                    super.visitEnd();
-                }
-
-                @Override
-                protected void storeValue(final String name, final Object value) {
-                    values.add(value);
-                }
-            };
-        }
-
-        @Override
-        public void visitEnum(final String name, final String desc, final String value) {
-            super.visitEnum(name, desc, value);
-            @SuppressWarnings("rawtypes")
-            final Class<? extends Enum> enumType;
-            try {
-                enumType = Class.forName(Type.getType(desc).getClassName()).asSubclass(Enum.class);
-            } catch (final ClassNotFoundException e) {
-                throw new RuntimeException(e);
-            }
-            @SuppressWarnings("unchecked")
-            final Enum<?> enumValue = Enum.valueOf(enumType, value);
-            storeValue(name, enumValue);
-        }
-
-    }
-
-    private class TopLevelAnnotationInflater extends AnnotationInflater {
-        private final Info info;
-
-        TopLevelAnnotationInflater(final String desc, final AnnotationVisitor wrapped, final Info info) {
-            super(desc, wrapped);
-            this.info = info;
-        }
-
-        @Override
-        public void visitEnd() {
-            super.visitEnd();
-            classfileAnnotationsFor(info).add(inflate());
-        }
-
-        private List<Annotation> classfileAnnotationsFor(final Info info) {
-            synchronized (CLASSFILE_ANNOTATIONS) {
-                if (!CLASSFILE_ANNOTATIONS.get().containsKey(info)) {
-                    final List<Annotation> result = new ArrayList<Annotation>();
-                    CLASSFILE_ANNOTATIONS.get().put(info, result);
-                    return result;
-                }
-            }
-            return CLASSFILE_ANNOTATIONS.get().get(info);
-        }
-    }
-
-    /**
-     * Specialized {@link ClassVisitor} to inflate annotations for the info
-     * objects built by a wrapped {@link InfoBuildingVisitor}.
-     */
-    public class Visitor extends ClassVisitor {
-        private final InfoBuildingVisitor wrapped;
-
-        public Visitor(final InfoBuildingVisitor wrapped) {
-            super(Opcodes.ASM4, wrapped);
-            this.wrapped = wrapped;
-        }
-
-        @Override
-        public FieldVisitor visitField(final int access, final String name, final String desc, final String signature,
-            final Object value) {
-            final FieldVisitor toWrap = wrapped.visitField(access, name, desc, signature, value);
-            final ClassInfo classInfo = (ClassInfo) wrapped.getInfo();
-            FieldInfo testFieldInfo = null;
-            // should be the most recently added field, so iterate backward:
-            for (int i = classInfo.getFields().size() - 1; i >= 0; i--) {
-                final FieldInfo atI = classInfo.getFields().get(i);
-                if (atI.getName().equals(name) && atI.getType().equals(desc)) {
-                    testFieldInfo = atI;
-                    break;
-                }
-            }
-            if (testFieldInfo == null) {
-                return toWrap;
-            }
-            final FieldInfo fieldInfo = testFieldInfo;
-            return new FieldVisitor(Opcodes.ASM4, toWrap) {
-                @Override
-                public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
-                    final AnnotationVisitor toWrap = super.visitAnnotation(desc, visible);
-                    return visible ? toWrap : new TopLevelAnnotationInflater(desc, toWrap, fieldInfo);
-                }
-            };
-        }
-
-        @Override
-        public MethodVisitor visitMethod(final int access, final String name, final String desc,
-            final String signature, final String[] exceptions) {
-            final MethodVisitor toWrap = wrapped.visitMethod(access, name, desc, signature, exceptions);
-            final ClassInfo classInfo = (ClassInfo) wrapped.getInfo();
-
-            // MethodInfo may not always come from a descriptor, so we must go by the
-            // Member represented. Make sure the method either has a valid name or is a constructor:
-            final MethodInfo compareMethodInfo = new MethodInfo(classInfo, name, desc);
-            if (!compareMethodInfo.isConstructor() && !isJavaIdentifier(name)) {
-                return toWrap;
-            }
-            MethodInfo testMethodInfo = null;
-            final Member member;
-            try {
-                member = compareMethodInfo.get();
-                // should be the most recently added method, so iterate backward:
-                for (int i = classInfo.getMethods().size() - 1; i >= 0; i--) {
-                    final MethodInfo atI = classInfo.getMethods().get(i);
-                    if (atI.getName().equals(name) && atI.get().equals(member)) {
-                        testMethodInfo = atI;
-                        break;
-                    }
-                }
-            } catch (final ClassNotFoundException e) {
-                return toWrap;
-            }
-            if (testMethodInfo == null) {
-                return toWrap;
-            }
-            final MethodInfo methodInfo = testMethodInfo;
-            return new MethodVisitor(Opcodes.ASM4, toWrap) {
-                @Override
-                public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
-                    final AnnotationVisitor toWrap = super.visitAnnotation(desc, visible);
-                    return visible ? toWrap : new TopLevelAnnotationInflater(desc, toWrap, methodInfo);
-                }
-
-                @Override
-                public AnnotationVisitor visitParameterAnnotation(final int param, final String desc,
-                    final boolean visible) {
-                    final AnnotationVisitor toWrap = super.visitParameterAnnotation(param, desc, visible);
-                    if (visible) {
-                        return toWrap;
-                    }
-                    ParameterInfo parameterInfo = null;
-
-                    // should be the most recently added parameter, so iterate backward:
-                    for (int i = methodInfo.getParameters().size() - 1; i >= 0; i--) {
-                        final ParameterInfo atI = methodInfo.getParameters().get(i);
-                        try {
-                            if (atI.get().getIndex() == param) {
-                                parameterInfo = atI;
-                                break;
-                            }
-                        } catch (final ClassNotFoundException e) {
-                            continue;
-                        }
-                    }
-                    return parameterInfo == null ? toWrap : new TopLevelAnnotationInflater(desc, toWrap, parameterInfo);
-                }
-            };
-        }
-
-        @Override
-        public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
-            final AnnotationVisitor toWrap = super.visitAnnotation(desc, visible);
-            return visible ? toWrap : new TopLevelAnnotationInflater(desc, toWrap, wrapped.getInfo());
-        }
-
-        private boolean isJavaIdentifier(final String toCheck) {
-            if (toCheck.isEmpty() || !Character.isJavaIdentifierStart(toCheck.charAt(0))) {
-                return false;
-            }
-            for (final char chr : toCheck.substring(1).toCharArray()) {
-                if (!Character.isJavaIdentifierPart(chr)) {
-                    return false;
-                }
-            }
-            return true;
-        }
-    }
-
-    private static class IncludesClassfile<T extends AnnotatedElement> implements Annotated<T> {
-        private final T target;
-        private final Annotation[] annotations;
-
-        IncludesClassfile(final T target, final List<Annotation> classfileAnnotations) {
-            this(target, classfileAnnotations.toArray(new Annotation[classfileAnnotations.size()]));
-        }
-
-        IncludesClassfile(final T target, final Annotation[] classfileAnnotations) {
-            super();
-            this.target = target;
-            this.annotations = ArrayUtils.addAll(target.getAnnotations(), classfileAnnotations);
-        }
-
-        @Override
-        public <A extends Annotation> A getAnnotation(final Class<A> annotationType) {
-            for (final Annotation prospect : annotations) {
-                if (prospect.annotationType().equals(annotationType)) {
-                    @SuppressWarnings("unchecked")
-                    final A result = (A) prospect;
-                    return result;
-                }
-            }
-            return null;
-        }
-
-        @Override
-        public Annotation[] getAnnotations() {
-            final Annotation[] result = new Annotation[annotations.length];
-            System.arraycopy(annotations, 0, result, 0, annotations.length);
-            return result;
-        }
-
-        @Override
-        public Annotation[] getDeclaredAnnotations() {
-            return getAnnotations();
-        }
-
-        @Override
-        public boolean isAnnotationPresent(final Class<? extends Annotation> annotationType) {
-            return getAnnotation(annotationType) != null;
-        }
-
-        @Override
-        public T get() {
-            return target;
-        }
-
-    }
-
-    /**
-     * Helper class for finding elements with annotations (including those with classfile-level retention).
-     */
-    public final class WithAnnotations {
-        private static final String INIT = "<init>";
-
-        private WithAnnotations() {
-        }
-
-        public List<Annotated<Package>> findAnnotatedPackages(final Class<? extends Annotation> annotation) {
-            Finder.this.findAnnotatedPackages(annotation);
-            final List<Annotated<Package>> result = new ArrayList<Annotated<Package>>();
-            for (final Info info : getAnnotationInfos(annotation.getName())) {
-                if (info instanceof PackageInfo) {
-                    final PackageInfo packageInfo = (PackageInfo) info;
-                    try {
-                        final IncludesClassfile<Package> annotated =
-                            new IncludesClassfile<Package>(packageInfo.get(), classfileAnnotationsFor(packageInfo));
-                        if (annotated.isAnnotationPresent(annotation)) {
-                            result.add(annotated);
-                        }
-                    } catch (final ClassNotFoundException e) {
-                        continue;
-                    }
-                }
-            }
-            return result;
-        }
-
-        public List<Annotated<Class<?>>> findAnnotatedClasses(final Class<? extends Annotation> annotation) {
-            Finder.this.findAnnotatedClasses(annotation);
-            final List<Annotated<Class<?>>> result = new ArrayList<Annotated<Class<?>>>();
-            for (final Info info : getAnnotationInfos(annotation.getName())) {
-                if (info instanceof ClassInfo) {
-                    final ClassInfo classInfo = (ClassInfo) info;
-
-                    IncludesClassfile<Class<?>> annotated;
-                    try {
-                        annotated =
-                            new IncludesClassfile<Class<?>>(classInfo.get(), classfileAnnotationsFor(classInfo));
-                    } catch (final ClassNotFoundException e) {
-                        continue;
-                    }
-                    if (annotated.isAnnotationPresent(annotation)) {
-                        result.add(annotated);
-                    }
-                }
-            }
-            return result;
-        }
-
-        public List<Annotated<Class<?>>> findAssignableTypes(final Class<?> supertype) {
-            final List<Annotated<Class<?>>> result = new ArrayList<Annotated<Class<?>>>();
-            final List<?> assignableTypes;
-            if (supertype.isInterface()) {
-                assignableTypes = Finder.this.findImplementations(supertype);
-            } else {
-                assignableTypes = Finder.this.findSubclasses(supertype);
-            }
-
-            for (final Object object : assignableTypes) {
-                final ClassInfo classInfo = classInfos.get(((Class<?>) object).getName());
-                final IncludesClassfile<Class<?>> annotated;
-                try {
-                    annotated = new IncludesClassfile<Class<?>>(classInfo.get(), classfileAnnotationsFor(classInfo));
-                } catch (final ClassNotFoundException e) {
-                    continue;
-                }
-                result.add(annotated);
-            }
-            return result;
-        }
-
-        public List<Annotated<Method>> findAnnotatedMethods(final Class<? extends Annotation> annotation) {
-            Finder.this.findAnnotatedMethods(annotation);
-            final List<Annotated<Method>> result = new ArrayList<Annotated<Method>>();
-            for (final Info info : getAnnotationInfos(annotation.getName())) {
-                if (info instanceof MethodInfo) {
-                    final MethodInfo methodInfo = (MethodInfo) info;
-                    if (INIT.equals(methodInfo.getName())) {
-                        continue;
-                    }
-                    IncludesClassfile<Method> annotated;
-                    try {
-                        annotated =
-                            new IncludesClassfile<Method>((Method) methodInfo.get(),
-                                classfileAnnotationsFor(methodInfo));
-                    } catch (final ClassNotFoundException e) {
-                        continue;
-                    }
-                    if (annotated.isAnnotationPresent(annotation)) {
-                        result.add(annotated);
-                    }
-                }
-            }
-            return result;
-
-        }
-
-        public List<Annotated<Parameter<Method>>> findAnnotatedMethodParameters(
-            final Class<? extends Annotation> annotationType) {
-            Finder.this.findAnnotatedMethodParameters(annotationType);
-            final List<Annotated<Parameter<Method>>> result = new ArrayList<Annotated<Parameter<Method>>>();
-            for (final Info info : getAnnotationInfos(annotationType.getName())) {
-                if (info instanceof ParameterInfo) {
-                    final ParameterInfo parameterInfo = (ParameterInfo) info;
-                    if (INIT.equals(parameterInfo.getDeclaringMethod().getName())) {
-                        continue;
-                    }
-                    Parameter<Method> parameter;
-                    try {
-                        @SuppressWarnings("unchecked")
-                        final Parameter<Method> unchecked = (Parameter<Method>) parameterInfo.get();
-                        parameter = unchecked;
-                    } catch (final ClassNotFoundException e) {
-                        continue;
-                    }
-                    final IncludesClassfile<Parameter<Method>> annotated =
-                        new IncludesClassfile<Parameter<Method>>(parameter, classfileAnnotationsFor(parameterInfo));
-                    if (annotated.isAnnotationPresent(annotationType)) {
-                        result.add(annotated);
-                    }
-                }
-            }
-            return result;
-        }
-
-        public List<Annotated<Constructor<?>>> findAnnotatedConstructors(final Class<? extends Annotation> annotation) {
-            Finder.this.findAnnotatedConstructors(annotation);
-            final List<Annotated<Constructor<?>>> result = new ArrayList<Annotated<Constructor<?>>>();
-            for (final Info info : getAnnotationInfos(annotation.getName())) {
-                if (info instanceof MethodInfo) {
-                    final MethodInfo methodInfo = (MethodInfo) info;
-                    if (!INIT.equals(methodInfo.getName())) {
-                        continue;
-                    }
-                    final IncludesClassfile<Constructor<?>> annotated;
-                    try {
-                        annotated =
-                            new IncludesClassfile<Constructor<?>>((Constructor<?>) methodInfo.get(),
-                                classfileAnnotationsFor(methodInfo));
-                    } catch (final ClassNotFoundException e) {
-                        continue;
-                    }
-                    if (annotated.isAnnotationPresent(annotation)) {
-                        result.add(annotated);
-                    }
-                }
-            }
-            return result;
-        }
-
-        public List<Annotated<Parameter<Constructor<?>>>> findAnnotatedConstructorParameters(
-            final Class<? extends Annotation> annotation) {
-            Finder.this.findAnnotatedConstructorParameters(annotation);
-            final List<Annotated<Parameter<Constructor<?>>>> result =
-                new ArrayList<Annotated<Parameter<Constructor<?>>>>();
-            for (final Info info : getAnnotationInfos(annotation.getName())) {
-                if (info instanceof ParameterInfo) {
-                    final ParameterInfo parameterInfo = (ParameterInfo) info;
-                    if (!INIT.equals(parameterInfo.getDeclaringMethod().getName())) {
-                        continue;
-                    }
-                    Parameter<Constructor<?>> parameter;
-                    try {
-                        @SuppressWarnings("unchecked")
-                        final Parameter<Constructor<?>> unchecked = (Parameter<Constructor<?>>) parameterInfo.get();
-                        parameter = unchecked;
-                    } catch (final ClassNotFoundException e) {
-                        continue;
-                    }
-                    final IncludesClassfile<Parameter<Constructor<?>>> annotated =
-                        new IncludesClassfile<Parameter<Constructor<?>>>(parameter,
-                            classfileAnnotationsFor(parameterInfo));
-                    if (annotated.isAnnotationPresent(annotation)) {
-                        result.add(annotated);
-                    }
-                }
-            }
-            return result;
-        }
-
-        public List<Annotated<Field>> findAnnotatedFields(final Class<? extends Annotation> annotation) {
-            Finder.this.findAnnotatedFields(annotation);
-            final List<Annotated<Field>> result = new ArrayList<Annotated<Field>>();
-            for (final Info info : getAnnotationInfos(annotation.getName())) {
-                if (info instanceof FieldInfo) {
-                    final FieldInfo fieldInfo = (FieldInfo) info;
-                    try {
-                        final IncludesClassfile<Field> annotated =
-                            new IncludesClassfile<Field>((Field) fieldInfo.get(), classfileAnnotationsFor(fieldInfo));
-                        if (annotated.isAnnotationPresent(annotation)) {
-                            result.add(annotated);
-                        }
-                    } catch (final ClassNotFoundException e) {
-                        continue;
-                    }
-                }
-            }
-            return result;
-        }
-
-        private List<Annotation> classfileAnnotationsFor(final Info info) {
-            synchronized (classfileAnnotations) {
-                if (!classfileAnnotations.containsKey(info)) {
-                    final List<Annotation> result = new ArrayList<Annotation>();
-                    classfileAnnotations.put(info, result);
-                    return result;
-                }
-            }
-            return classfileAnnotations.get(info);
-        }
-
-    }
-
-    private static final int ASM_FLAGS = ClassReader.SKIP_CODE + ClassReader.SKIP_DEBUG + ClassReader.SKIP_FRAMES;
-
-    /**
-     * The {@link #classfileAnnotations} member stores these; however the scanning takes place in the scope of the super
-     * constructor call, thus there is no opportunity to set the reference beforehand. To work around this, we use a
-     * static ThreadLocal with an initializer and pull/clear its value when we return from the super constructor. :P
-     */
-    private static final ThreadLocal<Map<Info, List<Annotation>>> CLASSFILE_ANNOTATIONS =
-        new ThreadLocal<Map<Info, List<Annotation>>>() {
-            @Override
-            protected Map<Info, List<Annotation>> initialValue() {
-                return new IdentityHashMap<AnnotationFinder.Info, List<Annotation>>();
-            }
-        };
-
-    private final WithAnnotations withAnnotations = new WithAnnotations();
-    private final Map<Info, List<Annotation>> classfileAnnotations;
-    private final Inflater inflater;
-
-    /**
-     * Create a new {@link Finder} instance.
-     * @param archive
-     */
-    public Finder(final Archive archive) {
-        super(archive, false);
-        classfileAnnotations = CLASSFILE_ANNOTATIONS.get();
-        CLASSFILE_ANNOTATIONS.remove();
-        inflater = new Inflater(classfileAnnotations);
-        enableFindImplementations();
-        enableFindSubclasses();
-    }
-
-    /**
-     * Fluent "finder with annotations".
-     * @return {@link WithAnnotations}
-     */
-    public WithAnnotations withAnnotations() {
-        return withAnnotations;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected void readClassDef(final InputStream bytecode) throws IOException {
-        try {
-            final ClassReader classReader = new ClassReader(bytecode);
-            classReader.accept(new Visitor(new InfoBuildingVisitor()), ASM_FLAGS);
-        } finally {
-            bytecode.close();
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public AnnotationFinder select(final Class<?>... arg0) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public AnnotationFinder select(final Iterable<String> clazz) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public AnnotationFinder select(final String... clazz) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public ScanResult scan(final ScanRequest request) {
-        final ScanResult result = new ScanResult();
-
-        for (final WeaveInterest interest : request.getInterests()) {
-            switch (interest.target) {
-            case PACKAGE:
-                for (final Annotated<Package> pkg : this.withAnnotations().findAnnotatedPackages(
-                    interest.annotationType)) {
-                    result.getWeavable(pkg.get()).addAnnotations(pkg.getAnnotations());
-                }
-                break;
-            case TYPE:
-                for (final Annotated<Class<?>> type : this.withAnnotations().findAnnotatedClasses(
-                    interest.annotationType)) {
-                    result.getWeavable(type.get()).addAnnotations(type.getAnnotations());
-                }
-                break;
-            case METHOD:
-                for (final Annotated<Method> method : this.withAnnotations().findAnnotatedMethods(
-                    interest.annotationType)) {
-                    result.getWeavable(method.get()).addAnnotations(method.getAnnotations());
-                }
-                break;
-            case CONSTRUCTOR:
-                for (final Annotated<Constructor<?>> ctor : this.withAnnotations().findAnnotatedConstructors(
-                    interest.annotationType)) {
-                    result.getWeavable(ctor.get()).addAnnotations(ctor.getAnnotations());
-                }
-                break;
-            case FIELD:
-                for (final Annotated<Field> fld : this.withAnnotations().findAnnotatedFields(interest.annotationType)) {
-                    result.getWeavable(fld.get()).addAnnotations(fld.getAnnotations());
-                }
-                break;
-            case PARAMETER:
-                for (final Annotated<Parameter<Method>> parameter : this.withAnnotations()
-                    .findAnnotatedMethodParameters(interest.annotationType)) {
-                    result.getWeavable(parameter.get().getDeclaringExecutable())
-                        .getWeavableParameter(parameter.get().getIndex()).addAnnotations(parameter.getAnnotations());
-                }
-                for (final Annotated<Parameter<Constructor<?>>> parameter : this.withAnnotations()
-                    .findAnnotatedConstructorParameters(interest.annotationType)) {
-                    result.getWeavable(parameter.get().getDeclaringExecutable())
-                        .getWeavableParameter(parameter.get().getIndex()).addAnnotations(parameter.getAnnotations());
-                }
-                break;
-            default:
-                // should we log something?
-                break;
-            }
-        }
-        for (final Class<?> supertype : request.getSupertypes()) {
-            for (final Annotated<Class<?>> type : this.withAnnotations().findAssignableTypes(supertype)) {
-                result.getWeavable(type.get()).addAnnotations(type.getAnnotations());
-            }
-        }
-        return inflater.inflate(result);
-    }
-
-    private Class<?> toClass(final Type type) {
-        final String className;
-        if (type.getSort() == Type.ARRAY) {
-            className = type.getElementType().getClassName();
-        } else {
-            className = type.getClassName();
-        }
-        Class<?> result;
-        try {
-            result = Class.forName(className);
-        } catch (final ClassNotFoundException e) {
-            try {
-                result = getArchive().loadClass(className);
-            } catch (final ClassNotFoundException e1) {
-                throw new RuntimeException(e1);
-            }
-        }
-        if (type.getSort() == Type.ARRAY) {
-            final int[] dims = new int[type.getDimensions()];
-            Arrays.fill(dims, 0);
-            result = Array.newInstance(result, dims).getClass();
-        }
-        return result;
-    }
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/Inflater.java b/trunk/processor/src/main/java/org/apache/commons/weaver/Inflater.java
deleted file mode 100644
index 0b1dae4..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/Inflater.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * 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.commons.weaver;
-
-import java.lang.annotation.Annotation;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.weaver.model.ScanResult;
-import org.apache.commons.weaver.model.WeavableClass;
-import org.apache.commons.weaver.model.WeavableConstructor;
-import org.apache.commons.weaver.model.WeavableConstructorParameter;
-import org.apache.commons.weaver.model.WeavableField;
-import org.apache.commons.weaver.model.WeavableMethod;
-import org.apache.commons.weaver.model.WeavableMethodParameter;
-import org.apache.commons.weaver.model.WeavablePackage;
-import org.apache.xbean.finder.AnnotationFinder.ClassInfo;
-import org.apache.xbean.finder.AnnotationFinder.FieldInfo;
-import org.apache.xbean.finder.AnnotationFinder.Info;
-import org.apache.xbean.finder.AnnotationFinder.MethodInfo;
-import org.apache.xbean.finder.AnnotationFinder.PackageInfo;
-import org.apache.xbean.finder.AnnotationFinder.ParameterInfo;
-import org.apache.xbean.finder.Parameter;
-
-/**
- * Adds all classfile annotations to a ScanResult.
- */
-class Inflater {
-    private class InfoMatcher {
-        final Class<? extends Info> type;
-
-        InfoMatcher(final Class<? extends Info> type) {
-            super();
-            this.type = type;
-        }
-
-        boolean test(final Info info) {
-            return type.isInstance(info);
-        }
-
-    }
-
-    private class MethodMatcher extends InfoMatcher {
-        final boolean isCtor;
-
-        MethodMatcher(final boolean isCtor) {
-            super(MethodInfo.class);
-            this.isCtor = isCtor;
-        }
-
-        @Override
-        boolean test(final Info info) {
-            return super.test(info) && ((MethodInfo) info).isConstructor() == isCtor;
-        }
-    }
-
-    private class ParameterMatcher extends InfoMatcher {
-        final boolean isCtor;
-
-        ParameterMatcher(final boolean isCtor) {
-            super(ParameterInfo.class);
-            this.isCtor = isCtor;
-        }
-
-        @Override
-        boolean test(final Info info) {
-            return super.test(info) && ((ParameterInfo) info).getDeclaringMethod().isConstructor() == isCtor;
-        }
-    }
-
-    final Map<PackageInfo, List<Annotation>> packageAnnotations;
-    final Map<ClassInfo, List<Annotation>> classAnnotations;
-    final Map<FieldInfo, List<Annotation>> fieldAnnotations;
-    final Map<MethodInfo, List<Annotation>> ctorAnnotations;
-    final Map<MethodInfo, List<Annotation>> methodAnnotations;
-    final Map<ParameterInfo, List<Annotation>> ctorParameterAnnotations;
-    final Map<ParameterInfo, List<Annotation>> methodParameterAnnotations;
-
-    Inflater(final Map<Info, List<Annotation>> annotationMap) {
-        super();
-
-        this.packageAnnotations = subMap(annotationMap, new InfoMatcher(PackageInfo.class));
-        this.classAnnotations = subMap(annotationMap, new InfoMatcher(ClassInfo.class));
-        this.fieldAnnotations = subMap(annotationMap, new InfoMatcher(FieldInfo.class));
-        this.ctorAnnotations = subMap(annotationMap, new MethodMatcher(true));
-        this.methodAnnotations = subMap(annotationMap, new MethodMatcher(false));
-        this.ctorParameterAnnotations = subMap(annotationMap, new ParameterMatcher(true));
-        this.methodParameterAnnotations = subMap(annotationMap, new ParameterMatcher(false));
-    }
-
-    static <I extends Info> Map<I, List<Annotation>> subMap(final Map<Info, List<Annotation>> source,
-        final InfoMatcher matcher) {
-        final HashMap<I, List<Annotation>> result = new HashMap<I, List<Annotation>>();
-        for (final Map.Entry<Info, List<Annotation>> entry : source.entrySet()) {
-            if (matcher.test(entry.getKey())) {
-                @SuppressWarnings("unchecked")
-                final I key = (I) entry.getKey();
-                result.put(key, entry.getValue());
-            }
-        }
-        return result;
-    }
-
-    ScanResult inflate(final ScanResult scanResult) {
-        for (final WeavablePackage pkg : scanResult.getPackages()) {
-            for (final Map.Entry<PackageInfo, List<Annotation>> entry : packageAnnotations.entrySet()) {
-                if (entry.getKey().getName().equals(pkg.getTarget().getName())) {
-                    pkg.addAnnotations(entry.getValue());
-                }
-            }
-            for (final WeavableClass<?> cls : pkg.getClasses()) {
-                for (final Map.Entry<ClassInfo, List<Annotation>> entry : classAnnotations.entrySet()) {
-                    if (entry.getKey().getName().equals(cls.getTarget().getName())) {
-                        cls.addAnnotations(entry.getValue());
-                    }
-                }
-                for (final WeavableField<?> fld : cls.getFields()) {
-                    for (final Map.Entry<FieldInfo, List<Annotation>> entry : fieldAnnotations.entrySet()) {
-                        try {
-                            if (entry.getKey().get().equals(fld.getTarget())) {
-                                fld.addAnnotations(entry.getValue());
-                            }
-                        } catch (final ClassNotFoundException cnfe) {
-                            continue;
-                        }
-                    }
-                }
-                for (final WeavableConstructor<?> ctor : cls.getConstructors()) {
-                    for (final Map.Entry<MethodInfo, List<Annotation>> entry : ctorAnnotations.entrySet()) {
-                        try {
-                            if (entry.getKey().get().equals(ctor.getTarget())) {
-                                ctor.addAnnotations(entry.getValue());
-                            }
-                        } catch (final ClassNotFoundException cnfe) {
-                            continue;
-                        }
-                    }
-                    for (final WeavableConstructorParameter<?> param : ctor.getParameters()) {
-                        for (final Map.Entry<ParameterInfo, List<Annotation>> entry : ctorParameterAnnotations
-                            .entrySet()) {
-                            try {
-                                final Parameter<?> parameter = entry.getKey().get();
-                                if (parameter.getDeclaringExecutable().equals(ctor.getTarget())
-                                    && param.getTarget().intValue() == parameter.getIndex()) {
-                                    param.addAnnotations(entry.getValue());
-                                }
-                            } catch (final ClassNotFoundException cnfe) {
-                                continue;
-                            }
-                        }
-                    }
-                }
-                for (final WeavableMethod<?> methd : cls.getMethods()) {
-                    for (final Map.Entry<MethodInfo, List<Annotation>> entry : methodAnnotations.entrySet()) {
-                        try {
-                            if (entry.getKey().get().equals(methd.getTarget())) {
-                                methd.addAnnotations(entry.getValue());
-                            }
-                        } catch (final ClassNotFoundException cnfe) {
-                            continue;
-                        }
-                    }
-                    for (final WeavableMethodParameter<?> param : methd.getParameters()) {
-                        for (final Map.Entry<ParameterInfo, List<Annotation>> entry : methodParameterAnnotations
-                            .entrySet()) {
-                            try {
-                                final Parameter<?> parameter = entry.getKey().get();
-                                if (parameter.getDeclaringExecutable().equals(methd.getTarget())
-                                    && param.getTarget().intValue() == parameter.getIndex()) {
-                                    param.addAnnotations(entry.getValue());
-                                }
-                            } catch (final ClassNotFoundException cnfe) {
-                                continue;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return scanResult;
-    }
-
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/LocalWeaveEnvironment.java b/trunk/processor/src/main/java/org/apache/commons/weaver/LocalWeaveEnvironment.java
deleted file mode 100644
index fe00404..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/LocalWeaveEnvironment.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.commons.weaver;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Properties;
-import java.util.logging.Logger;
-
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.weaver.model.WeaveEnvironment;
-
-class LocalWeaveEnvironment extends WeaveEnvironment {
-
-    private final File target;
-
-    protected LocalWeaveEnvironment(final File target, final ClassLoader classLoader, final Properties config,
-        final Logger log) {
-        super(classLoader, config, log);
-        Validate.notNull(target, "target");
-        this.target = target;
-    }
-
-    @Override
-    public boolean deleteResource(final String name) {
-        return new File(target, name).delete();
-    }
-
-    @Override
-    protected OutputStream getOutputStream(final String resourceName) throws IOException {
-        final File file = new File(target, resourceName);
-        final File parent = file.getParentFile();
-        if (parent.exists()) {
-            Validate.validState(parent.isDirectory(), "Cannot write %s to non-directory parent", file);
-        } else {
-            Validate.validState(parent.mkdirs(), "Unable to create output directory %s", parent);
-        }
-        return new FileOutputStream(file);
-    }
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/WeaveProcessor.java b/trunk/processor/src/main/java/org/apache/commons/weaver/WeaveProcessor.java
deleted file mode 100644
index 9de2975..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/WeaveProcessor.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * 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.commons.weaver;
-
-import java.io.File;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.ServiceLoader;
-import java.util.Set;
-import java.util.logging.Logger;
-
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.weaver.model.WeaveEnvironment;
-import org.apache.commons.weaver.spi.Weaver;
-import org.apache.commons.weaver.utils.URLArray;
-import org.apache.xbean.finder.archive.FileArchive;
-
-/**
- * This class discovers and invokes available {@link Weaver} plugins.
- */
-public class WeaveProcessor {
-
-    private static final Logger LOG = Logger.getLogger(WeaveProcessor.class.getName());
-
-    /**
-     * List of picked up weaver plugins.
-     */
-    private static final List<Weaver> WEAVERS;
-
-    static {
-        final List<Weaver> weavers = new ArrayList<Weaver>();
-        for (final Weaver weaver : ServiceLoader.load(Weaver.class)) {
-            weavers.add(weaver);
-        }
-        WEAVERS = Collections.unmodifiableList(weavers);
-    }
-
-    /**
-     * The classpath which will be used to look up cross references during weaving.
-     */
-    private final List<String> classpath;
-
-    /**
-     * The actual path to be woven, replacing any affected classes.
-     */
-    private final File target;
-
-    /**
-     * Properties for configuring discovered plugin modules.
-     */
-    private final Properties configuration;
-
-    /**
-     * Create a new {@link WeaveProcessor} instance.
-     *
-     * @param classpath not {@code null}
-     * @param target not {@code null}
-     * @param configuration not {@code null}
-     */
-    public WeaveProcessor(final List<String> classpath, final File target, final Properties configuration) {
-        super();
-        this.classpath = Validate.notNull(classpath, "classpath");
-        this.target = Validate.notNull(target, "target");
-        Validate.isTrue(!target.exists() || target.isDirectory(), "%s is not a directory", target);
-        this.configuration = Validate.notNull(configuration, "configuration");
-    }
-
-    /**
-     * Weave classes in target directory.
-     */
-    public void weave() {
-        if (!target.exists()) {
-            LOG.warning("Target directory " + target + " does not exist; nothing to do!");
-        }
-        final Set<String> finderClasspath = new LinkedHashSet<String>();
-        finderClasspath.add(target.getAbsolutePath());
-        finderClasspath.addAll(classpath);
-        final ClassLoader classLoader = new URLClassLoader(URLArray.fromPaths(finderClasspath));
-        final Finder finder = new Finder(new FileArchive(classLoader, target));
-        for (final Weaver weaver : WEAVERS) {
-            final WeaveEnvironment env =
-                new LocalWeaveEnvironment(target, classLoader, configuration, Logger.getLogger(weaver.getClass()
-                    .getName()));
-            weaver.process(env, finder);
-        }
-    }
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/AnnotatedElements.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/AnnotatedElements.java
deleted file mode 100644
index 376f865..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/AnnotatedElements.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-import java.lang.annotation.Annotation;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.reflect.AnnotatedElement;
-
-/**
- * Interface defining a means of iterating over a particular type of
- * {@link AnnotatedElement} as well as filtering by annotation type (including
- * annotations with {@link RetentionPolicy#CLASS} retention in addition to those
- * with {@link RetentionPolicy#RUNTIME} retention.
- * @param <T> element type
- */
-public interface AnnotatedElements<T extends AnnotatedElement> extends Iterable<T> {
-    /**
-     * Filter by annotation type.
-     * @param annotationType filter
-     * @return {@link AnnotatedElements}, narrowed
-     */
-    AnnotatedElements<T> with(Class<? extends Annotation> annotationType);
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/NestedWeavable.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/NestedWeavable.java
deleted file mode 100644
index 7a0ef76..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/NestedWeavable.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-/**
- * Describes a {@link Weavable} that lives inside some other {@link Weavable}.
- * @param <SELF> own type
- * @param <TARGET> weavable target type
- * @param <PARENT> enclosing weavable type
- * @param <PARENT_TARGET> parent target type
- */
-public abstract class NestedWeavable
-    <SELF extends NestedWeavable<SELF, TARGET, PARENT, PARENT_TARGET>,
-    TARGET,
-    PARENT extends Weavable<PARENT, PARENT_TARGET>,
-    PARENT_TARGET>
-    extends Weavable<SELF, TARGET> {
-
-    private final PARENT parent;
-
-    /**
-     * Create a new {@link NestedWeavable} instance.
-     * @param target element
-     * @param parent enclosing
-     */
-    protected NestedWeavable(final TARGET target, final PARENT parent) {
-        super(target);
-        this.parent = parent;
-    }
-
-    /**
-     * Get the parent.
-     * @return {@code PARENT}
-     */
-    public PARENT getParent() {
-        return parent;
-    }
-
-    /**
-     * Implement {@link Comparable}.
-     * @param obj {@code SELF}
-     * @return int per {@link Comparable#compareTo(Object)} contract
-     */
-    @Override
-    public final int compareTo(final SELF obj) {
-        final int result = getParent().compareTo(obj.getParent());
-        return result == 0 ? localCompareTo(obj) : result;
-    }
-
-    /**
-     * Compare against {@code o} without respect to {@link #getParent()}.
-     * @param obj SELF{@code SELF}
-     * @return int per {@link Comparable#compareTo(Object)} contract
-     */
-    protected abstract int localCompareTo(SELF obj);
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/ScanRequest.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/ScanRequest.java
deleted file mode 100644
index 08de040..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/ScanRequest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.weaver.spi.Cleaner;
-import org.apache.commons.weaver.spi.Weaver;
-
-/**
- * Scan request object describing the types of elements in which a given {@link Weaver} or {@link Cleaner} is
- * interested.
- */
-public class ScanRequest {
-
-    private final List<WeaveInterest> interests = new ArrayList<WeaveInterest>();
-    private final Set<Class<?>> supertypes = new LinkedHashSet<Class<?>>();
-
-    /**
-     * Register a {@link WeaveInterest}.
-     * @param interest {@link WeaveInterest} to add
-     * @return {@code this}, fluently
-     */
-    public ScanRequest add(final WeaveInterest interest) {
-        if (interest == null) {
-            throw new NullPointerException();
-        }
-        interests.add(interest);
-        return this;
-    }
-
-    /**
-     * Register one or more types whose subtypes you are looking for.
-     * @param types {@link Class}es to add
-     * @return {@code this}, fluently
-     */
-    public ScanRequest addSupertypes(final Class<?>... types) {
-        Collections.addAll(supertypes, Validate.noNullElements(types, "null element at [%s]"));
-        return this;
-    }
-
-    /**
-     * Get registered {@link WeaveInterest}s.
-     * @return {@link Iterable}
-     */
-    public Iterable<WeaveInterest> getInterests() {
-        return Collections.unmodifiableList(interests);
-    }
-
-    /**
-     * Get registered {@link Class}es whose subtypes will be returned.
-     * @return {@link Set}
-     */
-    public Set<Class<?>> getSupertypes() {
-        return Collections.unmodifiableSet(supertypes);
-    }
-
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/ScanResult.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/ScanResult.java
deleted file mode 100644
index 4798374..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/ScanResult.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.concurrent.ConcurrentNavigableMap;
-import java.util.concurrent.ConcurrentSkipListMap;
-
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.weaver.WeaveProcessor;
-import org.apache.commons.weaver.spi.Weaver;
-
-/**
- * <p>Encapsulates the result of scanning based on a {@link ScanRequest}. The
- * scan results are available in a structure corresponding to the Java class
- * hierarchy; i.e.:
- * <pre>
- *   package
- *   |_class
- *     |_field
- *     |_method
- *     | |_method parameter
- *     |_constructor
- *       |_constructor parameter
- * </pre>
- * </p><p>
- * The tree of results can be iterated in this manner using
- * {@link #getPackages()}. However, if a given {@link Weaver} is known not to
- * handle packages but some other element, convenience methods are provided
- * here giving direct access to the various elements that may have been
- * discovered.
- * </p>
- */
-public class ScanResult {
-    private abstract static class Projection<PARENT, CHILD extends AnnotatedElement> implements
-        AnnotatedElements<CHILD> {
-        private final Iterable<PARENT> parents;
-
-        Projection(final Iterable<PARENT> parents) {
-            super();
-            this.parents = parents;
-        }
-
-        protected abstract Iterable<CHILD> childrenOf(PARENT parent);
-
-        @Override
-        public Iterator<CHILD> iterator() {
-            final Iterator<PARENT> parentIterator = parents.iterator();
-            return new Iterator<CHILD>() {
-                private Iterator<CHILD> children = nextChildren();
-
-                @Override
-                public synchronized boolean hasNext() {
-                    return children != null;
-                }
-
-                @Override
-                public synchronized CHILD next() {
-                    if (children == null) {
-                        throw new NoSuchElementException();
-                    }
-                    try {
-                        return children.next();
-                    } finally {
-                        if (!children.hasNext()) {
-                            children = nextChildren();
-                        }
-                    }
-                }
-
-                @Override
-                public void remove() {
-                    throw new UnsupportedOperationException();
-                }
-
-                private Iterator<CHILD> nextChildren() {
-                    while (parentIterator.hasNext()) {
-                        final Iterator<CHILD> prospect = childrenOf(parentIterator.next()).iterator();
-                        if (prospect.hasNext()) {
-                            return prospect;
-                        }
-                    }
-                    return null;
-                }
-            };
-        }
-
-        @Override
-        public AnnotatedElements<CHILD> with(final Class<? extends Annotation> annotationType) {
-            return new AnnotatedWith<CHILD>(this, annotationType);
-        }
-    }
-
-    private static class AnnotatedWith<W extends AnnotatedElement> implements AnnotatedElements<W> {
-        final Iterable<W> wrapped;
-        final Class<? extends Annotation> annotationType;
-
-        AnnotatedWith(final Iterable<W> wrapped, final Class<? extends Annotation> annotationType) {
-            super();
-            this.wrapped = wrapped;
-            this.annotationType = annotationType;
-        }
-
-        @Override
-        public Iterator<W> iterator() {
-            final Iterator<W> iter = wrapped.iterator();
-            return new Iterator<W>() {
-                W next = read();
-
-                private W read() {
-                    while (iter.hasNext()) {
-                        final W element = iter.next();
-                        if (element.isAnnotationPresent(annotationType)) {
-                            return element;
-                        }
-                    }
-                    return null;
-                }
-
-                @Override
-                public boolean hasNext() {
-                    return next != null;
-                }
-
-                @Override
-                public W next() {
-                    if (next == null) {
-                        throw new NoSuchElementException();
-                    }
-                    try {
-                        return next;
-                    } finally {
-                        next = read();
-                    }
-                }
-
-                @Override
-                public void remove() {
-                    throw new UnsupportedOperationException();
-                }
-            };
-        }
-
-        @Override
-        public AnnotatedElements<W> with(final Class<? extends Annotation> annotationType) {
-            return new AnnotatedWith<W>(this, annotationType);
-        }
-
-    }
-
-    private final ConcurrentNavigableMap<String, WeavablePackage> packages =
-        new ConcurrentSkipListMap<String, WeavablePackage>();
-
-    /**
-     * Public for use by {@link WeaveProcessor}.
-     * @param pkg to wrap
-     * @return {@link WeavablePackage}
-     */
-    public WeavablePackage getWeavable(final Package pkg) {
-        final String key = pkg.getName();
-        if (packages.containsKey(key)) {
-            return packages.get(key);
-        }
-        final WeavablePackage result = new WeavablePackage(pkg);
-        final WeavablePackage faster = packages.putIfAbsent(key, result);
-        return faster == null ? result : faster;
-    }
-
-    /**
-     * Public for use by {@link WeaveProcessor}.
-     * @param cls to wrap
-     * @param <T> type
-     * @return {@link WeavableClass}
-     */
-    public <T> WeavableClass<T> getWeavable(final Class<T> cls) {
-        return getWeavable(cls.getPackage()).getWeavable(cls);
-    }
-
-    /**
-     * Public for use by {@link WeaveProcessor}.
-     * @param fld to wrap
-     * @return {@link WeavableField}
-     */
-    public WeavableField<?> getWeavable(final Field fld) {
-        return getWeavable(fld.getDeclaringClass()).getWeavable(fld);
-    }
-
-    /**
-     * Public for use by {@link WeaveProcessor}.
-     * @param methd to wrap
-     * @return {@link WeavableMethod}
-     */
-    public WeavableMethod<?> getWeavable(final Method methd) {
-        return getWeavable(methd.getDeclaringClass()).getWeavable(methd);
-    }
-
-    /**
-     * Public for use by {@link WeaveProcessor}.
-     * @param ctor to wrap
-     * @param <T> type
-     * @return {@link WeavableConstructor}
-     */
-    public <T> WeavableConstructor<T> getWeavable(final Constructor<T> ctor) {
-        return getWeavable(ctor.getDeclaringClass()).getWeavable(ctor);
-    }
-
-    /**
-     * Iterate or filter {@link WeavablePackage}s.
-     * @return {@link AnnotatedElements}
-     */
-    public AnnotatedElements<WeavablePackage> getPackages() {
-        return new AnnotatedElements<WeavablePackage>() {
-
-            @Override
-            public Iterator<WeavablePackage> iterator() {
-                return packages.values().iterator();
-            }
-
-            @Override
-            public AnnotatedElements<WeavablePackage> with(final Class<? extends Annotation> annotationType) {
-                return new AnnotatedWith<WeavablePackage>(packages.values(), annotationType);
-            }
-        };
-    }
-
-    /**
-     * Iterate or filter {@link WeavableClass}es.
-     * @return {@link AnnotatedElements}
-     */
-    public AnnotatedElements<WeavableClass<?>> getClasses() {
-        return new Projection<WeavablePackage, WeavableClass<?>>(getPackages()) {
-
-            @Override
-            protected Iterable<WeavableClass<?>> childrenOf(final WeavablePackage parent) {
-                return parent.getClasses();
-            }
-        };
-    }
-
-    /**
-     * Iterate or filter {@link WeavableClass}es assignable to {@code supertype}.
-     * @param supertype {@link Class} whose subtypes are sought
-     * @return {@link AnnotatedElements}
-     */
-    public AnnotatedElements<WeavableClass<?>> getClassesAssignableTo(final Class<?> supertype) {
-        Validate.notNull(supertype, "supertype");
-
-        return new Projection<WeavablePackage, WeavableClass<?>>(getPackages()) {
-
-            @Override
-            protected Iterable<WeavableClass<?>> childrenOf(final WeavablePackage parent) {
-                return parent.getClasses();
-            }
-
-            @Override
-            public Iterator<WeavableClass<?>> iterator() {
-                final Iterator<WeavableClass<?>> toWrap = super.iterator();
-                return new Iterator<WeavableClass<?>>() {
-                    {
-                        read();
-                    }
-
-                    private WeavableClass<?> next;
-
-                    private void read() {
-                        while (toWrap.hasNext()) {
-                            final WeavableClass<?> test = toWrap.next();
-                            if (supertype.isAssignableFrom(test.getTarget())) {
-                                next = test;
-                                return;
-                            }
-                        }
-                        next = null;
-                    }
-
-                    @Override
-                    public boolean hasNext() {
-                        return next != null;
-                    }
-
-                    @Override
-                    public WeavableClass<?> next() {
-                        try {
-                            return next;
-                        } finally {
-                            read();
-                        }
-                    }
-
-                    @Override
-                    public void remove() {
-                        toWrap.remove();
-                    }
-                };
-            }
-        };
-    }
-
-    /**
-     * Iterate or filter {@link WeavableField}s.
-     * @return {@link AnnotatedElements}
-     */
-    public AnnotatedElements<WeavableField<?>> getFields() {
-        return new Projection<WeavableClass<?>, WeavableField<?>>(getClasses()) {
-
-            @Override
-            protected Iterable<WeavableField<?>> childrenOf(final WeavableClass<?> parent) {
-                @SuppressWarnings({ "unchecked", "rawtypes" })
-                final Iterable<WeavableField<?>> result = ((WeavableClass) parent).getFields();
-                return result;
-            }
-        };
-    }
-
-    /**
-     * Iterate or filter {@link WeavableConstructor}s.
-     * @return {@link AnnotatedElements}
-     */
-    public AnnotatedElements<WeavableConstructor<?>> getConstructors() {
-        return new Projection<WeavableClass<?>, WeavableConstructor<?>>(getClasses()) {
-
-            @Override
-            protected Iterable<WeavableConstructor<?>> childrenOf(final WeavableClass<?> parent) {
-                @SuppressWarnings({ "unchecked", "rawtypes" })
-                final Iterable<WeavableConstructor<?>> result = ((WeavableClass) parent).getConstructors();
-                return result;
-            }
-        };
-    }
-
-    /**
-     * Iterate or filter {@link WeavableMethod}s.
-     * @return {@link AnnotatedElements}
-     */
-    public AnnotatedElements<WeavableMethod<?>> getMethods() {
-        return new Projection<WeavableClass<?>, WeavableMethod<?>>(getClasses()) {
-
-            @Override
-            protected Iterable<WeavableMethod<?>> childrenOf(final WeavableClass<?> parent) {
-                @SuppressWarnings({ "unchecked", "rawtypes" })
-                final Iterable<WeavableMethod<?>> result = ((WeavableClass) parent).getMethods();
-                return result;
-            }
-        };
-    }
-
-    /**
-     * Iterate or filter {@link WeavableMethodParameter}s.
-     * @return {@link AnnotatedElements}
-     */
-    public AnnotatedElements<WeavableMethodParameter<?>> getMethodParameters() {
-        return new Projection<WeavableMethod<?>, WeavableMethodParameter<?>>(getMethods()) {
-
-            @Override
-            protected Iterable<WeavableMethodParameter<?>> childrenOf(final WeavableMethod<?> parent) {
-                @SuppressWarnings({ "unchecked", "rawtypes" })
-                final Iterable<WeavableMethodParameter<?>> result = ((WeavableMethod) parent).getParameters();
-                return result;
-            }
-        };
-    }
-
-    /**
-     * Iterate or filter {@link WeavableConstructorParameter}s.
-     * @return {@link AnnotatedElements}
-     */
-    public AnnotatedElements<WeavableConstructorParameter<?>> getConstructorParameters() {
-
-        return new Projection<WeavableConstructor<?>, WeavableConstructorParameter<?>>(getConstructors()) {
-
-            @Override
-            protected Iterable<WeavableConstructorParameter<?>> childrenOf(final WeavableConstructor<?> parent) {
-                @SuppressWarnings({ "unchecked", "rawtypes" })
-                final Iterable<WeavableConstructorParameter<?>> result = ((WeavableConstructor) parent).getParameters();
-                return result;
-            }
-        };
-    }
-
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/Scanner.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/Scanner.java
deleted file mode 100644
index 23069b6..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/Scanner.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-/**
- * Scanner interface.
- */
-public interface Scanner {
-
-    /**
-     * Perform the requested scan.
-     *
-     * @param request to process
-     * @return {@link ScanResult}
-     */
-    ScanResult scan(ScanRequest request);
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/Weavable.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/Weavable.java
deleted file mode 100644
index 5d8ff69..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/Weavable.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-import java.lang.annotation.Annotation;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.reflect.AnnotatedElement;
-import java.util.Arrays;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-
-/**
- * {@link Weavable} extends {@link AnnotatedElement} to include
- * {@link RetentionPolicy#CLASS} annotations.
- *
- * @param <SELF> own type
- * @param <TARGET> target type
- */
-public abstract class Weavable<SELF extends Weavable<SELF, TARGET>, TARGET> implements Comparable<SELF>,
-    AnnotatedElement {
-    private static final Annotation[] EMPTY_ANNOTATION_ARRAY = new Annotation[0];
-
-    private final TARGET target;
-    private Set<Annotation> annotations;
-
-    /**
-     * Create a new {@link Weavable} instance.
-     * @param target {@code TARGET}
-     */
-    protected Weavable(final TARGET target) {
-        this.target = target;
-        if (target instanceof AnnotatedElement) {
-            addAnnotations(((AnnotatedElement) target).getAnnotations());
-        }
-    }
-
-    /**
-     * Add one or more annotations.
-     * @param toAdd {@link Annotation}[]
-     * @return whether any change was made
-     */
-    public final boolean addAnnotations(final Annotation... toAdd) {
-        Validate.noNullElements(toAdd);
-        return addAnnotations(Arrays.asList(toAdd));
-    }
-
-    /**
-     * Add annotations from an {@link Iterable}.
-     * @param toAdd {@link Iterable} of {@link Annotation}
-     * @return whether any change was made
-     */
-    public final boolean addAnnotations(final Iterable<Annotation> toAdd) {
-        if (toAdd == null) {
-            return false;
-        }
-        synchronized (this) {
-            if (annotations == null) {
-                annotations = new LinkedHashSet<Annotation>();
-            }
-            boolean result = false;
-            for (final Annotation ann : toAdd) {
-                if (ann == null) {
-                    continue;
-                }
-                result = annotations.add(ann) || result;
-            }
-            return result;
-        }
-    }
-
-    /**
-     * Get the target of this {@link Weavable}.
-     * @return {@code TARGET}
-     */
-    public TARGET getTarget() {
-        return target;
-    }
-
-    /**
-     * Get all {@link Annotation}s associated with this element.
-     * @return {@link Annotation}[]
-     */
-    @Override
-    public final synchronized Annotation[] getAnnotations() {
-        if (annotations == null) {
-            return EMPTY_ANNOTATION_ARRAY; //NOPMD - no problem sharing zero-length array
-        }
-        return annotations.toArray(new Annotation[annotations.size()]);
-    }
-
-    /**
-     * Get any instance of {@code annotationClass} attached to {@link #getTarget()}.
-     * @param annotationClass {@link Class} annotation type
-     * @param <T> annotation type
-     * @return {@code T} instance if available, else {@code null}
-     */
-    @Override
-    public synchronized <T extends Annotation> T getAnnotation(final Class<T> annotationClass) {
-        if (annotations == null) {
-            return null;
-        }
-        for (final Annotation prospect : annotations) {
-            if (annotationClass.equals(prospect.annotationType())) {
-                @SuppressWarnings("unchecked")
-                final T result = (T) prospect;
-                return result;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Overridden to return {@link #getAnnotations()}.
-     * @return {@link Annotation}[]
-     */
-    @Override
-    public final Annotation[] getDeclaredAnnotations() {
-        return getAnnotations();
-    }
-
-    /**
-     * Learn whether an annotation of type {@code annotationClass} is present.
-     * @param annotationClass to find
-     * @return {@code boolean}
-     */
-    @Override
-    public boolean isAnnotationPresent(final Class<? extends Annotation> annotationClass) {
-        return getAnnotation(annotationClass) != null;
-    }
-
-    /**
-     * Return a {@link String} representation of this {@link Weavable}.
-     * @return {@link String}
-     */
-    @Override
-    public String toString() {
-        return "Weavable " + getTarget().toString();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj == this) {
-            return true;
-        }
-        if (!getClass().isInstance(obj)) {
-            return false;
-        }
-        return getTarget().equals(((Weavable<?, ?>) obj).getTarget());
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int hashCode() {
-        return new HashCodeBuilder().append(getTarget()).toHashCode();
-    }
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableClass.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableClass.java
deleted file mode 100644
index 38f579e..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableClass.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.concurrent.ConcurrentNavigableMap;
-import java.util.concurrent.ConcurrentSkipListMap;
-
-import org.apache.commons.weaver.utils.Args;
-
-/**
- * {@link Weavable} {@link Class}.
- *
- * @param <T> type
- */
-public class WeavableClass<T> extends NestedWeavable<WeavableClass<T>, Class<T>, WeavablePackage, Package> {
-    private final ConcurrentNavigableMap<String, WeavableField<T>> fields =
-        new ConcurrentSkipListMap<String, WeavableField<T>>();
-
-    private final ConcurrentNavigableMap<Constructor<T>, WeavableConstructor<T>> ctors =
-        new ConcurrentSkipListMap<Constructor<T>, WeavableConstructor<T>>(new Comparator<Constructor<?>>() {
-
-            @Override
-            public int compare(final Constructor<?> ctor1, final Constructor<?> ctor2) {
-                return Args.compare(ctor1.getParameterTypes(), ctor2.getParameterTypes());
-            }
-        });
-
-    private final ConcurrentNavigableMap<Method, WeavableMethod<T>> methods =
-        new ConcurrentSkipListMap<Method, WeavableMethod<T>>(new Comparator<Method>() {
-
-            @Override
-            public int compare(final Method methd1, final Method methd2) {
-                final int result = methd1.getName().compareTo(methd2.getName());
-                return result == 0 ? Args.compare(methd1.getParameterTypes(), methd2.getParameterTypes()) : result;
-            }
-        });
-
-    /**
-     * Create a new {@link WeavableClass} instance.
-     * @param target {@link Class}
-     * @param parent {@link WeavablePackage} enclosing
-     */
-    public WeavableClass(final Class<T> target, final WeavablePackage parent) {
-        super(target, parent);
-    }
-
-    /**
-     * Get a {@link WeavableField} representing {@code fld}.
-     * @param fld to wrap
-     * @return {@link WeavableField}
-     */
-    public WeavableField<T> getWeavable(final Field fld) {
-        final String key = fld.getName();
-        if (fields.containsKey(key)) {
-            final WeavableField<T> result = fields.get(key);
-            return result;
-        }
-        final WeavableField<T> result = new WeavableField<T>(fld, this);
-        final WeavableField<T> faster = fields.putIfAbsent(key, result);
-        return faster == null ? result : faster;
-    }
-
-    /**
-     * Get a {@link WeavableMethod} representing {@code mt}.
-     * @param methd to wrap
-     * @return {@link WeavableMethod}
-     */
-    public WeavableMethod<T> getWeavable(final Method methd) {
-        if (methods.containsKey(methd)) {
-            final WeavableMethod<T> result = methods.get(methd);
-            return result;
-        }
-        final WeavableMethod<T> result = new WeavableMethod<T>(methd, this);
-        final WeavableMethod<T> faster = methods.putIfAbsent(methd, result);
-        return faster == null ? result : faster;
-    }
-
-    /**
-     * Get a {@link WeavableConstructor} representing {@code ctor}.
-     * @param ctor to wrap
-     * @return {@link WeavableConstructor}
-     */
-    public WeavableConstructor<T> getWeavable(final Constructor<T> ctor) {
-        if (ctors.containsKey(ctor)) {
-            final WeavableConstructor<T> result = ctors.get(ctor);
-            return result;
-        }
-        final WeavableConstructor<T> result = new WeavableConstructor<T>(ctor, this);
-        final WeavableConstructor<T> faster = ctors.putIfAbsent(ctor, result);
-        return faster == null ? result : faster;
-    }
-
-    /**
-     * Get {@link WeavableField}s of this {@link WeavableClass}.
-     * @return {@link Iterable}
-     */
-    public Iterable<WeavableField<T>> getFields() {
-        return Collections.unmodifiableCollection(fields.values());
-    }
-
-    /**
-     * Get {@link WeavableConstructor}s of this {@link WeavableClass}.
-     * @return {@link Iterable}
-     */
-    public Iterable<WeavableConstructor<T>> getConstructors() {
-        return Collections.unmodifiableCollection(ctors.values());
-    }
-
-    /**
-     * Get {@link WeavableMethod}s of this {@link WeavableClass}.
-     * @return {@link Iterable}
-     */
-    public Iterable<WeavableMethod<T>> getMethods() {
-        return Collections.unmodifiableCollection(methods.values());
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected int localCompareTo(final WeavableClass<T> obj) {
-        return getTarget().getName().compareTo(obj.getTarget().getName());
-    }
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableConstructor.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableConstructor.java
deleted file mode 100644
index 79c1cb0..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableConstructor.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-import java.lang.reflect.Constructor;
-
-/**
- * {@link Weavable} {@link Constructor}.
- *
- * @param <T> type constructed
- */
-public class WeavableConstructor<T> extends
-    WeavableExecutable<WeavableConstructor<T>, Constructor<T>, T, WeavableConstructorParameter<T>> {
-
-    /**
-     * Create a new {@link WeavableConstructor} instance.
-     * @param target {@link Constructor}
-     * @param parent enclosing {@link WeavableClass}
-     */
-    public WeavableConstructor(final Constructor<T> target, final WeavableClass<T> parent) {
-        super(target, parent);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected Class<?>[] getParameterTypes() {
-        return getTarget().getParameterTypes();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected WeavableConstructorParameter<T> createParameter(final int index) {
-        return new WeavableConstructorParameter<T>(Integer.valueOf(index), this);
-    }
-
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableConstructorParameter.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableConstructorParameter.java
deleted file mode 100644
index 5ca5cc9..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableConstructorParameter.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-import java.lang.reflect.Constructor;
-
-/**
- * {@link Weavable} {@link Constructor} parameter.
- *
- * @param <T> constructed type
- */
-public class WeavableConstructorParameter<T> extends
-    WeavableParameter<WeavableConstructorParameter<T>, WeavableConstructor<T>, Constructor<T>, T> {
-
-    /**
-     * Create a new {@link WeavableConstructorParameter} instance.
-     * @param target parameter index
-     * @param parent declaring {@link WeavableConstructor}
-     */
-    public WeavableConstructorParameter(final Integer target, final WeavableConstructor<T> parent) {
-        super(target, parent);
-    }
-
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableExecutable.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableExecutable.java
deleted file mode 100644
index 4a8b90f..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableExecutable.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-import java.lang.reflect.Member;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.commons.weaver.utils.Args;
-
-/**
- * Represents a {@link Weavable} "executable".
- *
- * @param <SELF> own type
- * @param <TARGET> target executable type
- * @param <T> owning type
- * @param <P> parameter type
- */
-public abstract class WeavableExecutable
-    <SELF extends WeavableExecutable<SELF, TARGET, T, P>,
-    TARGET extends Member,
-    T,
-    P extends WeavableParameter<P, SELF, TARGET, T>>
-    extends NestedWeavable<SELF, TARGET, WeavableClass<T>, Class<T>> {
-
-    private final List<P> parameters;
-
-    /**
-     * Create a new {@link WeavableExecutable} instance.
-     * @param target executable
-     * @param parent enclosing {@link WeavableClass}
-     */
-    protected WeavableExecutable(final TARGET target, final WeavableClass<T> parent) {
-        super(target, parent);
-        final List<P> params = new ArrayList<P>();
-        final int paramCount = getParameterTypes().length;
-        for (int i = 0; i < paramCount; i++) {
-            params.add(createParameter(i));
-        }
-        parameters = Collections.unmodifiableList(params);
-    }
-
-    /**
-     * Create an appropriate {@link WeavableParameter} object.
-     * @param index of parameter
-     * @return {@code P}
-     */
-    protected abstract P createParameter(int index);
-
-    /**
-     * Get the parameter types of {@link #getTarget()}.
-     * @return {@link Class}[]
-     */
-    protected abstract Class<?>[] getParameterTypes();
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected int localCompareTo(final SELF obj) {
-        return Args.compare(getParameterTypes(), obj.getParameterTypes());
-    }
-
-    /**
-     * Get the parameter at the specified index.
-     * @param index {@code int}
-     * @return {@code P}
-     */
-    public P getWeavableParameter(final int index) {
-        return parameters.get(index);
-    }
-
-    /**
-     * Get the parameters declared by this {@link WeavableExecutable}.
-     * @return {@link Iterable} of {@code P}
-     */
-    public Iterable<P> getParameters() {
-        return parameters;
-    }
-
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableField.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableField.java
deleted file mode 100644
index 034ed81..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableField.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-import java.lang.reflect.Field;
-
-/**
- * Represents a {@link Weavable} {@link Field}.
- *
- * @param <T> enclosing type
- */
-public class WeavableField<T> extends NestedWeavable<WeavableField<T>, Field, WeavableClass<T>, Class<T>> {
-
-    /**
-     * Create a new {@link WeavableField} instance.
-     * @param target field
-     * @param parent enclosing {@link WeavableClass}
-     */
-    public WeavableField(final Field target, final WeavableClass<T> parent) {
-        super(target, parent);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected int localCompareTo(final WeavableField<T> obj) {
-        return getTarget().getName().compareTo(obj.getTarget().getName());
-    }
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableMethod.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableMethod.java
deleted file mode 100644
index eb79dec..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableMethod.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-import java.lang.reflect.Method;
-
-/**
- * Represents a {@link Weavable} {@link Method}.
- *
- * @param <T> enclosing type
- */
-public class WeavableMethod<T> extends WeavableExecutable<WeavableMethod<T>, Method, T, WeavableMethodParameter<T>> {
-
-    /**
-     * Create a new {@link WeavableMethod} instance.
-     * @param target method
-     * @param parent enclosing {@link WeavableClass}
-     */
-    public WeavableMethod(final Method target, final WeavableClass<T> parent) {
-        super(target, parent);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected Class<?>[] getParameterTypes() {
-        return getTarget().getParameterTypes();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected int localCompareTo(final WeavableMethod<T> obj) {
-        final int result = getTarget().getName().compareTo(obj.getTarget().getName());
-        return result == 0 ? super.localCompareTo(obj) : result;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected WeavableMethodParameter<T> createParameter(final int index) {
-        return new WeavableMethodParameter<T>(Integer.valueOf(index), this);
-    }
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableMethodParameter.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableMethodParameter.java
deleted file mode 100644
index 642119a..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableMethodParameter.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-import java.lang.reflect.Method;
-
-/**
- * {@link Weavable} {@link Method} parameter.
- *
- * @param <T> type of enclosing class
- */
-public class WeavableMethodParameter<T> extends
-    WeavableParameter<WeavableMethodParameter<T>, WeavableMethod<T>, Method, T> {
-
-    /**
-     * Create a new {@link WeavableMethodParameter} instance.
-     * @param target index
-     * @param parent declaring {@link WeavableMethod}
-     */
-    public WeavableMethodParameter(final Integer target, final WeavableMethod<T> parent) {
-        super(target, parent);
-    }
-
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavablePackage.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavablePackage.java
deleted file mode 100644
index 993ac26..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavablePackage.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-import java.util.Collections;
-import java.util.concurrent.ConcurrentNavigableMap;
-import java.util.concurrent.ConcurrentSkipListMap;
-
-/**
- * {@link Weavable} {@link Package}.
- */
-public class WeavablePackage extends Weavable<WeavablePackage, Package> {
-
-    private final ConcurrentNavigableMap<String, WeavableClass<?>> clazzes =
-        new ConcurrentSkipListMap<String, WeavableClass<?>>();
-
-    /**
-     * Create a new {@link WeavablePackage} instance.
-     * @param target package
-     */
-    public WeavablePackage(final Package target) {
-        super(target);
-    }
-
-    /**
-     * Get a {@link WeavableClass} representing {@code cls}.
-     * @param cls to wrap
-     * @param <T> generic type of {@code cls}
-     * @return {@link WeavableClass}
-     */
-    public synchronized <T> WeavableClass<T> getWeavable(final Class<T> cls) {
-        final String key = cls.getName();
-        if (clazzes.containsKey(key)) {
-            @SuppressWarnings("unchecked")
-            final WeavableClass<T> result = (WeavableClass<T>) clazzes.get(key);
-            return result;
-        }
-        final WeavableClass<T> result = new WeavableClass<T>(cls, this);
-        @SuppressWarnings("unchecked")
-        final WeavableClass<T> faster = (WeavableClass<T>) clazzes.putIfAbsent(key, result);
-        return faster == null ? result : faster;
-    }
-
-    /**
-     * Get enclosed {@link WeavableClass}es.
-     * @return {@link Iterable}
-     */
-    public Iterable<WeavableClass<?>> getClasses() {
-        return Collections.unmodifiableCollection(clazzes.values());
-    }
-
-    /**
-     * Implement {@link Comparable}.
-     * @param arg0 {@link WeavablePackage} to compare against
-     * @return int per {@link Comparable#compareTo(Object)} contract
-     */
-    @Override
-    public int compareTo(final WeavablePackage arg0) {
-        return getTarget().getName().compareTo(arg0.getTarget().getName());
-    }
-
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableParameter.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableParameter.java
deleted file mode 100644
index 9ea5659..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeavableParameter.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-import java.lang.reflect.Member;
-
-/**
- * Represents the parameter of an executable.
- *
- * @param <SELF> own type
- * @param <PARENT> {@link WeavableExecutable} type
- * @param <PARENT_TARGET> target executable of parent
- * @param <T> executable's owning type
- */
-public abstract class WeavableParameter
-    <SELF extends WeavableParameter<SELF, PARENT, PARENT_TARGET, T>,
-    PARENT extends WeavableExecutable<PARENT, PARENT_TARGET, T, SELF>,
-    PARENT_TARGET extends Member,
-    T>
-    extends NestedWeavable<SELF, Integer, PARENT, PARENT_TARGET> {
-
-    /**
-     * Create a new {@link WeavableParameter} instance.
-     * @param target index
-     * @param parent executable
-     */
-    protected WeavableParameter(final Integer target, final PARENT parent) {
-        super(target, parent);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected int localCompareTo(final SELF obj) {
-        return getTarget().compareTo(getTarget());
-    }
-
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeaveEnvironment.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeaveEnvironment.java
deleted file mode 100644
index e851127..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeaveEnvironment.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Properties;
-import java.util.logging.Logger;
-
-import javax.activation.DataSource;
-
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.weaver.spi.Cleaner;
-import org.apache.commons.weaver.spi.Weaver;
-
-/**
- * Encapsulates the environment in which a {@link Weaver} or {@link Cleaner} must operate.
- */
-public abstract class WeaveEnvironment {
-    private static final String CONTENT_TYPE = "application/octet-stream";
-
-    private class Resource implements DataSource {
-        private final String name;
-
-        Resource(final String name) {
-            this.name = name;
-        }
-
-        /**
-         * Get the content type, always "application/octet-stream".
-         * @return {@link String}
-         */
-        @Override
-        public String getContentType() {
-            return CONTENT_TYPE;
-        }
-
-        /**
-         * Get an {@link InputStream} for reading this {@link Resource}.
-         */
-        @Override
-        public InputStream getInputStream() throws IOException {
-            return classLoader.getResourceAsStream(name);
-        }
-
-        /**
-         * Get the name of this {@link Resource}.
-         * @return {@link String}
-         */
-        @Override
-        public String getName() {
-            return name;
-        }
-
-        /**
-         * Get an {@link OutputStream} for writing to this {@link Resource}.
-         * @return {@link OutputStream}
-         */
-        @Override
-        public OutputStream getOutputStream() throws IOException {
-            return WeaveEnvironment.this.getOutputStream(name);
-        }
-    }
-
-    /**
-     * ClassLoader containing scannable and weavable classes.
-     */
-    public final ClassLoader classLoader;
-
-    /**
-     * Configuration properties. By convention, any configuration property should start with its name, e.g.
-     * "privilizer".
-     */
-    public final Properties config;
-
-    private final Logger log;
-
-    /**
-     * Create a new {@link WeaveEnvironment}.
-     * @param classLoader property
-     * @param config property
-     * @param log property
-     */
-    protected WeaveEnvironment(final ClassLoader classLoader, final Properties config, final Logger log) {
-        super();
-        this.classLoader = classLoader;
-        this.config = (Properties) Validate.notNull(config, "config").clone();
-        this.log = log;
-    }
-
-    /**
-     * Handle a debug message.
-     * @param message text
-     * @param args format
-     * @see String#format(String, Object...)
-     */
-    public void debug(final String message, final Object... args) {
-        log.fine(String.format(message, args));
-    }
-
-    /**
-     * Handle a verbose message.
-     * @param message text
-     * @param args format
-     * @see String#format(String, Object...)
-     */
-    public void verbose(final String message, final Object... args) {
-        log.fine(String.format(message, args));
-    }
-
-    /**
-     * Handle a warning message.
-     * @param message text
-     * @param args format
-     * @see String#format(String, Object...)
-     */
-    public void warn(final String message, final Object... args) {
-        log.warning(String.format(message, args));
-    }
-
-    /**
-     * Handle an info message.
-     * @param message text
-     * @param args format
-     * @see String#format(String, Object...)
-     */
-    public void info(final String message, final Object... args) {
-        log.info(String.format(message, args));
-    }
-
-    /**
-     * Handle an error message.
-     * @param message text
-     * @param args format
-     * @see String#format(String, Object...)
-     */
-    public void error(final String message, final Object... args) {
-        log.severe(String.format(message, args));
-    }
-
-    /**
-     * Get a {@link DataSource} representing {@code cls}.
-     * @param cls type
-     * @return {@link DataSource}
-     */
-    public final DataSource getClassfile(final Class<?> cls) {
-        return getClassfile(cls.getName());
-    }
-
-    /**
-     * Get a {@link DataSource} for the specified class.
-     * @param classname of type
-     * @return {@link DataSource}
-     */
-    public final DataSource getClassfile(final String classname) {
-        return getResource(getResourceName(classname));
-    }
-
-    /**
-     * Get a {@link DataSource} for the specified resource.
-     * @param name of resource
-     * @return {@link DataSource}
-     */
-    public final DataSource getResource(final String name) {
-        return new Resource(name);
-    }
-
-    /**
-     * Delete the classfile for {@code cls}.
-     * @param cls type
-     * @return whether successful
-     */
-    public final boolean deleteClassfile(final Class<?> cls) {
-        return deleteClassfile(cls.getName());
-    }
-
-    /**
-     * Delete the classfile for the specified class.
-     * @param classname of type
-     * @return whether successful
-     */
-    public final boolean deleteClassfile(final String classname) {
-        return deleteResource(getResourceName(classname));
-    }
-
-    /**
-     * Delete the specified resource.
-     * @param name to delete
-     * @return whether successful
-     */
-    public abstract boolean deleteResource(String name);
-
-    /**
-     * Open an {@link OutputStream} for the specified resource.
-     * @param resourceName to open
-     * @return {@link OutputStream}
-     * @throws IOException on error
-     */
-    protected abstract OutputStream getOutputStream(String resourceName) throws IOException;
-
-    /**
-     * Convert a classname into a resource name.
-     * @param classname to convert
-     * @return String
-     */
-    protected static String getResourceName(final String classname) {
-        return classname.replace('.', '/') + ".class";
-    }
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeaveInterest.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeaveInterest.java
deleted file mode 100644
index 6b23fac..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeaveInterest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.commons.weaver.model;
-
-import java.lang.annotation.Annotation;
-import java.lang.annotation.ElementType;
-
-/**
- * Weave interest composed of annotation type and target element type.
- */
-public final class WeaveInterest {
-
-    /**
-     * Observed annotation type.
-     */
-    public final Class<? extends Annotation> annotationType;
-
-    /**
-     * Attached element type.
-     */
-    public final ElementType target;
-
-    private WeaveInterest(final Class<? extends Annotation> annotationType, final ElementType target) {
-        super();
-        this.annotationType = annotationType;
-        this.target = target;
-    }
-
-    /**
-     * Get a {@link WeaveInterest}.
-     * @param annotationType observed annotation type
-     * @param target attached element type
-     * @return {@link WeaveInterest}
-     */
-    public static WeaveInterest of(final Class<? extends Annotation> annotationType, final ElementType target) {
-        return new WeaveInterest(annotationType, target);
-    }
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/model/package-info.java b/trunk/processor/src/main/java/org/apache/commons/weaver/model/package-info.java
deleted file mode 100644
index 630c424..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/model/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * Defines a domain model for weaving operations.
- */
-package org.apache.commons.weaver.model;
\ No newline at end of file
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/package-info.java b/trunk/processor/src/main/java/org/apache/commons/weaver/package-info.java
deleted file mode 100644
index 60bb59a..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * Defines the objects needed to perform filesystem-based weaving.
- */
-package org.apache.commons.weaver;
\ No newline at end of file
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/spi/Cleaner.java b/trunk/processor/src/main/java/org/apache/commons/weaver/spi/Cleaner.java
deleted file mode 100644
index edcd29c..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/spi/Cleaner.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.commons.weaver.spi;
-
-import org.apache.commons.weaver.model.Scanner;
-import org.apache.commons.weaver.model.WeaveEnvironment;
-
-/**
- * SPI to provide a means for a weaver module to remove woven classes during
- * incremental builds, if necessary.
- */
-public interface Cleaner {
-    /**
-     * Using the supplied {@link Scanner}, clean a {@link WeaveEnvironment}.
-     * @param environment to use
-     * @param scanner to use
-     * @return whether any work was done.
-     */
-    boolean clean(WeaveEnvironment environment, Scanner scanner);
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/spi/Weaver.java b/trunk/processor/src/main/java/org/apache/commons/weaver/spi/Weaver.java
deleted file mode 100644
index db90cea..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/spi/Weaver.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.commons.weaver.spi;
-
-import org.apache.commons.weaver.model.Scanner;
-import org.apache.commons.weaver.model.WeaveEnvironment;
-
-/**
- * A {@link Weaver} implementation performs the byte code enhancement in the
- * classes.
- */
-public interface Weaver {
-    /**
-     * Using the supplied {@link Scanner}, process a {@link WeaveEnvironment}.
-     * @param environment to use
-     * @param scanner to use
-     * @return whether any work was done.
-     */
-    boolean process(WeaveEnvironment environment, Scanner scanner);
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/spi/package-info.java b/trunk/processor/src/main/java/org/apache/commons/weaver/spi/package-info.java
deleted file mode 100644
index 68c10fb..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/spi/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * Defines the weaver module service provider interface (SPI).
- */
-package org.apache.commons.weaver.spi;
\ No newline at end of file
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/utils/Annotations.java b/trunk/processor/src/main/java/org/apache/commons/weaver/utils/Annotations.java
deleted file mode 100644
index bd7e26c..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/utils/Annotations.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * 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.commons.weaver.utils;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.util.Arrays;
-import java.util.Map;
-
-import org.apache.commons.lang3.AnnotationUtils;
-import org.apache.commons.lang3.Validate;
-
-/**
- * Provide annotation-related utility methods.
- */
-public final class Annotations {
-    private Annotations() {
-    }
-
-    /**
-     * Create an annotation instance.
-     * @param annotationType type
-     * @param elements values
-     * @param <A> generic annotation type
-     * @return {@code A}
-     */
-    public static <A extends Annotation> A instanceOf(final Class<A> annotationType, final Map<String, ?> elements) {
-        final ClassLoader proxyClassLoader = Validate.notNull(annotationType, "annotationType").getClassLoader();
-        final InvocationHandler invocationHandler = new InvocationHandler() {
-
-            @Override
-            public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
-                if (method.getDeclaringClass().equals(annotationType)) {
-                    if (elements.containsKey(method.getName())) {
-                        return elements.get(method.getName());
-                    }
-                    return method.getDefaultValue();
-                }
-                if ("annotationType".equals(method.getName()) && method.getParameterTypes().length == 0) {
-                    return annotationType;
-                }
-                if ("equals".equals(method.getName())
-                    && Arrays.equals(method.getParameterTypes(), new Class[] { Object.class })) {
-                    return AnnotationUtils.equals((Annotation) proxy, (Annotation) args[0]);
-                }
-                if ("hashCode".equals(method.getName()) && method.getParameterTypes().length == 0) {
-                    return AnnotationUtils.hashCode((Annotation) proxy);
-                }
-                if ("toString".equals(method.getName()) && method.getParameterTypes().length == 0) {
-                    return AnnotationUtils.toString((Annotation) proxy);
-                }
-                throw new UnsupportedOperationException();
-            }
-        };
-        @SuppressWarnings("unchecked")
-        final A result =
-            (A) Proxy.newProxyInstance(proxyClassLoader, new Class[] { annotationType }, invocationHandler);
-        return result;
-    }
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/utils/Args.java b/trunk/processor/src/main/java/org/apache/commons/weaver/utils/Args.java
deleted file mode 100644
index ba0c2f3..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/utils/Args.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.commons.weaver.utils;
-
-/**
- * Argument/Parameter-related utilities.
- */
-public final class Args {
-
-    private Args() {
-    }
-
-    /**
-     * Compare two parameter type arrays.
-     * @param paramTypes1 lhs
-     * @param paramTypes2 rhs
-     * @return {@code int} as specified by
-     *         {@link java.util.Comparator#compare(Object, Object)}
-     */
-    public static int compare(final Class<?>[] paramTypes1, final Class<?>[] paramTypes2) {
-        final int param = 0;
-        while (param < paramTypes1.length) {
-            if (param >= paramTypes2.length) {
-                return 1;
-            }
-            final int test = paramTypes1[param].getName().compareTo(paramTypes2[param].getName());
-            if (test == 0) {
-                continue;
-            }
-            return test;
-        }
-        if (paramTypes1.length == paramTypes2.length) {
-            return 0;
-        }
-        return -1;
-    }
-
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/utils/URLArray.java b/trunk/processor/src/main/java/org/apache/commons/weaver/utils/URLArray.java
deleted file mode 100644
index 5a36acb..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/utils/URLArray.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * 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.commons.weaver.utils;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-
-/**
- * {@link URL} Array utilities.
- */
-public final class URLArray {
-    private URLArray() {
-    }
-
-    /**
-     * Convert an {@link Iterable} of filesystem paths.
-     * @param files to convert
-     * @return URL[]
-     */
-    public static URL[] fromPaths(final Iterable<String> files) {
-        return fromFiles(new Iterable<File>() {
-
-            @Override
-            public Iterator<File> iterator() {
-                final Iterator<String> path = files.iterator();
-                return new Iterator<File>() {
-
-                    @Override
-                    public boolean hasNext() {
-                        return path.hasNext();
-                    }
-
-                    @Override
-                    public File next() {
-                        final String element = path.next();
-                        return element == null ? null : new File(element);
-                    }
-
-                    @Override
-                    public void remove() {
-                        throw new UnsupportedOperationException();
-                    }
-                };
-            }
-        });
-    }
-
-    /**
-     * Convert an {@link Iterable} of {@link File}s.
-     * @param files to convert
-     * @return URL[]
-     */
-    public static URL[] fromFiles(final Iterable<File> files) {
-        final ArrayList<URL> result = new ArrayList<URL>();
-        for (final File file : files) {
-            if (file == null) {
-                result.add(null);
-                continue;
-            }
-            try {
-                result.add(file.toURI().toURL());
-            } catch (final MalformedURLException e) {
-                // this shouldn't happen
-                throw new RuntimeException(e);
-            }
-        }
-        return result.toArray(new URL[result.size()]);
-    }
-}
diff --git a/trunk/processor/src/main/java/org/apache/commons/weaver/utils/package-info.java b/trunk/processor/src/main/java/org/apache/commons/weaver/utils/package-info.java
deleted file mode 100644
index 490bf46..0000000
--- a/trunk/processor/src/main/java/org/apache/commons/weaver/utils/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * Provides helpful utility classes.
- */
-package org.apache.commons.weaver.utils;
\ No newline at end of file
diff --git a/trunk/processor/src/site/markdown/index.md b/trunk/processor/src/site/markdown/index.md
deleted file mode 100644
index 84efa25..0000000
--- a/trunk/processor/src/site/markdown/index.md
+++ /dev/null
@@ -1,38 +0,0 @@
-<!--
-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.
--->
-
-## Apache Commons Weaver Processor
-
-This module provides the `org.apache.commons:commons-weaver` artifact.
-It defines the Apache Commons Weaver SPI as well as the basic build-time
-(filesystem-based) processors that detect, configure, and invoke available
-modules.
-
-### WeaveProcessor
-The [WeaveProcessor][wp] invokes available implementations of the
-[Weaver][weaver] SPI.
-
-### CleanProcessor
-The [CleanProcessor][cp] invokes available implementations of the
-[Cleaner][cleaner] SPI.
-
-[cp]: apidocs/org/apache/commons/weaver/CleanProcessor.html
-[wp]: apidocs/org/apache/commons/weaver/WeaveProcessor.html
-[cleaner]: apidocs/org/apache/commons/weaver/spi/Cleaner.html
-[weaver]: apidocs/org/apache/commons/weaver/spi/Weaver.html
diff --git a/trunk/processor/src/test/java/org/apache/commons/weaver/FinderTest.java b/trunk/processor/src/test/java/org/apache/commons/weaver/FinderTest.java
deleted file mode 100644
index 3037b41..0000000
--- a/trunk/processor/src/test/java/org/apache/commons/weaver/FinderTest.java
+++ /dev/null
@@ -1,267 +0,0 @@
-package org.apache.commons.weaver;
-
-import static org.apache.commons.weaver.test.beans.ComplexAnnotations.Stooge.CURLY;
-import static org.apache.commons.weaver.test.beans.ComplexAnnotations.Stooge.LARRY;
-import static org.apache.commons.weaver.test.beans.ComplexAnnotations.Stooge.MOE;
-import static org.apache.commons.weaver.test.beans.ComplexAnnotations.Stooge.SHEMP;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.net.URLClassLoader;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.weaver.test.WeaverTestBase;
-import org.apache.commons.weaver.test.beans.AbstractTestBean;
-import org.apache.commons.weaver.test.beans.ComplexAnnotations;
-import org.apache.commons.weaver.test.beans.ComplexAnnotations.NestAnnotation;
-import org.apache.commons.weaver.test.beans.ComplexAnnotations.Stooge;
-import org.apache.commons.weaver.test.beans.ComplexAnnotations.TestAnnotation;
-import org.apache.commons.weaver.test.beans.TestBeanInterface;
-import org.apache.commons.weaver.test.beans.TestBeanWithClassAnnotation;
-import org.apache.commons.weaver.test.beans.TestBeanWithMethodAnnotation;
-import org.apache.commons.weaver.utils.URLArray;
-import org.apache.xbean.finder.Annotated;
-import org.apache.xbean.finder.archive.FileArchive;
-import org.junit.Test;
-
-public class FinderTest extends WeaverTestBase {
-
-    private Finder finder() {
-        final ClassLoader classLoader = new URLClassLoader(URLArray.fromPaths(getClassPathEntries()));
-        return new Finder(new FileArchive(classLoader, getTargetFolder()));
-    }
-
-    /**
-     * The point of this is to prove that we can correctly hydate instances of
-     * annotations with class retention.
-     * 
-     * @throws IOException
-     */
-    @Test
-    public void testElements() throws IOException {
-        addClassForScanning(ComplexAnnotations.class);
-        Map<String, Annotated<Field>> fields = new HashMap<String, Annotated<Field>>();
-        for (Annotated<Field> annotated : finder().withAnnotations().findAnnotatedFields(
-            ComplexAnnotations.TestAnnotation.class)) {
-            fields.put(annotated.get().getName(), annotated);
-        }
-        assertEquals(2, fields.size());
-
-        TestAnnotation anno1 = fields.get("dummy1").getAnnotation(TestAnnotation.class);
-
-        assertFalse(anno1.booleanValue());
-        assertTrue(Arrays.equals(new boolean[] { false }, anno1.booleanValues()));
-        assertEquals((byte) 0, anno1.byteValue());
-        assertArrayEquals(new byte[] { 0 }, anno1.byteValues());
-        assertEquals((char) 0, anno1.charValue());
-        assertArrayEquals(new char[] { 0 }, anno1.charValues());
-        assertEquals(Double.valueOf(0.0), Double.valueOf(anno1.doubleValue()));
-        assertTrue(Arrays.equals(new double[] { 0.0 }, anno1.doubleValues()));
-        assertEquals(Float.valueOf(0.0f), Float.valueOf(anno1.floatValue()));
-        assertTrue(Arrays.equals(new float[] { 0.0f }, anno1.floatValues()));
-        assertEquals(0, anno1.intValue());
-        assertArrayEquals(new int[] { 0 }, anno1.intValues());
-        assertEquals(0L, anno1.longValue());
-        assertArrayEquals(new long[] { 0L }, anno1.longValues());
-
-        NestAnnotation nest1 = anno1.nest();
-        assertFalse(nest1.booleanValue());
-        assertTrue(Arrays.equals(new boolean[] { false }, nest1.booleanValues()));
-        assertEquals((byte) 0, nest1.byteValue());
-        assertArrayEquals(new byte[] { 0 }, nest1.byteValues());
-        assertEquals((char) 0, nest1.charValue());
-        assertArrayEquals(new char[] { 0 }, nest1.charValues());
-        assertEquals(Double.valueOf(0.0), Double.valueOf(nest1.doubleValue()));
-        assertTrue(Arrays.equals(new double[] { 0.0 }, nest1.doubleValues()));
-        assertEquals(Float.valueOf(0.0f), Float.valueOf(nest1.floatValue()));
-        assertTrue(Arrays.equals(new float[] { 0.0f }, nest1.floatValues()));
-        assertEquals(0, nest1.intValue());
-        assertArrayEquals(new int[] { 0 }, nest1.intValues());
-        assertEquals(0L, nest1.longValue());
-        assertArrayEquals(new long[] { 0L }, nest1.longValues());
-        assertEquals((short) 0, nest1.shortValue());
-        assertArrayEquals(new short[] { 0 }, nest1.shortValues());
-        assertSame(CURLY, nest1.stooge());
-        assertArrayEquals(new Stooge[] { MOE, LARRY, SHEMP }, nest1.stooges());
-        assertEquals("", nest1.string());
-        assertArrayEquals(new String[] { "" }, nest1.strings());
-        assertEquals(Object.class, nest1.type());
-        assertArrayEquals(new Class[] { Object.class }, nest1.types());
-
-        assertEquals(1, anno1.nests().length);
-        NestAnnotation nest1_0 = anno1.nests()[0];
-        assertFalse(nest1_0.booleanValue());
-        assertTrue(Arrays.equals(new boolean[] { false }, nest1_0.booleanValues()));
-        assertEquals((byte) 0, nest1_0.byteValue());
-        assertArrayEquals(new byte[] { 0 }, nest1_0.byteValues());
-        assertEquals((char) 0, nest1_0.charValue());
-        assertArrayEquals(new char[] { 0 }, nest1_0.charValues());
-        assertEquals(Double.valueOf(0.0), Double.valueOf(nest1_0.doubleValue()));
-        assertTrue(Arrays.equals(new double[] { 0.0 }, nest1_0.doubleValues()));
-        assertEquals(Float.valueOf(0.0f), Float.valueOf(nest1_0.floatValue()));
-        assertTrue(Arrays.equals(new float[] { 0.0f }, nest1_0.floatValues()));
-        assertEquals(0, nest1_0.intValue());
-        assertArrayEquals(new int[] { 0 }, nest1_0.intValues());
-        assertEquals(0L, nest1_0.longValue());
-        assertArrayEquals(new long[] { 0L }, nest1_0.longValues());
-        assertEquals((short) 0, nest1_0.shortValue());
-        assertArrayEquals(new short[] { 0 }, nest1_0.shortValues());
-        assertSame(CURLY, nest1_0.stooge());
-        assertArrayEquals(new Stooge[] { MOE, LARRY, SHEMP }, nest1_0.stooges());
-        assertEquals("", nest1_0.string());
-        assertArrayEquals(new String[] { "" }, nest1_0.strings());
-        assertEquals(Object[].class, nest1_0.type());
-        assertArrayEquals(new Class[] { Object[].class }, nest1_0.types());
-
-        assertEquals((short) 0, anno1.shortValue());
-        assertArrayEquals(new short[] { 0 }, anno1.shortValues());
-        assertSame(SHEMP, anno1.stooge());
-        assertArrayEquals(new Stooge[] { MOE, LARRY, CURLY }, anno1.stooges());
-        assertEquals("", anno1.string());
-        assertArrayEquals(new String[] { "" }, anno1.strings());
-        assertEquals(Object.class, anno1.type());
-        assertArrayEquals(new Class[] { Object.class }, anno1.types());
-
-        TestAnnotation anno2 = fields.get("dummy2").getAnnotation(TestAnnotation.class);
-        assertFalse(anno2.booleanValue());
-        assertTrue(Arrays.equals(new boolean[] { false }, anno2.booleanValues()));
-        assertEquals((byte) 0, anno2.byteValue());
-        assertArrayEquals(new byte[] { 0 }, anno2.byteValues());
-        assertEquals((char) 0, anno2.charValue());
-        assertArrayEquals(new char[] { 0 }, anno2.charValues());
-        assertEquals(Double.valueOf(0.0), Double.valueOf(anno2.doubleValue()));
-        assertTrue(Arrays.equals(new double[] { 0.0 }, anno2.doubleValues()));
-        assertEquals(Float.valueOf(0.0f), Float.valueOf(anno2.floatValue()));
-        assertTrue(Arrays.equals(new float[] { 0.0f }, anno2.floatValues()));
-        assertEquals(0, anno2.intValue());
-        assertArrayEquals(new int[] { 0 }, anno2.intValues());
-        assertEquals(0L, anno2.longValue());
-        assertArrayEquals(new long[] { 0L }, anno2.longValues());
-
-        NestAnnotation nest2 = anno2.nest();
-        assertFalse(nest2.booleanValue());
-        assertTrue(Arrays.equals(new boolean[] { false }, nest2.booleanValues()));
-        assertEquals((byte) 0, nest2.byteValue());
-        assertArrayEquals(new byte[] { 0 }, nest2.byteValues());
-        assertEquals((char) 0, nest2.charValue());
-        assertArrayEquals(new char[] { 0 }, nest2.charValues());
-        assertEquals(Double.valueOf(0.0), Double.valueOf(nest2.doubleValue()));
-        assertTrue(Arrays.equals(new double[] { 0.0 }, nest2.doubleValues()));
-        assertEquals(Float.valueOf(0.0f), Float.valueOf(nest2.floatValue()));
-        assertTrue(Arrays.equals(new float[] { 0.0f }, nest2.floatValues()));
-        assertEquals(0, nest2.intValue());
-        assertArrayEquals(new int[] { 0 }, nest2.intValues());
-        assertEquals(0L, nest2.longValue());
-        assertArrayEquals(new long[] { 0L }, nest2.longValues());
-        assertEquals((short) 0, nest2.shortValue());
-        assertArrayEquals(new short[] { 0 }, nest2.shortValues());
-        assertSame(CURLY, nest2.stooge());
-        assertArrayEquals(new Stooge[] { MOE, LARRY, SHEMP }, nest2.stooges());
-        assertEquals("", nest2.string());
-        assertArrayEquals(new String[] { "" }, nest2.strings());
-        assertEquals(Object.class, nest2.type());
-        assertArrayEquals(new Class[] { Object.class }, nest2.types());
-
-        assertEquals(2, anno2.nests().length);
-        NestAnnotation nest2_0 = anno2.nests()[0];
-        assertFalse(nest2_0.booleanValue());
-        assertTrue(Arrays.equals(new boolean[] { false }, nest2_0.booleanValues()));
-        assertEquals((byte) 0, nest2_0.byteValue());
-        assertArrayEquals(new byte[] { 0 }, nest2_0.byteValues());
-        assertEquals((char) 0, nest2_0.charValue());
-        assertArrayEquals(new char[] { 0 }, nest2_0.charValues());
-        assertEquals(Double.valueOf(0.0), Double.valueOf(nest2_0.doubleValue()));
-        assertTrue(Arrays.equals(new double[] { 0.0 }, nest2_0.doubleValues()));
-        assertEquals(Float.valueOf(0.0f), Float.valueOf(nest2_0.floatValue()));
-        assertTrue(Arrays.equals(new float[] { 0.0f }, nest2_0.floatValues()));
-        assertEquals(0, nest2_0.intValue());
-        assertArrayEquals(new int[] { 0 }, nest2_0.intValues());
-        assertEquals(0L, nest2_0.longValue());
-        assertArrayEquals(new long[] { 0L }, nest2_0.longValues());
-        assertEquals((short) 0, nest2_0.shortValue());
-        assertArrayEquals(new short[] { 0 }, nest2_0.shortValues());
-        assertSame(CURLY, nest2_0.stooge());
-        assertArrayEquals(new Stooge[] { MOE, LARRY, SHEMP }, nest2_0.stooges());
-        assertEquals("", nest2_0.string());
-        assertArrayEquals(new String[] { "" }, nest2_0.strings());
-        assertEquals(Object[].class, nest2_0.type());
-        assertArrayEquals(new Class[] { Object[].class }, nest2_0.types());
-
-        NestAnnotation nest2_1 = anno2.nests()[1];
-        assertFalse(nest2_1.booleanValue());
-        assertTrue(Arrays.equals(new boolean[] { false }, nest2_1.booleanValues()));
-        assertEquals((byte) 0, nest2_1.byteValue());
-        assertArrayEquals(new byte[] { 0 }, nest2_1.byteValues());
-        assertEquals((char) 0, nest2_1.charValue());
-        assertArrayEquals(new char[] { 0 }, nest2_1.charValues());
-        assertEquals(Double.valueOf(0.0), Double.valueOf(nest2_1.doubleValue()));
-        assertTrue(Arrays.equals(new double[] { 0.0 }, nest2_1.doubleValues()));
-        assertEquals(Float.valueOf(0.0f), Float.valueOf(nest2_1.floatValue()));
-        assertTrue(Arrays.equals(new float[] { 0.0f }, nest2_1.floatValues()));
-        assertEquals(0, nest2_1.intValue());
-        assertArrayEquals(new int[] { 0 }, nest2_1.intValues());
-        assertEquals(0L, nest2_1.longValue());
-        assertArrayEquals(new long[] { 0L }, nest2_1.longValues());
-        assertEquals((short) 0, nest2_1.shortValue());
-        assertArrayEquals(new short[] { 0 }, nest2_1.shortValues());
-        assertSame(CURLY, nest2_1.stooge());
-        assertArrayEquals(new Stooge[] { MOE, LARRY, SHEMP }, nest2_1.stooges());
-        assertEquals("", nest2_1.string());
-        assertArrayEquals(new String[] { "" }, nest2_1.strings());
-        assertEquals(Object[].class, nest2_1.type());
-        assertArrayEquals(new Class[] { Object[].class }, nest2_1.types());
-
-        assertEquals((short) 0, anno2.shortValue());
-        assertArrayEquals(new short[] { 0 }, anno2.shortValues());
-        assertSame(SHEMP, anno2.stooge());
-        assertArrayEquals(new Stooge[] { MOE, LARRY, CURLY }, anno2.stooges());
-        assertEquals("", anno2.string());
-        assertArrayEquals(new String[] { "" }, anno2.strings());
-        assertEquals(Object.class, anno2.type());
-        assertArrayEquals(new Class[] { Object.class }, anno2.types());
-    }
-
-    @Test
-    public void testObjectMethods() throws IOException {
-        addClassForScanning(ComplexAnnotations.class);
-        for (Annotated<Field> annotated : finder().withAnnotations().findAnnotatedFields(
-            ComplexAnnotations.TestAnnotation.class)) {
-            TestAnnotation anno = annotated.getAnnotation(TestAnnotation.class);
-            assertFalse(anno.toString().isEmpty());
-            assertFalse(anno.hashCode() == 0);
-            assertTrue(anno.equals(anno));
-        }
-    }
-
-    @Test
-    public void testFindAssignableTypes() throws IOException {
-        addClassForScanning(TestBeanInterface.class);
-        addClassForScanning(AbstractTestBean.class);
-        addClassForScanning(TestBeanWithClassAnnotation.class);
-        addClassForScanning(TestBeanWithMethodAnnotation.class);
-
-        final Set<Class<?>> implementors = new HashSet<Class<?>>();
-        for (Annotated<Class<?>> annotated : finder().withAnnotations().findAssignableTypes(TestBeanInterface.class)) {
-            implementors.add(annotated.get());
-        }
-        assertEquals(1, implementors.size());
-        assertTrue(implementors.contains(TestBeanWithClassAnnotation.class));
-
-        final Set<Class<?>> subclasses = new HashSet<Class<?>>();
-        for (Annotated<Class<?>> annotated : finder().withAnnotations().findAssignableTypes(AbstractTestBean.class)) {
-            subclasses.add(annotated.get());
-        }
-        assertEquals(2, subclasses.size());
-        assertTrue(subclasses.contains(TestBeanWithClassAnnotation.class));
-        assertTrue(subclasses.contains(TestBeanWithMethodAnnotation.class));
-    }
-}
diff --git a/trunk/processor/src/test/java/org/apache/commons/weaver/test/CleanProcessorTest.java b/trunk/processor/src/test/java/org/apache/commons/weaver/test/CleanProcessorTest.java
deleted file mode 100644
index 6db0889..0000000
--- a/trunk/processor/src/test/java/org/apache/commons/weaver/test/CleanProcessorTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.commons.weaver.test;
-
-import java.io.File;
-import java.util.Properties;
-
-import org.apache.commons.weaver.CleanProcessor;
-import org.apache.commons.weaver.test.beans.TestBeanWithClassAnnotation;
-import org.apache.commons.weaver.test.beans.TestBeanWithMethodAnnotation;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Test the {@link CleanProcessor}
- */
-public class CleanProcessorTest extends WeaverTestBase {
-
-    @Test
-    public void testWeaveVisiting() throws Exception {
-        addClassForScanning(TestBeanWithMethodAnnotation.class);
-        addClassForScanning(TestBeanWithClassAnnotation.class);
-
-        final Properties config = new Properties();
-        config.put("configKey", "configValue");
-
-        final CleanProcessor cp = new CleanProcessor(getClassPathEntries(), getTargetFolder(), config);
-        cp.clean();
-
-        Assert.assertFalse(new File(getTargetFolder(), TestBeanWithMethodAnnotation.class.getName().replace('.',
-            File.separatorChar)
-            + ".class").exists());
-        Assert.assertFalse(new File(getTargetFolder(), TestBeanWithClassAnnotation.class.getName().replace('.',
-            File.separatorChar)
-            + ".class").exists());
-    }
-}
diff --git a/trunk/processor/src/test/java/org/apache/commons/weaver/test/WeaveProcessorTest.java b/trunk/processor/src/test/java/org/apache/commons/weaver/test/WeaveProcessorTest.java
deleted file mode 100644
index cae41fb..0000000
--- a/trunk/processor/src/test/java/org/apache/commons/weaver/test/WeaveProcessorTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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.commons.weaver.test;
-
-import java.util.Arrays;
-import java.util.Properties;
-
-import org.apache.commons.weaver.test.beans.TestBeanWithClassAnnotation;
-import org.apache.commons.weaver.test.beans.TestBeanWithMethodAnnotation;
-import org.apache.commons.weaver.test.weaver.TestWeaver;
-import org.apache.commons.weaver.WeaveProcessor;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Test the {@link WeaveProcessor}
- */
-public class WeaveProcessorTest extends WeaverTestBase {
-
-    @Test
-    public void testWeaveVisiting() throws Exception {
-        addClassForScanning(TestBeanWithMethodAnnotation.class);
-        addClassForScanning(TestBeanWithClassAnnotation.class);
-
-        final Properties config = new Properties();
-        config.put("configKey", "configValue");
-
-        WeaveProcessor wp = new WeaveProcessor(getClassPathEntries(), getTargetFolder(), config);
-
-        TestWeaver.wovenClasses.clear();
-        TestWeaver.wovenMethods.clear();
-
-        wp.weave();
-
-        Assert.assertEquals(1, TestWeaver.wovenClasses.size());
-        Assert.assertEquals(TestBeanWithClassAnnotation.class, TestWeaver.wovenClasses.get(0));
-
-        Assert.assertEquals(1, TestWeaver.wovenMethods.size());
-        Assert.assertEquals(TestBeanWithMethodAnnotation.class, TestWeaver.wovenMethods.get(0).getDeclaringClass());
-        
-        Assert.assertEquals(1, TestWeaver.implementors.size());
-        Assert.assertEquals(TestBeanWithClassAnnotation.class, TestWeaver.implementors.get(0));
-        
-        Assert.assertEquals(2, TestWeaver.subclasses.size());
-        Assert.assertTrue(TestWeaver.subclasses.containsAll(Arrays.<Class<?>> asList(
-            TestBeanWithClassAnnotation.class, TestBeanWithMethodAnnotation.class)));
-    }
-}
diff --git a/trunk/processor/src/test/java/org/apache/commons/weaver/test/WeaverTestBase.java b/trunk/processor/src/test/java/org/apache/commons/weaver/test/WeaverTestBase.java
deleted file mode 100644
index e2e2cb1..0000000
--- a/trunk/processor/src/test/java/org/apache/commons/weaver/test/WeaverTestBase.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * 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.commons.weaver.test;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.junit.Rule;
-import org.junit.rules.TemporaryFolder;
-
-/**
- * Base class for Weaver tests.
- */
-public abstract class WeaverTestBase {
-
-    @Rule
-    public TemporaryFolder temporaryFolder = new TemporaryFolder();
-
-    private File targetFolder;
-
-    private List<String> classPathEntries;
-
-    private static final String TARGET_FOLDER = "target";
-
-    public void cleanup() {
-        targetFolder = null;
-    }
-
-    /**
-     * Add a class (and its inner classes) to the temporary folder.
-     * 
-     * @param clazz
-     */
-    protected void addClassForScanning(Class<?> clazz) throws IOException {
-        String clazzDirName = clazz.getPackage().getName().replace(".", "/");
-        File targetDirFile = new File(getTargetFolder(), clazzDirName);
-        targetDirFile.mkdirs();
-
-        String fileName = baseName(clazz) + ".class";
-        String clazzFileName = clazzDirName + "/" + fileName;
-        URL clazzUrl = getClass().getClassLoader().getResource(clazzFileName);
-        File targetClazzFile = new File(targetDirFile, fileName);
-
-        byte[] buffer = new byte[0xFFFF];
-
-        FileOutputStream fos = new FileOutputStream(targetClazzFile);
-
-        InputStream inputStream = clazzUrl.openStream();
-        int len;
-        while ((len = inputStream.read(buffer)) > 0) {
-            fos.write(buffer, 0, len);
-        }
-        fos.flush();
-        fos.close();
-
-        for (Class<?> inner : clazz.getClasses()) {
-            addClassForScanning(inner);
-        }
-    }
-
-    private String baseName(Class<?> clazz) {
-        if (clazz.getDeclaringClass() == null) {
-            return clazz.getSimpleName();
-        }
-        final StringBuilder result = new StringBuilder();
-        Class<?> current = clazz;
-        while (current != null) {
-            if (result.length() > 0) {
-                result.insert(0, '$');
-            }
-            result.insert(0, current.getSimpleName());
-            current = current.getDeclaringClass();
-        }
-        return result.toString();
-    }
-
-    /**
-     * Resolves the 'target' folder where the classes should get placed
-     */
-    protected File getTargetFolder() {
-        if (targetFolder == null) {
-            targetFolder = new File(temporaryFolder.getRoot(), TARGET_FOLDER);
-        }
-        return targetFolder;
-    }
-
-    protected List<String> getClassPathEntries() {
-        if (classPathEntries == null) {
-            classPathEntries = new ArrayList<String>(1);
-            try {
-                classPathEntries.add(getTargetFolder().getCanonicalPath());
-            } catch (IOException ioe) {
-                throw new RuntimeException(ioe);
-            }
-        }
-
-        return classPathEntries;
-    }
-
-}
diff --git a/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/AbstractTestBean.java b/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/AbstractTestBean.java
deleted file mode 100644
index 4159ddf..0000000
--- a/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/AbstractTestBean.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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.commons.weaver.test.beans;
-
-public abstract class AbstractTestBean {
-
-}
diff --git a/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/ComplexAnnotations.java b/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/ComplexAnnotations.java
deleted file mode 100644
index c6e8b0f..0000000
--- a/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/ComplexAnnotations.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * 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.commons.weaver.test.beans;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static org.apache.commons.weaver.test.beans.ComplexAnnotations.Stooge.CURLY;
-import static org.apache.commons.weaver.test.beans.ComplexAnnotations.Stooge.LARRY;
-import static org.apache.commons.weaver.test.beans.ComplexAnnotations.Stooge.MOE;
-import static org.apache.commons.weaver.test.beans.ComplexAnnotations.Stooge.SHEMP;
-
-import java.lang.annotation.Target;
-
-public class ComplexAnnotations {
-    @TestAnnotation(
-            booleanValue = false,
-            booleanValues = { false },
-            byteValue = 0,
-            byteValues = { 0 },
-            charValue = 0,
-            charValues = { 0 },
-            doubleValue = 0,
-            doubleValues = { 0 },
-            floatValue = 0,
-            floatValues = { 0 },
-            intValue = 0,
-            intValues = { 0 },
-            longValue = 0,
-            longValues = { 0 },
-            nest = @NestAnnotation(
-                    booleanValue = false,
-                    booleanValues = { false },
-                    byteValue = 0,
-                    byteValues = { 0 },
-                    charValue = 0,
-                    charValues = { 0 },
-                    doubleValue = 0,
-                    doubleValues = { 0 },
-                    floatValue = 0,
-                    floatValues = { 0 },
-                    intValue = 0,
-                    intValues = { 0 },
-                    longValue = 0,
-                    longValues = { 0 },
-                    shortValue = 0,
-                    shortValues = { 0 },
-                    stooge = CURLY,
-                    stooges = { MOE, LARRY, SHEMP },
-                    string = "",
-                    strings = { "" },
-                    type = Object.class,
-                    types = { Object.class }
-            ),
-            nests = {
-                @NestAnnotation(
-                        booleanValue = false,
-                        booleanValues = { false },
-                        byteValue = 0,
-                        byteValues = { 0 },
-                        charValue = 0,
-                        charValues = { 0 },
-                        doubleValue = 0,
-                        doubleValues = { 0 },
-                        floatValue = 0,
-                        floatValues = { 0 },
-                        intValue = 0,
-                        intValues = { 0 },
-                        longValue = 0,
-                        longValues = { 0 },
-                        shortValue = 0,
-                        shortValues = { 0 },
-                        stooge = CURLY,
-                        stooges = { MOE, LARRY, SHEMP },
-                        string = "",
-                        strings = { "" },
-                        type = Object[].class,
-                        types = { Object[].class }
-                )
-            },
-            shortValue = 0,
-            shortValues = { 0 },
-            stooge = SHEMP,
-            stooges = { MOE, LARRY, CURLY },
-            string = "",
-            strings = { "" },
-            type = Object.class,
-            types = { Object.class }
-    )
-    public Object dummy1;
-
-    @TestAnnotation(
-            booleanValue = false,
-            booleanValues = { false },
-            byteValue = 0,
-            byteValues = { 0 },
-            charValue = 0,
-            charValues = { 0 },
-            doubleValue = 0,
-            doubleValues = { 0 },
-            floatValue = 0,
-            floatValues = { 0 },
-            intValue = 0,
-            intValues = { 0 },
-            longValue = 0,
-            longValues = { 0 },
-            nest = @NestAnnotation(
-                    booleanValue = false,
-                    booleanValues = { false },
-                    byteValue = 0,
-                    byteValues = { 0 },
-                    charValue = 0,
-                    charValues = { 0 },
-                    doubleValue = 0,
-                    doubleValues = { 0 },
-                    floatValue = 0,
-                    floatValues = { 0 },
-                    intValue = 0,
-                    intValues = { 0 },
-                    longValue = 0,
-                    longValues = { 0 },
-                    shortValue = 0,
-                    shortValues = { 0 },
-                    stooge = CURLY,
-                    stooges = { MOE, LARRY, SHEMP },
-                    string = "",
-                    strings = { "" },
-                    type = Object.class,
-                    types = { Object.class }
-            ),
-            nests = {
-                @NestAnnotation(
-                        booleanValue = false,
-                        booleanValues = { false },
-                        byteValue = 0,
-                        byteValues = { 0 },
-                        charValue = 0,
-                        charValues = { 0 },
-                        doubleValue = 0,
-                        doubleValues = { 0 },
-                        floatValue = 0,
-                        floatValues = { 0 },
-                        intValue = 0,
-                        intValues = { 0 },
-                        longValue = 0,
-                        longValues = { 0 },
-                        shortValue = 0,
-                        shortValues = { 0 },
-                        stooge = CURLY,
-                        stooges = { MOE, LARRY, SHEMP },
-                        string = "",
-                        strings = { "" },
-                        type = Object[].class,
-                        types = { Object[].class }
-                ),
-                //add a second NestAnnotation:
-                @NestAnnotation(
-                        booleanValue = false,
-                        booleanValues = { false },
-                        byteValue = 0,
-                        byteValues = { 0 },
-                        charValue = 0,
-                        charValues = { 0 },
-                        doubleValue = 0,
-                        doubleValues = { 0 },
-                        floatValue = 0,
-                        floatValues = { 0 },
-                        intValue = 0,
-                        intValues = { 0 },
-                        longValue = 0,
-                        longValues = { 0 },
-                        shortValue = 0,
-                        shortValues = { 0 },
-                        stooge = CURLY,
-                        stooges = { MOE, LARRY, SHEMP },
-                        string = "",
-                        strings = { "" },
-                        type = Object[].class,
-                        types = { Object[].class }
-                )
-            },
-            shortValue = 0,
-            shortValues = { 0 },
-            stooge = SHEMP,
-            stooges = { MOE, LARRY, CURLY },
-            string = "",
-            strings = { "" },
-            type = Object.class,
-            types = { Object.class }
-    )
-    public Object dummy2;
-
-    @Target(FIELD)
-    public @interface TestAnnotation {
-        String string();
-        String[] strings();
-        Class<?> type();
-        Class<?>[] types();
-        byte byteValue();
-        byte[] byteValues();
-        short shortValue();
-        short[] shortValues();
-        int intValue();
-        int[] intValues();
-        char charValue();
-        char[] charValues();
-        long longValue();
-        long[] longValues();
-        float floatValue();
-        float[] floatValues();
-        double doubleValue();
-        double[] doubleValues();
-        boolean booleanValue();
-        boolean[] booleanValues();
-        Stooge stooge();
-        Stooge[] stooges();
-        NestAnnotation nest();
-        NestAnnotation[] nests();
-    }
-
-    public @interface NestAnnotation {
-        String string();
-        String[] strings();
-        Class<?> type();
-        Class<?>[] types();
-        byte byteValue();
-        byte[] byteValues();
-        short shortValue();
-        short[] shortValues();
-        int intValue();
-        int[] intValues();
-        char charValue();
-        char[] charValues();
-        long longValue();
-        long[] longValues();
-        float floatValue();
-        float[] floatValues();
-        double doubleValue();
-        double[] doubleValues();
-        boolean booleanValue();
-        boolean[] booleanValues();
-        Stooge stooge();
-        Stooge[] stooges();
-    }
-
-    public static enum Stooge {
-        MOE, LARRY, CURLY, SHEMP, JOE;
-    }
-
-}
diff --git a/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/TestAnnotation.java b/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/TestAnnotation.java
deleted file mode 100644
index 7a959a0..0000000
--- a/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/TestAnnotation.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.commons.weaver.test.beans;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Test marker annotation to test the scanning
- */
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.CLASS)
-public @interface TestAnnotation {
-}
diff --git a/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/TestBeanInterface.java b/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/TestBeanInterface.java
deleted file mode 100644
index 0f8e475..0000000
--- a/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/TestBeanInterface.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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.commons.weaver.test.beans;
-
-public interface TestBeanInterface {
-
-}
diff --git a/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/TestBeanWithClassAnnotation.java b/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/TestBeanWithClassAnnotation.java
deleted file mode 100644
index d7808a5..0000000
--- a/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/TestBeanWithClassAnnotation.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.commons.weaver.test.beans;
-
-/**
- * Simple test bean
- */
-@TestAnnotation
-public class TestBeanWithClassAnnotation extends AbstractTestBean implements TestBeanInterface {
-    @SuppressWarnings("unused")
-    private int someMethod() {
-        return 42;
-    }
-}
diff --git a/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/TestBeanWithMethodAnnotation.java b/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/TestBeanWithMethodAnnotation.java
deleted file mode 100644
index 4b70c9e..0000000
--- a/trunk/processor/src/test/java/org/apache/commons/weaver/test/beans/TestBeanWithMethodAnnotation.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.commons.weaver.test.beans;
-
-/**
- * Simple test bean
- */
-public class TestBeanWithMethodAnnotation extends AbstractTestBean {
-    @TestAnnotation
-    private int annotatedMethod() {
-        return 42;
-    }
-
-    @SuppressWarnings("unused")
-    private int nonAnnotatedMethod() {
-        return 21;
-    }
-}
diff --git a/trunk/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestCleaner.java b/trunk/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestCleaner.java
deleted file mode 100644
index 894d1af..0000000
--- a/trunk/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestCleaner.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.commons.weaver.test.weaver;
-
-import java.lang.annotation.ElementType;
-
-import org.apache.commons.weaver.model.ScanRequest;
-import org.apache.commons.weaver.model.Scanner;
-import org.apache.commons.weaver.model.WeavableClass;
-import org.apache.commons.weaver.model.WeaveEnvironment;
-import org.apache.commons.weaver.model.WeaveInterest;
-import org.apache.commons.weaver.spi.Cleaner;
-import org.apache.commons.weaver.test.beans.TestAnnotation;
-
-public class TestCleaner implements Cleaner {
-
-    @Override
-    public boolean clean(WeaveEnvironment environment, Scanner scanner) {
-        boolean result = false;
-
-        final ScanRequest scanRequest =
-            new ScanRequest().add(WeaveInterest.of(TestAnnotation.class, ElementType.TYPE)).add(
-                WeaveInterest.of(TestAnnotation.class, ElementType.METHOD));
-
-        for (WeavableClass<?> weavableClass : scanner.scan(scanRequest).getClasses()) {
-            if (environment.deleteClassfile(weavableClass.getTarget())) {
-                result = true;
-            } else {
-                break;
-            }
-        }
-        return result;
-    }
-
-}
diff --git a/trunk/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestWeaver.java b/trunk/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestWeaver.java
deleted file mode 100644
index 8295ecc..0000000
--- a/trunk/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestWeaver.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * 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.commons.weaver.test.weaver;
-
-import java.lang.annotation.ElementType;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.weaver.model.ScanRequest;
-import org.apache.commons.weaver.model.ScanResult;
-import org.apache.commons.weaver.model.Scanner;
-import org.apache.commons.weaver.model.WeavableClass;
-import org.apache.commons.weaver.model.WeavableMethod;
-import org.apache.commons.weaver.model.WeaveEnvironment;
-import org.apache.commons.weaver.model.WeaveInterest;
-import org.apache.commons.weaver.spi.Weaver;
-import org.apache.commons.weaver.test.beans.AbstractTestBean;
-import org.apache.commons.weaver.test.beans.TestAnnotation;
-import org.apache.commons.weaver.test.beans.TestBeanInterface;
-import org.junit.Assert;
-
-/**
- * 
- */
-public class TestWeaver implements Weaver {
-    public static List<Method> wovenMethods = new ArrayList<Method>();
-    public static List<Class<?>> wovenClasses = new ArrayList<Class<?>>();
-    public static List<Class<?>> implementors = new ArrayList<Class<?>>();
-    public static List<Class<?>> subclasses = new ArrayList<Class<?>>();
-
-    @Override
-    public boolean process(WeaveEnvironment environment, Scanner scanner) {
-        Assert.assertNotNull(environment.config);
-        Assert.assertEquals(1, environment.config.size());
-
-        String configValue = environment.config.getProperty("configKey");
-
-        Assert.assertEquals("configValue", configValue);
-        boolean result = false;
-
-        final ScanRequest scanRequest =
-            new ScanRequest().add(WeaveInterest.of(TestAnnotation.class, ElementType.TYPE))
-                .add(WeaveInterest.of(TestAnnotation.class, ElementType.METHOD))
-                .addSupertypes(AbstractTestBean.class, TestBeanInterface.class);
-
-        final ScanResult scanResult = scanner.scan(scanRequest);
-
-        for (WeavableClass<?> weavableClass : scanResult.getClasses().with(TestAnnotation.class)) {
-            if (wovenClasses.add(weavableClass.getTarget())) {
-                result = true;
-            }
-        }
-        for (WeavableMethod<?> weavableMethod : scanResult.getMethods().with(TestAnnotation.class)) {
-            if (wovenMethods.add(weavableMethod.getTarget())) {
-                result = true;
-            }
-        }
-        for (WeavableClass<?> weavableClass : scanResult.getClassesAssignableTo(TestBeanInterface.class)) {
-            if (implementors.add(weavableClass.getTarget())) {
-                result = true;
-            }
-        }
-        for (WeavableClass<?> weavableClass : scanResult.getClassesAssignableTo(AbstractTestBean.class)) {
-            if (subclasses.add(weavableClass.getTarget())) {
-                result = true;
-            }
-        }
-        return result;
-    }
-
-}
diff --git a/trunk/processor/src/test/resources/META-INF/services/org.apache.commons.weaver.spi.Cleaner b/trunk/processor/src/test/resources/META-INF/services/org.apache.commons.weaver.spi.Cleaner
deleted file mode 100644
index 5fafbc4..0000000
--- a/trunk/processor/src/test/resources/META-INF/services/org.apache.commons.weaver.spi.Cleaner
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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.
-
-# this class gets picked up by the CleanProcessor
-org.apache.commons.weaver.test.weaver.TestCleaner
diff --git a/trunk/processor/src/test/resources/META-INF/services/org.apache.commons.weaver.spi.Weaver b/trunk/processor/src/test/resources/META-INF/services/org.apache.commons.weaver.spi.Weaver
deleted file mode 100644
index c9e19ef..0000000
--- a/trunk/processor/src/test/resources/META-INF/services/org.apache.commons.weaver.spi.Weaver
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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.
-
-# this class gets picked up by the WeaveProcessor
-org.apache.commons.weaver.test.weaver.TestWeaver
diff --git a/trunk/src/changes/changes.xml b/trunk/src/changes/changes.xml
deleted file mode 100644
index 7f3dbad..0000000
--- a/trunk/src/changes/changes.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-     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.
-  -->
-<document xmlns="http://maven.apache.org/changes/1.0.0"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://maven.apache.org/changes/1.0.0 http://maven.apache.org/xsd/changes-1.0.0.xsd">
-  <properties>
-    <title>Apache Commons Weaver Changes</title>
-    <author email="mbenson@apache.org">Matt Benson</author>
-  </properties>
-  <body>
-    <release version="1.0" date="2014-03-03" description="Initial release" />
-  </body>
-</document>
diff --git a/trunk/src/changes/release-notes.vm b/trunk/src/changes/release-notes.vm
deleted file mode 100644
index a94a43c..0000000
--- a/trunk/src/changes/release-notes.vm
+++ /dev/null
@@ -1,122 +0,0 @@
-## 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.
-##
-              Apache Commons Weaver ${version}
-                  RELEASE NOTES
-
-The Apache Commons team is pleased to announce the release of Apache Commons Weaver ${version}
-
-$introduction.replaceAll("(?<!\015)\012", "
-").replaceAll("(?m)^ +","")
-
-## N.B. the available variables are described here:
-## http://maven.apache.org/plugins/maven-changes-plugin/examples/using-a-custom-announcement-template.html
-##
-## Hack to improve layout: replace all pairs of spaces with a single new-line
-$release.description.replaceAll("  ", "
-")
-
-## set up indent sizes. Only change indent1
-#set($props=${project.properties})
-#set($jiralen=$props.get("commons.jira.id").length())
-## indent1 =   POOL-nnnn:
-#set($blanklen=$jiralen+6)## +6 for "-nnnn:"
-## must be at least as long as the longest JIRA id
-#set($blanks="                                  ")
-#set($indent1=$blanks.substring(0,$blanklen))
-## indent2 allows for issue wrapper
-#set($indent2="$indent1   ")
-##
-#macro ( processaction )
-## Use replaceAll to fix up LF-only line ends on Windows.
-#set($action=$actionItem.getAction().replaceAll("\n","
-"))
-## Replace &lt; with < so can embed tag markup
-#set($action=$action.replaceAll("&lt;","<"))
-## use an empty date to mean don't format the entry
-## TODO how to enable leading spaces without compromising html report
-## unfortunately leading spaces are trimmed even from CDATA sections
-#if ($actionItem.getDate() && $actionItem.getDate().length()==0)
-$action
-#else
-## Fix up indentation for multi-line action descriptions
-#set($action=$action.replaceAll("(?m)^  +",$indent2))
-#if ($actionItem.getIssue())
-#set($issue="$actionItem.getIssue():")
-## Pad shorter issue numbers
-#if ($issue.length() < $indent1.length())#set ($issue="$issue ")#end
-#if ($issue.length() < $indent1.length())#set ($issue="$issue ")#end
-#if ($issue.length() < $indent1.length())#set ($issue="$issue ")#end
-#else
-#set($issue=$indent1)
-#end
-#if ($actionItem.getDueTo())
-#set($dueto=" Thanks to $actionItem.getDueTo().")
-#else
-#set($dueto="")
-#end
-o $issue ${action}$dueto
-#end
-#set($action="")
-#set($issue="")
-#set($dueto="")
-#end
-##
-#if ($release.getActions().size() == 0)
-No changes defined in this version.
-#else
-Changes in this version include:
-
-#if ($release.getActions('add').size() !=0)
-New features:
-#foreach($actionItem in $release.getActions('add'))
-#processaction()
-#end 
-
-#end
-##
-#if ($release.getActions('fix').size() !=0)
-Fixed Bugs:
-#foreach($actionItem in $release.getActions('fix'))
-#processaction()
-#end
-
-#end
-##
-#if ($release.getActions('update').size() !=0)
-Changes:
-#foreach($actionItem in $release.getActions('update'))
-#processaction()
-#end
-
-#end
-##
-#if ($release.getActions('remove').size() !=0)
-Removed:
-#foreach($actionItem in $release.getActions('remove'))
-#processaction()
-#end
-#end
-## End of main loop
-#end
-
-Historical list of changes: ${project.url}changes-report.html
-
-For complete information on ${project.name}, including instructions on how to submit bug reports,
-patches, or suggestions for improvement, see the Apache ${project.name} website:
-
-${project.url}
diff --git a/trunk/src/site/markdown/building.md b/trunk/src/site/markdown/building.md
deleted file mode 100644
index 53c1213..0000000
--- a/trunk/src/site/markdown/building.md
+++ /dev/null
@@ -1,52 +0,0 @@
-<!--
-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.
--->
-
-Apache Maven 3 is required to build Apache Commons Weaver. Things to know:
-
-### Self-referential multimodule build
-Commons Weaver provides a Maven plugin as one of its submodules; the plugin
-is itself required by the modules which demonstrate the provided "weaver
-modules." This means that Commons Weaver requires, at minimum, the
-`package` phase to be specified when building the project. This makes the
-various modules visible to one another using the Maven reactor, detailed
-[here](http://maven.apache.org/guides/mini/guide-multiple-modules.html).
-Without installing to your local Maven repository, however, certain items
-will always fail; e.g. `mvn clean` without `package`, `mvn dependency:list`,
-`mvn dependency:tree`, and probably others. In general, `mvn install` will
-avoid further surprises down the line.
-
-### Testing with security enabled
-The Privilizer is the fundamental "guinea pig" weaver module.
-Since the whole point of the Privilizer relates to Java security, it is only
-natural that its tests be executable with Java security enabled. It is also
-reasonable to test without security enabled, to show that your code works as
-always. The `example` and `ant/test` modules each have a `sec` profile defined;
-You can run their tests with this profile enabled to turn on Java security.
-
-### Antlib Test module
-Located at `ant/test`, this module\'s tests are implemented by unpacking the
-source of the `example` module and reusing it. For this reason, the
-`example` module must have been packaged previously to executing the `ant/test`
-tests, so in a multimodule build you should at least specify the `package`
-phase of the default lifecycle. Alternatively, you can disable this module\'s
-tests by deactivating the profile in which they are set up: `antlib-test`.
-
-Similarly, when building the project site you should deactivate the
-`antlib-test` profile, to stop this module\'s tests from requiring the
-`example` module to have been previously packaged. 
diff --git a/trunk/src/site/markdown/index.md b/trunk/src/site/markdown/index.md
deleted file mode 100644
index d62722d..0000000
--- a/trunk/src/site/markdown/index.md
+++ /dev/null
@@ -1,157 +0,0 @@
-<!--
-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.
--->
-
-# Apache Commons Weaver
-
-## What is this thing?
-Occasionally, as Java developers, we encounter a problem whose solution
-simply cannot be expressed in the Java language. Often, the Java annotation
-processing tools can be used to great effect, and they should not be
-dismissed as your first line of defense when you need to generate additional
-classes. Occasionally, however, our only recourse is to manipulate existing
-class files. It is these situations which Apache Commons Weaver was designed
-to address.
-
-Apache Commons Weaver consists of:
-
-## Core Framework
-The [Commons Weaver Processor](commons-weaver-processor/index.html)
-defines a "weaver module" service provider interface (SPI) as well as
-the facilities that use the Java `ServiceLoader` to discover and invoke
-defined weaver modules for simple filesystem-based bytecode weaving.
-
-## Weaver Modules
-A number of [Weaver Modules](commons-weaver-modules-parent/index.html)
-are provided by the Commons Weaver project.
-Typically a weaver module may respect a set of configuration
-properties which should be documented along with that module.
-
-### What can these do for me?
-The canonical example is the [privilizer module](commons-weaver-modules-parent/commons-weaver-privilizer-parent/index.html).
-
-## Integration
-The weaver module(s) applicable to your codebase should be available
-on the classpath of whatever Java-based processing mechanism you select.
-Your responsibilities are to:
-
- - trigger weave processing in some way
- - make the desired weaver module(s) available for processing
- - (optionally) provide configuration properties for applicable modules
-
-There are two provided mechanisms for invoking Weaving facilities:
-
-### Maven Plugin
-The [Commons Weaver plugin for Apache Maven][mvnplugin] aims to integrate
-Weaver as smoothly as possible for Maven users. Here is an example
-of configuring the `privilizer` module:
-
-      <plugin>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-weaver-maven-plugin</artifactId>
-        <version>${commons.weaver.version}</version>
-        <configuration>
-          <weaverConfig>
-            <privilizer.accessLevel>${privilizer.accessLevel}</privilizer.accessLevel>
-            <privilizer.policy>${privilizer.policy}</privilizer.policy>
-            <privilizer.verify>${privilizer.verify}</privilizer.verify>
-          </weaverConfig>
-        </configuration>
-        <executions>
-          <execution>
-            <goals>
-              <goal>prepare</goal>
-              <goal>weave</goal>
-            </goals>
-          </execution>
-        </executions>
-        <dependencies>
-          <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-weaver-privilizer-api</artifactId>
-            <version>${commons.weaver.version}</version>
-          </dependency>
-          <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-weaver-privilizer</artifactId>
-            <version>${commons.weaver.version}</version>
-          </dependency>
-        </dependencies>
-      </plugin>
-
-### Antlib
-The [Commons Weaver Antlib][antlib] provides tasks and types to
-facilitate the integration of Commons Weaver into your Apache Ant-based
-build process. Here the user will make the `commons-weaver-antlib` `jar`
-(which includes the Apache Commons Weaver processor and its dependencies),
-along with the `jar` files of the desired modules, available to
-the Ant build using one of the various mechanisms supported. More
-information on this is available [here][antxt]. Having done this the
-basic approach will be to parameterize one of the provided tasks
-(`clean`|`weave`) with a `settings` element. If both `weave` and `clean`
-tasks are used, defining a [reference][antref] to the `settings` object
-and referencing it using the `settingsref` attribute is recommended, as
-seen here:
-
-      <settings id="weavesettings"
-                target="target/classes"
-                classpathref="maincp">
-        <properties>
-          <privilizer.accessLevel>${privilizer.accessLevel}</privilizer.accessLevel>
-          <privilizer.policy>${privilizer.policy}</privilizer.policy>
-          <privilizer.verify>${privilizer.verify}</privilizer.verify>
-        </properties>
-      </settings>
-
-      <clean settingsref="weavesettings" />
-      <weave settingsref="weavesettings" />
-
-Multiple weaving targets (e.g. `main` vs. `test`) are of course woven
-using different `settings`.
-
-## Custom Weaver Modules
-As discussed, some modules are provided for common cases, and the developers
-welcome suggestions for useful modules, but there is no reason not to get
-started writing your own weaver module (assuming you are sure this is the right
-solution, or just want to do this for fun) now! When the processor framework
-invokes your custom `Weaver`, it will pass in a `Scanner` that can be used to
-find the classes you are interested in. Request the original bytecode from the
-`WeaveEnvironment` and make your changes (for this task you will save time and
-frustration using one of the available open source Java bytecode manipulation
-libraries). Save your changes back to the `WeaveEnvironment`. Rinse, repeat.
-Hint: if your `Weaver` uses configuration parameters to dictate its
-behavior, it can leave a scannable "footprint" in your woven classes. Then
-implement the `Cleaner` SPI to find and delete these in the case that the
-current configuration is incompatible with the results of an earlier "weaving."
-
-##FAQ
-
-* *Q*: Why not just use [AspectJ](http://eclipse.org/aspectj/)?
-
-    *A*: The original motivation to develop the codebase that evolved into
-         Commons Weaver instead of simply using AspectJ was to avoid the
-         runtime dependency, however small, introduced by the use of AspectJ.
-         Additionally, later versions of AspectJ are licensed under the
-         [EPL](http://eclipse.org/legal/epl-v10.html) which can be
-         considered less permissive than the Apache license. Choice is
-         A Good Thing.
-
-[mvnplugin]: commons-weaver-maven-plugin/plugin-info.html
-[antlib]: commons-weaver-antlib-parent/commons-weaver-antlib/index.html
-[antxt]: http://ant.apache.org/manual/using.html#external-tasks
-[antref]: http://ant.apache.org/manual/using.html#references
diff --git a/trunk/src/site/resources/images/weaver-logo-white.png b/trunk/src/site/resources/images/weaver-logo-white.png
deleted file mode 100644
index 690b921..0000000
--- a/trunk/src/site/resources/images/weaver-logo-white.png
+++ /dev/null
Binary files differ
diff --git a/trunk/src/site/resources/images/weaver-logo-white.xcf b/trunk/src/site/resources/images/weaver-logo-white.xcf
deleted file mode 100644
index 3ebaf2b..0000000
--- a/trunk/src/site/resources/images/weaver-logo-white.xcf
+++ /dev/null
Binary files differ
diff --git a/trunk/src/site/site.xml b/trunk/src/site/site.xml
deleted file mode 100644
index e6a290c..0000000
--- a/trunk/src/site/site.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-  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.
--->
-<project name="Commons Weaver">
-  <bannerRight>
-    <name>Commons Weaver</name>
-    <src>/images/weaver-logo-white.png</src>
-    <href>/index.html</href>
-  </bannerRight>
-  <body>
-    <menu name="Commons Weaver">
-      <item name="Overview" href="/index.html"/>
-      <item name="Javadoc" href="apidocs/index.html"/>
-      <item name="Mailing lists" href="/mail-lists.html"/>
-      <item name="Issue Tracking" href="/issue-tracking.html"/>
-    </menu>
-    <menu name="Development">
-      <item name="Team" href="/team-list.html"/>
-      <item name="SVN" href="/source-repository.html"/>
-      <item name="Building" href="/building.html"/>
-    </menu>
-  </body>
-</project>
diff --git a/trunk/src/site/xdoc/download_weaver.xml b/trunk/src/site/xdoc/download_weaver.xml
deleted file mode 100644
index fc8484c..0000000
--- a/trunk/src/site/xdoc/download_weaver.xml
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version="1.0"?>
-<!--
-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.
--->
-<!--
- +======================================================================+
- |****                                                              ****|
- |****      THIS FILE IS GENERATED BY THE COMMONS BUILD PLUGIN      ****|
- |****                    DO NOT EDIT DIRECTLY                      ****|
- |****                                                              ****|
- +======================================================================+
- | TEMPLATE FILE: download-page-template.xml                            |
- | commons-build-plugin/trunk/src/main/resources/commons-xdoc-templates |
- +======================================================================+
- |                                                                      |
- | 1) Re-generate using: mvn commons:download-page                      |
- |                                                                      |
- | 2) Set the following properties in the component's pom:              |
- |    - commons.componentid (required, alphabetic, lower case)          |
- |    - commons.release.version (required)                              |
- |    - commons.binary.suffix (optional)                                |
- |      (defaults to "-bin", set to "" for pre-maven2 releases)         |
- |                                                                      |
- | 3) Example Properties                                                |
- |                                                                      |
- |  <properties>                                                        |
- |    <commons.componentid>math</commons.componentid>                   |
- |    <commons.release.version>1.2</commons.release.version>            |
- |  </properties>                                                       |
- |                                                                      |
- +======================================================================+
--->
-<document>
-  <properties>
-    <title>Download Apache Commons Weaver Parent POM</title>
-    <author email="dev@commons.apache.org">Commons Documentation Team</author>
-  </properties>
-  <body>
-    <section name="Download Apache Commons Weaver Parent POM">
-    <subsection name="Using a Mirror">
-      <p>
-        We recommend you use a mirror to download our release
-        builds, but you <strong>must</strong> verify the integrity of
-        the downloaded files using signatures downloaded from our main
-        distribution directories. Recent releases (48 hours) may not yet
-        be available from the mirrors.
-      </p>
-
-      <p>
-        You are currently using <b>[preferred]</b>.  If you
-        encounter a problem with this mirror, please select another
-        mirror.  If all mirrors are failing, there are <i>backup</i>
-        mirrors (at the end of the mirrors list) that should be
-        available.
-        <br></br>
-        [if-any logo]<a href="[link]"><img align="right" src="[logo]" border="0"></img></a>[end]
-      </p>
-
-      <form action="[location]" method="get" id="SelectMirror">
-        <p>
-          Other mirrors:
-          <select name="Preferred">
-          [if-any http]
-            [for http]<option value="[http]">[http]</option>[end]
-          [end]
-          [if-any ftp]
-            [for ftp]<option value="[ftp]">[ftp]</option>[end]
-          [end]
-          [if-any backup]
-            [for backup]<option value="[backup]">[backup] (backup)</option>[end]
-          [end]
-          </select>
-          <input type="submit" value="Change"></input>
-        </p>
-      </form>
-
-      <p>
-        The <a href="http://www.apache.org/dist/commons/KEYS">KEYS</a>
-        link links to the code signing keys used to sign the product.
-        The <code>PGP</code> link downloads the OpenPGP compatible signature from our main site.
-        The <code>MD5</code> link downloads the checksum from the main site.
-      </p>
-    </subsection>
-    </section>
-    <section name="Apache Commons Weaver Parent POM 1.0 ">
-      <subsection name="Binaries">
-        <table>
-          <tr>
-              <td><a href="[preferred]/commons/weaver/binaries/commons-weaver-parent-1.0-bin.tar.gz">commons-weaver-parent-1.0-bin.tar.gz</a></td>
-              <td><a href="http://www.apache.org/dist/commons/weaver/binaries/commons-weaver-parent-1.0-bin.tar.gz.md5">md5</a></td>
-              <td><a href="http://www.apache.org/dist/commons/weaver/binaries/commons-weaver-parent-1.0-bin.tar.gz.asc">pgp</a></td>
-          </tr>
-          <tr>
-              <td><a href="[preferred]/commons/weaver/binaries/commons-weaver-parent-1.0-bin.zip">commons-weaver-parent-1.0-bin.zip</a></td>
-              <td><a href="http://www.apache.org/dist/commons/weaver/binaries/commons-weaver-parent-1.0-bin.zip.md5">md5</a></td>
-              <td><a href="http://www.apache.org/dist/commons/weaver/binaries/commons-weaver-parent-1.0-bin.zip.asc">pgp</a></td>
-          </tr>
-        </table>
-      </subsection>
-      <subsection name="Source">
-        <table>
-          <tr>
-              <td><a href="[preferred]/commons/weaver/source/commons-weaver-parent-1.0-src.tar.gz">commons-weaver-parent-1.0-src.tar.gz</a></td>
-              <td><a href="http://www.apache.org/dist/commons/weaver/source/commons-weaver-parent-1.0-src.tar.gz.md5">md5</a></td>
-              <td><a href="http://www.apache.org/dist/commons/weaver/source/commons-weaver-parent-1.0-src.tar.gz.asc">pgp</a></td>
-          </tr>
-          <tr>
-              <td><a href="[preferred]/commons/weaver/source/commons-weaver-parent-1.0-src.zip">commons-weaver-parent-1.0-src.zip</a></td>
-              <td><a href="http://www.apache.org/dist/commons/weaver/source/commons-weaver-parent-1.0-src.zip.md5">md5</a></td>
-              <td><a href="http://www.apache.org/dist/commons/weaver/source/commons-weaver-parent-1.0-src.zip.asc">pgp</a></td>
-          </tr>
-        </table>
-      </subsection>
-    </section>
-    <section name="Archives">
-        <p>
-          Older releases can be obtained from the archives.
-        </p>
-        <ul>
-          <li class="download"><a href="[preferred]/commons/weaver/">browse download area</a></li>
-          <li><a href="http://archive.apache.org/dist/commons/weaver/">archives...</a></li>
-        </ul>
-    </section>
-  </body>
-</document>
