001 package nl.tudelft.tbm.eeni.owl2java.model.jmodel;
002
003 import nl.tudelft.tbm.eeni.owl2java.model.jmodel.utils.LogUtils;
004 import nl.tudelft.tbm.eeni.owl2java.utils.IReporting;
005 import org.apache.commons.logging.Log;
006 import org.apache.commons.logging.LogFactory;
007
008
009 public class JCardinalityRestriction extends JBaseRestriction implements IReporting {
010
011 @SuppressWarnings("unused")
012 private static Log log = LogFactory.getLog(JCardinalityRestriction.class);
013
014 private int maxCardinality = -1;
015 private int minCardinality = 0;
016
017 // multipleXXX = true -> we need accessor methods for this type;
018 private boolean multipleEnabled = true;
019 private boolean singleEnabled = false;
020 // deprecated status is set depending on the max and min values
021 // multipleDeprecated == true does not mean multipe = true
022 private boolean multipleDeprecated = false;
023 private boolean singleDeprecated = false;
024
025 public JCardinalityRestriction(JClass onClass, JProperty onProperty) {
026 super(onClass, onProperty);
027 // disable multiple stuff for functionals
028 if (onProperty.isFunctional()) {
029 multipleEnabled = false;
030 singleEnabled = true;
031 }
032 }
033
034 public JCardinalityRestriction clone() {
035 JCardinalityRestriction restriction = new JCardinalityRestriction(onClass, onProperty);
036 restriction.isEmpty = isEmpty;
037 restriction.maxCardinality = maxCardinality;
038 restriction.minCardinality = minCardinality;
039 restriction.multipleEnabled = multipleEnabled;
040 restriction.multipleDeprecated = multipleDeprecated;
041 restriction.singleEnabled = singleEnabled;
042 restriction.singleDeprecated = singleDeprecated;
043
044 return restriction;
045 }
046
047 public boolean equalsIgnoreDeprecated(Object other) {
048 if (!(other instanceof JCardinalityRestriction))
049 return false;
050 JCardinalityRestriction cr = (JCardinalityRestriction) other;
051 if (!(isEmpty == cr.isEmpty))
052 return false;
053 if (!(maxCardinality == cr.maxCardinality))
054 return false;
055 if (!(minCardinality == cr.minCardinality))
056 return false;
057 if (!(multipleEnabled == cr.multipleEnabled))
058 return false;
059 if (!(singleEnabled == cr.singleEnabled))
060 return false;
061 return true;
062 }
063
064 public boolean equals(Object other) {
065 if (!equalsIgnoreDeprecated(other))
066 return false;
067 JCardinalityRestriction cr = (JCardinalityRestriction) other;
068 if (!(multipleDeprecated == cr.multipleDeprecated))
069 if (!(singleDeprecated == cr.singleDeprecated))
070 return false;
071 return true;
072 }
073
074 public void mergeParent(JCardinalityRestriction parent) {
075 // empty parent cardinality restrictions (aka no restrictions) are ignored
076 if (!parent.isEmpty) {
077 setMaxCardinality(parent.getMaxCardinality());
078 setMinCardinality(parent.getMinCardinality());
079 // set the enabled status
080 multipleEnabled = multipleEnabled || parent.multipleEnabled;
081 singleEnabled = singleEnabled || parent.singleEnabled;
082 // set the deprecated and enabled status on merge cardinalities
083 updateDeprecatedStatus();
084 }
085 }
086
087 protected void updateDeprecatedStatus() {
088 if (maxCardinality == 1) {
089 multipleDeprecated = true;
090 singleEnabled = true;
091 }
092 if (maxCardinality == 0 || (minCardinality > maxCardinality)) {
093 multipleDeprecated = true;
094 singleDeprecated = true;
095 }
096 }
097
098 public void setMaxCardinality(int max) {
099 if (maxCardinality == -1)
100 maxCardinality = max;
101 else {
102 if (maxCardinality > max)
103 maxCardinality = max;
104 }
105 isEmpty = false;
106 updateDeprecatedStatus();
107 }
108
109 public void setMinCardinality(int min) {
110 if (minCardinality == 0)
111 minCardinality = min;
112 else {
113 if (minCardinality < min)
114 minCardinality = min;
115 }
116 isEmpty = false;
117 updateDeprecatedStatus();
118 }
119
120 public void setCardinality(int cardinality) {
121 setMaxCardinality(cardinality);
122 setMinCardinality(cardinality);
123 updateDeprecatedStatus();
124 }
125
126
127 @Override
128 public String getJModelReport() {
129 String ret = LogUtils.toLogName(this) + ": ";
130 if (isEmpty)
131 return ret + "Empty cardinality restriction";
132 ret += "Max " + maxCardinality + ", Min " + minCardinality + "; ";
133 ret += "multiple " + multipleEnabled + ", deprecated " + multipleDeprecated + "; ";
134 ret += "single " + singleEnabled + ", deprecate " + singleDeprecated + "; ";
135 return ret;
136 }
137
138 public int getMaxCardinality() {
139 return maxCardinality;
140 }
141
142 public int getMinCardinality() {
143 return minCardinality;
144 }
145
146 public boolean isMultipleEnabled() {
147 return multipleEnabled;
148 }
149
150 public boolean isSingleEnabled() {
151 return singleEnabled;
152 }
153
154 public boolean isMultipleDeprecated() {
155 return multipleDeprecated;
156 }
157
158 public boolean isSingleDeprecated() {
159 return singleDeprecated;
160 }
161
162 public void setMultipleDeprecated(boolean multipleDeprecated) {
163 this.multipleDeprecated = multipleDeprecated;
164 }
165
166 public void setSingleDeprecated(boolean singleDeprecated) {
167 this.singleDeprecated = singleDeprecated;
168 }
169
170 public void setMultipleEnabled(boolean multipleEnabled) {
171 this.multipleEnabled = multipleEnabled;
172 }
173
174 public void setSingleEnabled(boolean singleEnabled) {
175 this.singleEnabled = singleEnabled;
176 }
177
178 }