package org.apache.ode.bpel.compiler_2_0;

import static org.junit.Assert.assertEquals;

import java.io.File;
import java.net.URI;
import java.net.URL;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.ode.bpel.obj.OProcess;
import org.apache.ode.bpel.obj.migrate.DeepEqualityHelper;
import org.apache.ode.bpel.obj.migrate.DomElementComparator;
import org.apache.ode.bpel.obj.migrate.ExtensibeImplEqualityComp;
import org.apache.ode.bpel.obj.migrate.ObjectTraverser;
import org.apache.ode.bpel.obj.migrate.UpgradeChecker;
import org.apache.ode.bpel.obj.serde.DeSerializer;
import org.junit.Assert;
import org.junit.Test;

public class MigrationTest extends GoodCompileTest{
    private static final Logger __log = LoggerFactory.getLogger(MigrationTest.class);

    /**
     * compare compiled OProcess with migrated ones.
     */
    public void runTest(String bpel) throws Exception {
        try {
            Class testClass = getClass();
            URL url = testClass.getResource(bpel);
            URI uri = url.toURI();
            String path = uri.getPath();
            File bpelFile = new File(path);
            String cbpPath = bpel.substring(0, bpel.lastIndexOf(".")) + ".cbp";
            String oldCbpPath = "/oldcbp" + cbpPath;
            File oldCbpFile = new File(testClass.getResource(oldCbpPath).getFile());
            
            OProcess nu = _compiler.compile2OProcess(bpelFile, 0);
    		__log.debug("compiled new OProcess " + nu.getFieldContainer());
    		
    		DeSerializer deSerializer = new DeSerializer(oldCbpFile);
    		OProcess migrated = deSerializer.deserialize();
    		__log.debug("Read and migrated old OProcess " + migrated.getFieldContainer());
    		
			//check
    		DeepEqualityHelper de = new DeepEqualityHelper();
    		de.addCustomComparator(new ExtensibeImplEqualityComp());
    		de.addCustomComparator(new DomElementComparator());
    		boolean res = de.deepEquals(nu, migrated);
       		assertEquals(Boolean.TRUE, res);
       		
       		UpgradeChecker checker = new UpgradeChecker();
    		ObjectTraverser traverser = new ObjectTraverser();
    		traverser.accept(checker);
    		traverser.traverseObject(migrated);
      		assertEquals(true, checker.isNewest());
     } catch (Exception ex) {
            ex.printStackTrace();
            Assert.fail("Compilation or migration did not succeed.");
        }
    }
    
    
	@Test
	public void testCompensation1() throws Exception {
    	//skip this test for no corresponding cbp from 1.3.x
//		runTest("/2.0/good/compensation/comp1-2.0.bpel");
	}
  
    @Test
	public void testMultipleEmbeddedSchemas() throws Exception {
    	//skip this test for no corresponding cbp from 1.3.x
//		runTest("/org/apache/ode/bpel/compiler/MultipleEmbeddedSchemas.bpel");
	}
}
