Package org.apache.wink.example.bookmarks

Source Code of org.apache.wink.example.bookmarks.BookmarksResource

/*******************************************************************************
* 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.
*******************************************************************************/

package org.apache.wink.example.bookmarks;

import java.net.URI;
import java.util.Date;
import java.util.Map;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

import org.apache.wink.common.annotations.Workspace;
import org.apache.wink.common.http.HttpStatus;
import org.apache.wink.common.model.synd.SyndContent;
import org.apache.wink.common.model.synd.SyndEntry;
import org.apache.wink.common.model.synd.SyndFeed;
import org.apache.wink.common.model.synd.SyndText;
import org.apache.wink.server.utils.LinkBuilders;

@Workspace(workspaceTitle = "Demo Bookmarks Service", collectionTitle = "My Bookmarks")
@Path("/bookmarks")
public class BookmarksResource {
    private static final String SUB_RESOURCE_PATH = "{bookmark}";

    /**
     * This method is invoked when the HTTP GET method is issued by the client.
     * This occurs only when the requested representation (Http Accept header)
     * is Atom (application/atom+xml) or Json (application/json). The feed is
     * created with the mandatory fields. The feed will also contain the entries
     * found in the BookmarksStore. Links are generated for the feed and for the
     * entries in the response.
     *
     * @return the SyndFeed instance that will be serialized as an Atom or as
     *         Json
     */
    @GET
    @Produces( {MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON})
    public SyndFeed getBookmarks(@Context LinkBuilders linkProcessor, @Context UriInfo uriInfo) {
        SyndFeed feed = new SyndFeed();
        feed.setId("urn:collection:bookmarks");
        feed.setTitle(new SyndText("My Bookmarks"));
        feed.setUpdated(new Date());
        feed.setBase(uriInfo.getAbsolutePath().toString());

        // add entries to the feed, based on the existing bookmarks in the
        // memory store
        // (feed entries have no content, they have just metadata so there is no
        // need to set content
        // here)
        Map<String, String> bookmarks = BookmarkStore.getInstance().getBookmarks();

        for (String key : bookmarks.keySet()) {
            SyndEntry entry = createEntry(key, bookmarks.get(key), linkProcessor, null);
            feed.addEntry(entry);
        }
        // generate collection links in the response
        linkProcessor.createSystemLinksBuilder().build(feed.getLinks());
        return feed;
    }

    /**
     * This method is invoked when the HTTP POST method is issued by the client.
     * This occurs only when the requested representation (Http Accept header)
     * is Atom (application/atom+xml) or Json (application/json) and plain text
     * is provided in the HTTP request message body of content MIME type
     * "text/plain" (header "Content-Type" must be "text/plain"). This method
     * creates a new Bookmark resource based on the data in the request and puts
     * the new Bookmark into the BookmarkStore.
     *
     * @return response indicating the creation of the bookmark
     */
    @POST
    @Consumes( {MediaType.TEXT_PLAIN})
    @Produces( {MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON})
    public Response createBookmark(String bookmark,
                                   @Context UriInfo uriInfo,
                                   @Context LinkBuilders linkProcessor) {
        if (bookmark == null || bookmark.length() == 0) {
            return Response.status(HttpStatus.BAD_REQUEST.getCode()).build();
        }

        String bookmarkId = BookmarkStore.getNewId();
        BookmarkStore.getInstance().putBookmark(bookmarkId, bookmark);

        SyndEntry entry = createEntry(bookmarkId, bookmark, linkProcessor, uriInfo);

        URI location = uriInfo.getAbsolutePathBuilder().segment(bookmarkId).build();
        return Response.created(location).entity(entry).build();
    }

    /**
     * This method is invoked when the HTTP GET method is issued by the client.
     * This occurs only when the requested representation (Http Accept header)
     * is Atom (application/atom+xml) or Json (application/json). In the case
     * that the requested bookmark is found in the BookmarkStore a synd entry is
     * created with mandatory metadata fields and with metadata content that is
     * taken from the BookmarkStore.
     *
     * @param bookmarkId the bookmark id to get as it appears on the request uri
     * @return SyndEntry with the information about the bookmark
     */
    @Path(SUB_RESOURCE_PATH)
    @GET
    @Produces( {MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON})
    public SyndEntry getBookmark(@Context LinkBuilders linkProcessor,
                                 @Context UriInfo uriInfo,
                                 @PathParam("bookmark") String bookmarkId) {
        // check whether the bookmark exists in the memory store
        String bookmark = BookmarkStore.getInstance().getBookmark(bookmarkId);
        if (bookmark == null) {
            throw new WebApplicationException(Response.Status.NOT_FOUND);
        }
        return createEntry(bookmarkId, bookmark, linkProcessor, uriInfo);
    }

    /**
     * This method is invoked when the HTTP PUT method is issued by the client.
     * This occurs only when the requested representation (Http Accept header)
     * is Atom (application/atom+xml) or Json (application/json) and plain text
     * is provided in the HTTP request message body of content MIME type
     * "text/plain" (header "Content-Type" must be "text/plain"). This method
     * will update the requested bookmark in the BookmarkStore with new content
     * taken from the request message body.
     *
     * @param bookmarkId the bookmark id to update as it appears on the request
     *            uri
     * @return SyndEntry with the information about the updated bookmark
     * @throws Exception a problem with reading the input stream
     */
    @Path(SUB_RESOURCE_PATH)
    @PUT
    @Consumes(MediaType.TEXT_PLAIN)
    @Produces( {MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON})
    public SyndEntry updateBookmark(String bookmark,
                                    @Context LinkBuilders linkProcessor,
                                    @Context UriInfo uriInfo,
                                    @PathParam("bookmark") String bookmarkId) {
        // check whether the bookmark exists for update
        String value = BookmarkStore.getInstance().getBookmark(bookmarkId);
        if (value == null) {
            throw new WebApplicationException(Response.Status.NOT_FOUND);
        }

        // update existing bookmark in the memory store with new bookmark value
        BookmarkStore.getInstance().putBookmark(bookmarkId, bookmark);

        // create SyndEntry and return it
        return createEntry(bookmarkId, bookmark, linkProcessor, uriInfo);
    }

    /**
     * This method is invoked when the HTTP DELETE method is issued by the
     * client. This occurs only when the requested representation (Http Accept
     * header) is Atom (application/atom+xml) or Json (application/json). This
     * method deletes the bookmark from the BookmarkStore and returns the
     * deleted bookmark.
     *
     * @param bookmarkId the bookmark id to update as it appears on the request
     *            uri
     * @return SyndEntry with the information about the deleted bookmark
     */
    @Path(SUB_RESOURCE_PATH)
    @DELETE
    @Produces( {MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON})
    public SyndEntry deleteBookmark(@Context LinkBuilders linkProcessor,
                                    @Context UriInfo uriInfo,
                                    @PathParam("bookmark") String bookmarkId) {
        // check whether the bookmark exists for deletion
        String bookmark = BookmarkStore.getInstance().getBookmark(bookmarkId);
        if (bookmark == null) {
            throw new WebApplicationException(Response.Status.NOT_FOUND);
        }

        // Remove bookmark form the store
        BookmarkStore.getInstance().deleteBookmark(bookmarkId);

        // create SyndEntry and return it
        return createEntry(bookmarkId, bookmark, linkProcessor, uriInfo);
    }

    private SyndEntry createEntry(String bookmarkId,
                                  String content,
                                  LinkBuilders linkProcessor,
                                  UriInfo uriInfo) {
        SyndEntry entry = new SyndEntry();
        entry.setId(bookmarkId);
        entry.setTitle(new SyndText("My Bookmark " + bookmarkId));
        entry.setPublished(new Date());

        if (content != null) {
            entry.setContent(new SyndContent(content));
        }

        if (uriInfo != null) {
            entry.setBase(uriInfo.getAbsolutePath().toString());
        }

        linkProcessor.createSystemLinksBuilder().subResource(bookmarkId).build(entry.getLinks());
        return entry;
    }

}
TOP

Related Classes of org.apache.wink.example.bookmarks.BookmarksResource

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.