[Registry-dev] svn commit r14788 - in trunk/registry/modules: core/src/main/java/org/wso2/registry core/src/main/java/org/wso2/registry/app core/src/main/java/org/wso2/registry/config core/src/main/java/org/wso2/registry/jdbc core/src/main/java/org/wso2/registry/lifecycle core/src/main/java/org/wso2/registry/secure core/src/test/java/org/wso2/registry/jdbc webapps/src/main/java/org/wso2/registry/web/actions webapps/src/main/webapp/admin

svn at wso2.org svn at wso2.org
Thu Mar 13 21:40:53 PDT 2008


Author: glen
Date: Thu Mar 13 21:40:45 2008
New Revision: 14788

Log:

* Add ability for a Lifecycle to tell us, for a given RequestContext, the valid available actions for the resource in its current state

* Make available actions accessible from Registry interface (no remote impl yet!)

* Crude UI for available actions - but since you can't use the UI to associate lifecycles yet, you can't see it... unless you uncomment the code in ResourceDetailsAction.java:234-236.  This clearly needs some TLC from the UI folks!  Also note that POSTing to the lifecycle URLs (i.e. http://registry/resource;lifecycle[myCycle]:action) isn't implemented yet for transitions.

* Little code cleanup

Modified:
   trunk/registry/modules/core/src/main/java/org/wso2/registry/Registry.java
   trunk/registry/modules/core/src/main/java/org/wso2/registry/app/RemoteRegistry.java
   trunk/registry/modules/core/src/main/java/org/wso2/registry/config/RegistryContext.java
   trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/JDBCRegistry.java
   trunk/registry/modules/core/src/main/java/org/wso2/registry/lifecycle/DefaultLifecycle.java
   trunk/registry/modules/core/src/main/java/org/wso2/registry/lifecycle/Lifecycle.java
   trunk/registry/modules/core/src/main/java/org/wso2/registry/secure/SecureRegistry.java
   trunk/registry/modules/core/src/test/java/org/wso2/registry/jdbc/SimpleLifecycleTest.java
   trunk/registry/modules/webapps/src/main/java/org/wso2/registry/web/actions/ResourceDetailsAction.java
   trunk/registry/modules/webapps/src/main/webapp/admin/registry-resources.jsp

Modified: trunk/registry/modules/core/src/main/java/org/wso2/registry/Registry.java
==============================================================================
--- trunk/registry/modules/core/src/main/java/org/wso2/registry/Registry.java	(original)
+++ trunk/registry/modules/core/src/main/java/org/wso2/registry/Registry.java	Thu Mar 13 21:40:45 2008
@@ -278,4 +278,7 @@
      */
     void lifeCycleTransition(String resourcePath, String lifecycleName, String action)
             throws RegistryException;
+
+    String[] getLifecycleActions(String resourcePath, String lifecycleName)
+            throws RegistryException;
 }

Modified: trunk/registry/modules/core/src/main/java/org/wso2/registry/app/RemoteRegistry.java
==============================================================================
--- trunk/registry/modules/core/src/main/java/org/wso2/registry/app/RemoteRegistry.java	(original)
+++ trunk/registry/modules/core/src/main/java/org/wso2/registry/app/RemoteRegistry.java	Thu Mar 13 21:40:45 2008
@@ -847,4 +847,9 @@
     public void lifeCycleTransition(String resourcePath, String lifecycleName, String action) throws RegistryException {
         throw new UnsupportedOperationException();
     }
+
+    public String[] getLifecycleActions(String resourcePath, String lifecycleName)
+            throws RegistryException {
+        throw new UnsupportedOperationException();
+    }
 }

Modified: trunk/registry/modules/core/src/main/java/org/wso2/registry/config/RegistryContext.java
==============================================================================
--- trunk/registry/modules/core/src/main/java/org/wso2/registry/config/RegistryContext.java	(original)
+++ trunk/registry/modules/core/src/main/java/org/wso2/registry/config/RegistryContext.java	Thu Mar 13 21:40:45 2008
@@ -19,10 +19,10 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.wso2.registry.RegistryException;
-import org.wso2.registry.lifecycle.Lifecycle;
 import org.wso2.registry.i18n.Messages;
 import org.wso2.registry.jdbc.hsql.DBUtils;
 import org.wso2.registry.jdbc.utils.RegistryDataSource;
+import org.wso2.registry.lifecycle.Lifecycle;
 import org.wso2.registry.secure.HSQLDBInitializer;
 
 import javax.sql.DataSource;
@@ -45,7 +45,7 @@
     private List urlHandlers = new ArrayList();
     private List queryProcessors = new ArrayList();
     private Map lifecycles = new HashMap();
-    private DataSource dataSource ;
+    private DataSource dataSource;
 
     public RegistryContext() {
     }
@@ -144,11 +144,11 @@
     }
 
     public void addLifecycle(Lifecycle lifecycle) {
-        lifecycles.put(lifecycle.getName() ,lifecycle);
+        lifecycles.put(lifecycle.getName(), lifecycle);
     }
 
-    public Lifecycle getLifecycle(String name){
-        return (Lifecycle) lifecycles.get(name);
+    public Lifecycle getLifecycle(String name) {
+        return (Lifecycle)lifecycles.get(name);
     }
 
 

Modified: trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/JDBCRegistry.java
==============================================================================
--- trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/JDBCRegistry.java	(original)
+++ trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/JDBCRegistry.java	Thu Mar 13 21:40:45 2008
@@ -1366,33 +1366,42 @@
         put(resource.getPath(), resource);
     }
 
-    private Map <String, Lifecycle> lifecycles = new HashMap<String,Lifecycle>();
+    private Map<String, Lifecycle> lifecycles = new HashMap<String, Lifecycle>();
+
     private Lifecycle getLifecycle(String name) {
         return lifecycles.get(name);
     }
+
     public void addLifecycle(String name, Lifecycle lifecycle) {
         lifecycles.put(name, lifecycle);
     }
 
-    public void lifeCycleTransition(String resourcePath, String lifecycleName, String action)
+    public Lifecycle getResourceLifecycle(Resource resource, String lifecycleName)
             throws RegistryException {
-        Resource resource = get(resourcePath);
 
         Lifecycle lifecycle = getLifecycle(lifecycleName);
         if (lifecycle == null) {
             throw new RegistryException("Lifecycle '" + lifecycleName + "' is not registered!");
         }
 
-        RequestContext context = new RequestContext(this);
-        context.setResource(resource);
-
         // Confirm this lifecycle is associated with this Resource
         List<String> resourceLifecycles = resource.getLifecycles();
         if (resourceLifecycles == null || !resourceLifecycles.contains(lifecycleName)) {
-            throw new RegistryException("Resource at '" + resourcePath +
+            throw new RegistryException("Resource at '" + resource.getPath() +
                                         "' not associated with lifecycle '" + lifecycleName + "'");
         }
 
+        return lifecycle;
+    }
+
+    public void lifeCycleTransition(String resourcePath, String lifecycleName, String action)
+            throws RegistryException {
+        Resource resource = get(resourcePath);
+
+        Lifecycle lifecycle = getResourceLifecycle(resource, lifecycleName);
+        RequestContext context = new RequestContext(this);
+        context.setResource(resource);
+
 //        List lifeCycleNames = resource.getPropertyValues(Lifecycle.AVAILABLE_LIFE_CYCLES);
 //        if (lifeCycleNames == null) {
 //            throw new RegistryException("No lifecycle are associated with the resource");
@@ -1401,4 +1410,14 @@
         lifecycle.transition(context, action);
         put(resourcePath, resource);
     }
+
+    public String[] getLifecycleActions(String resourcePath, String lifecycleName)
+            throws RegistryException {
+        Resource resource = get(resourcePath);
+        Lifecycle lifecycle = getResourceLifecycle(resource, lifecycleName);
+
+        RequestContext context = new RequestContext(this);
+        context.setResource(resource);
+        return lifecycle.getAvailableActions(context);
+    }
 }

Modified: trunk/registry/modules/core/src/main/java/org/wso2/registry/lifecycle/DefaultLifecycle.java
==============================================================================
--- trunk/registry/modules/core/src/main/java/org/wso2/registry/lifecycle/DefaultLifecycle.java	(original)
+++ trunk/registry/modules/core/src/main/java/org/wso2/registry/lifecycle/DefaultLifecycle.java	Thu Mar 13 21:40:45 2008
@@ -24,6 +24,10 @@
 import org.wso2.registry.jdbc.handlers.RequestContext;
 import org.wso2.registry.users.UserRealm;
 
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
+
 public class DefaultLifecycle extends Lifecycle {
 
     public static final String PHASE_CREATED = "created";
@@ -109,4 +113,12 @@
 
         // TODO: So which resource gets the new state property??
     }
+
+    private static List<String> promote = new ArrayList<String>();
+    static {
+        promote.add(ACTION);
+    }
+    public String [] getAvailableActions(RequestContext context) {
+        return (String [])promote.toArray();
+    }
 }

Modified: trunk/registry/modules/core/src/main/java/org/wso2/registry/lifecycle/Lifecycle.java
==============================================================================
--- trunk/registry/modules/core/src/main/java/org/wso2/registry/lifecycle/Lifecycle.java	(original)
+++ trunk/registry/modules/core/src/main/java/org/wso2/registry/lifecycle/Lifecycle.java	Thu Mar 13 21:40:45 2008
@@ -5,6 +5,8 @@
 import org.wso2.registry.RegistryException;
 import org.wso2.registry.jdbc.handlers.RequestContext;
 
+import java.util.List;
+
 public abstract class Lifecycle {
     public static final String AVAILABLE_LIFE_CYCLES = "Lifecycles";
 
@@ -14,7 +16,6 @@
         return name;
     }
 
-
     public void setName(String name) {
         this.name = name;
     }
@@ -40,4 +41,13 @@
      *          If the condition is not met or some thing is wrong
      */
     public abstract void transition(RequestContext context, String action) throws RegistryException;
+
+    /**
+     * Get a list of available actions for the resource in the RequestContext, taking into account
+     * current state, user, etc.
+     *
+     * @param context the RequestContext containing info about the Resource, Registry, User, etc.
+     * @return a String[] of the names of valid actions for this lifecycle on the specified resource
+     */
+    public abstract String [] getAvailableActions(RequestContext context);
 }

Modified: trunk/registry/modules/core/src/main/java/org/wso2/registry/secure/SecureRegistry.java
==============================================================================
--- trunk/registry/modules/core/src/main/java/org/wso2/registry/secure/SecureRegistry.java	(original)
+++ trunk/registry/modules/core/src/main/java/org/wso2/registry/secure/SecureRegistry.java	Thu Mar 13 21:40:45 2008
@@ -762,4 +762,9 @@
     public void lifeCycleTransition(String resourcePath, String lifecycleName, String action) throws RegistryException {
         throw new UnsupportedOperationException();
     }
+
+    public String[] getLifecycleActions(String resourcePath, String lifecycleName)
+            throws RegistryException {
+        return registry.getLifecycleActions(resourcePath, lifecycleName);
+    }
 }

Modified: trunk/registry/modules/core/src/test/java/org/wso2/registry/jdbc/SimpleLifecycleTest.java
==============================================================================
--- trunk/registry/modules/core/src/test/java/org/wso2/registry/jdbc/SimpleLifecycleTest.java	(original)
+++ trunk/registry/modules/core/src/test/java/org/wso2/registry/jdbc/SimpleLifecycleTest.java	Thu Mar 13 21:40:45 2008
@@ -52,6 +52,15 @@
 
             r.setProperty(STATE_PROP, FINAL);
         }
+
+        static String [] actions = new String [] { ACTION };
+
+        public String [] getAvailableActions(RequestContext context) {
+            Resource r = context.getResource();
+            String state = r.getProperty(STATE_PROP);
+            if (INIT.equals(state)) return actions;
+            return null;
+        }
     }
 
     public void testSimpleLifecycle() throws Exception {
@@ -74,6 +83,11 @@
         assertNotNull(propValue);
         assertEquals("Wrong initial state!", SimpleLifecycle.INIT, propValue);
 
+        String [] actions = registry.getLifecycleActions(RESOURCE, LIFECYCLE);
+        assertNotNull("No available actions", actions);
+        assertEquals("Wrong # of available actions", 1, actions.length);
+        assertEquals("Wrong available action", SimpleLifecycle.ACTION, actions[0]);
+
         registry.lifeCycleTransition(RESOURCE, LIFECYCLE, SimpleLifecycle.ACTION);
 
         resource = registry.get(RESOURCE);

Modified: trunk/registry/modules/webapps/src/main/java/org/wso2/registry/web/actions/ResourceDetailsAction.java
==============================================================================
--- trunk/registry/modules/webapps/src/main/java/org/wso2/registry/web/actions/ResourceDetailsAction.java	(original)
+++ trunk/registry/modules/webapps/src/main/java/org/wso2/registry/web/actions/ResourceDetailsAction.java	Thu Mar 13 21:40:45 2008
@@ -68,6 +68,8 @@
 
     private List navigatablePaths = new ArrayList();
 
+    private Map<String,String[]> availableActions = new HashMap<String,String[]>();
+
     private String parentPath;
 
     /**
@@ -220,6 +222,18 @@
         this.mediaType = resource.getMediaType();
         this.averageRating = registry.getAverageRating(resource.getPath());
         this.properties = resource.getProperties();
+        List<String> lifecycles = resource.getLifecycles();
+        if (lifecycles != null) {
+            for (String lifecycle : lifecycles) {
+                String [] actions = registry.getLifecycleActions(path, lifecycle);
+                if (actions == null) continue;
+                availableActions.put(lifecycle, actions);
+            }
+        }
+        // uncomment for testing lifecycle UI
+        /* else {
+            availableActions.put("dummyLifecycle", new String [] { "firstAction", "2ndAction"});
+        } */
 
         Tag[] t = registry.getTags(resource.getPath());
         tags.addAll(Arrays.asList(t));
@@ -712,4 +726,8 @@
     public void setPermalink(String permalink) {
         this.permalink = permalink;
     }
+
+    public Map<String,String[]> getAvailableActions() {
+        return availableActions;
+    }
 }

Modified: trunk/registry/modules/webapps/src/main/webapp/admin/registry-resources.jsp
==============================================================================
--- trunk/registry/modules/webapps/src/main/webapp/admin/registry-resources.jsp	(original)
+++ trunk/registry/modules/webapps/src/main/webapp/admin/registry-resources.jsp	Thu Mar 13 21:40:45 2008
@@ -10,6 +10,7 @@
 <%@ page import="java.util.List" %>
 <%@ page import="java.util.Properties" %>
 <%@ page import="org.wso2.registry.web.utils.CommonUtil" %>
+<%@ page import="java.util.Map" %>
 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
 "http://www.w3.org/TR/html4/strict.dtd">
@@ -663,6 +664,67 @@
     <!-- END comment listing box -->
 
 </div>
+    <div class="box1-head">
+        <table cellspacing="0" cellpadding="0" border="0" style="width:100%">
+            <tr>
+
+                <td valign="top"><h2 class="sub-headding-comments">Lifecycles</h2></td>
+                <td align="right" valign="top">
+                    <table cellpadding="0" cellspacing="0" border="0" class="toolBarTable">
+                        <tr>
+                            <td>
+                            <a href="/wso2registry/atom<%=details.getPath()%>;comments" target="_blank" title="Subscribe to this feed"><img border="0" src="/wso2registry/admin/images/icon-feed-small.gif" /></a>
+                            </td>
+                            <td>
+                            <% if (details.isLoggedIn() && !details.isVersionView()) { %><a href="#" onclick="showHideCommon('add-comment-div');expandIfNot('comments');"><img src="/wso2registry/admin/images/universal-add.gif" border="0" valign="top" title="Add New Comment" /></a><% } %>
+                            </td>
+                            <td style="padding-top:3px;">
+                                <a href="#" onclick="showHideCommon('lifecycleIconExpanded');showHideCommon('lifecycleIconMinimized');showHideCommon('lifecycleExpanded');showHideCommon('lifecycleMinimized');">
+                                    <img src="/wso2registry/admin/images/icon-expanded.gif" border="0" align="top" id="lifecycleIconExpanded" />
+                                    <img src="/wso2registry/admin/images/icon-minimized.gif" border="0" align="top" id="lifecycleIconMinimized" style="display:none;" />
+                                </a>
+                            </td>
+                        </tr>
+                    </table>
+                </td>
+
+            </tr>
+        </table>
+    </div>
+    <div class="box2-mid" id="lifecycleMinimized" style="display:none;">
+    </div>
+
+    <div class="box2-mid" id="lifecycleExpanded">
+        <!-- START comments listing box -->
+        <div id="lifecycleList">
+        <%
+            Map<String,String[]> availableActions = details.getAvailableActions();
+            Iterator<String> iLifecycles = availableActions.keySet().iterator();
+            while (iLifecycles.hasNext()) {
+                String lifecycle = iLifecycles.next();
+        %>
+        <div class="lifecycle">
+            <h3><%=lifecycle%></h3>
+            <%
+                String [] actions = availableActions.get(lifecycle);
+                for (String action : actions) {
+                    String actionURL = "/wso2registry" + details.getPath() +
+                                       ";lifecycle[" + lifecycle + "]:" + action;
+            %>
+            <form action="<%=actionURL%>" method="POST">
+                <input type="submit" name="<%=action%>">
+            </form>
+            <%
+                }
+            %>
+        </div>
+
+        <% } %>
+        </div>
+
+        <!-- END comment listing box -->
+
+    </div>
 
 </td>
 </tr>



More information about the Registry-dev mailing list