diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/BaseController.java b/rest-api/src/main/java/lcsb/mapviewer/api/BaseController.java index 5b22b3c2ed9e23c1ca61e6a1984ef102ac640fb7..d7f6e3c8fefb0e3c34f2e194d419d3534d431e8b 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/BaseController.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/BaseController.java @@ -1,5 +1,8 @@ package lcsb.mapviewer.api; +import java.util.HashMap; +import java.util.Map; + import org.apache.log4j.Logger; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -24,4 +27,5 @@ public abstract class BaseController { } } + } diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..d863d798008b0b1b1fc70fdcaf4b9e053b57f3b8 --- /dev/null +++ b/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java @@ -0,0 +1,12 @@ +package lcsb.mapviewer.api; + +import java.util.HashMap; +import java.util.Map; + +public abstract class BaseRestImpl { + protected Map<String, Object> okStatus() { + Map<String, Object> result = new HashMap<>(); + result.put("status", "OK"); + return result; + } +} diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/comment/CommentRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/comment/CommentRestImpl.java index 897af009a81639f9e91e60bfb0354c999a0d004e..ad9ae26a8b95e0c8f6dd675dfe01e4ecfebb4d8e 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/comment/CommentRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/comment/CommentRestImpl.java @@ -12,6 +12,7 @@ import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; +import lcsb.mapviewer.api.BaseRestImpl; import lcsb.mapviewer.api.QueryException; import lcsb.mapviewer.model.Project; import lcsb.mapviewer.model.map.Comment; @@ -30,7 +31,7 @@ import lcsb.mapviewer.services.search.data.ElementIdentifier.ElementIdentifierTy import lcsb.mapviewer.services.view.AuthenticationToken; @Transactional(value = "txManager") -public class CommentRestImpl { +public class CommentRestImpl extends BaseRestImpl { Logger logger = Logger.getLogger(CommentRestImpl.class); @@ -355,10 +356,7 @@ public class CommentRestImpl { } commentService.addComment(name, email, content, model, pointCoordinates, commentedObject, pinned, submodel); - // TODO Auto-generated method stub - Map<String, Object> result = new HashMap<>(); - result.put("status", "OK"); - return result; + return okStatus(); } } diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/overlay/OverlayController.java b/rest-api/src/main/java/lcsb/mapviewer/api/overlay/OverlayController.java index e4d019b82c5a7241fa105f4b8cc58c6b41a89d93..acacb46f3f9c07442fa2d2ad162f32b9a112f7ee 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/overlay/OverlayController.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/overlay/OverlayController.java @@ -1,5 +1,6 @@ package lcsb.mapviewer.api.overlay; +import java.io.IOException; import java.util.List; import java.util.Map; @@ -10,11 +11,13 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; import lcsb.mapviewer.api.BaseController; import lcsb.mapviewer.api.QueryException; import lcsb.mapviewer.model.cache.FileEntry; import lcsb.mapviewer.services.SecurityException; +import lcsb.mapviewer.services.utils.data.ColorSchemaType; import lcsb.mapviewer.services.view.LayoutView; @RestController @@ -24,19 +27,42 @@ public class OverlayController extends BaseController { @Autowired private OverlayRestImpl overlayController; - @RequestMapping(value = "/getOverlayList", method = { RequestMethod.GET, RequestMethod.POST }, produces = { MediaType.APPLICATION_JSON_VALUE }) + @RequestMapping(value = "/getOverlayList", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE }) public List<LayoutView> getOverlayList(@RequestParam(value = "token") String token, @RequestParam(value = "projectId") String projectId) throws SecurityException, QueryException { return overlayController.getOverlayList(token, projectId); } - @RequestMapping(value = "/getOverlayById", method = { RequestMethod.GET, RequestMethod.POST }, produces = { MediaType.APPLICATION_JSON_VALUE }) + @RequestMapping(value = "/getOverlayById", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE }) public LayoutView getOverlayById(@RequestParam(value = "token") String token, @RequestParam(value = "projectId") String projectId, @RequestParam(value = "overlayId") String overlayId) throws SecurityException, QueryException { return overlayController.getOverlayById(token, projectId, overlayId); } - @RequestMapping(value = "/getOverlaySource", method = { RequestMethod.GET, RequestMethod.POST }, produces = { MediaType.APPLICATION_JSON_VALUE }) + @RequestMapping(value = "/updateOverlay", method = { RequestMethod.GET, RequestMethod.PUT, RequestMethod.POST }, + produces = { MediaType.APPLICATION_JSON_VALUE }) + public Map<String, Object> updateOverlay(@RequestParam(value = "token") String token, @RequestParam(value = "projectId") String projectId, + @RequestParam(value = "overlayId") String overlayId, @RequestParam(value = "name") String name, @RequestParam(value = "description") String description) + throws SecurityException, QueryException { + return overlayController.updateOverlay(token, projectId, overlayId, name, description); + } + + @RequestMapping(value = "/addOverlay", method = { RequestMethod.GET, RequestMethod.POST }, produces = { MediaType.APPLICATION_JSON_VALUE }) + public Map<String, Object> addOverlay(@RequestParam(value = "token") String token, @RequestParam(value = "projectId") String projectId, + @RequestParam(value = "name") String name, @RequestParam(value = "description") String description, @RequestParam(value = "content") String content, + @RequestParam(value = "filename") String filename, @RequestParam(value = "type", defaultValue = "") String type) + throws SecurityException, QueryException, IOException { + return overlayController.addOverlay(token, projectId, name, description, content, filename, type); + } + + @RequestMapping(value = "/removeOverlay", method = { RequestMethod.GET, RequestMethod.DELETE, RequestMethod.POST }, + produces = { MediaType.APPLICATION_JSON_VALUE }) + public Map<String, Object> removeOverlay(@RequestParam(value = "token") String token, @RequestParam(value = "projectId") String projectId, + @RequestParam(value = "overlayId") String overlayId) throws SecurityException, QueryException, IOException { + return overlayController.removeOverlay(token, projectId, overlayId); + } + + @RequestMapping(value = "/getOverlaySource", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE }) public ResponseEntity<byte[]> getOverlaySource(@RequestParam(value = "token") String token, @RequestParam(value = "projectId") String projectId, @RequestParam(value = "overlayId") String overlayId) throws SecurityException, QueryException { diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/overlay/OverlayRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/overlay/OverlayRestImpl.java index b9b2ff2f9da1cf8d8edf524e6be3a7390e09cbf6..5e2003b1ce8af57d4fbfa039327b460a763bd42b 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/overlay/OverlayRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/overlay/OverlayRestImpl.java @@ -1,29 +1,43 @@ package lcsb.mapviewer.api.overlay; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; +import lcsb.mapviewer.api.BaseRestImpl; import lcsb.mapviewer.api.QueryException; +import lcsb.mapviewer.common.Configuration; import lcsb.mapviewer.model.cache.FileEntry; +import lcsb.mapviewer.model.map.layout.InvalidColorSchemaException; import lcsb.mapviewer.model.map.layout.Layout; import lcsb.mapviewer.model.map.model.Model; +import lcsb.mapviewer.model.user.User; +import lcsb.mapviewer.persist.dao.map.LayoutDao; import lcsb.mapviewer.services.SecurityException; import lcsb.mapviewer.services.interfaces.ILayoutService; +import lcsb.mapviewer.services.interfaces.ILayoutService.CreateLayoutParams; import lcsb.mapviewer.services.interfaces.IModelService; import lcsb.mapviewer.services.interfaces.IUserService; import lcsb.mapviewer.services.search.data.ElementIdentifier.ElementIdentifierType; import lcsb.mapviewer.services.search.layout.LightLayoutAliasView; import lcsb.mapviewer.services.search.layout.LightLayoutReactionView; +import lcsb.mapviewer.services.utils.data.ColorSchemaType; import lcsb.mapviewer.services.view.AuthenticationToken; import lcsb.mapviewer.services.view.LayoutView; @Transactional(value = "txManager") -public class OverlayRestImpl { +public class OverlayRestImpl extends BaseRestImpl { + + Logger logger = Logger.getLogger(OverlayRestImpl.class); @Autowired private IUserService userService; @@ -34,6 +48,9 @@ public class OverlayRestImpl { @Autowired private ILayoutService layoutService; + @Autowired + private LayoutDao layoutDao; + public List<LayoutView> getOverlayList(String token, String projectId) throws SecurityException, QueryException { AuthenticationToken authenticationToken = userService.getToken(token); Model model = modelService.getLastModelByProjectId(projectId, authenticationToken); @@ -141,7 +158,7 @@ public class OverlayRestImpl { if (layout == null) { throw new QueryException("Invalid overlay id"); } - //lazy initialization issue + // lazy initialization issue layout.getInputData().getFileContent(); return layout.getInputData(); } catch (NumberFormatException e) { @@ -149,4 +166,99 @@ public class OverlayRestImpl { } } + public Map<String, Object> updateOverlay(String token, String projectId, String overlayId, String name, String description) + throws QueryException, SecurityException { + AuthenticationToken authenticationToken = userService.getToken(token); + Model model = modelService.getLastModelByProjectId(projectId, authenticationToken); + if (model == null) { + throw new QueryException("Project with given id doesn't exist"); + } + try { + Integer id = Integer.valueOf(overlayId); + Layout layout = layoutService.getLayoutDataById(id, authenticationToken); + if (layout == null) { + throw new QueryException("Invalid overlay id"); + } + layout.setDescription(description); + layout.setTitle(name); + layoutDao.update(layout); + } catch (NumberFormatException e) { + throw new QueryException("Invalid overlay id"); + } + return okStatus(); + } + + public Map<String, Object> removeOverlay(String token, String projectId, String overlayId) throws QueryException, SecurityException, IOException { + AuthenticationToken authenticationToken = userService.getToken(token); + Model model = modelService.getLastModelByProjectId(projectId, authenticationToken); + if (model == null) { + throw new QueryException("Project with given id doesn't exist"); + } + try { + Integer id = Integer.valueOf(overlayId); + LayoutView layout = layoutService.getLayoutById(model, id, authenticationToken); + if (layout == null) { + throw new QueryException("Invalid overlay id"); + } + layoutService.removeLayout(layout, null); + } catch (NumberFormatException e) { + throw new QueryException("Invalid overlay id"); + } + return okStatus(); + } + + /** + * @return the layoutDao + * @see #layoutDao + */ + public LayoutDao getLayoutDao() { + return layoutDao; + } + + /** + * @param layoutDao + * the layoutDao to set + * @see #layoutDao + */ + public void setLayoutDao(LayoutDao layoutDao) { + this.layoutDao = layoutDao; + } + + public Map<String, Object> addOverlay(String token, String projectId, String name, String description, String content, String filename, String type) + throws SecurityException, QueryException, IOException { + AuthenticationToken authenticationToken = userService.getToken(token); + User user = userService.getUserByToken(token); + if (Configuration.ANONYMOUS_LOGIN.equals(user.getLogin())) { + throw new SecurityException("You have no privileges to add layout"); + } + Model model = modelService.getLastModelByProjectId(projectId, authenticationToken); + if (model == null) { + throw new QueryException("Project with given id doesn't exist"); + } + ColorSchemaType colorSchemaType = ColorSchemaType.GENERIC; + logger.debug("TYPE: \'" + type + "\'"); + if (type != null && !type.equals("")) { + try { + colorSchemaType = ColorSchemaType.valueOf(type); + } catch (IllegalArgumentException e) { + throw new QueryException("Invalid type of overlay: " + type, e); + } + } + + try { + InputStream stream = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8)); + + LayoutView layout = layoutService.createLayout( + new CreateLayoutParams() + .async(false).colorInputStream(stream).description(description).layoutFileName(filename).model(model).name(name).user(user) + .colorSchemaType(colorSchemaType).directory(".")); + Map<String, Object> result = okStatus(); + result.put("overlayId", layout.getIdObject()); + return result; + } catch (InvalidColorSchemaException e) { + throw new QueryException(e.getMessage(), e); + } + + } + } diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java index 6de79f3787d546a5f4729845781c602bcbc15d46..3b51f978aee1a29892a420968610af51d4c7f040 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java @@ -1039,6 +1039,9 @@ public class LayoutService implements ILayoutService { @Override public LayoutView getLayoutById(Model model, int overlayId, AuthenticationToken token) throws SecurityException { Layout layout = getLayoutById(overlayId, token); + if (layout == null) { + return null; + } return layoutViewFactory.create(layout); }