/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.api.project.server;
import com.google.inject.Inject;
import org.eclipse.che.api.core.rest.ServiceContext;
import org.eclipse.che.api.core.rest.shared.dto.Link;
import org.eclipse.che.api.project.shared.dto.ItemReference;
import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto;
import javax.inject.Singleton;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import static javax.ws.rs.HttpMethod.DELETE;
import static javax.ws.rs.HttpMethod.GET;
import static javax.ws.rs.HttpMethod.PUT;
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
import static org.eclipse.che.api.core.util.LinksHelper.createLink;
import static org.eclipse.che.api.project.shared.Constants.LINK_REL_CHILDREN;
import static org.eclipse.che.api.project.shared.Constants.LINK_REL_DELETE;
import static org.eclipse.che.api.project.shared.Constants.LINK_REL_GET_CONTENT;
import static org.eclipse.che.api.project.shared.Constants.LINK_REL_TREE;
import static org.eclipse.che.api.project.shared.Constants.LINK_REL_UPDATE_CONTENT;
import static org.eclipse.che.api.project.shared.Constants.LINK_REL_UPDATE_PROJECT;
/**
* Helps to inject {@link ProjectService} related links.
*/
@Singleton
public class ProjectServiceLinksInjector {
@Inject
public ProjectServiceLinksInjector() {
}
/**
* Adds links for working with a file.
* Operations which are supported:
* <p>get content</p>
* <p>update content</p>
* <p>delete</p>
*
* @param itemReference
* information about node
* @param serviceContext
* context of {@link ProjectService}
* @return node with injected file's links
*/
public ItemReference injectFileLinks(ItemReference itemReference, ServiceContext serviceContext) {
final UriBuilder uriBuilder = getUriBuilder(serviceContext);
final List<Link> links = new ArrayList<>();
final String relPath = itemReference.getPath().substring(1);
links.add(createLink(GET, tuneUrl(uriBuilder.clone()
.path(ProjectService.class)
.path(ProjectService.class, "getFile")
.build(new String[]{relPath}, false)),
APPLICATION_JSON,
LINK_REL_GET_CONTENT));
links.add(createLink(PUT,
tuneUrl(uriBuilder.clone()
.path(ProjectService.class)
.path(ProjectService.class, "updateFile")
.build(new String[]{relPath}, false)),
MediaType.WILDCARD,
null,
LINK_REL_UPDATE_CONTENT));
links.add(createLink(DELETE,
tuneUrl(uriBuilder.clone()
.path(ProjectService.class)
.path(ProjectService.class, "delete")
.build(new String[]{relPath}, false)),
LINK_REL_DELETE));
return itemReference.withLinks(links);
}
/**
* Adds links for working with a folder.
* Operations which are supported:
* <p>get children</p>
* <p>get tree</p>
* <p>delete</p>
*
* @param itemReference
* information about node
* @param serviceContext
* context of {@link ProjectService}
* @return node with injected folder's links
*/
public ItemReference injectFolderLinks(ItemReference itemReference, ServiceContext serviceContext) {
final UriBuilder uriBuilder = getUriBuilder(serviceContext);
final List<Link> links = new ArrayList<>();
final String relPath = itemReference.getPath().substring(1);
links.add(createLink(GET,
tuneUrl(uriBuilder.clone()
.path(ProjectService.class)
.path(ProjectService.class, "getChildren")
.build(new String[]{relPath}, false)),
APPLICATION_JSON,
LINK_REL_CHILDREN));
links.add(createLink(GET,
tuneUrl(uriBuilder.clone()
.path(ProjectService.class)
.path(ProjectService.class, "getTree")
.build(new String[]{relPath}, false)),
APPLICATION_JSON,
LINK_REL_TREE));
links.add(createLink(DELETE,
tuneUrl(uriBuilder.clone()
.path(ProjectService.class)
.path(ProjectService.class, "delete")
.build(new String[]{relPath}, false)),
LINK_REL_DELETE));
return itemReference.withLinks(links);
}
/**
* Adds links for working with a project.
* Operations which are supported:
* <p>get tree</p>
* <p>get children</p>
* <p>update project</p>
* <p>delete</p>
*
* @param projectConfig
* information about project
* @param serviceContext
* context of {@link ProjectService}
* @return node with injected project's links
*/
public ProjectConfigDto injectProjectLinks(ProjectConfigDto projectConfig, ServiceContext serviceContext) {
final UriBuilder uriBuilder = getUriBuilder(serviceContext);
final List<Link> links = new ArrayList<>();
final String relPath = projectConfig.getPath().substring(1);
links.add(createLink(PUT,
tuneUrl(uriBuilder.clone()
.path(ProjectService.class)
.path(ProjectService.class, "updateProject")
.build(new String[]{relPath}, false)),
APPLICATION_JSON,
APPLICATION_JSON,
LINK_REL_UPDATE_PROJECT));
links.add(createLink(GET,
tuneUrl(uriBuilder.clone()
.path(ProjectService.class)
.path(ProjectService.class, "getChildren")
.build(new String[]{relPath}, false)),
APPLICATION_JSON,
LINK_REL_CHILDREN));
links.add(createLink(GET,
tuneUrl(uriBuilder.clone()
.path(ProjectService.class)
.path(ProjectService.class, "getTree")
.build(new String[]{relPath}, false)),
APPLICATION_JSON,
LINK_REL_TREE));
links.add(createLink(DELETE,
tuneUrl(uriBuilder.clone()
.path(ProjectService.class)
.path(ProjectService.class, "delete")
.build(new String[]{relPath}, false)),
LINK_REL_DELETE));
return projectConfig.withLinks(links);
}
/** @return base URI of context of {@link ProjectService} */
protected UriBuilder getUriBuilder(ServiceContext serviceContext) {
return serviceContext.getBaseUriBuilder();
}
/** Modifies uri, needs for hosted version. */
protected String tuneUrl(URI uri) {
return uri.toString();
}
}