Index: lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/ImageGalleryConstants.java =================================================================== diff -u -rc0799c23f6d6b6be5ca5b740b85c72e3cc89a5b1 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/ImageGalleryConstants.java (.../ImageGalleryConstants.java) (revision c0799c23f6d6b6be5ca5b740b85c72e3cc89a5b1) +++ lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/ImageGalleryConstants.java (.../ImageGalleryConstants.java) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -23,7 +23,7 @@ package org.lamsfoundation.lams.tool.imageGallery; -public class ImageGalleryConstants { +public interface ImageGalleryConstants { public static final String TOOL_SIGNATURE = "laimag10"; public static final String IMAGE_GALLERY_SERVICE = "laimagImageGalleryService"; public static final String TOOL_CONTENT_HANDLER_NAME = "laimagImageGalleryToolContentHandler"; Index: lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/service/IImageGalleryService.java =================================================================== diff -u -r045ebfd1d11d9ed0a1f81a00abb1a2ea373e8d93 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/service/IImageGalleryService.java (.../IImageGalleryService.java) (revision 045ebfd1d11d9ed0a1f81a00abb1a2ea373e8d93) +++ lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/service/IImageGalleryService.java (.../IImageGalleryService.java) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -27,7 +27,6 @@ import java.util.Map; import java.util.Set; -import org.apache.struts.upload.FormFile; import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.rating.ToolRatingManager; import org.lamsfoundation.lams.rating.dto.ItemRatingDTO; @@ -40,6 +39,7 @@ import org.lamsfoundation.lams.tool.imageGallery.model.ImageGallerySession; import org.lamsfoundation.lams.tool.imageGallery.model.ImageGalleryUser; import org.lamsfoundation.lams.tool.imageGallery.model.ImageVote; +import org.springframework.web.multipart.MultipartFile; /** * Interface that defines the contract that all ShareImageGallery service provider must follow. @@ -73,7 +73,7 @@ * @param file * @throws UploadImageGalleryFileException */ - void uploadImageGalleryItemFile(ImageGalleryItem item, FormFile file) throws UploadImageGalleryFileException; + void uploadImageGalleryItemFile(ImageGalleryItem item, MultipartFile file) throws UploadImageGalleryFileException; // ********** for user methods ************* /** @@ -285,8 +285,8 @@ * Returns localized next image title. * * @param nextImageTitleNumber - * - * @return + * + * @return */ String generateNextImageTitle(Long nextImageTitleNumber); @@ -314,10 +314,10 @@ * @return */ boolean isGroupedActivity(long toolContentID); - + /** * Audit log the teacher has started editing activity in monitor. - * + * * @param toolContentID */ void auditLogStartEditingActivityInMonitor(long toolContentID); Index: lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/service/ImageGalleryServiceImpl.java =================================================================== diff -u -r045ebfd1d11d9ed0a1f81a00abb1a2ea373e8d93 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/service/ImageGalleryServiceImpl.java (.../ImageGalleryServiceImpl.java) (revision 045ebfd1d11d9ed0a1f81a00abb1a2ea373e8d93) +++ lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/service/ImageGalleryServiceImpl.java (.../ImageGalleryServiceImpl.java) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -45,7 +45,6 @@ import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; -import org.apache.struts.upload.FormFile; import org.lamsfoundation.lams.confidencelevel.ConfidenceLevelDTO; import org.lamsfoundation.lams.contentrepository.NodeKey; import org.lamsfoundation.lams.contentrepository.exception.InvalidParameterException; @@ -99,6 +98,7 @@ import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.imgscalr.ResizePictureUtil; +import org.springframework.web.multipart.MultipartFile; /** * @author Andrey Balan @@ -310,7 +310,7 @@ boolean isHidden = image.isHide(); image.setHide(!isHidden); imageGalleryItemDao.saveObject(image); - + // audit log Long userId = image.getCreateBy() == null ? 0L : image.getCreateBy().getUserId(); String loginName = image.getCreateBy() == null ? "No user" : image.getCreateBy().getLoginName(); @@ -347,7 +347,7 @@ @Override public ItemRatingDTO getRatingCriteriaDtos(Long contentId, Long toolSessionId, Long imageUid, Long userId) { - LinkedList itemIds = new LinkedList(); + LinkedList itemIds = new LinkedList<>(); itemIds.add(imageUid); ItemRatingDTO ratingCriteria = getRatingCriteriaDtos(contentId, toolSessionId, itemIds, true, userId).get(0); @@ -357,7 +357,8 @@ @Override public List getRatingCriteriaDtos(Long contentId, Long toolSessionId, Collection itemIds, boolean isCommentsByOtherUsersRequired, Long userId) { - return ratingService.getRatingCriteriaDtos(contentId, toolSessionId, itemIds, isCommentsByOtherUsersRequired, userId); + return ratingService.getRatingCriteriaDtos(contentId, toolSessionId, itemIds, isCommentsByOtherUsersRequired, + userId); } @Override @@ -389,31 +390,31 @@ @Override public List> getSummary(Long contentId) { - List> groupList = new ArrayList>(); - List group = new ArrayList(); + List> groupList = new ArrayList<>(); + List group = new ArrayList<>(); // get all item which is accessed by user ImageGallery imageGallery = imageGalleryDao.getByContentId(contentId); List sessionList = imageGallerySessionDao.getByContentId(contentId); for (ImageGallerySession session : sessionList) { // one new group for one session. - group = new ArrayList(); + group = new ArrayList<>(); Set groupImages = getImagesForGroup(imageGallery, session.getSessionId()); List itemRatingDtos = null; if (imageGallery.isAllowRank()) { // create itemIds list - List itemIds = new LinkedList(); + List itemIds = new LinkedList<>(); for (ImageGalleryItem image : groupImages) { itemIds.add(image.getUid()); } final Long USER_ID = -1L; final boolean IS_COMMENTS_BY_OTHER_USERS_REQUIRED = true; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!TODO calculate average ratings based on one // session data - itemRatingDtos = getRatingCriteriaDtos(contentId, session.getSessionId(), itemIds, IS_COMMENTS_BY_OTHER_USERS_REQUIRED, - USER_ID); + itemRatingDtos = getRatingCriteriaDtos(contentId, session.getSessionId(), itemIds, + IS_COMMENTS_BY_OTHER_USERS_REQUIRED, USER_ID); } for (ImageGalleryItem image : groupImages) { @@ -450,22 +451,22 @@ @Override public List> getImageSummary(Long contentId, Long imageUid) { - List> imageSummary = new ArrayList>(); - List group = new ArrayList(); + List> imageSummary = new ArrayList<>(); + List group = new ArrayList<>(); ImageGalleryItem image = imageGalleryItemDao.getByUid(imageUid); ImageGallery imageGallery = getImageGalleryByContentId(contentId); List sessionList; if (image.isCreateByAuthor()) { sessionList = imageGallerySessionDao.getByContentId(contentId); } else { - sessionList = new ArrayList(); + sessionList = new ArrayList<>(); sessionList.add(image.getCreateBy().getSession()); } for (ImageGallerySession session : sessionList) { // one new group for one session. - group = new ArrayList(); + group = new ArrayList<>(); // Object[] ratingForGroup = getRatingForGroup(image.getUid(), session.getSessionId()); List users = imageGalleryUserDao.getBySessionID(session.getSessionId()); @@ -511,13 +512,13 @@ @Override public Map> getReflectList(Long contentId, boolean setEntry) { - Map> map = new HashMap>(); + Map> map = new HashMap<>(); List sessionList = imageGallerySessionDao.getByContentId(contentId); for (ImageGallerySession session : sessionList) { Long sessionId = session.getSessionId(); boolean hasRefection = session.getImageGallery().isReflectOnActivity(); - Set list = new TreeSet(new ReflectDTOComparator()); + Set list = new TreeSet<>(new ReflectDTOComparator()); // get all users in this session List users = imageGalleryUserDao.getBySessionID(sessionId); for (ImageGalleryUser user : users) { @@ -541,7 +542,7 @@ } @Override - public void uploadImageGalleryItemFile(ImageGalleryItem image, FormFile file) + public void uploadImageGalleryItemFile(ImageGalleryItem image, MultipartFile file) throws UploadImageGalleryFileException { ImageGalleryConfigItem mediumImageDimensionsKey = getConfigItem( @@ -551,15 +552,14 @@ ImageGalleryConfigItem thumbnailImageDimensionsKey = getConfigItem( ImageGalleryConfigItem.KEY_THUMBNAIL_IMAGE_DIMENSIONS); int thumbnailImageDimensions = Integer.parseInt(thumbnailImageDimensionsKey.getConfigValue()); - + try { // upload file - NodeKey nodeKey = uploadFormFile(file); - image.setFileName(file.getFileName()); + NodeKey nodeKey = uploadMultipartFile(file); + image.setFileName(file.getOriginalFilename()); image.setOriginalFileUuid(nodeKey.getUuid()); - String fileName = file.getFileName(); + String fileName = file.getOriginalFilename(); - InputStream originalIS = imageGalleryToolContentHandler.getFileNode(nodeKey.getUuid()).getFile(); BufferedImage originalImage = ImageIO.read(originalIS); //throw exception if image was not successfully read @@ -569,21 +569,20 @@ //store orginalImageWidth and orginalImageHeight image.setOriginalImageWidth(originalImage.getWidth(null)); image.setOriginalImageHeight(originalImage.getHeight(null)); - + // prepare medium image InputStream mediumIS = ResizePictureUtil.resize(originalImage, mediumImageDimensions); String mediumFileName = ImageGalleryServiceImpl.MEDIUM_FILENAME_PREFIX + fileName.substring(0, fileName.indexOf('.')) + ".jpg"; - NodeKey mediumNodeKey = imageGalleryToolContentHandler.uploadFile(mediumIS, mediumFileName, - "image/jpeg"); + NodeKey mediumNodeKey = imageGalleryToolContentHandler.uploadFile(mediumIS, mediumFileName, "image/jpeg"); image.setMediumFileUuid(mediumNodeKey.getUuid()); //store MediumImageWidth and MediumImageHeight InputStream mediumIS2 = imageGalleryToolContentHandler.getFileNode(mediumNodeKey.getUuid()).getFile(); BufferedImage mediumImage = ImageIO.read(mediumIS2); image.setMediumImageWidth(mediumImage.getWidth(null)); image.setMediumImageHeight(mediumImage.getHeight(null)); mediumIS2.close(); - + // prepare thumbnail image InputStream originalIS2 = imageGalleryToolContentHandler.getFileNode(nodeKey.getUuid()).getFile(); InputStream thumbnailIS = ResizePictureUtil.resize(originalIS2, thumbnailImageDimensions); @@ -612,15 +611,15 @@ * @throws RepositoryCheckedException * @throws InvalidParameterException */ - private NodeKey uploadFormFile(FormFile file) throws UploadImageGalleryFileException { - if ((file == null) || StringUtils.isEmpty(file.getFileName())) { + private NodeKey uploadMultipartFile(MultipartFile file) throws UploadImageGalleryFileException { + if ((file == null) || StringUtils.isEmpty(file.getOriginalFilename())) { throw new UploadImageGalleryFileException( messageService.getMessage("error.msg.upload.file.not.found", new Object[] { file })); } NodeKey node = null; try { - node = imageGalleryToolContentHandler.uploadFile(file.getInputStream(), file.getFileName(), + node = imageGalleryToolContentHandler.uploadFile(file.getInputStream(), file.getOriginalFilename(), file.getContentType()); } catch (InvalidParameterException e) { throw new UploadImageGalleryFileException(messageService.getMessage("error.msg.invaid.param.upload")); @@ -638,10 +637,10 @@ public boolean isGroupedActivity(long toolContentID) { return toolService.isGroupedActivity(toolContentID); } - + @Override public void auditLogStartEditingActivityInMonitor(long toolContentID) { - toolService.auditLogStartEditingActivityInMonitor(toolContentID); + toolService.auditLogStartEditingActivityInMonitor(toolContentID); } @Override @@ -732,9 +731,9 @@ Set criterias = toolContentObj.getRatingCriterias(); if (criterias != null) { for (LearnerItemRatingCriteria criteria : criterias) { - criteria.setToolContentId(null); + criteria.setToolContentId(null); + } } - } // set ImageGalleryToolContentHandler as null to avoid copy file node in repository again. toolContentObj = ImageGallery.newInstance(toolContentObj, toolContentId); @@ -1055,12 +1054,12 @@ public ToolOutput getToolOutput(String name, Long toolSessionId, Long learnerId) { return imageGalleryOutputFactory.getToolOutput(name, this, toolSessionId, learnerId); } - + @Override public List getToolOutputs(String name, Long toolContentId) { - return new ArrayList(); + return new ArrayList<>(); } - + @Override public List getConfidenceLevels(Long toolSessionId) { return null; @@ -1086,20 +1085,23 @@ if (item.getCreateBy().getUserId() == learnerId) { Date newDate = item.getCreateDate(); if (newDate != null) { - if (startDate == null || newDate.before(startDate)) + if (startDate == null || newDate.before(startDate)) { startDate = newDate; - if (endDate == null || newDate.after(endDate)) + } + if (endDate == null || newDate.after(endDate)) { endDate = newDate; + } } } } - if (learner.isSessionFinished()) + if (learner.isSessionFinished()) { return new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_COMPLETED, startDate, endDate); - else + } else { return new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_ATTEMPTED, startDate, null); + } } - + /* =================================================================================== */ public IExportToolContentService getExportContentService() { @@ -1160,7 +1162,7 @@ @Override public Set getImagesForGroup(ImageGallery imageGallery, Long sessionId) { - TreeSet images = new TreeSet(new ImageGalleryItemComparator()); + TreeSet images = new TreeSet<>(new ImageGalleryItemComparator()); List grouppedUsers = getUserListBySessionId(sessionId); Set allImages = imageGallery.getImageGalleryItems(); Index: lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/util/ImageGalleryUtils.java =================================================================== diff -u -rc022c18db5de76344466905b76929dd951481994 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/util/ImageGalleryUtils.java (.../ImageGalleryUtils.java) (revision c022c18db5de76344466905b76929dd951481994) +++ lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/util/ImageGalleryUtils.java (.../ImageGalleryUtils.java) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -4,93 +4,92 @@ import java.util.List; import org.apache.commons.lang.StringUtils; -import org.apache.struts.action.ActionErrors; -import org.apache.struts.action.ActionMessage; -import org.apache.struts.action.ActionMessages; -import org.apache.struts.upload.FormFile; -import org.lamsfoundation.lams.tool.imageGallery.ImageGalleryConstants; import org.lamsfoundation.lams.tool.imageGallery.web.form.ImageGalleryItemForm; import org.lamsfoundation.lams.tool.imageGallery.web.form.MultipleImagesForm; -import org.lamsfoundation.lams.util.FileValidatorUtil; +import org.lamsfoundation.lams.util.FileValidatorSpringUtil; +import org.lamsfoundation.lams.util.MessageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.multipart.MultipartFile; public class ImageGalleryUtils { + + @Autowired + @Qualifier("laimagMessageService") + private static MessageService messageService; + /** * Validate imageGallery item. - * - * @param itemForm - * @return */ - public static ActionErrors validateImageGalleryItem(ImageGalleryItemForm itemForm, boolean largeFile) { - ActionErrors errors = new ActionErrors(); + public static MultiValueMap validateImageGalleryItem(ImageGalleryItemForm itemForm, + boolean largeFile) { + MultiValueMap errorMap = new LinkedMultiValueMap<>(); + // validate file size - FileValidatorUtil.validateFileSize(itemForm.getFile(), largeFile, errors); + FileValidatorSpringUtil.validateFileSize(itemForm.getFile(), largeFile); // for edit validate: file already exist if (!itemForm.isHasFile() - && ((itemForm.getFile() == null) || StringUtils.isEmpty(itemForm.getFile().getFileName()))) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(ImageGalleryConstants.ERROR_MSG_FILE_BLANK)); + && ((itemForm.getFile() == null) || StringUtils.isEmpty(itemForm.getFile().getOriginalFilename()))) { + errorMap.add("GLOBAL", messageService.getMessage("error.resource.item.file.blank")); } // check for allowed format : gif, png, jpg if (itemForm.getFile() != null) { String contentType = itemForm.getFile().getContentType(); - if (isContentTypeForbidden(contentType)) { - errors.add(ActionMessages.GLOBAL_MESSAGE, - new ActionMessage(ImageGalleryConstants.ERROR_MSG_NOT_ALLOWED_FORMAT)); + if (ImageGalleryUtils.isContentTypeForbidden(contentType)) { + errorMap.add("GLOBAL", messageService.getMessage("error.resource.image.not.alowed.format")); } } - return errors; + return errorMap; } /** * Validate imageGallery item. - * - * @param multipleForm - * @return */ - public static ActionErrors validateMultipleImages(MultipleImagesForm multipleForm, boolean largeFile) { - ActionErrors errors = new ActionErrors(); + public static MultiValueMap validateMultipleImages(MultipleImagesForm multipleForm, + boolean largeFile) { - List fileList = createFileListFromMultipleForm(multipleForm); + MultiValueMap errorMap = new LinkedMultiValueMap<>(); + List fileList = ImageGalleryUtils.createFileListFromMultipleForm(multipleForm); + // validate files size - for (FormFile file : fileList) { - FileValidatorUtil.validateFileSize(file, largeFile, errors); + for (MultipartFile file : fileList) { + FileValidatorSpringUtil.validateFileSize(file, largeFile); // check for allowed format : gif, png, jpg String contentType = file.getContentType(); - if (isContentTypeForbidden(contentType)) { - errors.add(ActionMessages.GLOBAL_MESSAGE, - new ActionMessage(ImageGalleryConstants.ERROR_MSG_NOT_ALLOWED_FORMAT_FOR, file.getFileName())); + if (ImageGalleryUtils.isContentTypeForbidden(contentType)) { + errorMap.add("GLOBAL", messageService.getMessage("error.resource.image.not.alowed.format.for")); } } - return errors; + return errorMap; } /** * Create file list from multiple form. - * - * @param multipleForm - * @return */ - public static List createFileListFromMultipleForm(MultipleImagesForm multipleForm) { + public static List createFileListFromMultipleForm(MultipleImagesForm multipleForm) { - List fileList = new ArrayList(); - if (multipleForm.getFile1() != null && !StringUtils.isEmpty(multipleForm.getFile1().getFileName())) { + List fileList = new ArrayList<>(); + if (multipleForm.getFile1() != null && !StringUtils.isEmpty(multipleForm.getFile1().getOriginalFilename())) { fileList.add(multipleForm.getFile1()); } - if (multipleForm.getFile2() != null && !StringUtils.isEmpty(multipleForm.getFile2().getFileName())) { + if (multipleForm.getFile2() != null && !StringUtils.isEmpty(multipleForm.getFile2().getOriginalFilename())) { fileList.add(multipleForm.getFile2()); } - if (multipleForm.getFile3() != null && !StringUtils.isEmpty(multipleForm.getFile3().getFileName())) { + if (multipleForm.getFile3() != null && !StringUtils.isEmpty(multipleForm.getFile3().getOriginalFilename())) { fileList.add(multipleForm.getFile3()); } - if (multipleForm.getFile4() != null && !StringUtils.isEmpty(multipleForm.getFile4().getFileName())) { + if (multipleForm.getFile4() != null && !StringUtils.isEmpty(multipleForm.getFile4().getOriginalFilename())) { fileList.add(multipleForm.getFile4()); } - if (multipleForm.getFile5() != null && !StringUtils.isEmpty(multipleForm.getFile5().getFileName())) { + if (multipleForm.getFile5() != null && !StringUtils.isEmpty(multipleForm.getFile5().getOriginalFilename())) { fileList.add(multipleForm.getFile5()); } Fisheye: Tag 9c66807dec11ccfe2299008ded08091f487a3478 refers to a dead (removed) revision in file `lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/action/AdminAction.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 9c66807dec11ccfe2299008ded08091f487a3478 refers to a dead (removed) revision in file `lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/action/AuthoringAction.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 9c66807dec11ccfe2299008ded08091f487a3478 refers to a dead (removed) revision in file `lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/action/ClearSessionAction.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 9c66807dec11ccfe2299008ded08091f487a3478 refers to a dead (removed) revision in file `lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/action/LearningAction.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 9c66807dec11ccfe2299008ded08091f487a3478 refers to a dead (removed) revision in file `lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/action/MonitoringAction.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/controller/AdminController.java =================================================================== diff -u --- lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/controller/AdminController.java (revision 0) +++ lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/controller/AdminController.java (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -0,0 +1,135 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +package org.lamsfoundation.lams.tool.imageGallery.web.controller; + +import javax.servlet.http.HttpServletRequest; + +import org.lamsfoundation.lams.tool.imageGallery.model.ImageGalleryConfigItem; +import org.lamsfoundation.lams.tool.imageGallery.service.IImageGalleryService; +import org.lamsfoundation.lams.tool.imageGallery.web.form.AdminForm; +import org.lamsfoundation.lams.util.MessageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * @author Andrey Balan + * @version + */ +@Controller +@RequestMapping("/laimag10admin") +public class AdminController { + + @Autowired + @Qualifier("laimagImageGalleryService") + private IImageGalleryService igService; + + @Autowired + @Qualifier("laimagMessageService") + private static MessageService messageService; + + @RequestMapping("/start") + public String start(@ModelAttribute AdminForm adminForm, HttpServletRequest request) { + + ImageGalleryConfigItem mediumImageDimensionsKey = igService + .getConfigItem(ImageGalleryConfigItem.KEY_MEDIUM_IMAGE_DIMENSIONS); + if (mediumImageDimensionsKey != null) { + adminForm.setMediumImageDimensions(mediumImageDimensionsKey.getConfigValue()); + } + + ImageGalleryConfigItem thumbnailImageDimensionsKey = igService + .getConfigItem(ImageGalleryConfigItem.KEY_THUMBNAIL_IMAGE_DIMENSIONS); + if (thumbnailImageDimensionsKey != null) { + adminForm.setThumbnailImageDimensions(thumbnailImageDimensionsKey.getConfigValue()); + } + + request.setAttribute("error", false); + return "pages/admin/config"; + } + + @RequestMapping("/saveContent") + public String saveContent(@ModelAttribute AdminForm adminForm, HttpServletRequest request) { + + MultiValueMap errorMap = validateAdminForm(adminForm); + if (!errorMap.isEmpty()) { + request.setAttribute("errorMap", errorMap); + return "pages/admin/config"; + } + + ImageGalleryConfigItem mediumImageDimensionsKey = igService + .getConfigItem(ImageGalleryConfigItem.KEY_MEDIUM_IMAGE_DIMENSIONS); + mediumImageDimensionsKey.setConfigValue(adminForm.getMediumImageDimensions()); + igService.saveOrUpdateImageGalleryConfigItem(mediumImageDimensionsKey); + + ImageGalleryConfigItem thumbnailImageDimensionsKey = igService + .getConfigItem(ImageGalleryConfigItem.KEY_THUMBNAIL_IMAGE_DIMENSIONS); + thumbnailImageDimensionsKey.setConfigValue(adminForm.getThumbnailImageDimensions()); + igService.saveOrUpdateImageGalleryConfigItem(thumbnailImageDimensionsKey); + + request.setAttribute("savedSuccess", true); + return "pages/admin/config"; + + } + + /** + * Validate ImageGalleryConfigItems. + */ + private MultiValueMap validateAdminForm(AdminForm adminForm) { + + MultiValueMap errorMap = new LinkedMultiValueMap<>(); + + if ((adminForm.getMediumImageDimensions() != null) && !adminForm.getMediumImageDimensions().equals("")) { + if (!isParsableToInt(adminForm.getMediumImageDimensions())) { + errorMap.add("GLOBAL", messageService.getMessage("error.entered.values.not.integers")); + } + } else { + errorMap.add("GLOBAL", messageService.getMessage("error.required.fields.missing")); + } + + if ((adminForm.getThumbnailImageDimensions() != null) && !adminForm.getThumbnailImageDimensions().equals("")) { + if (!isParsableToInt(adminForm.getThumbnailImageDimensions())) { + errorMap.add("GLOBAL", messageService.getMessage("error.entered.values.not.integers")); + } + } else { + errorMap.add("GLOBAL", messageService.getMessage("error.required.fields.missing")); + } + + return errorMap; + } + + /** + * Checks if entered value is integer. + */ + private boolean isParsableToInt(String i) { + try { + Integer.parseInt(i); + return true; + } catch (NumberFormatException nfe) { + return false; + } + } +} Index: lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/controller/AuthoringController.java =================================================================== diff -u --- lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/controller/AuthoringController.java (revision 0) +++ lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/controller/AuthoringController.java (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -0,0 +1,708 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +package org.lamsfoundation.lams.tool.imageGallery.web.controller; + +import java.lang.reflect.InvocationTargetException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Date; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.commons.beanutils.PropertyUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.math.NumberUtils; +import org.apache.log4j.Logger; +import org.lamsfoundation.lams.authoring.web.AuthoringConstants; +import org.lamsfoundation.lams.rating.model.RatingCriteria; +import org.lamsfoundation.lams.tool.ToolAccessMode; +import org.lamsfoundation.lams.tool.imageGallery.ImageGalleryConstants; +import org.lamsfoundation.lams.tool.imageGallery.model.ImageGallery; +import org.lamsfoundation.lams.tool.imageGallery.model.ImageGalleryItem; +import org.lamsfoundation.lams.tool.imageGallery.model.ImageGalleryUser; +import org.lamsfoundation.lams.tool.imageGallery.service.IImageGalleryService; +import org.lamsfoundation.lams.tool.imageGallery.service.UploadImageGalleryFileException; +import org.lamsfoundation.lams.tool.imageGallery.util.ImageGalleryItemComparator; +import org.lamsfoundation.lams.tool.imageGallery.util.ImageGalleryUtils; +import org.lamsfoundation.lams.tool.imageGallery.web.form.ImageGalleryForm; +import org.lamsfoundation.lams.tool.imageGallery.web.form.ImageGalleryItemForm; +import org.lamsfoundation.lams.tool.imageGallery.web.form.MultipleImagesForm; +import org.lamsfoundation.lams.usermanagement.dto.UserDTO; +import org.lamsfoundation.lams.util.MessageService; +import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.web.session.SessionManager; +import org.lamsfoundation.lams.web.util.AttributeNames; +import org.lamsfoundation.lams.web.util.SessionMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.multipart.MultipartFile; + +/** + * @author Andrey Balan + */ +@Controller +@RequestMapping("/authoring") +public class AuthoringController { + + private static Logger log = Logger.getLogger(AuthoringController.class); + + @Autowired + @Qualifier("laimagImageGalleryService") + private IImageGalleryService igService; + + @Autowired + @Qualifier("laimagMessageService") + private static MessageService messageService; + + /** + * Read imageGallery data from database and put them into HttpSession. It will redirect to init.do directly after + * this method run successfully. + * + * This method will avoid read database again and lost un-saved resouce item lost when user "refresh page", + */ + @RequestMapping("/start") + public String start(@ModelAttribute ImageGalleryForm imageGalleryForm, HttpServletRequest request) + throws ServletException { + + // save toolContentID into HTTPSession + Long contentId = new Long(WebUtil.readLongParam(request, ImageGalleryConstants.PARAM_TOOL_CONTENT_ID)); + + List items = null; + ImageGallery imageGallery = null; + + // Get contentFolderID and save to form. + String contentFolderID = WebUtil.readStrParam(request, AttributeNames.PARAM_CONTENT_FOLDER_ID); + imageGalleryForm.setContentFolderID(contentFolderID); + + // initial Session Map + SessionMap sessionMap = new SessionMap<>(); + request.getSession().setAttribute(sessionMap.getSessionID(), sessionMap); + imageGalleryForm.setSessionMapID(sessionMap.getSessionID()); + + try { + imageGallery = igService.getImageGalleryByContentId(contentId); + // if imageGallery does not exist, try to use default content instead. + if (imageGallery == null) { + imageGallery = igService.getDefaultContent(contentId); + if (imageGallery.getImageGalleryItems() != null) { + items = new ArrayList(imageGallery.getImageGalleryItems()); + } else { + items = null; + } + } else { + items = igService.getAuthoredItems(imageGallery.getUid()); + } + + imageGalleryForm.setImageGallery(imageGallery); + imageGalleryForm.setAllowRatingsOrVote(imageGallery.isAllowVote() || imageGallery.isAllowRank()); + } catch (Exception e) { + AuthoringController.log.error(e); + throw new ServletException(e); + } + + // init it to avoid null exception in following handling + if (items == null) { + items = new ArrayList<>(); + } else { + ImageGalleryUser imageGalleryUser = null; + // handle system default question: createBy is null, now set it to current user + for (ImageGalleryItem item : items) { + if (item.getCreateBy() == null) { + if (imageGalleryUser == null) { + // get back login user DTO + HttpSession ss = SessionManager.getSession(); + UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); + imageGalleryUser = new ImageGalleryUser(user, imageGallery); + } + item.setCreateBy(imageGalleryUser); + } + } + } + // init imageGallery item list + SortedSet imageGalleryItemList = getImageList(sessionMap); + imageGalleryItemList.clear(); + imageGalleryItemList.addAll(items); + + // get rating criterias from DB + List ratingCriterias = igService.getRatingCriterias(contentId); + sessionMap.put(AttributeNames.ATTR_RATING_CRITERIAS, ratingCriterias); + + sessionMap.put(ImageGalleryConstants.ATTR_IMAGE_GALLERY_FORM, imageGalleryForm); + sessionMap.put(ImageGalleryConstants.ATTR_NEXT_IMAGE_TITLE, imageGallery.getNextImageTitle()); + request.getSession().setAttribute(AttributeNames.PARAM_NOTIFY_CLOSE_URL, + request.getParameter(AttributeNames.PARAM_NOTIFY_CLOSE_URL)); + ToolAccessMode mode = WebUtil.readToolAccessModeAuthorDefaulted(request); + request.setAttribute(AttributeNames.ATTR_MODE, mode.toString()); + request.setAttribute("startForm", imageGalleryForm); + return "pages/authoring/start"; + } + + /** + * Display same entire authoring page content from HttpSession variable. + */ + @RequestMapping(path = "/init", method = RequestMethod.POST) + public String initPage(@ModelAttribute("imageGalleryForm") ImageGalleryForm startForm, HttpServletRequest request) + throws ServletException { + + String sessionMapID = WebUtil.readStrParam(request, ImageGalleryConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapID); + ImageGalleryForm existForm = (ImageGalleryForm) sessionMap.get(ImageGalleryConstants.ATTR_IMAGE_GALLERY_FORM); + + try { + PropertyUtils.copyProperties(startForm, existForm); + } catch (Exception e) { + throw new ServletException(e); + } + + ToolAccessMode mode = WebUtil.readToolAccessModeAuthorDefaulted(request); + request.setAttribute(AttributeNames.ATTR_MODE, mode.toString()); + request.setAttribute("imageGalleryForm", startForm); + + return "pages/authoring/authoring"; + } + + /** + * This method will persist all inforamtion in this authoring page, include all imageGallery item, information etc. + */ + @RequestMapping("/update") + public String updateContent(@ModelAttribute ImageGalleryForm imageGalleryForm, HttpServletRequest request) + throws IllegalAccessException, InvocationTargetException, Exception { + + // get back sessionMAP + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(imageGalleryForm.getSessionMapID()); + + ToolAccessMode mode = WebUtil.readToolAccessModeAuthorDefaulted(request); + request.setAttribute(AttributeNames.ATTR_MODE, mode.toString()); + + ImageGallery imageGallery = imageGalleryForm.getImageGallery(); + Long contentId = imageGalleryForm.getImageGallery().getContentId(); + + // **********************************Get ImageGallery PO********************* + ImageGallery imageGalleryPO = igService.getImageGalleryByContentId(contentId); + if (imageGalleryPO == null) { + // new ImageGallery, create it. + imageGalleryPO = imageGallery; + imageGalleryPO.setCreated(new Timestamp(new Date().getTime())); + imageGalleryPO.setUpdated(new Timestamp(new Date().getTime())); + + } else { + + Long uid = imageGalleryPO.getUid(); + PropertyUtils.copyProperties(imageGalleryPO, imageGallery); + // get back UID + imageGalleryPO.setUid(uid); + + // if it's a teacher - change define later status + if (mode.isTeacher()) { + imageGalleryPO.setDefineLater(false); + } + imageGalleryPO.setUpdated(new Timestamp(new Date().getTime())); + } + + // *******************************Handle nextImageTitle******************* + Long nextConsecutiveImageTitle = (Long) sessionMap.get(ImageGalleryConstants.ATTR_NEXT_IMAGE_TITLE); + imageGalleryPO.setNextImageTitle(nextConsecutiveImageTitle); + + // *******************************Handle user******************* + // try to get form system session + HttpSession ss = SessionManager.getSession(); + // get back login user DTO + UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); + ImageGalleryUser imageGalleryUser = igService.getUserByIDAndContent(new Long(user.getUserID().intValue()), + contentId); + if (imageGalleryUser == null) { + imageGalleryUser = new ImageGalleryUser(user, imageGalleryPO); + } + + imageGalleryPO.setCreatedBy(imageGalleryUser); + + // ************************* Handle imageGallery allowRank item ******************* + imageGalleryPO.setAllowRank(imageGalleryForm.isAllowRatingsOrVote() && !imageGalleryPO.isAllowVote()); + if (!imageGalleryPO.isAllowRank()) { + imageGalleryPO.setMaximumRates(0); + imageGalleryPO.setMinimumRates(0); + } + + // ************************* Handle imageGallery items ******************* + // Handle imageGallery items + Set itemList = new LinkedHashSet<>(); + SortedSet imageList = getImageList(sessionMap); + Iterator iter = imageList.iterator(); + while (iter.hasNext()) { + ImageGalleryItem item = iter.next(); + if (item != null) { + // This flushs user UID info to message if this user is a new user. + item.setCreateBy(imageGalleryUser); + itemList.add(item); + } + } + imageGalleryPO.setImageGalleryItems(itemList); + // delete instructino file from database. + List delImageGalleryItemList = getDeletedImageGalleryItemList(sessionMap); + iter = delImageGalleryItemList.iterator(); + while (iter.hasNext()) { + ImageGalleryItem item = iter.next(); + iter.remove(); + if (item.getUid() != null) { + igService.deleteImageGalleryItem(item.getUid()); + } + } + // handle imageGallery item attachment file: + List delItemAttList = getDeletedItemAttachmentList(sessionMap); + iter = delItemAttList.iterator(); + while (iter.hasNext()) { + ImageGalleryItem delAtt = iter.next(); + iter.remove(); + } + // ********************************************** + // finally persist imageGalleryPO again + igService.saveOrUpdateImageGallery(imageGalleryPO); + + // ************************* Handle rating criterias ******************* + if (mode.isAuthor()) { + List oldCriterias = (List) sessionMap + .get(AttributeNames.ATTR_RATING_CRITERIAS); + + igService.saveRatingCriterias(request, oldCriterias, contentId); + } + imageGalleryForm.setImageGallery(imageGalleryPO); + + request.setAttribute(AuthoringConstants.LAMS_AUTHORING_SUCCESS_FLAG, Boolean.TRUE); + + return "pages/authoring/authoring"; + } + + // ********************************************************** + // Add Image methods + // ********************************************************** + + /** + * Display empty page for new imageGallery item. + */ + @RequestMapping("/newImageInit") + public String newImageInit(@ModelAttribute ImageGalleryItemForm imageGalleryItemForm, HttpServletRequest request) { + + String sessionMapID = WebUtil.readStrParam(request, ImageGalleryConstants.ATTR_SESSION_MAP_ID); + imageGalleryItemForm.setSessionMapID(sessionMapID); + + // saveUsingLearningAction param is true in case request comes from learning or monitor and the we should use + // LearningAction's method to save uploaded image + boolean saveUsingLearningAction = WebUtil.readBooleanParam(request, "saveUsingLearningAction", false); + request.setAttribute("saveUsingLearningAction", saveUsingLearningAction); + + return "pages/authoring/parts/addimage"; + } + + /** + * Display edit page for existed imageGallery item. + */ + @RequestMapping("/editImage") + public String editImage(@ModelAttribute ImageGalleryItemForm imageGalleryItemForm, HttpServletRequest request) { + + // get back sessionMAP + String sessionMapID = WebUtil.readStrParam(request, ImageGalleryConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapID); + + int itemIdx = NumberUtils.stringToInt(request.getParameter(ImageGalleryConstants.PARAM_IMAGE_INDEX), -1); + ImageGalleryItem item = null; + if (itemIdx != -1) { + SortedSet imageGalleryList = getImageList(sessionMap); + List rList = new ArrayList<>(imageGalleryList); + item = rList.get(itemIdx); + if (item != null) { + populateItemToForm(itemIdx, item, imageGalleryItemForm, request); + } + } + return (item == null) ? null : "pages/authoring/parts/addimage"; + } + + /** + * Remove imageGallery item attachment, such as single file, learning object ect. It is a ajax call and just + * temporarily remove from page, all permenant change will happen only when user sumbit this imageGallery item + * again. + */ + @RequestMapping("/removeImage") + public String removeImageFile(HttpServletRequest request) { + + request.setAttribute("itemAttachment", null); + return "pages/authoring/parts/itemlist"; + } + + /** + * This method will get necessary information from imageGallery item form and save or update into + * HttpSession ImageGalleryItemList. Notice, this save is not persist them into database, just save + * HttpSession temporarily. Only they will be persist when the entire authoring page is being + * persisted. + */ + @RequestMapping("/saveOrUpdateImage") + public String saveOrUpdateImage(@ModelAttribute ImageGalleryItemForm itemForm, HttpServletRequest request, + HttpServletResponse response) { + + MultiValueMap errorMap = ImageGalleryUtils.validateImageGalleryItem(itemForm, true); + + try { + if (errorMap.isEmpty()) { + extractFormToImageGalleryItem(request, itemForm); + } + } catch (Exception e) { + // any upload exception will display as normal error message rather then throw exception directly + errorMap.add("GLOBAL", "error.upload.failed"); + } + + if (!errorMap.isEmpty()) { + request.setAttribute("errorMap", errorMap); + ; + return "pages/authoring/parts/addimage"; + } + + // set session map ID so that itemlist.jsp can get sessionMAP + request.setAttribute(ImageGalleryConstants.ATTR_SESSION_MAP_ID, itemForm.getSessionMapID()); + // return null to close this window + return "pages/authoring/parts/itemlist"; + } + + /** + * Move up current item. + */ + @RequestMapping("/upImage") + public String upImage(HttpServletRequest request) { + return switchItem(request, true); + } + + /** + */ + @RequestMapping("/downImage") + private String downImage(HttpServletRequest request) { + return switchItem(request, false); + } + + private String switchItem(HttpServletRequest request, boolean up) { + // get back sessionMAP + + String sessionMapID = WebUtil.readStrParam(request, ImageGalleryConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapID); + + int imageIdx = NumberUtils.stringToInt(request.getParameter(ImageGalleryConstants.PARAM_IMAGE_INDEX), -1); + if (imageIdx != -1) { + SortedSet taskListList = getImageList(sessionMap); + List rList = new ArrayList<>(taskListList); + // get current and the target item, and switch their sequnece + ImageGalleryItem image = rList.get(imageIdx); + ImageGalleryItem repImage; + if (up) { + repImage = rList.get(--imageIdx); + } else { + repImage = rList.get(++imageIdx); + } + int upSeqId = repImage.getSequenceId(); + repImage.setSequenceId(image.getSequenceId()); + image.setSequenceId(upSeqId); + + // put back list, it will be sorted again + taskListList.clear(); + taskListList.addAll(rList); + } + + request.setAttribute(ImageGalleryConstants.ATTR_SESSION_MAP_ID, sessionMapID); + return "pages/authoring/parts/itemlist"; + } + + /** + * Display empty page for muiltiple image upload. + */ + @RequestMapping("/initMultipleImages") + public String initMultipleImages(@ModelAttribute MultipleImagesForm multipleImagesForm, + HttpServletRequest request) { + + String sessionMapID = WebUtil.readStrParam(request, ImageGalleryConstants.ATTR_SESSION_MAP_ID); + multipleImagesForm.setSessionMapID(sessionMapID); + request.setAttribute(ImageGalleryConstants.ATTR_SESSION_MAP_ID, sessionMapID); + + return "pages/authoring/parts/addmultipleimages"; + } + + /** + * This method will get necessary information from imageGallery item form and save or update into + * HttpSession ImageGalleryItemList. Notice, this save is not persist them into database, just save + * HttpSession temporarily. Only they will be persist when the entire authoring page is being + * persisted. + */ + @RequestMapping("/saveMultipleImages") + public String saveMultipleImages(@ModelAttribute MultipleImagesForm multipleForm, HttpServletRequest request, + HttpServletResponse response) { + + MultiValueMap errorMap = ImageGalleryUtils.validateMultipleImages(multipleForm, true); + + try { + if (errorMap.isEmpty()) { + extractMultipleFormToImageGalleryItems(request, multipleForm); + } + } catch (Exception e) { + // any upload exception will display as normal error message rather then throw exception directly + errorMap.add("GLOBAL", messageService.getMessage("error.upload.failed")); + } + + if (!errorMap.isEmpty()) { + request.setAttribute("errorMap", errorMap); + return "pages/authoring/parts/addmultipleimages"; + } + + // set session map ID so that itemlist.jsp can get sessionMAP + request.setAttribute(ImageGalleryConstants.ATTR_SESSION_MAP_ID, multipleForm.getSessionMapID()); + // return null to close this window + return "pages/authoring/parts/itemlist"; + } + + /** + * Remove imageGallery item from HttpSession list and update page display. As authoring rule, all persist only + * happen when user submit whole page. So this remove is just impact HttpSession values. + */ + @RequestMapping("/removeImageFile") + public String removeImage(HttpServletRequest request) { + + // get back sessionMAP + String sessionMapID = WebUtil.readStrParam(request, ImageGalleryConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapID); + + int itemIdx = NumberUtils.stringToInt(request.getParameter(ImageGalleryConstants.PARAM_IMAGE_INDEX), -1); + if (itemIdx != -1) { + SortedSet imageGalleryList = getImageList(sessionMap); + List rList = new ArrayList<>(imageGalleryList); + ImageGalleryItem item = rList.remove(itemIdx); + imageGalleryList.clear(); + imageGalleryList.addAll(rList); + // add to delList + List delList = getDeletedImageGalleryItemList(sessionMap); + delList.add(item); + } + + request.setAttribute(ImageGalleryConstants.ATTR_SESSION_MAP_ID, sessionMapID); + return "pages/authoring/parts/imagefile"; + } + + // ************************************************************************************* + // Private methods + // ************************************************************************************* + + /** + * List save current imageGallery items. + */ + private SortedSet getImageList(SessionMap sessionMap) { + SortedSet list = (SortedSet) sessionMap + .get(ImageGalleryConstants.ATTR_IMAGE_LIST); + if (list == null) { + list = new TreeSet<>(new ImageGalleryItemComparator()); + sessionMap.put(ImageGalleryConstants.ATTR_IMAGE_LIST, list); + } + return list; + } + + /** + * List save deleted imageGallery items, which could be persisted or non-persisted items. + */ + private List getDeletedImageGalleryItemList(SessionMap sessionMap) { + return getListFromSession(sessionMap, ImageGalleryConstants.ATTR_DELETED_IMAGE_LIST); + } + + /** + * If a imageGallery item has attahment file, and the user edit this item and change the attachment to new file, + * then the old file need be deleted when submitting the whole authoring page. Save the file uuid and version id + * into ImageGalleryItem object for temporarily use. + */ + private List getDeletedItemAttachmentList(SessionMap sessionMap) { + return getListFromSession(sessionMap, ImageGalleryConstants.ATTR_DELETED_IMAGE_ATTACHMENT_LIST); + } + + /** + * Get java.util.List from HttpSession by given name. + */ + private List getListFromSession(SessionMap sessionMap, String name) { + List list = (List) sessionMap.get(name); + if (list == null) { + list = new ArrayList<>(); + sessionMap.put(name, list); + } + return list; + } + + /** + * This method will populate imageGallery item information to its form for edit use. + */ + private void populateItemToForm(int itemIdx, ImageGalleryItem item, ImageGalleryItemForm form, + HttpServletRequest request) { + form.setDescription(item.getDescription()); + form.setTitle(item.getTitle()); + if (itemIdx >= 0) { + form.setImageIndex(new Integer(itemIdx).toString()); + } + + if (item.getOriginalFileUuid() != null) { + form.setFileUuid(item.getOriginalFileUuid()); + form.setFileName(item.getFileName()); + form.setHasFile(true); + } else { + form.setHasFile(false); + } + } + + /** + * Extract web form content to imageGallery item. + */ + private void extractFormToImageGalleryItem(HttpServletRequest request, ImageGalleryItemForm imageForm) + throws Exception { + /* + * BE CAREFUL: This method will copy necessary info from request form to an old or new ImageGalleryItem + * instance. + * It gets all info EXCEPT ImageGalleryItem.createDate and ImageGalleryItem.createBy, which need be set when + * persisting this imageGallery item. + */ + + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(imageForm.getSessionMapID()); + // check whether it is "edit(old item)" or "add(new item)" + SortedSet imageList = getImageList(sessionMap); + int imageIdx = NumberUtils.stringToInt(imageForm.getImageIndex(), -1); + ImageGalleryItem image = null; + + if (imageIdx == -1) { // add + image = new ImageGalleryItem(); + image.setCreateDate(new Timestamp(new Date().getTime())); + int maxSeq = 1; + if (imageList != null && imageList.size() > 0) { + ImageGalleryItem last = imageList.last(); + maxSeq = last.getSequenceId() + 1; + } + image.setSequenceId(maxSeq); + imageList.add(image); + } else { // edit + List rList = new ArrayList<>(imageList); + image = rList.get(imageIdx); + } + + // uploadImageGalleryItemFile + // and setting file properties' fields: item.setFileUuid(); + // item.setFileName(); + if (imageForm.getFile() != null) { + // if it has old file, and upload a new, then save old to deleteList + ImageGalleryItem delImage = new ImageGalleryItem(); + boolean hasOld = false; + if (image.getOriginalFileUuid() != null) { + hasOld = true; + // be careful, This new ImageGalleryItem object never be save into database + // just temporarily use for saving fileUuid and versionID use: + delImage.setOriginalFileUuid(image.getOriginalFileUuid()); + } + try { + igService.uploadImageGalleryItemFile(image, imageForm.getFile()); + } catch (UploadImageGalleryFileException e) { + // if it is new add , then remove it! + if (imageIdx == -1) { + imageList.remove(image); + } + throw e; + } + // put it after "upload" to ensure deleted file added into list only no exception happens during upload + if (hasOld) { + List delAtt = getDeletedItemAttachmentList(sessionMap); + delAtt.add(delImage); + } + } + + String title = imageForm.getTitle(); + if (StringUtils.isBlank(title)) { + Long nextImageTitleNumber = (Long) sessionMap.get(ImageGalleryConstants.ATTR_NEXT_IMAGE_TITLE); + sessionMap.put(ImageGalleryConstants.ATTR_NEXT_IMAGE_TITLE, nextImageTitleNumber + 1); + title = igService.generateNextImageTitle(nextImageTitleNumber); + } + image.setTitle(title); + + image.setDescription(imageForm.getDescription()); + image.setCreateByAuthor(true); + image.setHide(false); + } + + /** + * Extract web form content to imageGallery items. + */ + private void extractMultipleFormToImageGalleryItems(HttpServletRequest request, MultipleImagesForm multipleForm) + throws Exception { + + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(multipleForm.getSessionMapID()); + // check whether it is "edit(old item)" or "add(new item)" + SortedSet imageList = getImageList(sessionMap); + + List fileList = ImageGalleryUtils.createFileListFromMultipleForm(multipleForm); + for (MultipartFile file : fileList) { + ImageGalleryItem image = new ImageGalleryItem(); + image.setCreateDate(new Timestamp(new Date().getTime())); + int maxSeq = 1; + if (imageList != null && imageList.size() > 0) { + ImageGalleryItem last = imageList.last(); + maxSeq = last.getSequenceId() + 1; + } + image.setSequenceId(maxSeq); + imageList.add(image); + + // uploadImageGalleryItemFile + // and setting file properties' fields: item.setFileUuid(); + // item.setFileName(); + try { + igService.uploadImageGalleryItemFile(image, file); + } catch (UploadImageGalleryFileException e) { + imageList.remove(image); + throw e; + } + + Long nextImageTitleNumber = (Long) sessionMap.get(ImageGalleryConstants.ATTR_NEXT_IMAGE_TITLE); + sessionMap.put(ImageGalleryConstants.ATTR_NEXT_IMAGE_TITLE, nextImageTitleNumber + 1); + String title = igService.generateNextImageTitle(nextImageTitleNumber); + image.setTitle(title); + + image.setDescription(""); + image.setCreateByAuthor(true); + image.setHide(false); + } + } + +} Index: lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/controller/ClearSessionController.java =================================================================== diff -u --- lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/controller/ClearSessionController.java (revision 0) +++ lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/controller/ClearSessionController.java (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -0,0 +1,69 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +package org.lamsfoundation.lams.tool.imageGallery.web.controller; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.log4j.Logger; +import org.lamsfoundation.lams.authoring.web.AuthoringConstants; +import org.lamsfoundation.lams.authoring.web.LamsAuthoringFinishController; +import org.lamsfoundation.lams.tool.ToolAccessMode; +import org.lamsfoundation.lams.tool.imageGallery.ImageGalleryConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.WebApplicationContext; + +/** + * This class give a chance to clear HttpSession when user save/close authoring page. + * + * @author Andrey.Balan + * + * @version $Revision$ + */ +@Controller +public class ClearSessionController extends LamsAuthoringFinishController implements ImageGalleryConstants { + private static Logger logger = Logger.getLogger(ClearSessionController.class.getName()); + + @Autowired + private WebApplicationContext applicationContext; + + @RequestMapping("/clearsession") + public void execute(HttpServletRequest request, HttpServletResponse response) throws IOException { + super.execute(request, response, applicationContext); + } + + @Override + public void clearSession(String customiseSessionID, HttpSession session, ToolAccessMode mode) { + session.removeAttribute(AuthoringConstants.LAMS_AUTHORING_SUCCESS_FLAG); + if (mode.isAuthor()) { + ClearSessionController.logger.debug("In Author mode"); + session.removeAttribute(customiseSessionID); + } + } +} Index: lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/controller/LearningController.java =================================================================== diff -u --- lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/controller/LearningController.java (revision 0) +++ lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/controller/LearningController.java (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -0,0 +1,630 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +package org.lamsfoundation.lams.tool.imageGallery.web.controller; + +import java.io.IOException; +import java.sql.Timestamp; +import java.util.Date; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionMapping; +import org.lamsfoundation.lams.learning.web.bean.ActivityPositionDTO; +import org.lamsfoundation.lams.learning.web.util.LearningWebUtil; +import org.lamsfoundation.lams.notebook.model.NotebookEntry; +import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants; +import org.lamsfoundation.lams.rating.dto.ItemRatingDTO; +import org.lamsfoundation.lams.tool.ToolAccessMode; +import org.lamsfoundation.lams.tool.imageGallery.ImageGalleryConstants; +import org.lamsfoundation.lams.tool.imageGallery.model.ImageGallery; +import org.lamsfoundation.lams.tool.imageGallery.model.ImageGalleryConfigItem; +import org.lamsfoundation.lams.tool.imageGallery.model.ImageGalleryItem; +import org.lamsfoundation.lams.tool.imageGallery.model.ImageGallerySession; +import org.lamsfoundation.lams.tool.imageGallery.model.ImageGalleryUser; +import org.lamsfoundation.lams.tool.imageGallery.model.ImageVote; +import org.lamsfoundation.lams.tool.imageGallery.service.IImageGalleryService; +import org.lamsfoundation.lams.tool.imageGallery.service.ImageGalleryException; +import org.lamsfoundation.lams.tool.imageGallery.service.UploadImageGalleryFileException; +import org.lamsfoundation.lams.tool.imageGallery.util.ImageGalleryItemComparator; +import org.lamsfoundation.lams.tool.imageGallery.util.ImageGalleryUtils; +import org.lamsfoundation.lams.tool.imageGallery.web.form.ImageGalleryItemForm; +import org.lamsfoundation.lams.tool.imageGallery.web.form.ImageRatingForm; +import org.lamsfoundation.lams.tool.imageGallery.web.form.MultipleImagesForm; +import org.lamsfoundation.lams.tool.imageGallery.web.form.ReflectionForm; +import org.lamsfoundation.lams.usermanagement.dto.UserDTO; +import org.lamsfoundation.lams.util.MessageService; +import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.web.session.SessionManager; +import org.lamsfoundation.lams.web.util.AttributeNames; +import org.lamsfoundation.lams.web.util.SessionMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.util.HtmlUtils; + +/** + * + * @author Andrey Balan + */ +@Controller +@RequestMapping("/learning") +public class LearningController { + + private static Logger log = Logger.getLogger(LearningController.class); + + @Autowired + @Qualifier("laimagImageGalleryService") + private IImageGalleryService igService; + + @Autowired + @Qualifier("laimagMessageService") + private static MessageService messageService; + + @Autowired + private WebApplicationContext applicationContext; + + /** + * Read imageGallery data from database and put them into HttpSession. It will redirect to init.do directly after + * this method run successfully. This method will avoid read database again and lost un-saved resouce item lost when + * user "refresh page", + * + */ + @RequestMapping("/start") + public String start(HttpServletRequest request) { + + // initial Session Map + SessionMap sessionMap = new SessionMap<>(); + request.getSession().setAttribute(sessionMap.getSessionID(), sessionMap); + Long sessionId = new Long(request.getParameter(ImageGalleryConstants.PARAM_TOOL_SESSION_ID)); + ToolAccessMode mode = WebUtil.readToolAccessModeParam(request, AttributeNames.PARAM_MODE, true); + ImageGallery imageGallery = igService.getImageGalleryBySessionId(sessionId); + + // save toolContentID into HTTPSession + request.setAttribute(ImageGalleryConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); + request.setAttribute(AttributeNames.ATTR_MODE, mode); + request.setAttribute(ImageGalleryConstants.ATTR_TOOL_SESSION_ID, sessionId); + + // get back the imageGallery and item list and display them on page + ImageGalleryUser imageGalleryUser = null; + if (mode != null && mode.isTeacher()) { + // monitoring mode - user is specified in URL + // imageGalleryUser may be null if the user was force completed. + imageGalleryUser = getSpecifiedUser(igService, sessionId, + WebUtil.readIntParam(request, AttributeNames.PARAM_USER_ID, false)); + } else { + imageGalleryUser = getCurrentUser(igService, sessionId); + } + Integer userId = imageGalleryUser.getUserId().intValue(); + + // Get contentFolderID and save to form. + // String contentFolderID = WebUtil.readStrParam(request, AttributeNames.PARAM_CONTENT_FOLDER_ID); + // sessionMap.put(ImageGalleryConstants.ATTR_CONTENT_FOLDER_ID, contentFolderID); + + // check whehter finish lock is on/off + boolean lock = imageGallery.getLockWhenFinished() && imageGalleryUser.isSessionFinished(); + + // get notebook entry + String entryText = new String(); + NotebookEntry notebookEntry = igService.getEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL, + ImageGalleryConstants.TOOL_SIGNATURE, userId); + if (notebookEntry != null) { + entryText = notebookEntry.getEntry(); + } + + // basic information + sessionMap.put(ImageGalleryConstants.ATTR_TITLE, imageGallery.getTitle()); + sessionMap.put(ImageGalleryConstants.ATTR_INSTRUCTIONS, imageGallery.getInstructions()); + sessionMap.put(ImageGalleryConstants.ATTR_FINISH_LOCK, lock); + sessionMap.put(ImageGalleryConstants.ATTR_LOCK_ON_FINISH, imageGallery.getLockWhenFinished()); + sessionMap.put(ImageGalleryConstants.ATTR_USER_FINISHED, imageGalleryUser.isSessionFinished()); + sessionMap.put(AttributeNames.PARAM_USER_ID, userId); + + sessionMap.put(AttributeNames.PARAM_TOOL_SESSION_ID, sessionId); + sessionMap.put(AttributeNames.ATTR_MODE, mode); + // reflection information + sessionMap.put(ImageGalleryConstants.ATTR_REFLECTION_ON, imageGallery.isReflectOnActivity()); + sessionMap.put(ImageGalleryConstants.ATTR_REFLECTION_INSTRUCTION, imageGallery.getReflectInstructions()); + sessionMap.put(ImageGalleryConstants.ATTR_REFLECTION_ENTRY, entryText); + + ImageGalleryConfigItem mediumImageDimensionsKey = igService + .getConfigItem(ImageGalleryConfigItem.KEY_MEDIUM_IMAGE_DIMENSIONS); + ImageGalleryConfigItem thumbnailImageDimensionsKey = igService + .getConfigItem(ImageGalleryConfigItem.KEY_THUMBNAIL_IMAGE_DIMENSIONS); + sessionMap.put(ImageGalleryConstants.ATTR_MEDIUM_IMAGE_DIMENSIONS, + Integer.parseInt(mediumImageDimensionsKey.getConfigValue())); + sessionMap.put(ImageGalleryConstants.ATTR_THUMBNAIL_IMAGE_DIMENSIONS, + Integer.parseInt(thumbnailImageDimensionsKey.getConfigValue())); + + // add define later support + if (imageGallery.isDefineLater()) { + return "pages/learning/definelater"; + } + + // set contentInUse flag to true! + imageGallery.setContentInUse(true); + imageGallery.setDefineLater(false); + igService.saveOrUpdateImageGallery(imageGallery); + + // store how many items are rated + if (imageGallery.isAllowRank()) { + int countRatedImages = igService.getCountItemsRatedByUser(imageGallery.getContentId(), userId.intValue()); + sessionMap.put(AttributeNames.ATTR_COUNT_RATED_ITEMS, countRatedImages); + } + + ActivityPositionDTO activityPosition = LearningWebUtil.putActivityPositionInRequestByToolSessionId(sessionId, + request, applicationContext.getServletContext()); + sessionMap.put(AttributeNames.ATTR_ACTIVITY_POSITION, activityPosition); + + // Create set of images, along with this filtering out items added by users from other groups + TreeSet images = new TreeSet<>(new ImageGalleryItemComparator()); + if (mode.isLearner()) { + Set groupImages = igService.getImagesForGroup(imageGallery, sessionId); + for (ImageGalleryItem image : groupImages) { + + // initialize login name abd userid to avoid session close error in proxy object + if (image.getCreateBy() != null) { + image.getCreateBy().getLoginName(); + } + + // remove hidden items + if (!image.isHide()) { + images.add(image); + } + } + } else { + images.addAll(imageGallery.getImageGalleryItems()); + } + + // escape characters + for (ImageGalleryItem image : images) { + String titleEscaped = HtmlUtils.htmlEscape(image.getTitle()); + image.setTitleEscaped(titleEscaped); + String descriptionEscaped = StringEscapeUtils.escapeJavaScript(image.getDescription()); + image.setDescriptionEscaped(descriptionEscaped); + } + + sessionMap.put(ImageGalleryConstants.ATTR_IMAGE_LIST, images); + sessionMap.put(ImageGalleryConstants.ATTR_IMAGE_GALLERY, imageGallery); + + return "pages/learning/learning"; + } + + /** + * Finish learning session. + */ + @RequestMapping("/finish") + public String finish(HttpServletRequest request) { + + // get back SessionMap + String sessionMapID = request.getParameter(ImageGalleryConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapID); + + // get toolSessionID from sessionMAP + Long sessionId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID); + + // get sessionId from HttpServletRequest + String nextActivityUrl = null; + try { + HttpSession ss = SessionManager.getSession(); + UserDTO userDTO = (UserDTO) ss.getAttribute(AttributeNames.USER); + Long userID = new Long(userDTO.getUserID().longValue()); + + nextActivityUrl = igService.finishToolSession(sessionId, userID); + request.setAttribute(ImageGalleryConstants.ATTR_NEXT_ACTIVITY_URL, nextActivityUrl); + } catch (ImageGalleryException e) { + LearningController.log.error("Failed get next activity url:" + e.getMessage()); + } + + return "pages/learning/finish"; + } + + /** + * Save file or url imageGallery item into database. + */ + @RequestMapping("/saveNewImage") + public String saveNewImage(@ModelAttribute ImageGalleryItemForm itemForm, HttpServletRequest request, + HttpServletResponse response) throws IOException { + + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(itemForm.getSessionMapID()); + ToolAccessMode mode = (ToolAccessMode) sessionMap.get(AttributeNames.ATTR_MODE); + + //validate form + boolean isLargeFilesAllowed = mode.isTeacher(); + MultiValueMap errorMap = ImageGalleryUtils.validateImageGalleryItem(itemForm, + isLargeFilesAllowed); + + try { + if (errorMap.isEmpty()) { + extractFormToImageGalleryItem(request, itemForm); + } + } catch (Exception e) { + // any upload exception will display as normal error message rather then throw exception directly + errorMap.add("GLOBAL", messageService.getMessage("error.upload.failed")); + } + + if (!errorMap.isEmpty()) { + ServletOutputStream outputStream = response.getOutputStream(); +// outputStream.print(errorMap.get().next().toString()); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + + return null; + } + + /** + * Save file or url imageGallery item into database. + */ + @RequestMapping("/saveMultipleImages") + public String saveMultipleImages(@ModelAttribute MultipleImagesForm multipleForm, HttpServletRequest request, + HttpServletResponse response) throws IOException { + + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(multipleForm.getSessionMapID()); + ToolAccessMode mode = (ToolAccessMode) sessionMap.get(AttributeNames.ATTR_MODE); + + //validate form + boolean isLargeFilesAllowed = mode.isTeacher(); + MultiValueMap errorMap = ImageGalleryUtils.validateMultipleImages(multipleForm, + isLargeFilesAllowed); + + try { + if (errorMap.isEmpty()) { + extractMultipleFormToImageGalleryItems(request, multipleForm); + } + } catch (Exception e) { + // any upload exception will display as normal error message rather then throw exception directly + errorMap.add("GLOBAL", messageService.getMessage("error.upload.failed")); + } + + if (!errorMap.isEmpty()) { + ServletOutputStream outputStream = response.getOutputStream(); +// outputStream.print(errors.get().next().toString()); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + + return null; + } + + /** + * Save file or url imageGallery item into database. + */ + @RequestMapping("/deleteImage") + public String deleteImage(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) { + + Long imageUid = new Long(request.getParameter(ImageGalleryConstants.PARAM_IMAGE_UID)); + String sessionMapID = request.getParameter(ImageGalleryConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapID); + ToolAccessMode mode = (ToolAccessMode) sessionMap.get(AttributeNames.ATTR_MODE); + Long sessionId = (Long) sessionMap.get(ImageGalleryConstants.ATTR_TOOL_SESSION_ID); + + igService.deleteImage(sessionId, imageUid); + + // redirect + String redirect = "redirect:learning/start.do"; + redirect = WebUtil.appendParameterToURL(redirect, AttributeNames.ATTR_MODE, mode.toString()); + redirect = WebUtil.appendParameterToURL(redirect, AttributeNames.PARAM_TOOL_SESSION_ID, sessionId.toString()); + return redirect; + } + + /** + * Sets Image data to session variable, to be shown on main learning page. + */ + @RequestMapping("/loadImageData") + public String loadImageData(HttpServletRequest request) { + + // get back sessionMAP + String sessionMapID = WebUtil.readStrParam(request, ImageGalleryConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapID); + ImageGallery imageGallery = (ImageGallery) sessionMap.get(ImageGalleryConstants.ATTR_IMAGE_GALLERY); + Long userId = ((Integer) sessionMap.get(AttributeNames.PARAM_USER_ID)).longValue(); + + Long imageUid = new Long(request.getParameter(ImageGalleryConstants.PARAM_IMAGE_UID)); + ImageGalleryItem image = igService.getImageGalleryItemByUid(imageUid); + String escapedDescription = image.getDescription().replaceAll("[\"]", """); + image.setDescription(escapedDescription); + sessionMap.put(ImageGalleryConstants.PARAM_CURRENT_IMAGE, image); + + // becuase in webpage will use this login name. Here is just + // initialize it to avoid session close error in a proxy object + ImageGalleryUser createdBy = image.getCreateBy(); + if (createdBy != null) { + image.getCreateBy().getLoginName(); + } + + //handle rating criterias + int commentsMinWordsLimit = 0; + boolean isCommentsEnabled = false; + int countRatedImages = 0; + Long toolSessionId = (Long) sessionMap.get(ImageGalleryConstants.ATTR_TOOL_SESSION_ID); + + if (imageGallery.isAllowRank()) { + + ItemRatingDTO itemRatingDto = igService.getRatingCriteriaDtos(imageGallery.getContentId(), toolSessionId, + imageUid, userId); + sessionMap.put(AttributeNames.ATTR_ITEM_RATING_DTO, itemRatingDto); + + if (itemRatingDto != null) { + commentsMinWordsLimit = itemRatingDto.getCommentsMinWordsLimit(); + isCommentsEnabled = itemRatingDto.isCommentsEnabled(); + } + + // store how many items are rated + countRatedImages = igService.getCountItemsRatedByUser(imageGallery.getContentId(), userId.intValue()); + } + sessionMap.put("commentsMinWordsLimit", commentsMinWordsLimit); + sessionMap.put("isCommentsEnabled", isCommentsEnabled); + sessionMap.put(AttributeNames.ATTR_COUNT_RATED_ITEMS, countRatedImages); + + if (imageGallery.isAllowVote()) { + boolean isVotedForThisImage = false; + ImageVote imageVote = igService.getImageVoteByImageAndUser(imageUid, userId); + if (imageVote != null && imageVote.isVoted()) { + isVotedForThisImage = true; + } + sessionMap.put(ImageGalleryConstants.PARAM_IS_VOTED, isVotedForThisImage); + } + + // set visibility of "Delete image" button + boolean isAuthor = !image.isCreateByAuthor() && (createdBy != null) && (createdBy.getUserId().equals(userId)); + sessionMap.put(ImageGalleryConstants.PARAM_IS_AUTHOR, isAuthor); + request.setAttribute(ImageGalleryConstants.ATTR_SESSION_MAP_ID, sessionMapID); + return "pages/learning/parts/commentsarea"; + } + + /** + * Move down current item. + */ + @RequestMapping("/vote") + public String vote(@ModelAttribute ImageRatingForm imageRatingForm, HttpServletRequest request) { + + String sessionMapID = WebUtil.readStrParam(request, ImageGalleryConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapID); + Long sessionId = (Long) sessionMap.get(ImageGalleryConstants.ATTR_TOOL_SESSION_ID); + Long imageUid = new Long(request.getParameter(ImageGalleryConstants.PARAM_IMAGE_UID)); + UserDTO user = (UserDTO) SessionManager.getSession().getAttribute(AttributeNames.USER); + ImageGalleryUser imageGalleryUser = igService.getUserByIDAndSession(new Long(user.getUserID().intValue()), + sessionId); + + // persist ImageGalleryItem changes in DB + boolean formVote = imageRatingForm.getVote(); + ImageVote imageVote = igService.getImageVoteByImageAndUser(imageUid, imageGalleryUser.getUserId()); + if (imageVote == null) { + imageVote = new ImageVote(); + imageVote.setCreateBy(imageGalleryUser); + ImageGalleryItem image = igService.getImageGalleryItemByUid(imageUid); + imageVote.setImageGalleryItem(image); + } + imageVote.setVoted(formVote); + igService.saveOrUpdateImageVote(imageVote); + + request.setAttribute(ImageGalleryConstants.ATTR_SESSION_MAP_ID, sessionMapID); + return "pages/learning/parts/commentsarea"; + } + + /** + * Display empty reflection form. + */ + @RequestMapping("/newReflection") + public String newReflection(@ModelAttribute ReflectionForm reflectionForm, HttpServletRequest request) { + + // get session value + String sessionMapID = WebUtil.readStrParam(request, ImageGalleryConstants.ATTR_SESSION_MAP_ID); + + HttpSession ss = SessionManager.getSession(); + UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); + + reflectionForm.setUserID(user.getUserID()); + reflectionForm.setSessionMapID(sessionMapID); + + // get the existing reflection entry + + SessionMap map = (SessionMap) request.getSession().getAttribute(sessionMapID); + Long toolSessionID = (Long) map.get(AttributeNames.PARAM_TOOL_SESSION_ID); + NotebookEntry entry = igService.getEntry(toolSessionID, CoreNotebookConstants.NOTEBOOK_TOOL, + ImageGalleryConstants.TOOL_SIGNATURE, user.getUserID()); + + if (entry != null) { + reflectionForm.setEntryText(entry.getEntry()); + } + + return "pages/learning/notebook"; + } + + /** + * Submit reflection form input database. + */ + @RequestMapping("/submitReflection") + public String submitReflection(@ModelAttribute ReflectionForm reflectionForm, HttpServletRequest request) { + + Integer userId = reflectionForm.getUserID(); + + String sessionMapID = WebUtil.readStrParam(request, ImageGalleryConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapID); + Long sessionId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID); + + // check for existing notebook entry + NotebookEntry entry = igService.getEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL, + ImageGalleryConstants.TOOL_SIGNATURE, userId); + + if (entry == null) { + // create new entry + igService.createNotebookEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL, + ImageGalleryConstants.TOOL_SIGNATURE, userId, reflectionForm.getEntryText()); + } else { + // update existing entry + entry.setEntry(reflectionForm.getEntryText()); + entry.setLastModified(new Date()); + igService.updateEntry(entry); + } + + return finish(request); + } + + // ************************************************************************************* + // Private methods + // ************************************************************************************* + + private ImageGalleryUser getCurrentUser(IImageGalleryService service, Long sessionId) { + // try to get form system session + HttpSession ss = SessionManager.getSession(); + // get back login user DTO + UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); + ImageGalleryUser imageGalleryUser = service.getUserByIDAndSession(new Long(user.getUserID().intValue()), + sessionId); + + if (imageGalleryUser == null) { + ImageGallerySession session = service.getImageGallerySessionBySessionId(sessionId); + imageGalleryUser = new ImageGalleryUser(user, session); + service.saveUser(imageGalleryUser); + } + return imageGalleryUser; + } + + private ImageGalleryUser getSpecifiedUser(IImageGalleryService service, Long sessionId, Integer userId) { + ImageGalleryUser imageGalleryUser = service.getUserByIDAndSession(new Long(userId.intValue()), sessionId); + if (imageGalleryUser == null) { + LearningController.log.error( + "Unable to find specified user for imageGallery activity. Screens are likely to fail. SessionId=" + + sessionId + " UserId=" + userId); + } + return imageGalleryUser; + } + + /** + * Extract web form content to imageGallery item. + */ + private void extractFormToImageGalleryItem(HttpServletRequest request, ImageGalleryItemForm imageForm) + throws Exception { + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(imageForm.getSessionMapID()); + ToolAccessMode mode = (ToolAccessMode) sessionMap.get(AttributeNames.ATTR_MODE); + + ImageGallery imageGallery; + Long toolSessionId = null; + ImageGalleryUser user = null; + if (mode.isLearner() || mode.isAuthor()) { + toolSessionId = (Long) sessionMap.get(ImageGalleryConstants.ATTR_TOOL_SESSION_ID); + imageGallery = igService.getImageGalleryBySessionId(toolSessionId); + user = getCurrentUser(igService, toolSessionId); + + // monitor + } else { + Long contentId = (Long) sessionMap.get(ImageGalleryConstants.ATTR_TOOL_CONTENT_ID); + imageGallery = igService.getImageGalleryByContentId(contentId); + } + + ImageGalleryItem image = new ImageGalleryItem(); + image.setCreateDate(new Timestamp(new Date().getTime())); + + // upload ImageGalleryItem file + // and setting file properties' fields: item.setFileUuid(); + // item.setFileName(); + if (imageForm.getFile() != null) { + try { + igService.uploadImageGalleryItemFile(image, imageForm.getFile()); + } catch (UploadImageGalleryFileException e) { + // remove new image! + throw e; + } + } + + String title = imageForm.getTitle(); + if (StringUtils.isBlank(title)) { + Long nextImageTitleNumber = imageGallery.getNextImageTitle(); + imageGallery.setNextImageTitle(nextImageTitleNumber + 1); + + title = igService.generateNextImageTitle(nextImageTitleNumber); + } + image.setTitle(title); + + image.setCreateBy(user); + image.setDescription(imageForm.getDescription()); + image.setCreateByAuthor(false); + image.setHide(false); + if (mode.isTeacher()) { + image.setCreateByAuthor(true); + } + + // setting SequenceId + Set imageList = imageGallery.getImageGalleryItems(); + int maxSeq = 0; + for (ImageGalleryItem dbImage : imageList) { + if (dbImage.getSequenceId() > maxSeq) { + maxSeq = dbImage.getSequenceId(); + } + } + maxSeq++; + image.setSequenceId(maxSeq); + + imageList.add(image); + igService.saveOrUpdateImageGallery(imageGallery); + + igService.saveOrUpdateImageGalleryItem(image); + + // notify teachers + if (mode.isLearner() && imageGallery.isNotifyTeachersOnImageSumbit()) { + igService.notifyTeachersOnImageSumbit(toolSessionId, user); + } + } + + /** + * Extract web form content to imageGallery items. + */ + private void extractMultipleFormToImageGalleryItems(HttpServletRequest request, MultipleImagesForm multipleForm) + throws Exception { + + List fileList = ImageGalleryUtils.createFileListFromMultipleForm(multipleForm); + for (MultipartFile file : fileList) { + ImageGalleryItemForm imageForm = new ImageGalleryItemForm(); + imageForm.setSessionMapID(multipleForm.getSessionMapID()); + imageForm.setTitle(""); + imageForm.setDescription(""); + imageForm.setFile(file); + extractFormToImageGalleryItem(request, imageForm); + } + } + +} Index: lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/controller/MonitoringController.java =================================================================== diff -u --- lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/controller/MonitoringController.java (revision 0) +++ lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/controller/MonitoringController.java (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -0,0 +1,223 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +package org.lamsfoundation.lams.tool.imageGallery.web.controller; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.math.NumberUtils; +import org.apache.log4j.Logger; +import org.lamsfoundation.lams.notebook.model.NotebookEntry; +import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants; +import org.lamsfoundation.lams.rating.dto.ItemRatingDTO; +import org.lamsfoundation.lams.tool.ToolAccessMode; +import org.lamsfoundation.lams.tool.imageGallery.ImageGalleryConstants; +import org.lamsfoundation.lams.tool.imageGallery.dto.ReflectDTO; +import org.lamsfoundation.lams.tool.imageGallery.dto.Summary; +import org.lamsfoundation.lams.tool.imageGallery.dto.UserImageContributionDTO; +import org.lamsfoundation.lams.tool.imageGallery.model.ImageGallery; +import org.lamsfoundation.lams.tool.imageGallery.model.ImageGalleryItem; +import org.lamsfoundation.lams.tool.imageGallery.model.ImageGallerySession; +import org.lamsfoundation.lams.tool.imageGallery.model.ImageGalleryUser; +import org.lamsfoundation.lams.tool.imageGallery.service.IImageGalleryService; +import org.lamsfoundation.lams.tool.imageGallery.web.form.ImageGalleryItemForm; +import org.lamsfoundation.lams.util.MessageService; +import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.web.util.AttributeNames; +import org.lamsfoundation.lams.web.util.SessionMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/monitoring") +public class MonitoringController { + + public static Logger log = Logger.getLogger(MonitoringController.class); + + @Autowired + @Qualifier("laimagImageGalleryService") + private IImageGalleryService igService; + + @Autowired + @Qualifier("laimagMessageService") + private static MessageService messageService; + + @RequestMapping("/summary") + public String summary(HttpServletRequest request) { + + // initial Session Map + SessionMap sessionMap = new SessionMap<>(); + request.getSession().setAttribute(sessionMap.getSessionID(), sessionMap); + request.setAttribute(ImageGalleryConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); + // save contentFolderID into session + sessionMap.put(AttributeNames.PARAM_CONTENT_FOLDER_ID, + WebUtil.readStrParam(request, AttributeNames.PARAM_CONTENT_FOLDER_ID)); + + Long contentId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID); + List> groupList = igService.getSummary(contentId); + + ImageGallery imageGallery = igService.getImageGalleryByContentId(contentId); + + Map> reflectList = igService.getReflectList(contentId, false); + boolean isGroupedActivity = igService.isGroupedActivity(contentId); + + // cache into sessionMap + sessionMap.put(ImageGalleryConstants.ATTR_IS_GROUPED_ACTIVITY, isGroupedActivity); + sessionMap.put(ImageGalleryConstants.ATTR_SUMMARY_LIST, groupList); + sessionMap.put(ImageGalleryConstants.PAGE_EDITABLE, imageGallery.isContentInUse()); + sessionMap.put(ImageGalleryConstants.ATTR_IMAGE_GALLERY, imageGallery); + sessionMap.put(ImageGalleryConstants.ATTR_TOOL_CONTENT_ID, contentId); + sessionMap.put(ImageGalleryConstants.ATTR_REFLECT_LIST, reflectList); + sessionMap.put(AttributeNames.ATTR_MODE, ToolAccessMode.TEACHER); + //rating stuff + boolean isCommentsEnabled = igService.isCommentsEnabled(contentId); + sessionMap.put(ImageGalleryConstants.ATTR_IS_COMMENTS_ENABLED, isCommentsEnabled); + + return "pages/monitoring/monitoring"; + } + + /** + * Display edit page for existed imageGallery item. + */ + @RequestMapping("/imageSummary") + public String imageSummary(@ModelAttribute ImageGalleryItemForm imageGalleryItemForm, HttpServletRequest request) { + + // get back sessionMAP + String sessionMapID = WebUtil.readStrParam(request, ImageGalleryConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapID); + request.setAttribute(ImageGalleryConstants.ATTR_SESSION_MAP_ID, sessionMapID); + Long contentId = (Long) sessionMap.get(ImageGalleryConstants.ATTR_TOOL_CONTENT_ID); + ImageGallery imageGallery = (ImageGallery) sessionMap.get(ImageGalleryConstants.ATTR_IMAGE_GALLERY); + Long imageUid = new Long(request.getParameter(ImageGalleryConstants.PARAM_IMAGE_UID)); + ImageGalleryItem image = igService.getImageGalleryItemByUid(imageUid); + Long toolSessionId = WebUtil.readLongParam(request, ImageGalleryConstants.PARAM_TOOL_SESSION_ID); + + if (imageGallery.isAllowVote()) { + List> imageSummary = igService.getImageSummary(contentId, imageUid); + request.setAttribute(ImageGalleryConstants.ATTR_IMAGE_SUMMARY, imageSummary); + + } else if (imageGallery.isAllowRank()) { + ItemRatingDTO itemRatingDto = igService.getRatingCriteriaDtos(contentId, toolSessionId, imageUid, -1L); + request.setAttribute("itemRatingDto", itemRatingDto); + } + + request.setAttribute(ImageGalleryConstants.ATTR_IMAGE, image); + + imageGalleryItemForm.setImageUid(image.getUid().toString()); + imageGalleryItemForm.setTitle(image.getTitle()); + imageGalleryItemForm.setDescription(image.getDescription()); + + return "pages/monitoring/imagesummary"; + } + + /** + * Update image's title and description set by monitor + */ + @RequestMapping("/updateImage") + public String updateImage(@ModelAttribute ImageGalleryItemForm imageGalleryItemForm, HttpServletRequest request) { + + // get back sessionMAP + String sessionMapID = imageGalleryItemForm.getSessionMapID(); + request.setAttribute(ImageGalleryConstants.ATTR_SESSION_MAP_ID, sessionMapID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(imageGalleryItemForm.getSessionMapID()); + Long contentId = (Long) sessionMap.get(ImageGalleryConstants.ATTR_TOOL_CONTENT_ID); + ImageGallery imageGallery = igService.getImageGalleryByContentId(contentId); + + int imageUid = NumberUtils.stringToInt(imageGalleryItemForm.getImageUid(), -1); + ImageGalleryItem image = igService.getImageGalleryItemByUid(new Long(imageUid)); + + String title = imageGalleryItemForm.getTitle(); + if (StringUtils.isBlank(title)) { + Long nextImageTitleNumber = imageGallery.getNextImageTitle(); + imageGallery.setNextImageTitle(nextImageTitleNumber + 1); + igService.saveOrUpdateImageGallery(imageGallery); + + title = igService.generateNextImageTitle(nextImageTitleNumber); + } + image.setTitle(title); + + image.setDescription(imageGalleryItemForm.getDescription()); + image.setHide(false); + igService.saveOrUpdateImageGalleryItem(image); + + String redirect = "redirect:monitoring/summary.do"; + redirect = WebUtil.appendParameterToURL(redirect, ImageGalleryConstants.ATTR_TOOL_CONTENT_ID, + contentId.toString()); + String contentFolderID = (String) sessionMap.get(AttributeNames.PARAM_CONTENT_FOLDER_ID); + redirect = WebUtil.appendParameterToURL(redirect, AttributeNames.PARAM_CONTENT_FOLDER_ID, contentFolderID); + return redirect; + } + + /** + * Toggle image visibility, i.e. set its hide field to the opposite of the current value + */ + @RequestMapping("/toggleImageVisibility") + public String toggleImageVisibility(HttpServletRequest request) { + + Long itemUid = WebUtil.readLongParam(request, ImageGalleryConstants.PARAM_IMAGE_UID); + String sessionMapID = WebUtil.readStrParam(request, ImageGalleryConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapID); + Long contentId = (Long) sessionMap.get(ImageGalleryConstants.ATTR_TOOL_CONTENT_ID); + igService.toggleImageVisibility(itemUid, contentId); + + return null; + } + + @RequestMapping("/viewReflection") + public String viewReflection(HttpServletRequest request) { + + Long uid = WebUtil.readLongParam(request, ImageGalleryConstants.ATTR_USER_UID); + Long sessionID = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_SESSION_ID); + + ImageGalleryUser user = igService.getUser(uid); + NotebookEntry notebookEntry = igService.getEntry(sessionID, CoreNotebookConstants.NOTEBOOK_TOOL, + ImageGalleryConstants.TOOL_SIGNATURE, user.getUserId().intValue()); + + ImageGallerySession session = igService.getImageGallerySessionBySessionId(sessionID); + + ReflectDTO refDTO = new ReflectDTO(user); + if (notebookEntry == null) { + refDTO.setFinishReflection(false); + refDTO.setReflect(null); + } else { + refDTO.setFinishReflection(true); + refDTO.setReflect(notebookEntry.getEntry()); + } + refDTO.setReflectInstrctions(session.getImageGallery().getReflectInstructions()); + + request.setAttribute("userDTO", refDTO); + return "pages/monitoring/notebook"; + } + +} Index: lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/form/ImageGalleryItemForm.java =================================================================== diff -u -rc0799c23f6d6b6be5ca5b740b85c72e3cc89a5b1 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/form/ImageGalleryItemForm.java (.../ImageGalleryItemForm.java) (revision c0799c23f6d6b6be5ca5b740b85c72e3cc89a5b1) +++ lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/form/ImageGalleryItemForm.java (.../ImageGalleryItemForm.java) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -25,14 +25,15 @@ import org.apache.struts.action.ActionForm; import org.apache.struts.upload.FormFile; +import org.springframework.web.multipart.MultipartFile; /** * ImageGallery Item Form. * * * @author Andrey Balan */ -public class ImageGalleryItemForm extends ActionForm { +public class ImageGalleryItemForm { private String imageIndex; private String sessionMapID; @@ -45,7 +46,7 @@ private boolean hasFile; private Long fileUuid; private String fileName; - private FormFile file; + private MultipartFile file; //used only in monitoring private String imageUid; @@ -125,11 +126,11 @@ this.hasFile = hasFile; } - public FormFile getFile() { + public MultipartFile getFile() { return file; } - public void setFile(FormFile file) { + public void setFile(MultipartFile file) { this.file = file; } Index: lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/form/MultipleImagesForm.java =================================================================== diff -u -rc0799c23f6d6b6be5ca5b740b85c72e3cc89a5b1 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/form/MultipleImagesForm.java (.../MultipleImagesForm.java) (revision c0799c23f6d6b6be5ca5b740b85c72e3cc89a5b1) +++ lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/web/form/MultipleImagesForm.java (.../MultipleImagesForm.java) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -25,14 +25,15 @@ import org.apache.struts.action.ActionForm; import org.apache.struts.upload.FormFile; +import org.springframework.web.multipart.MultipartFile; /** * Multiple Images Form. * * * @author Andrey Balan */ -public class MultipleImagesForm extends ActionForm { +public class MultipleImagesForm { private static final long serialVersionUID = -5595679171112282994L; @@ -42,11 +43,11 @@ private boolean hasFile; private Long fileUuid; private String fileName; - private FormFile file1; - private FormFile file2; - private FormFile file3; - private FormFile file4; - private FormFile file5; + private MultipartFile file1; + private MultipartFile file2; + private MultipartFile file3; + private MultipartFile file4; + private MultipartFile file5; //used only in monitoring private String imageUid; @@ -83,43 +84,43 @@ this.hasFile = hasFile; } - public FormFile getFile1() { + public MultipartFile getFile1() { return file1; } - public void setFile1(FormFile file) { + public void setFile1(MultipartFile file) { this.file1 = file; } - public FormFile getFile2() { + public MultipartFile getFile2() { return file2; } - public void setFile2(FormFile file) { + public void setFile2(MultipartFile file) { this.file2 = file; } - public FormFile getFile3() { + public MultipartFile getFile3() { return file3; } - public void setFile3(FormFile file) { + public void setFile3(MultipartFile file) { this.file3 = file; } - public FormFile getFile4() { + public MultipartFile getFile4() { return file4; } - public void setFile4(FormFile file) { + public void setFile4(MultipartFile file) { this.file4 = file; } - public FormFile getFile5() { + public MultipartFile getFile5() { return file5; } - public void setFile5(FormFile file) { + public void setFile5(MultipartFile file) { this.file5 = file; } Index: lams_tool_images/web/WEB-INF/spring-servlet.xml =================================================================== diff -u --- lams_tool_images/web/WEB-INF/spring-servlet.xml (revision 0) +++ lams_tool_images/web/WEB-INF/spring-servlet.xml (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file Index: lams_tool_images/web/WEB-INF/tags/AuthoringButton.tag =================================================================== diff -u -r67dcb9996bea686f86b32184b900f6aa36fd11f0 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/WEB-INF/tags/AuthoringButton.tag (.../AuthoringButton.tag) (revision 67dcb9996bea686f86b32184b900f6aa36fd11f0) +++ lams_tool_images/web/WEB-INF/tags/AuthoringButton.tag (.../AuthoringButton.tag) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -32,7 +32,6 @@ <%@ tag body-content="scriptless" %> <%@ taglib uri="tags-core" prefix="c" %> <%@ taglib uri="tags-fmt" prefix="fmt" %> -<%@ taglib uri="tags-html" prefix="html" %> <%@ taglib uri="tags-lams" prefix="lams"%> <%@ attribute name="formID" required="true" rtexprvalue="true" %> @@ -123,11 +122,11 @@ } \ No newline at end of file Index: lams_tool_images/web/WEB-INF/tags/AuthoringRatingAllStyleCriteria.tag =================================================================== diff -u -r540199b8a30f643c2ca5960c007e5bef74acd397 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/WEB-INF/tags/AuthoringRatingAllStyleCriteria.tag (.../AuthoringRatingAllStyleCriteria.tag) (revision 540199b8a30f643c2ca5960c007e5bef74acd397) +++ lams_tool_images/web/WEB-INF/tags/AuthoringRatingAllStyleCriteria.tag (.../AuthoringRatingAllStyleCriteria.tag) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -8,7 +8,6 @@ <%@ tag body-content="scriptless" %> <%@ taglib uri="tags-core" prefix="c" %> <%@ taglib uri="tags-fmt" prefix="fmt" %> -<%@ taglib uri="tags-html" prefix="html" %> <%@ taglib uri="tags-lams" prefix="lams"%> <%@ taglib uri="tags-function" prefix="fn" %> Index: lams_tool_images/web/WEB-INF/tags/AuthoringRatingCriteria.tag =================================================================== diff -u -rd0e3c313150d5acf57b8a3dfe83db0506dc24e6c -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/WEB-INF/tags/AuthoringRatingCriteria.tag (.../AuthoringRatingCriteria.tag) (revision d0e3c313150d5acf57b8a3dfe83db0506dc24e6c) +++ lams_tool_images/web/WEB-INF/tags/AuthoringRatingCriteria.tag (.../AuthoringRatingCriteria.tag) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -8,7 +8,6 @@ <%@ tag body-content="scriptless" %> <%@ taglib uri="tags-core" prefix="c" %> <%@ taglib uri="tags-fmt" prefix="fmt" %> -<%@ taglib uri="tags-html" prefix="html" %> <%@ taglib uri="tags-lams" prefix="lams"%> <%@ taglib uri="tags-function" prefix="fn" %> @@ -284,42 +283,42 @@ - - + + - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + - - + + - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + Index: lams_tool_images/web/WEB-INF/tags/CommentsAuthor.tag =================================================================== diff -u -r500ae45f4243aa718eac7436bc903b4f137a3aa7 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/WEB-INF/tags/CommentsAuthor.tag (.../CommentsAuthor.tag) (revision 500ae45f4243aa718eac7436bc903b4f137a3aa7) +++ lams_tool_images/web/WEB-INF/tags/CommentsAuthor.tag (.../CommentsAuthor.tag) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -42,23 +42,21 @@
-     -   +     +  
Index: lams_tool_images/web/WEB-INF/tags/Page.tag =================================================================== diff -u -rb32cbfc76a3cd150823b3696160d5fd4fa6cde84 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/WEB-INF/tags/Page.tag (.../Page.tag) (revision b32cbfc76a3cd150823b3696160d5fd4fa6cde84) +++ lams_tool_images/web/WEB-INF/tags/Page.tag (.../Page.tag) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -4,6 +4,7 @@ <%@ taglib uri="tags-lams" prefix="lams"%> <%@ attribute name="type" required="true" rtexprvalue="true"%> +<%@ attribute name="formID" required="false" rtexprvalue="true"%> <%@ attribute name="style" required="false" rtexprvalue="true"%> <%@ attribute name="title" required="false" rtexprvalue="true"%> <%@ attribute name="titleHelpURL" required="false" rtexprvalue="true"%> @@ -88,8 +89,8 @@ - - + + ${toolForm.toolSessionID} @@ -434,4 +435,4 @@
- + \ No newline at end of file Index: lams_tool_images/web/WEB-INF/tags/Rating.tag =================================================================== diff -u -r35a96de80ddf8f88a34d7f75eaf71748db934044 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 35a96de80ddf8f88a34d7f75eaf71748db934044) +++ lams_tool_images/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -8,7 +8,6 @@ <%@ tag body-content="scriptless" %> <%@ taglib uri="tags-core" prefix="c" %> <%@ taglib uri="tags-fmt" prefix="fmt" %> -<%@ taglib uri="tags-html" prefix="html" %> <%@ taglib uri="tags-lams" prefix="lams"%> <%@ taglib uri="tags-function" prefix="fn" %> Index: lams_tool_images/web/WEB-INF/tags/StyledRating.tag =================================================================== diff -u -refa51a5d0464d96fada4e5a70f1fb86c2d726717 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/WEB-INF/tags/StyledRating.tag (.../StyledRating.tag) (revision efa51a5d0464d96fada4e5a70f1fb86c2d726717) +++ lams_tool_images/web/WEB-INF/tags/StyledRating.tag (.../StyledRating.tag) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -8,7 +8,6 @@ <%@ tag body-content="scriptless" %> <%@ taglib uri="tags-core" prefix="c" %> <%@ taglib uri="tags-fmt" prefix="fmt" %> -<%@ taglib uri="tags-html" prefix="html" %> <%@ taglib uri="tags-lams" prefix="lams"%> <%@ taglib uri="tags-function" prefix="fn" %> Index: lams_tool_images/web/WEB-INF/tags/TabBody.tag =================================================================== diff -u -r36e474218e1201198ba926e57e56c7a885db1a9f -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/WEB-INF/tags/TabBody.tag (.../TabBody.tag) (revision 36e474218e1201198ba926e57e56c7a885db1a9f) +++ lams_tool_images/web/WEB-INF/tags/TabBody.tag (.../TabBody.tag) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -34,7 +34,6 @@ <%@ attribute name="titleKey" required="false" rtexprvalue="true"%> <%@ attribute name="page" required="false" rtexprvalue="true"%> <%@ taglib uri="tags-core" prefix="c"%> -<%@ taglib uri="tags-bean" prefix="bean"%> Index: lams_tool_images/web/WEB-INF/tags/TabBodyArea.tag =================================================================== diff -u -r60ab803bf843562083cfb66764ddfcb3b0a83841 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/WEB-INF/tags/TabBodyArea.tag (.../TabBodyArea.tag) (revision 60ab803bf843562083cfb66764ddfcb3b0a83841) +++ lams_tool_images/web/WEB-INF/tags/TabBodyArea.tag (.../TabBodyArea.tag) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -30,7 +30,6 @@ %> <%@ taglib uri="tags-core" prefix="c"%> -<%@ taglib uri="tags-bean" prefix="bean"%>
Index: lams_tool_images/web/WEB-INF/tags/TextSearch.tag =================================================================== diff -u -r08a45e4407f4200f34653a91d402ac4ad2f43f50 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/WEB-INF/tags/TextSearch.tag (.../TextSearch.tag) (revision 08a45e4407f4200f34653a91d402ac4ad2f43f50) +++ lams_tool_images/web/WEB-INF/tags/TextSearch.tag (.../TextSearch.tag) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -32,12 +32,11 @@ <%@ tag body-content="scriptless" %> <%@ taglib uri="tags-core" prefix="c" %> <%@ taglib uri="tags-fmt" prefix="fmt" %> -<%@ taglib uri="tags-html" prefix="html" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> <%@ taglib uri="tags-lams" prefix="lams" %> <%-- Required attributes --%> <%@ attribute name="sessionMapID" required="true" rtexprvalue="true" %> -<%@ attribute name="wrapInFormTag" required="true" rtexprvalue="true" %> <%-- Optional attributes --%> <%@ attribute name="action" required="false" rtexprvalue="true" %> @@ -53,10 +52,10 @@ <%-- Default value for message key --%> - + - + @@ -85,52 +84,40 @@ - -
- - -

- - - - - - - - - - - - - - - - - -
- - - -
- - - -
- - - -
- - - -
- - - - - - - - - + +

+ + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
\ No newline at end of file Fisheye: Tag 9c66807dec11ccfe2299008ded08091f487a3478 refers to a dead (removed) revision in file `lams_tool_images/web/WEB-INF/validation.xml'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_tool_images/web/WEB-INF/web.xml =================================================================== diff -u -rac280c8fb2043ec90a0b7756ede0c7ab64c089d8 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/WEB-INF/web.xml (.../web.xml) (revision ac280c8fb2043ec90a0b7756ede0c7ab64c089d8) +++ lams_tool_images/web/WEB-INF/web.xml (.../web.xml) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -72,27 +72,12 @@ /* - - action - org.apache.struts.action.ActionServlet - - config - /WEB-INF/struts-config.xml - - - debug - 999 - - - detail - 1 - - - validate - true - - 2 + spring + + org.springframework.web.servlet.DispatcherServlet + + 1 @@ -123,7 +108,7 @@ - action + spring *.do Index: lams_tool_images/web/common/header.jsp =================================================================== diff -u -ra83b0eec89979dce7415b02afdda324b14018dbb -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/common/header.jsp (.../header.jsp) (revision a83b0eec89979dce7415b02afdda324b14018dbb) +++ lams_tool_images/web/common/header.jsp (.../header.jsp) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -8,7 +8,7 @@ - + Index: lams_tool_images/web/common/messages.jsp =================================================================== diff -u -r60ab803bf843562083cfb66764ddfcb3b0a83841 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/common/messages.jsp (.../messages.jsp) (revision 60ab803bf843562083cfb66764ddfcb3b0a83841) +++ lams_tool_images/web/common/messages.jsp (.../messages.jsp) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -1,8 +1,10 @@ -<%-- Error Messages --%> - - - -
-
-
-
\ No newline at end of file + <%@include file="/common/taglibs.jsp"%> + + + + + + + + + Index: lams_tool_images/web/common/tabbedheader.jsp =================================================================== diff -u -ra83b0eec89979dce7415b02afdda324b14018dbb -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/common/tabbedheader.jsp (.../tabbedheader.jsp) (revision a83b0eec89979dce7415b02afdda324b14018dbb) +++ lams_tool_images/web/common/tabbedheader.jsp (.../tabbedheader.jsp) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -11,4 +11,4 @@ - + Index: lams_tool_images/web/common/taglibs.jsp =================================================================== diff -u -r9d26aaf34391eb58df037978365deda31de85c1b -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/common/taglibs.jsp (.../taglibs.jsp) (revision 9d26aaf34391eb58df037978365deda31de85c1b) +++ lams_tool_images/web/common/taglibs.jsp (.../taglibs.jsp) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -7,5 +7,5 @@ <%@ taglib uri="tags-fmt" prefix="fmt" %> <%@ taglib uri="tags-xml" prefix="x" %> <%@ taglib uri="tags-lams" prefix="lams" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> - Index: lams_tool_images/web/pages/admin/config.jsp =================================================================== diff -u -rcc63e2ea34059e1e91f401e61b58d2b6b9e7d00d -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/pages/admin/config.jsp (.../config.jsp) (revision cc63e2ea34059e1e91f401e61b58d2b6b9e7d00d) +++ lams_tool_images/web/pages/admin/config.jsp (.../config.jsp) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -12,7 +12,7 @@ - + @@ -24,16 +24,16 @@
- + + + @@ -42,12 +42,12 @@ + +
- -
- -
- -
+ " class="btn btn-primary pull-right"/> + Index: lams_tool_images/web/pages/authoring/advance.jsp =================================================================== diff -u -r91b889b2799b29b15df18c661e46cd1532eb5251 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/pages/authoring/advance.jsp (.../advance.jsp) (revision 91b889b2799b29b15df18c661e46cd1532eb5251) +++ lams_tool_images/web/pages/authoring/advance.jsp (.../advance.jsp) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -31,32 +31,31 @@ } - - +
@@ -67,8 +66,8 @@
@@ -77,19 +76,19 @@
- display:none; + display:none; + id="${styleId}"/>
@@ -99,20 +98,20 @@
- +
Index: lams_tool_images/web/pages/authoring/authoring.jsp =================================================================== diff -u -r50551b789065b93152949df172cb9c718962697e -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/pages/authoring/authoring.jsp (.../authoring.jsp) (revision 50551b789065b93152949df172cb9c718962697e) +++ lams_tool_images/web/pages/authoring/authoring.jsp (.../authoring.jsp) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -22,7 +22,7 @@ var LABEL_MAX_FILE_SIZE = ''; var LABEL_NOT_ALLOWED_FORMAT = ''; - + - + - - + + - + - + - - - + + + <%@ include file="/common/messages.jsp"%>

- + - +
@@ -44,9 +44,9 @@
-
+ -
+ Index: lams_tool_images/web/pages/learning/parts/commentsarea.jsp =================================================================== diff -u -r942b2a5bf6dac160bf9e00bac22e6232ae65ef98 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/pages/learning/parts/commentsarea.jsp (.../commentsarea.jsp) (revision 942b2a5bf6dac160bf9e00bac22e6232ae65ef98) +++ lams_tool_images/web/pages/learning/parts/commentsarea.jsp (.../commentsarea.jsp) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -33,7 +33,7 @@ - + - - + + Index: lams_tool_images/web/pages/monitoring/summary.jsp =================================================================== diff -u -r729f1d10a1efd78ec420b373a7af23ee66ec3454 -r9c66807dec11ccfe2299008ded08091f487a3478 --- lams_tool_images/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision 729f1d10a1efd78ec420b373a7af23ee66ec3454) +++ lams_tool_images/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision 9c66807dec11ccfe2299008ded08091f487a3478) @@ -99,7 +99,7 @@ - ${image.thumbnailFileUuid}&preferDownload=false + download/?uuid=${image.thumbnailFileUuid}&preferDownload=false ?sessionMapID=${sessionMapID}&imageUid=${image.uid}&toolSessionID=${sessionId}&KeepThis=true&TB_iframe=true&modal=true @@ -218,9 +218,9 @@ - + - + @@ -244,7 +244,7 @@
-