/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.commons.dbcp2;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.pool2.impl.TrackedUse;

/**
 * Tracks db connection usage for recovering and reporting
 * abandoned db connections.
 *
 * The JDBC Connection, Statement, and ResultSet classes
 * extend this class.
 * 
 * @author Glenn L. Nielsen
 * @version $Revision$ $Date$
 */
public class AbandonedTrace implements TrackedUse {

    /** A list of objects created by children of this object */
    private final List<AbandonedTrace> traceList =
        new ArrayList<AbandonedTrace>();
    /** Last time this connection was used */
    private volatile long lastUsed = 0;

    /**
     * Create a new AbandonedTrace without config and
     * without doing abandoned tracing.
     */
    public AbandonedTrace() {
        init(null);
    }

    /**
     * Construct a new AbandonedTrace with a parent object.
     *
     * @param parent AbandonedTrace parent object
     */
    public AbandonedTrace(AbandonedTrace parent) {
        init(parent);
    }

    /**
     * Initialize abandoned tracing for this object.
     *
     * @param parent AbandonedTrace parent object
     */
    private void init(AbandonedTrace parent) {
        if (parent != null) {                  
            parent.addTrace(this);
        }
    }

    /**
     * Get the last time this object was used in ms.
     *
     * @return long time in ms
     */
    @Override
    public long getLastUsed() {
        return lastUsed;
    }

    /**
     * Set the time this object was last used to the
     * current time in ms.
     */
    protected void setLastUsed() {
        lastUsed = System.currentTimeMillis();
    }

    /**
     * Set the time in ms this object was last used.
     *
     * @param time time in ms
     */
    protected void setLastUsed(long time) {
        lastUsed = time;
    }

    /**
     * Add an object to the list of objects being
     * traced.
     *
     * @param trace AbandonedTrace object to add
     */
    protected void addTrace(AbandonedTrace trace) {
        synchronized (this.traceList) {
            this.traceList.add(trace);
        }
        setLastUsed();
    }

    /**
     * Clear the list of objects being traced by this
     * object.
     */
    protected void clearTrace() {
        synchronized(this.traceList) {
            this.traceList.clear();
        }
    }

    /**
     * Get a list of objects being traced by this object.
     *
     * @return List of objects
     */
    protected List<AbandonedTrace> getTrace() {
        synchronized (this.traceList) {
            return new ArrayList<AbandonedTrace>(traceList);
        }
    }

    /**
     * Remove a child object this object is tracing.
     *
     * @param trace AbandonedTrace object to remove
     */
    protected void removeTrace(AbandonedTrace trace) {
        synchronized(this.traceList) {
            this.traceList.remove(trace);
        }
    }
}

@@ -416,17 +416,16 @@
 se at%0A *
- 
 %0A *     
@@ -470,17 +470,16 @@
 E-2.0%0A *
- 
 %0A * Unle
@@ -919,13 +919,8 @@
 ol2.
-impl.
 Trac
@@ -1104,17 +1104,16 @@
 lass.%0A *
- 
 %0A * @aut
@@ -2049,26 +2049,8 @@
 l) %7B
-                  
 %0A   

Update for recent changes to pool API