/*==========================================================================*\ | $Id: MeasuresPage.java,v 1.1 2010/05/11 14:51:50 aallowat Exp $ |*-------------------------------------------------------------------------*| | Copyright (C) 2009 Virginia Tech | | This file is part of Web-CAT. | | Web-CAT is free software; you can redistribute it and/or modify | it under the terms of the GNU Affero General Public License as published | by the Free Software Foundation; either version 3 of the License, or | (at your option) any later version. | | Web-CAT is distributed in the hope that it will be useful, | but WITHOUT ANY WARRANTY; without even the implied warranty of | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | GNU General Public License for more details. | | You should have received a copy of the GNU Affero General Public License | along with Web-CAT; if not, see <http://www.gnu.org/licenses/>. \*==========================================================================*/ package org.webcat.outcomesmeasurement; import org.apache.log4j.Logger; import com.webobjects.appserver.*; import com.webobjects.foundation.NSArray; import com.webobjects.foundation.NSDictionary; import com.webobjects.foundation.NSMutableArray; import com.webobjects.foundation.NSTimestamp; import org.webcat.core.*; //------------------------------------------------------------------------- /** * An entry form for all of the assessment measures associated with a * given course offering. * * @author Stephen Edwards * @author Last changed by $Author: aallowat $ * @version $Revision: 1.1 $, $Date: 2010/05/11 14:51:50 $ */ public class MeasuresPage extends WCComponent { //~ Constructors .......................................................... // ---------------------------------------------------------- /** * Creates a new object. * * @param context The context to use */ public MeasuresPage(WOContext context) { super(context); } //~ KVC Attributes (must be public) ....................................... public CourseOffering offering; public User thisUser; public NSMutableArray<MeasureOfOffering> measures; public MeasureOfOffering aMeasure; public int index; public OutcomePair pair; //~ Methods ............................................................... // ---------------------------------------------------------- public void appendToResponse(WOResponse response, WOContext context) { if (measures == null) { // log.debug("offering = " + offering); // NSArray<Measure> targets = Measure.allObjects(localContext()); // if (log.isDebugEnabled()) // { // for (Measure m : targets) // { // log.debug("measure " + m.id() + ": " + m.description()); // String pairs = " pairs:"; // for (OutcomePair pair : m.outcomePairs()) // { // pairs += " " + pair.programOutcome().microLabel() // + "-" + pair.externalOutcome().microLabel(); // } // log.debug(pairs); // // String courses = " courses:"; // for (Course c : m.courses()) // { // courses += " " + c; // } // log.debug(courses); // } // } NSArray<Measure> targets = Measure.objectsMatchingQualifier( localContext(), Measure.courses.is(offering.course()), Measure.outcomePairs.dot(OutcomePair.programOutcome) .dot(ProgramOutcome.microLabel).ascs()); measures = new NSMutableArray<MeasureOfOffering>(targets.count()); NSArray<MeasureOfOffering> taken = MeasureOfOffering.objectsMatchingQualifier(localContext(), MeasureOfOffering.courseOffering.is(offering) .and(MeasureOfOffering.measure.in(targets))); for (Measure m : targets) { boolean needToCreate = true; // First, check to see if there is an existing in taken for (MeasureOfOffering mo : taken) { if (mo.measure() == m) { log.debug("found existing instance for measure " + m.keyPhrase()); measures.add(mo); needToCreate = false; break; } } if (needToCreate) { log.debug("no existing instance found for measure " + m.keyPhrase()); MeasureOfOffering mo = MeasureOfOffering.create(localContext()); mo.setMeasureRelationship(m); mo.setCourseOfferingRelationship(offering); applyLocalChanges(); measures.add(mo); log.debug("created " + mo + " for measure " + m.keyPhrase()); } } log.debug("targets for this offering = " + targets); } super.appendToResponse(response, context); } // ---------------------------------------------------------- public boolean applyLocalChanges() { for (MeasureOfOffering mo : measures) { NSDictionary<String, Object> changes = mo.changedProperties(); if (changes.count() > 0) { MeasureChange changeLog = MeasureChange.create( localContext(), new NSTimestamp(), false, null, thisUser); changeLog.changes().addEntriesFromDictionary(changes); changeLog.setMeasureOfOfferingRelationship(mo); if (log.isDebugEnabled()) { log.debug("Recording changes to measure " + mo.measure().keyPhrase() + " by " + thisUser + ": " + changes); } } } return super.applyLocalChanges(); } // ---------------------------------------------------------- public String excellentCriteria() { String value = aMeasure.excellentCriteria(); return value == null ? EXCELLENT_CRITERIA : value; } // ---------------------------------------------------------- public void setExcellentCriteria(String value) { if (value != null) { value = value.trim(); } if (EXCELLENT_CRITERIA.equals(value)) { value = null; } aMeasure.setExcellentCriteria(value); } // ---------------------------------------------------------- public String adequateCriteria() { String value = aMeasure.adequateCriteria(); return value == null ? ADEQUATE_CRITERIA : value; } // ---------------------------------------------------------- public void setAdequateCriteria(String value) { if (value != null) { value = value.trim(); } if (ADEQUATE_CRITERIA.equals(value)) { value = null; } aMeasure.setAdequateCriteria(value); } // ---------------------------------------------------------- public String unsatisfactoryCriteria() { String value = aMeasure.unsatisfactoryCriteria(); return value == null ? UNSATISFACTORY_CRITERIA : value; } // ---------------------------------------------------------- public void setUnsatisfactoryCriteria(String value) { if (value != null) { value = value.trim(); } if (UNSATISFACTORY_CRITERIA.equals(value)) { value = null; } aMeasure.setUnsatisfactoryCriteria(value); } // ---------------------------------------------------------- public String pageTitle() { return "Outcomes Measures for " + offering.compactName(); } // ---------------------------------------------------------- public String measureTitle() { return (index + 1) + ": " + aMeasure.measure().keyPhrase(); } //~ Instance/static variables ............................................. private static final String EXCELLENT_CRITERIA = ">= 90%"; private static final String ADEQUATE_CRITERIA = ">= 60%"; private static final String UNSATISFACTORY_CRITERIA = "< 60%"; static Logger log = Logger.getLogger(MeasuresPage.class); }