001package org.cpsolver.studentsct.model;
002
003import org.cpsolver.ifs.util.ToolBox;
004
005/**
006 * Academic area, classification, and major code. This class is used for
007 * {@link Student#getAreaClassificationMajors()}. <br>
008 * <br>
009 * 
010 * @version StudentSct 1.3 (Student Sectioning)<br>
011 *          Copyright (C) 2007 - 2014 Tomáš Müller<br>
012 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
013 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
014 * <br>
015 *          This library is free software; you can redistribute it and/or modify
016 *          it under the terms of the GNU Lesser General Public License as
017 *          published by the Free Software Foundation; either version 3 of the
018 *          License, or (at your option) any later version. <br>
019 * <br>
020 *          This library is distributed in the hope that it will be useful, but
021 *          WITHOUT ANY WARRANTY; without even the implied warranty of
022 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
023 *          Lesser General Public License for more details. <br>
024 * <br>
025 *          You should have received a copy of the GNU Lesser General Public
026 *          License along with this library; if not see
027 *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
028 */
029public class AreaClassificationMajor implements Comparable<AreaClassificationMajor>{
030    private String iArea, iClassification, iMajor, iConcentration;
031    private String iAreaName, iClassificationName, iMajorName, iConcentrationName;
032    private Double iWeight;
033    private String iDegree, iDegreeName;
034    private String iProgram, iProgramName;
035    private String iCampus, iCampusName;
036
037    /**
038     * Constructor
039     * 
040     * @param area academic area
041     * @param classification academic classification
042     * @param major major
043     */
044    public AreaClassificationMajor(String area, String classification, String major) {
045        iArea = area;
046        iClassification = classification;
047        iMajor = major;
048    }
049    
050    /**
051     * Constructor
052     * 
053     * @param area academic area
054     * @param classification academic classification
055     * @param major major
056     * @param concentration concentration (optional)
057     */
058    public AreaClassificationMajor(String area, String classification, String major, String concentration) {
059        iArea = area;
060        iClassification = classification;
061        iMajor = major;
062        iConcentration = concentration;
063    }
064    
065    /**
066     * Constructor
067     * 
068     * @param area academic area
069     * @param classification academic classification
070     * @param major major
071     * @param concentration concentration (optional)
072     * @param weight weight (optional)
073     */
074    public AreaClassificationMajor(String area, String classification, String major, String concentration, Double weight) {
075        iArea = area;
076        iClassification = classification;
077        iMajor = major;
078        iConcentration = concentration;
079        iWeight = weight;
080    }
081    
082    /**
083     * Constructor
084     * 
085     * @param areaCode academic area abbreviation
086     * @param areaName academic area name
087     * @param classificationCode academic classificationCode
088     * @param classificationName academic classificationName
089     * @param majorCode major code
090     * @param majorName major name
091     */
092    public AreaClassificationMajor(String areaCode, String areaName, String classificationCode, String classificationName, String majorCode, String majorName) {
093        iArea = areaCode;
094        iAreaName = areaName;
095        iClassification = classificationCode;
096        iClassificationName = classificationName;
097        iMajor = majorCode;
098        iMajorName = majorName;
099    }
100    
101    /**
102     * Constructor
103     * 
104     * @param areaCode academic area abbreviation
105     * @param areaName academic area name
106     * @param classificationCode academic classificationCode
107     * @param classificationName academic classificationName
108     * @param majorCode major code
109     * @param majorName major name
110     * @param concentrationCode concentration (optional)
111     * @param concentrationName concentration (optional)
112     */
113    public AreaClassificationMajor(String areaCode, String areaName, String classificationCode, String classificationName, String majorCode, String majorName, String concentrationCode, String concentrationName) {
114        iArea = areaCode;
115        iAreaName = areaName;
116        iClassification = classificationCode;
117        iClassificationName = classificationName;
118        iMajor = majorCode;
119        iMajorName = majorName;
120        iConcentration = concentrationCode;
121        iConcentrationName = concentrationName;
122    }
123    
124    /**
125     * Constructor
126     * 
127     * @param areaCode academic area abbreviation
128     * @param areaName academic area name
129     * @param classificationCode academic classificationCode
130     * @param classificationName academic classificationName
131     * @param majorCode major code
132     * @param majorName major name
133     * @param concentrationCode concentration (optional)
134     * @param concentrationName concentration (optional)
135     * @param weight weight (optional)
136     */
137    public AreaClassificationMajor(String areaCode, String areaName, String classificationCode, String classificationName, String majorCode, String majorName, String concentrationCode, String concentrationName, Double weight) {
138        iArea = areaCode;
139        iAreaName = areaName;
140        iClassification = classificationCode;
141        iClassificationName = classificationName;
142        iMajor = majorCode;
143        iMajorName = majorName;
144        iConcentration = concentrationCode;
145        iConcentrationName = concentrationName;
146        iWeight = weight;
147    }
148    
149    /**
150     * Constructor
151     * 
152     * @param areaCode academic area abbreviation
153     * @param areaName academic area name
154     * @param classificationCode academic classificationCode
155     * @param classificationName academic classificationName
156     * @param majorCode major code
157     * @param majorName major name
158     * @param concentrationCode concentration (optional)
159     * @param concentrationName concentration (optional)
160     * @param degreeCode degree (optional)
161     * @param degreeName degree (optional)
162     * @param weight weight (optional)
163     */
164    public AreaClassificationMajor(
165            String areaCode, String areaName,
166            String classificationCode, String classificationName,
167            String majorCode, String majorName,
168            String concentrationCode, String concentrationName,
169            String degreeCode, String degreeName,
170            Double weight) {
171        iArea = areaCode;
172        iAreaName = areaName;
173        iClassification = classificationCode;
174        iClassificationName = classificationName;
175        iMajor = majorCode;
176        iMajorName = majorName;
177        iConcentration = concentrationCode;
178        iConcentrationName = concentrationName;
179        iDegree = degreeCode;
180        iDegreeName = degreeName;
181        iWeight = weight;
182    }
183    
184    /**
185     * Constructor
186     * 
187     * @param areaCode academic area abbreviation
188     * @param areaName academic area name
189     * @param classificationCode academic classificationCode
190     * @param classificationName academic classificationName
191     * @param majorCode major code
192     * @param majorName major name
193     * @param concentrationCode concentration (optional)
194     * @param concentrationName concentration (optional)
195     * @param degreeCode degree (optional)
196     * @param degreeName degree (optional)
197     * @param programCode program (optional)
198     * @param programName program (optional)
199     * @param weight weight (optional)
200     */
201    public AreaClassificationMajor(
202            String areaCode, String areaName,
203            String classificationCode, String classificationName,
204            String majorCode, String majorName,
205            String concentrationCode, String concentrationName,
206            String degreeCode, String degreeName,
207            String programCode, String programName,
208            Double weight) {
209        iArea = areaCode;
210        iAreaName = areaName;
211        iClassification = classificationCode;
212        iClassificationName = classificationName;
213        iMajor = majorCode;
214        iMajorName = majorName;
215        iConcentration = concentrationCode;
216        iConcentrationName = concentrationName;
217        iDegree = degreeCode;
218        iDegreeName = degreeName;
219        iProgram = programCode;
220        iProgramName = programName;
221        iWeight = weight;
222    }
223    
224    /**
225     * Constructor
226     * 
227     * @param areaCode academic area abbreviation
228     * @param areaName academic area name
229     * @param classificationCode academic classificationCode
230     * @param classificationName academic classificationName
231     * @param majorCode major code
232     * @param majorName major name
233     * @param concentrationCode concentration (optional)
234     * @param concentrationName concentration (optional)
235     * @param degreeCode degree (optional)
236     * @param degreeName degree (optional)
237     * @param programCode program (optional)
238     * @param programName program (optional)
239     * @param weight weight (optional)
240     */
241    public AreaClassificationMajor(
242            String areaCode, String areaName,
243            String classificationCode, String classificationName,
244            String majorCode, String majorName,
245            String concentrationCode, String concentrationName,
246            String degreeCode, String degreeName,
247            String programCode, String programName,
248            String campus, String campusName,
249            Double weight) {
250        iArea = areaCode;
251        iAreaName = areaName;
252        iClassification = classificationCode;
253        iClassificationName = classificationName;
254        iMajor = majorCode;
255        iMajorName = majorName;
256        iConcentration = concentrationCode;
257        iConcentrationName = concentrationName;
258        iDegree = degreeCode;
259        iDegreeName = degreeName;
260        iProgram = programCode;
261        iProgramName = programName;
262        iCampus = campus;
263        iCampusName = campusName;
264        iWeight = weight;
265    }
266
267    /** Academic area 
268     * @return academic area abbreviation
269     **/
270    public String getArea() {
271        return iArea;
272    }
273
274    /** Academic classification 
275     * @return classification code
276     **/
277    public String getClassification() {
278        return iClassification;
279    }
280    
281    /** Major 
282     * @return major code
283     **/
284    public String getMajor() {
285        return iMajor;
286    }
287    
288    /** Concentration (optional)
289     * @return concentration code
290     **/
291    public String getConcentration() {
292        return iConcentration;
293    }
294    
295    /** Degree (optional)
296     * @return degree code
297     **/
298    public String getDegree() {
299        return iDegree;
300    }
301    
302    /** Program (optional)
303     * @return program code
304     **/
305    public String getProgram() {
306        return iProgram;
307    }
308    
309    /** Academic area  name
310     * @return academic area name
311     **/
312    public String getAreaName() {
313        return iAreaName;
314    }
315
316    /** Academic classification name
317     * @return classification name
318     **/
319    public String getClassificationName() {
320        return iClassificationName;
321    }
322    
323    /** Major name
324     * @return major name
325     **/
326    public String getMajorName() {
327        return iMajorName;
328    }
329    
330    /** Concentration (optional)
331     * @return concentration name
332     **/
333    public String getConcentrationName() {
334        return iConcentrationName;
335    }
336    
337    /** Degree (optional)
338     * @return degree name
339     **/
340    public String getDegreeName() {
341        return iDegreeName;
342    }
343    
344    /** Program (optional)
345     * @return program name
346     **/
347    public String getProgramName() {
348        return iProgramName;
349    }
350    
351    /** Campus (optional)
352     * @return campus name
353     **/
354    public String getCampus() {
355        return iCampus;
356    }
357    
358    /** Campus (optional)
359     * @return campus name
360     **/
361    public String getCampusName() {
362        return iCampusName;
363    }
364    
365    /** Weight (optional, defaults to 1.0)
366     */
367    public double getWeight() { return iWeight == null ? 1.0 : iWeight.doubleValue(); }
368
369    @Override
370    public int hashCode() {
371        return toString().hashCode();
372    }
373
374    @Override
375    public boolean equals(Object o) {
376        if (o == null || !(o instanceof AreaClassificationMajor))
377            return false;
378        AreaClassificationMajor acm = (AreaClassificationMajor) o;
379        return ToolBox.equals(acm.getArea(), getArea()) && ToolBox.equals(acm.getClassification(), getClassification()) && ToolBox.equals(acm.getMajor(), getMajor());
380    }
381
382    @Override
383    public String toString() {
384        return getArea() + "/" + getMajor() + (getConcentration() == null || getConcentration().isEmpty()? "" : "-" + getConcentration()) + " " + getClassification();
385    }
386    
387    private String getDegreeNotNull() { return (iDegree == null ? "" : iDegree); }
388    private String getProgramNotNull() { return (iProgram == null ? "" : iProgram); }
389    private String getCampusNotNull() { return (iCampus == null ? "" : iCampus); }
390    private String getConcentrationNotNull() { return (iConcentration == null ? "" : iConcentration); }
391    
392    @Override
393    public int compareTo(AreaClassificationMajor acm) {
394            if (getWeight() != acm.getWeight())
395                    return getWeight() > acm.getWeight() ? -1 : 1;
396            if (!getArea().equals(acm.getArea()))
397                    return getArea().compareTo(acm.getArea());
398            if (!getClassification().equals(acm.getClassification()))
399                    return getClassification().compareTo(acm.getClassification());
400            if (!getDegreeNotNull().equals(acm.getDegreeNotNull()))
401                    return getDegreeNotNull().compareTo(acm.getDegreeNotNull());
402            if (!getProgramNotNull().equals(acm.getProgramNotNull()))
403                    return getProgramNotNull().compareTo(acm.getProgramNotNull());
404            if (!getMajor().equals(acm.getMajor()))
405                    return getMajor().compareTo(acm.getMajor());
406            if (!getCampusNotNull().equals(acm.getCampusNotNull()))
407                    return getCampusNotNull().compareTo(acm.getCampusNotNull());
408            return getConcentrationNotNull().compareTo(acm.getConcentrationNotNull());
409    }
410}