String user = "anonymous"; WcmApiService wcm = WcmApi.getInstance(); Category cat = wcm.findCategory("/Events/Top Events", user); List<Post> topEvents = wcm.findPosts(cat.getId(), Post.PUBLISHED, user); for (Post post : topEvents) { ... }
GateIn WCM offers a simplified API as an alternative to templates mechanism.
WCM API allows to access posts, categories, comments and uploads from third party applications deployed on GateIn / JBoss Portal.
WCM API is composed by the following packages:
package |
description |
org.gatein.wcm.api.domain |
It contains WCM classes representing Category, Comment, Post and Upload |
org.gatein.wcm.api.services |
It contains main interface API for WCM query operations |
org.gatein.wcm.api.util |
It contains helper classes for html manipulation |
org.gatein.wcm.api |
It contains WcmApi used to get an instance of WCM API |
String user = "anonymous"; WcmApiService wcm = WcmApi.getInstance(); Category cat = wcm.findCategory("/Events/Top Events", user); List<Post> topEvents = wcm.findPosts(cat.getId(), Post.PUBLISHED, user); for (Post post : topEvents) { ... }
We can see in the example that main entry point of API is
WcmApiService wcm = WcmApi.getInstance();
WcmApi is just a helper class to give access to the EJB in a simplistic way.
This package represents main elements of WCM domain:
/** * Categories group content (Posts, Uploads). * Categories have a tree structure with Category's parent reference. * Light representation from org.gatein.wcm.domain.Category class for remote api. * * @author <a href="mailto:lponce@redhat.com">Lucas Ponce</a> */ public class Category implements Serializable { /** * Normal Category. * It's defined for semantic porpuse, an object should have only 1 Category but it can have N Tags. */ public static final Character CATEGORY = '2'; /** * Tag Category. * It's defined for semantic porpuse, an object should have only 1 Category but it can have N Tags. */ public static final Character TAG = '3'; /** * Folder Category. * A Folder Category can group other categories. */ public static final Character FOLDER = '1'; private Long id; private String name; private Character type; private int numChildren; private String path; ... getters and setters ... }
/** * Comments are attached to Posts. * Light representation from org.gatein.wcm.domain.Comment class for remote api. * * @author <a href="mailto:lponce@redhat.com">Lucas Ponce</a> */ public class Comment implements Serializable { /** * Post can accept comments from non-logged users. */ public static final Character ANONYMOUS = 'A'; /** * Post accepts only comments from GateIn users. */ public static final Character LOGGED = 'L'; /** * This Post doesn't accept comments. */ public static final Character NO_COMMENTS = 'N'; private Long id; private Long postId; private String author; private String authorEmail; private String authorUrl; private Calendar created; private String content; private Character status; ... getters and setters ... }
/** * Post represents a content publication in the GateIn WCM system. * Light representation from org.gatein.wcm.domain.Post class for remote api. * * @author <a href="mailto:lponce@redhat.com">Lucas Ponce</a> */ public class Post implements Serializable { /** * Post is public and it can be accessible from Content Portlets. */ public static final Character PUBLISHED = 'P'; /** * Post is in draft mode and it can not be accessible from Content Portlets. */ public static final Character DRAFT = 'D'; private Long id; private Long version; private String author; private Calendar created; private String content; private String title; private String excerpt; private Character postStatus; private Calendar modified; private String locale; private Character commentsStatus; private Set<Comment> comments = new HashSet<Comment>(); private Set<Category> categories = new HashSet<Category>(); ... getters and setters ... }
/** * Upload represents files uploaded into wcm as images or resources. * These resources will be accessible through special wcm links. * Files binary are stored directly into file system, this class represents metadata of the file. * Light representation from org.gatein.wcm.domain.Upload class for remote api. * * @author <a href="mailto:lponce@redhat.com">Lucas Ponce</a> */ public class Upload implements Serializable { private Long id; private Long version; private String fileName; private String storedName; private String mimeType; private Calendar created; private Calendar modified; private String user; private String description; private Set<Category> categories = new HashSet<Category>(); ... getters and setters ... }
/** * Remote API for org.gatein.wcm.api.domain.* model. * Query operations. * * @author <a href="mailto:lponce@redhat.com">Lucas Ponce</a> */ @Remote public interface WcmApiService { /** * @param user who performs operation * @return List of Categories with no parent that user can read * @throws Exception */ List<Category> findRootCategories(String user) throws Exception; /** * @param cat Parent category * @param user who performs operation * @return List of children Categories for cat * @throws Exception */ List<Category> findChildren(Category cat, String user) throws Exception; /** * @param path Category's path * @param user who performs operation * @return Category's defined by path or null if user has not rights to read or if Category doesn't exist * @throws Exception */ Category findCategory(String path, String user) throws Exception; /** * @param user who performs operation * @return List of Posts that user can read * @throws Exception */ List<Post> findPosts(String user) throws Exception; /** * @param categoryId Category's id * @param user who performs operation * @return List of Posts attached to a Category * @throws Exception */ List<Post> findPosts(Long categoryId, String user) throws Exception; /** * @param filterName Post name for filter * @param user who performs operation * @return List of Posts attached filtered by name * @throws Exception */ List<Post> findPosts(String filterName, String user) throws Exception; /** * @param categoryId Category's id * @param status Post's status * @param user who performs operation * @return List of Posts linked by Category defined by categoryId that user can read filtered by Post's status * @throws Exception */ List<Post> findPosts(Long categoryId, Character status, String user) throws Exception; /** * @param categoryId Category's id * @param locale Locale used as a key for a Relationship * @param status Post's status * @param user who performs operation * @return List of Posts linked by Category defined by categoryId that user can read filtered by Post's status * @throws Exception */ List<Post> findPosts(Long categoryId, String locale, Character status, String user) throws Exception; /** * @param id Post's id * @param user who performs operation * @return Post defined by id if user has rights to read or null otherwise * @throws Exception */ Post findPost(Long id, String user) throws Exception; /** * @param id Post's id * @param locale Locale used as a key for a Relationship * @param user who performs operation * @return Post defined by id if user has rights to read or null otherwise * @throws Exception */ Post findPost(Long id, String locale, String user) throws Exception; /** * @param user who performs operation * @return List of Uploads that user can read * @throws Exception */ List<Upload> findUploads(String user) throws Exception; /** * @param filterName Filter for Upload's description * @param user who performs operation * @return List of Uploads that user can read filtered by Upload's description * @throws Exception */ List<Upload> findUploads(String filterName, String user) throws Exception; /** * @param categoryId Category's id * @param user who performs operation * @return List of Uploads that user can read filtered by Category defined by id * @throws Exception */ List<Upload> findUploads(Long categoryId, String user) throws Exception; /** * @param id Upload's id * @param user who performs operation * @return Upload defined by id if user has rights to read * @throws Exception */ Upload findUpload(Long id, String user) throws Exception; /** * Adds a Comment in a Post. * * @param postId Post's id * @param comment Comment to add * @param user who performs operation * @throws Exception */ void add(Long postId, Comment comment, String user) throws Exception; }
/** * Helper class for WCM content manipulation. * * @author <a href="mailto:lponce@redhat.com">Lucas Ponce</a> */ public class WcmUtils { /** * @param html code from Post's content * @param index of the image to extract * @return src of the <img> tag to extract */ public static String extractSrcImg(String html, int index) { ... } /** * @param html code from Post's content * @param index of the image to extract * @return <img> tag to extract */ public static String extractImg(String html, int index) { ... } }
There are some examples available under the examples/api-example folder
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="org.gatein.wcm.api.WcmApi" %> <%@ page import="org.gatein.wcm.api.services.WcmApiService" %> <%@ page import="org.gatein.wcm.api.domain.Category" %> <%@ page import="org.gatein.wcm.api.domain.Post" %> <%@ page import="java.util.List" %> <%@ page import="org.gatein.wcm.api.util.WcmUtils" %> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="description" content=""> <meta name="author" content=""> <title>GateIn WCM API example using Bootstrap</title> <!-- Bootstrap core CSS --> <link href="css/bootstrap.min.css" rel="stylesheet"> <!-- Custom styles for this template --> <link href="css/jumbotron.css" rel="stylesheet"> </head> <body> <div class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/api-example/wcmPage.jsp">GateIn WCM API example</a> </div> <div class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li class="active"><a href="/api-example/wcmPage.jsp">Home</a></li> <li><a href="/portal/classic/magazine">Portal</a></li> <li class="dropdown"> <a href="/portal/classic/magazine" class="dropdown-toggle" data-toggle="dropdown">TicketMonster's Magazine <b class="caret"></b></a> <ul class="dropdown-menu"> <li><a href="/portal/classic/magazine/concert">Concert</a></li> <li><a href="/portal/classic/magazine/theatre">Theatre</a></li> <li><a href="/portal/classic/magazine/sporting">Sporting</a></li> </ul> </li> </ul> </div><!--/.navbar-collapse --> </div> </div> <% /* Access to GateIn WCM API */ String user = "anonymous"; WcmApiService wcm = WcmApi.getInstance(); Category cat = wcm.findCategory("/Events/Top Events", user); List<Post> topEvents = null; if (cat != null) { topEvents = wcm.findPosts(cat.getId(), Post.PUBLISHED, user); } if (topEvents != null) { if (topEvents.size() > 0) { Post top = topEvents.get(0); %> <!-- Main jumbotron for a primary marketing message or call to action --> <div class="jumbotron"> <div class="container"> <h1><%= top.getTitle() %></h1> <p><img src="<%= WcmUtils.extractSrcImg(top.getContent(), 0) %>" class="top-img"><%= top.getExcerpt() %></p> <p><a class="btn btn-primary btn-lg" href="wcmDetail.jsp?id=<%= top.getId() %>">Read more »</a></p> </div> </div> <% } if (topEvents.size() > 1) { %> <div class="container"> <!-- Example row of columns --> <!-- <div class="row"> --> <% for (int i = 1; i<topEvents.size(); i++) { Post event = topEvents.get(i); %> <div class="col-lg-4"> <h2><%= event.getTitle() %></h2> <p><img src="<%= WcmUtils.extractSrcImg(event.getContent(), 0) %>" class="event-img"></p> <p><%= event.getExcerpt() %> </p> <p><a class="btn btn-default" href="wcmDetail.jsp?id=<%= event.getId() %>">Read details »</a></p> </div> <% } %> <!-- </div> --> <hr> <footer> <p>© TicketMonster's Magazine 2013</p> </footer> </div> <!-- /container --> <% } } %> <!-- Bootstrap core JavaScript ================================================== --> <!-- Placed at the end of the document so the pages load faster --> <script src="js/jquery.js"></script> <script src="js/bootstrap.min.js"></script> </body> </html>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="org.gatein.wcm.api.WcmApi" %> <%@ page import="org.gatein.wcm.api.services.WcmApiService" %> <%@ page import="org.gatein.wcm.api.domain.Category" %> <%@ page import="org.gatein.wcm.api.domain.Post" %> <%@ page import="java.util.List" %> <%@ page import="org.gatein.wcm.api.util.WcmUtils" %> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="description" content=""> <meta name="author" content=""> <title>GateIn WCM API example using Bootstrap</title> <!-- Bootstrap core CSS --> <link href="css/bootstrap.min.css" rel="stylesheet"> <!-- Custom styles for this template --> <link href="css/jumbotron.css" rel="stylesheet"> </head> <body> <div class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/api-example/wcmPage.jsp">GateIn WCM API example</a> </div> <div class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li class="active"><a href="/api-example/wcmPage.jsp">Home</a></li> <li><a href="/portal/classic/magazine">Portal</a></li> <li class="dropdown"> <a href="/portal/classic/magazine" class="dropdown-toggle" data-toggle="dropdown">TicketMonster's Magazine <b class="caret"></b></a> <ul class="dropdown-menu"> <li><a href="/portal/classic/magazine/concert">Concert</a></li> <li><a href="/portal/classic/magazine/theatre">Theatre</a></li> <li><a href="/portal/classic/magazine/sporting">Sporting</a></li> </ul> </li> </ul> </div><!--/.navbar-collapse --> </div> </div> <% /* Access to GateIn WCM API */ String id = request.getParameter("id"); String user = "anonymous"; WcmApiService wcm = WcmApi.getInstance(); if (id != null) { Post detail = wcm.findPost(new Long(id), user); %> <!-- Main jumbotron for a primary marketing message or call to action --> <div class="jumbotron"> <div class="container"> <h1><%= detail.getTitle() %></h1> <p><img src="<%= WcmUtils.extractSrcImg(detail.getContent(), 0) %>" class="top-img"><%= detail.getExcerpt() %></p> </div> </div> <div class="container"> <% String skipImg = WcmUtils.extractImg(detail.getContent(), 0); String content = detail.getContent(); if (!"".equals(skipImg)) { content = content.replace(skipImg, ""); } %> <p><%= content %></p> <hr> <footer> <p>© TicketMonster's Magazine 2013</p> </footer> </div> <% } %> <!-- Bootstrap core JavaScript ================================================== --> <!-- Placed at the end of the document so the pages load faster --> <script src="js/jquery.js"></script> <script src="js/bootstrap.min.js"></script> </body> </html>