/*******************************************************************************
 * Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation from Oracle TopLink
 ******************************************************************************/  
package org.eclipse.persistence.testing.tests.optimization.queryandsqlcounting.querycache;

import java.util.*;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.descriptors.invalidation.*;

/**
 * Test the invalidation of query cache results
 * This test is configurable to use three types of invalidation and whether those types
 * of invalidation should cause the results to become invalid
 */
public class QueryCacheInvalidationTest extends NamedQueryQueryCacheTest {
    protected int invalidationPolicyType = 0;
    protected boolean expiringTest = false;
    protected int sleepTime = 0;
    public static final int NO_INVALIDATION = 0;
    public static final int TIME_TO_LIVE_INVALIDATION = 1;
    public static final int DAILY_INVALIDATION = 2;

    public QueryCacheInvalidationTest(int invalidationPolicyType, boolean expiringTest) {
        setName("QueryCacheInvalidationTest invalidationType: " + invalidationPolicyType + " expiring: " + expiringTest);
        setDescription("Test the various cache invalidation polcies on the query cache.");
        this.invalidationPolicyType = invalidationPolicyType;
        this.expiringTest = expiringTest;
    }

    /**
     * This method will build a cache invalidation policy for the query being run depending
     * on the invalidation and expiringTest settings of the query.
     */
    protected CacheInvalidationPolicy getInvalidationPolicy() {
        CacheInvalidationPolicy invalidationPolicy = null;
        if (invalidationPolicyType == NO_INVALIDATION) {
            invalidationPolicy = new NoExpiryCacheInvalidationPolicy();
        } else if (invalidationPolicyType == TIME_TO_LIVE_INVALIDATION) {
            if (expiringTest) {
                invalidationPolicy = new TimeToLiveCacheInvalidationPolicy(0);
                expectedSQLCount = 1;
                sleepTime = 100;
            } else {
                invalidationPolicy = new TimeToLiveCacheInvalidationPolicy(1000000);
            }
        } else {
            if (expiringTest) {
                expectedSQLCount = 1;
                GregorianCalendar calendar = new GregorianCalendar();
                calendar.setTime(new Date(System.currentTimeMillis() + 1000));
                invalidationPolicy = new DailyCacheInvalidationPolicy(calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND), calendar.get(Calendar.MILLISECOND));
                sleepTime = 1500;
            } else {
                GregorianCalendar calendar = new GregorianCalendar();
                calendar.setTime(new Date(System.currentTimeMillis() + 1000000));
                invalidationPolicy = new DailyCacheInvalidationPolicy(calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND), calendar.get(Calendar.MILLISECOND));

            }
        }
        return invalidationPolicy;
    }

    public ReadQuery getQueryForTest() {
        ReadQuery testQuery = super.getQueryForTest();
        testQuery.setQueryResultsCachePolicy(new QueryResultsCachePolicy(getInvalidationPolicy()));
        return testQuery;
    }

    public void test() {
        try {
            Thread.sleep(sleepTime);// sleep will allow cache to expire
        } catch (Exception exception) {
        }
        super.test();
    }
}
