| /* |
| */ |
| package org.apache.taverna.server.master.notification.atom; |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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. |
| */ |
| |
| import static java.lang.String.format; |
| import static java.util.UUID.randomUUID; |
| import static javax.ws.rs.core.UriBuilder.fromUri; |
| import static org.apache.taverna.server.master.common.Roles.USER; |
| import static org.apache.taverna.server.master.common.Uri.secure; |
| |
| import java.net.URI; |
| import java.util.Date; |
| |
| import javax.annotation.security.RolesAllowed; |
| import javax.servlet.ServletContext; |
| import javax.ws.rs.core.UriBuilder; |
| import javax.ws.rs.core.UriInfo; |
| |
| import org.apache.abdera.Abdera; |
| import org.apache.abdera.model.Entry; |
| import org.apache.abdera.model.Feed; |
| import org.springframework.beans.factory.annotation.Required; |
| import org.springframework.web.context.ServletContextAware; |
| import org.apache.taverna.server.master.TavernaServerSupport; |
| import org.apache.taverna.server.master.interfaces.TavernaRun; |
| import org.apache.taverna.server.master.interfaces.UriBuilderFactory; |
| import org.apache.taverna.server.master.rest.TavernaServerREST.EventFeed; |
| import org.apache.taverna.server.master.utils.InvocationCounter.CallCounted; |
| |
| /** |
| * Simple REST handler that allows an Atom feed to be served up of events |
| * generated by workflow runs. |
| * |
| * @author Donal Fellows |
| */ |
| public class AtomFeed implements EventFeed, UriBuilderFactory, |
| ServletContextAware { |
| /** |
| * The name of a parameter that states what address we should claim that the |
| * feed's internally-generated URIs are relative to. If not set, a default |
| * will be guessed. |
| */ |
| public static final String PREFERRED_URI_PARAM = "taverna.preferredUserUri"; |
| private EventDAO eventSource; |
| private TavernaServerSupport support; |
| private URI baseURI; |
| private Abdera abdera; |
| private String feedLanguage = "en"; |
| private String uuid = randomUUID().toString(); |
| |
| @Required |
| public void setEventSource(EventDAO eventSource) { |
| this.eventSource = eventSource; |
| } |
| |
| @Required |
| public void setSupport(TavernaServerSupport support) { |
| this.support = support; |
| } |
| |
| public void setFeedLanguage(String language) { |
| this.feedLanguage = language; |
| } |
| |
| public String getFeedLanguage() { |
| return feedLanguage; |
| } |
| |
| @Required |
| public void setAbdera(Abdera abdera) { |
| this.abdera = abdera; |
| } |
| |
| @Override |
| @CallCounted |
| @RolesAllowed(USER) |
| public Feed getFeed(UriInfo ui) { |
| Feed feed = abdera.getFactory().newFeed(); |
| feed.setTitle("events relating to workflow runs").setLanguage( |
| feedLanguage); |
| String user = support.getPrincipal().toString() |
| .replaceAll("[^A-Za-z0-9]+", ""); |
| feed.setId(format("urn:taverna-server:%s:%s", uuid, user)); |
| org.joda.time.DateTime modification = null; |
| for (Event e : eventSource.getEvents(support.getPrincipal())) { |
| if (modification == null || e.getPublished().isAfter(modification)) |
| modification = e.getPublished(); |
| feed.addEntry(e.getEntry(abdera, feedLanguage)); |
| } |
| if (modification == null) |
| feed.setUpdated(new Date()); |
| else |
| feed.setUpdated(modification.toDate()); |
| feed.addLink(ui.getAbsolutePath().toASCIIString(), "self"); |
| return feed; |
| } |
| |
| @Override |
| @CallCounted |
| @RolesAllowed(USER) |
| public Entry getEvent(String id) { |
| return eventSource.getEvent(support.getPrincipal(), id).getEntry( |
| abdera, feedLanguage); |
| } |
| |
| @Override |
| public UriBuilder getRunUriBuilder(TavernaRun run) { |
| return secure(fromUri(getBaseUriBuilder().path("runs/{uuid}").build( |
| run.getId()))); |
| } |
| |
| @Override |
| public UriBuilder getBaseUriBuilder() { |
| return secure(fromUri(baseURI)); |
| } |
| |
| @Override |
| public String resolve(String uri) { |
| if (uri == null) |
| return null; |
| return secure(baseURI, uri).toString(); |
| } |
| |
| @Override |
| public void setServletContext(ServletContext servletContext) { |
| String base = servletContext.getInitParameter(PREFERRED_URI_PARAM); |
| if (base == null) |
| base = servletContext.getContextPath() + "/rest"; |
| baseURI = URI.create(base); |
| } |
| } |