Index: lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/NoticeboardAttachment.java =================================================================== diff -u -r89ae2d0b15d307b9dd4c20da0577481807524ce2 -r14ddf81e81af986fb804ec0fbf3d114f8b685898 --- lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/NoticeboardAttachment.java (.../NoticeboardAttachment.java) (revision 89ae2d0b15d307b9dd4c20da0577481807524ce2) +++ lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/NoticeboardAttachment.java (.../NoticeboardAttachment.java) (revision 14ddf81e81af986fb804ec0fbf3d114f8b685898) @@ -29,6 +29,7 @@ import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.log4j.Logger; +import org.lamsfoundation.lams.contentrepository.service.IRepositoryService; /** @@ -95,7 +96,8 @@ this.onlineFile = isOnline; } - /** Clone this attachment, including the unique id */ + /** Clone this attachment, including the unique id. This leaves two records pointing to the same item + * in the content repository. */ public Object clone(){ Object obj = null; try { @@ -105,6 +107,7 @@ } return obj; } + /** * @return Returns the attachmentId. */ Index: lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/NoticeboardContent.java =================================================================== diff -u -r89ae2d0b15d307b9dd4c20da0577481807524ce2 -r14ddf81e81af986fb804ec0fbf3d114f8b685898 --- lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/NoticeboardContent.java (.../NoticeboardContent.java) (revision 89ae2d0b15d307b9dd4c20da0577481807524ce2) +++ lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/NoticeboardContent.java (.../NoticeboardContent.java) (revision 14ddf81e81af986fb804ec0fbf3d114f8b685898) @@ -22,11 +22,16 @@ import java.io.Serializable; import java.util.Date; +import java.util.HashSet; import java.util.Iterator; import java.util.Set; -import java.util.HashSet; +import org.lamsfoundation.lams.contentrepository.ItemNotFoundException; +import org.lamsfoundation.lams.contentrepository.NodeKey; +import org.lamsfoundation.lams.contentrepository.RepositoryCheckedException; +import org.lamsfoundation.lams.contentrepository.client.IToolContentHandler; + /** *

Persistent noticeboard object/bean that defines the content for the noticeboard tool. * Provides accessors and mutators to get/set noticeboard attributes

@@ -361,8 +366,10 @@ * @param nb NoticeboardContent object containing the content to copy from * @param toContentId The new Id of the new noticeboard object * @return newContent The new noticeboard content object + * @throws RepositoryCheckedException + * @throws ItemNotFoundException */ - public static NoticeboardContent newInstance(NoticeboardContent nb, Long toContentId) + public static NoticeboardContent newInstance(NoticeboardContent nb, Long toContentId, IToolContentHandler toolContentHandler) throws ItemNotFoundException, RepositoryCheckedException { NoticeboardContent newContent = new NoticeboardContent(toContentId, nb.getTitle(), @@ -381,9 +388,10 @@ Iterator iter = nb.getNbAttachments().iterator(); while (iter.hasNext()) { NoticeboardAttachment element = (NoticeboardAttachment) iter.next(); - NoticeboardAttachment newAttachment = (NoticeboardAttachment) element.clone(); - newAttachment.setAttachmentId(null); - newAttachment.setNbContent(newContent); + NoticeboardAttachment newAttachment = new NoticeboardAttachment(newContent, element.getFilename(), element.isOnlineFile()); + NodeKey keys = toolContentHandler.copyFile(element.getUuid()); + newAttachment.setUuid(keys.getUuid()); + newAttachment.setVersionId(keys.getVersion()); newAttachmentSet.add(newAttachment); } newContent.setNbAttachments(newAttachmentSet); Index: lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/applicationContext.xml =================================================================== diff -u -r96cf45593171547d09ab2eefa67f191503418e6a -r14ddf81e81af986fb804ec0fbf3d114f8b685898 --- lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/applicationContext.xml (.../applicationContext.xml) (revision 96cf45593171547d09ab2eefa67f191503418e6a) +++ lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/applicationContext.xml (.../applicationContext.xml) (revision 14ddf81e81af986fb804ec0fbf3d114f8b685898) @@ -34,6 +34,7 @@ + Index: lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/service/INoticeboardService.java =================================================================== diff -u -rd789031b1ec349fa6315006cff40f1abc607b932 -r14ddf81e81af986fb804ec0fbf3d114f8b685898 --- lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/service/INoticeboardService.java (.../INoticeboardService.java) (revision d789031b1ec349fa6315006cff40f1abc607b932) +++ lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/service/INoticeboardService.java (.../INoticeboardService.java) (revision 14ddf81e81af986fb804ec0fbf3d114f8b685898) @@ -21,8 +21,11 @@ package org.lamsfoundation.lams.tool.noticeboard.service; +import java.io.InputStream; import java.util.List; +import org.lamsfoundation.lams.contentrepository.NodeKey; +import org.lamsfoundation.lams.contentrepository.RepositoryCheckedException; import org.lamsfoundation.lams.tool.noticeboard.NoticeboardAttachment; import org.lamsfoundation.lams.tool.noticeboard.NoticeboardContent; import org.lamsfoundation.lams.tool.noticeboard.NoticeboardSession; @@ -300,15 +303,14 @@ * @param content The overall noticeboard content object to which the attachment is to be added * @param attachment The instance of NoticeboardAttachment to delete. */ - public void removeAttachment(NoticeboardContent content, NoticeboardAttachment attachment); + public void removeAttachment(NoticeboardContent content, NoticeboardAttachment attachment) throws RepositoryCheckedException; - /* Not used? - * Removes the NoticeboardAttachment object from the database - * with uuid uuid - * @param uuid The uuid of the file - public void removeAttachmentByUuid(Long uuid); - */ - + /** + * Add a file to the content repository. Does not add a record to the noticeboard tables. + * @throws RepositoryCheckedException + */ + public NodeKey uploadFile(InputStream istream, String filename, String contentType, String fileType) throws RepositoryCheckedException; + /** * This method retrieves the default content id. * @param toolSignature The tool signature which is defined in lams_tool table. Index: lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/service/NoticeboardServicePOJO.java =================================================================== diff -u -r74804514d697b22ea2afdb8d1daf1c3b7797e793 -r14ddf81e81af986fb804ec0fbf3d114f8b685898 --- lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/service/NoticeboardServicePOJO.java (.../NoticeboardServicePOJO.java) (revision 74804514d697b22ea2afdb8d1daf1c3b7797e793) +++ lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/service/NoticeboardServicePOJO.java (.../NoticeboardServicePOJO.java) (revision 14ddf81e81af986fb804ec0fbf3d114f8b685898) @@ -21,11 +21,15 @@ package org.lamsfoundation.lams.tool.noticeboard.service; +import java.io.InputStream; import java.util.Date; import java.util.Iterator; import java.util.List; import org.apache.log4j.Logger; +import org.lamsfoundation.lams.contentrepository.NodeKey; +import org.lamsfoundation.lams.contentrepository.RepositoryCheckedException; +import org.lamsfoundation.lams.contentrepository.client.IToolContentHandler; import org.lamsfoundation.lams.learning.service.ILearnerService; import org.lamsfoundation.lams.tool.ToolContentManager; import org.lamsfoundation.lams.tool.ToolSessionExportOutputData; @@ -44,7 +48,6 @@ import org.lamsfoundation.lams.tool.noticeboard.dao.INoticeboardSessionDAO; import org.lamsfoundation.lams.tool.noticeboard.dao.INoticeboardUserDAO; import org.lamsfoundation.lams.tool.service.ILamsToolService; -import org.lamsfoundation.lams.usermanagement.User; import org.springframework.dao.DataAccessException; @@ -71,8 +74,8 @@ private INoticeboardUserDAO nbUserDAO=null; private INoticeboardAttachmentDAO nbAttachmentDAO = null; + private IToolContentHandler nbToolContentHandler = null; - private static Logger log = Logger.getLogger(NoticeboardServicePOJO.class); @@ -721,13 +724,16 @@ } } - /** @see org.lamsfoundation.lams.tool.noticeboard.service.INoticeboardService#removeAttachment(org.lamsfoundation.lams.tool.noticeboard.NoticeboardAttachment) */ - public void removeAttachment(NoticeboardContent content, NoticeboardAttachment attachment) + /** @throws RepositoryCheckedException + * @throws + * @see org.lamsfoundation.lams.tool.noticeboard.service.INoticeboardService#removeAttachment(org.lamsfoundation.lams.tool.noticeboard.NoticeboardAttachment) */ + public void removeAttachment(NoticeboardContent content, NoticeboardAttachment attachment) throws RepositoryCheckedException { try { attachment.setNbContent(null); content.getNbAttachments().remove(attachment); + nbToolContentHandler.deleteFile(attachment.getUuid()); saveNoticeboard(content); } catch (DataAccessException e) @@ -737,30 +743,13 @@ } } - /* Not used? - @see org.lamsfoundation.lams.tool.noticeboard.service.INoticeboardService#removeAttachmentByUuid(java.lang.Long) - public void removeAttachmentByUuid(Long uuid) + /** @throws RepositoryCheckedException + * @see org.lamsfoundation.lams.tool.noticeboard.service.INoticeboardService#uploadFile(java.io.InputStream, java.lang.String, java.lang.String, java.lang.String) */ + public NodeKey uploadFile(InputStream istream, String filename, String contentType, String fileType) throws RepositoryCheckedException { - if (uuid == null) - { - String error = "Unable to continue. The uuid is missing"; - log.error(error); - throw new NbApplicationException(error); - } - try - { - nbAttachmentDAO.removeAttachment(uuid); - } - catch (DataAccessException e) - { - throw new NbApplicationException("EXCEPTION: An exception has occurred while trying to remove the attachment with UUid" + uuid + " " - + e.getMessage(), e); - } + return nbToolContentHandler.uploadFile(istream, filename, contentType, fileType); } - */ - - /* ===============Methods implemented from ToolContentManager =============== */ /** @see org.lamsfoundation.lams.tool.ToolContentManager#copyToolContent(java.lang.Long, java.lang.Long)*/ @@ -779,26 +768,31 @@ //default content id might not have any contnet, throw exception NoticeboardContent originalNb = null; - if ((originalNb = retrieveNoticeboard(fromContentId))== null) //the id given does not have content, use default content - { - //use default content id to grab contents - NoticeboardContent defaultContent = retrieveNoticeboard(getToolDefaultContentIdBySignature(NoticeboardConstants.TOOL_SIGNATURE)); - - if (defaultContent != null) - { - NoticeboardContent newContent = NoticeboardContent.newInstance(defaultContent, toContentId); - saveNoticeboard(newContent); - } - else - { - throw new ToolException("Default content is missing. Unable to copy tool content"); - } + try { + if ((originalNb = retrieveNoticeboard(fromContentId))== null) //the id given does not have content, use default content + { + //use default content id to grab contents + NoticeboardContent defaultContent = retrieveNoticeboard(getToolDefaultContentIdBySignature(NoticeboardConstants.TOOL_SIGNATURE)); + + if (defaultContent != null) + { + NoticeboardContent newContent = NoticeboardContent.newInstance(defaultContent, toContentId, nbToolContentHandler); + saveNoticeboard(newContent); + } + else + { + throw new ToolException("Default content is missing. Unable to copy tool content"); + } + } + else + { + NoticeboardContent newNbContent = NoticeboardContent.newInstance(originalNb, toContentId, nbToolContentHandler); + saveNoticeboard(newNbContent); + } + } catch (RepositoryCheckedException e) { + log.error("Unable to copy the tool content due to a content repository error. fromContentId "+fromContentId+" toContentId "+toContentId); + throw new ToolException(e); } - else - { - NoticeboardContent newNbContent = NoticeboardContent.newInstance(originalNb, toContentId); - saveNoticeboard(newNbContent); - } } @@ -1021,4 +1015,12 @@ public void setToolService(ILamsToolService toolService) { this.toolService = toolService; } + + public IToolContentHandler getNbToolContentHandler() { + return nbToolContentHandler; + } + + public void setNbToolContentHandler(IToolContentHandler nbToolContentHandler) { + this.nbToolContentHandler = nbToolContentHandler; + } } Index: lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/service/NoticeboardServiceProxy.java =================================================================== diff -u -r96cf45593171547d09ab2eefa67f191503418e6a -r14ddf81e81af986fb804ec0fbf3d114f8b685898 --- lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/service/NoticeboardServiceProxy.java (.../NoticeboardServiceProxy.java) (revision 96cf45593171547d09ab2eefa67f191503418e6a) +++ lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/service/NoticeboardServiceProxy.java (.../NoticeboardServiceProxy.java) (revision 14ddf81e81af986fb804ec0fbf3d114f8b685898) @@ -75,14 +75,4 @@ return (ToolContentManager)getNbDomainService(servletContext); } - /* - * Get the Noticeboard's tool content handler - * @param servletContext the servletContext for current application - * @return noticeboard service object. */ - public static final NbToolContentHandler getToolContentHandler(ServletContext servletContext) - { - WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); - return (NbToolContentHandler) wac.getBean("nbToolContentHandler"); - } - } Index: lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/web/NbAuthoringAction.java =================================================================== diff -u -r96cf45593171547d09ab2eefa67f191503418e6a -r14ddf81e81af986fb804ec0fbf3d114f8b685898 --- lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/web/NbAuthoringAction.java (.../NbAuthoringAction.java) (revision 96cf45593171547d09ab2eefa67f191503418e6a) +++ lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/web/NbAuthoringAction.java (.../NbAuthoringAction.java) (revision 14ddf81e81af986fb804ec0fbf3d114f8b685898) @@ -314,26 +314,21 @@ while (iter.hasNext()) { NoticeboardAttachment attachment = (NoticeboardAttachment) iter.next(); - // remove entry from content repository. deleting a non-existent entry - // shouldn't cause any errors. try { - IToolContentHandler toolContentHandler = NoticeboardServiceProxy.getToolContentHandler(getServlet().getServletContext()); - toolContentHandler.deleteFile(attachment.getUuid()); - } - catch (RepositoryCheckedException e) { + // remove tool entry from db, includies removing entry from the content repository + // deleting a non-existent entry shouldn't cause any errors. + if ( attachment.getAttachmentId() != null ) { + nbService.removeAttachment(nbContent, attachment); + } + } catch (RepositoryCheckedException e) { logger.error("Unable to delete file",e); ActionMessages am = new ActionMessages(); am.add( ActionMessages.GLOBAL_MESSAGE, new ActionMessage( NoticeboardConstants.ERROR_FILE_UPLOAD_CONTENT_REPOSITORY , attachment.getFilename())); - saveErrors( request, am ); + saveErrors( request, am ); } - - // remove tool entry from db - if ( attachment.getAttachmentId() != null ) { - nbService.removeAttachment(nbContent, attachment); - } } deletedAttachmentList.clear(); } @@ -403,8 +398,7 @@ { // This is a new file and so is saved to the content repository. Add it to the // attachments collection, but don't add it to the tool's tables yet. - IToolContentHandler toolContentHandler = NoticeboardServiceProxy.getToolContentHandler(getServlet().getServletContext()); - NodeKey node = toolContentHandler.uploadFile(theFile.getInputStream(), theFile.getFileName(), theFile.getContentType(), fileType); + NodeKey node = nbService.uploadFile(theFile.getInputStream(), theFile.getFileName(), theFile.getContentType(), fileType); NoticeboardAttachment file = new NoticeboardAttachment(); file.setFilename(theFile.getFileName()); file.setOnlineFile(isOnlineFile); Index: lams_tool_nb/test/java/org/lamsfoundation/lams/tool/noticeboard/service/TestNoticeboardServicePOJO.java =================================================================== diff -u -r74804514d697b22ea2afdb8d1daf1c3b7797e793 -r14ddf81e81af986fb804ec0fbf3d114f8b685898 --- lams_tool_nb/test/java/org/lamsfoundation/lams/tool/noticeboard/service/TestNoticeboardServicePOJO.java (.../TestNoticeboardServicePOJO.java) (revision 74804514d697b22ea2afdb8d1daf1c3b7797e793) +++ lams_tool_nb/test/java/org/lamsfoundation/lams/tool/noticeboard/service/TestNoticeboardServicePOJO.java (.../TestNoticeboardServicePOJO.java) (revision 14ddf81e81af986fb804ec0fbf3d114f8b685898) @@ -30,6 +30,7 @@ import java.util.Iterator; +import org.lamsfoundation.lams.contentrepository.RepositoryCheckedException; import org.lamsfoundation.lams.tool.noticeboard.NbApplicationException; import org.lamsfoundation.lams.tool.noticeboard.NbDataAccessTestCase; import org.lamsfoundation.lams.tool.noticeboard.NoticeboardContent; @@ -510,12 +511,16 @@ } - public void testRemoveAttachment() + public void testRemoveAttachment() { initNbAttachmentData(); attachment = nbService.retrieveAttachmentByUuid(TEST_UUID); - nbService.removeAttachment(nbService.retrieveNoticeboard(TEST_NB_ID), attachment); + try { + nbService.removeAttachment(nbService.retrieveNoticeboard(TEST_NB_ID), attachment); + } catch (RepositoryCheckedException e) { + fail("Repository exception thrown"+e.getMessage()); + } attachment = nbService.retrieveAttachmentByUuid(TEST_UUID);