/* * JBoss, Home of Professional Open Source. * Copyright 2012, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.gatein.api.management; import org.gatein.api.EntityAlreadyExistsException; import org.gatein.api.EntityNotFoundException; import org.gatein.api.Portal; import org.gatein.api.common.Pagination; import org.gatein.api.page.Page; import org.gatein.api.page.PageId; import org.gatein.api.page.PageQuery; import org.gatein.api.security.Permission; import org.gatein.api.site.SiteId; import org.gatein.management.api.PathAddress; import org.gatein.management.api.annotations.Managed; import org.gatein.management.api.annotations.ManagedContext; import org.gatein.management.api.annotations.ManagedOperation; import org.gatein.management.api.annotations.ManagedRole; import org.gatein.management.api.annotations.MappedAttribute; import org.gatein.management.api.annotations.MappedPath; import org.gatein.management.api.model.ModelList; import org.gatein.management.api.model.ModelObject; import org.gatein.management.api.model.ModelProvider; import org.gatein.management.api.model.ModelReference; import org.gatein.management.api.model.ModelString; import org.gatein.management.api.operation.OperationNames; import java.util.List; import static org.gatein.api.management.Utils.*; /** * @author <a href="mailto:nscavell@redhat.com">Nick Scavelli</a> */ @Managed @SuppressWarnings("unused") public class PageManagementResource { private final Portal portal; private final ModelProvider modelProvider; private final SiteId siteId; private final PageQuery pagesQuery; public PageManagementResource(Portal portal, ModelProvider modelProvider, SiteId siteId) { this.portal = portal; this.modelProvider = modelProvider; this.siteId = siteId; this.pagesQuery = new PageQuery.Builder().withSiteId(siteId).build(); } @Managed(description = "Retrieves all pages for given site") public ModelList getPages(@ManagedContext PathAddress address, @MappedAttribute("offset") String offsetParam, @MappedAttribute("limit") String limitParam) { Pagination pagination = getPagination(offsetParam, limitParam, pagesQuery.getPagination()); List<Page> pages = portal.findPages(new PageQuery.Builder().from(pagesQuery).withPagination(pagination).build()); // Populate model return populateModel(pages, modelProvider.newModel(ModelList.class), address); } @Managed("{page-name}") public ModelObject getPage(@MappedPath("page-name") String name) { PageId pageId = new PageId(siteId, name); Page page = portal.getPage(pageId); if (page == null) { throw notFound("Could not retrieve page", pageId); } // Populate model return populateModel(page, modelProvider.newModel(ModelObject.class)); } @Managed("{page-name}") @ManagedRole("administrators") @ManagedOperation(name = OperationNames.REMOVE_RESOURCE, description = "Removes the given page from the portal") public void removePage(@MappedPath("page-name") String name) { PageId pageId = new PageId(siteId, name); try { if (!portal.removePage(pageId)) { throw notFound("Could not remove page", pageId); } } catch (EntityNotFoundException e) { throw notFound("Could not remove page", siteId); } } @Managed("{page-name}") @ManagedRole("administrators") @ManagedOperation(name = OperationNames.ADD_RESOURCE, description = "Adds the given page to the portal") public ModelObject addPage(@MappedPath("page-name") String name) { // Create the page PageId pageId = new PageId(siteId, name); Page page; try { page = portal.createPage(pageId); } catch (EntityAlreadyExistsException e) { throw alreadyExists("Could not add page", pageId); } catch (EntityNotFoundException e) { throw alreadyExists("Cannot add page", siteId); } // Save the page portal.savePage(page); // Retrieve page from api and populate model return populateModel(portal.getPage(pageId), modelProvider.newModel(ModelObject.class)); } @Managed("{page-name}") @ManagedRole("administrators") @ManagedOperation(name = OperationNames.UPDATE_RESOURCE, description = "Updates a page of the portal") public ModelObject updatePage(@MappedPath("page-name") String name, @ManagedContext ModelObject pageModel) { // Retrieve page from api, ensuring it exists PageId pageId = new PageId(siteId, name); Page page = portal.getPage(pageId); if (page == null) { throw notFound("Could not update page", pageId); } boolean changed = false; // Update displayName if (pageModel.has("displayName")) { ModelString displayNameModel = get(pageModel, ModelString.class, "displayName"); page.setDisplayName(displayNameModel.getValue()); changed = true; } // Update description if (pageModel.has("description")) { ModelString descModel = get(pageModel, ModelString.class, "description"); page.setDescription(descModel.getValue()); changed = true; } // Update access-permissions if (pageModel.has("access-permissions")) { Permission permission = getPermission(pageModel, false, "access-permissions"); page.setAccessPermission(permission); changed = true; } // Update edit-permissions if (pageModel.has("edit-permissions")) { Permission permission = getPermission(pageModel, true, "edit-permissions"); page.setEditPermission(permission); changed = true; } // Save changes if (changed) { portal.savePage(page); } // Retrieve page from api and populate model return populateModel(portal.getPage(pageId), modelProvider.newModel(ModelObject.class)); } private ModelList populateModel(List<Page> pages, ModelList list, PathAddress address) { for (Page page : pages) { if (Utils.hasPermission(page.getAccessPermission())) { ModelReference pageRef = list.add().asValue(ModelReference.class); pageRef.set("name", page.getName()); pageRef.set("siteType", page.getId().getSiteId().getType().name().toLowerCase()); pageRef.set("siteName", page.getId().getSiteId().getName()); pageRef.set(address.append(page.getName())); } } return list; } private ModelObject populateModel(Page page, ModelObject model) { model.set("name", page.getName()); model.set("displayName", page.getDisplayName()); model.set("description", page.getDescription()); populate("access-permissions", page.getAccessPermission(), model); populate("edit-permissions", page.getEditPermission(), model); return model; } }