Index: lams_central/conf/xdoclet/servlet-mappings.xml =================================================================== RCS file: /usr/local/cvsroot/lams_central/conf/xdoclet/servlet-mappings.xml,v diff -u -r1.15 -r1.16 --- lams_central/conf/xdoclet/servlet-mappings.xml 18 Feb 2010 05:42:17 -0000 1.15 +++ lams_central/conf/xdoclet/servlet-mappings.xml 5 May 2011 15:23:39 -0000 1.16 @@ -34,6 +34,11 @@ + LearningDesignSVG + /services/LearningDesignSVG/* + + + LessonManager /services/xml/LessonManager/* Index: lams_central/conf/xdoclet/servlets.xml =================================================================== RCS file: /usr/local/cvsroot/lams_central/conf/xdoclet/servlets.xml,v diff -u -r1.18 -r1.19 --- lams_central/conf/xdoclet/servlets.xml 18 Feb 2010 05:42:17 -0000 1.18 +++ lams_central/conf/xdoclet/servlets.xml 5 May 2011 15:23:39 -0000 1.19 @@ -70,6 +70,14 @@ + LearningDesignSVG + + + org.lamsfoundation.lams.webservice.LearningDesignSVGServlet + + + + LessonManager Index: lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java,v diff -u -r1.32 -r1.33 --- lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java 12 Feb 2011 18:38:49 -0000 1.32 +++ lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java 5 May 2011 15:23:39 -0000 1.33 @@ -56,6 +56,8 @@ public static final String PARAM_LANG = "lang"; public static final String PARAM_METHOD = "method"; + + public static final String PARAM_SVG_FORMAT = "svgFormat"; public static final String PARAM_PROGRESS_USER = "progressUser"; Fisheye: Tag 1.1 refers to a dead (removed) revision in file `lams_central/src/java/org/lamsfoundation/lams/webservice/LearningDesignSVGServlet.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java,v diff -u -r1.109 -r1.110 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java 13 Feb 2011 23:45:23 -0000 1.109 +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java 5 May 2011 15:23:47 -0000 1.110 @@ -666,16 +666,14 @@ //generate SVG image if (format != ExportToolContentService.PACKAGE_FORMAT_IMS) { - SVGGenerator svgGenerator = new SVGGenerator(); - svgGenerator.generateSvgDom(ldDto); String svgFileName = FileUtil.getFullPath(contentDir, ExportToolContentService.SVG_IMAGE_FILE_NAME); FileOutputStream svgOutputStream = new FileOutputStream(svgFileName); - svgGenerator.streamOutDocument(svgOutputStream, SVGGenerator.OUTPUT_FORMAT_SVG); + service.getLearningDesignSVG(learningDesignId, SVGGenerator.OUTPUT_FORMAT_SVG, svgOutputStream); String pngFileName = FileUtil.getFullPath(contentDir, ExportToolContentService.PNG_IMAGE_FILE_NAME); FileOutputStream pngOutputStream = new FileOutputStream(pngFileName); - svgGenerator.streamOutDocument(pngOutputStream, SVGGenerator.OUTPUT_FORMAT_PNG); + service.getLearningDesignSVG(learningDesignId, SVGGenerator.OUTPUT_FORMAT_PNG, pngOutputStream); } log.debug("Learning design xml export success"); Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ILearningDesignService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ILearningDesignService.java,v diff -u -r1.10 -r1.11 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ILearningDesignService.java 11 Feb 2008 04:21:14 -0000 1.10 +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ILearningDesignService.java 5 May 2011 15:23:47 -0000 1.11 @@ -24,9 +24,12 @@ package org.lamsfoundation.lams.learningdesign.service; import java.io.IOException; +import java.io.OutputStream; import java.util.ArrayList; import java.util.Vector; +import org.apache.batik.transcoder.TranscoderException; +import org.jdom.JDOMException; import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.learningdesign.dto.LearningDesignDTO; import org.lamsfoundation.lams.learningdesign.dto.LearningLibraryDTO; @@ -76,4 +79,17 @@ */ public void setValid(Long learningLibraryId, boolean valid); + /** + * Streams out learning design SVG into specified OutputStream. Additionally, stores resulted SVG into file system for caching. + * + * @param learningDesignId + * @param imageFormat either SVGGenerator.OUTPUT_FORMAT_SVG or SVGGenerator.OUTPUT_FORMAT_PNG + * @param out + * @return whether operation was successful or not + * @throws JDOMException + * @throws IOException + * @throws TranscoderException + * @throws ExportToolContentException + */ + boolean getLearningDesignSVG(Long learningDesignId, int imageFormat, OutputStream out) throws JDOMException, IOException, TranscoderException, ExportToolContentException; } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java,v diff -u -r1.20 -r1.21 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java 19 Sep 2008 05:47:52 -0000 1.20 +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java 5 May 2011 15:23:47 -0000 1.21 @@ -23,24 +23,28 @@ /* $$Id$$ */ package org.lamsfoundation.lams.learningdesign.service; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.util.ArrayList; import java.util.Collection; +import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Locale; -import java.util.Set; import java.util.Vector; +import org.apache.batik.transcoder.TranscoderException; +import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; +import org.jdom.JDOMException; import org.lamsfoundation.lams.learningdesign.Activity; -import org.lamsfoundation.lams.learningdesign.Grouping; -import org.lamsfoundation.lams.learningdesign.GroupingActivity; import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.learningdesign.LearningLibrary; -import org.lamsfoundation.lams.learningdesign.OptionsActivity; -import org.lamsfoundation.lams.learningdesign.RandomGrouping; -import org.lamsfoundation.lams.learningdesign.Transition; import org.lamsfoundation.lams.learningdesign.dao.hibernate.ActivityDAO; import org.lamsfoundation.lams.learningdesign.dao.hibernate.GroupingDAO; import org.lamsfoundation.lams.learningdesign.dao.hibernate.LearningDesignDAO; @@ -50,8 +54,12 @@ import org.lamsfoundation.lams.learningdesign.dto.LibraryActivityDTO; import org.lamsfoundation.lams.learningdesign.dto.ValidationErrorDTO; import org.lamsfoundation.lams.tool.Tool; +import org.lamsfoundation.lams.util.Configuration; +import org.lamsfoundation.lams.util.ConfigurationKeys; +import org.lamsfoundation.lams.util.FileUtil; import org.lamsfoundation.lams.util.ILoadedMessageSourceService; import org.lamsfoundation.lams.util.MessageService; +import org.lamsfoundation.lams.util.svg.SVGGenerator; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; @@ -189,7 +197,68 @@ } return libraries; } + + public boolean getLearningDesignSVG(Long learningDesignId, int imageFormat, OutputStream out) throws JDOMException, IOException, TranscoderException, ExportToolContentException { + //construct absolute filePath to SVG + String earFolder = Configuration.get(ConfigurationKeys.LAMS_EAR_DIR); + if (StringUtils.isBlank(earFolder)) { + log.error("Unable to get path to the LAMS Server URL from the configuration table. SVG image creation failed"); + return false; + } + String directoryToStoreFile = FileUtil.getFullPath(earFolder, "lams-www.war\\secure\\learning-design-images"); + String fileExtension; + if (imageFormat == SVGGenerator.OUTPUT_FORMAT_SVG) { + fileExtension = ".svg"; + } else { + fileExtension = ".png"; + } + String absoluteFilePath = FileUtil.getFullPath(directoryToStoreFile, learningDesignId.toString() + fileExtension); + File file = new File(absoluteFilePath); + + //check if SVG exists and up-to-date + LearningDesign learningDesign = learningDesignDAO.getLearningDesignById(learningDesignId); + boolean isSvgOutdated = new Date(file.lastModified()).before(learningDesign.getLastModifiedDateTime()); + if (!file.exists() || isSvgOutdated) { + //generate new SVG image and save it to the file system + SVGGenerator svgGenerator = new SVGGenerator(); + LearningDesignDTO ldDto = this.getLearningDesignDTO(learningDesignId, ""); + svgGenerator.generateSvgDom(ldDto); + FileOutputStream fileOutputStream = new FileOutputStream(file); + svgGenerator.streamOutDocument(fileOutputStream, imageFormat); + } + + //stream out SVG to the specified by user OutputStream + InputStream in = null; + try { + in = new BufferedInputStream(new FileInputStream(file)); + int count = 0; + int ch; + while ((ch = in.read()) != -1) { + out.write((char) ch); + count++; + } + out.flush(); + } catch (Exception e) { + log.error("Exception occured writing out file:" + e.getMessage()); + throw new ExportToolContentException(e); + } finally { + try { + if (in != null) { + in.close(); // very important + } + if (out != null) { + out.close(); + } + } catch (Exception e) { + log.error("Error Closing file. File already written out - no exception being thrown.", e); + return false; + } + } + + return true; + } + private void internationaliseActivities(Collection activities) { Iterator iter = activities.iterator(); Locale locale = LocaleContextHolder.getLocale();