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 ta...@apache.org on 2006/01/22 06:36:42 UTC
svn commit: r371205 - in
/portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/page:
AbstractPageManager.java impl/DatabasePageManager.java
Author: taylor
Date: Sat Jan 21 21:36:40 2006
New Revision: 371205
URL: http://svn.apache.org/viewcvs?rev=371205&view=rev
Log:
http://issues.apache.org/jira/browse/JS2-476
Create user pages from a user's roles
Implementation
new API: createUserHomePagesFromRoles
public Page getUserPage(String userName, String pageName)
throws PageNotFoundException, NodeException;
public Folder getUserFolder(String userName)
throws FolderNotFoundException, InvalidFolderException, NodeException;
public boolean folderExists(String folderName);
public boolean pageExists(String pageName);
public boolean linkExists(String linkName);
public boolean userFolderExists(String userName);
public boolean userPageExists(String userName, String pageName);
I don;t have a use case for it, but i could also see deepMergeFolder being a public api
Modified:
portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/page/AbstractPageManager.java
portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/page/impl/DatabasePageManager.java
Modified: portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/page/AbstractPageManager.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/page/AbstractPageManager.java?rev=371205&r1=371204&r2=371205&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/page/AbstractPageManager.java (original)
+++ portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/page/AbstractPageManager.java Sat Jan 21 21:36:40 2006
@@ -15,12 +15,15 @@
*/
package org.apache.jetspeed.page;
+import java.security.Principal;
import java.util.ArrayList;
import java.util.Iterator;
-import java.util.List;
import java.util.LinkedList;
+import java.util.List;
import java.util.Map;
+import javax.security.auth.Subject;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jetspeed.exception.JetspeedException;
@@ -28,6 +31,7 @@
import org.apache.jetspeed.om.common.SecurityConstraints;
import org.apache.jetspeed.om.folder.Folder;
import org.apache.jetspeed.om.folder.FolderNotFoundException;
+import org.apache.jetspeed.om.folder.InvalidFolderException;
import org.apache.jetspeed.om.folder.MenuDefinition;
import org.apache.jetspeed.om.folder.MenuExcludeDefinition;
import org.apache.jetspeed.om.folder.MenuIncludeDefinition;
@@ -41,6 +45,10 @@
import org.apache.jetspeed.om.preference.FragmentPreference;
import org.apache.jetspeed.page.document.FailedToUpdateDocumentException;
import org.apache.jetspeed.page.document.Node;
+import org.apache.jetspeed.page.document.NodeException;
+import org.apache.jetspeed.security.RolePrincipal;
+import org.apache.jetspeed.security.SecurityHelper;
+import org.apache.jetspeed.security.UserPrincipal;
/**
* AbstractPageManagerService
@@ -1267,4 +1275,201 @@
return base.concat(path);
}
+ public Page getUserPage(String userName, String pageName)
+ throws PageNotFoundException, NodeException
+ {
+ return this.getPage(Folder.USER_FOLDER + userName + Folder.PATH_SEPARATOR + pageName);
+ }
+
+ public Folder getUserFolder(String userName)
+ throws FolderNotFoundException, InvalidFolderException, NodeException
+ {
+ return this.getFolder(Folder.USER_FOLDER + userName);
+ }
+
+ public boolean folderExists(String folderName)
+ {
+ try
+ {
+ getFolder(folderName);
+ }
+ catch (Exception e)
+ {
+ return false;
+ }
+ return true;
+ }
+ public boolean pageExists(String pageName)
+ {
+ try
+ {
+ getPage(pageName);
+ }
+ catch (Exception e)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ public boolean linkExists(String linkName)
+ {
+ try
+ {
+ getLink(linkName);
+ }
+ catch (Exception e)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ public boolean userFolderExists(String userName)
+ {
+ try
+ {
+ getFolder(Folder.USER_FOLDER + userName);
+ }
+ catch (Exception e)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ public boolean userPageExists(String userName, String pageName)
+ {
+ try
+ {
+ getPage(Folder.USER_FOLDER + userName + Folder.PATH_SEPARATOR + pageName);
+ }
+ catch (Exception e)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Creates a user's home page from the roles of the current user.
+ * The use case: when a portal is setup to use shared pages, but then
+ * the user attempts to customize. At this point, we create the new page(s) for the user.
+ *
+ * @param subject
+ */
+ public void createUserHomePagesFromRoles(Subject subject)
+ throws JetspeedException
+ {
+ Principal principal = SecurityHelper.getBestPrincipal(subject, UserPrincipal.class);
+ if (principal == null)
+ {
+ String errorMessage = "Could not create user home for null principal";
+ log.error(errorMessage);
+ throw new JetspeedException(errorMessage);
+ }
+ try
+ {
+ String userName = principal.getName();
+ // get user home
+ Folder newUserFolder;
+ if (this.userFolderExists(userName))
+ {
+ newUserFolder = this.getUserFolder(userName);
+ }
+ else
+ {
+ newUserFolder = this.newFolder(Folder.USER_FOLDER + userName);
+ SecurityConstraints constraints = this.newSecurityConstraints();
+ newUserFolder.setSecurityConstraints(constraints);
+ newUserFolder.getSecurityConstraints().setOwner(userName);
+ this.updateFolder(newUserFolder);
+ }
+ // for each role for a user, deep copy the folder contents for that role
+ // into the user's home
+ // TODO: this algorithm could actually merge pages on dups
+ Iterator roles = SecurityHelper.getPrincipals(subject, RolePrincipal.class).iterator();
+ while (roles.hasNext())
+ {
+ RolePrincipal role = (RolePrincipal)roles.next();
+ if (this.folderExists(Folder.ROLE_FOLDER + role.getName()))
+ {
+ Folder roleFolder = this.getFolder(Folder.ROLE_FOLDER + role.getName());
+ deepMergeFolder(roleFolder, Folder.USER_FOLDER + newUserFolder.getName(), userName, role.getName());
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ String errorMessage = "createUserHomePagesFromRoles failed: " + e.getMessage();
+ log.error(errorMessage, e);
+ throw new JetspeedException(errorMessage, e);
+ }
+ }
+
+ /**
+ * Deep merges from a source folder into a destination path for the given owner.
+ * The unique name is used in conflict resolution for name collisions.
+ * Example: deep merge a given role folder 'X' into /_user/david
+ * uniqueName = 'X'
+ * owner = 'david'
+ * destinationPath = '_user/david'
+ *
+ * @param srcFolder
+ * @param destinationPath
+ * @param owner
+ * @param uniqueName
+ * @throws JetspeedException
+ */
+ protected void deepMergeFolder(Folder srcFolder, String destinationPath, String owner, String uniqueName)
+ throws JetspeedException
+ {
+ Iterator pages = srcFolder.getPages().iterator();
+ while (pages.hasNext())
+ {
+ Page srcPage = (Page)pages.next();
+ String path = this.concatenatePaths(destinationPath, srcPage.getName());
+ if (!this.pageExists(path))
+ {
+ Page dstPage = this.copyPage(srcPage, path);
+ this.updatePage(dstPage);
+ }
+ else
+ {
+ path = this.concatenatePaths(destinationPath, uniqueName + "-" +srcPage.getName());
+ Page dstPage = this.copyPage(srcPage, path);
+ this.updatePage(dstPage);
+ }
+ }
+
+ Iterator links = srcFolder.getLinks().iterator();
+ while (links.hasNext())
+ {
+ Link srcLink = (Link)links.next();
+ String path = this.concatenatePaths(destinationPath, srcLink.getName());
+ if (!this.linkExists(path))
+ {
+ Link dstLink = this.copyLink(srcLink, path);
+ this.updateLink(dstLink);
+ }
+ else
+ {
+ path = this.concatenatePaths(destinationPath, uniqueName + "-" +srcLink.getName());
+ Link dstLink = this.copyLink(srcLink, path);
+ this.updateLink(dstLink);
+ }
+ }
+ Iterator folders = srcFolder.getFolders().iterator();
+ while (folders.hasNext())
+ {
+ Folder folder = (Folder)folders.next();
+ String newPath = concatenatePaths(destinationPath, folder.getName());
+ if (!this.folderExists(newPath))
+ {
+ Folder dstFolder = this.copyFolder(folder, newPath);
+ this.updateFolder(dstFolder);
+ }
+ deepMergeFolder(folder, newPath, null, uniqueName);
+ }
+ }
}
Modified: portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/page/impl/DatabasePageManager.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/page/impl/DatabasePageManager.java?rev=371205&r1=371204&r2=371205&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/page/impl/DatabasePageManager.java (original)
+++ portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/page/impl/DatabasePageManager.java Sat Jan 21 21:36:40 2006
@@ -18,6 +18,8 @@
import java.util.HashMap;
import java.util.Map;
+import javax.security.auth.Subject;
+
import org.apache.jetspeed.components.dao.InitablePersistenceBrokerDaoSupport;
import org.apache.jetspeed.exception.JetspeedException;
import org.apache.jetspeed.om.common.SecuredResource;
@@ -1167,5 +1169,49 @@
{
this.delegator.deepCopyFolder(srcFolder, destinationPath, owner);
}
+
+ public Page getUserPage(String userName, String pageName)
+ throws PageNotFoundException, NodeException
+ {
+ return this.delegator.getUserPage(userName, pageName);
+ }
+
+ public Folder getUserFolder(String userName)
+ throws FolderNotFoundException, InvalidFolderException, NodeException
+ {
+ return this.delegator.getUserFolder(userName);
+ }
+
+ public boolean folderExists(String folderName)
+ {
+ return this.delegator.folderExists(folderName);
+ }
+
+ public boolean pageExists(String pageName)
+ {
+ return this.delegator.pageExists(pageName);
+ }
+
+ public boolean linkExists(String linkName)
+ {
+ return this.delegator.linkExists(linkName);
+ }
+
+ public boolean userFolderExists(String userName)
+ {
+ return this.delegator.userFolderExists(userName);
+ }
+
+ public boolean userPageExists(String userName, String pageName)
+ {
+ return this.delegator.userPageExists(userName, pageName);
+ }
+
+ public void createUserHomePagesFromRoles(Subject subject)
+ throws JetspeedException
+ {
+ this.delegator.createUserHomePagesFromRoles(subject);
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org