/**
* Copyright (c) 2011, SOCIETIES Consortium (WATERFORD INSTITUTE OF TECHNOLOGY (TSSG), HERIOT-WATT UNIVERSITY (HWU), SOLUTA.NET
* (SN), GERMAN AEROSPACE CENTRE (Deutsches Zentrum fuer Luft- und Raumfahrt e.V.) (DLR), Zavod za varnostne tehnologije
* informacijske družbe in elektronsko poslovanje (SETCCE), INSTITUTE OF COMMUNICATION AND COMPUTER SYSTEMS (ICCS), LAKE
* COMMUNICATIONS (LAKE), INTEL PERFORMANCE LEARNING SOLUTIONS LTD (INTEL), PORTUGAL TELECOM INOVAÇÃO, SA (PTIN), IBM Corp.,
* INSTITUT TELECOM (ITSUD), AMITEC DIACHYTI EFYIA PLIROFORIKI KAI EPIKINONIES ETERIA PERIORISMENIS EFTHINIS (AMITEC), TELECOM
* ITALIA S.p.a.(TI), TRIALOG (TRIALOG), Stiftelsen SINTEF (SINTEF), NEC EUROPE LTD (NEC))
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
* conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
* SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.societies.api.identity;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.societies.api.cis.model.CisAttributeTypes;
import org.societies.api.context.model.CtxAttributeTypes;
import org.societies.api.context.model.MalformedCtxIdentifierException;
import org.societies.api.identity.util.DataIdentifierFactory;
import org.societies.api.identity.util.DataIdentifierUtils;
import org.societies.api.schema.identity.DataIdentifier;
import org.societies.api.schema.identity.DataIdentifierScheme;
/**
* @author Olivier Maridat (Trialog)
*
*/
public class DataIdentifierUtilsTest {
private static final Logger LOG = LoggerFactory.getLogger(DataIdentifierUtilsTest.class.getName());
@Test
public void testHasSameType() {
String testTitle = "Get scheme";
LOG.info("[Test] "+testTitle);
DataIdentifier id1 = DataIdentifierFactory.fromType(DataIdentifierScheme.CONTEXT, CtxAttributeTypes.ADDRESS_HOME_CITY);
DataIdentifier id2 = DataIdentifierFactory.create(DataIdentifierScheme.CONTEXT, "me.ict-societies.eu", CtxAttributeTypes.ADDRESS_HOME_CITY);
DataIdentifier id3 = DataIdentifierFactory.fromType(DataIdentifierScheme.CONTEXT, CtxAttributeTypes.BIRTHDAY);
DataIdentifier id4 = null;
try {
id4 = DataIdentifierFactory.fromUri(DataIdentifierScheme.CIS+"://me.ict-societies.eu/"+CisAttributeTypes.MEMBER_LIST);
} catch (MalformedCtxIdentifierException e) {
LOG.error("Faillure during data id creation from URI", e);
fail("Faillure during data id creation from URI: "+e.getMessage());
}
DataIdentifier id5 = DataIdentifierFactory.create(DataIdentifierScheme.CIS, "me.ict-societies.eu", CisAttributeTypes.MEMBER_LIST);
DataIdentifier id6 = DataIdentifierFactory.create(DataIdentifierScheme.CIS, "you.ict-societies.eu", CisAttributeTypes.MEMBER_LIST);
DataIdentifier id7 = DataIdentifierFactory.create(DataIdentifierScheme.CIS, "me.ict-societies.eu", CisAttributeTypes.CIS_LIST);
DataIdentifier id8 = DataIdentifierFactory.fromType(DataIdentifierScheme.CIS, CtxAttributeTypes.ADDRESS_HOME_CITY);
SimpleDataIdentifier id9 = new SimpleDataIdentifier();
id9.setUri(DataIdentifierScheme.CIS+"://me.ict-societies.eu/"+CisAttributeTypes.MEMBER_LIST);
LOG.info(id9.getUri());
DataIdentifier id10 = new SimpleDataIdentifier();
DataIdentifier id11 = null;
// Context Scheme
assertTrue("Type should be equals", DataIdentifierUtils.hasSameType(id1, id2));
assertTrue("Type should be equals (inverse)", DataIdentifierUtils.hasSameType(id2, id1));
assertFalse("Type should not be equals (1/4)", DataIdentifierUtils.hasSameType(id1, id3));
assertFalse("Type should not be equals (inverse) (2/4)", DataIdentifierUtils.hasSameType(id3, id1));
assertFalse("Type should not be equals (3/4)", DataIdentifierUtils.hasSameType(id2, id3));
assertFalse("Type should not be equals (inverse) (4/4)", DataIdentifierUtils.hasSameType(id3, id2));
// Cis scheme
assertTrue("Type should be equals", DataIdentifierUtils.hasSameType(id4, id5));
assertTrue("Type should be equals (inverse)", DataIdentifierUtils.hasSameType(id5, id4));
assertTrue("Type should be equals even if owner id is different", DataIdentifierUtils.hasSameType(id5, id6));
assertTrue("Type should be equals even if owner id is different (inverse)", DataIdentifierUtils.hasSameType(id6, id5));
assertFalse("Type should not be equals (1/2)", DataIdentifierUtils.hasSameType(id5, id7));
assertFalse("Type should not be equals (inverse) (2/2)", DataIdentifierUtils.hasSameType(id7, id6));
assertTrue("Type should be equals (even if only URI is defined) (1/4)", DataIdentifierUtils.hasSameType(id4, id9));
assertTrue("Type should be equals (even if only URI is defined) (inverse) (2/4)", DataIdentifierUtils.hasSameType(id9, id4));
assertTrue("Type should be equals (even if only URI is defined) (3/4)", DataIdentifierUtils.hasSameType(id5, id9));
assertTrue("Type should be equals (even if only URI is defined) (inverse) (4/4)", DataIdentifierUtils.hasSameType(id9, id5));
// Mix
assertFalse("Type should not be equals (1/4)", DataIdentifierUtils.hasSameType(id1, id4));
assertFalse("Type should not be equals (inverse) (2/4)", DataIdentifierUtils.hasSameType(id4, id1));
assertFalse("Type should not be equals (3/4)", DataIdentifierUtils.hasSameType(id3, id5));
assertFalse("Type should not be equals (inverse) (4/4)", DataIdentifierUtils.hasSameType(id5, id3));
// Same type but different scheme
assertFalse("Type should not be equals (4/6)", DataIdentifierUtils.hasSameType(id1, id8));
assertFalse("Type should not be equals (inverse) (6/6)", DataIdentifierUtils.hasSameType(id8, id1));
// Limit
assertFalse("Type should not be equals if one is null (1/4)", DataIdentifierUtils.hasSameType(id1, id11));
assertFalse("Type should not be equals if one is null (inverse) (2/4)", DataIdentifierUtils.hasSameType(id11, id1));
assertFalse("Type should not be equals if one is empty (3/4)", DataIdentifierUtils.hasSameType(id1, id10));
assertFalse("Type should not be equals if one is empty (inverse) (4/4)", DataIdentifierUtils.hasSameType(id10, id1));
assertFalse("Type should not be equals if one is empty (5/6)", DataIdentifierUtils.hasSameType(id9, id10));
assertFalse("Type should not be equals if one is empty (inverse) (6/6)", DataIdentifierUtils.hasSameType(id10, id9));
}
@Test
public void testIsParentType() {
String testTitle = "Get scheme";
LOG.info("[Test] "+testTitle);
DataIdentifier id0 = DataIdentifierFactory.fromType(DataIdentifierScheme.CONTEXT, "ADDRESS_HOME");
DataIdentifier id1 = DataIdentifierFactory.fromType(DataIdentifierScheme.CONTEXT, CtxAttributeTypes.ADDRESS_HOME_CITY);
DataIdentifier id2 = DataIdentifierFactory.create(DataIdentifierScheme.CONTEXT, "me.ict-societies.eu", CtxAttributeTypes.ADDRESS_HOME_CITY);
DataIdentifier id3 = DataIdentifierFactory.fromType(DataIdentifierScheme.CONTEXT, CtxAttributeTypes.BIRTHDAY);
DataIdentifier id4 = null;
try {
id4 = DataIdentifierFactory.fromUri(DataIdentifierScheme.CIS+"://me.ict-societies.eu/"+CisAttributeTypes.MEMBER_LIST);
} catch (MalformedCtxIdentifierException e) {
LOG.error("Faillure during data id creation from URI", e);
fail("Faillure during data id creation from URI: "+e.getMessage());
}
DataIdentifier id5 = DataIdentifierFactory.create(DataIdentifierScheme.CIS, "me.ict-societies.eu", CisAttributeTypes.MEMBER_LIST);
DataIdentifier id6 = DataIdentifierFactory.create(DataIdentifierScheme.CIS, "you.ict-societies.eu", CisAttributeTypes.MEMBER_LIST);
DataIdentifier id7 = DataIdentifierFactory.create(DataIdentifierScheme.CIS, "me.ict-societies.eu", CisAttributeTypes.CIS_LIST);
DataIdentifier id8 = DataIdentifierFactory.fromType(DataIdentifierScheme.CIS, CtxAttributeTypes.ADDRESS_HOME_CITY);
SimpleDataIdentifier id9 = new SimpleDataIdentifier();
id9.setUri(DataIdentifierScheme.CIS+"://me.ict-societies.eu/"+CisAttributeTypes.MEMBER_LIST);
LOG.info(id9.getUri());
DataIdentifier id10 = new SimpleDataIdentifier();
DataIdentifier id11 = null;
// Context Scheme
assertTrue("Type 2 should be children of type 1", DataIdentifierUtils.isParentOrSameType(id0, id1));
assertFalse("Type 1 should not be a children of type 2", DataIdentifierUtils.isParentOrSameType(id1, id0));
assertTrue("Type should be equals", DataIdentifierUtils.isParentOrSameType(id1, id2));
assertTrue("Type should be equals (inverse)", DataIdentifierUtils.isParentOrSameType(id2, id1));
assertFalse("Type should not be equals (1/4)", DataIdentifierUtils.isParentOrSameType(id1, id3));
assertFalse("Type should not be equals (inverse) (2/4)", DataIdentifierUtils.isParentOrSameType(id3, id1));
assertFalse("Type should not be equals (3/4)", DataIdentifierUtils.isParentOrSameType(id2, id3));
assertFalse("Type should not be equals (inverse) (4/4)", DataIdentifierUtils.isParentOrSameType(id3, id2));
// Cis scheme
assertTrue("Type should be equals", DataIdentifierUtils.isParentOrSameType(id4, id5));
assertTrue("Type should be equals (inverse)", DataIdentifierUtils.isParentOrSameType(id5, id4));
assertTrue("Type should be equals even if owner id is different", DataIdentifierUtils.isParentOrSameType(id5, id6));
assertTrue("Type should be equals even if owner id is different (inverse)", DataIdentifierUtils.isParentOrSameType(id6, id5));
assertFalse("Type should not be equals (1/2)", DataIdentifierUtils.isParentOrSameType(id5, id7));
assertFalse("Type should not be equals (inverse) (2/2)", DataIdentifierUtils.isParentOrSameType(id7, id6));
assertTrue("Type should be equals (even if only URI is defined) (1/4)", DataIdentifierUtils.isParentOrSameType(id4, id9));
assertTrue("Type should be equals (even if only URI is defined) (inverse) (2/4)", DataIdentifierUtils.isParentOrSameType(id9, id4));
assertTrue("Type should be equals (even if only URI is defined) (3/4)", DataIdentifierUtils.isParentOrSameType(id5, id9));
assertTrue("Type should be equals (even if only URI is defined) (inverse) (4/4)", DataIdentifierUtils.isParentOrSameType(id9, id5));
// Mix
assertFalse("Type should not be equals (1/4)", DataIdentifierUtils.isParentOrSameType(id1, id4));
assertFalse("Type should not be equals (inverse) (2/4)", DataIdentifierUtils.isParentOrSameType(id4, id1));
assertFalse("Type should not be equals (3/4)", DataIdentifierUtils.isParentOrSameType(id3, id5));
assertFalse("Type should not be equals (inverse) (4/4)", DataIdentifierUtils.isParentOrSameType(id5, id3));
// Same type but different scheme
assertFalse("Type should not be equals (4/6)", DataIdentifierUtils.isParentOrSameType(id1, id8));
assertFalse("Type should not be equals (inverse) (6/6)", DataIdentifierUtils.isParentOrSameType(id8, id1));
// Limit
assertFalse("Type should not be equals if one is null (1/4)", DataIdentifierUtils.isParentOrSameType(id1, id11));
assertFalse("Type should not be equals if one is null (inverse) (2/4)", DataIdentifierUtils.isParentOrSameType(id11, id1));
assertFalse("Type should not be equals if one is empty (3/4)", DataIdentifierUtils.isParentOrSameType(id1, id10));
assertFalse("Type should not be equals if one is empty (inverse) (4/4)", DataIdentifierUtils.isParentOrSameType(id10, id1));
assertFalse("Type should not be equals if one is empty (5/6)", DataIdentifierUtils.isParentOrSameType(id9, id10));
assertFalse("Type should not be equals if one is empty (inverse) (6/6)", DataIdentifierUtils.isParentOrSameType(id10, id9));
}
@Test
public void testSortByParent() {
Set<DataIdentifier> nameList = new HashSet<DataIdentifier>();
Set<DataIdentifier> actionList = new HashSet<DataIdentifier>();
DataIdentifier nameId = null;
DataIdentifier actionId = null;
try {
nameId = DataIdentifierFactory.create(DataIdentifierScheme.CONTEXT, "fooCss", CtxAttributeTypes.NAME);
nameList.add(DataIdentifierFactory.fromUri(DataIdentifierScheme.CONTEXT+"://fooCss/ENTITY/person/1/ATTRIBUTE/"+CtxAttributeTypes.NAME_FIRST+"/33"));
nameList.add(DataIdentifierFactory.fromUri(DataIdentifierScheme.CONTEXT+"://fooCss/ENTITY/person/1/ATTRIBUTE/"+CtxAttributeTypes.NAME_LAST+"/38"));
actionId = DataIdentifierFactory.fromUri(DataIdentifierScheme.CONTEXT+"://fooCss/ENTITY/person/1/ATTRIBUTE/"+CtxAttributeTypes.ACTION+"/42");
actionList.add(actionId);
} catch (MalformedCtxIdentifierException e) {
LOG.error("Faillure during data id creation from URI", e);
fail("Faillure during data id creation from URI: "+e);
}
// - List1
// Parameters
Set<DataIdentifier> list1 = new HashSet<DataIdentifier>();
list1.addAll(nameList);
list1.add(actionId);
// Expected
Map<String, Set<DataIdentifier>> expectedMap1 = new HashMap<String, Set<DataIdentifier>>();
expectedMap1.put(nameId.getType(), nameList);
expectedMap1.put(actionId.getType(), actionList);
assertEquals("NAME_FIRST (leaf), NAME_LAST (leaf), ACTION (root and leaf) should be sorted as: NAME -> NAME_FIRST, NAME_LAST ; ACTION -> ACTION", expectedMap1, DataIdentifierUtils.sortByParent(list1));
// - List2
// Parameters
Set<DataIdentifier> list2 = new HashSet<DataIdentifier>();
list2.addAll(nameList);
list2.add(nameId);
list2.add(actionId);
assertEquals("NAME (root not leaf), NAME_FIRST (leaf), NAME_LAST (leaf), ACTION (root and leaf) should be sorted as: NAME -> NAME_FIRST, NAME_LAST ; ACTION -> ACTION", expectedMap1, DataIdentifierUtils.sortByParent(list2));
// - List3
// Parameters
Set<DataIdentifier> list3 = new HashSet<DataIdentifier>();
list3.add(nameId);
list3.add(actionId);
// Expected
Map<String, Set<DataIdentifier>> expectedMap3 = new HashMap<String, Set<DataIdentifier>>();
expectedMap3.put(nameId.getType(), null);
expectedMap3.put(actionId.getType(), actionList);
assertEquals("NAME (root not leaf), ACTION (root and leaf) should be sorted as: NAME -> null ; ACTION -> ACTION", expectedMap3, DataIdentifierUtils.sortByParent(list3));
}
}