/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/sam/trunk/samigo-services/src/java/org/sakaiproject/tool/assessment/business/entity/RecordingData.java $
* $Id: RecordingData.java 106463 2012-04-02 12:20:09Z david.horwitz@uct.ac.za $
***********************************************************************************
*
* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package org.sakaiproject.tool.assessment.business.entity;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.Serializable;
import java.util.StringTokenizer;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* <p>
* Copyright: Copyright (c) 2003
* </p>
*
* <p>
* Organization: Stanford University
* </p>
*
* <p>
* This class implements common methods for describing data needed to
* record/save and retrieve audio recordings.
* </p>
*
* <p>
* Usage : <code><br>
* <br>
* RecordingData rd = new RecordingData("Rachel Gollub", "rgollub", "Intro to
* Wolverines and Aardvarks 221B", "10", "25"); log.debug("rgollub
* file:" + rd.getFileName() + "." + rd.getFileExtension());
* log.debug("limit =" + rd.getLimit());
* log.debug("seconds=" + rd.getSeconds()); </code>
* </p>
*
* @author Ed Smiley
* @version $Id: RecordingData.java 106463 2012-04-02 12:20:09Z david.horwitz@uct.ac.za $
*/
public class RecordingData
implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 4398684269227144959L;
private static Log log = LogFactory.getLog(RecordingData.class);
//properties
private String agentName;
private String agentId;
private String courseAssignmentContext;
private String fileExtension;
private String fileName;
private String limit;
private String dir;
private String seconds;
private String appName;
private String imageURL;
/**
* Initialize with required data. All other values are assigned a default.
* All values can be overridden with the mutators.
*
* @param agent_name The name of the person uploading the file
* @param agent_id The id code of the person uploading the file
* @param course_assignment_context The name of the course, assignment, part,
* quetion etc.
* @param lim limit on number of tries (0=unlimited, default if null)
* @param sec limit on time in seconds (30 default if null)
*
* <p>
* Usage : <code><br>
* <br>
* RecordingData rd = new RecordingData("Rachel Gollub", "rgollub", "Intro to
* Wolverines and Aardvarks 221B", "10", "25"); log.debug("rgollub
* file:" + rd.getFileName() + "." + rd.getFileExtension());
* log.debug("limit =" + rd.getLimit());
* log.debug("seconds=" + rd.getSeconds()); </code>
* </p>
*/
public RecordingData(
String agent_name, String agent_id, String course_assignment_context,
String lim, String sec)
{
agentName = "" + agent_name;
agentId = "" + agent_id;
courseAssignmentContext = "" + course_assignment_context;
// quotation marks can interfere with dynamic JavaScript for WYSIWYG
courseAssignmentContext = cleanOutQuotes(courseAssignmentContext);
limit = lim;
seconds = sec;
initDefaults();
}
/**
* Usage: for parameters that might show up quoted in dynamic Javascript
* @param s raw string
* @return string with no quotes
*/
private String cleanOutQuotes(String s)
{
StringTokenizer st = new StringTokenizer(s, "\"'");
StringBuilder cleanSbuf = new StringBuilder();
while (st.hasMoreTokens()){
cleanSbuf.append(st.nextToken());
}
String cleanS = cleanSbuf.toString();
return cleanS;
}
/**
* Private helper for constructor, sets defaults.
*/
private void initDefaults()
{
fileExtension = "au";
fileName = FileNamer.make(agentName, agentId, courseAssignmentContext);
if(limit == null)
{
limit = "0";
}
if(seconds == null)
{
seconds = "30";
}
// just to be good, we make this OS independent so you can run on Windoze
// also you can change via setDir()
// @todo: determine what is the best default target directory to use
// for file system uploads
if("/".equals(File.separator))
{
dir = "/tmp";
}
else
{
dir = "c:\\tmp";
}
appName = "Audio Recording";
//
// we will probably want to migrate these images to the
// main image directory, the current directory is an artifact of
// Stanford/Indiana code merge
imageURL = "/samigo-app/jsp/aam/images/"; }
/**
* Accessor for agent (creator) name.
*
* @return agent (creator) name.
*/
public String getAgentName()
{
return agentName;
}
/**
* Accessor for agent (creator) id.
*
* @return agent (creator) id.
*/
public String getAgentId()
{
return agentId;
}
/**
* Accessor for free form text describing creation context.
* See Usage notes.
*
* @return free form text describing creation context.
*/
public String getCourseAssignmentContext()
{
return courseAssignmentContext;
}
/**
* Accessor for standard audio filename extension.
*
* @return standard audio file extension.
*/
public String getFileExtension()
{
return fileExtension;
}
/**
* Accessor for standard audio filename.
*
* @return standard audio file name.
*/
public String getFileName()
{
return fileName;
}
/**
* Accessor for retry limit.
* If the number of retries are unlimited, this is 0.
*
* @return retry limit
*/
public String getLimit()
{
return limit;
}
/**
* Get target file system directory for audio uploads.
*
* @return file system directory for audio uploads.
*/
public String getDir()
{
return dir;
}
/**
* Accessor for maximum number of seconds for recording.
*
* @return maximum number of seconds for recording.
*/
public String getSeconds()
{
return seconds;
}
/**
* Accessor for the user-facing application name for recording applet.
*
* @return user-facing application name for recording applet.
*/
public String getAppName()
{
return appName;
}
/**
* Accessor for the image URL for recording widget images.
*
* @return image URL for recording widget images.
*/
public String getImageURL()
{
return imageURL;
}
/**
* Mutator for recording agent.
*
* @param s recording agent
*/
public void setAgentName(String s)
{
agentName = s;
}
/**
* Mutator for recording agent id.
*
* @param s recording agent id.
*/
public void setAgentId(String s)
{
agentId = s;
}
/**
* Mutator for recording context string.
* See: Usage
*
* @param s recording context string.
*/
public void setCourseAssignmentContext(String s)
{
courseAssignmentContext = s;
}
/**
* Mutator for file extension.
*
* @param s audio recording file extension.
*/
public void setFileExtension(String s)
{
fileExtension = s;
}
/**
* Mutator for file name.
*
* @param s audio recording file name.
*/
public void setFileName(String s)
{
fileName = s;
}
/**
* Mutator for retry limit.
*
* @param s audio recording retry limit.
*/
public void setLimit(String s)
{
limit = s;
}
/**
* DOCUMENTATION PENDING
*
* @param s DOCUMENTATION PENDING
*/
public void setDir(String s)
{
dir = s;
}
/**
* Mutator for seconds limit.
*
* @param s audio recording seconds limit.
*/
public void setSeconds(String s)
{
seconds = s;
}
/**
* Mutator for the user-facing application name for recording applet.
*
* @param s user-facing application name for recording applet.
*/
public void setAppName(String s)
{
appName = s;
}
/**
* Mutator for widget images directory.
*
* @param s widget images directory.
*/
public void setImageURL(String s)
{
imageURL = s;
}
/**
* This takes a RecordingData object and puts it in XML.
* @return the XML as an org.w3c.dom.Document
*/
public Document getXMLDataModel()
{
Document document = null;
DocumentBuilderFactory builderFactory =
DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
try
{
DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
document = documentBuilder.newDocument();
}
catch(ParserConfigurationException e)
{
log.error(e.getMessage(), e);
}
if (document == null) {
log.error("document is null");
return null;
}
//add audio setup data to XML document
//root
Element recordingData = document.createElement("RecordingData");
//sub elements
Element agentName = document.createElement("AgentName");
Element agentId = document.createElement("AgentId");
Element courseAssignmentContext = document.createElement("CourseAssignmentContext");
Element fileExtension = document.createElement("FileExtension");
Element fileName = document.createElement("FileName");
Element limit = document.createElement("Limit");
Element dir = document.createElement("Dir");
Element seconds = document.createElement("Seconds");
Element appName = document.createElement("AppName");
Element imageURL = document.createElement("ImageURL");
agentName.appendChild(document.createTextNode(this.getAgentName()));
agentId.appendChild(document.createTextNode(this.getAgentId()));
courseAssignmentContext.appendChild(
document.createTextNode(this.getCourseAssignmentContext()));
fileExtension.appendChild(document.createTextNode(this.getFileExtension()));
fileName.appendChild(document.createTextNode(this.getFileName()));
limit.appendChild(document.createTextNode(this.getLimit()));
dir.appendChild(document.createTextNode(this.getDir()));
seconds.appendChild(document.createTextNode(this.getSeconds()));
appName.appendChild(document.createTextNode(this.getAppName()));
imageURL.appendChild(document.createTextNode(this.getImageURL()));
recordingData.appendChild(agentName);
recordingData.appendChild(agentId);
recordingData.appendChild(courseAssignmentContext);
recordingData.appendChild(fileExtension);
recordingData.appendChild(fileName);
recordingData.appendChild(limit);
recordingData.appendChild(dir);
recordingData.appendChild(seconds);
recordingData.appendChild(appName);
recordingData.appendChild(imageURL);
document.appendChild(recordingData);
// return the recording data available in XML
return document;
}
/**
* unit test for use with jUnit etc. this only tests the file name
* computation, the other methods are pretty trivial
*
* @param none
* @return none
*/
public static void unitTest()
{
RecordingData rd =
new RecordingData(
"Ed Smiley", "esmiley", "Intro to Wombats 101", "10", "30");
log.debug(
"esmiley file:" + rd.getFileName() + "." + rd.getFileExtension());
log.debug("limit =" + rd.getLimit());
log.debug("seconds=" + rd.getSeconds());
rd =
new RecordingData(
"Rachel Gollub", "rgollub", "Rachel's Intro to Wolverines and Aardvarks 221B",
"10", "25");
log.debug(
"rgollub file:" + rd.getFileName() + "." + rd.getFileExtension());
log.debug("limit =" + rd.getLimit());
log.debug("seconds=" + rd.getSeconds());
rd =
new RecordingData(
"Rachel Gollub", "rgollub", "Intro to Wolverines and Aardvarks 221B",
"10", "25");
log.debug(
"rgollub file:" + rd.getFileName() + "." + rd.getFileExtension());
log.debug("limit =" + rd.getLimit());
log.debug("seconds=" + rd.getSeconds());
ByteArrayOutputStream out = new ByteArrayOutputStream();
Source xmlSource = new DOMSource(rd.getXMLDataModel());
Result outputTarget = new StreamResult(out);
Transformer tf;
try {
tf = TransformerFactory.newInstance().newTransformer();
tf.transform(xmlSource, outputTarget);
} catch (TransformerException e) {
log.debug("cannot serialize"+e);
}
rd = new RecordingData(null, null, null, null, null);
log.debug(
"NULL file: " + rd.getFileName() + "." + rd.getFileExtension());
log.debug("limit =" + rd.getLimit());
log.debug("seconds=" + rd.getSeconds());
rd = new RecordingData(null, null, null, null, null);
log.debug(
"NULL file: " + rd.getFileName() + "." + rd.getFileExtension());
log.debug("limit =" + rd.getLimit());
log.debug("seconds=" + rd.getSeconds());
}
/**
* hook for unit test
*
* @param args not used
*/
public static void main(String[] args)
{
unitTest();
}
}