/** * Copyright 2008 The University of North Carolina at Chapel Hill * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package edu.unc.lib.dl.cdr.services.rest.modify; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; 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.ResponseBody; import edu.unc.lib.dl.acl.service.AccessControlService; import edu.unc.lib.dl.acl.util.GroupsThreadStore; import edu.unc.lib.dl.acl.util.Permission; import edu.unc.lib.dl.fedora.AuthorizationException; import edu.unc.lib.dl.fedora.FedoraException; import edu.unc.lib.dl.fedora.ManagementClient; import edu.unc.lib.dl.fedora.PID; import edu.unc.lib.dl.services.OperationsMessageSender; import edu.unc.lib.dl.util.ContentModelHelper.CDRProperty; @Controller public class PublishRestController { private static final Logger log = LoggerFactory.getLogger(PublishRestController.class); @Autowired(required = true) @Qualifier("forwardedManagementClient") private ManagementClient managementClient; @Autowired(required = true) private OperationsMessageSender messageSender; @Autowired private AccessControlService aclService; @RequestMapping(value = "edit/publish/{id}", method = RequestMethod.POST) public @ResponseBody ResponseEntity<Object> publishObject(@PathVariable("id") String id, HttpServletRequest request) { PID pid = new PID(id); return this.publishObject(pid, true, request.getRemoteUser()); } @RequestMapping(value = "edit/unpublish/{id}", method = RequestMethod.POST) public @ResponseBody ResponseEntity<Object> unpublishObject(@PathVariable("id") String id, HttpServletRequest request) { PID pid = new PID(id); return this.publishObject(pid, false, request.getRemoteUser()); } private ResponseEntity<Object> publishObject(PID pid, boolean publish, String username) { Map<String, Object> result = new HashMap<String, Object>(); result.put("pid", pid.getPid()); result.put("action", (publish) ? "publish" : "unpublish"); log.debug("Publishing object " + pid); try { if (!aclService.hasAccess(pid, GroupsThreadStore.getGroups(), Permission.publish)) { throw new AuthorizationException("Insufficient permissions to change publication status of " + pid); } // Update relation managementClient.setExclusiveLiteral(pid, CDRProperty.isPublished.getPredicate(), CDRProperty.isPublished.getNamespace(), (publish) ? "yes" : "no", null); result.put("timestamp", System.currentTimeMillis()); // Send message to trigger solr update String messageId = messageSender.sendPublishOperation(username, Arrays.asList(pid), true); result.put("messageId", messageId); } catch (AuthorizationException e) { result.put("error", "Insufficient privileges to publish object " + pid.getPid()); return new ResponseEntity<Object>(result, HttpStatus.FORBIDDEN); } catch (FedoraException e) { log.error("Failed to update relation on " + pid, e); result.put("error", e.toString()); return new ResponseEntity<Object>(result, HttpStatus.INTERNAL_SERVER_ERROR); } return new ResponseEntity<Object>(result, HttpStatus.OK); } @RequestMapping(value = "edit/publish", method = RequestMethod.POST) public @ResponseBody List<? extends Object> publishObjects(@RequestParam("ids") String ids, HttpServletRequest request) { return publishObjects(ids, true, request.getRemoteUser()); } @RequestMapping(value = "edit/unpublish", method = RequestMethod.POST) public @ResponseBody List<? extends Object> unpublishObjects(@RequestParam("ids") String ids, HttpServletRequest request) { return publishObjects(ids, false, request.getRemoteUser()); } public List<? extends Object> publishObjects(String ids, boolean publish, String username) { if (ids == null) return null; List<Object> results = new ArrayList<Object>(); for (String id : ids.split("\n")) { results.add(this.publishObject(new PID(id), publish, username)); } return results; } }