You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-user@portals.apache.org by Ron Wheeler <rw...@artifact-software.com> on 2010/02/15 20:47:08 UTC

Re: batch creation of users and roles

It has been a while but we are now in the middle of trying to get our 
batch process going.

It seems that we are getting back NULL for
   String appRoot = System.getProperty("applicationRoot");
   int count = 
Integer.parseInt(System.getProperty("jetspeed.administration.register.users.count")); 


These seem to be system variables and I am not sure how they get set, 
when they get set of even if they get set.

There are a lot of these types of calls and only some of them actually 
look essential to what we want to do.

       String prefix = 
System.getProperty("jetspeed.administration.register.users.prefix", "");
       String profilerPageRule = 
getValueOrNull(System.getProperty("jetspeed.administration.register.users.profiler.page.rule")); 

look like the type of things that might be required.
I have not been able to figure out what these mean and what their values 
should be for us if we can not get the property from System.
I do not mind hardcodin stuff or adding it to a spring configuration if 
that is what we have to do.

What fundamental concept am I missing? Any docs that I should be reading?

Thanks

Ron



Randy Watler wrote:
> Ron,
>
> Here are some samples for 2.1.3 that might help you get started.
>
> HTH,
>
> Randy
>
> RegisterTestUsers.java
> ------------------------------------------------------------------------------------- 
>
>
> package jetspeed.administration;
>
> import java.io.File;
> import java.io.FileInputStream;
> import java.util.HashMap;
> import org.apache.jetspeed.security.SecurityException;
>
> import org.apache.commons.configuration.PropertiesConfiguration;
> import org.apache.jetspeed.Jetspeed;
> import org.apache.jetspeed.administration.PortalAdministration;
> import org.apache.jetspeed.components.SpringComponentManager;
> import 
> org.apache.jetspeed.components.factorybeans.ServletConfigFactoryBean;
> import org.apache.jetspeed.components.jndi.JetspeedTestJNDIComponent;
> import org.apache.jetspeed.engine.JetspeedEngine;
> import org.apache.jetspeed.mocks.ResourceLocatingServletContext;
>
> import org.springframework.transaction.PlatformTransactionManager;
> import org.springframework.transaction.TransactionDefinition;
> import org.springframework.transaction.TransactionStatus;
> import 
> org.springframework.transaction.support.DefaultTransactionDefinition;
>
> import com.mockrunner.mock.web.MockServletConfig;
>
> public class RegisterTestUsers
> {
>    public static void main(String args[]) throws Exception
>    {
>        String appRoot = System.getProperty("applicationRoot");
>        int count = 
> Integer.parseInt(System.getProperty("jetspeed.administration.register.users.count")); 
>
>        String prefix = 
> System.getProperty("jetspeed.administration.register.users.prefix", "");
>        String profilerPageRule = 
> getValueOrNull(System.getProperty("jetspeed.administration.register.users.profiler.page.rule")); 
>
>        HashMap profilerRules = null;
>        if (profilerPageRule != null )
>        {
>            profilerRules = new HashMap();
>            profilerRules.put("page", profilerPageRule);
>        }
>        String templateFolder = 
> getValueOrNull(System.getProperty("jetspeed.administration.register.users.template.folder")); 
>
>              JetspeedTestJNDIComponent jndiDS = new 
> JetspeedTestJNDIComponent();
>        jndiDS.setup();
>
>        PropertiesConfiguration config = new PropertiesConfiguration();
>        config.load(new 
> FileInputStream(appRoot+"/WEB-INF/conf/jetspeed.properties"));
>        MockServletConfig servletConfig = new 
> MockServletConfig();              ResourceLocatingServletContext 
> servletContent = new ResourceLocatingServletContext(new 
> File(appRoot));              
> servletConfig.setServletContext(servletContent);
>        ServletConfigFactoryBean.setServletConfig(servletConfig);
>
>        final String assemblyDir = 
> config.getString("assembly.dir","/WEB-INF/assembly");
>        final String assemblyFileExtension = 
> config.getString("assembly.extension",".xml");
>                          String[] bootConfigs = new String[] 
> {"/WEB-INF/assembly/boot/*.xml"};
>        String[] appConfigs =  new String[] 
> {assemblyDir+"/*"+assemblyFileExtension, 
> assemblyDir+"/override/*"+assemblyFileExtension};
>              SpringComponentManager scm = new 
> SpringComponentManager(bootConfigs, appConfigs, servletContent, 
> appRoot );
>             JetspeedEngine engine = new JetspeedEngine(config, 
> appRoot, servletConfig, scm );
>        Jetspeed.setEngine(engine);
>        engine.start();
>              final PlatformTransactionManager txnManager = 
> (PlatformTransactionManager)scm.getComponent("transactionManager");
>        final DefaultTransactionDefinition txnDefinition = new 
> DefaultTransactionDefinition();
>        txnDefinition.setName("RegisterTestUsers");
>        
> txnDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); 
>
>
>        try
>        {
>            PortalAdministration portalAdministration = 
> (PortalAdministration)scm.getComponent("PortalAdministrationImpl");
>            if (count > 0)
>            {
>                System.out.println("Registering: "+count+" users with 
> prefix: "+prefix);
>
>                // open transaction
>                TransactionStatus txnStatus = 
> txnManager.getTransaction(txnDefinition);
>
>                // execute transactional operations
>                try
>                {
>                    for (int i = 1; i <= count; i++)
>                    {
>                        String name = prefix+Integer.toString(i);
>                        System.out.print("Registering user: "+name+" 
> ... ");
>                        try
>                        {
>                            
> portalAdministration.registerUser(name,name, null, null, null, 
> profilerRules, templateFolder);
>                        }
>                        catch (Exception e)
>                        {
>                            if (e.getCause() != null && e.getCause() 
> instanceof SecurityException)
>                            {
>                                SecurityException se = 
> (SecurityException)e.getCause();
>                                if 
> (se.getKeyedMessage().equals(SecurityException.USER_ALREADY_EXISTS))
>                                {
>                                    continue;
>                                }
>                            }
>                            throw e;
>                        }
>                        System.out.println("done");
>
>                        // commit every 250 users
>                        if (((i%250) == 0) && (i < count))
>                        {
>                            // commit and start new txn
>                            System.out.print("Committing ... ");
>                            txnManager.commit(txnStatus);
>                            System.out.println("done");
>                            txnStatus = 
> txnManager.getTransaction(txnDefinition);
>                        }
>                    }
>                }
>                catch (Exception e)
>                {
>                    // rollback transaction
>                    txnManager.rollback(txnStatus);
>                    throw e;
>                }
>                              // commit transaction
>                System.out.print("Committing ... ");
>                txnManager.commit(txnStatus);               
>                System.out.println("done");
>            }
>        }
>        finally
>        {
>            engine.shutdown();
>        }
>    }
>      private static String getValueOrNull(String value)
>    {
>        if (value != null && value.length()==0)
>        {
>            value = null;
>        }
>        return value;
>    }
> }
>
> RegisterTestUserPrefs.java
> ------------------------------------------------------------------------------------- 
>
>
> package jetspeed.administration;
>
> import java.io.File;
> import java.io.FileInputStream;
> import java.security.PrivilegedAction;
> import java.util.ArrayList;
> import java.util.HashMap;
> import java.util.Iterator;
> import java.util.List;
> import java.util.Map;
>
> import org.apache.commons.configuration.Configuration;
> import org.apache.commons.configuration.PropertiesConfiguration;
> import org.apache.jetspeed.Jetspeed;
> import org.apache.jetspeed.administration.PortalConfigurationConstants;
> import org.apache.jetspeed.components.SpringComponentManager;
> import 
> org.apache.jetspeed.components.factorybeans.ServletConfigFactoryBean;
> import org.apache.jetspeed.components.jndi.JetspeedTestJNDIComponent;
> import org.apache.jetspeed.engine.JetspeedEngine;
> import org.apache.jetspeed.om.page.Fragment;
> import org.apache.jetspeed.om.page.Page;
> import org.apache.jetspeed.om.folder.Folder;
> import org.apache.jetspeed.page.PageManager;
> import org.apache.jetspeed.page.document.NodeSet;
> import org.apache.jetspeed.prefs.FailedToCreateNodeException;
> import org.apache.jetspeed.prefs.NodeAlreadyExistsException;
> import org.apache.jetspeed.prefs.NodeDoesNotExistException;
> import org.apache.jetspeed.prefs.om.impl.NodeImpl;
> import org.apache.jetspeed.prefs.impl.NodeImplProxy;
> import org.apache.jetspeed.prefs.PreferencesProvider;
> import org.apache.jetspeed.prefs.om.Node;
> import org.apache.jetspeed.mocks.ResourceLocatingServletContext;
> import org.apache.jetspeed.security.JSSubject;
> import org.apache.jetspeed.security.User;
> import org.apache.jetspeed.security.UserManager;
>
> import org.springframework.transaction.PlatformTransactionManager;
> import org.springframework.transaction.TransactionDefinition;
> import org.springframework.transaction.TransactionStatus;
> import 
> org.springframework.transaction.support.DefaultTransactionDefinition;
>
> import com.mockrunner.mock.web.MockServletConfig;
>
> public class RegisterTestUserPrefs
> {
>    public static void main(String args[]) throws Exception
>    {
>        final String appRoot = System.getProperty("applicationRoot");
>        final int count = 
> Integer.parseInt(System.getProperty("jetspeed.administration.register.users.count")); 
>
>        final String prefix = 
> System.getProperty("jetspeed.administration.register.users.prefix", "");
>
>        JetspeedTestJNDIComponent jndiDS = new 
> JetspeedTestJNDIComponent();
>        jndiDS.setup();
>
>        PropertiesConfiguration config = new PropertiesConfiguration();
>        config.load(new 
> FileInputStream(appRoot+"/WEB-INF/conf/jetspeed.properties"));
>        MockServletConfig servletConfig = new 
> MockServletConfig();              ResourceLocatingServletContext 
> servletContent = new ResourceLocatingServletContext(new 
> File(appRoot));              
> servletConfig.setServletContext(servletContent);
>        ServletConfigFactoryBean.setServletConfig(servletConfig);
>
>        final String assemblyDir = 
> config.getString("assembly.dir","/WEB-INF/assembly");
>        final String assemblyFileExtension = 
> config.getString("assembly.extension",".xml");
>                          String[] bootConfigs = new String[] 
> {"/WEB-INF/assembly/boot/*.xml"};
>        String[] appConfigs =  new String[] 
> {assemblyDir+"/*"+assemblyFileExtension, 
> assemblyDir+"/override/*"+assemblyFileExtension};
>                      SpringComponentManager scm = new 
> SpringComponentManager(bootConfigs, appConfigs, servletContent, 
> appRoot );
>             JetspeedEngine engine = new JetspeedEngine(config, 
> appRoot, servletConfig, scm );
>        Jetspeed.setEngine(engine);
>        engine.start();
>              final Configuration portalConfig = 
> (Configuration)scm.getComponent("portal_configuration");
>        final String adminUserName = 
> portalConfig.getString(PortalConfigurationConstants.USERS_DEFAULT_ADMIN);        
>
>        final UserManager userManager = 
> (UserManager)scm.getComponent("org.apache.jetspeed.security.UserManager"); 
>
>        final User adminUser = userManager.getUser(adminUserName);
>        final PageManager pageManager = 
> (PageManager)scm.getComponent("pageManager");
>        final PreferencesProvider preferencesProvider = 
> (PreferencesProvider)scm.getComponent("prefsProvider");
>        final PlatformTransactionManager txnManager = 
> (PlatformTransactionManager)scm.getComponent("transactionManager");
>        final DefaultTransactionDefinition txnDefinition = new 
> DefaultTransactionDefinition();
>        txnDefinition.setName("RegisterTestUserPrefs");
>        
> txnDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); 
>
>              try
>        {
>            if (count > 0)
>            {
>                System.out.println("Registering prefs: "+count+" users 
> with prefix: "+prefix);
>
>                // perform registration as admin user so that pages can 
> be read
>                Exception actionException = 
> (Exception)JSSubject.doAsPrivileged(adminUser.getSubject(), new 
> PrivilegedAction()
>                {
>                    public Object run()
>                    {
>                        // open transaction
>                        TransactionStatus txnStatus = 
> txnManager.getTransaction(txnDefinition);
>
>                        // execute transactional operations
>                        try
>                        {
>                            // create map of preference nodes for this 
> transaction
>                            Map preferencesMap = new HashMap();
>                                                      // find shared 
> portal pages
>                            Folder rootFolder = 
> pageManager.getFolder("/");
>                            List sharedPages = new ArrayList();
>                            findPages(rootFolder, sharedPages);
>
>                            for (int i = 1; i <= count; i++)
>                            {
>                                String name = prefix+Integer.toString(i);
>                                System.out.print("Registering prefs for 
> user: "+name+" ... ");
>
>                                // access list of fragments that can be 
> visited by user
>                                List userPages = new ArrayList();
>                                Folder userFolder = 
> pageManager.getFolder(Folder.USER_FOLDER + name);
>                                findPages(userFolder, userPages);
>                                List addSharedPages = new ArrayList();
>                                // merge shared pages not replaced by 
> user pages via standard profiler
>                                for (Iterator sharedIter = 
> sharedPages.iterator(); sharedIter.hasNext();)
>                                {
>                                    Page sharedPage = 
> (Page)sharedIter.next();
>                                    boolean sharedPageHidden = false;
>                                    for (Iterator userIter = 
> userPages.iterator(); userIter.hasNext();)
>                                    {
>                                        Page userPage = 
> (Page)userIter.next();
>                                        String userPageProfiledPath = 
> userPage.getPath().substring(userFolder.getPath().length());
>                                        if 
> (userPageProfiledPath.equals(sharedPage.getPath()))
>                                        {
>                                            sharedPageHidden = true;
>                                        }
>                                    }
>                                    if (!sharedPageHidden)
>                                    {
>                                        addSharedPages.add(sharedPage);
>                                    }
>                                }
>                                userPages.addAll(addSharedPages);
>                                // find fragments in all pages
>                                List userFragments = new ArrayList();
>                                for (Iterator iter = 
> userPages.iterator(); iter.hasNext();)
>                                {
>                                    Page page = (Page)iter.next();
>                                    
> findFragments(page.getRootFragment(), userFragments);
>                                }
>                                                              // 
> register empty preferences tree for potentially visited
>                                // fragments and a user defined 
> preference for portlets
>                                // with a defined default preference
>                                Node rootPreference = 
> createUserPreference(preferencesProvider, null, "/", "", preferencesMap);
>                                rootPreference = 
> createUserPreference(preferencesProvider, rootPreference, 
> "/portlet_entity", "portlet_entity", preferencesMap);
>                                for (Iterator iter = 
> userFragments.iterator(); iter.hasNext();)
>                                {
>                                    Fragment fragment = 
> (Fragment)iter.next();
>                                    String portletEntityId = 
> fragment.getId();
>                                    // empty preferences tree
>                                    Node preference = 
> createUserPreference(preferencesProvider, rootPreference, 
> "/portlet_entity/"+portletEntityId, portletEntityId, preferencesMap);
>                                    preference = 
> createUserPreference(preferencesProvider, preference, 
> "/portlet_entity/"+portletEntityId+"/"+name, name, null);
>                                    preference = 
> createUserPreference(preferencesProvider, preference, 
> "/portlet_entity/"+portletEntityId+"/"+name+"/preferences", 
> "preferences", null);
>                                    // user defined preference, (assume 
> preferences defined for j2pt portlets with "prefs" in name)
>                                    String [] portletNames = 
> fragment.getName().split("::");
>                                    String portletAppName = 
> portletNames[0];
>                                    String portletName = portletNames[1];
>                                    if 
> ((portletAppName.toLowerCase().indexOf("j2pt") != -1) && 
> (portletName.toLowerCase().indexOf("prefs") != -1))
>                                    {
>                                        // add j2pt user preference: 
> name=pref-0, value=<name>-pref-0-value
>                                        Node userPreference = 
> createUserPreference(preferencesProvider, preference, 
> "/portlet_entity/"+portletEntityId+"/"+name+"/preferences/pref-0", 
> "pref-0", null);
>                                        Node userPreferenceValues = 
> createUserPreference(preferencesProvider, userPreference, 
> "/portlet_entity/"+portletEntityId+"/"+name+"/preferences/pref-0/values", 
> "values", null);
>                                        if 
> (userPreferenceValues.getNodeProperties().isEmpty())
>                                        {
>                                            
> userPreferenceValues.getNodeProperties().add(preferencesProvider.createProperty(userPreferenceValues, 
> "0", name+"-pref-0-value"));
>                                            
> preferencesProvider.storeNode(userPreferenceValues);
>                                        }
>                                        Node userPreferenceSize = 
> createUserPreference(preferencesProvider, userPreference, 
> "/portlet_entity/"+portletEntityId+"/"+name+"/preferences/pref-0/size", 
> "size", null);
>                                        if 
> (userPreferenceSize.getNodeProperties().isEmpty())
>                                        {
>                                            
> userPreferenceSize.getNodeProperties().add(preferencesProvider.createProperty(userPreferenceValues, 
> "size", "1"));
>                                            
> preferencesProvider.storeNode(userPreferenceSize);
>                                        }
>                                    }
>                                }
>
>                                System.out.println("done");
>                                                              // commit 
> every 250 users and reset cached data
>                                if (((i%250) == 0) && (i < count))
>                                {
>                                    // commit and start new txn
>                                    System.out.print("Committing ... ");
>                                    txnManager.commit(txnStatus);
>                                    System.out.println("done");
>                                    txnStatus = 
> txnManager.getTransaction(txnDefinition);
>                                                                      
> // reset cached data
>                                    rootFolder = 
> pageManager.getFolder("/");
>                                    sharedPages.clear();
>                                    findPages(rootFolder, sharedPages);
>                                    preferencesMap.clear();
>                                }
>                            }
>                                                      // clear cached 
> data for this transaction
>                            rootFolder = null;
>                            sharedPages.clear();
>                            
> preferencesMap.clear();                           
>                        }
>                        catch (Exception e)
>                        {
>                            // rollback transaction
>                            txnManager.rollback(txnStatus);
>                            return e;
>                        }
>
>                        // commit transaction
>                        System.out.print("Committing ... ");
>                        txnManager.commit(txnStatus);
>                        System.out.println("done");
>                        return null;
>                    }
>                }, null);
>                if (actionException != null)
>                {
>                    throw actionException;
>                }
>            }
>        }
>        finally
>        {
>            engine.shutdown();
>        }
>    }
>
>    private static void findPages(Folder folder, List pages) throws 
> Exception
>    {
>        // get folder pages
>        NodeSet folderPages = folder.getPages();
>        for (Iterator iter = folderPages.iterator(); iter.hasNext();)
>        {
>            Page page = (Page)iter.next();
>            if (!page.isHidden())
>            {
>                pages.add(page);
>            }
>        }
>        // recursively get folder pages
>        NodeSet folders = folder.getFolders();
>        for (Iterator iter = folders.iterator(); iter.hasNext();)
>        {
>            Folder folderFolder = (Folder)iter.next();
>            if (!folderFolder.isHidden() && !folderFolder.isReserved() 
> && !folderFolder.getName().startsWith(Folder.RESERVED_FOLDER_PREFIX))
>            {
>                findPages(folderFolder, pages);
>            }
>        }
>    }
>
>    private static void findFragments(Fragment fragment, List 
> fragments) throws Exception
>    {
>        // get fragment
>        fragments.add(fragment);
>        // recursively get fragments
>        List fragmentChildren = fragment.getFragments();
>        for (Iterator iter = fragmentChildren.iterator(); iter.hasNext();)
>        {
>            findFragments((Fragment)iter.next(), fragments);
>        }
>    }
>      private static Node createUserPreference(PreferencesProvider 
> preferencesProvider, Node parent, String path, String name, Map 
> preferencesMap) throws Exception
>    {
>        // lookup, query, or create user preference
>        Node preference = null;
>        if (preferencesMap != null)
>        {
>            // lookup preference in map
>            preference = (Node)preferencesMap.get(path);
>            if (preference == null)
>            {
>                // assume preference needs to be looked up
>                try
>                {
>                    preference = preferencesProvider.getNode(path, 0);
>                }
>                catch (NodeDoesNotExistException ndnee)
>                {
>                    preference = rawCreateNode(preferencesProvider, 
> parent, name, 0, path);
>                }
>                preferencesMap.put(path, preference);
>            }
>        }
>        else
>        {
>            // assume preference needs to be created
>            try
>            {
>                preference = rawCreateNode(preferencesProvider, parent, 
> name, 0, path);
>            }
>            catch (NodeAlreadyExistsException naee)
>            {
>                preference = preferencesProvider.getNode(path, 0);
>            }
>        }
>        return preference;
>    }
>      private static Node rawCreateNode(PreferencesProvider 
> preferencesProvider, Node parent, String name, int type, String path) 
> throws FailedToCreateNodeException, NodeAlreadyExistsException
>    {
>        // create node without testing for existence; see implementation
>        // of PersistenceBrokerPreferencesProvider.createNode()
>        Long parentNodeId = null;
>        if (null != parent)
>        {
>            parentNodeId = new Long(parent.getNodeId());
>        }
>        Node node = new NodeImplProxy(new NodeImpl(parentNodeId, name, 
> type, path));
>        try
>        {
>            preferencesProvider.storeNode(node);
>        }
>        catch (Exception e)
>        {
>            if (preferencesProvider.nodeExists(path, type))
>            {
>                throw new NodeAlreadyExistsException("Node of type 
> "+type+" already exists at path "+path);
>            }
>            throw new FailedToCreateNodeException("Failed to create 
> node of type "+type+" for the path "+path+". "+e, e);
>        }
>        return node;
>    }
> }
>
>
> Ron Wheeler wrote:
>> Ron Wheeler wrote:
>>> David Sean Taylor wrote:
>>>>
>>>> On Aug 20, 2009, at 12:39 PM, Ron Wheeler wrote:
>>>>
>>>>> We need to build a batch process to update the Jetspeed users and 
>>>>> their roles each night
>>>>>
>>>>> Can we do this outside the Jetspeed portal context?
>>>>> Is there an example of batch processes access/modifying Jetspeed's 
>>>>> data.
>>>>
>>>> Yes this is possible. Take a look at the Jetspeed Serializer for an 
>>>> example of how to create a command line utility to run start up 
>>>> Jetspeed, link in the jar files, and assemble the Spring files
>>>>
>>>> Or you could run a scheduled service from directly in your server. 
>>>> We don't have a scheduler service, you would have to add in Spring 
>>>> scheduler such as http://www.opensymphony.com/quartz/
>>> I was thinking of using Quartz since I need to schedule the activity 
>>> to happen at 3 AM and I don't want to have to get up to push a button.
>>> I may try to put the task in Ant since I do need to do some other 
>>> steps prior to the update and I think that Ant has the tasks that I 
>>> need.
>>
>> I have the Spring/Quartz documentation and Spring Batch so that part 
>> is covered.
>> My question is less about the scheduling and more about how to access 
>> Jetspeed functions outside a portal or servlet environment.
>>
>> Ron
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: jetspeed-user-unsubscribe@portals.apache.org
>> For additional commands, e-mail: jetspeed-user-help@portals.apache.org
>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: jetspeed-user-unsubscribe@portals.apache.org
> For additional commands, e-mail: jetspeed-user-help@portals.apache.org
>
>


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


Re: batch creation of users and roles

Posted by Randy Watler <wa...@wispertel.net>.
Ron,

Those variables are used to control the batch process. In this case, 
they were located in a maven build pom.xml file.

Of course, they could easily be specified using the JVM parameter... 
like this:

java -Djetspeed.administration.register.users.count=1000 ...

Let me know if I can help further...

Randy

Ron Wheeler wrote:
> It has been a while but we are now in the middle of trying to get our 
> batch process going.
>
> It seems that we are getting back NULL for
>   String appRoot = System.getProperty("applicationRoot");
>   int count = 
> Integer.parseInt(System.getProperty("jetspeed.administration.register.users.count")); 
>
>
> These seem to be system variables and I am not sure how they get set, 
> when they get set of even if they get set.
>
> There are a lot of these types of calls and only some of them actually 
> look essential to what we want to do.
>
>       String prefix = 
> System.getProperty("jetspeed.administration.register.users.prefix", "");
>       String profilerPageRule = 
> getValueOrNull(System.getProperty("jetspeed.administration.register.users.profiler.page.rule")); 
>
> look like the type of things that might be required.
> I have not been able to figure out what these mean and what their 
> values should be for us if we can not get the property from System.
> I do not mind hardcodin stuff or adding it to a spring configuration 
> if that is what we have to do.
>
> What fundamental concept am I missing? Any docs that I should be reading?
>
> Thanks
>
> Ron
>
>
>
> Randy Watler wrote:
>> Ron,
>>
>> Here are some samples for 2.1.3 that might help you get started.
>>
>> HTH,
>>
>> Randy
>>
>> RegisterTestUsers.java
>> ------------------------------------------------------------------------------------- 
>>
>>
>> package jetspeed.administration;
>>
>> import java.io.File;
>> import java.io.FileInputStream;
>> import java.util.HashMap;
>> import org.apache.jetspeed.security.SecurityException;
>>
>> import org.apache.commons.configuration.PropertiesConfiguration;
>> import org.apache.jetspeed.Jetspeed;
>> import org.apache.jetspeed.administration.PortalAdministration;
>> import org.apache.jetspeed.components.SpringComponentManager;
>> import 
>> org.apache.jetspeed.components.factorybeans.ServletConfigFactoryBean;
>> import org.apache.jetspeed.components.jndi.JetspeedTestJNDIComponent;
>> import org.apache.jetspeed.engine.JetspeedEngine;
>> import org.apache.jetspeed.mocks.ResourceLocatingServletContext;
>>
>> import org.springframework.transaction.PlatformTransactionManager;
>> import org.springframework.transaction.TransactionDefinition;
>> import org.springframework.transaction.TransactionStatus;
>> import 
>> org.springframework.transaction.support.DefaultTransactionDefinition;
>>
>> import com.mockrunner.mock.web.MockServletConfig;
>>
>> public class RegisterTestUsers
>> {
>>    public static void main(String args[]) throws Exception
>>    {
>>        String appRoot = System.getProperty("applicationRoot");
>>        int count = 
>> Integer.parseInt(System.getProperty("jetspeed.administration.register.users.count")); 
>>
>>        String prefix = 
>> System.getProperty("jetspeed.administration.register.users.prefix", "");
>>        String profilerPageRule = 
>> getValueOrNull(System.getProperty("jetspeed.administration.register.users.profiler.page.rule")); 
>>
>>        HashMap profilerRules = null;
>>        if (profilerPageRule != null )
>>        {
>>            profilerRules = new HashMap();
>>            profilerRules.put("page", profilerPageRule);
>>        }
>>        String templateFolder = 
>> getValueOrNull(System.getProperty("jetspeed.administration.register.users.template.folder")); 
>>
>>              JetspeedTestJNDIComponent jndiDS = new 
>> JetspeedTestJNDIComponent();
>>        jndiDS.setup();
>>
>>        PropertiesConfiguration config = new PropertiesConfiguration();
>>        config.load(new 
>> FileInputStream(appRoot+"/WEB-INF/conf/jetspeed.properties"));
>>        MockServletConfig servletConfig = new 
>> MockServletConfig();              ResourceLocatingServletContext 
>> servletContent = new ResourceLocatingServletContext(new 
>> File(appRoot));              
>> servletConfig.setServletContext(servletContent);
>>        ServletConfigFactoryBean.setServletConfig(servletConfig);
>>
>>        final String assemblyDir = 
>> config.getString("assembly.dir","/WEB-INF/assembly");
>>        final String assemblyFileExtension = 
>> config.getString("assembly.extension",".xml");
>>                          String[] bootConfigs = new String[] 
>> {"/WEB-INF/assembly/boot/*.xml"};
>>        String[] appConfigs =  new String[] 
>> {assemblyDir+"/*"+assemblyFileExtension, 
>> assemblyDir+"/override/*"+assemblyFileExtension};
>>              SpringComponentManager scm = new 
>> SpringComponentManager(bootConfigs, appConfigs, servletContent, 
>> appRoot );
>>             JetspeedEngine engine = new JetspeedEngine(config, 
>> appRoot, servletConfig, scm );
>>        Jetspeed.setEngine(engine);
>>        engine.start();
>>              final PlatformTransactionManager txnManager = 
>> (PlatformTransactionManager)scm.getComponent("transactionManager");
>>        final DefaultTransactionDefinition txnDefinition = new 
>> DefaultTransactionDefinition();
>>        txnDefinition.setName("RegisterTestUsers");
>>        
>> txnDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); 
>>
>>
>>        try
>>        {
>>            PortalAdministration portalAdministration = 
>> (PortalAdministration)scm.getComponent("PortalAdministrationImpl");
>>            if (count > 0)
>>            {
>>                System.out.println("Registering: "+count+" users with 
>> prefix: "+prefix);
>>
>>                // open transaction
>>                TransactionStatus txnStatus = 
>> txnManager.getTransaction(txnDefinition);
>>
>>                // execute transactional operations
>>                try
>>                {
>>                    for (int i = 1; i <= count; i++)
>>                    {
>>                        String name = prefix+Integer.toString(i);
>>                        System.out.print("Registering user: "+name+" 
>> ... ");
>>                        try
>>                        {
>>                            
>> portalAdministration.registerUser(name,name, null, null, null, 
>> profilerRules, templateFolder);
>>                        }
>>                        catch (Exception e)
>>                        {
>>                            if (e.getCause() != null && e.getCause() 
>> instanceof SecurityException)
>>                            {
>>                                SecurityException se = 
>> (SecurityException)e.getCause();
>>                                if 
>> (se.getKeyedMessage().equals(SecurityException.USER_ALREADY_EXISTS))
>>                                {
>>                                    continue;
>>                                }
>>                            }
>>                            throw e;
>>                        }
>>                        System.out.println("done");
>>
>>                        // commit every 250 users
>>                        if (((i%250) == 0) && (i < count))
>>                        {
>>                            // commit and start new txn
>>                            System.out.print("Committing ... ");
>>                            txnManager.commit(txnStatus);
>>                            System.out.println("done");
>>                            txnStatus = 
>> txnManager.getTransaction(txnDefinition);
>>                        }
>>                    }
>>                }
>>                catch (Exception e)
>>                {
>>                    // rollback transaction
>>                    txnManager.rollback(txnStatus);
>>                    throw e;
>>                }
>>                              // commit transaction
>>                System.out.print("Committing ... ");
>>                txnManager.commit(txnStatus);               
>>                System.out.println("done");
>>            }
>>        }
>>        finally
>>        {
>>            engine.shutdown();
>>        }
>>    }
>>      private static String getValueOrNull(String value)
>>    {
>>        if (value != null && value.length()==0)
>>        {
>>            value = null;
>>        }
>>        return value;
>>    }
>> }
>>
>> RegisterTestUserPrefs.java
>> ------------------------------------------------------------------------------------- 
>>
>>
>> package jetspeed.administration;
>>
>> import java.io.File;
>> import java.io.FileInputStream;
>> import java.security.PrivilegedAction;
>> import java.util.ArrayList;
>> import java.util.HashMap;
>> import java.util.Iterator;
>> import java.util.List;
>> import java.util.Map;
>>
>> import org.apache.commons.configuration.Configuration;
>> import org.apache.commons.configuration.PropertiesConfiguration;
>> import org.apache.jetspeed.Jetspeed;
>> import org.apache.jetspeed.administration.PortalConfigurationConstants;
>> import org.apache.jetspeed.components.SpringComponentManager;
>> import 
>> org.apache.jetspeed.components.factorybeans.ServletConfigFactoryBean;
>> import org.apache.jetspeed.components.jndi.JetspeedTestJNDIComponent;
>> import org.apache.jetspeed.engine.JetspeedEngine;
>> import org.apache.jetspeed.om.page.Fragment;
>> import org.apache.jetspeed.om.page.Page;
>> import org.apache.jetspeed.om.folder.Folder;
>> import org.apache.jetspeed.page.PageManager;
>> import org.apache.jetspeed.page.document.NodeSet;
>> import org.apache.jetspeed.prefs.FailedToCreateNodeException;
>> import org.apache.jetspeed.prefs.NodeAlreadyExistsException;
>> import org.apache.jetspeed.prefs.NodeDoesNotExistException;
>> import org.apache.jetspeed.prefs.om.impl.NodeImpl;
>> import org.apache.jetspeed.prefs.impl.NodeImplProxy;
>> import org.apache.jetspeed.prefs.PreferencesProvider;
>> import org.apache.jetspeed.prefs.om.Node;
>> import org.apache.jetspeed.mocks.ResourceLocatingServletContext;
>> import org.apache.jetspeed.security.JSSubject;
>> import org.apache.jetspeed.security.User;
>> import org.apache.jetspeed.security.UserManager;
>>
>> import org.springframework.transaction.PlatformTransactionManager;
>> import org.springframework.transaction.TransactionDefinition;
>> import org.springframework.transaction.TransactionStatus;
>> import 
>> org.springframework.transaction.support.DefaultTransactionDefinition;
>>
>> import com.mockrunner.mock.web.MockServletConfig;
>>
>> public class RegisterTestUserPrefs
>> {
>>    public static void main(String args[]) throws Exception
>>    {
>>        final String appRoot = System.getProperty("applicationRoot");
>>        final int count = 
>> Integer.parseInt(System.getProperty("jetspeed.administration.register.users.count")); 
>>
>>        final String prefix = 
>> System.getProperty("jetspeed.administration.register.users.prefix", "");
>>
>>        JetspeedTestJNDIComponent jndiDS = new 
>> JetspeedTestJNDIComponent();
>>        jndiDS.setup();
>>
>>        PropertiesConfiguration config = new PropertiesConfiguration();
>>        config.load(new 
>> FileInputStream(appRoot+"/WEB-INF/conf/jetspeed.properties"));
>>        MockServletConfig servletConfig = new 
>> MockServletConfig();              ResourceLocatingServletContext 
>> servletContent = new ResourceLocatingServletContext(new 
>> File(appRoot));              
>> servletConfig.setServletContext(servletContent);
>>        ServletConfigFactoryBean.setServletConfig(servletConfig);
>>
>>        final String assemblyDir = 
>> config.getString("assembly.dir","/WEB-INF/assembly");
>>        final String assemblyFileExtension = 
>> config.getString("assembly.extension",".xml");
>>                          String[] bootConfigs = new String[] 
>> {"/WEB-INF/assembly/boot/*.xml"};
>>        String[] appConfigs =  new String[] 
>> {assemblyDir+"/*"+assemblyFileExtension, 
>> assemblyDir+"/override/*"+assemblyFileExtension};
>>                      SpringComponentManager scm = new 
>> SpringComponentManager(bootConfigs, appConfigs, servletContent, 
>> appRoot );
>>             JetspeedEngine engine = new JetspeedEngine(config, 
>> appRoot, servletConfig, scm );
>>        Jetspeed.setEngine(engine);
>>        engine.start();
>>              final Configuration portalConfig = 
>> (Configuration)scm.getComponent("portal_configuration");
>>        final String adminUserName = 
>> portalConfig.getString(PortalConfigurationConstants.USERS_DEFAULT_ADMIN);        
>>
>>        final UserManager userManager = 
>> (UserManager)scm.getComponent("org.apache.jetspeed.security.UserManager"); 
>>
>>        final User adminUser = userManager.getUser(adminUserName);
>>        final PageManager pageManager = 
>> (PageManager)scm.getComponent("pageManager");
>>        final PreferencesProvider preferencesProvider = 
>> (PreferencesProvider)scm.getComponent("prefsProvider");
>>        final PlatformTransactionManager txnManager = 
>> (PlatformTransactionManager)scm.getComponent("transactionManager");
>>        final DefaultTransactionDefinition txnDefinition = new 
>> DefaultTransactionDefinition();
>>        txnDefinition.setName("RegisterTestUserPrefs");
>>        
>> txnDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); 
>>
>>              try
>>        {
>>            if (count > 0)
>>            {
>>                System.out.println("Registering prefs: "+count+" users 
>> with prefix: "+prefix);
>>
>>                // perform registration as admin user so that pages 
>> can be read
>>                Exception actionException = 
>> (Exception)JSSubject.doAsPrivileged(adminUser.getSubject(), new 
>> PrivilegedAction()
>>                {
>>                    public Object run()
>>                    {
>>                        // open transaction
>>                        TransactionStatus txnStatus = 
>> txnManager.getTransaction(txnDefinition);
>>
>>                        // execute transactional operations
>>                        try
>>                        {
>>                            // create map of preference nodes for this 
>> transaction
>>                            Map preferencesMap = new HashMap();
>>                                                      // find shared 
>> portal pages
>>                            Folder rootFolder = 
>> pageManager.getFolder("/");
>>                            List sharedPages = new ArrayList();
>>                            findPages(rootFolder, sharedPages);
>>
>>                            for (int i = 1; i <= count; i++)
>>                            {
>>                                String name = prefix+Integer.toString(i);
>>                                System.out.print("Registering prefs 
>> for user: "+name+" ... ");
>>
>>                                // access list of fragments that can 
>> be visited by user
>>                                List userPages = new ArrayList();
>>                                Folder userFolder = 
>> pageManager.getFolder(Folder.USER_FOLDER + name);
>>                                findPages(userFolder, userPages);
>>                                List addSharedPages = new ArrayList();
>>                                // merge shared pages not replaced by 
>> user pages via standard profiler
>>                                for (Iterator sharedIter = 
>> sharedPages.iterator(); sharedIter.hasNext();)
>>                                {
>>                                    Page sharedPage = 
>> (Page)sharedIter.next();
>>                                    boolean sharedPageHidden = false;
>>                                    for (Iterator userIter = 
>> userPages.iterator(); userIter.hasNext();)
>>                                    {
>>                                        Page userPage = 
>> (Page)userIter.next();
>>                                        String userPageProfiledPath = 
>> userPage.getPath().substring(userFolder.getPath().length());
>>                                        if 
>> (userPageProfiledPath.equals(sharedPage.getPath()))
>>                                        {
>>                                            sharedPageHidden = true;
>>                                        }
>>                                    }
>>                                    if (!sharedPageHidden)
>>                                    {
>>                                        addSharedPages.add(sharedPage);
>>                                    }
>>                                }
>>                                userPages.addAll(addSharedPages);
>>                                // find fragments in all pages
>>                                List userFragments = new ArrayList();
>>                                for (Iterator iter = 
>> userPages.iterator(); iter.hasNext();)
>>                                {
>>                                    Page page = (Page)iter.next();
>>                                    
>> findFragments(page.getRootFragment(), userFragments);
>>                                }
>>                                                              // 
>> register empty preferences tree for potentially visited
>>                                // fragments and a user defined 
>> preference for portlets
>>                                // with a defined default preference
>>                                Node rootPreference = 
>> createUserPreference(preferencesProvider, null, "/", "", 
>> preferencesMap);
>>                                rootPreference = 
>> createUserPreference(preferencesProvider, rootPreference, 
>> "/portlet_entity", "portlet_entity", preferencesMap);
>>                                for (Iterator iter = 
>> userFragments.iterator(); iter.hasNext();)
>>                                {
>>                                    Fragment fragment = 
>> (Fragment)iter.next();
>>                                    String portletEntityId = 
>> fragment.getId();
>>                                    // empty preferences tree
>>                                    Node preference = 
>> createUserPreference(preferencesProvider, rootPreference, 
>> "/portlet_entity/"+portletEntityId, portletEntityId, preferencesMap);
>>                                    preference = 
>> createUserPreference(preferencesProvider, preference, 
>> "/portlet_entity/"+portletEntityId+"/"+name, name, null);
>>                                    preference = 
>> createUserPreference(preferencesProvider, preference, 
>> "/portlet_entity/"+portletEntityId+"/"+name+"/preferences", 
>> "preferences", null);
>>                                    // user defined preference, 
>> (assume preferences defined for j2pt portlets with "prefs" in name)
>>                                    String [] portletNames = 
>> fragment.getName().split("::");
>>                                    String portletAppName = 
>> portletNames[0];
>>                                    String portletName = portletNames[1];
>>                                    if 
>> ((portletAppName.toLowerCase().indexOf("j2pt") != -1) && 
>> (portletName.toLowerCase().indexOf("prefs") != -1))
>>                                    {
>>                                        // add j2pt user preference: 
>> name=pref-0, value=<name>-pref-0-value
>>                                        Node userPreference = 
>> createUserPreference(preferencesProvider, preference, 
>> "/portlet_entity/"+portletEntityId+"/"+name+"/preferences/pref-0", 
>> "pref-0", null);
>>                                        Node userPreferenceValues = 
>> createUserPreference(preferencesProvider, userPreference, 
>> "/portlet_entity/"+portletEntityId+"/"+name+"/preferences/pref-0/values", 
>> "values", null);
>>                                        if 
>> (userPreferenceValues.getNodeProperties().isEmpty())
>>                                        {
>>                                            
>> userPreferenceValues.getNodeProperties().add(preferencesProvider.createProperty(userPreferenceValues, 
>> "0", name+"-pref-0-value"));
>>                                            
>> preferencesProvider.storeNode(userPreferenceValues);
>>                                        }
>>                                        Node userPreferenceSize = 
>> createUserPreference(preferencesProvider, userPreference, 
>> "/portlet_entity/"+portletEntityId+"/"+name+"/preferences/pref-0/size", 
>> "size", null);
>>                                        if 
>> (userPreferenceSize.getNodeProperties().isEmpty())
>>                                        {
>>                                            
>> userPreferenceSize.getNodeProperties().add(preferencesProvider.createProperty(userPreferenceValues, 
>> "size", "1"));
>>                                            
>> preferencesProvider.storeNode(userPreferenceSize);
>>                                        }
>>                                    }
>>                                }
>>
>>                                System.out.println("done");
>>                                                              // 
>> commit every 250 users and reset cached data
>>                                if (((i%250) == 0) && (i < count))
>>                                {
>>                                    // commit and start new txn
>>                                    System.out.print("Committing ... ");
>>                                    txnManager.commit(txnStatus);
>>                                    System.out.println("done");
>>                                    txnStatus = 
>> txnManager.getTransaction(txnDefinition);
>>                                                                      
>> // reset cached data
>>                                    rootFolder = 
>> pageManager.getFolder("/");
>>                                    sharedPages.clear();
>>                                    findPages(rootFolder, sharedPages);
>>                                    preferencesMap.clear();
>>                                }
>>                            }
>>                                                      // clear cached 
>> data for this transaction
>>                            rootFolder = null;
>>                            sharedPages.clear();
>>                            
>> preferencesMap.clear();                           
>>                        }
>>                        catch (Exception e)
>>                        {
>>                            // rollback transaction
>>                            txnManager.rollback(txnStatus);
>>                            return e;
>>                        }
>>
>>                        // commit transaction
>>                        System.out.print("Committing ... ");
>>                        txnManager.commit(txnStatus);
>>                        System.out.println("done");
>>                        return null;
>>                    }
>>                }, null);
>>                if (actionException != null)
>>                {
>>                    throw actionException;
>>                }
>>            }
>>        }
>>        finally
>>        {
>>            engine.shutdown();
>>        }
>>    }
>>
>>    private static void findPages(Folder folder, List pages) throws 
>> Exception
>>    {
>>        // get folder pages
>>        NodeSet folderPages = folder.getPages();
>>        for (Iterator iter = folderPages.iterator(); iter.hasNext();)
>>        {
>>            Page page = (Page)iter.next();
>>            if (!page.isHidden())
>>            {
>>                pages.add(page);
>>            }
>>        }
>>        // recursively get folder pages
>>        NodeSet folders = folder.getFolders();
>>        for (Iterator iter = folders.iterator(); iter.hasNext();)
>>        {
>>            Folder folderFolder = (Folder)iter.next();
>>            if (!folderFolder.isHidden() && !folderFolder.isReserved() 
>> && !folderFolder.getName().startsWith(Folder.RESERVED_FOLDER_PREFIX))
>>            {
>>                findPages(folderFolder, pages);
>>            }
>>        }
>>    }
>>
>>    private static void findFragments(Fragment fragment, List 
>> fragments) throws Exception
>>    {
>>        // get fragment
>>        fragments.add(fragment);
>>        // recursively get fragments
>>        List fragmentChildren = fragment.getFragments();
>>        for (Iterator iter = fragmentChildren.iterator(); 
>> iter.hasNext();)
>>        {
>>            findFragments((Fragment)iter.next(), fragments);
>>        }
>>    }
>>      private static Node createUserPreference(PreferencesProvider 
>> preferencesProvider, Node parent, String path, String name, Map 
>> preferencesMap) throws Exception
>>    {
>>        // lookup, query, or create user preference
>>        Node preference = null;
>>        if (preferencesMap != null)
>>        {
>>            // lookup preference in map
>>            preference = (Node)preferencesMap.get(path);
>>            if (preference == null)
>>            {
>>                // assume preference needs to be looked up
>>                try
>>                {
>>                    preference = preferencesProvider.getNode(path, 0);
>>                }
>>                catch (NodeDoesNotExistException ndnee)
>>                {
>>                    preference = rawCreateNode(preferencesProvider, 
>> parent, name, 0, path);
>>                }
>>                preferencesMap.put(path, preference);
>>            }
>>        }
>>        else
>>        {
>>            // assume preference needs to be created
>>            try
>>            {
>>                preference = rawCreateNode(preferencesProvider, 
>> parent, name, 0, path);
>>            }
>>            catch (NodeAlreadyExistsException naee)
>>            {
>>                preference = preferencesProvider.getNode(path, 0);
>>            }
>>        }
>>        return preference;
>>    }
>>      private static Node rawCreateNode(PreferencesProvider 
>> preferencesProvider, Node parent, String name, int type, String path) 
>> throws FailedToCreateNodeException, NodeAlreadyExistsException
>>    {
>>        // create node without testing for existence; see implementation
>>        // of PersistenceBrokerPreferencesProvider.createNode()
>>        Long parentNodeId = null;
>>        if (null != parent)
>>        {
>>            parentNodeId = new Long(parent.getNodeId());
>>        }
>>        Node node = new NodeImplProxy(new NodeImpl(parentNodeId, name, 
>> type, path));
>>        try
>>        {
>>            preferencesProvider.storeNode(node);
>>        }
>>        catch (Exception e)
>>        {
>>            if (preferencesProvider.nodeExists(path, type))
>>            {
>>                throw new NodeAlreadyExistsException("Node of type 
>> "+type+" already exists at path "+path);
>>            }
>>            throw new FailedToCreateNodeException("Failed to create 
>> node of type "+type+" for the path "+path+". "+e, e);
>>        }
>>        return node;
>>    }
>> }
>>
>>
>> Ron Wheeler wrote:
>>> Ron Wheeler wrote:
>>>> David Sean Taylor wrote:
>>>>>
>>>>> On Aug 20, 2009, at 12:39 PM, Ron Wheeler wrote:
>>>>>
>>>>>> We need to build a batch process to update the Jetspeed users and 
>>>>>> their roles each night
>>>>>>
>>>>>> Can we do this outside the Jetspeed portal context?
>>>>>> Is there an example of batch processes access/modifying 
>>>>>> Jetspeed's data.
>>>>>
>>>>> Yes this is possible. Take a look at the Jetspeed Serializer for 
>>>>> an example of how to create a command line utility to run start up 
>>>>> Jetspeed, link in the jar files, and assemble the Spring files
>>>>>
>>>>> Or you could run a scheduled service from directly in your server. 
>>>>> We don't have a scheduler service, you would have to add in Spring 
>>>>> scheduler such as http://www.opensymphony.com/quartz/
>>>> I was thinking of using Quartz since I need to schedule the 
>>>> activity to happen at 3 AM and I don't want to have to get up to 
>>>> push a button.
>>>> I may try to put the task in Ant since I do need to do some other 
>>>> steps prior to the update and I think that Ant has the tasks that I 
>>>> need.
>>>
>>> I have the Spring/Quartz documentation and Spring Batch so that part 
>>> is covered.
>>> My question is less about the scheduling and more about how to 
>>> access Jetspeed functions outside a portal or servlet environment.
>>>
>>> Ron
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: jetspeed-user-unsubscribe@portals.apache.org
>>> For additional commands, e-mail: jetspeed-user-help@portals.apache.org
>>>
>>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: jetspeed-user-unsubscribe@portals.apache.org
>> For additional commands, e-mail: jetspeed-user-help@portals.apache.org
>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: jetspeed-user-unsubscribe@portals.apache.org
> For additional commands, e-mail: jetspeed-user-help@portals.apache.org
>
>


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