package com.instructure.canvasapi.model; import android.os.Parcel; import android.os.Parcelable; import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * Created by Brady Larson * * Copyright (c) 2014 Instructure. All rights reserved. */ public class RubricCriterion implements Serializable , Comparable<RubricCriterion>, Parcelable { private static final long serialVersionUID = 1L; private String id; private Rubric rubric; private String description; private String long_description; private double points; private List<RubricCriterionRating> ratings = new ArrayList<RubricCriterionRating>(); /////////////////////////////////////////////////////////////////////////// // Getters and Setters /////////////////////////////////////////////////////////////////////////// public String getId() { return id; } public void setId(String id) { this.id = id; } public Rubric getRubric() { return rubric; } public void setRubric(Rubric rubric) { this.rubric = rubric; } public String getCriterionDescription() { return description; } public void setCriterionDescription(String criterionDescription) { this.description = criterionDescription; } public String getLongDescription() { return long_description; } public void setLongDescription(String longDescription) { this.long_description = longDescription; } public double getPoints() { return points; } public void setPoints(double points) { this.points = points; } public List<RubricCriterionRating> getRatings() { return ratings; } public List<RubricCriterionRating> getRatingsWithCriterionIds(){ for(RubricCriterionRating rating : ratings){ rating.setCriterionId(this.id); } return ratings; } public void setRatings(List<RubricCriterionRating> ratings) { this.ratings = ratings; } /////////////////////////////////////////////////////////////////////////// // Constructors /////////////////////////////////////////////////////////////////////////// public RubricCriterion(Rubric rubric) { setRubric(rubric); } /////////////////////////////////////////////////////////////////////////// // Helpers /////////////////////////////////////////////////////////////////////////// @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; RubricCriterion that = (RubricCriterion) o; if (id != null ? !id.equals(that.id) : that.id != null) return false; return true; } @Override public int hashCode() { return id != null ? id.hashCode() : 0; } /////////////////////////////////////////////////////////////////////////// // Helpers /////////////////////////////////////////////////////////////////////////// public RubricCriterionRating getGradedCriterionRating(){ for(RubricCriterionRating rating : ratings){ if(rating.isGrade()){ return rating; } } return null; } /** * Freeform rubric comments in canvas may contain RubricCriterionRatings not included in the assignment rubric. * @return true if the rubric assessment contains a rating for the provided rubric criterion */ public boolean containsRubricCriterionRating(String ratingId, List<RubricCriterionRating> criterionRatings){ for(RubricCriterionRating rating : criterionRatings){ if(rating.getId().equals(ratingId)){ return true; } } return false; } public void markGradeByPoints(double points){ for (RubricCriterionRating criterionRating : ratings) { if (criterionRating.getPoints() == points) { criterionRating.setGrade(true); }else{ criterionRating.setGrade(false); } } } public void handleComments(RubricCriterionRating rating){ if (rating.isComment() && !ratings.contains(rating)) { rating.setRatingDescription(rating.getComments()); ratings.add(rating); } } public void markGrade(RubricCriterionRating rating) { markGradeByPoints(rating.getPoints()); handleComments(rating); } public void markFreeformGrade(RubricCriterionRating rating, RubricCriterion criterion) { if(containsRubricCriterionRating(rating.getCriterionId(), criterion.getRatings())){ markGradeByPoints(rating.getPoints()); } else{ rating.setGrade(true); ratings.add(rating); } handleComments(rating); } public void markGrades(RubricAssessment rubricAssessment, List<RubricCriterion> criteria) { if (rubricAssessment == null) { return; } for (RubricCriterionRating rating : rubricAssessment.getRatings()) { for (RubricCriterion criterion : criteria) { if (criterion.getId().equals(rating.getCriterionId())) { criterion.markGrade(rating); break; } } } } public void markGrades(RubricAssessment rubricAssessment, List<RubricCriterion> criteria, boolean isFreeFormComment) { if (rubricAssessment == null) { return; } for (RubricCriterionRating rating : rubricAssessment.getRatings()) { for (RubricCriterion criterion : criteria) { if (criterion.getId().equals(rating.getCriterionId())) { if(isFreeFormComment){ criterion.markFreeformGrade(rating, criterion); } else{ criterion.markGrade(rating); } break; } } } } /////////////////////////////////////////////////////////////////////////// // Overrides /////////////////////////////////////////////////////////////////////////// @Override public int compareTo(RubricCriterion rubricCriterion) { return this.getId().compareTo(rubricCriterion.getId()); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.id); dest.writeParcelable(this.rubric, flags); dest.writeString(this.description); dest.writeString(this.long_description); dest.writeDouble(this.points); dest.writeList(ratings); } private RubricCriterion(Parcel in) { this.id = in.readString(); this.rubric = in.readParcelable(Rubric.class.getClassLoader()); this.description = in.readString(); this.long_description = in.readString(); this.points = in.readDouble(); in.readList(ratings, RubricCriterionRating.class.getClassLoader()); } public static Parcelable.Creator<RubricCriterion> CREATOR = new Parcelable.Creator<RubricCriterion>() { public RubricCriterion createFromParcel(Parcel source) { return new RubricCriterion(source); } public RubricCriterion[] newArray(int size) { return new RubricCriterion[size]; } }; }