/*
 * TestIntermediate.java
 *
 * Created on October 3, 2006, 12:01 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

/*
 * 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.persistence.jdbc.meta;

import java.util.*;
import org.apache.openjpa.kernel.Broker;
import org.apache.openjpa.kernel.BrokerFactory;
import org.apache.openjpa.kernel.OpenJPAStateManager;
import org.apache.openjpa.meta.FieldMetaData;
import org.apache.openjpa.persistence.OpenJPAPersistence;
import org.apache.openjpa.persistence.JPAFacadeHelper;

import org.apache.openjpa.persistence.jdbc.common.apps.*;


import java.lang.annotation.Annotation;
import junit.framework.*;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
import org.apache.openjpa.persistence.OpenJPAEntityManager;


public class TestIntermediate extends org.apache.openjpa.persistence.jdbc.kernel.BaseJDBCTest
{
    
    private Object _pc;
    private Object _rel;
    
    public TestIntermediate(String test) {
        super(test);
    }
    
    /** Creates a new instance of TestIntermediate */
    public TestIntermediate() {
    }
    
    public void setUp() {
        RuntimeTest1 pc = new RuntimeTest1("pc", 1);
        RuntimeTest1 rel = new RuntimeTest1("rel", 2);
        pc.setSelfOneOne(rel);
        
        OpenJPAEntityManager em =(OpenJPAEntityManager)currentEntityManager();
        Broker broker = JPAFacadeHelper.toBroker(em);
        broker.begin();
        broker.persist(pc, null);
        broker.commit();
        _pc = broker.getObjectId(pc);
        _rel = broker.getObjectId(rel);
        broker.close();
        em.close();
    }
    
    public void testOneOneSetsIntermediate() {
        OpenJPAEntityManager em =(OpenJPAEntityManager)currentEntityManager();
        Broker broker = JPAFacadeHelper.toBroker(em);
        try {
            oneOneIntermediateTest(broker);
        } finally {
            broker.close();
            em.close();
        }
    }
    
    public void testDataCacheOneOneSetsIntermediate() {
        BrokerFactory factory = getBrokerFactory(new String[]{
            "openjpa.DataCache", "true",
            "openjpa.RemoteCommitProvider", "sjvm",
        });
        
        // get obj into cache
        Broker broker = factory.newBroker();
        try {
            broker.find(_pc, true, null);
        } finally {
            broker.close();
        }
        
        // test from cache
        broker = factory.newBroker();
        try {
            oneOneIntermediateTest(broker);
        } finally {
            broker.close();
            try {
                factory.close();
            } catch (Exception e) {
            }
        }
    }
    
    /**
     * Helper method to see that the one to one uses an intermediate values.
     */
    private void oneOneIntermediateTest(Broker broker) {
        RuntimeTest1 pc = (RuntimeTest1) broker.find(_pc, true, null);
        OpenJPAStateManager sm = broker.getStateManager(pc);
        assertNotNull(sm);
        FieldMetaData fmd = sm.getMetaData().getField("selfOneOne");
        assertNotNull(fmd);
        assertEquals(_rel, sm.getIntermediate(fmd.getIndex()));
        assertEquals(_rel, broker.getObjectId(pc.getSelfOneOne()));
        assertNull(sm.getIntermediate(fmd.getIndex()));
    }
    
    
}
