/*************************************************************************** * Copyright (C) 2003-2009 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. * **************************************************************************/ package org.exoplatform.wcm.connector.collaboration; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.Value; import javax.jcr.query.Query; import javax.jcr.query.QueryManager; import javax.jcr.query.QueryResult; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.exoplatform.commons.utils.ISO8601; import org.exoplatform.services.cms.drives.DriveData; import org.exoplatform.services.cms.drives.ManageDriveService; import org.exoplatform.services.ecm.publication.PublicationService; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.jcr.impl.core.query.QueryImpl; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.rest.resource.ResourceContainer; import org.exoplatform.services.wcm.utils.WCMCoreUtils; /** * Returns a list of published documents. * * @LevelAPI Provisional * * @anchor PublicationGetDocumentRESTService */ @Path("/publication/presentation/") public class PublicationGetDocumentRESTService implements ResourceContainer { private RepositoryService repositoryService_; private PublicationService publicationService_; private ManageDriveService manageDriveService_; final static public String DEFAULT_ITEM = "5"; /** The Constant LAST_MODIFIED_PROPERTY. */ private static final String LAST_MODIFIED_PROPERTY = "Last-Modified"; /** The Constant IF_MODIFIED_SINCE_DATE_FORMAT. */ private static final String IF_MODIFIED_SINCE_DATE_FORMAT = "EEE, dd MMM yyyy HH:mm:ss z"; private static final Log LOG = ExoLogger.getLogger(PublicationGetDocumentRESTService.class.getName()); public PublicationGetDocumentRESTService(RepositoryService repositoryService, PublicationService publicationService, ManageDriveService manageDriveService) { repositoryService_ = repositoryService; publicationService_ = publicationService; manageDriveService_ = manageDriveService; } /** * Returns a list of published documents by the default plugin. * For example: {{{/portal/rest/publication/presentation/{repository}/{workspace}/{state}?showItems={numberOfItem}}}} * * @param repository The repository name. * @param workspace The workspace name. * @param state The state is specified to classify the process. * @param showItems Shows the number of items per page. * @return * @throws Exception * * @anchor PublicationGetDocumentRESTService.getPublishDocument */ @Path("/{repository}/{workspace}/{state}/") @GET // @OutputTransformer(Bean2JsonOutputTransformer.class) public Response getPublishDocument(@PathParam("repository") String repository, @PathParam("workspace") String workspace, @PathParam("state") String state, @QueryParam("showItems") String showItems) throws Exception { return getPublishDocuments(workspace, state, null, showItems); } /** * Returns a list of published documents by a specific plugin. * For example: {{{/portal/rest/publication/presentation/{repository}/{workspace}/{publicationPluginName}/{state}?showItems={numberOfItem}}}} * * @param repoName The repository name. * @param workspace The workspace name. * @param publicationPluginName The name of the plugin. * @param state The state is specified to classify the process. * @param showItems Shows the number of items per page. * @return * @throws Exception * * @anchor PublicationGetDocumentRESTService.getPublishedListDocument */ @Path("/{repository}/{workspace}/{publicationPluginName}/{state}/") @GET // @OutputTransformer(Bean2JsonOutputTransformer.class) public Response getPublishedListDocument(@PathParam("repository") String repoName, @PathParam("workspace") String workspace, @PathParam("publicationPluginName") String publicationPluginName, @PathParam("state") String state, @QueryParam("showItems") String showItems) throws Exception { return getPublishDocuments(workspace, state, publicationPluginName, showItems); } @SuppressWarnings("unused") private Response getPublishDocuments(String wsName, String state, String pluginName, String itemPage) throws Exception { List<PublishedNode> publishedNodes = new ArrayList<PublishedNode>(); PublishedListNode publishedListNode = new PublishedListNode(); if(itemPage == null) itemPage = DEFAULT_ITEM; int item = Integer.parseInt(itemPage); String queryStatement = "select * from publication:publication order by exo:dateModified ASC"; SessionProvider provider = WCMCoreUtils.createAnonimProvider(); Session session = provider.getSession(wsName, repositoryService_.getCurrentRepository()); QueryManager queryManager = session.getWorkspace().getQueryManager(); QueryImpl query = (QueryImpl) queryManager.createQuery(queryStatement, Query.SQL); query.setLimit(item); query.setOffset(0); QueryResult queryResult = query.execute(); NodeIterator iter = queryResult.getNodes(); List<Node> listNode = getNodePublish(iter, pluginName); Collections.sort(listNode, new DateComparator()); if(listNode.size() < item) item = listNode.size(); List<DriveData> lstDrive = manageDriveService_.getAllDrives(); for (int i = 0; i < item; i++) { PublishedNode publishedNode = new PublishedNode(); Node node = listNode.get(i); publishedNode.setName(node.getName()); publishedNode.setPath(node.getPath()); publishedNode.setDatePublished(getPublishedDateTime(node)); publishedNode.setDriveName(getDriveName(lstDrive, node)); publishedNodes.add(publishedNode); } publishedListNode.setPublishedListNode(publishedNodes); session.logout(); DateFormat dateFormat = new SimpleDateFormat(IF_MODIFIED_SINCE_DATE_FORMAT); return Response.ok(publishedListNode, new MediaType("application", "json")) .header(LAST_MODIFIED_PROPERTY, dateFormat.format(new Date())) .build(); } private List<Node> getNodePublish(NodeIterator iter, String pluginName) throws Exception { List<Node> listNode = new ArrayList<Node>(); while (iter.hasNext()) { Node node = iter.nextNode(); Node nodecheck = publicationService_.getNodePublish(node, pluginName); if (nodecheck != null) { listNode.add(node); } } return listNode; } private String getPublishedDateTime(Node currentNode) throws Exception { Value[] history = currentNode.getProperty("publication:history").getValues(); String time = currentNode.getProperty("exo:dateModified").getString(); for (Value value : history) { String[] arrHistory = value.getString().split(";"); time = arrHistory[3]; } return String.valueOf(ISO8601.parse(time).getTimeInMillis()); } private static class DateComparator implements Comparator<Node> { public int compare(Node node1, Node node2) { try { SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd.HHmmss.SSS"); Date date1 = formatter.parse(getDateTime(node1)); Date date2 = formatter.parse(getDateTime(node2)); return date2.compareTo(date1); } catch (Exception e) { if (LOG.isErrorEnabled()) { LOG.error("Unexpected error", e); } } return 0; } private String getDateTime(Node currentNode) throws Exception { Value[] history = currentNode.getProperty("publication:history").getValues(); for (Value value : history) { String[] arrHistory = value.getString().split(";"); return arrHistory[3]; } return currentNode.getProperty("exo:dateModified").getString(); } } private String getDriveName(List<DriveData> lstDrive, Node node) throws RepositoryException{ String driveName = ""; for (DriveData drive : lstDrive) { if (node.getSession().getWorkspace().getName().equals(drive.getWorkspace()) && node.getPath().contains(drive.getHomePath()) && drive.getHomePath().equals("/")) { driveName = drive.getName(); break; } } return driveName; } public class PublishedNode { private String nodeName_; private String nodePath_; private String driveName_; private String datePublished_; public void setName(String nodeName) { nodeName_ = nodeName; } public String getName() { return nodeName_; } public void setPath(String nodePath) { nodePath_ = nodePath; } public String getPath() { return nodePath_; } public void setDriveName(String driveName) { driveName_ = driveName; } public String getDriveName() { return driveName_; } public void setDatePublished(String datePublished) { datePublished_ = datePublished; } public String getDatePublished() { return datePublished_; } } public class PublishedListNode { private List<PublishedNode> publishedListNode_; public void setPublishedListNode(List<PublishedNode> publishedListNode) { publishedListNode_ = publishedListNode; } public List<PublishedNode> getPublishedListNode() { return publishedListNode_; } } }