You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jdo-commits@db.apache.org by mb...@apache.org on 2005/05/22 19:55:54 UTC

svn commit: r171351 [1/16] - in /incubator/jdo/trunk/enhancer20: ./ src/ src/conf/ src/java/ src/java/org/ src/java/org/apache/ src/java/org/apache/jdo/ src/java/org/apache/jdo/enhancer/ src/java/org/apache/jdo/impl/ src/java/org/apache/jdo/impl/enhancer/ src/java/org/apache/jdo/impl/enhancer/classfile/ src/java/org/apache/jdo/impl/enhancer/core/ src/java/org/apache/jdo/impl/enhancer/generator/ src/java/org/apache/jdo/impl/enhancer/meta/ src/java/org/apache/jdo/impl/enhancer/meta/model/ src/java/org/apache/jdo/impl/enhancer/meta/prop/ src/java/org/apache/jdo/impl/enhancer/meta/util/ src/java/org/apache/jdo/impl/enhancer/util/ test/ test/sempdept/ test/sempdept/src/ test/sempdept/src/empdept/

Author: mbo
Date: Sun May 22 10:55:51 2005
New Revision: 171351

URL: http://svn.apache.org/viewcvs?rev=171351&view=rev
Log:
First version of JDO2 implementation (Enhancere). It includes the implementation of the byte code enhancer.

Added:
    incubator/jdo/trunk/enhancer20/
    incubator/jdo/trunk/enhancer20/maven.xml
    incubator/jdo/trunk/enhancer20/project.properties
    incubator/jdo/trunk/enhancer20/project.xml
    incubator/jdo/trunk/enhancer20/src/
    incubator/jdo/trunk/enhancer20/src/conf/
    incubator/jdo/trunk/enhancer20/src/conf/commons-logging.properties
    incubator/jdo/trunk/enhancer20/src/conf/logging.properties
    incubator/jdo/trunk/enhancer20/src/conf/simplelog.properties
    incubator/jdo/trunk/enhancer20/src/java/
    incubator/jdo/trunk/enhancer20/src/java/org/
    incubator/jdo/trunk/enhancer20/src/java/org/apache/
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/enhancer/
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/enhancer/EnhancerMain.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/enhancer/Main.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/enhancer/package.html
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/Bundle.properties
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/ClassArgMain.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/ClassArgOptions.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/ClassFileEnhancer.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/ClassFileEnhancerHelper.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/ClassFileEnhancerTimer.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/EnhancerClassLoader.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/EnhancerFatalError.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/EnhancerOptions.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/EnhancerUserException.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/GenericMain.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/GenericOptions.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/JdoMetaMain.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/JdoMetaOptions.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/LogSupport.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/OptionSet.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/OutputStreamWrapper.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/PersistenceLauncher.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/AnnotatedClassAttribute.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/AnnotatedMethodAttribute.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/AttributeVector.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ClassAttribute.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ClassField.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ClassFile.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ClassMember.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ClassMethod.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ClassPrint.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/CodeAttribute.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/CodeEnv.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstBasic.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstBasicMemberRef.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstClass.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstDouble.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstFieldRef.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstFloat.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstInteger.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstInterfaceMethodRef.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstLong.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstMethodRef.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstNameAndType.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstString.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstUnicode.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstUtf8.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstValue.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstantPool.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ConstantValueAttribute.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/Descriptor.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ExceptionRange.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ExceptionTable.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/ExceptionsAttribute.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/GenericAttribute.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/Insn.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/InsnConstOp.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/InsnError.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/InsnIInc.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/InsnIntOp.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/InsnInterfaceInvoke.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/InsnLookupSwitch.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/InsnMultiDimArrayNew.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/InsnReadEnv.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/InsnSingle.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/InsnTableSwitch.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/InsnTarget.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/InsnTargetOp.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/InsnUtils.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/LineNumberTableAttribute.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/LocalVariable.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/LocalVariableTableAttribute.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/SourceFileAttribute.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/SyntheticAttribute.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/VMConstants.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/classfile/VMOp.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/core/
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/core/Analyzer.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/core/Annotater.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/core/Augmenter.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/core/Builder.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/core/Controller.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/core/EnhancerConstants.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/core/EnhancerFilter.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/core/Environment.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/generator/
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/generator/CodeWriter.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/generator/ImplHelper.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/generator/Main.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/generator/NameHelper.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/EnhancerMetaData.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/EnhancerMetaDataFatalError.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/EnhancerMetaDataUserException.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/ExtendedMetaData.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/model/
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/model/EnhancerJavaModel.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/model/EnhancerJavaType.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/model/EnhancerMetaDataJDOModelImpl.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/prop/
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/prop/EnhancerMetaDataPropertyImpl.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/prop/JDOClass.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/prop/JDOField.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/prop/MetaDataProperties.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/prop/NameHelper.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/util/
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/util/EnhancerMetaDataBaseModel.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/meta/util/EnhancerMetaDataTimer.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/util/
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/util/AnnotationTest.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/util/Assertion.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/util/AugmentationDiffTest.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/util/AugmentationTest.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/util/CombinedResourceLocator.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/util/Disassembler.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/util/InternalError.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/util/ListResourceLocator.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/util/PathResourceLocator.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/util/ResourceLocator.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/util/ResourceLocatorBase.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/util/ResourceLocatorTimer.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/util/Support.java
    incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/util/Timer.java
    incubator/jdo/trunk/enhancer20/test/
    incubator/jdo/trunk/enhancer20/test/common.xml
    incubator/jdo/trunk/enhancer20/test/sempdept/
    incubator/jdo/trunk/enhancer20/test/sempdept/build.xml
    incubator/jdo/trunk/enhancer20/test/sempdept/src/
    incubator/jdo/trunk/enhancer20/test/sempdept/src/empdept/
    incubator/jdo/trunk/enhancer20/test/sempdept/src/empdept.jdoproperties
    incubator/jdo/trunk/enhancer20/test/sempdept/src/empdept/Department.java
    incubator/jdo/trunk/enhancer20/test/sempdept/src/empdept/Employee.java
    incubator/jdo/trunk/enhancer20/test/sempdept/src/empdept/FullTimeEmployee.java
    incubator/jdo/trunk/enhancer20/test/sempdept/src/empdept/PartTimeEmployee.java
    incubator/jdo/trunk/enhancer20/test/sempdept/src/empdept/package.jdo

Added: incubator/jdo/trunk/enhancer20/maven.xml
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/enhancer20/maven.xml?rev=171351&view=auto
==============================================================================
--- incubator/jdo/trunk/enhancer20/maven.xml (added)
+++ incubator/jdo/trunk/enhancer20/maven.xml Sun May 22 10:55:51 2005
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright 2005 The Apache Software Foundation
+
+    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.
+-->
+
+<project default="default"
+    xmlns:j="jelly:core"
+    xmlns:ant="jelly:ant"
+    xmlns:maven="jelly:maven"
+    >
+
+    <!-- ==================== -->
+    <!-- Default Global Goals -->
+    <!-- ==================== -->
+
+    <goal name="default">
+        <attainGoal name="jar:install-snapshot"/>
+    </goal>
+
+    <goal name="build">
+        <attainGoal name="default"/>
+    </goal>
+
+    <goal name="rebuild">
+        <attainGoal name="clean"/>
+        <attainGoal name="build"/>
+    </goal>
+
+    <postGoal name="clean:clean">
+        <ant dir="${basedir}/test/sempdept" target="clean" inheritAll="false"/>
+    </postGoal>
+
+    <goal name="clobber" prereqs="clean">
+        <delete>
+            <fileset dir="." defaultexcludes="no" includes="**/*~"/>
+        </delete>
+        <ant dir="${basedir}/test/sempdept" target="mrproper" inheritAll="false"/>
+    </goal>
+
+    <!-- ================== -->
+    <!-- Running test cases -->
+    <!-- ================== -->
+
+    <goal name="runtest">
+        <attainGoal name="Generator"/>
+        <attainGoal name="Enhancer"/>
+    </goal>
+
+    <!-- Generator tests 
+    -->
+    
+    <goal name="Generator">
+      <ant dir="${basedir}/test/sempdept" antfile="build.xml" target="all_gen" inheritAll="false">
+        <property name="jdoapi" value="${jdo.jdoapi.jarfile}"/>
+        <property name="jdocore" value="${jdo.jdocore.jarfile}"/>
+        <property name="jdoenhancer" value="${maven.build.dir}/classes"/>
+        <property name="logging" value="${logging.jarfile}"/>
+        <property name="xmlparser" value="${xmlparser}"/>
+        <property name="verbose" value="${verbose}"/>
+      </ant>
+    </goal>
+    
+    <!-- Enhancer tests 
+    -->
+    
+    <goal name="Enhancer">
+      <ant dir="${basedir}/test/sempdept" antfile="build.xml" target="compile" inheritAll="false">
+        <property name="jdoapi" value="${jdo.jdoapi.jarfile}"/>
+        <property name="jdocore" value="${jdo.jdocore.jarfile}"/>
+        <property name="jdoenhancer" value="${maven.build.dir}/classes"/>
+        <property name="logging" value="${logging.jarfile}"/>
+        <property name="xmlparser" value="${xmlparser}"/>
+        <property name="verbose" value="${verbose}"/>
+      </ant>
+      <ant dir="${basedir}/test/sempdept" antfile="build.xml" target="all_enh" inheritAll="false">
+        <property name="jdoapi" value="${jdo.jdoapi.jarfile}"/>
+        <property name="jdocore" value="${jdo.jdocore.jarfile}"/>
+        <property name="jdoenhancer" value="${maven.build.dir}/classes"/>
+        <property name="logging" value="${logging.jarfile}"/>
+        <property name="xmlparser" value="${xmlparser}"/>
+        <property name="verbose" value="${verbose}"/>
+      </ant>
+    </goal>
+    
+</project>

Added: incubator/jdo/trunk/enhancer20/project.properties
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/enhancer20/project.properties?rev=171351&view=auto
==============================================================================
--- incubator/jdo/trunk/enhancer20/project.properties (added)
+++ incubator/jdo/trunk/enhancer20/project.properties Sun May 22 10:55:51 2005
@@ -0,0 +1,37 @@
+#
+# Copyright 2005 The Apache Software Foundation.
+# 
+# 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.
+
+# checkstyle settings
+maven.checkstyle.properties = ${basedir}/../jdo_checks.xml
+
+# dependencies
+jdo.jdoapi.jarfile = ${pom.getDependencyPath('apache-jdo:jdo1-api')}
+jdo.jdocore.jarfile = ${pom.getDependencyPath('apache-jdo:jdo2-core')}
+logging.jarfile = ${pom.getDependencyPath('commons-logging')}
+xmlparser = 
+
+# enhancer 
+jdo.enhancer.enhanced.dir = ${maven.build.dir}/test-classes
+jdo.enhancer.main = org.apache.jdo.enhancer.Main
+jdo.enhancer.options = -f -d "${jdo.enhancer.enhanced.dir}" -s "${jdo.enhancer.sourcepath}"
+jdo.enhancer.sourcepath = ${maven.build.dir}/test-classes${path.separator}${jdo.jdoapi.jarfile}
+jdo.enhancer.classpath = ${maven.build.dir}/classes${path.separator}${jdo.jdocore.jarfile}${path.separator}${jdo.jdoapi.jarfile}${path.separator}${logging.jarfile}
+jdo.annotationtest.main = org.apache.jdo.impl.enhancer.util.AnnotationTest
+jdo.annotationtest.options = -s "${jdo.enhancer.enhanced.dir}${path.separator}${jdo.enhancer.sourcepath}"
+jdo.augmentationtest.main = org.apache.jdo.impl.enhancer.util.AugmentationTest
+jdo.augmentationtest.options = -s "${jdo.enhancer.enhanced.dir}${path.separator}${jdo.enhancer.sourcepath}"
+jdo.xmlexists.main = org.apache.jdo.impl.model.jdo.xml.XMLExists
+jdo.xmlexists.classpath = ${maven.build.dir}/test-classes${path.separator}${path.separator}${jdo.jdocore.jarfile}${path.separator}${jdo.jdoapi.jarfile}${path.separator}${logging.jarfile}
+

Added: incubator/jdo/trunk/enhancer20/project.xml
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/enhancer20/project.xml?rev=171351&view=auto
==============================================================================
--- incubator/jdo/trunk/enhancer20/project.xml (added)
+++ incubator/jdo/trunk/enhancer20/project.xml Sun May 22 10:55:51 2005
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright 2005 The Apache Software Foundation
+
+    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.
+-->
+
+<project>
+    <pomVersion>3</pomVersion>
+    <extend>../project.xml</extend>
+    <!-- ============== -->
+    <!-- Identification -->
+    <!-- ============== -->
+    <name>JDO2 Implementation (Enhancer)</name>
+    <artifactId>jdo2-enhancer</artifactId>
+    <currentVersion>2.0</currentVersion>
+    <package>org.apache.jdo</package>
+    <shortDescription>Java Data Object 2.0 (JDO) Enhancer</shortDescription>
+    <description>The Java Data Objects 2.0 (JDO) API is a standard interface-based 
+Java model abstraction of persistence, developed as Java Specification 
+Request JSR 243 under the auspices of the Java Community Process.</description>
+    <repository />
+    <!-- ============ -->
+    <!-- Dependencies -->
+    <!-- ============ -->
+    <dependencies>
+        <dependency>
+            <groupId>apache-jdo</groupId>
+            <artifactId>jdo1-api</artifactId>
+            <version>SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>apache-jdo</groupId>
+            <artifactId>jdo2-core</artifactId>
+            <version>SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <id>commons-logging</id>
+            <version>1.0.4</version>
+        </dependency>
+    </dependencies>
+    <!-- =================== -->
+    <!-- Build Specification -->
+    <!-- =================== -->
+    <build>
+        <sourceDirectory>src/java</sourceDirectory>
+        <!-- J A R  R E S O U R C E S -->
+        <!-- Resources that are packaged up inside the JAR file -->
+        <resources>
+            <resource>
+                <directory>${basedir}/src/java</directory>
+                <includes>
+                    <include>**/*.properties</include>
+                </includes>
+            </resource>
+        </resources>
+    </build>
+</project>
+

Added: incubator/jdo/trunk/enhancer20/src/conf/commons-logging.properties
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/enhancer20/src/conf/commons-logging.properties?rev=171351&view=auto
==============================================================================
--- incubator/jdo/trunk/enhancer20/src/conf/commons-logging.properties (added)
+++ incubator/jdo/trunk/enhancer20/src/conf/commons-logging.properties Sun May 22 10:55:51 2005
@@ -0,0 +1,38 @@
+#
+# Copyright 2005 The Apache Software Foundation.
+# 
+# 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.
+
+#
+# This is a sample apache commons logging configuration file defining logging
+# properties for the JDO2 Implementation (Enhancer) sources. It defines what
+# logging implementation the apache commons logging API should use by specifying
+# the property org.apache.commons.logging.Log (see below). Please note, that
+# there are separate property files for each logging implementation to set the
+# log level of the loggers:
+# - SimpleLog:      simplelog.properties 
+# - JDK1.4 logging: logging.properties
+#
+# The JDO2 Implementation (Enhancer) sources use the following logger instances:
+# Dependent projects:
+# org.apache.jdo.util                 Utility classes
+# org.apache.jdo.impl.model.jdo       JDOModel implementation
+# org.apache.jdo.impl.model.jdo.xml   XML parser for JDO metadata files
+#
+
+# Uncomment the next line if you want to use the apache simple logger
+#org.apache.commons.logging.Log = org.apache.commons.logging.impl.SimpleLog
+
+# Uncomment the next two lines if you want to use JDK 1.4 logging
+#org.apache.commons.logging.Log = org.apache.jdo.util.JDOJdk14Logger
+

Added: incubator/jdo/trunk/enhancer20/src/conf/logging.properties
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/enhancer20/src/conf/logging.properties?rev=171351&view=auto
==============================================================================
--- incubator/jdo/trunk/enhancer20/src/conf/logging.properties (added)
+++ incubator/jdo/trunk/enhancer20/src/conf/logging.properties Sun May 22 10:55:51 2005
@@ -0,0 +1,53 @@
+#
+# Copyright 2005 The Apache Software Foundation.
+# 
+# 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.
+
+#
+# This is a sample properties file to configure standard JDK 1.4 logging for 
+# the JDO2 Implementation (Enhancer) sources. 
+# Below you find an entry for each of the source logger instances. 
+# Please uncomment the line and adapt the log level to your needs, 
+# in case to want to enable a particular logger.
+#
+# The following describes the mapping between the log level of JDK 1.4 logging
+# and apache commns logging:
+#   JDK 1.4        Apache 
+#   FINEST         trace 
+#   FINE, FINER    debug 
+#   INFO, CONFIG   info
+#   WARNING        warn
+#   SEVERE         error, fatal
+#
+
+######################
+# Enhancer source logger
+######################
+
+######################
+# Dependent projects
+######################
+
+# Utility class logger
+#org.apache.jdo.util.level = FINE
+# JDOModel logger
+#org.apache.jdo.impl.model.jdo.level = FINE
+# XML parser logger
+#org.apache.jdo.impl.model.jdo.xml.level = FINE
+
+######################
+# JDK 1.4 logging properties
+######################
+
+handlers = java.util.logging.ConsoleHandler
+java.util.logging.ConsoleHandler.level = FINEST

Added: incubator/jdo/trunk/enhancer20/src/conf/simplelog.properties
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/enhancer20/src/conf/simplelog.properties?rev=171351&view=auto
==============================================================================
--- incubator/jdo/trunk/enhancer20/src/conf/simplelog.properties (added)
+++ incubator/jdo/trunk/enhancer20/src/conf/simplelog.properties Sun May 22 10:55:51 2005
@@ -0,0 +1,43 @@
+#
+# Copyright 2005 The Apache Software Foundation.
+# 
+# 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.
+
+#
+# This is a sample properties file to configure apache commons logging SimpleLog
+# implementation for the JDO2 Implementation (Enhancer) sources. 
+# Below you find an entry for each of the source logger instances. 
+# Please uncomment the line and adapt the log level to your needs, 
+# in case to want to enable a particular logger.
+#
+
+######################
+# Enhancer source logger
+######################
+
+######################
+# Dependent projects
+######################
+
+# Utility class logger
+#org.apache.commons.logging.simplelog.log.org.apache.jdo.util = debug
+# JDOModel logger
+#org.apache.commons.logging.simplelog.log.org.apache.jdo.impl.model.jdo = debug
+# XML parser logger
+#org.apache.commons.logging.simplelog.log.org.apache.jdo.impl.model.jdo.xml = debug
+
+######################
+# Default logging level
+######################
+
+org.apache.commons.logging.simplelog.defaultlog = error

Added: incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/enhancer/EnhancerMain.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/enhancer/EnhancerMain.java?rev=171351&view=auto
==============================================================================
--- incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/enhancer/EnhancerMain.java (added)
+++ incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/enhancer/EnhancerMain.java Sun May 22 10:55:51 2005
@@ -0,0 +1,387 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * 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.jdo.enhancer;
+
+import java.io.IOException;
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.PrintWriter;
+
+import java.util.List;
+import java.util.Iterator;
+import java.util.Properties;
+
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+import org.apache.jdo.impl.enhancer.ClassFileEnhancer;
+import org.apache.jdo.impl.enhancer.ClassFileEnhancerHelper;
+import org.apache.jdo.impl.enhancer.ClassFileEnhancerTimer;
+import org.apache.jdo.impl.enhancer.EnhancerFatalError;
+import org.apache.jdo.impl.enhancer.EnhancerOptions;
+import org.apache.jdo.impl.enhancer.EnhancerUserException;
+import org.apache.jdo.impl.enhancer.JdoMetaMain;
+import org.apache.jdo.impl.enhancer.OutputStreamWrapper;
+import org.apache.jdo.impl.enhancer.core.EnhancerFilter;
+
+
+
+/**
+ * JDO command line enhancer.
+ *
+ * @author Martin Zaun
+ */
+public class EnhancerMain
+    extends JdoMetaMain
+{
+    /**
+     *  The options and arguments.
+     */
+    protected EnhancerOptions options;
+
+    /**
+     *  The byte code enhancer.
+     */
+    protected ClassFileEnhancer enhancer;
+
+    /**
+     * Creates an instance.
+     */
+    public EnhancerMain(PrintWriter out,
+                        PrintWriter err)
+    {
+        this(out, err, new EnhancerOptions(out, err));
+    }
+
+    /**
+     * Creates an instance.
+     */
+    public EnhancerMain(PrintWriter out,
+                        PrintWriter err,
+                        EnhancerOptions options)
+    {
+        super(out, err, options);
+        this.options = options;
+    }
+
+    // ----------------------------------------------------------------------
+
+    /**
+     * Enhances all files entered in the command line.
+     *
+     * @param  classNames  List of class names.
+     * @param  classFileNames  List of class file names.
+     * @param  archiveFileNames  List of archive file names.
+     */
+    private int enhanceInputFiles(List classNames,
+                                  List classFileNames,
+                                  List archiveFileNames)
+    {
+        int res = 0;
+        try {
+            String name = null;
+            for (Iterator i = archiveFileNames.iterator(); i.hasNext();) {
+                try {
+                    name = (String)i.next();
+                    enhanceArchiveFile(name);
+                } catch (EnhancerUserException ex) {
+                    printlnErr("Error while enhancing " + name, ex, 
+                               options.verbose.value);
+                    res++;
+                    continue;
+                }
+            }
+            for (Iterator i = classFileNames.iterator(); i.hasNext();) {
+                try {
+                    name = (String)i.next();
+                    enhanceClassFile(openFileInputStream(name));
+                } catch (EnhancerUserException ex) {
+                    printlnErr("Error while enhancing " + name, ex, 
+                               options.verbose.value);
+                    res++;
+                    continue;
+                }
+            }
+            for (Iterator i = classNames.iterator(); i.hasNext();) {
+                try {
+                    name = (String)i.next();
+                    enhanceClassFile(openClassInputStream(name));
+                } catch (EnhancerUserException ex) {
+                    printlnErr("Error while enhancing " + name, ex, 
+                               options.verbose.value);
+                    res++;
+                    continue;
+                }
+            }
+        } catch (IOException ex) {
+            printlnErr("IO Error while enhancing", ex, options.verbose.value);
+            return ++res;
+        } catch (EnhancerFatalError ex) {
+            // enhancer is not anymore guaranteed to be consistent
+            printlnErr("Fatal error while enhancing", ex, options.verbose.value);
+            enhancer = null;
+            return ++res;
+        }
+        return res;
+    }
+
+    /**
+     * Enhances a classfile.
+     *
+     * @param  in  The input stream of the classfile.
+     */
+    private void enhanceClassFile(InputStream in)
+        throws IOException, EnhancerUserException, EnhancerFatalError
+    {
+        OutputStream out = null;
+        try {
+            final File temp = File.createTempFile("enhancer", ".class");
+            out = new BufferedOutputStream(new FileOutputStream(temp));
+
+            //enhance
+            final OutputStreamWrapper wrapper = new OutputStreamWrapper(out);
+            final boolean enhanced = enhancer.enhanceClassFile(in, wrapper);
+
+            closeOutputStream(out);
+            out = null;
+            createOutputFile(enhanced,
+                             getClassFileName(wrapper.getClassName()), temp);
+        } finally {
+            closeInputStream(in);
+            closeOutputStream(out);
+        }
+    }
+
+    /**
+     * Enhances a archive file.
+     *
+     * @param  fileName  The filename of the archive file.
+     */
+    private void enhanceArchiveFile(String fileName)
+        throws IOException, EnhancerUserException, EnhancerFatalError
+    {
+        ZipInputStream in = null;
+        ZipOutputStream out = null;
+        try {
+            final File temp = File.createTempFile("enhancer", ".zip");
+            in = new ZipInputStream(new BufferedInputStream(
+                new FileInputStream(new File(fileName))));
+            out = new ZipOutputStream(new BufferedOutputStream(
+                new FileOutputStream(temp)));
+
+            // enhance the archive file
+            final boolean enhanced
+                = ClassFileEnhancerHelper.enhanceZipFile(enhancer, in, out);
+
+            // create the output file
+            closeOutputStream(out);
+            out = null;
+            createOutputFile(enhanced, new File(fileName).getName(), temp);
+        } finally {
+            closeOutputStream(out);
+            closeInputStream(in);
+        }
+    }
+
+    /**
+     * Creates a file object that represents the output archive file for
+     * a given archive file to enhance.
+     *
+     * @param  archiveFileName  the input archive file name
+     * @return  the output archive file
+     */
+    private File createArchiveOutputFile(String archiveFileName)
+    {
+        return new File(options.destDir.value,
+                        new File(archiveFileName).getName());
+    }
+
+    /**
+     * Creates the output file for an enhanced class- or archive file. If the
+     * enhanced file is written back depends on the command line options.
+     *
+     * @param  enhanced  Has the input file been enhanced?
+     * @param  fileName  The name of the output file.
+     * @param  temp      The temp file, the output is written to.
+     * @exception  IOException  If the file could not be created.
+     */
+    private void createOutputFile(boolean enhanced,
+                                  String fileName,
+                                  File temp)
+        throws IOException
+    {
+        //noWrite or (not enhanced and not forceWrite)
+        if (options.noWrite.value
+            || (!enhanced && !options.forceWrite.value)) {
+            temp.deleteOnExit();
+            return;
+        }
+
+        // create file and its parent directory
+        final File file = new File(options.destDir.value, fileName);
+        final File dir = file.getAbsoluteFile().getParentFile();
+        if (!dir.exists() && !dir.mkdirs()) {
+            throw new IOException("Error creating directory '"
+                                  + dir.getAbsolutePath() + "'.");
+        }
+
+        file.delete();  //delete old file if exists
+        boolean renamed = temp.renameTo(file);
+        if (!renamed) {
+            //@dave: empirical evidence shows that renameTo does not allow for
+            // crossing filesystem boundaries.  If it fails, try "by hand".
+            InputStream in = null;
+            OutputStream out = null;
+            try {
+                in = new FileInputStream(temp);
+                out = new FileOutputStream(file);
+                int PAGESIZE = 4096; // Suggest a better size?
+                byte data[] = new byte[PAGESIZE];
+                while (in.available() > 0) {
+                    int numRead = in.read(data, 0, PAGESIZE);
+                    out.write(data, 0, numRead);
+                }
+                renamed = true;
+            } catch (IOException ex) {
+                throw new IOException("Could not rename temp file '" +
+                                      temp.getAbsolutePath() +
+                                      "' to '" + file.getAbsolutePath()
+                                      + "': " + ex);
+            } finally {
+                closeInputStream(in);
+                closeOutputStream(out);
+            }
+            if (renamed) {
+                temp.delete();  //delete temporary file
+            }
+            else {
+                throw new IOException("Could not rename temp file '" +
+                                      temp.getAbsolutePath() +
+                                      "' to '" + file.getAbsolutePath() + "'.");
+            }
+        }
+    }
+
+    /**
+     * Closes an output stream.
+     *
+     * @param  out  the output stream
+     */
+    private void closeOutputStream(OutputStream out)
+    {
+        if (out != null) {
+            try {
+                out.close();
+            } catch (IOException ex) {
+                printlnErr("", ex, options.verbose.value);
+            }
+        }
+    }
+
+    // ----------------------------------------------------------------------
+
+    /**
+     * Initializes all components.
+     */
+    protected void init()
+        throws EnhancerFatalError, EnhancerUserException
+    {
+        super.init();
+
+        final Properties props = new Properties();
+        if (options.verbose.value) {
+            props.put(EnhancerFilter.VERBOSE_LEVEL,
+                      EnhancerFilter.VERBOSE_LEVEL_VERBOSE);
+        }
+        
+        if (options.doTiming.value) {
+            props.put(EnhancerFilter.DO_TIMING_STATISTICS,
+                      Boolean.TRUE.toString());
+        }
+
+        if (options.dumpClass.value) {
+            props.put(EnhancerFilter.DUMP_CLASS,
+                      Boolean.TRUE.toString());
+        }
+
+        if (options.noAugment.value) {
+            props.put(EnhancerFilter.NO_AUGMENT,
+                      Boolean.TRUE.toString());
+        }
+
+        if (options.noAnnotate.value) {
+            props.put(EnhancerFilter.NO_ANNOTATE,
+                      Boolean.TRUE.toString());
+        }
+
+        try {
+            enhancer = new EnhancerFilter(jdoMeta, props, out, err);
+            if (options.doTiming.value) {
+                // wrap with timing byte-code enhancer
+                enhancer = new ClassFileEnhancerTimer(enhancer);
+            }
+        } catch (EnhancerUserException ex) {
+            printlnErr("Error while creating the enhancer", ex, 
+                       options.verbose.value);
+            throw ex;
+        } catch (EnhancerFatalError ex) {
+            // enhancer is not anymore guaranteed to be consistent
+            printlnErr("Fatal error while creating the enhancer", ex, 
+                       options.verbose.value);
+            enhancer = null;
+            throw ex;
+        } catch (RuntimeException ex) {
+            // enhancer is not anymore guaranteed to be consistent
+            printlnErr("Internal error while creating the enhancer", ex, 
+                       options.verbose.value);
+            enhancer = null;
+            throw new EnhancerFatalError(ex);
+        }
+    }
+
+    /**
+     * Run the enhancer.
+     */
+    protected int process()
+    {
+        return enhanceInputFiles(options.classNames,
+                                 options.classFileNames,
+                                 options.archiveFileNames);
+    }
+
+    // ----------------------------------------------------------------------
+
+    /**
+     * Runs this class
+     */
+    static public void main(String[] args)
+    {
+        final PrintWriter out = new PrintWriter(System.out, true);
+        out.println("--> EnhancerMain.main()");
+        //out.println("JDO RI Class-File Enhancer");
+        final EnhancerMain main = new EnhancerMain(out, out);
+        int res = main.run(args);
+        //out.println("done.");
+        out.println("<-- EnhancerMain.main(): exit = " + res);
+        System.exit(res);
+    }
+}

Added: incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/enhancer/Main.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/enhancer/Main.java?rev=171351&view=auto
==============================================================================
--- incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/enhancer/Main.java (added)
+++ incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/enhancer/Main.java Sun May 22 10:55:51 2005
@@ -0,0 +1,957 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * 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.jdo.enhancer;
+
+import java.io.IOException;
+import java.io.FileNotFoundException;
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.PrintWriter;
+import java.io.FileReader;
+import java.io.BufferedReader;
+
+import java.util.Map;
+import java.util.List;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Properties;
+import java.util.StringTokenizer;
+
+import java.util.zip.ZipFile;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+import java.util.zip.ZipException;
+
+import java.net.URL;
+
+import org.apache.jdo.impl.enhancer.ClassFileEnhancer;
+import org.apache.jdo.impl.enhancer.ClassFileEnhancerHelper;
+import org.apache.jdo.impl.enhancer.ClassFileEnhancerTimer;
+import org.apache.jdo.impl.enhancer.EnhancerFatalError;
+import org.apache.jdo.impl.enhancer.EnhancerUserException;
+import org.apache.jdo.impl.enhancer.OutputStreamWrapper;
+import org.apache.jdo.impl.enhancer.core.EnhancerFilter;
+import org.apache.jdo.impl.enhancer.meta.EnhancerMetaData;
+import org.apache.jdo.impl.enhancer.meta.EnhancerMetaDataFatalError;
+import org.apache.jdo.impl.enhancer.meta.model.EnhancerMetaDataJDOModelImpl;
+import org.apache.jdo.impl.enhancer.meta.prop.EnhancerMetaDataPropertyImpl;
+import org.apache.jdo.impl.enhancer.meta.util.EnhancerMetaDataBaseModel;
+import org.apache.jdo.impl.enhancer.meta.util.EnhancerMetaDataTimer;
+import org.apache.jdo.impl.enhancer.util.CombinedResourceLocator;
+import org.apache.jdo.impl.enhancer.util.ListResourceLocator;
+import org.apache.jdo.impl.enhancer.util.PathResourceLocator;
+import org.apache.jdo.impl.enhancer.util.ResourceLocator;
+import org.apache.jdo.impl.enhancer.util.ResourceLocatorTimer;
+import org.apache.jdo.impl.enhancer.util.Support;
+
+
+
+
+
+/**
+ * Main is the starting point for the persistent filter tool.
+ */
+public class Main
+    extends Support
+{
+    // return values of main()
+    static public final int OK = 0;
+    static public final int USAGE_ERROR = -1;
+    static public final int METADATA_ERROR = -2;
+    static public final int CLASS_LOCATOR_ERROR = -3;
+    static public final int INTERNAL_ERROR = -4;
+
+    /**
+     *  The stream to write messages to.
+     */
+    private final PrintWriter out = new PrintWriter(System.out, true);
+
+    /**
+     *  The stream to write error messages to.
+     */
+    private final PrintWriter err = new PrintWriter(System.err, true);
+
+    /**
+     *  The command line options.
+     */
+    private final CmdLineOptions opts = new CmdLineOptions();
+
+    /**
+     *  The byte code enhancer.
+     */
+    private ClassFileEnhancer enhancer;
+
+    /**
+     *  The locator for classes.
+     */
+    protected ResourceLocator classLocator;
+
+    /**
+     *  The metadata for the enhancer.
+     */
+    private EnhancerMetaData jdoMetaData;
+
+    /**
+     * Construct a filter tool instance
+     */
+    public Main()
+    {}
+
+    // ----------------------------------------------------------------------
+
+    /**
+     * This is where it all starts.
+     */
+    public static void main(String[] argv)
+    {
+        int res;
+        final Main main = new Main();
+
+        //@olsen: added support for timing statistics
+        try {
+            res = main.process(argv);
+        } catch (RuntimeException ex) {
+            main.out.flush();
+            main.err.println("Internal error while postprocessing: "
+                             + ex.getMessage());
+            ex.printStackTrace(main.err);
+            main.err.flush();
+            res = INTERNAL_ERROR;
+        } finally {
+            //@olsen: added support for timing statistics
+            if (main.opts.doTiming) {
+                Support.timer.print();
+            }
+        }
+        System.exit(res);
+    }
+
+    /**
+     * Process command line options and run enhancer.
+     */
+    public int process(String[] argv)
+    {
+        int res;
+
+        if ((res = opts.processArgs(argv)) != OK) {
+            printMessage("aborted with errors.");
+            return res;
+        }
+
+        //@olsen: added support for timing statistics
+        try {
+            if (opts.doTiming) {
+                timer.push("Main.process(String[])");
+            }
+
+            if ((res = createEnhancer()) != OK) {
+                printMessage("aborted with errors.");
+                return res;
+            }
+
+            if ((res = enhanceInputFiles(opts.classNames,
+                                         opts.classFileNames,
+                                         opts.zipFileNames,
+                                         opts.jdoFileNames)) != OK) {
+                printMessage("aborted with errors.");
+                return res;
+            }
+
+            printMessage("done.");
+            return 0;
+        } finally {
+            if (opts.doTiming) {
+                timer.pop();
+            }
+        }
+    }
+
+    // ----------------------------------------------------------------------
+
+    /**
+     *  A class for holding the command line options.
+     */
+    private class CmdLineOptions
+    {
+        final List classNames = new ArrayList();        
+        final List classFileNames = new ArrayList();        
+        final List zipFileNames = new ArrayList();        
+        final List jdoFileNames = new ArrayList();        
+        String sourcePath = null;
+        String destinationDirectory = null;
+        String propertiesFileName = null;
+        boolean doTiming = false;
+        boolean verbose = false;
+        boolean quiet = false;
+        boolean forceWrite = false;
+        boolean noWrite = false;
+        boolean dumpClass = false;
+        boolean noAugment = false;
+        boolean noAnnotate = false;
+
+        /**
+         * Print a usage message to System.err.
+         */
+        public void usage() {
+            err.println("Usage: main <options> <arguments>...");
+            err.println("Options:");
+            err.println("  -h, --help               print usage message and exit gently");
+            err.println("  -v, --verbose            print verbose messages");
+            err.println("  -q, --quiet              supress warnings");
+            err.println("  -s, --sourcepath <path>  source path for jdo and classfiles");
+            err.println("  -d, --destdir <dir>      destination directory for output files");
+            err.println("  -f, --force              overwrite output files");
+            err.println("  -n, --nowrite            never write output files");
+            err.println("  -t, --timing             do timing messures");
+            err.println();
+            err.println("Debugging Options:");
+            err.println("      --properties <file>  use property file for meta data");
+            err.println("      --dumpclass          print out disassembled code of classes");
+            err.println("      --noaugment          do not enhance for persistence-capability");
+            err.println("      --noannotate         do not enhance for persistence-awareness");
+            err.println();
+            err.println("Arguments:");
+            //err.println("  <class>      the fully qualified name of a Java class");
+            err.println("  <jdofile>    the name of a .jdo file");
+            err.println("  <classfile>  the name of a .class file");
+            //err.println("  <zipfile>    the name of a .zip or .jar file");
+            err.println();
+            err.println("Returns a non-zero value in case of errors.");
+        }
+
+        /**
+         * Process command line options.
+         */
+        protected int processArgs(String[] argv)
+        {
+            final Collection inputNames = new ArrayList();
+            for (int i = 0; i < argv.length; i++) {
+                final String arg = argv[i];
+                if (arg.equals("-h")
+                    || arg.equals("--help")) {
+                    usage();
+                    return OK;
+                }
+                if (arg.equals("-v")
+                    || arg.equals("--verbose")) {
+                    verbose = true;
+                    quiet = false;
+                    continue;
+                }
+                if (arg.equals("-q")
+                    || arg.equals("--quiet")) {
+                    quiet = true;
+                    verbose = false;
+                    continue;
+                }
+                if (arg.equals("-t") ||
+                    arg.equals("--timing")) {
+                    doTiming = true;
+                    continue;
+                }
+                if (arg.equals("-f")
+                    || arg.equals("--force")) {
+                    forceWrite = true;
+                    noWrite = false;
+                    continue;
+                }
+                if (arg.equals("-n")
+                    || arg.equals("--nowrite")) {
+                    noWrite = true;
+                    forceWrite = false;
+                    continue;
+                }
+                if (arg.equals("--dumpclass")) {
+                    dumpClass = true;
+                    continue;
+                }
+                if (arg.equals("--noaugment")) {
+                    noAugment = true;
+                    continue;
+                }
+                if (arg.equals("--noannotate")) {
+                    noAnnotate = true;
+                    continue;
+                }
+                if (arg.equals("-s")
+                    || arg.equals("--sourcepath")) {
+                    if (argv.length - i < 2) {
+                        printError("Missing argument to the -s/--sourcepath option", null);
+                        usage();
+                        return USAGE_ERROR;
+                    }
+                    sourcePath = argv[++i];
+                    continue;
+                }
+                if (arg.equals("-d")
+                    || arg.equals("--destdir")) {
+                    if (argv.length - i < 2) {
+                        printError("Missing argument to the -d/-destdir option", null);
+                        usage();
+                        return USAGE_ERROR;
+                    }
+                    destinationDirectory = argv[++i];
+                    continue;
+                }
+                if (arg.equals("--properties")) {
+                    if (argv.length - i < 2) {
+                        printError("Missing argument to the --properties option", null);
+                        usage();
+                        return USAGE_ERROR;
+                    }
+                    propertiesFileName = argv[++i];
+                    continue;
+                }
+                if (arg.length() > 0 && arg.charAt(0) == '-') {
+                    printError("Unrecognized option:" + arg, null);
+                    usage();
+                    return USAGE_ERROR;
+                }
+                if (arg.length() == 0) {
+                    printMessage("Ignoring empty command line argument.");
+                    continue;
+                }
+
+                inputNames.add(arg);
+            }
+
+            // group input file arguments
+            for (Iterator names = inputNames.iterator(); names.hasNext();) {
+                final String name = (String)names.next();
+                if (isJdoFileName(name)) {
+                    jdoFileNames.add(name);
+                } else if (isClassFileName(name)) {
+                    classFileNames.add(name);
+                } else if (isZipFileName(name)) {
+                    zipFileNames.add(name);
+                } else {
+                    classNames.add(name);
+                }
+            }
+
+            if (verbose) {
+                printArgs();
+            }
+            return checkArgs();
+        }
+
+        /**
+         * Check command line options.
+         */
+        protected int checkArgs()
+        {
+            // at least one class must be specified
+            if (classNames.isEmpty()
+                && classFileNames.isEmpty()
+                && zipFileNames.isEmpty()) {
+                final String msg
+                    = "No classes specified";
+                printError(msg, null);
+                usage();
+                return USAGE_ERROR;
+            }
+
+            // at least one meta-data source must be specified for classfiles
+            if (classFileNames.size() > 0
+                && (jdoFileNames.isEmpty()
+                    && propertiesFileName == null
+                    && sourcePath == null)) {
+                final String msg
+                    = "No JDO meta-data source specified for class files";
+                printError(msg, null);
+                usage();
+                return USAGE_ERROR;
+            }
+
+            // either jdo files or jdo properties specified
+            if (!jdoFileNames.isEmpty() && propertiesFileName != null) {
+                final String msg
+                    = "Cannot have both jdo files and properties specified";
+                printError(msg, null);
+                usage();
+                return USAGE_ERROR;
+            }
+
+            return OK;
+        }
+
+        /**
+         * Print command line options.
+         */
+        protected void printArgs()
+        {
+            out.println("Enhancer: options:");
+            out.println("    verbose = " + verbose);
+            out.println("    quiet = " + quiet);
+            out.println("    forceWrite = " + forceWrite);
+            out.println("    noWrite = " + noWrite);
+            out.println("    sourcePath = " + sourcePath);
+            out.println("    destinationDirectory = " + destinationDirectory);
+            out.println("    propertiesFileName = " + propertiesFileName);
+            out.println("    doTiming = " + doTiming);
+            out.println("    classNames = {");
+            for (Iterator i = classNames.iterator(); i.hasNext();) {
+                out.println("        " + i.next());
+            }
+            out.println("    }");
+            out.println("    jdoFileNames = {");
+            for (Iterator i = jdoFileNames.iterator(); i.hasNext();) {
+                out.println("        " + i.next());
+            }
+            out.println("    }");
+            out.println("    classFileNames = {");
+            for (Iterator i = classFileNames.iterator(); i.hasNext();) {
+                out.println("        " + i.next());
+            }
+            out.println("    }");
+            out.println("    zipFileNames = {");
+            for (Iterator i = zipFileNames.iterator(); i.hasNext();) {
+                out.println("        " + i.next());
+            }
+            out.println("    }");
+            out.println("    dumpClass = " + dumpClass);
+            out.println("    noAugment = " + noAugment);
+            out.println("    noAnnotate = " + noAnnotate);
+        }
+    }
+
+    private int initClassLocator()
+    {
+        final boolean verbose = opts.verbose;
+        final List classFileNames = opts.classFileNames;
+        final List zipFileNames = opts.zipFileNames;
+        final String sourcePath = opts.sourcePath;
+        try {
+            final List locators = new ArrayList();
+
+            // create resource locator for specified class files
+            if (classFileNames != null && !classFileNames.isEmpty()) {
+                final ResourceLocator classes
+                    = new ListResourceLocator(out, verbose, classFileNames);
+                if (verbose) {
+                    out.println("Class Locator: using class files: {");
+                    for (Iterator i = classFileNames.iterator(); i.hasNext();) {
+                        out.println("    " + i.next());
+                    }
+                    out.println("}");
+                }
+                locators.add(classes);
+            }
+
+            // create resource locator for specified zip files
+            if (zipFileNames != null && !zipFileNames.isEmpty()) {
+                final StringBuffer s = new StringBuffer();
+                final Iterator i = zipFileNames.iterator();
+                s.append(i.next());
+                while (i.hasNext()) {
+                    s.append(File.pathSeparator + i.next());
+                }
+                final ResourceLocator zips
+                    = new PathResourceLocator(out, verbose, s.toString());
+                if (verbose)
+                    out.println("Class Locator: using jar/zip files: "
+                                + s.toString());
+                locators.add(zips);
+            }
+
+            // create resource locator for specified source path
+            if (sourcePath != null && sourcePath.length() > 0) {
+                final ResourceLocator path
+                    = new PathResourceLocator(out, verbose, sourcePath);
+                if (verbose)
+                    out.println("Class Locator: using source path: "
+                                + sourcePath);
+                locators.add(path);
+            }
+
+            // print warning if no classes specified
+            affirm(!locators.isEmpty());
+            //if (locators.isEmpty()) {
+            //    printWarning(getI18N("enhancer.using_no_classes"));
+            //}
+
+            // init class locators
+            classLocator
+                = new CombinedResourceLocator(out, verbose, locators);
+
+            // wrap with timing class locator
+            if (opts.doTiming) {
+                classLocator = new ResourceLocatorTimer(classLocator);
+            }
+        } catch (IOException ex) {
+            printError("Cannot initialize resource locator for classes", ex);
+            return CLASS_LOCATOR_ERROR;
+        }
+        return OK;
+    }
+
+    private int initEnhancerMetaData()
+    {
+        final boolean verbose = opts.verbose;
+        final String propertiesFileName = opts.propertiesFileName;
+        final List jdoFileNames = opts.jdoFileNames;
+        final List zipFileNames = opts.zipFileNames;
+        final String sourcePath = opts.sourcePath;
+        try {
+            if (propertiesFileName != null) {
+                jdoMetaData
+                    = new EnhancerMetaDataPropertyImpl(out, verbose,
+                                                       propertiesFileName);
+            } else {
+                jdoMetaData
+                    = new EnhancerMetaDataJDOModelImpl(out, verbose,
+                                                       jdoFileNames,
+                                                       zipFileNames,
+                                                       sourcePath);
+            }
+
+            // wrap with timing meta data object
+            if (opts.doTiming) {
+                jdoMetaData = new EnhancerMetaDataTimer(jdoMetaData);
+            }
+        } catch (EnhancerMetaDataFatalError ex) {
+            printError("Cannot initialize JDO meta-data source", ex);
+            return METADATA_ERROR;
+        }
+        return OK;
+    }
+    
+    private int createEnhancer()
+    {
+        int res0 = initClassLocator();
+        if (res0 < 0) {
+            return res0;
+        }
+        affirm(classLocator != null);
+
+        int res = initEnhancerMetaData();
+        if (res < 0) {
+            return res;
+        }
+        affirm(jdoMetaData != null);
+
+        final Properties props = new Properties();
+        if (opts.verbose) {
+            props.put(EnhancerFilter.VERBOSE_LEVEL,
+                      EnhancerFilter.VERBOSE_LEVEL_VERBOSE);
+        }
+        
+        if (opts.doTiming) {
+            props.put(EnhancerFilter.DO_TIMING_STATISTICS,
+                      Boolean.TRUE.toString());
+        }
+
+        if (opts.dumpClass) {
+            props.put(EnhancerFilter.DUMP_CLASS,
+                      Boolean.TRUE.toString());
+        }
+
+        if (opts.noAugment) {
+            props.put(EnhancerFilter.NO_AUGMENT,
+                      Boolean.TRUE.toString());
+        }
+
+        if (opts.noAnnotate) {
+            props.put(EnhancerFilter.NO_ANNOTATE,
+                      Boolean.TRUE.toString());
+        }
+
+        try {            
+            enhancer = new EnhancerFilter(jdoMetaData, props, out, err);
+            if (opts.doTiming) {
+                // wrap with timing byte-code enhancer
+                enhancer = new ClassFileEnhancerTimer(enhancer);
+            }
+            return 0;
+        } catch (EnhancerUserException ex) {
+            printError("Error while creating the enhancer", ex);
+            return -1;
+        } catch (EnhancerFatalError ex) {
+            // enhancer is not anymore guaranteed to be consistent
+            printError("Fatal error while creating the enhancer", ex);
+            enhancer = null;
+            return -1;
+        }
+    }
+
+    // ----------------------------------------------------------------------
+
+    /**
+     *  Enhances all files entered in the command line.
+     *
+     *  @param  classNames  List of class names.
+     *  @param  classFileNames  List of class file names.
+     *  @param  zipFileNames  List of zip file names.
+     *  @param  jdoFileNames  List of jdo file names.
+     */
+    private int enhanceInputFiles(List classNames,
+                                  List classFileNames,
+                                  List zipFileNames,
+                                  List jdoFileNames)
+    {
+        int res = 0;
+        try {
+            String name = null;
+            for (Iterator i = zipFileNames.iterator(); i.hasNext();) {
+                try {
+                    name = (String)i.next();
+                    enhanceZipFile(name);
+                } catch (EnhancerUserException ex) {
+                    printError("Error while enhancing " + name, ex);
+                    res++;
+                    continue;
+                }
+            }
+            for (Iterator i = classFileNames.iterator(); i.hasNext();) {
+                try {
+                    name = (String)i.next();
+                    enhanceClassFile(openFileInputStream(name));
+                } catch (EnhancerUserException ex) {
+                    printError("Error while enhancing " + name, ex);
+                    res++;
+                    continue;
+                }
+            }
+            for (Iterator i = classNames.iterator(); i.hasNext();) {
+                try {
+                    name = (String)i.next();
+                    enhanceClassFile(openClassInputStream(name));
+                } catch (EnhancerUserException ex) {
+                    printError("Error while enhancing " + name, ex);
+                    res++;
+                    continue;
+                }
+            }
+        } catch (IOException ex) {
+            printError("IO Error while enhancing", ex);
+            return ++res;
+        } catch (EnhancerFatalError ex) {
+            // enhancer is not anymore guaranteed to be consistent
+            printError("Fatal error while enhancing", ex);
+            enhancer = null;
+            return ++res;
+        }
+        return res;
+    }
+
+    /**
+     *  Enhances a classfile.
+     *
+     *  @param  in  The input stream of the classfile.
+     */
+    private void enhanceClassFile(InputStream in)
+        throws IOException, EnhancerUserException, EnhancerFatalError
+    {
+        OutputStream out = null;
+        try {
+            final File temp = File.createTempFile("enhancer", ".class");
+            out = new BufferedOutputStream(new FileOutputStream(temp));
+
+            //enhance
+            final OutputStreamWrapper wrapper = new OutputStreamWrapper(out);
+            final boolean enhanced = enhancer.enhanceClassFile(in, wrapper);
+
+            closeOutputStream(out);
+            out = null;
+            createOutputFile(enhanced,
+                             createClassFileName(wrapper.getClassName()),
+                             temp);
+        } finally {
+            closeInputStream(in);
+            closeOutputStream(out);
+        }
+    }
+
+    /**
+     *  Enhances a zipfile.
+     *
+     *  @param  filename  The filename of the zipfile.
+     */
+    private void enhanceZipFile(String filename)
+        throws IOException, EnhancerUserException, EnhancerFatalError
+    {
+        ZipInputStream in = null;
+        ZipOutputStream out = null;
+        try {
+            final File temp = File.createTempFile("enhancer", ".zip");
+            in = new ZipInputStream(new BufferedInputStream(
+                new FileInputStream(new File(filename))));
+            out = new ZipOutputStream(new BufferedOutputStream(
+                new FileOutputStream(temp)));
+
+            //enhance the zipfile
+            final boolean enhanced
+                = ClassFileEnhancerHelper.enhanceZipFile(enhancer, in, out);
+
+            //create the output file
+            closeOutputStream(out);
+            out = null;
+            createOutputFile(enhanced, new File(filename).getName(), temp);
+        } finally {
+            closeOutputStream(out);
+            closeInputStream(in);
+        }
+    }
+
+    /**
+     *  Opens an input stream for the given filename
+     *
+     *  @param  filename  The name of the file.
+     *  @return  The input stream.
+     *  @exception  FileNotFoundException  If the file could not be found.
+     */
+    static private InputStream openFileInputStream(String filename)
+        throws FileNotFoundException
+    {
+     	return new BufferedInputStream(new FileInputStream(new File(filename)));
+    }
+
+    /**
+     * Opens an input stream for the given classname. The input stream is
+     * created via an URL that is obtained by the value of the sourcepath
+     * option and zip/jar file arguments.
+     * 
+     * @param  classname  The name of the class (dot-notation).
+     * @return  The input stream.
+     * @exception IOException If an I/O error occured.
+     */
+    private InputStream openClassInputStream(String classname)
+        throws IOException
+    {
+        final String resourcename = createClassFileName(classname);
+        return classLocator.getInputStreamForResource(resourcename);
+    }
+
+    /**
+     *  Creates a file object that represents the output zipfile for a given
+     *  zipfile to enhance.
+     *
+     *  @param  zipfilename  The input zipfile name.
+     *  @return  The output zipfile name.
+     */
+    private File createZipOutputFile(String zipfilename)
+    {
+        return new File(opts.destinationDirectory,
+                        new File(zipfilename).getName());
+    }
+
+    /**
+     *  Creates the output file for an enhaced class- or zipfile. If the
+     *  enhanced file is written back depends on the command line options.
+     *
+     *  @param  enhanced  Has the input file been enhanced?
+     *  @param  filename  The name of the output file.
+     *  @param  temp      The temp file, the output is written to.
+     *  @exception  IOException  If the file could not be created.
+     */
+    private void createOutputFile(boolean  enhanced,
+                                  String   filename,
+                                  File     temp)
+        throws IOException
+    {
+        //noWrite or (not enhanced and not forceWrite)
+        if (opts.noWrite || (!enhanced && !opts.forceWrite)) {
+            temp.deleteOnExit();
+            return;
+        }
+
+        File file = new File(opts.destinationDirectory, filename);
+        createPathOfFile(file);
+        file.delete();  //delete old file if exists
+        boolean renamed = temp.renameTo(file);
+        if (!renamed) {
+            //@dave: empirical evidence shows that renameTo does not allow for
+            // crossing filesystem boundaries.  If it fails, try "by hand".
+            InputStream in = null;
+            OutputStream out = null;
+            try {
+                in = new FileInputStream(temp);
+                out = new FileOutputStream(file);
+                int PAGESIZE = 4096; // Suggest a better size?
+                byte data[] = new byte[PAGESIZE];
+                while (in.available() > 0) {
+                    int numRead = in.read(data, 0, PAGESIZE);
+                    out.write(data, 0, numRead);
+                }
+                renamed = true;
+            } catch (IOException ex) {
+                throw new IOException("Could not rename temp file '" +
+                                      temp.getAbsolutePath() +
+                                      "' to '" + file.getAbsolutePath()
+                                      + "': " + ex);
+            } finally {
+                closeInputStream(in);
+                closeOutputStream(out);
+            }
+            if (renamed) {
+                temp.delete();  //delete temporary file
+            }
+            else {
+                throw new IOException("Could not rename temp file '" +
+                                      temp.getAbsolutePath() +
+                                      "' to '" + file.getAbsolutePath() + "'.");
+            }
+        }
+    }
+
+    /**
+     *  Closes an input stream.
+     *
+     *  @param  in  The input stream.
+     */
+    private void closeInputStream(InputStream in)
+    {
+        if (in != null) {
+            try {
+                in.close();
+            } catch (IOException ex) {
+                printError(null, ex);
+            }
+        }
+    }
+
+    /**
+     *  Closes an output stream.
+     *
+     *  @param  out  The output stream.
+     */
+    private void closeOutputStream(OutputStream out)
+    {
+        if (out != null) {
+            try {
+                out.close();
+            } catch (IOException ex) {
+                printError(null, ex);
+            }
+        }
+    }
+
+    /**
+     *  Tests if a filename is a classfile name (by testing if the filename
+     *  ends with <code>".class"</code>).
+     *
+     *  @param  filename  The name of the file.
+     *  @return  Do we have a potential classfile?
+     */
+    static private boolean isClassFileName(String filename)
+    {
+        return filename.toLowerCase().endsWith(".class");
+    }
+
+    /**
+     *  Tests if a filename is a zipfile (by testing if the filename
+     *  ends with <code>".zip"</code> or <code>".jar"</code>).
+     *
+     *  @param  filename  The name of the file.
+     */
+    static private boolean isZipFileName(String filename)
+    {
+        final int n = filename.length();
+        if (n < 5) {
+            return false;
+        }
+        final String ext = filename.substring(n - 4);
+        return ext.equalsIgnoreCase(".zip") || ext.equalsIgnoreCase(".jar");
+    }
+
+    /**
+     *  Tests if a filename is a jdo file name (by testing if the filename
+     *  ends with <code>".jdo"</code>).
+     *
+     *  @param  filename  The name of the file.
+     *  @return  Do we have a potential jdo file?
+     */
+    static private boolean isJdoFileName(String filename)
+    {
+        return filename.toLowerCase().endsWith(".jdo");
+    }
+
+    /**
+     *  Creates a filename from a classname.
+     *  This is done by replacing <code>'.'</code> by <code>'/'</code>.
+     *
+     *  @param  classname  The classname.
+     *  @return  The filename.
+     */
+    static private String createClassFileName(String classname)
+    {
+        return classname.replace('.', '/') + ".class";
+    }
+
+    /**
+     *  Creates only the path of the given file.
+     *
+     *  @param  file  The file.
+     *  @exception  IOException  If an error occured.
+     */
+    static private void createPathOfFile(File file)
+        throws IOException
+    {
+        File dir = file.getAbsoluteFile().getParentFile();
+        if (!dir.exists() && !dir.mkdirs()) {
+            throw new IOException("Error creating directory '"
+                                  + dir.getAbsolutePath() + "'.");
+        }
+    }
+
+    // ----------------------------------------------------------------------
+
+    /**
+     *  Prints out an error.
+     *
+     *  @param  msg  The error message (can be <code>null</code>).
+     *  @param  ex   An optional exception (can be <code>null</code>).
+     */
+    private void printError(String msg,
+                            Throwable ex)
+    {
+        out.flush();
+        if (msg != null) {
+            err.println(msg);
+        }
+        if (ex != null) {
+            if (opts.verbose) {
+                ex.printStackTrace(err);
+            }
+            else {
+                err.println(ex.toString());
+            }
+        }
+    }
+
+    /**
+     *  Prints out a message.
+     *
+     *  @param  msg  The message.
+     */
+    private void printMessage(String msg)
+    {
+        out.println(msg);
+    }
+}

Added: incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/enhancer/package.html
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/enhancer/package.html?rev=171351&view=auto
==============================================================================
--- incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/enhancer/package.html (added)
+++ incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/enhancer/package.html Sun May 22 10:55:51 2005
@@ -0,0 +1,26 @@
+<!--
+ Copyright 2005 The Apache Software Foundation.
+ 
+ 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.
+-->
+
+<html>
+<head>
+<title>Package org.apache.jdo.enhancer</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
+</head>
+
+<body bgcolor="#FFFFFF">
+<p>This package contains th eenhancer interface.</p>
+</body>
+</html>

Added: incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/Bundle.properties
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/Bundle.properties?rev=171351&view=auto
==============================================================================
--- incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/Bundle.properties (added)
+++ incubator/jdo/trunk/enhancer20/src/java/org/apache/jdo/impl/enhancer/Bundle.properties Sun May 22 10:55:51 2005
@@ -0,0 +1,220 @@
+
+ Copyright 2005 The Apache Software Foundation.
+ 
+ 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.
+
+
+# ResourceBundle properties file for model messages
+# key consists of: enhancer.<subpackage>.<description>
+# <subpackage> - is optional, package under model
+# <description> - short description (use _ to represent space)
+# all keys should be in lowercase
+
+#
+# Global Enhancer Metadata messages
+#
+
+# {0}=detail message
+enhancer.metadata.message=JDO ENHANCER: Metadata: {0}
+
+# {0}=error message
+enhancer.metadata.error=JDO ENHANCER: Metadata Error: {0}
+
+# {0}=warning message
+enhancer.metadata.warning=JDO ENHANCER: Metadata Warning: {0}
+
+# {0}=missing resource file
+enhancer.metadata.cannot_read_resource=Cannot read directory or jar file: {0}
+
+#
+# Detail Enhancer Metadata messages
+#
+
+# {0}=exception message
+enhancer.metadata.jdomodel_error=A JDO model exception has occurred: {0}
+
+# {0}=exception message
+enhancer.metadata.io_error=An I/O exception has occurred: {0}
+
+# {0}=filename
+enhancer.metadata.using_properties=using properties file: {0}
+
+# {0}=filenames
+enhancer.metadata.using_jdo_files=using jdo files: {0}
+
+# {0}=path
+enhancer.metadata.using_jar_files=using jar/zip files: {0}
+
+# {0}=path
+enhancer.metadata.using_source_path=using source path: {0}
+
+# {0}=
+enhancer.metadata.using_no_metadata=no JDO metadata source was specified
+
+
+#
+# Global enhancer messages
+#
+
+# {0}=detailed message
+enhancer.message=JDO ENHANCER: {0}
+
+# {0}=detailed message
+enhancer.error=JDO ENHANCER: At least one error occurred while enhancing input class for Transparent Persistence; detailed message(s): {0}
+
+# {0}=error number, {1}=detailed message
+enhancer.enumerated_error=JDO ENHANCER: Error ({0}): {1}
+
+# {0}=detailed message
+enhancer.internal_error=JDO ENHANCER: An internal error occurred while enhancing input class; detailed message: {0}
+
+# {0}=detailed message
+enhancer.warning=JDO ENHANCER: Warning: {0}
+
+#
+# Enhancer core messages
+#
+
+#
+enhancer.class_format_error=I/O error while reading input stream or input stream does not denote a valid Java class.
+
+#
+enhancer.io_error_while_writing_stream=I/O error while writing output stream.
+
+# {0}=dir name
+enhancer.unable_to_create_dir=Unable to create the directory named {0}.
+
+# {0}=class name
+enhancer.class_previously_annotated=The class {0} was previously annotated.
+
+# {0}=boolean
+enhancer.class_implements_jdo_pc=implements the JDO PersistenceCapable interface: {0}.
+
+#
+enhancer.class_has_default_constructor=has default constructor.
+enhancer.class_has_not_default_constructor=has not default constructor.
+
+#
+enhancer.class_has_static_initializer=has static initializer.
+enhancer.class_has_not_static_initializer=has not static initializer.
+
+#
+enhancer.class_has_clone_method=has clone method.
+enhancer.class_has_not_clone_method=has not clone method.
+
+#
+enhancer.class_has_writeObject_method=has writeObject method.
+enhancer.class_has_not_writeObject_method=has not writeObject method.
+
+#
+enhancer.class_has_writeReplace_method=has writeReplace method.
+enhancer.class_has_not_writeReplace_method=has not writeReplace method.
+
+#
+enhancer.class_has_readObject_method=has readObject method.
+enhancer.class_has_not_readObject_method=has not readObject method.
+
+# {0}=class name
+enhancer.class_missing_default_constructor=The persistence-capable class {0} does not provide a default (no-argument) constructor.
+
+# {0}=boolean
+enhancer.class_has_generic_jdo_fields=has the generic JDO fields: {0}.
+
+# {0}=boolean
+enhancer.class_has_generic_jdo_methods=has the generic JDO methods: {0}.
+
+# {0}=boolean
+enhancer.class_has_generic_jdo_members=has the generic JDO fields and methods: {0}.
+
+# {0}=boolean
+enhancer.class_has_specific_jdo_fields=has the specific JDO fields: {0}.
+
+# {0}=boolean
+enhancer.class_has_specific_jdo_methods=has the specific JDO methods: {0}.
+
+# {0}=boolean
+enhancer.class_has_specific_jdo_members=has the specific JDO fields and methods: {0}.
+
+# {0}=boolean
+enhancer.class_has_oid_handling_jdo_methods=has the ObjectId-handling JDO methods: {0}.
+
+# {0}=boolean
+enhancer.class_has_callback_jdo_methods=has the instance-callback JDO methods: {0}.
+
+# {0}=class name, {1}=method name
+enhancer.class_defines_jdo_method=The persistence-capable class {0} defines a JDO method called {1}.
+
+# {0}=class name, {1}=field name
+enhancer.class_defines_jdo_field=The persistence-capable class {0} defines a JDO field called {1}.
+
+# {0}=class name, {1}=member name
+enhancer.class_has_jdo_like_member=The persistence-capable class {0} defines a member {1} whose name starts with the reserved jdo prefix.
+
+# {0}=class name, {1}=method name,
+# {2}=expected signature, {3}=found signature
+# {4}=expected modifiers, {5}=found modifiers
+enhancer.class_has_illegally_declared_jdo_member=The persistence-capable class {0} has an illegally declared JDO member: {1}; expected signature: ''{2}''; found signature: ''{3}''; expected access modifier flags: {4}; found access modifier flags: {5}.
+
+# {0}=class name, {1}=found method names, {2}=missing method names
+enhancer.class_has_inconsistently_declared_jdo_members=The persistence-capable class {0} has an incosistent set of declared JDO members; found: {1}; missing: {2}.
+
+#
+# Other Enhancer messages
+#
+
+# {0}=filenames
+enhancer.using_jdo_files=using jdo files: {0}
+
+# {0}=path
+enhancer.using_archive_files=using jar/zip files: {0}
+
+# {0}=path
+enhancer.using_source_path=using source path: {0}
+
+# {0}=resource file name
+enhancer.using_file=using file: {0}
+
+# {0}=resource path element
+enhancer.using_path_element=using path element: {0}
+
+# {0}=class name, {1}=file name, {2}=file name
+enhancer.class_already_entered=The class {0} from {1} is already entered from {2}.
+
+# {0}=dir name, {1}=dir name
+enhancer.destination_directory_already_set=Attempt to set the destination directory to {0}, but it has already been set to {1}.
+
+# {0}=dir name
+enhancer.destination_directory_not_exist=The destination directory {0} does not exist.
+
+# {0}=resource name
+enhancer.found_resource=found resource: {0}
+enhancer.not_found_resource=not found resource: {0}
+
+# {0}=resource name
+enhancer.cannot_read_resource=resource does not exist or cannot be read: {0}
+
+# {0}=resource name {1}=exception message
+enhancer.io_error_while_reading_resource=An I/O exception has occurred while reading resource: {0}, exception: {1}
+
+# {0}=resource name
+enhancer.io_error_while_reading_resource=An I/O exception has occurred: {0}
+
+# {0}=resource name
+enhancer.illegal_path_element=illegal element source path: {0}
+
+#
+# Enhancer exception messages
+#
+
+MSG_CauseThrowable=CauseThrowable:
+MSG_CauseThrowableStackTrace=CauseThrowableStackTrace: