/*
* #!
* Ontopia Engine
* #-
* Copyright (C) 2001 - 2013 The Ontopia Project
* #-
* Licensed 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 net.ontopia.topicmaps.core;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.Reader;
import java.io.StringReader;
import java.io.Writer;
import java.net.MalformedURLException;
import java.util.Collections;
import net.ontopia.utils.StreamUtils;
import net.ontopia.utils.ObjectUtils;
import net.ontopia.infoset.core.LocatorIF;
import net.ontopia.infoset.impl.basic.GenericLocator;
import net.ontopia.infoset.impl.basic.URILocator;
import net.ontopia.utils.TestFileUtils;
public abstract class VariantNameTest extends AbstractScopedTest {
protected VariantNameIF variant;
public VariantNameTest(String name) {
super(name);
}
public void setUp() throws Exception {
super.setUp();
TopicIF topic = builder.makeTopic();
TopicNameIF basename = builder.makeTopicName(topic, "");
parent = basename;
variant = builder.makeVariantName(basename, "", Collections.<TopicIF>emptySet());
scoped = variant;
object = variant;
}
// --- Test cases
public void testReification() {
TopicIF reifier = builder.makeTopic();
ReifiableIF reifiable = variant;
assertTrue("Object reified by the reifying topic was found",
reifier.getReified() == null);
assertTrue("Topic reifying the reifiable was found",
reifiable.getReifier() == null);
reifiable.setReifier(reifier);
assertTrue("No topic reifying the reifiable was found",
reifiable.getReifier() == reifier);
assertTrue("No object reified by the reifying topic was found",
reifier.getReified() == reifiable);
reifiable.setReifier(null);
assertTrue("Object reified by the reifying topic was found",
reifier.getReified() == null);
assertTrue("Topic reifying the first reifiable was found",
reifiable.getReifier() == null);
}
public void testLocator() {
assertTrue("initial locator not null", variant.getLocator() == null);
try {
URILocator loc = new URILocator("http://www.ontopia.net");
variant.setLocator(loc);
assertTrue("locator identity not maintained after set",
variant.getLocator().equals(loc));
assertTrue("data type is incorrect. should be xsd:anyURI", ObjectUtils.equals(variant.getDataType(), DataTypes.TYPE_URI));
try {
variant.setLocator(null);
fail("value could be set to null");
} catch (NullPointerException e) {
}
}
catch (MalformedURLException e) {
fail("(INTERNAL) given URI was malformed");
}
}
public void testNonURILocator() {
try {
variant.setLocator(new GenericLocator("URG", "l/e"));
fail("non URI-locator could be set");
} catch (ConstraintViolationException e) {
}
try {
variant.setValue("foo", new GenericLocator("URG", "l/e"));
fail("non URI datatype could be set");
} catch (ConstraintViolationException e) {
}
try {
variant.setReader(new StringReader("foo"), 3, new GenericLocator("URG", "l/e"));
fail("non URI datatype could be set");
} catch (ConstraintViolationException e) {
}
}
public void testGenericURILocator() {
LocatorIF loc1 = new GenericLocator("URI", "foo:bar");
variant.setLocator(loc1);
LocatorIF loc2 = variant.getLocator();
assertTrue("Locator notation is not URI", loc2.getNotation().equals("URI"));
assertTrue("Locator value is not foo:bar", loc2.getAddress().equals("foo:bar"));
assertTrue("Input locator is not equal output locator", loc2.equals(loc1));
assertTrue("Output locator is not equal input locator", loc1.equals(loc2));
}
public void testTopicName() {
assertTrue("parent is not right object",
variant.getTopicName().equals(parent));
}
public void testTopic() {
TopicIF topic = variant.getTopicName().getTopic();
assertTrue("parent is not right object",
variant.getTopic().equals(topic));
}
public void testValue() {
assertTrue("initial name value not null", "".equals(variant.getValue()));
variant.setValue("testfaen");
assertTrue("name not set correctly",
variant.getValue().equals("testfaen"));
assertTrue("data type is incorrect. should be xsd:anyURI", ObjectUtils.equals(variant.getDataType(), DataTypes.TYPE_STRING));
try {
variant.setValue(null);
fail("value could be set to null");
} catch (NullPointerException e) {
}
assertTrue("data type is incorrect. should be xsd:anyURI", ObjectUtils.equals(variant.getDataType(), DataTypes.TYPE_STRING));
}
public void testReader() throws Exception {
// read file and store in object
File filein = TestFileUtils.getTransferredTestInputFile("various", "clob.xml");
File fileout = TestFileUtils.getTestOutputFile("various", "clob.xml.out");
Reader ri = new FileReader(filein);
long inlen = filein.length();
variant.setReader(ri, inlen, DataTypes.TYPE_BINARY);
assertTrue("Variant datatype is incorrect", ObjectUtils.equals(DataTypes.TYPE_BINARY, variant.getDataType()));
// read and decode content
Reader ro = variant.getReader();
try {
Writer wo = new FileWriter(fileout);
try {
StreamUtils.transfer(ro, wo);
} finally {
wo.close();
}
} finally {
ro.close();
}
assertTrue("Reader value is null", ro != null);
try {
ri = new FileReader(filein);
ro = new FileReader(fileout);
long outlen = variant.getLength();
try {
assertTrue("Variant value put in is not the same as the one we get out.", StreamUtils.compare(ro, ri));
assertTrue("Variant value length is different", inlen == outlen);
} finally {
ri.close();
}
} finally {
ro.close();
}
}
public void testTopicOfVariant() {
assertTrue("parent and grandparent do not agree",
variant.getTopicName().getTopic().equals(((TopicNameIF) parent).getTopic()));
}
public void _testInheritedScope() {
TopicIF topic = builder.makeTopic();
TopicIF theme1 = builder.makeTopic();
TopicIF theme2 = builder.makeTopic();
TopicIF theme3 = builder.makeTopic();
TopicNameIF bn = builder.makeTopicName(topic, "");
bn.addTheme(theme1);
assertTrue("Base name does not have theme1", bn.getScope().size() == 1 && bn.getScope().contains(theme1));
TopicNameIF vn = builder.makeTopicName(topic, "");
assertTrue("Variant does not have theme1", vn.getScope().size() == 1 && vn.getScope().contains(theme1));
bn.addTheme(theme2);
assertTrue("Base name does not have theme1 and theme2",
bn.getScope().size() == 2 && bn.getScope().contains(theme1) && bn.getScope().contains(theme2));
assertTrue("Variant does not have theme1 and theme2",
vn.getScope().size() == 2 && vn.getScope().contains(theme1) && vn.getScope().contains(theme2));
try {
vn.removeTheme(theme2);
fail("Should not be able to remove theme2 from variant name.");
} catch (ConstraintViolationException e) {
// ok
}
vn.addTheme(theme3);
assertTrue("Base name does not have theme1 and theme2",
bn.getScope().size() == 2 && bn.getScope().contains(theme1) && bn.getScope().contains(theme2));
assertTrue("Variant does not have theme1, theme2 and theme3",
vn.getScope().size() == 3 &&
vn.getScope().contains(theme1) &&
vn.getScope().contains(theme2) && vn.getScope().contains(theme3));
bn.removeTheme(theme3);
assertTrue("Base name does not have theme1 and theme2",
bn.getScope().size() == 2 && bn.getScope().contains(theme1) && bn.getScope().contains(theme2));
assertTrue("Variant does not have theme1, theme2 and theme3",
vn.getScope().size() == 3 &&
vn.getScope().contains(theme1) &&
vn.getScope().contains(theme2) && vn.getScope().contains(theme3));
vn.removeTheme(theme3);
assertTrue("Base name does not have theme1 and theme2",
bn.getScope().size() == 2 && bn.getScope().contains(theme1) && bn.getScope().contains(theme2));
assertTrue("Variant does not have theme1 and theme2",
vn.getScope().size() == 2 && vn.getScope().contains(theme1) && vn.getScope().contains(theme2));
bn.removeTheme(theme2);
assertTrue("Base name does not have theme1",
bn.getScope().size() == 1 && bn.getScope().contains(theme1));
assertTrue("Variant does not have theme1",
vn.getScope().size() == 1 && vn.getScope().contains(theme1));
bn.removeTheme(theme1);
assertTrue("Base name does have scope when it should not", bn.getScope().isEmpty());
assertTrue("Variant does have scope when it should not", vn.getScope().isEmpty());
TopicIF theme = builder.makeTopic();
}
// --- Internal methods
protected TMObjectIF makeObject() {
TopicIF topic = builder.makeTopic();
TopicNameIF basename = builder.makeTopicName(topic, "");
return builder.makeVariantName(basename, "", Collections.<TopicIF>emptySet());
}
}