/*
 * 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.oodt.cas.pge.metadata;

//OODT imports
import org.apache.oodt.cas.metadata.Metadata;
import org.apache.oodt.cas.pge.metadata.PgeMetadata.Type;

//Google imports
import com.google.common.collect.Lists;

//JUnit imports
import junit.framework.TestCase;

/**
 * Test class for {@link PgeMetadata}.
 * 
 * @author bfoster (Brian Foster)
 */
public class TestPgeMetadata extends TestCase {

   public void testReplacePgeMetadata() {
      Metadata staticMetadata = new Metadata();
      staticMetadata.addMetadata("key1", "staticValue1");
      staticMetadata.addMetadata("key2", "staticValue2");
      staticMetadata.addMetadata("key3", "staticValue3");

      Metadata dynamicMetadata = new Metadata();
      dynamicMetadata.addMetadata("key2", "dynValue2");

      PgeMetadata pgeMet = new PgeMetadata(staticMetadata, dynamicMetadata);
      PgeMetadata pgeMet2 = new PgeMetadata(staticMetadata, dynamicMetadata);
      pgeMet2.replaceMetadata("key4", "localValue4");
      pgeMet2.linkKey("keyLink1", "key1");
      pgeMet2.markAsDynamicMetadataKey("key4");
      pgeMet.replaceMetadata(pgeMet2, "test");

      assertEquals("staticValue1", pgeMet.getMetadata("key1"));
      assertEquals("dynValue2", pgeMet.getMetadata("key2"));
      assertEquals("staticValue2",
            pgeMet.getMetadata("key2", PgeMetadata.Type.STATIC));
      assertEquals("staticValue3", pgeMet.getMetadata("key3"));
      assertNull(pgeMet.getMetadata("key4"));

      assertNull(pgeMet.getMetadata("test/key1"));
      assertNull(pgeMet.getMetadata("test/key2"));
      assertNull(pgeMet.getMetadata("test/key2", PgeMetadata.Type.STATIC));
      assertNull(pgeMet.getMetadata("test/key3"));
      assertEquals("localValue4", pgeMet.getMetadata("test/key4"));

      assertNull(pgeMet.getMetadata("keyLink1"));
      assertEquals(pgeMet.getMetadata("key1"),
            pgeMet.getMetadata("test/keyLink1"));
      assertEquals(1, pgeMet.getMarkedAsDynamicMetadataKeys().size());
      assertEquals("test/key4", pgeMet.getMarkedAsDynamicMetadataKeys()
            .iterator().next());
   }

   public void testChangingDynamicMetadata() {
      PgeMetadata pgeMet = new PgeMetadata();

      assertTrue(pgeMet.asMetadata(Type.DYNAMIC).getAllKeys().isEmpty());
      pgeMet.replaceMetadata("key1", "value1");
      assertTrue(pgeMet.asMetadata(Type.DYNAMIC).getAllKeys().isEmpty());
      pgeMet.markAsDynamicMetadataKey();
      assertTrue(pgeMet.asMetadata(Type.DYNAMIC).getAllKeys().isEmpty());
      pgeMet.commitMarkedDynamicMetadataKeys();
      assertEquals(1, pgeMet.asMetadata(Type.DYNAMIC).getAllKeys().size());
      assertEquals("value1", pgeMet.asMetadata(Type.DYNAMIC)
            .getMetadata("key1"));

      pgeMet = new PgeMetadata();

      assertTrue(pgeMet.asMetadata(Type.DYNAMIC).getAllKeys().isEmpty());
      pgeMet.replaceMetadata("key1", "value1");
      assertTrue(pgeMet.asMetadata(Type.DYNAMIC).getAllKeys().isEmpty());
      pgeMet.markAsDynamicMetadataKey("key1");
      assertTrue(pgeMet.asMetadata(Type.DYNAMIC).getAllKeys().isEmpty());
      pgeMet.commitMarkedDynamicMetadataKeys("key1");
      assertEquals(1, pgeMet.asMetadata(Type.DYNAMIC).getAllKeys().size());
      assertEquals("value1", pgeMet.asMetadata(Type.DYNAMIC)
            .getMetadata("key1"));

      pgeMet.linkKey("keyLink1", "key1");
      pgeMet.replaceMetadata("keyLink1", "newValue");
      assertEquals("newValue",
            pgeMet.asMetadata(Type.DYNAMIC).getMetadata("key1"));
   }

   public void testLinking() {
      PgeMetadata pgeMet = new PgeMetadata();

      pgeMet.replaceMetadata("key1", "value1");
      pgeMet.linkKey("keyLink1", "key1");
      pgeMet.linkKey("keyLink2", "keyLink1");
      pgeMet.linkKey("keyLink3", "keyLink1");

      assertEquals("value1", pgeMet.getMetadata("key1"));
      assertEquals("value1", pgeMet.getMetadata("keyLink1"));
      assertEquals("value1", pgeMet.getMetadata("keyLink2"));
      assertEquals("value1", pgeMet.getMetadata("keyLink3"));

      pgeMet.replaceMetadata("keyLink3", "newValue");

      assertEquals("newValue", pgeMet.getMetadata("key1"));
      assertEquals("newValue", pgeMet.getMetadata("keyLink1"));
      assertEquals("newValue", pgeMet.getMetadata("keyLink2"));
      assertEquals("newValue", pgeMet.getMetadata("keyLink3"));

      assertEquals(Lists.newArrayList("keyLink1", "key1"),
            pgeMet.getReferenceKeyPath("keyLink2"));
      assertEquals(Lists.newArrayList("keyLink1", "key1"),
            pgeMet.getReferenceKeyPath("keyLink3"));

      pgeMet.replaceMetadata("key1", "value1");

      assertEquals("value1", pgeMet.getMetadata("key1"));
      assertEquals("value1", pgeMet.getMetadata("keyLink1"));
      assertEquals("value1", pgeMet.getMetadata("keyLink2"));
      assertEquals("value1", pgeMet.getMetadata("keyLink3"));

      pgeMet.unlinkKey("keyLink1");

      assertEquals("value1", pgeMet.getMetadata("key1"));
      assertNull(pgeMet.getMetadata("keyLink1"));
      assertNull(pgeMet.getMetadata("keyLink2"));
      assertNull(pgeMet.getMetadata("keyLink3"));

      pgeMet.linkKey("keyLink1", "key1");

      assertEquals("value1", pgeMet.getMetadata("key1"));
      assertEquals("value1", pgeMet.getMetadata("keyLink1"));
      assertEquals("value1", pgeMet.getMetadata("keyLink2"));
      assertEquals("value1", pgeMet.getMetadata("keyLink3"));

      assertEquals("key1", pgeMet.resolveKey("key1"));
      assertEquals("key1", pgeMet.resolveKey("keyLink1"));
      assertEquals("key1", pgeMet.resolveKey("keyLink2"));
      assertEquals("key1", pgeMet.resolveKey("keyLink3"));
      assertEquals("keyLink4", pgeMet.resolveKey("keyLink4"));
   }
}
