You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by wo...@apache.org on 2009/12/10 17:30:08 UTC

svn commit: r889312 - in /portals/jetspeed-2/portal/trunk: components/jetspeed-portal/src/main/java/org/apache/jetspeed/services/rest/ jetspeed-portal-resources/src/main/resources/assembly/

Author: woonsan
Date: Thu Dec 10 16:30:07 2009
New Revision: 889312

URL: http://svn.apache.org/viewvc?rev=889312&view=rev
Log:
JS2-1087: Adding initial move actions in Page Layout Service (restful)

Added:
    portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/services/rest/PageLayoutService.java   (contents, props changed)
      - copied, changed from r889152, portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/services/rest/PageManagementService.java
Removed:
    portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/services/rest/PageManagementService.java
Modified:
    portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/jetspeed-restful-services.xml
    portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/pipelines.xml

Copied: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/services/rest/PageLayoutService.java (from r889152, portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/services/rest/PageManagementService.java)
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/services/rest/PageLayoutService.java?p2=portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/services/rest/PageLayoutService.java&p1=portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/services/rest/PageManagementService.java&r1=889152&r2=889312&rev=889312&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/services/rest/PageManagementService.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/services/rest/PageLayoutService.java Thu Dec 10 16:30:07 2009
@@ -22,42 +22,43 @@
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.DELETE;
-import javax.ws.rs.FormParam;
 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.QueryParam;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Context;
-import javax.ws.rs.core.PathSegment;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.math.NumberUtils;
 import org.apache.jetspeed.JetspeedActions;
 import org.apache.jetspeed.components.portletregistry.PortletRegistry;
-import org.apache.jetspeed.decoration.DecorationValve;
 import org.apache.jetspeed.layout.PageLayoutComponent;
 import org.apache.jetspeed.layout.PortletActionSecurityBehavior;
+import org.apache.jetspeed.om.page.ContentFragment;
 import org.apache.jetspeed.om.page.ContentPage;
-import org.apache.jetspeed.page.PageManager;
+import org.apache.jetspeed.om.portlet.InitParam;
+import org.apache.jetspeed.om.portlet.PortletDefinition;
 import org.apache.jetspeed.request.RequestContext;
+import org.apache.jetspeed.services.beans.ContentFragmentBean;
 import org.apache.jetspeed.services.beans.ContentPageBean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * PageManagementService
+ * PageLayoutService
  * 
  * @version $Id$
  */
-
-@Path("/")
-public class PageManagementService
+@Path("/pagelayout/")
+public class PageLayoutService
 {
     
-    private static Logger log = LoggerFactory.getLogger(PageManagementService.class);
+    private static Logger log = LoggerFactory.getLogger(PageLayoutService.class);
     
     @Context
     private ServletConfig servletConfig;
@@ -65,47 +66,37 @@
     @Context
     private ServletContext servletContext;
     
-    private PageManager pageManager;
-    
-    private PortletActionSecurityBehavior securityBehavior;
+    private PageLayoutComponent pageLayoutComponent;
     
     private PortletRegistry portletRegistry;
     
-    private DecorationValve decorationValve;
-    
-    private PageLayoutComponent pageLayoutComponent;
+    private PortletActionSecurityBehavior securityBehavior;
     
-    public PageManagementService(PageManager pageManager,
-                                       PortletActionSecurityBehavior securityBehavior,
-                                       PortletRegistry portletRegistry,
-                                       DecorationValve decorationValve,
-                                       PageLayoutComponent pageLayoutComponent)
+    public PageLayoutService(PageLayoutComponent pageLayoutComponent,
+                             PortletRegistry portletRegistry,
+                             PortletActionSecurityBehavior securityBehavior)
     {
-        this.pageManager = pageManager;
-        this.securityBehavior = securityBehavior;
-        this.portletRegistry = portletRegistry;
-        this.decorationValve = decorationValve;
         this.pageLayoutComponent = pageLayoutComponent;
+        this.portletRegistry = portletRegistry;
+        this.securityBehavior = securityBehavior;
     }
     
     @GET
-    @Path("/{path:.*}")
+    @Path("/page/")
     public ContentPageBean getContentPage(@Context HttpServletRequest servletRequest,
-                                          @Context UriInfo uriInfo,
-                                          @PathParam("path") List<PathSegment> pathSegments)
+                                          @Context UriInfo uriInfo)
     {
         RequestContext requestContext = (RequestContext) servletRequest.getAttribute(RequestContext.REQUEST_PORTALENV);
-        ContentPage contentPage = getContentPage(requestContext);
+        ContentPage contentPage = getContentPage(requestContext, JetspeedActions.VIEW);
         return new ContentPageBean(contentPage);
     }
     
     @POST
-    @Path("/{path:.*}")
-    public Response addContentFragment(@Context HttpServletRequest servletRequest,
-                                       @Context UriInfo uriInfo,
-                                       @PathParam("path") List<PathSegment> pathSegments,
-                                       @FormParam("type") String fragmentType,
-                                       @FormParam("name") String fragmentName)
+    @Path("/fragment/{type}/{name}/")
+    public ContentFragmentBean addContentFragment(@Context HttpServletRequest servletRequest,
+                                                  @Context UriInfo uriInfo,
+                                                  @PathParam("type") String fragmentType,
+                                                  @PathParam("name") String fragmentName)
     {
         if (StringUtils.isBlank(fragmentType) || StringUtils.isBlank(fragmentName))
         {
@@ -113,19 +104,24 @@
         }
         
         RequestContext requestContext = (RequestContext) servletRequest.getAttribute(RequestContext.REQUEST_PORTALENV);
-        ContentPage contentPage = getContentPage(requestContext);
-        
-        pageLayoutComponent.addPortlet(contentPage, fragmentType, fragmentName);
+        ContentPage contentPage = getContentPage(requestContext, JetspeedActions.EDIT);
         
-        return Response.ok().build();
+        try
+        {
+            ContentFragment contentFragment = pageLayoutComponent.addPortlet(contentPage, fragmentType, fragmentName);
+            return new ContentFragmentBean(contentFragment);
+        }
+        catch (Exception e)
+        {
+            throw new WebApplicationException(e);
+        }
     }
     
     @DELETE
-    @Path("/{path:.*}")
+    @Path("/fragment/{id}/")
     public Response deleteContentFragment(@Context HttpServletRequest servletRequest,
-                                       @Context UriInfo uriInfo,
-                                       @PathParam("path") List<PathSegment> pathSegments,
-                                       @QueryParam("id") String fragmentId)
+                                          @Context UriInfo uriInfo,
+                                          @PathParam("id") String fragmentId)
     {
         if (StringUtils.isBlank(fragmentId))
         {
@@ -133,20 +129,162 @@
         }
         
         RequestContext requestContext = (RequestContext) servletRequest.getAttribute(RequestContext.REQUEST_PORTALENV);
-        ContentPage contentPage = getContentPage(requestContext);
+        ContentPage contentPage = getContentPage(requestContext, JetspeedActions.EDIT);
         
-        pageLayoutComponent.removeFragment(contentPage, fragmentId);
+        try
+        {
+            pageLayoutComponent.removeFragment(contentPage, fragmentId);
+        }
+        catch (Exception e)
+        {
+            throw new WebApplicationException(e);
+        }
         
         return Response.ok().build();
     }
     
-    private ContentPage getContentPage(RequestContext requestContext) throws WebApplicationException
+    @PUT
+    @Path("/fragment/{id}/pos/")
+    public ContentFragmentBean moveContentFragment(@Context HttpServletRequest servletRequest,
+                                                   @Context UriInfo uriInfo,
+                                                   @PathParam("id") String fragmentId,
+                                                   @QueryParam("layout") String layoutFragmentId,
+                                                   @QueryParam("dir") String direction,
+                                                   @QueryParam("row") String rowParam,
+                                                   @QueryParam("col") String colParam,
+                                                   @QueryParam("x") String posXParam,
+                                                   @QueryParam("y") String posYParam,
+                                                   @QueryParam("z") String posZParam,
+                                                   @QueryParam("w") String posWidthParam,
+                                                   @QueryParam("h") String posHeightParam)
+    {
+        if (StringUtils.isBlank(fragmentId))
+        {
+            throw new WebApplicationException(new IllegalArgumentException("Fragment id not specified"));
+        }
+        
+        RequestContext requestContext = (RequestContext) servletRequest.getAttribute(RequestContext.REQUEST_PORTALENV);
+        ContentPage contentPage = getContentPage(requestContext, JetspeedActions.EDIT);
+        ContentFragment contentFragment = contentPage.getFragmentById(fragmentId);
+        
+        if (contentFragment == null)
+        {
+            throw new WebApplicationException(new IllegalArgumentException("Fragment not found with the specified id: " + fragmentId));
+        }
+        
+        ContentFragment layoutFragment = null;
+        
+        if (!StringUtils.isBlank(layoutFragmentId))
+        {
+            layoutFragment = contentPage.getFragmentByFragmentId(layoutFragmentId);
+            
+            if (layoutFragment == null)
+            {
+                throw new WebApplicationException(new IllegalArgumentException("Layout fragment not found with the specified id: " + layoutFragmentId));
+            }
+        }
+        else
+        {
+            layoutFragment = getParentFragment(pageLayoutComponent.getUnlockedRootFragment(contentPage), fragmentId);
+            
+            if (layoutFragment == null)
+            {
+                throw new WebApplicationException(new IllegalArgumentException("Layout fragment not found for the fragment: " + fragmentId));
+            }
+        }
+        
+        int layoutColumnCount = getColumnCountOfLayoutFragment(layoutFragment);
+        
+        if (!StringUtils.isBlank(direction))
+        {
+            int row = contentFragment.getLayoutRow();
+            int col = contentFragment.getLayoutColumn();
+            
+            direction = direction.trim();
+            
+            if ("left".equals(direction))
+            {
+                if (col > 0)
+                {
+                    --col;
+                }
+            }
+            else if ("right".equals(direction))
+            {
+                if (col < layoutColumnCount - 1)
+                {
+                    ++col;
+                }
+            }
+            else if ("up".equals(direction))
+            {
+                // TODO: retrieve all portlet fragments to calculate the real row number?
+                if (row > 0)
+                {
+                    --row;
+                }
+            }
+            else if ("down".equals(direction))
+            {
+                // TODO: retrieve all portlet fragments to calculate the real row number?
+                ++row;
+            }
+            else
+            {
+                throw new WebApplicationException(new IllegalArgumentException("Invalid direction: " + direction));
+            }
+            
+            rowParam = Integer.toString(row);
+            colParam = Integer.toString(col);
+        }
+        
+        if (!StringUtils.isBlank(rowParam) && !StringUtils.isBlank(colParam))
+        {
+            int row = NumberUtils.toInt(rowParam, -1);
+            int col = NumberUtils.toInt(colParam, -1);
+
+            try
+            {
+                pageLayoutComponent.updateRowColumn(contentFragment, row, col);
+                return new ContentFragmentBean(contentPage.getFragmentById(fragmentId));
+            }
+            catch (Exception e)
+            {
+                throw new WebApplicationException(e);
+            }
+        }
+        else
+        {
+            float posX = NumberUtils.toFloat(posXParam, -1.0f);
+            float posY = NumberUtils.toFloat(posYParam, -1.0f);
+            float posZ = NumberUtils.toFloat(posZParam, -1.0f);
+            float posWidth = NumberUtils.toFloat(posWidthParam, -1.0f);
+            float posHeight = NumberUtils.toFloat(posHeightParam, -1.0f);
+            
+            try
+            {
+                pageLayoutComponent.updatePosition(contentFragment, posX, posY, posZ, posWidth, posHeight);
+                return new ContentFragmentBean(contentPage.getFragmentById(fragmentId));
+            }
+            catch (Exception e)
+            {
+                throw new WebApplicationException(e);
+            }
+        }
+    }
+    
+    private ContentPage getContentPage(RequestContext requestContext, String action) throws WebApplicationException
     {
         try
         {
-            checkPageAccess(requestContext, JetspeedActions.VIEW);
-            // Run the Decoration valve to get actions
-            decorationValve.invoke(requestContext, null);
+            if (securityBehavior != null)
+            {
+                if (!securityBehavior.checkAccess(requestContext, action))
+                {
+                    throw new SecurityException("Insufficient access to view page");
+                }
+            }
+            
             return requestContext.getPage();
         }
         catch (Exception e)
@@ -155,15 +293,59 @@
         }
     }
     
-    private void checkPageAccess(RequestContext requestContext, String action) throws SecurityException
+    private ContentFragment getParentFragment(ContentFragment contentFragment, String fragmentId)
     {
-        if (securityBehavior != null)
+        for (ContentFragment child : (List<ContentFragment>) contentFragment.getFragments())
         {
-            if (!securityBehavior.checkAccess(requestContext, action))
+            if (fragmentId.equals(child.getId()))
             {
-                throw new SecurityException("Insufficient access to view page");
+                return contentFragment;
+            }
+            else if (ContentFragment.LAYOUT.equals(child.getType()))
+            {
+                ContentFragment parent = getParentFragment(child, fragmentId);
+                
+                if (parent != null)
+                {
+                    return parent;
+                }
             }
         }
+        
+        return null;
+    }
+    
+    private int getColumnCountOfLayoutFragment(ContentFragment layoutFragment)
+    {
+        int columnCount = 0;
+        
+        String sizes = layoutFragment.getLayoutSizes();
+        
+        if (StringUtils.isBlank(sizes))
+        {
+            PortletDefinition layoutPortletDef = portletRegistry.getPortletDefinitionByUniqueName(layoutFragment.getName(), true);
+            InitParam initParam = layoutPortletDef.getInitParam("sizes");
+            
+            if (initParam != null)
+            {
+                sizes = initParam.getParamValue();
+            }
+            else
+            {
+                initParam = layoutPortletDef.getInitParam("columns");
+                
+                if (initParam != null)
+                {
+                    return Integer.parseInt(initParam.getParamValue());
+                }
+            }
+        }
+        
+        if (!StringUtils.isBlank(sizes))
+        {
+            columnCount = StringUtils.splitPreserveAllTokens(sizes, ",").length;
+        }
+        
+        return columnCount;
     }
-
 }

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/services/rest/PageLayoutService.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/services/rest/PageLayoutService.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/services/rest/PageLayoutService.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/jetspeed-restful-services.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/jetspeed-restful-services.xml?rev=889312&r1=889311&r2=889312&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/jetspeed-restful-services.xml (original)
+++ portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/jetspeed-restful-services.xml Thu Dec 10 16:30:07 2009
@@ -126,7 +126,7 @@
         </bean>
         <bean class="org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider">
           <meta key="j2:cat" value="default" />
-          <constructor-arg ref="jaxrsPageManagementService" />
+          <constructor-arg ref="jaxrsPageLayoutService" />
         </bean>
       </list>
     </property>
@@ -141,13 +141,11 @@
   </bean>
   
   <!-- Portal Page Management JAX-RS Service -->
-  <bean id="jaxrsPageManagementService" class="org.apache.jetspeed.services.rest.PageManagementService">
+  <bean id="jaxrsPageLayoutService" class="org.apache.jetspeed.services.rest.PageLayoutService">
     <meta key="j2:cat" value="default" />
-    <constructor-arg ref="org.apache.jetspeed.page.PageManager" />
-    <constructor-arg ref="PortletActionSecurityBehavior" />
-    <constructor-arg ref="org.apache.jetspeed.components.portletregistry.PortletRegistry" />
-    <constructor-arg ref="DecorationValve" />
     <constructor-arg ref="org.apache.jetspeed.layout.PageLayoutComponent" />
+    <constructor-arg ref="org.apache.jetspeed.components.portletregistry.PortletRegistry" />
+    <constructor-arg ref="PortletActionSecurityBehavior" />
   </bean>
   
 </beans>

Modified: portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/pipelines.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/pipelines.xml?rev=889312&r1=889311&r2=889312&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/pipelines.xml (original)
+++ portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/pipelines.xml Thu Dec 10 16:30:07 2009
@@ -747,6 +747,7 @@
         <ref bean="profilerValve" />
         <ref bean="refreshUserHomepageValve" />
         <ref bean="containerValve" />
+        <ref bean="DecorationValve" />
         <ref bean="RestfulServicesValve" />
       </list>
     </constructor-arg>



---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org