diff --git a/server/devtool/org.eclipse.vorto.editor.web/src/main/java/org/eclipse/vorto/editor/web/resource/FileResourceHandler.xtend b/server/devtool/org.eclipse.vorto.editor.web/src/main/java/org/eclipse/vorto/editor/web/resource/FileResourceHandler.xtend index cb71085b6b..da29581669 100644 --- a/server/devtool/org.eclipse.vorto.editor.web/src/main/java/org/eclipse/vorto/editor/web/resource/FileResourceHandler.xtend +++ b/server/devtool/org.eclipse.vorto.editor.web/src/main/java/org/eclipse/vorto/editor/web/resource/FileResourceHandler.xtend @@ -30,6 +30,7 @@ import org.eclipse.xtext.web.server.model.IWebDocumentProvider import org.eclipse.xtext.web.server.model.IWebResourceSetProvider import org.eclipse.xtext.web.server.model.IXtextWebDocument import org.eclipse.xtext.web.server.persistence.IServerResourceHandler +import org.eclipse.emf.common.notify.impl.NotificationChainImpl class FileResourceHandler implements IServerResourceHandler { @@ -69,6 +70,10 @@ class FileResourceHandler implements IServerResourceHandler { override put(IXtextWebDocument document, IServiceContext serviceContext) throws IOException { try { val uri = getFileURI(document.resourceId) + val resourceSet = resourceSetProvider.get(document.resourceId, serviceContext) + if(document.resource.resourceSet === null){ + document.resource.basicSetResourceSet(resourceSet, new NotificationChainImpl); + } val outputStream = document.resource.resourceSet.URIConverter.createOutputStream(uri) val writer = new OutputStreamWriter(outputStream, encodingProvider.getEncoding(uri)) writer.write(document.text) diff --git a/server/devtool/projectrepository-api/src/main/java/org/eclipse/vorto/devtool/projectrepository/IProjectRepositoryService.java b/server/devtool/projectrepository-api/src/main/java/org/eclipse/vorto/devtool/projectrepository/IProjectRepositoryService.java index 68349d829c..8ce6e3e5e5 100644 --- a/server/devtool/projectrepository-api/src/main/java/org/eclipse/vorto/devtool/projectrepository/IProjectRepositoryService.java +++ b/server/devtool/projectrepository-api/src/main/java/org/eclipse/vorto/devtool/projectrepository/IProjectRepositoryService.java @@ -17,6 +17,7 @@ import java.util.Map; import org.eclipse.vorto.devtool.projectrepository.model.FileResource; +import org.eclipse.vorto.devtool.projectrepository.model.FolderResource; import org.eclipse.vorto.devtool.projectrepository.model.ProjectResource; import org.eclipse.vorto.devtool.projectrepository.model.Resource; import org.eclipse.vorto.devtool.projectrepository.model.ResourceContent; @@ -98,6 +99,16 @@ public ProjectResource createProject(String projectName, String commitMessage) */ public void uploadResource(String commitComment, UploadHandle... handle); + /** + * Updates the old properties of the resource with the new properties + * + * @param folderResource + * The folderResource whose properties would be updated + * @param properties + * The properties of the resource that would be added / modified + */ + public void updateFolderResourceProperties(FolderResource folderResource, Map properties); + /** * Create a version of a project. * diff --git a/server/devtool/projectrepository-file/src/main/java/org/eclipse/vorto/devtool/projectrepository/file/ProjectRepositoryFileConstants.java b/server/devtool/projectrepository-file/src/main/java/org/eclipse/vorto/devtool/projectrepository/file/ProjectRepositoryFileConstants.java index c80024ed50..2105dac4b1 100644 --- a/server/devtool/projectrepository-file/src/main/java/org/eclipse/vorto/devtool/projectrepository/file/ProjectRepositoryFileConstants.java +++ b/server/devtool/projectrepository-file/src/main/java/org/eclipse/vorto/devtool/projectrepository/file/ProjectRepositoryFileConstants.java @@ -1,5 +1,9 @@ package org.eclipse.vorto.devtool.projectrepository.file; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + import org.eclipse.vorto.devtool.projectrepository.model.Resource; public class ProjectRepositoryFileConstants { @@ -7,17 +11,30 @@ public class ProjectRepositoryFileConstants { public static final String META_PROPERTY_AUTHOR = Resource.META_PROPERTY_AUTHOR; public static final String META_PROPERTY_RESOURCE_ID = "resourceId"; - + public static final String META_PROPERTY_NAME = "name"; - + public static final String META_PROPERTY_NAMESPACE = "namespace"; - + public static final String META_PROPERTY_VERSION = "version"; - + public static final String META_PROPERTY_MODEL_TYPE = "modelType"; - + public static final String META_PROPERTY_MODEL_SUB_TYPE = "modelSubType"; - + public static final String META_PROPERTY_IS_PROJECT = "isProject"; - + + public static final String META_PROPERTY_REFERENCES = "references"; + + public static Set IMMUTABLE_META_PROPERTY_SET = new HashSet(Arrays.asList( + META_PROPERTY_AUTHOR, + META_PROPERTY_IS_PROJECT, + META_PROPERTY_RESOURCE_ID, + META_PROPERTY_NAME, + META_PROPERTY_NAMESPACE, + META_PROPERTY_VERSION, + META_PROPERTY_MODEL_SUB_TYPE, + META_PROPERTY_MODEL_TYPE + )); + } diff --git a/server/devtool/projectrepository-file/src/main/java/org/eclipse/vorto/devtool/projectrepository/file/ProjectRepositoryServiceFS.java b/server/devtool/projectrepository-file/src/main/java/org/eclipse/vorto/devtool/projectrepository/file/ProjectRepositoryServiceFS.java index 96dc628bc0..d723269816 100644 --- a/server/devtool/projectrepository-file/src/main/java/org/eclipse/vorto/devtool/projectrepository/file/ProjectRepositoryServiceFS.java +++ b/server/devtool/projectrepository-file/src/main/java/org/eclipse/vorto/devtool/projectrepository/file/ProjectRepositoryServiceFS.java @@ -16,6 +16,7 @@ import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.util.Date; import java.util.HashMap; @@ -32,6 +33,7 @@ import org.eclipse.vorto.devtool.projectrepository.WrongUploadHandleTypeError; import org.eclipse.vorto.devtool.projectrepository.model.FileResource; import org.eclipse.vorto.devtool.projectrepository.model.FileUploadHandle; +import org.eclipse.vorto.devtool.projectrepository.model.FolderResource; import org.eclipse.vorto.devtool.projectrepository.model.FolderUploadHandle; import org.eclipse.vorto.devtool.projectrepository.model.ProjectResource; import org.eclipse.vorto.devtool.projectrepository.model.ProjectUploadHandle; @@ -76,7 +78,7 @@ public ProjectResource createProject(String name, String commitMessage) throws R log.info("Create a new project. Name : " + name); File projectFolder = new File(projectsDirectory + File.separator + name); createProjectDirectory(projectFolder); - + Map properties = addProjectResourceProperties(new HashMap()); createMetaFile(addSystemProperties(properties), projectFolder); log.info("Directory for Project " + name + " created."); @@ -94,10 +96,10 @@ private Map addSystemProperties(Map source) { @Override public ProjectResource createProject(String name, Map properties, String commitMessage) throws ResourceAlreadyExistsError { - log.info("Create a new project. Name : " + name); + log.info("Create a new project. Name : " + name); File projectFolder = new File(projectsDirectory + File.separator + name); createProjectDirectory(projectFolder); - + properties = addProjectResourceProperties(properties); createMetaFile(addSystemProperties(properties), projectFolder); log.info("Directory for Project " + name + " created."); @@ -160,6 +162,27 @@ public void uploadResource(String commitComment, UploadHandle... handles) { } } + @Override + @SuppressWarnings({"unchecked", "rawtypes"}) + public void updateFolderResourceProperties(FolderResource resource, Map properties) { + String metaFileDirectoryPath = projectsDirectory + File.separator + resource.getPath(); + File metaFileDirectory = new File(metaFileDirectoryPath); + File metaFile = new File(metaFileDirectoryPath, META_PROPERTY_FILENAME); + Properties metaProperties = new Properties(); + try { + metaProperties.loadFromXML(new FileInputStream(metaFile)); + } catch (Exception ex) { + // Nothing to do here. + } + HashMap map = new HashMap(metaProperties); + for (Map.Entry entry : properties.entrySet()) { + if(!ProjectRepositoryFileConstants.IMMUTABLE_META_PROPERTY_SET.contains(entry.getKey())){ + map.put(entry.getKey(), entry.getValue()); + } + } + createMetaFile(map, metaFileDirectory); + } + @Override public void createVersionOfProject(String versionName, String projectName) { throw new UnsupportedOperationException(); @@ -322,7 +345,7 @@ private File createFile(FileUploadHandle content) { public String theProjectsDirectory() { return this.projectsDirectory; } - + private Map addProjectResourceProperties(Map source) { source.put(ProjectRepositoryFileConstants.META_PROPERTY_IS_PROJECT, String.valueOf(true)); return source; diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/config/EditorConfigurationCloud.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/config/EditorConfigurationCloud.java index 223a68a8ce..c176b2a81c 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/config/EditorConfigurationCloud.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/config/EditorConfigurationCloud.java @@ -48,7 +48,7 @@ public IProjectRepositoryService projectRepositoryService() { @Bean public GlobalContext getGlobalContext(){ - return new GlobalContext(repositoryBasePath, referenceRepository); + return new GlobalContext(repositoryBasePath); } } diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/config/EditorConfigurationLocal.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/config/EditorConfigurationLocal.java index d875e4de59..2d86aa4695 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/config/EditorConfigurationLocal.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/config/EditorConfigurationLocal.java @@ -79,7 +79,7 @@ public IProjectRepositoryService projectRepositoryService() { @Bean public GlobalContext getGlobalContext(){ - return new GlobalContext(repositoryBasePath, referenceRepository); + return new GlobalContext(repositoryBasePath); } @Bean diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/response/DeleteResourceRequest.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/request/DeleteResourceRequest.java similarity index 95% rename from server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/response/DeleteResourceRequest.java rename to server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/request/DeleteResourceRequest.java index f64be57b81..36edc82ff7 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/response/DeleteResourceRequest.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/request/DeleteResourceRequest.java @@ -12,7 +12,7 @@ * Contributors: * Bosch Software Innovations GmbH - Please refer to git log *******************************************************************************/ -package org.eclipse.vorto.server.devtool.http.response; +package org.eclipse.vorto.server.devtool.http.request; public class DeleteResourceRequest { diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/response/LinkReferenceModelRequest.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/request/LinkReferenceModelRequest.java similarity index 96% rename from server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/response/LinkReferenceModelRequest.java rename to server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/request/LinkReferenceModelRequest.java index f60970777c..88bb574abf 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/response/LinkReferenceModelRequest.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/request/LinkReferenceModelRequest.java @@ -12,7 +12,7 @@ * Contributors: * Bosch Software Innovations GmbH - Please refer to git log *******************************************************************************/ -package org.eclipse.vorto.server.devtool.http.response; +package org.eclipse.vorto.server.devtool.http.request; public class LinkReferenceModelRequest { diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/response/LinkReferenceResourceRequest.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/request/LinkReferenceResourceRequest.java similarity index 95% rename from server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/response/LinkReferenceResourceRequest.java rename to server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/request/LinkReferenceResourceRequest.java index 0cdf374b2c..dd356701f5 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/response/LinkReferenceResourceRequest.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/request/LinkReferenceResourceRequest.java @@ -12,7 +12,7 @@ * Contributors: * Bosch Software Innovations GmbH - Please refer to git log *******************************************************************************/ -package org.eclipse.vorto.server.devtool.http.response; +package org.eclipse.vorto.server.devtool.http.request; public class LinkReferenceResourceRequest { diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/request/Response.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/response/Response.java similarity index 95% rename from server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/request/Response.java rename to server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/response/Response.java index 53962c801a..f05188c80c 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/request/Response.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/http/response/Response.java @@ -12,7 +12,7 @@ * Contributors: * Bosch Software Innovations GmbH - Please refer to git log *******************************************************************************/ -package org.eclipse.vorto.server.devtool.http.request; +package org.eclipse.vorto.server.devtool.http.response; import org.eclipse.vorto.devtool.projectrepository.model.Resource; diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/models/GlobalContext.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/models/GlobalContext.java index 461aa7fad3..2bb06e9bef 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/models/GlobalContext.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/models/GlobalContext.java @@ -17,11 +17,8 @@ public class GlobalContext { public String repositoryBasePath = null; - - public String referenceRepository = null; - - public GlobalContext(String repositoryBasePath, String referenceRepository) { + + public GlobalContext(String repositoryBasePath) { this.repositoryBasePath = repositoryBasePath; - this.referenceRepository = referenceRepository; } } diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/models/LinkReferenceResponse.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/models/LinkReferenceResponse.java new file mode 100644 index 0000000000..4cc6ffaae4 --- /dev/null +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/models/LinkReferenceResponse.java @@ -0,0 +1,39 @@ +package org.eclipse.vorto.server.devtool.models; + +public class LinkReferenceResponse { + + private String content; + private String targetResourceId; + private String referenceResourceId; + + public LinkReferenceResponse(String content, String targetResourceId, String referenceResourceId) { + this.content = content; + this.targetResourceId = targetResourceId; + this.referenceResourceId = referenceResourceId; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getTargetResourceId() { + return targetResourceId; + } + + public void setTargetResourceId(String targetResourceId) { + this.targetResourceId = targetResourceId; + } + + public String getReferenceResourceId() { + return referenceResourceId; + } + + public void setReferenceResourceId(String referenceResourceId) { + this.referenceResourceId = referenceResourceId; + } + +} diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/service/IEditorService.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/service/IEditorService.java index e3e6c92ca0..7f48f6cef8 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/service/IEditorService.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/service/IEditorService.java @@ -21,6 +21,7 @@ import org.eclipse.vorto.repository.api.ModelId; import org.eclipse.vorto.repository.api.ModelInfo; import org.eclipse.vorto.repository.api.ModelType; +import org.eclipse.vorto.server.devtool.models.LinkReferenceResponse; import org.eclipse.vorto.server.devtool.models.ModelResource; import org.eclipse.vorto.server.devtool.utils.DevtoolReferenceLinker; import org.eclipse.vorto.server.devtool.utils.DevtoolRestClient; @@ -33,26 +34,26 @@ public abstract class IEditorService { @Autowired private DevtoolRestClient devtoolRestClient; - + @Autowired private DevtoolReferenceLinker devtoolReferenceLinker; - + @Autowired private DevtoolUtils devtoolUtils; - + @Autowired private IProjectService projectService; public abstract List searchModelByExpression(String expression); public abstract String generateFileContent(ModelResource modelResource); - + public abstract ModelInfo getAndValidateModelInfo(ModelId modelId); - - public abstract void updateVariableNames(String targetResourceId, String referenceResourceId, ResourceSet resourceSet); - - public final List searchModelByExpressionAndValidate(String expression, - List modelTypeList) { + + public abstract void updateVariableNames(String targetResourceId, String referenceResourceId, + ResourceSet resourceSet); + + public final List searchModelByExpressionAndValidate(String expression, List modelTypeList) { List resourceList = devtoolRestClient.searchByExpression(expression); ArrayList modelResourceList = new ArrayList(); for (ModelInfo modelResource : resourceList) { @@ -65,29 +66,35 @@ public final List searchModelByExpressionAndValidate(String expressio return modelResourceList; } - public final String linkReferenceToResource(String targetResourceId, ModelId modelId, ResourceSet resourceSet) { + public final LinkReferenceResponse linkReferenceToResource(String targetResourceId, ModelId modelId, + ResourceSet resourceSet) { validateArguments(targetResourceId, resourceSet); ModelInfo modelInfo = getAndValidateModelInfo(modelId); projectService.getReferencedResource(modelInfo); String referenceResourceId = devtoolUtils.getReferencedResourceId(modelInfo); - return linkReference(targetResourceId, referenceResourceId, resourceSet); + String content = linkReference(targetResourceId, referenceResourceId, resourceSet); + LinkReferenceResponse linkReferenceResponse = new LinkReferenceResponse(content, targetResourceId, + referenceResourceId); + return linkReferenceResponse; } - public final String linkReferenceToResource(String targetResourceId, String referenceResourceId, + public final LinkReferenceResponse linkReferenceToResource(String targetResourceId, String referenceResourceId, ResourceSet resourceSet) { validateArguments(referenceResourceId, resourceSet); validateArguments(targetResourceId, resourceSet); - return linkReference(targetResourceId, referenceResourceId, resourceSet); + String content = linkReference(targetResourceId, referenceResourceId, resourceSet); + LinkReferenceResponse linkReferenceResponse = new LinkReferenceResponse(content, targetResourceId, + referenceResourceId); + return linkReferenceResponse; } - - private void validateArguments(String resourceId, ResourceSet resourceSet){ + + private void validateArguments(String resourceId, ResourceSet resourceSet) { if (!devtoolReferenceLinker.containsResource(resourceId, resourceSet)) { throw new RuntimeException("No resource with resourceId : " + resourceId); } } - - private String linkReference(String targetResourceId, String referenceResourceId, - ResourceSet resourceSet){ + + private String linkReference(String targetResourceId, String referenceResourceId, ResourceSet resourceSet) { devtoolReferenceLinker.linkReferenceToResource(targetResourceId, referenceResourceId, resourceSet); updateVariableNames(targetResourceId, referenceResourceId, resourceSet); return devtoolUtils.getResourceContentsAsString(targetResourceId, resourceSet); diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/service/IProjectService.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/service/IProjectService.java index 98abb520ab..6126ad6097 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/service/IProjectService.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/service/IProjectService.java @@ -24,6 +24,8 @@ public interface IProjectService { ProjectResource createProject(String projectName, String author); + + ProjectResource getProject(String projectName); List getProjects(String author); @@ -40,4 +42,6 @@ public interface IProjectService { void deleteResource(String projectName, String resourceId); void deleteResource(String projectName, String author, String resourceId); -} + + void addReferenceToProject(String projectName, String resourceId); +} \ No newline at end of file diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/service/impl/XtextEditorProjectServiceImpl.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/service/impl/XtextEditorProjectServiceImpl.java index 9a386d4e2d..497007f66e 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/service/impl/XtextEditorProjectServiceImpl.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/service/impl/XtextEditorProjectServiceImpl.java @@ -14,8 +14,13 @@ *******************************************************************************/ package org.eclipse.vorto.server.devtool.service.impl; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import org.eclipse.vorto.devtool.projectrepository.IProjectRepositoryService; import org.eclipse.vorto.devtool.projectrepository.ResourceAlreadyExistsError; @@ -63,6 +68,13 @@ public ProjectResource createProject(String projectName, String author) { return resource; } + @Override + public ProjectResource getProject(String projectName) { + return (ProjectResource) projectRepositoryService.createQuery() + .path(projectName) + .type(ResourceType.ProjectResource).singleResult(); + } + @Override public List getProjects(String author) { return projectRepositoryService.createQuery() @@ -82,15 +94,14 @@ public Resource createProjectResource(String projectName, String author, ModelRe if (list.isEmpty()) { String fileContent = devtoolUtils.generateFileContent(modelResource); - FileUploadHandle fileUploadHandle = getFileUploadHandle(projectName, fileContent, author, - modelResource); + FileUploadHandle fileUploadHandle = getFileUploadHandle(projectName, fileContent, author, modelResource); projectRepositoryService.uploadResource(null, fileUploadHandle); return resourceQuery.list().get(0); } else { throw new ResourceAlreadyExistsError(Constants.MESSAGE_RESOURCE_ALREADY_EXISTS); } } - + @Override public Resource createProjectResource(String projectName, ModelResource modelResource) { return createProjectResource(projectName, editorSession.getUser(), modelResource); @@ -137,7 +148,7 @@ public Resource getReferencedResource(ModelInfo modelInfo) { public void deleteResource(String projectName, String resourceId) { deleteResource(projectName, editorSession.getUser(), resourceId); } - + @Override public void deleteResource(String projectName, String author, String resourceId) { IResourceQuery resourceQuery = projectRepositoryService.createQuery().pathLike(projectName) @@ -147,6 +158,29 @@ public void deleteResource(String projectName, String author, String resourceId) projectRepositoryService.deleteResource(resource); } + @Override + public void addReferenceToProject(String projectName, String referenceResourceId) { + ProjectResource projectResource = (ProjectResource) projectRepositoryService.createQuery().pathLike(projectName) + .type(ResourceType.ProjectResource).singleResult(); + Map properties = projectResource.getProperties(); + String[] resourceIdArray = {}; + if (properties.containsKey(ProjectRepositoryFileConstants.META_PROPERTY_REFERENCES)) { + resourceIdArray = properties.get(ProjectRepositoryFileConstants.META_PROPERTY_REFERENCES) + .split(Constants.COMMA); + } + ArrayList resourceIdList = new ArrayList<>(Arrays.asList(resourceIdArray)); + Set resourceIdSet = new HashSet(resourceIdList); + if (resourceIdSet.contains(referenceResourceId)) { + return; + }else{ + resourceIdList.add(referenceResourceId); + Map updatedProperties = new HashMap(); + updatedProperties.put(ProjectRepositoryFileConstants.META_PROPERTY_REFERENCES, + String.join(Constants.COMMA, resourceIdList)); + projectRepositoryService.updateFolderResourceProperties(projectResource, updatedProperties); + } + } + private IResourceQuery getModelResourceQuery(String projectName, ModelResource modelResource) { return projectRepositoryService.createQuery().pathLike(projectName).name(modelResource.getFilename()) .property(ProjectRepositoryFileConstants.META_PROPERTY_VERSION, modelResource.getVersion()) @@ -156,7 +190,8 @@ private IResourceQuery getModelResourceQuery(String projectName, ModelResource m private FileUploadHandle getFileUploadHandle(String projectName, String fileContent, String author, ModelResource modelResource) { - Resource projectResource = projectRepositoryService.createQuery().path(projectName.replace("\\", "/")).singleResult(); + Resource projectResource = projectRepositoryService.createQuery().path(projectName.replace("\\", "/")) + .singleResult(); FileUploadHandle fileUploadHandle = new FileUploadHandle((FolderResource) projectResource, modelResource.getFilename(), fileContent.getBytes()); String resourceId = devtoolUtils.generateResourceId(modelResource, projectName, author); @@ -166,5 +201,4 @@ private FileUploadHandle getFileUploadHandle(String projectName, String fileCont fileUploadHandle.setProperties(properties); return fileUploadHandle; } - } \ No newline at end of file diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/utils/Constants.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/utils/Constants.java index d3dbee4cbc..f3aa7797d4 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/utils/Constants.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/utils/Constants.java @@ -17,6 +17,8 @@ public class Constants { public static final String DOT = "."; + + public static final String COMMA = ","; public static final String MESSAGE_RESOURCE_CREATED = "resource created"; diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/utils/DevtoolReferenceLinker.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/utils/DevtoolReferenceLinker.java index 214be30946..5c6e395fba 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/utils/DevtoolReferenceLinker.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/utils/DevtoolReferenceLinker.java @@ -14,6 +14,8 @@ *******************************************************************************/ package org.eclipse.vorto.server.devtool.utils; +import java.util.List; + import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; @@ -29,6 +31,12 @@ public class DevtoolReferenceLinker { @Autowired private DevtoolUtils devtoolUtils; + + public void loadResources(List resourceIdList, ResourceSet resourceSet){ + for(String resourceId: resourceIdList){ + resourceSet.getResource(devtoolUtils.getResourceURI(resourceId), true); + } + } public void linkReferenceToResource(String targetResourceId, String referenceResourceId, ResourceSet resourceSet) { Resource targetResource = resourceSet.getResource(devtoolUtils.getResourceURI(targetResourceId), true); diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/utils/WebUtils.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/utils/WebUtils.java index 9172323609..56e481d7c2 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/utils/WebUtils.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/utils/WebUtils.java @@ -21,8 +21,8 @@ import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.vorto.editor.web.resource.WebEditorResourceSetProvider; -import org.eclipse.vorto.server.devtool.http.response.LinkReferenceModelRequest; -import org.eclipse.vorto.server.devtool.http.response.LinkReferenceResourceRequest; +import org.eclipse.vorto.server.devtool.http.request.LinkReferenceModelRequest; +import org.eclipse.vorto.server.devtool.http.request.LinkReferenceResourceRequest; import org.eclipse.vorto.server.devtool.service.IEditorSession; import org.eclipse.xtext.web.server.model.IWebResourceSetProvider; import org.eclipse.xtext.web.servlet.HttpServiceContext; @@ -60,6 +60,7 @@ public void validateLinkReferenceModelRequest(LinkReferenceModelRequest linkRefe Objects.requireNonNull(linkReferenceModelRequest.getModelName(), "model name must not be null"); Objects.requireNonNull(linkReferenceModelRequest.getModelNamespace(), "model namespace must not be null"); Objects.requireNonNull(linkReferenceModelRequest.getModelVersion(), "model version must not be null"); + Objects.requireNonNull(linkReferenceModelRequest.getProjectName(), "project name must not be null"); } public void validateSearchExpression(String string) { diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/ProjectController.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/ProjectController.java index 9446199736..f34eb5d893 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/ProjectController.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/ProjectController.java @@ -15,6 +15,8 @@ package org.eclipse.vorto.server.devtool.web.controller; import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -22,10 +24,11 @@ import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.vorto.devtool.projectrepository.ResourceAlreadyExistsError; +import org.eclipse.vorto.devtool.projectrepository.file.ProjectRepositoryFileConstants; import org.eclipse.vorto.devtool.projectrepository.model.ProjectResource; import org.eclipse.vorto.devtool.projectrepository.model.Resource; -import org.eclipse.vorto.server.devtool.http.request.Response; -import org.eclipse.vorto.server.devtool.http.response.DeleteResourceRequest; +import org.eclipse.vorto.server.devtool.http.request.DeleteResourceRequest; +import org.eclipse.vorto.server.devtool.http.response.Response; import org.eclipse.vorto.server.devtool.models.ModelResource; import org.eclipse.vorto.server.devtool.service.IEditorSession; import org.eclipse.vorto.server.devtool.service.IProjectService; @@ -132,19 +135,38 @@ public List getResources( @ApiParam(value = "Request", required = true) final HttpServletRequest request) { Objects.requireNonNull(projectName, "projectName must not be null"); - if (!projectName.equals(referenceRepository)) { - projectName = webUtils.getUserProjectName(projectName); - } + projectName = webUtils.getUserProjectName(projectName); return projectService.getProjectResources(projectName); } @ApiOperation(value = "Opens an existing Vorto project") @RequestMapping(value = "/{projectName}/open", method = RequestMethod.GET) - public void openProject(@ApiParam(value = "ProjectName", required = true) final @PathVariable String projectName, + public Resource openProject(@ApiParam(value = "ProjectName", required = true) @PathVariable String projectName, @ApiParam(value = "Request", required = true) final HttpServletRequest request) throws IOException { Objects.requireNonNull(projectName, "projectName must not be null"); + projectName = webUtils.getUserProjectName(projectName); + + ResourceSet resourceSet = webUtils.getResourceSet(request); + ProjectResource projectResource = projectService.getProject(projectName); + List resourceIdList = new ArrayList(); + + if(projectResource.getProperties().containsKey(ProjectRepositoryFileConstants.META_PROPERTY_REFERENCES)){ + resourceIdList = new ArrayList(Arrays.asList(projectResource.getProperties() + .get(ProjectRepositoryFileConstants.META_PROPERTY_REFERENCES).split(Constants.COMMA))); + } + + List resourceList = projectService.getProjectResources(projectName); + for(Resource resource : resourceList){ + resourceIdList.add(resource.getProperties().get(ProjectRepositoryFileConstants.META_PROPERTY_RESOURCE_ID)); + } + + devtoolReferenceLinker.resetResourceSet(resourceSet); + devtoolReferenceLinker.loadResources(resourceIdList, resourceSet); + + return projectResource; + } @ApiOperation(value = "Deletes a resource from the project") @@ -154,9 +176,6 @@ public void deleteResource(@RequestBody DeleteResourceRequest deleteResourceRequ @ApiParam(value = "Request", required = true) final HttpServletRequest request) { Objects.requireNonNull(projectName, "projectName must not be null"); - if (projectName.equals(referenceRepository)) { - return; - } projectName = webUtils.getUserProjectName(projectName); ResourceSet resourceSet = webUtils.getResourceSet(request); diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/editor/AbstractEditorController.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/editor/AbstractEditorController.java index 9f2b96ad3d..5a5bf0bcd8 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/editor/AbstractEditorController.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/editor/AbstractEditorController.java @@ -25,8 +25,10 @@ import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.vorto.repository.api.ModelId; import org.eclipse.vorto.repository.api.ModelInfo; -import org.eclipse.vorto.server.devtool.http.response.LinkReferenceModelRequest; -import org.eclipse.vorto.server.devtool.http.response.LinkReferenceResourceRequest; +import org.eclipse.vorto.server.devtool.http.request.LinkReferenceModelRequest; +import org.eclipse.vorto.server.devtool.http.request.LinkReferenceResourceRequest; +import org.eclipse.vorto.server.devtool.models.LinkReferenceResponse; +import org.eclipse.vorto.server.devtool.service.IProjectService; import org.eclipse.vorto.server.devtool.utils.WebUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; @@ -42,9 +44,12 @@ public abstract class AbstractEditorController { @Autowired private WebUtils webUtils; - public abstract String linkReferenceToResource(String resoruceId, ModelId modelId, ResourceSet resourceSet); + @Autowired + private IProjectService projectService; + + public abstract LinkReferenceResponse linkReferenceToResource(String resoruceId, ModelId modelId, ResourceSet resourceSet); - public abstract String linkReferenceToResource(String targetResourceId, String referenceResourceId, + public abstract LinkReferenceResponse linkReferenceToResource(String targetResourceId, String referenceResourceId, ResourceSet resourceSet); public abstract List search(String expression); @@ -59,7 +64,10 @@ public void linkReference(@RequestBody LinkReferenceModelRequest linkReferenceMo ModelId modelId = new ModelId(linkReferenceModelRequest.getModelName(), linkReferenceModelRequest.getModelNamespace(), linkReferenceModelRequest.getModelVersion()); ResourceSet resourceSet = webUtils.getResourceSet(request); - String content = linkReferenceToResource(linkReferenceModelRequest.getResourceId(), modelId, resourceSet); + LinkReferenceResponse linkReferenceResponse = linkReferenceToResource(linkReferenceModelRequest.getResourceId(), modelId, resourceSet); + String content = linkReferenceResponse.getContent(); + String projectName = webUtils.getUserProjectName(linkReferenceModelRequest.getProjectName()); + projectService.addReferenceToProject(projectName, linkReferenceResponse.getReferenceResourceId()); try { IOUtils.copy(new ByteArrayInputStream(content.getBytes()), response.getOutputStream()); response.flushBuffer(); @@ -70,13 +78,14 @@ public void linkReference(@RequestBody LinkReferenceModelRequest linkReferenceMo @ApiOperation(value = "Imports the specified reference resource from the project workspace into the target resource") @RequestMapping(value = "/link/resource", method = RequestMethod.POST) - public void linkReference(@RequestBody LinkReferenceResourceRequest linkReferenceResourceRequest, + public void linkResource(@RequestBody LinkReferenceResourceRequest linkReferenceResourceRequest, HttpServletRequest request, HttpServletResponse response) { webUtils.validateLinkResourceReferenceRequest(linkReferenceResourceRequest); ResourceSet resourceSet = webUtils.getResourceSet(request); - String content = linkReferenceToResource(linkReferenceResourceRequest.getTargetResourceId(), + LinkReferenceResponse linkReferenceResponse = linkReferenceToResource(linkReferenceResourceRequest.getTargetResourceId(), linkReferenceResourceRequest.getReferenceResourceId(), resourceSet); + String content = linkReferenceResponse.getContent(); try { IOUtils.copy(new ByteArrayInputStream(content.getBytes()), response.getOutputStream()); response.flushBuffer(); diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/editor/DatatypeEditorController.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/editor/DatatypeEditorController.java index 7c070ac542..17963b728f 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/editor/DatatypeEditorController.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/editor/DatatypeEditorController.java @@ -19,6 +19,7 @@ import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.vorto.repository.api.ModelId; import org.eclipse.vorto.repository.api.ModelInfo; +import org.eclipse.vorto.server.devtool.models.LinkReferenceResponse; import org.eclipse.vorto.server.devtool.service.impl.editor.DatatypeEditorServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; @@ -32,9 +33,8 @@ public class DatatypeEditorController extends AbstractEditorController { private DatatypeEditorServiceImpl datatypeEditorServiceImpl; @Override - public String linkReferenceToResource(String resoruceId, ModelId modelId, ResourceSet resourceSet) { - String content = datatypeEditorServiceImpl.linkReferenceToResource(resoruceId, modelId, resourceSet); - return content; + public LinkReferenceResponse linkReferenceToResource(String resoruceId, ModelId modelId, ResourceSet resourceSet) { + return datatypeEditorServiceImpl.linkReferenceToResource(resoruceId, modelId, resourceSet); } @Override @@ -43,10 +43,8 @@ public List search(String expression) { } @Override - public String linkReferenceToResource(String targetResourceId, String referenceResourceId, + public LinkReferenceResponse linkReferenceToResource(String targetResourceId, String referenceResourceId, ResourceSet resourceSet) { - String content = datatypeEditorServiceImpl.linkReferenceToResource(targetResourceId, referenceResourceId, - resourceSet); - return content; + return datatypeEditorServiceImpl.linkReferenceToResource(targetResourceId, referenceResourceId, resourceSet); } } diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/editor/FunctionBlockEditorController.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/editor/FunctionBlockEditorController.java index 51a18b417e..ec928260e6 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/editor/FunctionBlockEditorController.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/editor/FunctionBlockEditorController.java @@ -19,6 +19,7 @@ import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.vorto.repository.api.ModelId; import org.eclipse.vorto.repository.api.ModelInfo; +import org.eclipse.vorto.server.devtool.models.LinkReferenceResponse; import org.eclipse.vorto.server.devtool.service.impl.editor.FunctionBlockEditorServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; @@ -32,9 +33,8 @@ public class FunctionBlockEditorController extends AbstractEditorController { private FunctionBlockEditorServiceImpl functionBlockEditorServiceImpl; @Override - public String linkReferenceToResource(String resoruceId, ModelId modelId, ResourceSet resourceSet) { - String content = functionBlockEditorServiceImpl.linkReferenceToResource(resoruceId, modelId, resourceSet); - return content; + public LinkReferenceResponse linkReferenceToResource(String resoruceId, ModelId modelId, ResourceSet resourceSet) { + return functionBlockEditorServiceImpl.linkReferenceToResource(resoruceId, modelId, resourceSet); } @Override @@ -43,10 +43,10 @@ public List search(String expression) { } @Override - public String linkReferenceToResource(String targetResourceId, String referenceResourceId, + public LinkReferenceResponse linkReferenceToResource(String targetResourceId, String referenceResourceId, ResourceSet resourceSet) { - String content = functionBlockEditorServiceImpl.linkReferenceToResource(targetResourceId, referenceResourceId, + return functionBlockEditorServiceImpl.linkReferenceToResource(targetResourceId, referenceResourceId, resourceSet); - return content; + } } diff --git a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/editor/InformationModelEditorController.java b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/editor/InformationModelEditorController.java index 6df6b2523c..f4f8f18165 100644 --- a/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/editor/InformationModelEditorController.java +++ b/server/devtool/webeditor/src/main/java/org/eclipse/vorto/server/devtool/web/controller/editor/InformationModelEditorController.java @@ -19,6 +19,7 @@ import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.vorto.repository.api.ModelId; import org.eclipse.vorto.repository.api.ModelInfo; +import org.eclipse.vorto.server.devtool.models.LinkReferenceResponse; import org.eclipse.vorto.server.devtool.service.impl.editor.InformationModelEditorServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; @@ -32,9 +33,8 @@ public class InformationModelEditorController extends AbstractEditorController { private InformationModelEditorServiceImpl informationModelEditorServiceImpl; @Override - public String linkReferenceToResource(String resoruceId, ModelId modelId, ResourceSet resourceSet) { - String content = informationModelEditorServiceImpl.linkReferenceToResource(resoruceId, modelId, resourceSet); - return content; + public LinkReferenceResponse linkReferenceToResource(String resoruceId, ModelId modelId, ResourceSet resourceSet) { + return informationModelEditorServiceImpl.linkReferenceToResource(resoruceId, modelId, resourceSet); } @Override @@ -43,10 +43,9 @@ public List search(String expression) { } @Override - public String linkReferenceToResource(String targetResourceId, String referenceResourceId, + public LinkReferenceResponse linkReferenceToResource(String targetResourceId, String referenceResourceId, ResourceSet resourceSet) { - String content = informationModelEditorServiceImpl.linkReferenceToResource(targetResourceId, + return informationModelEditorServiceImpl.linkReferenceToResource(targetResourceId, referenceResourceId, resourceSet); - return content; } } \ No newline at end of file diff --git a/server/devtool/webeditor/src/main/resources/static/dist/js/controllers/editor/EditorController.js b/server/devtool/webeditor/src/main/resources/static/dist/js/controllers/editor/EditorController.js index 449a2c15cf..af3f8ee347 100644 --- a/server/devtool/webeditor/src/main/resources/static/dist/js/controllers/editor/EditorController.js +++ b/server/devtool/webeditor/src/main/resources/static/dist/js/controllers/editor/EditorController.js @@ -22,6 +22,7 @@ define(["../init/AppController"], function(controllers) { $scope.selectedTabIndex = 0; $scope.selectedTabId = 0; $scope.selectedEditor = null; + $scope.references = []; $scope.showImportButton = true; $scope.showSearchButton = true; @@ -204,7 +205,6 @@ define(["../init/AppController"], function(controllers) { ProjectDataService.openProject(params).then(function(data){ $scope.showEditorBody = true; $scope.getResources(); - $scope.getReferences(); }).catch(function(error){ $scope.showEditorBody = false; }); @@ -247,16 +247,6 @@ define(["../init/AppController"], function(controllers) { }); }; - $scope.getReferences = function() { - var params = {projectName: $rootScope.globalContext.referenceRepository}; - ProjectDataService.getProjectResources(params).then(function(responses){ - responses.forEach(function(response){ - var resource = $scope.getResourceObject(response); - $scope.loadResourceAtServer(resource); - }); - }); - } - $scope.getResources = function() { var params = {projectName: $scope.projectName}; ProjectDataService.getProjectResources(params).then(function(data){ @@ -780,12 +770,17 @@ define(["../init/AppController"], function(controllers) { name: 'customSaveCommand', bindKey: {win: 'Ctrl-S', mac: 'Command-S'}, exec: function(editor) { - editor.xtextServices.saveResource(); - editor.lastSavedValue = editor.getValue(); var tab = $scope.tabs[$scope.selectedTabIndex]; - var message = "Resource " + tab.filename + " saved"; - var params = {message: message}; - ToastrService.createSuccessToast(params); + editor.xtextServices.saveResource().then(function(data){ + var message = "Resource " + tab.filename + " saved"; + var params = {message: message}; + ToastrService.createSuccessToast(params); + }, function(err){ + var message = "Failed to save " + tab.filename; + var params = {message: message}; + ToastrService.createErrorToast(params); + }); + editor.lastSavedValue = editor.getValue(); } }); editor.xtextServices.loadResource().then(function(data){