Index: lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LearningDesignRepositoryServlet.java
===================================================================
diff -u -rc2a96caab480d04c02dc7a90e719fc0bb9af6a50 -r1ed58a0c7e540a027d04adadde8eb5b2a5b623fa
--- lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LearningDesignRepositoryServlet.java (.../LearningDesignRepositoryServlet.java) (revision c2a96caab480d04c02dc7a90e719fc0bb9af6a50)
+++ lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LearningDesignRepositoryServlet.java (.../LearningDesignRepositoryServlet.java) (revision 1ed58a0c7e540a027d04adadde8eb5b2a5b623fa)
@@ -1,8 +1,14 @@
package org.lamsfoundation.lams.webservice.xml;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
+import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
@@ -28,10 +34,14 @@
import org.lamsfoundation.lams.integration.security.Authenticator;
import org.lamsfoundation.lams.integration.service.IntegrationService;
import org.lamsfoundation.lams.integration.util.LoginRequestDispatcher;
+import org.lamsfoundation.lams.learningdesign.service.ExportToolContentException;
+import org.lamsfoundation.lams.learningdesign.service.IExportToolContentService;
import org.lamsfoundation.lams.usermanagement.WorkspaceFolder;
import org.lamsfoundation.lams.usermanagement.exception.UserAccessDeniedException;
import org.lamsfoundation.lams.util.CentralConstants;
+import org.lamsfoundation.lams.util.FileUtil;
import org.lamsfoundation.lams.util.MessageService;
+import org.lamsfoundation.lams.util.WebUtil;
import org.lamsfoundation.lams.workspace.dto.FolderContentDTO;
import org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService;
import org.lamsfoundation.lams.workspace.web.WorkspaceAction;
@@ -41,337 +51,381 @@
public class LearningDesignRepositoryServlet extends HttpServlet {
- private static Logger log = Logger
- .getLogger(LearningDesignRepositoryServlet.class);
+ private static final long serialVersionUID = -4962711640290319063L;
- private static IntegrationService integrationService = null;
+ private static Logger log = Logger.getLogger(LearningDesignRepositoryServlet.class);
- private static IWorkspaceManagementService service = null;
+ private static IntegrationService integrationService = null;
- private static MessageService msgService = null;
+ private static IWorkspaceManagementService service = null;
- /**
- * Constructor of the object.
- */
- public LearningDesignRepositoryServlet() {
- super();
- }
+ private static MessageService msgService = null;
- /**
- * Destruction of the servlet.
- */
- public void destroy() {
- super.destroy(); // Just puts "destroy" string in log
- // Put your code here
- }
+ private static IExportToolContentService exportToolContentService = null;
- // TODO, this is common with the webservices class, we should move it from
- // here.
- private static class ContentTreeNode {
- FolderContentDTO content;
+ private static final String PARAM_LEARING_DESIGN_ID = "learningDesignID";
+ private static final String PARAM_EXPORT_FORMAT = "format";
+ private static final String IMS_XSLT_NAME = "learning-design-ims.xslt";
+ private static final String IMS_XSLT_PATH = "/toolcontent";
- List children;
+ /**
+ * Constructor of the object.
+ */
+ public LearningDesignRepositoryServlet() {
+ super();
+ }
- ContentTreeNode(FolderContentDTO content) {
- this.content = content;
- children = new LinkedList();
- }
+ /**
+ * Destruction of the servlet.
+ */
+ public void destroy() {
+ super.destroy(); // Just puts "destroy" string in log
+ // Put your code here
+ }
- List getChildren() {
- return children;
- }
+ // TODO, this is common with the webservices class, we should move it from
+ // here.
+ private static class ContentTreeNode {
+ FolderContentDTO content;
- void setChildren(List children) {
- this.children = children;
- }
+ List children;
- FolderContentDTO getContent() {
- return content;
- }
+ ContentTreeNode(FolderContentDTO content) {
+ this.content = content;
+ children = new LinkedList();
+ }
- void setContent(FolderContentDTO content) {
- this.content = content;
- }
+ List getChildren() {
+ return children;
+ }
- void addChild(FolderContentDTO content) {
- children.add(new ContentTreeNode(content));
- }
+ void setChildren(List children) {
+ this.children = children;
+ }
- void addChild(ContentTreeNode node) {
- children.add(node);
- }
+ FolderContentDTO getContent() {
+ return content;
+ }
- /**
- * the format should be something like this: [ ['My Workspace', null,
- * ['Mary Morgan Folder', null, ['3 activity sequence','1024'] ],
- * ['Organisations', null, ['Developers Playpen', null, ['Lesson
- * Sequence Folder', null, ['',null] ] ], ['MATH111', null, ['Lesson
- * Sequence Folder', null, ['',null] ] ] ] ] ]
- */
- public String toString() {
- // return '[' + convert() + ']';
+ void setContent(FolderContentDTO content) {
+ this.content = content;
+ }
- Document document = getDocument();
+ void addChild(FolderContentDTO content) {
+ children.add(new ContentTreeNode(content));
+ }
- try {
- DOMSource domSource = new DOMSource(document);
- StringWriter writer = new StringWriter();
- StreamResult result = new StreamResult(writer);
- TransformerFactory tf = TransformerFactory.newInstance();
- Transformer transformer = tf.newTransformer();
- transformer.transform(domSource, result);
- return writer.toString();
- } catch (TransformerException ex) {
- ex.printStackTrace();
- return null;
- }
- }
+ void addChild(ContentTreeNode node) {
+ children.add(node);
+ }
- String convert() {
- StringBuilder sb = new StringBuilder();
- if (content.getResourceType().equals(FolderContentDTO.FOLDER)) {
- sb.append("['");
- sb.append(content.getName()).append("',").append("null")
- .append(',');
- if (children.size() == 0) {
- sb.append("['',null]");
- } else {
- sb.append(children.get(0).convert());
- for (int i = 1; i < children.size(); i++) {
- sb.append(',').append(children.get(i).convert());
- }
- }
- sb.append(']');
- } else if (content.getResourceType()
- .equals(FolderContentDTO.DESIGN)) {
- sb.append('[');
- sb.append('\'').append(content.getName()).append('\'').append(
- ',').append('\'').append(content.getResourceID())
- .append('\'');
- sb.append(']');
- }
- return sb.toString();
- }
+ /**
+ * the format should be something like this: [ ['My Workspace', null,
+ * ['Mary Morgan Folder', null, ['3 activity sequence','1024'] ],
+ * ['Organisations', null, ['Developers Playpen', null, ['Lesson
+ * Sequence Folder', null, ['',null] ] ], ['MATH111', null, ['Lesson
+ * Sequence Folder', null, ['',null] ] ] ] ] ]
+ */
+ public String toString() {
+ // return '[' + convert() + ']';
- public Document getDocument() {
- try {
- DocumentBuilderFactory factory = DocumentBuilderFactory
- .newInstance();
- DocumentBuilder builder = factory.newDocumentBuilder();
- Document document = builder.newDocument();
+ Document document = getDocument();
- Element element = createXML(document);
+ try {
+ DOMSource domSource = new DOMSource(document);
+ StringWriter writer = new StringWriter();
+ StreamResult result = new StreamResult(writer);
+ TransformerFactory tf = TransformerFactory.newInstance();
+ Transformer transformer = tf.newTransformer();
+ transformer.transform(domSource, result);
+ return writer.toString();
+ } catch (TransformerException ex) {
+ ex.printStackTrace();
+ return null;
+ }
+ }
- document.appendChild(element); // TODO null values ??
+ String convert() {
+ StringBuilder sb = new StringBuilder();
+ if (content.getResourceType().equals(FolderContentDTO.FOLDER)) {
+ sb.append("['");
+ sb.append(content.getName()).append("',").append("null").append(',');
+ if (children.size() == 0) {
+ sb.append("['',null]");
+ } else {
+ sb.append(children.get(0).convert());
+ for (int i = 1; i < children.size(); i++) {
+ sb.append(',').append(children.get(i).convert());
+ }
+ }
+ sb.append(']');
+ } else if (content.getResourceType().equals(FolderContentDTO.DESIGN)) {
+ sb.append('[');
+ sb.append('\'').append(content.getName()).append('\'').append(',').append('\'').append(
+ content.getResourceID()).append('\'');
+ sb.append(']');
+ }
+ return sb.toString();
+ }
- return document;
+ public Document getDocument() {
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ Document document = builder.newDocument();
- } catch (Exception e) {
- e.printStackTrace();
- }
+ Element element = createXML(document);
- return null;
- }
+ document.appendChild(element); // TODO null values ??
- public Element createXML(Document document) {
- Element elem = null;
- if (content.getResourceType().equals(FolderContentDTO.FOLDER)) {
- elem = document.createElement(CentralConstants.ELEM_FOLDER);
- elem.setAttribute(CentralConstants.ATTR_NAME, content.getName());
+ return document;
- if (children.size() > 0) {
- for (int i = 0; i < children.size(); i++) {
- elem.appendChild(children.get(i).createXML(document));
- }
- }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
- } else if (content.getResourceType()
- .equals(FolderContentDTO.DESIGN)) {
- elem = document.createElement(CentralConstants.ELEM_LEARNING_DESIGN);
- elem.setAttribute(CentralConstants.ATTR_NAME, content.getName());
- elem.setAttribute(CentralConstants.ATTR_RESOURCE_ID, content.getResourceID()
- .toString());
- } else {
- // TODO ERROR shouldnt get here !!
- }
+ return null;
+ }
- return elem;
+ public Element createXML(Document document) {
+ Element elem = null;
+ if (content.getResourceType().equals(FolderContentDTO.FOLDER)) {
+ elem = document.createElement(CentralConstants.ELEM_FOLDER);
+ elem.setAttribute(CentralConstants.ATTR_NAME, content.getName());
+
+ if (children.size() > 0) {
+ for (int i = 0; i < children.size(); i++) {
+ elem.appendChild(children.get(i).createXML(document));
+ }
}
+
+ } else if (content.getResourceType().equals(FolderContentDTO.DESIGN)) {
+ elem = document.createElement(CentralConstants.ELEM_LEARNING_DESIGN);
+ elem.setAttribute(CentralConstants.ATTR_NAME, content.getName());
+ elem.setAttribute(CentralConstants.ATTR_RESOURCE_ID, content.getResourceID().toString());
+ } else {
+ // TODO ERROR shouldnt get here !!
+ }
+
+ return elem;
}
+ }
- private ContentTreeNode buildContentTree(Integer userId, Integer mode)
- throws IOException, UserAccessDeniedException,
- RepositoryCheckedException {
- log.debug("User Id - " + userId);
- FolderContentDTO rootFolder = new FolderContentDTO(msgService
- .getMessage("label.workspace.root_folder"), msgService
- .getMessage("folder"), null, null, FolderContentDTO.FOLDER,
- WorkspaceAction.BOOTSTRAP_FOLDER_ID.longValue(),
- WorkspaceFolder.READ_ACCESS, null);
- ContentTreeNode root = new ContentTreeNode(rootFolder);
- FolderContentDTO userFolder = service.getUserWorkspaceFolder(userId);
- root.addChild(buildContentTreeNode(userFolder, userId, mode));
- FolderContentDTO dummyOrgFolder = new FolderContentDTO(msgService
- .getMessage("organisations"), msgService.getMessage("folder"),
- null, null, FolderContentDTO.FOLDER, new Long(
- WorkspaceAction.ORG_FOLDER_ID.longValue()),
- WorkspaceFolder.READ_ACCESS, null);
- ContentTreeNode dummyOrgNode = new ContentTreeNode(dummyOrgFolder);
- // tried using service.getAccessibleOrganisationWorkspaceFolders(userId)
- // api,
- // but it doesn't work, the userOrganisations set of the user
- // got from workspaceManagementService with the userId supplied is
- // empty, which
- // is not true.
- Vector orgFolders = service
- .getAccessibleOrganisationWorkspaceFolders(userId);
- for (int i = 0; i < orgFolders.size(); i++) {
- FolderContentDTO orgFolder = (FolderContentDTO) orgFolders.get(i);
- dummyOrgNode
- .addChild(buildContentTreeNode(orgFolder, userId, mode));
- }
- root.addChild(dummyOrgNode);
- return root;
+ private ContentTreeNode buildContentTree(Integer userId, Integer mode) throws IOException,
+ UserAccessDeniedException, RepositoryCheckedException {
+ log.debug("User Id - " + userId);
+ FolderContentDTO rootFolder = new FolderContentDTO(msgService.getMessage("label.workspace.root_folder"),
+ msgService.getMessage("folder"), null, null, FolderContentDTO.FOLDER,
+ WorkspaceAction.BOOTSTRAP_FOLDER_ID.longValue(), WorkspaceFolder.READ_ACCESS, null);
+ ContentTreeNode root = new ContentTreeNode(rootFolder);
+ FolderContentDTO userFolder = service.getUserWorkspaceFolder(userId);
+ root.addChild(buildContentTreeNode(userFolder, userId, mode));
+ FolderContentDTO dummyOrgFolder = new FolderContentDTO(msgService.getMessage("organisations"), msgService
+ .getMessage("folder"), null, null, FolderContentDTO.FOLDER, new Long(WorkspaceAction.ORG_FOLDER_ID
+ .longValue()), WorkspaceFolder.READ_ACCESS, null);
+ ContentTreeNode dummyOrgNode = new ContentTreeNode(dummyOrgFolder);
+ // tried using service.getAccessibleOrganisationWorkspaceFolders(userId)
+ // api,
+ // but it doesn't work, the userOrganisations set of the user
+ // got from workspaceManagementService with the userId supplied is
+ // empty, which
+ // is not true.
+ Vector orgFolders = service.getAccessibleOrganisationWorkspaceFolders(userId);
+ for (int i = 0; i < orgFolders.size(); i++) {
+ FolderContentDTO orgFolder = (FolderContentDTO) orgFolders.get(i);
+ dummyOrgNode.addChild(buildContentTreeNode(orgFolder, userId, mode));
}
+ root.addChild(dummyOrgNode);
+ return root;
+ }
- private ContentTreeNode buildContentTreeNode(FolderContentDTO folder,
- Integer userId, Integer mode) throws UserAccessDeniedException,
- RepositoryCheckedException {
- log.debug("build content tree node for folder - " + folder.getName());
- ContentTreeNode node = new ContentTreeNode(folder);
- if (folder.getResourceType().equals(FolderContentDTO.FOLDER)) {
- log.debug(folder.getName() + " is a folder");
- WorkspaceFolder wsfolder = service.getWorkspaceFolder(folder
- .getResourceID().intValue());
- Vector items = service.getFolderContentsExcludeHome(userId,
- wsfolder, mode);
- for (int i = 0; i < items.size(); i++) {
- FolderContentDTO content = (FolderContentDTO) items.get(i);
- node.addChild(buildContentTreeNode(content, userId, mode));
- }
- }
- return node;
+ private ContentTreeNode buildContentTreeNode(FolderContentDTO folder, Integer userId, Integer mode)
+ throws UserAccessDeniedException, RepositoryCheckedException {
+ log.debug("build content tree node for folder - " + folder.getName());
+ ContentTreeNode node = new ContentTreeNode(folder);
+ if (folder.getResourceType().equals(FolderContentDTO.FOLDER)) {
+ log.debug(folder.getName() + " is a folder");
+ WorkspaceFolder wsfolder = service.getWorkspaceFolder(folder.getResourceID().intValue());
+ Vector items = service.getFolderContentsExcludeHome(userId, wsfolder, mode);
+ for (int i = 0; i < items.size(); i++) {
+ FolderContentDTO content = (FolderContentDTO) items.get(i);
+ node.addChild(buildContentTreeNode(content, userId, mode));
+ }
}
+ return node;
+ }
- /**
- * The doGet method of the servlet.
- *
- * This method is called when a form has its tag value method equals to get.
- *
- * @param request
- * the request send by the client to the server
- * @param response
- * the response send by the server to the client
- * @throws ServletException
- * if an error occurred
- * @throws IOException
- * if an error occurred
- */
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
+ /**
+ * The doGet method of the servlet.
+ *
+ * This method is called when a form has its tag value method equals to get.
+ *
+ * @param request
+ * the request send by the client to the server
+ * @param response
+ * the response send by the server to the client
+ * @throws ServletException
+ * if an error occurred
+ * @throws IOException
+ * if an error occurred
+ */
+ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- try {
+ try {
- // get parameters
- String serverId = request.getParameter(CentralConstants.PARAM_SERVER_ID);
- String datetime = request.getParameter(CentralConstants.PARAM_DATE_TIME);
- String hashValue = request.getParameter(CentralConstants.PARAM_HASH_VALUE);
- String username = request.getParameter(CentralConstants.PARAM_USERNAME);
- String courseId = request.getParameter(CentralConstants.PARAM_COURSE_ID);
- String courseName = request.getParameter(CentralConstants.PARAM_COURSE_NAME);
- String country = request.getParameter(CentralConstants.PARAM_COUNTRY);
- String lang = request.getParameter(CentralConstants.PARAM_LANG);
- String modeStr = request.getParameter(CentralConstants.PARAM_MODE);
+ // get parameters
+ String serverId = request.getParameter(CentralConstants.PARAM_SERVER_ID);
+ String datetime = request.getParameter(CentralConstants.PARAM_DATE_TIME);
+ String hashValue = request.getParameter(CentralConstants.PARAM_HASH_VALUE);
+ String username = request.getParameter(CentralConstants.PARAM_USERNAME);
+ String courseId = request.getParameter(CentralConstants.PARAM_COURSE_ID);
+ String courseName = request.getParameter(CentralConstants.PARAM_COURSE_NAME);
+ String country = request.getParameter(CentralConstants.PARAM_COUNTRY);
+ String lang = request.getParameter(CentralConstants.PARAM_LANG);
+ String modeStr = request.getParameter(CentralConstants.PARAM_MODE);
+ String method = request.getParameter(CentralConstants.PARAM_METHOD);
- String firstName = request.getParameter(LoginRequestDispatcher.PARAM_FIRST_NAME);
- String lastName = request.getParameter(LoginRequestDispatcher.PARAM_LAST_NAME);
- String email = request.getParameter(LoginRequestDispatcher.PARAM_EMAIL);
+ String firstName = request.getParameter(LoginRequestDispatcher.PARAM_FIRST_NAME);
+ String lastName = request.getParameter(LoginRequestDispatcher.PARAM_LAST_NAME);
+ String email = request.getParameter(LoginRequestDispatcher.PARAM_EMAIL);
- if (serverId == null || datetime == null || hashValue == null
- || username == null || courseId == null || country == null
- || lang == null || modeStr == null) {
- String msg = "Parameters missing";
- log.error(msg);
- response.sendError(response.SC_BAD_REQUEST, "Parameters missing");
- }
+ if (serverId == null || datetime == null || hashValue == null || username == null || courseId == null
+ || country == null || lang == null || modeStr == null) {
+ String msg = "Parameters missing";
+ log.error(msg);
+ response.sendError(response.SC_BAD_REQUEST, "Parameters missing");
+ }
- Integer mode = new Integer(modeStr);
+ Integer mode = new Integer(modeStr);
- // get Server map
- ExtServerOrgMap serverMap = integrationService
- .getExtServerOrgMap(serverId);
+ // get Server map
+ ExtServerOrgMap serverMap = integrationService.getExtServerOrgMap(serverId);
- // authenticate
+ // authenticate
+ Authenticator.authenticate(serverMap, datetime, username, hashValue);
- Authenticator
- .authenticate(serverMap, datetime, username, hashValue);
+ // get user map, user is created if this is their first use
- // get user map, user is created if this is their first use
-
- ExtUserUseridMap userMap = null;
- if (firstName==null && lastName==null)
- {
- userMap = integrationService.getExtUserUseridMap(serverMap, username);
- }
- else
- {
- userMap = integrationService.getImplicitExtUserUseridMap(serverMap, username, firstName, lastName, lang, country, email);
- }
-
-
- // create group for external course if necessary
-
- integrationService.getExtCourseClassMap(serverMap, userMap,
- courseId,
- country, lang, courseName);
+ if (method != null && method.equals("exportLD")) {
+ // do export
+ exportLD(request, response);
+ } else {
- String contentTree = buildContentTree(
- userMap.getUser().getUserId(), mode).toString();
+ ExtUserUseridMap userMap = null;
+ if (firstName == null && lastName == null) {
+ userMap = integrationService.getExtUserUseridMap(serverMap, username);
+ } else {
+ userMap = integrationService.getImplicitExtUserUseridMap(serverMap, username, firstName, lastName,
+ lang, country, email);
+ }
- // generate response
- response.setContentType("text/xml");
- response.setCharacterEncoding("UTF8");
- PrintWriter out = response.getWriter();
+ // create group for external course if necessary
+ integrationService.getExtCourseClassMap(serverMap, userMap, courseId, country, lang, courseName);
- out.print(contentTree);
+ String contentTree = buildContentTree(userMap.getUser().getUserId(), mode).toString();
- } catch (NumberFormatException nfe) {
- log.error("mode is not an integer", nfe);
- response.sendError(response.SC_BAD_REQUEST, "mode is not an integer");
- } catch (AuthenticationException e) {
- log.error("can not authenticate", e);
- response.sendError(response.SC_BAD_REQUEST, "can not authenticate");
- } catch (UserInfoFetchException e) {
- log.error("can not retreive user information", e);
- response.sendError(response.SC_BAD_REQUEST, "can not retreive user information");
- } catch (UserAccessDeniedException e) {
- log.error("user access denied", e);
- response.sendError(response.SC_BAD_REQUEST, "user access denied");
- } catch (RepositoryCheckedException e) {
- log.error("repository checked", e);
- response.sendError(response.SC_BAD_REQUEST, "repository checked");
- } catch (Exception e){
- log.error("Problem with LearningDesignRepositoryServlet request", e);
- response.sendError(response.SC_BAD_REQUEST, "Problem with LearningDesignRepositoryServlet request");
- }
-
+ // generate response
+ response.setContentType("text/xml");
+ response.setCharacterEncoding("UTF8");
+ PrintWriter out = response.getWriter();
+
+ out.print(contentTree);
+ }
+
+ } catch (NumberFormatException nfe) {
+ log.error("mode is not an integer", nfe);
+ response.sendError(response.SC_BAD_REQUEST, "mode is not an integer");
+ } catch (AuthenticationException e) {
+ log.error("can not authenticate", e);
+ response.sendError(response.SC_BAD_REQUEST, "can not authenticate");
+ } catch (UserInfoFetchException e) {
+ log.error("can not retreive user information", e);
+ response.sendError(response.SC_BAD_REQUEST, "can not retreive user information");
+ } catch (UserAccessDeniedException e) {
+ log.error("user access denied", e);
+ response.sendError(response.SC_BAD_REQUEST, "user access denied");
+ } catch (RepositoryCheckedException e) {
+ log.error("repository checked", e);
+ response.sendError(response.SC_BAD_REQUEST, "repository checked");
+ } catch (Exception e) {
+ log.error("Problem with LearningDesignRepositoryServlet request", e);
+ response.sendError(response.SC_BAD_REQUEST, "Problem with LearningDesignRepositoryServlet request");
}
- /**
- * Initialization of the servlet.
- *
- * @throws ServletException
- * if an error occure
- */
- public void init() throws ServletException {
- integrationService = (IntegrationService) WebApplicationContextUtils
- .getRequiredWebApplicationContext(getServletContext()).getBean(
- "integrationService");
+ }
- service = (IWorkspaceManagementService) WebApplicationContextUtils
- .getRequiredWebApplicationContext(getServletContext()).getBean(
- "workspaceManagementService");
+ public void exportLD(HttpServletRequest request, HttpServletResponse response) {
+ Long learningDesignId = WebUtil.readLongParam(request, PARAM_LEARING_DESIGN_ID);
+ int format = WebUtil.readIntParam(request, PARAM_EXPORT_FORMAT);
+ List toolsErrorMsgs = new ArrayList();
- msgService = service.getMessageService();
+ try {
+ File xslt = new File(getServletContext().getRealPath(IMS_XSLT_PATH) + File.separator + IMS_XSLT_NAME);
+ String zipFilename = exportToolContentService.exportLearningDesign(learningDesignId, toolsErrorMsgs,
+ format, xslt);
+
+ // get only filename
+ String zipfile = FileUtil.getFileName(zipFilename);
+
+ // replace spaces (" ") with underscores ("_")
+ zipfile = zipfile.replaceAll(" ", "_");
+
+ // Different browsers handle stream downloads differently LDEV-1243
+ String filename = FileUtil.encodeFilenameForDownload(request, zipfile);
+ log.debug("Final filename to export: " + filename);
+
+ response.setContentType("application/x-download");
+ // response.setContentType("application/zip");
+ response.setHeader("Content-Disposition", "attachment;filename=" + filename);
+ InputStream in = null;
+ OutputStream out = null;
+ try {
+ in = new BufferedInputStream(new FileInputStream(zipFilename));
+ out = response.getOutputStream();
+ int count = 0;
+
+ int ch;
+ while ((ch = in.read()) != -1) {
+ out.write((char) ch);
+ count++;
+ }
+ log.debug("Wrote out " + count + " bytes");
+ response.setContentLength(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);
+ }
+ }
+ } catch (Exception e1) {
+ log.error("Unable to export tool content to external integrated server: " + e1.toString());
}
+ }
+
+ /**
+ * Initialization of the servlet.
+ *
+ * @throws ServletException
+ * if an error occure
+ */
+ public void init() throws ServletException {
+ integrationService = (IntegrationService) WebApplicationContextUtils.getRequiredWebApplicationContext(
+ getServletContext()).getBean("integrationService");
+
+ service = (IWorkspaceManagementService) WebApplicationContextUtils.getRequiredWebApplicationContext(
+ getServletContext()).getBean("workspaceManagementService");
+
+ msgService = service.getMessageService();
+
+ exportToolContentService = (IExportToolContentService) WebApplicationContextUtils
+ .getRequiredWebApplicationContext(getServletContext()).getBean("exportToolContentService");
+ }
}