/*
* #!
* Ontopoly Editor
* #-
* 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 ontopoly.model;
import java.util.Collection;
import java.util.List;
import net.ontopia.infoset.core.LocatorIF;
import net.ontopia.topicmaps.core.TopicIF;
import net.ontopia.utils.OntopiaRuntimeException;
/**
* Represents a cardinality that can be assigned to a field.
*/
public class Cardinality extends Topic {
/**
* Creates a new Cardinality object.
*/
public Cardinality(TopicIF topic, TopicMap tm) {
super(topic, tm);
}
public boolean equals(Object obj) {
if (!(obj instanceof Cardinality))
return false;
Cardinality cardinality = (Cardinality) obj;
return (getTopicIF().equals(cardinality.getTopicIF()));
}
public LocatorIF getLocator() {
Collection<LocatorIF> subjectIdentifiers = getTopicIF().getSubjectIdentifiers();
if (subjectIdentifiers.contains(PSI.ON_CARDINALITY_0_1)) {
return PSI.ON_CARDINALITY_0_1;
} else if (subjectIdentifiers.contains(PSI.ON_CARDINALITY_1_1)) {
return PSI.ON_CARDINALITY_1_1;
} else if (subjectIdentifiers.contains(PSI.ON_CARDINALITY_0_M)) {
return PSI.ON_CARDINALITY_0_M;
} else if (subjectIdentifiers.contains(PSI.ON_CARDINALITY_1_M)) {
return PSI.ON_CARDINALITY_1_M;
} else {
return null;
}
}
public boolean isZeroOrOne() {
return getTopicIF().getSubjectIdentifiers().contains(PSI.ON_CARDINALITY_0_1);
}
public boolean isExactlyOne() {
return getTopicIF().getSubjectIdentifiers().contains(PSI.ON_CARDINALITY_1_1);
}
public boolean isZeroOrMore() {
return getTopicIF().getSubjectIdentifiers().contains(PSI.ON_CARDINALITY_0_M);
}
public boolean isOneOrMore() {
return getTopicIF().getSubjectIdentifiers().contains(PSI.ON_CARDINALITY_1_M);
}
/**
* True if cardinality is 0..1 or 1..1.
*/
public boolean isMaxOne() {
return isZeroOrOne() || isExactlyOne();
}
//
// /**
// * True if cardinality is 0..* or 1..*.
// */
// public boolean isMaxInfinite() {
// return isZeroOrMore() || isOneOrMore();
// }
//
// /**
// * True if cardinality is 0..* or 0..1.
// */
// public boolean isMinZero() {
// return isZeroOrMore() || isZeroOrOne();
// }
/**
* True if cardinality is 1..* or 1..1.
*/
public boolean isMinOne() {
return isOneOrMore() || isExactlyOne();
}
/**
* Returns the default cardinality (zero or more)
*/
public static Cardinality getDefaultCardinality(FieldDefinition fieldDefinition) {
TopicMap tm = fieldDefinition.getTopicMap();
LocatorIF cardPSI = PSI.ON_CARDINALITY_0_M;
switch (fieldDefinition.getFieldType()) {
case FieldDefinition.FIELD_TYPE_IDENTITY: {
IdentityField identityField = (IdentityField)fieldDefinition;
if (identityField.isSubjectLocator())
cardPSI = PSI.ON_CARDINALITY_1_1;
else
cardPSI = PSI.ON_CARDINALITY_0_M;
break;
}
case FieldDefinition.FIELD_TYPE_NAME: {
cardPSI = PSI.ON_CARDINALITY_1_1;
break;
}
case FieldDefinition.FIELD_TYPE_OCCURRENCE: {
cardPSI = PSI.ON_CARDINALITY_0_1;
break;
}
case FieldDefinition.FIELD_TYPE_ROLE: {
cardPSI = PSI.ON_CARDINALITY_0_M;
break;
}
case FieldDefinition.FIELD_TYPE_QUERY: {
cardPSI = PSI.ON_CARDINALITY_0_M;
break;
}
default:
throw new OntopiaRuntimeException("Unknown field definition: " + fieldDefinition.getFieldType());
}
return new Cardinality(tm.getTopicMapIF().getTopicBySubjectIdentifier(cardPSI), tm);
}
/**
* Returns all available cardinalities.
*
* @return A list containing Cardinality objects of all available
* cardinalities.
*/
public static List<Cardinality> getCardinalityTypes(TopicMap tm) {
String query = "instance-of($d, on:cardinality)?";
QueryMapper<Cardinality> qm = tm.newQueryMapper(Cardinality.class);
return qm.queryForList(query);
}
public int getMinCardinality() {
return isMinOne() ? 1 : 0;
}
public int getMaxCardinality() {
return isMaxOne() ? 1 : 0;
}
}