Index: lams_central/conf/xdoclet/servlet-mappings.xml =================================================================== RCS file: /usr/local/cvsroot/lams_central/conf/xdoclet/servlet-mappings.xml,v diff -u -r1.14 -r1.14.10.1 --- lams_central/conf/xdoclet/servlet-mappings.xml 16 Oct 2008 06:08:50 -0000 1.14 +++ lams_central/conf/xdoclet/servlet-mappings.xml 3 May 2011 21:27:17 -0000 1.14.10.1 @@ -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.16 -r1.16.10.1 --- lams_central/conf/xdoclet/servlets.xml 16 Oct 2008 06:08:50 -0000 1.16 +++ lams_central/conf/xdoclet/servlets.xml 3 May 2011 21:27:17 -0000 1.16.10.1 @@ -70,6 +70,14 @@ + LearningDesignSVG + LearningDesignSVG Servlet + + org.lamsfoundation.lams.webservice.LearningDesignSVGServlet + + + + LessonManager LessonManager Servlet 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.27 -r1.27.6.1 --- lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java 27 Mar 2009 18:26:12 -0000 1.27 +++ lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java 3 May 2011 21:27:17 -0000 1.27.6.1 @@ -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.101.2.1.4.2 -r1.101.2.1.4.3 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java 14 Sep 2010 12:35:04 -0000 1.101.2.1.4.2 +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java 3 May 2011 21:27:14 -0000 1.101.2.1.4.3 @@ -664,16 +664,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); + FileOutputStream pngOutputStream = new FileOutputStream(pngFileName); + 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.10.10.1 --- 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 3 May 2011 21:27:14 -0000 1.10.10.1 @@ -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.20.10.1 --- 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 3 May 2011 21:27:14 -0000 1.20.10.1 @@ -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; @@ -170,6 +178,7 @@ //only return valid learning library return getAllLearningLibraryDetails(true, languageCode); } + public ArrayList getAllLearningLibraryDetails(boolean valid, String languageCode)throws IOException{ Iterator iterator= learningLibraryDAO.getAllLearningLibraries(valid).iterator(); ArrayList libraries = new ArrayList(); @@ -189,7 +198,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();