/* * * This is a simple Content Management System (CMS) * Copyright (C) 2010 Imran M Yousuf (imyousuf@smartitengineering.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU 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 com.smartitengineering.cms.client.impl; import com.smartitengineering.cms.client.api.ContentSearcherResource; import com.smartitengineering.cms.client.api.RootResource; import com.smartitengineering.cms.client.api.UriTemplateResource; import com.smartitengineering.cms.client.api.WorkspaceContentResouce; import com.smartitengineering.cms.client.api.WorkspaceFeedResource; import com.smartitengineering.cms.ws.common.domains.Workspace; import com.smartitengineering.cms.ws.common.domains.WorkspaceId; import com.smartitengineering.cms.ws.common.providers.JacksonJsonProvider; import com.smartitengineering.cms.ws.common.providers.TextURIListProvider; import com.smartitengineering.util.bean.PropertiesLocator; import com.smartitengineering.util.rest.atom.AbstractFeedClientResource; import com.smartitengineering.util.rest.atom.AtomClientUtil; import com.smartitengineering.util.rest.client.ApplicationWideClientFactoryImpl; import com.smartitengineering.util.rest.client.ClientUtil; import com.smartitengineering.util.rest.client.ConfigProcessor; import com.smartitengineering.util.rest.client.ConnectionConfig; import com.smartitengineering.util.rest.client.Resource; import com.smartitengineering.util.rest.client.ResourceLink; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.UniformInterfaceException; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.atom.abdera.impl.provider.entity.FeedProvider; import com.sun.jersey.core.util.MultivaluedMapImpl; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Properties; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.UriBuilder; import org.apache.abdera.model.Entry; import org.apache.abdera.model.Feed; import org.apache.abdera.model.Link; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author imyousuf */ public class RootResourceImpl extends AbstractFeedClientResource<Resource<? extends Feed>> implements RootResource { private static final Logger LOGGER = LoggerFactory.getLogger(RootResourceImpl.class); private static final int PORT = 10080; public static final String ROOT_URI_STRING = "http://localhost:" + PORT + "/"; public static final String REL_TEMPLATES = "templates"; private static final ConnectionConfig SMART_CMS_CONNECTION_CONFIG; private static final boolean CONNECTION_CONFIGURED; private static final URI SMART_CMS_BASE_URI; private static final ConfigProcessor CONFIG_PROCESSOR = new CmsConfigProcessor(); static { if (LOGGER.isInfoEnabled()) { System.setProperty("com.smartitengineering.util.rest.client.ApplicationWideClientFactoryImpl.trace", "true"); } SMART_CMS_CONNECTION_CONFIG = new ConnectionConfig(); String propFileName = "smart-cms-client-config.properties"; PropertiesLocator locator = new PropertiesLocator(); locator.setSmartLocations(propFileName); final Properties properties = new Properties(); try { locator.loadProperties(properties); } catch (IOException ex) { LOGGER.warn("Exception!", ex); } if (!properties.isEmpty()) { CONNECTION_CONFIGURED = true; SMART_CMS_CONNECTION_CONFIG.setBasicUri(properties.getProperty("baseUri", "")); SMART_CMS_CONNECTION_CONFIG.setContextPath(properties.getProperty("contextPath", "/")); SMART_CMS_CONNECTION_CONFIG.setHost(properties.getProperty("host", "localhost")); SMART_CMS_CONNECTION_CONFIG.setPort(NumberUtils.toInt(properties.getProperty("port", ""), 9090)); SMART_CMS_BASE_URI = UriBuilder.fromUri(SMART_CMS_CONNECTION_CONFIG.getContextPath()).path(SMART_CMS_CONNECTION_CONFIG. getBasicUri()).host(SMART_CMS_CONNECTION_CONFIG.getHost()).port(SMART_CMS_CONNECTION_CONFIG.getPort()). scheme("http").build(); } else { CONNECTION_CONFIGURED = false; SMART_CMS_BASE_URI = null; } } private RootResourceImpl(URI uri) throws IllegalArgumentException, UniformInterfaceException { super(null, CONNECTION_CONFIGURED && uri == null ? SMART_CMS_BASE_URI : uri, false, CONNECTION_CONFIGURED ? ApplicationWideClientFactoryImpl.getClientFactory(SMART_CMS_CONNECTION_CONFIG, CONFIG_PROCESSOR) : null); if (logger.isDebugEnabled()) { logger.debug("Root resource URI for Smart CMS " + uri); } } @Override protected void processClientConfig(ClientConfig clientConfig) { CONFIG_PROCESSOR.process(clientConfig); } private static class CmsConfigProcessor implements ConfigProcessor { public CmsConfigProcessor() { } @Override public void process(ClientConfig clientConfig) { clientConfig.getClasses().add(JacksonJsonProvider.class); clientConfig.getClasses().add(TextURIListProvider.class); clientConfig.getClasses().add(FeedProvider.class); } } @Override protected Resource<? extends Feed> instantiatePageableResource(ResourceLink link) { return null; } @Override public Collection<WorkspaceContentResouce> getWorkspaces() { final Feed feed = getLastReadStateOfEntity(); if (feed == null) { return Collections.EMPTY_LIST; } List<Entry> entries = feed.getEntries(); List<WorkspaceContentResouce> list = new ArrayList<WorkspaceContentResouce>(entries.size()); for (Entry entry : entries) { final List<Link> links = entry.getLinks(WorkspaceContentResouce.WORKSPACE_CONTENT); Link link = null; for (Link tmp : links) { if (MediaType.APPLICATION_JSON.equals(tmp.getMimeType().toString())) { link = tmp; } } list.add(new WorkspaceContentResourceImpl(this, AtomClientUtil.convertFromAtomLinkToResourceLink(link))); } return list; } public static RootResource getRoot(URI uri) { try { RootResource resource = new RootResourceImpl(uri); return resource; } catch (RuntimeException ex) { LOGGER.error(ex.getMessage(), ex); throw ex; } } @Override public Workspace createWorkspace(WorkspaceId workspaceId) throws URISyntaxException { final MultivaluedMap<String, String> map = new MultivaluedMapImpl(); map.add("name", workspaceId.getName()); map.add("namespace", workspaceId.getGlobalNamespace()); ClientResponse response = post(MediaType.APPLICATION_FORM_URLENCODED, map, ClientResponse.Status.CREATED); ResourceLink link = ClientUtil.createResourceLink(WorkspaceContentResouce.WORKSPACE_CONTENT, response.getLocation(), MediaType.APPLICATION_JSON); WorkspaceContentResouce workspaceContentResouce = new WorkspaceContentResourceImpl(this, link); Workspace workspace = workspaceContentResouce.getLastReadStateOfEntity(); return workspace; } @Override public Collection<WorkspaceFeedResource> getWorkspaceFeeds() { try { final Feed feed = getLastReadStateOfEntity(); List<Entry> entries = feed.getEntries(); List<WorkspaceFeedResource> list = new ArrayList<WorkspaceFeedResource>(entries.size()); for (Entry entry : entries) { final List<Link> links = entry.getLinks(WorkspaceContentResouce.WORKSPACE_CONTENT); Link link = null; for (Link tmp : links) { if (MediaType.APPLICATION_ATOM_XML.equals(tmp.getMimeType().toString())) { link = tmp; } } list.add(new WorkspaceFeedResourceImpl(this, AtomClientUtil.convertFromAtomLinkToResourceLink(link))); } return list; } catch (UniformInterfaceException exception) { if (logger.isDebugEnabled()) { logger.debug("Exception while getting..", exception); } if (exception.getResponse().getStatus() != ClientResponse.Status.NO_CONTENT.getStatusCode()) { logger.error("Rethrowing the exception as it was not expected. Turn on Debug to see more."); throw exception; } else { return Collections.emptyList(); } } } @Override public ContentSearcherResource searchContent(String query) { Link link = get().getLink("search"); if (StringUtils.isNotBlank(query)) { String strLink = link.getHref().toASCIIString(); strLink = strLink + "?" + query; link.setHref(strLink); } return new ContentSearcherResourceImpl(this, AtomClientUtil.convertFromAtomLinkToResourceLink(link)); } @Override public UriTemplateResource getTemplates() { try { final ResourceLink first = getRelatedResourceUris().getFirst(REL_TEMPLATES); if (logger.isDebugEnabled()) { logger.debug("Templates URI " + first); } return new UriTemplateResourceImpl(this, first); } catch (Exception ex) { throw new RuntimeException(ex); } } }