You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by cu...@apache.org on 2012/07/03 20:21:26 UTC

svn commit: r1356860 - in /openjpa/trunk/openjpa-tools: ./ openjpa-fetch-statistics/ openjpa-fetch-statistics/src/ openjpa-fetch-statistics/src/main/ openjpa-fetch-statistics/src/main/java/ openjpa-fetch-statistics/src/main/java/org/ openjpa-fetch-stat...

Author: curtisr7
Date: Tue Jul  3 18:21:24 2012
New Revision: 1356860

URL: http://svn.apache.org/viewvc?rev=1356860&view=rev
Log:
OPENJPA-2220: Commit fetch statistic tool. Patch contributed by Helen Xu.

Added:
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/   (with props)
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/pom.xml   (with props)
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/apache/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/apache/openjpa/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/apache/openjpa/enhance/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/apache/openjpa/enhance/stats/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/apache/openjpa/enhance/stats/FetchStatisticsAuxEnhancer.java   (with props)
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/apache/openjpa/enhance/stats/FetchStatsCollector.java   (with props)
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/META-INF/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/META-INF/services/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/META-INF/services/org.apache.openjpa.enhance.PCEnhancer$AuxiliaryEnhancer   (with props)
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/README-WEBSPHERE.txt   (with props)
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/README.txt   (with props)
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/org/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/org/apache/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/org/apache/openjpa/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/org/apache/openjpa/enhance/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/org/apache/openjpa/enhance/stats/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/org/apache/openjpa/enhance/stats/localizer.properties   (with props)
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/AEntity.java   (with props)
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/BEntity.java   (with props)
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/ChildEntity.java   (with props)
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/EEntity.java   (with props)
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/TestFetchStatistics.java   (with props)
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/resources/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/resources/META-INF/
    openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/resources/META-INF/persistence.xml   (with props)
Modified:
    openjpa/trunk/openjpa-tools/pom.xml

Propchange: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Tue Jul  3 18:21:24 2012
@@ -0,0 +1 @@
+.*

Added: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/pom.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/pom.xml?rev=1356860&view=auto
==============================================================================
--- openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/pom.xml (added)
+++ openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/pom.xml Tue Jul  3 18:21:24 2012
@@ -0,0 +1,136 @@
+<?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. -->
+<!-- Maven release plugin requires the project tag to be on a single line. -->
+<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/maven-v4_0_0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.apache.openjpa</groupId>
+		<artifactId>openjpa-tools</artifactId>
+		<version>2.3.0-SNAPSHOT</version>
+		<relativePath>../pom.xml</relativePath>
+	</parent>
+
+	<artifactId>openjpa-fetch-statistics</artifactId>
+	<packaging>jar</packaging>
+
+	<name>OpenJPA Fetching Statistic Tool</name>
+	<description>
+        OpenJPA tool to capture the fetching statistic data for the persistent fields .
+    </description>
+	<inceptionYear>2012</inceptionYear>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.geronimo.specs</groupId>
+			<artifactId>geronimo-jpa_2.0_spec</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.geronimo.specs</groupId>
+			<artifactId>geronimo-jta_1.1_spec</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.openjpa</groupId>
+			<artifactId>openjpa-kernel</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.openjpa</groupId>
+			<artifactId>openjpa-lib</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.openjpa</groupId>
+			<artifactId>openjpa-persistence-jdbc</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+			<version>3.8.1</version>
+		</dependency>
+	</dependencies>
+
+	<licenses>
+		<license>
+			<name>Apache License 2.0</name>
+			<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+			<distribution>repo</distribution>
+		</license>
+	</licenses>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<configuration>
+					<argLine>${surefire.jvm.args}</argLine>
+					<excludes>
+						<!-- exclude the unit test since the fetch statistic enhancer cannot 
+							be load during maven build -->
+						<exclude>org/apache/openjpa/enhance/stats/TestFetchStatistics.java</exclude>
+					</excludes>
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-jar-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>default-jar</id>
+						<goals>
+							<goal>jar</goal>
+						</goals>
+						<phase>package</phase>
+						<configuration>
+							<excludes>
+								<exclude>README-*.txt</exclude>
+							</excludes>
+						</configuration>
+					</execution>
+					<!-- Create another WAS specific jar -->
+					<execution>
+						<id>was</id>
+						<goals>
+							<goal>jar</goal>
+						</goals>
+						<phase>package</phase>
+						<configuration>
+							<finalName>${artifactId}-${version}-websphere</finalName>
+							<archive>
+								<manifest>
+									<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+								</manifest>
+								<manifestEntries>
+									<Fragment-Host>com.ibm.ws.jpa; bundle-version=8.0.0</Fragment-Host>
+									<Export-Package>org.apache.openjpa.enhance.stats</Export-Package>
+									<Bundle-SymbolicName>org.apache.openjpa.enhance.stats; singleton:=true</Bundle-SymbolicName>
+									<Bundle-Name>FetchStatisticsAuxEnhancer</Bundle-Name>
+								</manifestEntries>
+							</archive>
+							<excludes>
+								<exclude>README.txt</exclude>
+							</excludes>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>

Propchange: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/apache/openjpa/enhance/stats/FetchStatisticsAuxEnhancer.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/apache/openjpa/enhance/stats/FetchStatisticsAuxEnhancer.java?rev=1356860&view=auto
==============================================================================
--- openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/apache/openjpa/enhance/stats/FetchStatisticsAuxEnhancer.java (added)
+++ openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/apache/openjpa/enhance/stats/FetchStatisticsAuxEnhancer.java Tue Jul  3 18:21:24 2012
@@ -0,0 +1,108 @@
+/*
+ * 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.openjpa.enhance.stats;
+
+import java.util.Locale;
+
+import org.apache.commons.lang.WordUtils;
+import org.apache.openjpa.conf.OpenJPAConfiguration;
+import org.apache.openjpa.enhance.PCEnhancer.AuxiliaryEnhancer;
+import org.apache.openjpa.lib.log.Log;
+import org.apache.openjpa.meta.AccessCode;
+import org.apache.openjpa.meta.ClassMetaData;
+import org.apache.openjpa.meta.FieldMetaData;
+
+import serp.bytecode.BCClass;
+import serp.bytecode.BCMethod;
+import serp.bytecode.Code;
+
+/**
+ * FetchStatisticsAuxEnhancer adds the call back function to each persistent fields in the persistent entity which 
+ * will invoke the hit method from FetchStatsCollector whenever the field is fetched at runtime.
+ */
+public class FetchStatisticsAuxEnhancer implements AuxiliaryEnhancer {
+
+    private final String IGNORE_METHODS_REGEX = "(pc(.)*GenericContext)?(pc(.)*StateManager)?"
+        + "(pc(.)*DetachedState)?(pc(.)*EnhancementContractVersion)?(pc(.)*ManagedFieldCount)?(pc(.)*GetVersion)?";
+
+    public void run(BCClass bcc, ClassMetaData cmd) {
+        addEnhancement(bcc, cmd);
+    };
+
+    public boolean skipEnhance(BCMethod arg0) {
+        return false;
+    };
+
+    private void addEnhancement(BCClass bcc, ClassMetaData cmd) {
+        Log log = cmd.getRepository().getConfiguration().getLog(OpenJPAConfiguration.LOG_RUNTIME);
+        FetchStatsCollector.setlogger(log);
+        for (BCMethod meth : bcc.getMethods()) {
+            String methodName = meth.getName();
+            FieldMetaData fmd = getFieldName(methodName, cmd);
+            if (fmd != null && needsTracking(fmd, methodName, cmd)) {
+                String fqn = bcc.getName() + "." + fmd.getName();
+                FetchStatsCollector.registerField(fqn);
+                FetchStatsCollector.registerEntity(cmd);
+
+                Code code = meth.getCode(false);
+                code.constant().setValue(fqn);
+                code.invokestatic().setMethod(FetchStatsCollector.class, "hit", void.class,
+                    new Class[] { String.class });
+            }
+        }
+    }
+
+    private boolean needsTracking(FieldMetaData fmd, String methName, ClassMetaData cmd) {
+        // Skim out primary key(s), versions, and LAZY fields
+        if (fmd.isPrimaryKey() || fmd.isVersion() || !fmd.isInDefaultFetchGroup())
+            return false;
+
+        if (AccessCode.isField(fmd) && methName.toLowerCase(Locale.ENGLISH).startsWith("pcget")) {
+            return true;
+        } else if (AccessCode.isProperty(fmd) && methName.toLowerCase(Locale.ENGLISH).startsWith("get")
+            || methName.toLowerCase(Locale.ENGLISH).startsWith("pcis")) {
+            return true;
+        }
+        return false;
+    }
+
+    private FieldMetaData getFieldName(String methName, ClassMetaData cmd) {
+        FieldMetaData res = null;
+        String fieldName = null;
+        if (methName.matches(IGNORE_METHODS_REGEX)) {
+            return res;
+        } else if (methName.startsWith("pcGet")) {
+            // field access
+            fieldName = methName.substring(5);
+        } else if (methName.toLowerCase(Locale.ENGLISH).startsWith("get")) {
+            // property access
+            fieldName = WordUtils.uncapitalize(methName.substring(3));
+        } else if (methName.startsWith("pcis")) {
+            fieldName = methName.substring(4).toLowerCase(Locale.ENGLISH);
+        }
+
+        for (FieldMetaData fmd : cmd.getDeclaredFields()) {
+            String fmdName = fmd.getName();
+            if (fmdName.equals(fieldName)) {
+                return fmd;
+            }
+        }
+        return null;
+    }
+}

Propchange: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/apache/openjpa/enhance/stats/FetchStatisticsAuxEnhancer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/apache/openjpa/enhance/stats/FetchStatsCollector.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/apache/openjpa/enhance/stats/FetchStatsCollector.java?rev=1356860&view=auto
==============================================================================
--- openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/apache/openjpa/enhance/stats/FetchStatsCollector.java (added)
+++ openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/apache/openjpa/enhance/stats/FetchStatsCollector.java Tue Jul  3 18:21:24 2012
@@ -0,0 +1,149 @@
+/*
+ * 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.openjpa.enhance.stats;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.Map;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.TreeSet;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.openjpa.lib.log.Log;
+import org.apache.openjpa.lib.util.Localizer;
+import org.apache.openjpa.meta.ClassMetaData;
+
+/**
+ * FetchStatsCollector aggregates fetch statistics and outputs the data periodically (10 minutes).
+ */
+public final class FetchStatsCollector {
+    // Fully qualified persistent field name -> number of access
+    private static ConcurrentHashMap<String, AtomicInteger> _used = new ConcurrentHashMap<String, AtomicInteger>();
+    private static Set<String> _entities = new TreeSet<String>();
+
+    private static Log _log;
+    private static final Localizer _loc = Localizer.forPackage(FetchStatsCollector.class);
+    // default to 10 min
+    private final static int DEFAULT_INTERVAL = 10 * 60 * 1000;
+    private static Timer timer;
+
+    public static void setlogger(Log log) {
+        if (FetchStatsCollector._log == null) {
+            FetchStatsCollector._log = log;
+            FetchStatsCollector._log.info(_loc.get("start-monitoring"));
+        }
+    }
+
+    static {
+        Runtime.getRuntime().addShutdownHook(new Shutdown());
+        AccessController.doPrivileged(new PrivilegedAction<Object>() {
+            public Object run() {
+                TimerTask statsOutputTask = new TimerTask() {
+                    public void run() {
+                        dump();
+                    }
+                };
+                timer = new Timer();
+                timer.schedule(statsOutputTask, DEFAULT_INTERVAL, DEFAULT_INTERVAL);
+                return null;
+            }
+        });
+    }
+
+    public static void registerEntity(ClassMetaData cmd) {
+        _entities.add(cmd.getDescribedTypeString());
+    }
+
+    public static AtomicInteger registerField(String field) {
+        return _used.putIfAbsent(field, new AtomicInteger(Integer.valueOf(0)));
+    }
+
+    public static void hit(String field) {
+        AtomicInteger value = _used.get(field);
+        if (value != null) {
+            value.incrementAndGet();
+        }
+    }
+
+    static class Shutdown extends Thread {
+        @Override
+        public void run() {
+            timer.cancel();
+            dump();
+        }
+    }
+
+    public static Set<String> getStatistics() {
+        // TreeSet for a sorted set.
+        Set<String> noAccess = new TreeSet<String>();
+        for (Map.Entry<String, AtomicInteger> entry : _used.entrySet()) {
+            if (entry.getValue().intValue() == 0) {
+                noAccess.add(entry.getKey());
+            }
+        }
+
+        return noAccess;
+    }
+
+    public static void dump() {
+        Set<String> zeroAccessFieldSet = getStatistics();
+
+        StringBuilder message = new StringBuilder();
+        message.append(_loc.get("fields-never-fetched",
+            new Object[] { _entities, new Integer(zeroAccessFieldSet.size()) }).getMessage());
+
+        for (String field : zeroAccessFieldSet) {
+            message.append("\n\t" + field);
+
+        }
+        _log.info(message);
+    }
+
+    public static void clear() {
+        for (Map.Entry<String, AtomicInteger> entry : _used.entrySet()) {
+            entry.setValue(new AtomicInteger(0));
+        }
+    }
+
+    static class Container {
+        String _name;
+        Integer _value;
+
+        public Container(String name, int value) {
+            _name = name;
+            _value = value;
+        }
+
+        String getName() {
+            return _name;
+        }
+
+        public Integer getValue() {
+            return _value;
+        }
+
+        @Override
+        public String toString() {
+            return _name;
+        }
+    }
+}

Propchange: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/java/org/apache/openjpa/enhance/stats/FetchStatsCollector.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/META-INF/services/org.apache.openjpa.enhance.PCEnhancer$AuxiliaryEnhancer
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/META-INF/services/org.apache.openjpa.enhance.PCEnhancer%24AuxiliaryEnhancer?rev=1356860&view=auto
==============================================================================
--- openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/META-INF/services/org.apache.openjpa.enhance.PCEnhancer$AuxiliaryEnhancer (added)
+++ openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/META-INF/services/org.apache.openjpa.enhance.PCEnhancer$AuxiliaryEnhancer Tue Jul  3 18:21:24 2012
@@ -0,0 +1,17 @@
+# 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.
+org.apache.openjpa.enhance.stats.FetchStatisticsAuxEnhancer

Propchange: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/META-INF/services/org.apache.openjpa.enhance.PCEnhancer$AuxiliaryEnhancer
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/README-WEBSPHERE.txt
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/README-WEBSPHERE.txt?rev=1356860&view=auto
==============================================================================
--- openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/README-WEBSPHERE.txt (added)
+++ openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/README-WEBSPHERE.txt Tue Jul  3 18:21:24 2012
@@ -0,0 +1,29 @@
+Apache OpenJPA - README.txt
+Licensed under Apache License 2.0 - http://www.apache.org/licenses/LICENSE-2.0
+--------------------------------------------------------------------------------
+
+Open JPA Fetch Statistics Tool monitors persistent field access and determines which fields are never used. This tool
+can be used to help tune an application. 
+
+Note: Open JPA Fetching Statistics Tool works with the runtime enhancement.
+
+Usage instructions: 
+
+1.] Configuration
+  * Add openjpa-fetch-statistics-[VERSION]-websphere.jar into the [WAS_HOME]\plugins directory.
+  * Run [WAS_HOME]\bin\osgiCfgInit.sh(bat) to clear the osgi cache.
+    
+2.] Statistics Collecting and Monitoring     
+  * When this tool is configured, it will be active for all persistence units in the JVM. Statistics will be dumped via the 
+  openjpa.Runtime channel with the INFO level every 10 minutes, or when the JVM terminates. Any field that is logged 
+  has not been accessed by an application.
+    
+3.] Configuration removal
+  * Stop all WebSphere processes using the [WAS_HOME]\plugins installation.
+  * Remove the openjpa-fetch-statistics-[VERSION]-websphere.jar jar from the [WAS_HOME]\plugins directory.
+  * Run [WAS_HOME]\bin\osgiCfgInit.sh(bat) to clear the osgi cache.
+    
+Performance Consideration
+
+There will be a large performance impact when running this tooling. It is not supported, nor recommended for production
+use. This tool should not be used on a production machine.

Propchange: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/README-WEBSPHERE.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/README.txt
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/README.txt?rev=1356860&view=auto
==============================================================================
--- openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/README.txt (added)
+++ openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/README.txt Tue Jul  3 18:21:24 2012
@@ -0,0 +1,64 @@
+Apache OpenJPA - README.txt
+Licensed under Apache License 2.0 - http://www.apache.org/licenses/LICENSE-2.0
+--------------------------------------------------------------------------------
+
+Open JPA Fetching Statistics Tool monitors the persistent fields 
+fetching and finds out the fields which are never accessed. Based on the 
+statistic data, user can set the field access type to LAZY to improve the 
+performance by eliminating the data loading and processing time.
+
+Note: Open JPA Fetching Statistics Tool works with the runtime enhancement.
+
+Usage instructions: 
+
+1 Classpath Configuration
+    
+    Append the path of  openjpa-fetch-statistics-version-SNAPSHOT.jar file 
+    to the classpath of the application before starting the application.
+    
+2 Statistics Collecting and Monitoring     
+    
+    Start the application with openjpa-fetch-statistics-<version>-SNAPSHOT.jar
+    in the classpath. The tool will start collecting the statistics of the 
+    persistent field fetching and output the list of the persistent fields 
+    which have never been fetched to the log file every ten minutes.It will 
+    output the last list when the JVM is shutdown.
+    
+3 Termination
+    Shut down the JVM to stop the fetching statistics collecting. 
+    Roll back the classpath configuration.
+    Start the application without the fetching statistics jar in the classpath
+    
+Performance Consideration
+
+There will be performance impact when the fetching statistics collection is on. 
+The recommendation is to use it in the testing environment.
+
+Apache OpenJPA - README.txt
+Licensed under Apache License 2.0 - http://www.apache.org/licenses/LICENSE-2.0
+--------------------------------------------------------------------------------
+
+Open JPA Fetch Statistics Tool monitors persistent field access and determines which fields are never used. This tool
+can be used to help tune an application. 
+
+Note: Open JPA Fetching Statistics Tool works with the runtime enhancement.
+
+Usage instructions: 
+
+1.] Configuration
+  * Append the path of openjpa-fetch-statistics-version-SNAPSHOT.jar file to the classpath prior to lanuching the JVM.
+    
+2.] Statistics Collecting and Monitoring     
+  * When this tool is configured, it will be active for all persistence units in the JVM. Statistics will be dumped via the 
+  openjpa.Runtime channel with the INFO level every 10 minutes, or when the JVM terminates. Any field that is logged 
+  has not been accessed by an application.
+    
+3.] Configuration removal
+  * Stop the JVM.
+  * Remove openjpa-fetch-statistics-version-SNAPSHOT.jar from the classpath.
+    
+Performance Consideration
+
+There will be a large performance impact when running this tooling. It is not supported, nor recommended for production
+use. This tool should not be used on a production machine.
+

Propchange: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/README.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/org/apache/openjpa/enhance/stats/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/org/apache/openjpa/enhance/stats/localizer.properties?rev=1356860&view=auto
==============================================================================
--- openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/org/apache/openjpa/enhance/stats/localizer.properties (added)
+++ openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/org/apache/openjpa/enhance/stats/localizer.properties Tue Jul  3 18:21:24 2012
@@ -0,0 +1,20 @@
+# 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.
+
+fields-never-fetched: Successfully collected fetch statistics from Entities {0}. The following fields are \
+     FetchType.EAGER and were never fetched [ total {1} ] : 
+start-monitoring: The FetchStatisticsAuxEnhancer has been loaded and is tracking persistent field usage.

Propchange: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/main/resources/org/apache/openjpa/enhance/stats/localizer.properties
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/AEntity.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/AEntity.java?rev=1356860&view=auto
==============================================================================
--- openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/AEntity.java (added)
+++ openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/AEntity.java Tue Jul  3 18:21:24 2012
@@ -0,0 +1,65 @@
+/*
+ * 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.openjpa.enhance.stats;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+@Entity
+public class AEntity { 
+
+    @Id
+    private int id;
+    private String name;
+    private String desc;
+    private boolean checked;    
+    private EEntity extraInfo;
+    
+    @ManyToOne
+    private BEntity referredBEntity;
+    
+
+    public AEntity(int id, String name, String desc, BEntity bEntity) {
+        super();
+        this.id = id;
+        this.name = name;
+        this.desc = desc;
+        referredBEntity = bEntity;
+        extraInfo = new EEntity("extra " + desc, "E" + id);
+    }
+    
+    public String getFullInfo(){
+        return name + desc;
+    }
+    
+    
+    public boolean isChecked(){
+        return checked;
+    }
+    
+    public String getReferredBEntityName(){
+        return referredBEntity.getName();
+    }
+    
+    public String getExtraInfo(){
+        return extraInfo.getExtraDesc();
+    }
+    
+}

Propchange: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/AEntity.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/BEntity.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/BEntity.java?rev=1356860&view=auto
==============================================================================
--- openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/BEntity.java (added)
+++ openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/BEntity.java Tue Jul  3 18:21:24 2012
@@ -0,0 +1,86 @@
+/*
+ * 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.openjpa.enhance.stats;
+
+import javax.persistence.Access;
+import javax.persistence.AccessType;
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+@Entity
+@Inheritance(strategy=InheritanceType.JOINED)
+@Access(AccessType.PROPERTY)
+public class BEntity {
+    
+    private int id;
+    private String name;
+    private boolean bool;
+    
+    @Id
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    } 
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+    @Access(AccessType.FIELD)
+    private String desc;
+    
+    public String getName() {
+        return name;
+    }
+    
+    public String getCustomDesc(){
+        return desc;
+    }
+    
+    public BEntity(int id, String name, String desc) {
+        super();
+        setId(id);
+        setName(name);
+        setDesc(desc);
+    }
+    
+    public BEntity() {
+        super();
+    }    
+    
+    public void setBool(boolean b){
+        bool = b;
+    }
+    
+    @Basic
+    public boolean isBool(){
+        return bool;
+    }
+}

Propchange: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/BEntity.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/ChildEntity.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/ChildEntity.java?rev=1356860&view=auto
==============================================================================
--- openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/ChildEntity.java (added)
+++ openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/ChildEntity.java Tue Jul  3 18:21:24 2012
@@ -0,0 +1,63 @@
+/*
+ * 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.openjpa.enhance.stats;
+
+import javax.persistence.Entity;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+@Entity
+@PrimaryKeyJoinColumn(name = "CHILDID", referencedColumnName = "ID")
+public class ChildEntity extends BEntity {
+
+    private int childId;
+    private String childName;
+    private String childDesc;
+
+    public int getChildId() {
+        return childId;
+    }
+
+    public void setChildId(int childId) {
+        this.childId = childId;
+    }
+
+    public void setChildDesc(String childDesc) {
+        this.childDesc = childDesc;
+    }
+
+    public String getChildDesc() {
+        return childDesc;
+    }
+
+    public String getChildName() {
+        return childName;
+    }
+
+    public void setChildName(String childName) {
+        this.childName = childName;
+    }
+
+    public ChildEntity(int id, String name, String desc, String childName) {
+        super(id, name, desc);
+        setChildName(childName);
+        setChildDesc("test");
+        setChildId(id);
+    }
+}

Propchange: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/ChildEntity.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/EEntity.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/EEntity.java?rev=1356860&view=auto
==============================================================================
--- openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/EEntity.java (added)
+++ openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/EEntity.java Tue Jul  3 18:21:24 2012
@@ -0,0 +1,44 @@
+/*
+ * 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.openjpa.enhance.stats;
+
+import javax.persistence.Embeddable;
+
+
+@Embeddable
+public class EEntity {
+    String extraDesc;
+    public String getExtraDesc() {
+        return extraDesc;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    String code;
+    
+    public EEntity (String desc, String code) {
+        this.extraDesc = desc;
+        this.code = code;
+    }
+    
+    
+}

Propchange: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/EEntity.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/TestFetchStatistics.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/TestFetchStatistics.java?rev=1356860&view=auto
==============================================================================
--- openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/TestFetchStatistics.java (added)
+++ openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/TestFetchStatistics.java Tue Jul  3 18:21:24 2012
@@ -0,0 +1,173 @@
+/*
+ * 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.openjpa.enhance.stats;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Set;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.apache.openjpa.enhance.PCEnhancer;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for Open JPA Fetch Statistic.
+ */
+public class TestFetchStatistics extends TestCase {
+
+    /**
+     * Create the test case
+     * 
+     * @param testName
+     *            name of the test case
+     */
+    public TestFetchStatistics(String testName) {
+        super(testName);
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite() {
+        return new TestSuite(TestFetchStatistics.class);
+    }
+
+    public void setUp() {
+        EntityManagerFactory emf = Persistence.createEntityManagerFactory("fetchStatisticPU");
+        emf.createEntityManager().close();
+        FetchStatsCollector.clear();
+    }
+
+    public void tearDown() {
+    }
+
+    public void testFieldAccess() {
+        FetchStatsCollector.clear();
+        
+        AEntity aEntity = new AEntity(1, "t", "d", null);
+
+
+        Set<String> res = FetchStatsCollector.getStatistics();
+        assertTrue(res.contains("org.apache.openjpa.enhance.stats.AEntity.name"));
+        assertTrue(res.contains("org.apache.openjpa.enhance.stats.AEntity.desc"));
+
+        assertEquals("td", aEntity.getFullInfo());
+        res = FetchStatsCollector.getStatistics();
+        assertFalse(res.contains("org.apache.openjpa.enhance.stats.AEntity.name"));
+        assertFalse(res.contains("org.apache.openjpa.enhance.stats.AEntity.desc"));
+
+    }
+
+    public void testEmbeddedEntityFieldAccess() {
+        AEntity aEntity = new AEntity(1, "t1", "d1", null);
+
+        assertEquals("extra d1", aEntity.getExtraInfo());
+
+        Set<String> res = FetchStatsCollector.getStatistics();
+
+        assertFalse(res.contains("org.apache.openjpa.enhance.stats.AEntity.extraInfo"));
+    }
+
+    public void testPropertyFieldMixedAccess() {
+        FetchStatsCollector.clear();
+        
+        BEntity b = new BEntity(2, "t2", "d2");
+
+        Set<String> res = FetchStatsCollector.getStatistics();
+
+        assertTrue(res.toString(), res.contains("org.apache.openjpa.enhance.stats.BEntity.name"));
+        assertTrue(res.toString(), res.contains("org.apache.openjpa.enhance.stats.BEntity.bool"));
+
+        b.getName();
+        b.isBool();
+
+        res = FetchStatsCollector.getStatistics();
+
+        assertFalse(res.contains("org.apache.openjpa.enhance.stats.BEntity.name"));
+        assertFalse(res.contains("org.apache.openjpa.enhance.stats.BEntity.bool"));
+
+    }
+
+    public void testMixedAccess() {
+        BEntity e = new BEntity(1, "t1", "d1");
+
+
+        Set<String> res = FetchStatsCollector.getStatistics();
+
+        assertTrue(res.contains("org.apache.openjpa.enhance.stats.BEntity.name"));
+        assertTrue(res.contains("org.apache.openjpa.enhance.stats.BEntity.desc"));
+        
+        e.getName();
+        e.getCustomDesc();
+
+        res = FetchStatsCollector.getStatistics();
+
+        assertFalse(res.contains("org.apache.openjpa.enhance.stats.BEntity.name"));
+        assertFalse(res.contains("org.apache.openjpa.enhance.stats.BEntity.desc"));
+
+    }
+
+    public void testFieldAccessThroughRelationship() {
+        BEntity bf1 = new BEntity(1, "t1", "d1");
+        AEntity af3 = new AEntity(3, "t3", "d3", bf1);
+
+        assertEquals("t1", af3.getReferredBEntityName());
+        af3.isChecked();
+
+        Set<String> res = FetchStatsCollector.getStatistics();
+
+        assertFalse(res.contains("org.apache.openjpa.enhance.stats.AEntity.checked"));
+    }
+
+    public void testPropertyAccessThroughInheritance() {
+        FetchStatsCollector.clear();
+        
+        ChildEntity cEntity = new ChildEntity(1, "t1", "d1", "cn1");
+        
+        Set<String> res = FetchStatsCollector.getStatistics();
+        
+        assertTrue(res.contains("org.apache.openjpa.enhance.stats.ChildEntity.childName"));
+        assertTrue(res.contains("org.apache.openjpa.enhance.stats.BEntity.name"));
+        assertTrue(res.contains("org.apache.openjpa.enhance.stats.BEntity.desc"));
+        
+        // touch fields
+        cEntity.getChildName();
+        cEntity.getName();
+        cEntity.getCustomDesc();
+        
+        
+        res = FetchStatsCollector.getStatistics();
+
+        assertFalse(res.contains("org.apache.openjpa.enhance.stats.ChildEntity.childName"));
+        assertFalse(res.contains("org.apache.openjpa.enhance.stats.BEntity.name"));
+        assertFalse(res.contains("org.apache.openjpa.enhance.stats.BEntity.desc"));
+    }
+
+    // used for manual test of the output interval
+    public void _testOutputInterval() throws InterruptedException {
+        Thread.currentThread().sleep(60 * 60 * 1000);
+    }
+}

Propchange: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/java/org/apache/openjpa/enhance/stats/TestFetchStatistics.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/resources/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/resources/META-INF/persistence.xml?rev=1356860&view=auto
==============================================================================
--- openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/resources/META-INF/persistence.xml (added)
+++ openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/resources/META-INF/persistence.xml Tue Jul  3 18:21:24 2012
@@ -0,0 +1,25 @@
+<?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. -->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
+
+	<persistence-unit name="fetchStatisticPU" transaction-type="RESOURCE_LOCAL">
+		<description>PU for openjpa fetch statistic testing</description>
+		<provider>org.apache.openjpa.persistence.PersistenceProviderImpl
+		</provider>
+		<class>org.apache.openjpa.enhance.stats.AEntity</class>
+		<class>org.apache.openjpa.enhance.stats.BEntity</class>
+		<class>org.apache.openjpa.enhance.stats.ChildEntity</class>
+		<class>org.apache.openjpa.enhance.stats.EEntity</class>
+	</persistence-unit>
+
+</persistence>

Propchange: openjpa/trunk/openjpa-tools/openjpa-fetch-statistics/src/test/resources/META-INF/persistence.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openjpa/trunk/openjpa-tools/pom.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-tools/pom.xml?rev=1356860&r1=1356859&r2=1356860&view=diff
==============================================================================
--- openjpa/trunk/openjpa-tools/pom.xml (original)
+++ openjpa/trunk/openjpa-tools/pom.xml Tue Jul  3 18:21:24 2012
@@ -42,6 +42,8 @@
 
     <modules>
         <module>openjpa-maven-plugin</module>
+        <module>openjpa-fetch-statistics</module>
+
     </modules>
 
     <profiles>