From b71e2579f0eb7d639ddcbbb63199e5bf656aba35 Mon Sep 17 00:00:00 2001 From: shiv12095 Date: Mon, 15 Aug 2016 22:58:52 +0530 Subject: [PATCH] Added checks to prevent duplicateresources from being created Signed-off-by: shiv12095 --- .../devtool/controller/ProjectController.java | 51 +++++++++++++++-- ...ProjectResourceAlreadyExistsException.java | 5 ++ .../service/IProjectRepositoryService.java | 7 ++- .../impl/ProjectRepositoryServiceImpl.java | 46 +++++++++++---- .../resources/static/dist/js/controllers.js | 57 +++++++++++-------- 5 files changed, 124 insertions(+), 42 deletions(-) create mode 100644 server/devtool/src/main/java/org/eclipse/vorto/server/devtool/exception/ProjectResourceAlreadyExistsException.java diff --git a/server/devtool/src/main/java/org/eclipse/vorto/server/devtool/controller/ProjectController.java b/server/devtool/src/main/java/org/eclipse/vorto/server/devtool/controller/ProjectController.java index f8266a8626..f2929a2d80 100644 --- a/server/devtool/src/main/java/org/eclipse/vorto/server/devtool/controller/ProjectController.java +++ b/server/devtool/src/main/java/org/eclipse/vorto/server/devtool/controller/ProjectController.java @@ -8,6 +8,7 @@ import org.eclipse.vorto.editor.web.resource.WebEditorResourceSetProvider; import org.eclipse.vorto.server.devtool.exception.ProjectAlreadyExistsException; import org.eclipse.vorto.server.devtool.exception.ProjectNotFoundException; +import org.eclipse.vorto.server.devtool.exception.ProjectResourceAlreadyExistsException; import org.eclipse.vorto.server.devtool.models.Project; import org.eclipse.vorto.server.devtool.models.ProjectResource; import org.eclipse.vorto.server.devtool.service.IProjectRepositoryService; @@ -48,6 +49,12 @@ public void handleProjectNotFoundException() { @ExceptionHandler(ProjectAlreadyExistsException.class) public void handleProjectAlreadyExistsException() { + } + + @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "Resource already exists") + @ExceptionHandler(ProjectResourceAlreadyExistsException.class) + public void handleProjectResourceAlreadyExistsException() { + } @ApiOperation(value = "Checks whether a Vorto project already exists") @@ -63,6 +70,30 @@ public void checkProjectExists( projectRepositoryService.checkProjectExists(sessionId, projectName); } + + @ApiOperation(value = "Checks whether a resource exists within the Vorto project") + @RequestMapping(value = "/{projectName}/resources/check/{namespace}/{name}/{version:.+}", method = RequestMethod.GET) + public void checkResourceExists( + @ApiParam(value = "ProjectName", required = true) final @PathVariable String projectName, + @ApiParam(value = "Namespace", required = true) final @PathVariable String namespace, + @ApiParam(value = "Name", required = true) final @PathVariable String name, + @ApiParam(value = "Version", required = true) final @PathVariable String version, + @ApiParam(value = "Request", required = true) final HttpServletRequest request) + throws ProjectNotFoundException, ProjectAlreadyExistsException, ProjectResourceAlreadyExistsException { + + Objects.requireNonNull(projectName, "projectName must not be null"); + Objects.requireNonNull(namespace, "namespace must not be null"); + Objects.requireNonNull(name, "namespace must not be null"); + Objects.requireNonNull(version, "namespace must not be null"); + String sessionId = request.getSession().getId(); + + ProjectResource projectResource = new ProjectResource(); + projectResource.setName(name); + projectResource.setNamespace(namespace); + projectResource.setVersion(version); + + projectRepositoryService.checkResourceExists(sessionId, projectName, projectResource); + } @ApiOperation(value = "Creates a new Vorto project") @RequestMapping(method = RequestMethod.POST) @@ -112,17 +143,27 @@ public ArrayList getProjects(final HttpServletRequest request) { } @ApiOperation(value = "Deletes the resource in the Vorto project") - @RequestMapping(value = "/{projectName}/resources/delete/{resourceId}/", method = RequestMethod.GET) + @RequestMapping(value = "/{projectName}/resources/delete/{namespace}/{name}/{version:.+}", method = RequestMethod.GET) public void deleteProjectResource( @ApiParam(value = "ProjectName", required = true) final @PathVariable String projectName, - @ApiParam(value = "ResourceId", required = true) final @PathVariable String resourceId, + @ApiParam(value = "Namespace", required = true) final @PathVariable String namespace, + @ApiParam(value = "Name", required = true) final @PathVariable String name, + @ApiParam(value = "Version", required = true) final @PathVariable String version, @ApiParam(value = "Request", required = true) final HttpServletRequest request) throws ProjectNotFoundException { Objects.requireNonNull(projectName, "projectName must not be null"); - Objects.requireNonNull(resourceId, "resourceId must not be null"); + Objects.requireNonNull(namespace, "namespace must not be null"); + Objects.requireNonNull(name, "namespace must not be null"); + Objects.requireNonNull(version, "namespace must not be null"); String sessionId = request.getSession().getId(); - projectRepositoryService.deleteResource(sessionId, projectName, resourceId); + + ProjectResource projectResource = new ProjectResource(); + projectResource.setName(name); + projectResource.setNamespace(namespace); + projectResource.setVersion(version); + + projectRepositoryService.deleteResource(sessionId, projectName, projectResource); } @ApiOperation(value = "Creates a new resource in the Vorto project") @@ -131,7 +172,7 @@ public void createProjectResource( @RequestBody ProjectResource projectResoure, @ApiParam(value = "ProjectName", required = true) final @PathVariable String projectName, @ApiParam(value = "Request", required = true) final HttpServletRequest request) - throws ProjectNotFoundException { + throws ProjectNotFoundException, ProjectResourceAlreadyExistsException { Objects.requireNonNull(projectName, "projectName must not be null"); String sessionId = request.getSession().getId(); diff --git a/server/devtool/src/main/java/org/eclipse/vorto/server/devtool/exception/ProjectResourceAlreadyExistsException.java b/server/devtool/src/main/java/org/eclipse/vorto/server/devtool/exception/ProjectResourceAlreadyExistsException.java new file mode 100644 index 0000000000..ded011fcd5 --- /dev/null +++ b/server/devtool/src/main/java/org/eclipse/vorto/server/devtool/exception/ProjectResourceAlreadyExistsException.java @@ -0,0 +1,5 @@ +package org.eclipse.vorto.server.devtool.exception; + +public class ProjectResourceAlreadyExistsException extends Exception{ + +} diff --git a/server/devtool/src/main/java/org/eclipse/vorto/server/devtool/service/IProjectRepositoryService.java b/server/devtool/src/main/java/org/eclipse/vorto/server/devtool/service/IProjectRepositoryService.java index 2cfbc5424d..a48895386e 100644 --- a/server/devtool/src/main/java/org/eclipse/vorto/server/devtool/service/IProjectRepositoryService.java +++ b/server/devtool/src/main/java/org/eclipse/vorto/server/devtool/service/IProjectRepositoryService.java @@ -4,6 +4,7 @@ import org.eclipse.vorto.server.devtool.exception.ProjectAlreadyExistsException; import org.eclipse.vorto.server.devtool.exception.ProjectNotFoundException; +import org.eclipse.vorto.server.devtool.exception.ProjectResourceAlreadyExistsException; import org.eclipse.vorto.server.devtool.models.Project; import org.eclipse.vorto.server.devtool.models.ProjectResource; @@ -11,6 +12,8 @@ public interface IProjectRepositoryService { void checkProjectExists(String sessionId, String projectName) throws ProjectAlreadyExistsException; + void checkResourceExists(String sessionId, String projectName, ProjectResource projectResource) throws ProjectAlreadyExistsException, ProjectResourceAlreadyExistsException, ProjectNotFoundException; + Project createProject(String sessionId, String projectName) throws ProjectAlreadyExistsException; Project openProject(String sessionId, String projectName) throws ProjectNotFoundException; @@ -19,7 +22,7 @@ public interface IProjectRepositoryService { ArrayList getProjectResources(String sessionId, String projectName) throws ProjectNotFoundException; - void createResource(String sessionId, String projectName, ProjectResource projectResource) throws ProjectNotFoundException; + void createResource(String sessionId, String projectName, ProjectResource projectResource) throws ProjectNotFoundException, ProjectResourceAlreadyExistsException; - void deleteResource(String sessionId, String projectName, String resourceId) throws ProjectNotFoundException; + void deleteResource(String sessionId, String projectName, ProjectResource projectResource) throws ProjectNotFoundException; } diff --git a/server/devtool/src/main/java/org/eclipse/vorto/server/devtool/service/impl/ProjectRepositoryServiceImpl.java b/server/devtool/src/main/java/org/eclipse/vorto/server/devtool/service/impl/ProjectRepositoryServiceImpl.java index 15b7c91003..9dc3130cb5 100644 --- a/server/devtool/src/main/java/org/eclipse/vorto/server/devtool/service/impl/ProjectRepositoryServiceImpl.java +++ b/server/devtool/src/main/java/org/eclipse/vorto/server/devtool/service/impl/ProjectRepositoryServiceImpl.java @@ -9,6 +9,7 @@ import org.eclipse.vorto.editor.web.resource.WebEditorResourceSetProvider; import org.eclipse.vorto.server.devtool.exception.ProjectAlreadyExistsException; import org.eclipse.vorto.server.devtool.exception.ProjectNotFoundException; +import org.eclipse.vorto.server.devtool.exception.ProjectResourceAlreadyExistsException; import org.eclipse.vorto.server.devtool.models.Project; import org.eclipse.vorto.server.devtool.models.ProjectResource; import org.eclipse.vorto.server.devtool.service.IProjectRepositoryService; @@ -34,7 +35,16 @@ public void checkProjectExists(String sessionId, String projectName) throws Proj throw new ProjectAlreadyExistsException(); } } - + + @Override + public void checkResourceExists(String sessionId, String projectName, ProjectResource projectResource) + throws ProjectAlreadyExistsException, ProjectResourceAlreadyExistsException, ProjectNotFoundException { + Project project = openProject(sessionId, projectName); + if(project.getResourceList().contains(projectResource)){ + throw new ProjectResourceAlreadyExistsException(); + } + } + @Override public Project createProject(String sessionId, String projectName) throws ProjectAlreadyExistsException { WebEditorResourceSetProvider webEditorResourceSetProvider = (WebEditorResourceSetProvider) injector.getInstance(IWebResourceSetProvider.class); @@ -77,21 +87,37 @@ public ArrayList getProjects(String sessionId) { } @Override - public void createResource(String sessionId, String projectName, ProjectResource projectResource) throws ProjectNotFoundException { + public void createResource(String sessionId, String projectName, ProjectResource projectResource) throws ProjectNotFoundException, ProjectResourceAlreadyExistsException { Project project = openProject(sessionId, projectName); ArrayList resourceList = project.getResourceList(); + if(resourceList.contains(projectResource)){ + throw new ProjectResourceAlreadyExistsException(); + } resourceList.add(projectResource); } @Override - public void deleteResource(String sessionId, String projectName, String resourceId) throws ProjectNotFoundException { + public void deleteResource(String sessionId, String projectName, ProjectResource projectResource) throws ProjectNotFoundException { Project project = openProject(sessionId, projectName) ; - URI uri = URI.createURI(resourceId); - ResourceSet resourceSet = project.getResourceSet(); - Resource resource = resourceSet.getResource(uri, true); - resourceSet.getResources().remove(resource); - ProjectResource projectResource = new ProjectResource(); - projectResource.setResourceId(resourceId); - project.getResourceList().remove(projectResource); + ProjectResource pResource = getProjectResource(projectResource, project.getResourceList()); + if(pResource != null){ + String resourceId = pResource.getResourceId(); + URI uri = URI.createURI(resourceId); + ResourceSet resourceSet = project.getResourceSet(); + Resource resource = resourceSet.getResource(uri, true); + resourceSet.getResources().remove(resource); + projectResource.setResourceId(resourceId); + project.getResourceList().remove(projectResource); + } + } + + private ProjectResource getProjectResource(ProjectResource projectResource, ArrayList resourceList){ + for(ProjectResource pResource : resourceList){ + if(pResource.equals(projectResource)){ + return pResource; + } + } + return null; } + } \ No newline at end of file diff --git a/server/devtool/src/main/resources/static/dist/js/controllers.js b/server/devtool/src/main/resources/static/dist/js/controllers.js index f40608b044..1e632764c5 100644 --- a/server/devtool/src/main/resources/static/dist/js/controllers.js +++ b/server/devtool/src/main/resources/static/dist/js/controllers.js @@ -65,7 +65,7 @@ define(["angular"], function(angular) { }); $scope.$on("deleteEditor", function(event, tab) { - var url = './project/' + $scope.projectName + '/resources/delete/' + tab.resourceId + '/'; + var url = './project/' + $scope.projectName + '/resources/delete/' + tab.namespace + '/' + tab.name + '/' + tab.version; $http.get(url).success( function(data, status, headers, config) { $scope.deleteTab(tab.index); @@ -151,28 +151,33 @@ define(["angular"], function(angular) { } $scope.addEditor = function(model) { - $scope.counter++; - var tabId = $scope.counter; - var editorParentDivId = "xtext-editor-parent-" + tabId; - var editorDivId = "xtext-editor-" + tabId; - var tab = { - id: tabId, - editorParentDivId: editorParentDivId, - editorDivId: editorDivId, - language: model.language, - name: model.name, - }; - $scope.tabs.push(tab); - $scope.selectedTabIndex = $scope.tabs.length - 1; - $scope.selectedTabId = $scope.tabs[$scope.selectedTabIndex]['id']; - var element = angular.element(document).find('#editors'); - element.append('
'); - $compile(element.contents())($scope); - if (model.language == 'infomodel') { - $scope.addInfoModelEditor(editorDivId, model); - } else if (model.language == 'fbmodel') { - $scope.addFunctionBlockEditor(editorDivId, model); - } + $http.get('./project/' + $scope.projectName + '/resources/check/' + model.namespace + '/' + model.name + '/' + model.version).success( + function(data, status, headers, config) { + $scope.counter++; + var tabId = $scope.counter; + var editorParentDivId = "xtext-editor-parent-" + tabId; + var editorDivId = "xtext-editor-" + tabId; + var tab = { + id: tabId, + editorParentDivId: editorParentDivId, + editorDivId: editorDivId, + language: model.language, + name: model.name, + }; + $scope.tabs.push(tab); + $scope.selectedTabIndex = $scope.tabs.length - 1; + $scope.selectedTabId = $scope.tabs[$scope.selectedTabIndex]['id']; + var element = angular.element(document).find('#editors'); + element.append('
'); + $compile(element.contents())($scope); + if (model.language == 'infomodel') { + $scope.addInfoModelEditor(editorDivId, model); + } else if (model.language == 'fbmodel') { + $scope.addFunctionBlockEditor(editorDivId, model); + } + }).error(function(data, status, headers, config) { + window.alert('File already exists') + }); } $scope.generateInfoModelContent = function(model) { @@ -221,7 +226,9 @@ define(["angular"], function(angular) { "version": model.version, "namespace": model.namespace }).success( - function(data, status, headers, config) {}).error(function(data, status, headers, config) {}); + function(data, status, headers, config) {}).error(function(data, status, headers, config) { + window.alert('File already exists') + }); }); }); } @@ -247,7 +254,7 @@ define(["angular"], function(angular) { tab['resourceId'] = resourceId; tab['name'] = model.name; tab['version'] = model.version; - tab['namespace'] = model.namespace; + tab['namespace'] = model.namespace; $http.post('./project/' + $scope.projectName + '/resources/create', { "name": model.name, "resourceId": resourceId,