/*******************************************************************************
 * 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.ofbiz.base.util.cache.impl;

import org.ofbiz.base.concurrent.ExecutionPool;

public abstract class CacheLine<V> extends ExecutionPool.Pulse {
    protected CacheLine(long loadTimeNanos, long expireTimeNanos) {
        super(loadTimeNanos, expireTimeNanos);
        // FIXME: this seems very odd to me (ARH)
        //if (loadTime <= 0) {
        //    hasExpired = true;
        //}
    }

    abstract CacheLine<V> changeLine(boolean useSoftReference, long expireTimeNanos);
    abstract void remove();
    boolean differentExpireTime(long expireTimeNanos) {
        return this.expireTimeNanos - loadTimeNanos - expireTimeNanos != 0;
    }
    public abstract V getValue();

    void cancel() {
    }

    @Override
    public void run() {
        remove();
    }
}

