Index: openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMIInteractions.java =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMIInteractions.java,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMIInteractions.java 9 Jul 2007 08:51:22 -0000 1.1.2.1 @@ -0,0 +1,422 @@ +/******************************************************************************* +** +** Filename: CMIInteractions.java +** +** File Description: The CMIInteractions class manages all of the Interaction +** CMI Data Model elements +** Author: ADLI Project +** +** Company Name: Concurrent Technologies Corporation +** +** Module/Package Name: org.adl.datamodel.cmi +** Module/Package Description: Collection of CMI Data Model objects +** +** Design Issues: +** In order to use Reflection (Java Feature) the defined Java +** coding standards are NOT being followed. Reflection requires +** field names to match identically to input parameter. The +** attribute names match what is expected from a LMSGetValue() +** or LMSSetValue() request. Also the attribute values are declared +** as public scope in order to use reflection. +** +** Implementation Issues: +** Known Problems: +** Side Effects: +** +** References: AICC CMI Data Model +** +******************************************************************************* +** +** Concurrent Technologies Corporation (CTC) grants you ("Licensee") a non- +** exclusive, royalty free, license to use, modify and redistribute this +** software in source and binary code form, provided that i) this copyright +** notice and license appear on all copies of the software; and ii) Licensee +** does not utilize the software in a manner which is disparaging to CTC. +** +** This software is provided "AS IS," without a warranty of any kind. ALL +** EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY +** IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON- +** INFRINGEMENT, ARE HEREBY EXCLUDED. CTC AND ITS LICENSORS SHALL NOT BE LIABLE +** FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR +** DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL CTC OR ITS +** LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, +** INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER +** CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF +** OR INABILITY TO USE SOFTWARE, EVEN IF CTC HAS BEEN ADVISED OF THE POSSIBILITY +** OF SUCH DAMAGES. +** +******************************************************************************* +** +** Date Changed Author of Change Reason for Changes +** ------------ ---------------- ------------------------------------------- +** 09/28/2000 ADLI Project PT116 : The method "getChildren()" was +** changed to return "correct_responses" +** instead of "response". +** +** 11/15/2000 S. Thropp PT 292: Change the error code in +** performGet() to be a 404 element is write +** only. +** +** 01/17/2001 S. Thropp PT374: Added more debug statments. +** Removed all references to hardcoded arrays +** and changed code to use Vectors. +** +** 05/15/2002 B. Capone PT1976: Modified SetCurrentErrorCode for +** ArrayIndexOutOfBoundsException from 405 to +** 201 in the function performSet(). +** +*******************************************************************************/ +package org.adl.datamodels.cmi; + +//native java imports +import java.io.*; +import java.util.*; + +//adl imports +import org.adl.util.debug.*; +import org.adl.datamodels.*; + +public class CMIInteractions extends CMICategory + implements Serializable +{ + // A recognized and recordable input or group of inputs from the + // student to the computer + public Vector interactions; + + /**************************************************************************** + ** + ** Method: CMIInteractions + ** Input: none + ** Output: none + ** + ** Description: Default constructor + ** + ** + ***************************************************************************/ + public CMIInteractions() + { + super( false ); + interactions = new Vector(); + + } // end of default constructor + + + /************************************************************************ + ** Accessers to the CMIInteraction Data. SCOs should not invoke these + ** methods. SCOs should call LMSGetValue() + ************************************************************************/ + public Vector getInteractions() + { + return interactions; + } + + /************************************************************************ + ** Modifiers to the CMIInteraction Data. SCOs should not invoke these + ** methods. SCOs should call LMSSetValue(). + ************************************************************************/ + public void setInteractions(CMIInteractionData inInteractions, + int index) + { + interactions.add(index,inInteractions); + + } // end of setInteractions() + + + /**************************************************************************** + ** + ** Method: getChildren + ** Input: none + ** Output: String representation of the elements of the CMI Interactions + ** category + ** + ** Description: + ** This method returns a String containing the list of data elements that + ** CMI Score data object contains. + ** + ***************************************************************************/ + public String getChildren() + { + String children = + "id,objectives,time,type,correct_responses,weighting," + + "student_response,result,latency"; + + return children; + } // end of getChildren() + + /************************************************************************** + ** + ** Method: performSet + ** Input: CMIRequest theRequest - tokenized LMSSetValue() request. + ** DMErrorManager dmErroMgr - Error manager + ** Output: none + ** + ** Description: This method performs all the necessary steps for an + ** LMSSetValue() request. + ** + ***************************************************************************/ + public void performSet(CMIRequest theRequest, + DMErrorManager dmErrorMgr) + { + if ( DebugIndicator.ON ) + { + System.out.println("\tIn CMIInteractions::performSet()"); + } + + // Get the next token off of the request + String token = theRequest.getNextToken(); + + if ( DebugIndicator.ON ) + { + System.out.println("\tToken being processed: " + token); + } + + if ( theRequest.isAKeywordRequest() ) + { + // record a keyword error + dmErrorMgr.recKeyWordError(token); + } + else + { + // The next token must be an array. If not throw + // an exception for this request. + int index = -1; + + // Check to see if next token is an array index. For + // a LMSSetValue() this is true + try + { + // Try to convert the token to the index + Integer tmpInt = new Integer(token); + index = tmpInt.intValue(); + + // Get the Interaction Data at position of the index + CMIInteractionData tmpInteraction = + (CMIInteractionData)interactions.elementAt(index); + + // An interaction existed at the given index. + // Invoke the performSet() on the Interaction Data + tmpInteraction.performSet(theRequest,dmErrorMgr); + + // replace the old Interaction Data with the newly set + // Interaction + interactions.set(index,tmpInteraction); + } + catch ( NumberFormatException nfe ) + { + if ( DebugIndicator.ON ) + { + // Invalid parameter passed to LMSSetValue() + System.out.println( + "\tError - Data Model Element not implemented"); + System.out.println("\tInvalid data model element: " + + theRequest.getRequest() + + " passed to LMSSetValue()"); + } + // Notify error manager + dmErrorMgr.recNotImplementedError(theRequest); + } + catch ( ArrayIndexOutOfBoundsException e) + { + if ( DebugIndicator.ON ) + { + System.out.println( + "\tFirst time setting the interaction data at the given index"); + } + + if ( index <= interactions.size() ) + { + // Create a new Interaction Data object + CMIInteractionData intData = new CMIInteractionData(); + + // Invoke the performSet() on the Interaction Data + intData.performSet(theRequest,dmErrorMgr); + + // Place the Interaction Data into the vector at the index position + interactions.add(index,intData); + } + else + { + dmErrorMgr.SetCurrentErrorCode("201"); + } + } + } + + // Done processing. Let the CMIRequest object know that processing + // of the LMSSetValue() is complete + theRequest.done(); + + if ( DebugIndicator.ON ) + { + System.out.println("\tCMIInteractions - performSet() exit"); + } + + return; + } // end of performSet + + + /**************************************************************************** + ** + ** Method: performGet + ** Input: CMIRequest theRequest - tokenized LMSSetValue() request + ** DMErrorManager dmErrorMgr - Error manager + ** + ** Output: String - empty + ** + ** Description: The LMSGetValue() request is not allowed to be invoked + ** by an SCO. Notify the operator + ** + ***************************************************************************/ + public String performGet(CMIRequest theRequest, + DMErrorManager dmErrorMgr) + { + String result = new String(""); + int tokenCount = theRequest.getTotalNumTokens(); + + if ( DebugIndicator.ON ) + { + System.out.println("\tCMIInteractions::performGet()"); + } + + // Determine the type of request and process accordingly + if ( ( tokenCount == 3 ) && + ( theRequest.isAChildrenRequest() ) ) + { + if ( DebugIndicator.ON ) + { + System.out.println("\tProcessing a _children request"); + } + + result = getChildren(); + } + else if ( theRequest.isACountRequest() ) + { + if ( DebugIndicator.ON ) + { + System.out.println("\tProcessing a _count request"); + } + + // Determine the type of _count request + if (tokenCount == 3) + { + // _count request for CMIInteractions + int count = howManyInteractions(); + Integer tmpInt = new Integer(count); + result = tmpInt.toString(); + } + else + { + // _count request for CMIInteractionData + // Get the next token off of the request + String token = theRequest.getNextToken(); + + if ( DebugIndicator.ON ) + { + System.out.println("\tProcessing next token: " + token); + } + + try + { + Integer tmpInt = new Integer(token); + int index = tmpInt.intValue(); + + // Get the Objective Data that is positioned at the input index + CMIInteractionData intData = + (CMIInteractionData)interactions.elementAt(index); + + if ( intData.isInitialized() ) + { + result = intData.getCount(theRequest,dmErrorMgr); + } + else + { + String nextToken = theRequest.getNextToken(); + + if ( nextToken.equals("objectives") || + nextToken.equals("correct_responses") ) + { + result = "0"; + } + else + { + dmErrorMgr.recGetKeyWordError(theRequest.getElement()); + } + } + } + catch ( NumberFormatException nfe ) + { + if ( DebugIndicator.ON ) + { + // Invalid parameter passed + System.out.println("\tError - Invalid LMSGetValue() request"); + } + // Notify error manager + dmErrorMgr.recNotImplementedError(theRequest); + } + catch ( ArrayIndexOutOfBoundsException e) + { + String nextToken = theRequest.getNextToken(); + + if ( ( tokenCount == 5) && + ( ( nextToken.equals("objectives") || + nextToken.equals("correct_responses") ) ) ) + { + result = "0"; + } + else + { + dmErrorMgr.recGetKeyWordError(theRequest.getElement()); + result = ""; + } + } + + } + } + else + { + if ( DebugIndicator.ON ) + { + // Error -- SCO not allowed to call LMSGetValue on launch_data + System.out.println("\tInvalid LMSGetValue() request: " + + theRequest.getRequest()); + + System.out.println("\tSCO is not permitted to call" + + " LMSGetValue() for cmi.interactions"); + } + + dmErrorMgr.SetCurrentErrorCode("404"); + } + + if ( DebugIndicator.ON ) + { + System.out.println("\tReturning: " + result + " from CMIInteractions"); + System.out.println("\tCMIInteractions::performGet() exit"); + } + + // Done processing. Let CMIRequest object know the processing + // of the LMSGetValue() is done. + theRequest.done(); + + return result; + } + + /**************************************************************************** + ** + ** Method: howManyInteractions + ** Input: none + ** Output: int - number of interactions implemented + ** + ** Description: Calculates the number of interactions that have been + ** implemented. + ** + ***************************************************************************/ + private int howManyInteractions() + { + int count = 0; + + // must be asking for number of interactions + count = interactions.size(); + + return count; + } + +} // end of CMIInteractions