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    }