[jboss-cvs] jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action ...
Christian Bauer
christian at hibernate.org
Mon Apr 2 14:25:06 EDT 2007
User: cbauer
Date: 07/04/02 14:25:06
Modified: examples/wiki/src/main/org/jboss/seam/wiki/core/action
NodeBrowser.java NodeHome.java UserHome.java
WikiIdentity.java DocumentHome.java
NodePermissions.java
Added: examples/wiki/src/main/org/jboss/seam/wiki/core/action
PreferenceEditor.java PluginPreferenceEditor.java
Log:
Totally overengineered but definitely cool system/user/instance wiki preferences architecture
Revision Changes Path
1.9 +0 -3 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodeBrowser.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: NodeBrowser.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodeBrowser.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- NodeBrowser.java 22 Mar 2007 12:16:07 -0000 1.8
+++ NodeBrowser.java 2 Apr 2007 18:25:06 -0000 1.9
@@ -50,9 +50,6 @@
public void setNodeId(Long nodeId) { this.nodeId = nodeId; }
@In
- private GlobalPreferences globalPrefs;
-
- @In
protected org.jboss.seam.core.Redirect redirect;
@In
1.10 +19 -2 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodeHome.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: NodeHome.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodeHome.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- NodeHome.java 22 Mar 2007 12:16:07 -0000 1.9
+++ NodeHome.java 2 Apr 2007 18:25:06 -0000 1.10
@@ -9,11 +9,13 @@
import org.jboss.seam.wiki.core.model.Directory;
import org.jboss.seam.wiki.core.model.Node;
import org.jboss.seam.wiki.util.WikiUtil;
+import org.jboss.seam.wiki.preferences.PreferenceProvider;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.RequestParameter;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.core.Events;
import org.jboss.seam.ScopeType;
+import org.jboss.seam.Component;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.security.AuthorizationException;
import org.jboss.seam.security.Identity;
@@ -146,7 +148,12 @@
if (!isValidModel()) return null;
if (!beforePersist()) return null;
- return super.persist();
+ String outcome = super.persist();
+
+ // Notify any plugin preferences editors to also flush
+ Events.instance().raiseEvent("PreferenceEditor.flushAll");
+
+ return outcome;
}
@Override
@@ -169,7 +176,12 @@
if (!isValidModel()) return null;
if (!beforeUpdate()) return null;
- return super.update();
+ String outcome = super.update();
+
+ // Notify any plugin preferences editors to also flush
+ Events.instance().raiseEvent("PreferenceEditor.flushAll");
+
+ return outcome;
}
@Override
@@ -183,6 +195,11 @@
refreshMenuItems();
if (!beforeRemove()) return null;
+
+ // Delete preferences of this node
+ PreferenceProvider provider = (PreferenceProvider) Component.getInstance("preferenceProvider");
+ provider.deleteInstancePreferences(getInstance());
+
return super.remove();
}
1.4 +14 -6 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/UserHome.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: UserHome.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/UserHome.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- UserHome.java 21 Mar 2007 17:32:24 -0000 1.3
+++ UserHome.java 2 Apr 2007 18:25:06 -0000 1.4
@@ -10,9 +10,12 @@
import org.jboss.seam.wiki.core.dao.UserDAO;
import org.jboss.seam.wiki.core.model.*;
import org.jboss.seam.wiki.core.model.Role;
+import org.jboss.seam.wiki.core.action.prefs.UserManagementPreferences;
import org.jboss.seam.wiki.util.Hash;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
+import org.jboss.seam.security.Identity;
+import org.jboss.seam.security.AuthorizationException;
import org.jboss.seam.contexts.Contexts;
import javax.faces.application.FacesMessage;
@@ -37,7 +40,7 @@
private Hash hashUtil;
@In
- private GlobalPreferences globalPrefs;
+ private UserManagementPreferences userManagementPreferences;
@In
private Renderer renderer;
@@ -68,7 +71,12 @@
defaultRole = (Role)Component.getInstance("newUserDefaultRole");
oldUsername = getInstance().getUsername();
- if (isManaged()) roles = getInstance().getRoles();
+ if (isManaged()) {
+ if (!Identity.instance().hasPermission("User", "edit", getInstance()) ) {
+ throw new AuthorizationException("You don't have permission for this operation");
+ }
+ roles = getInstance().getRoles();
+ }
}
public String persist() {
@@ -93,7 +101,7 @@
getInstance().setPasswordHash(hashUtil.hash(getPassword()));
// Set activation code (unique user in time)
- String seed = getInstance().getUsername() + System.currentTimeMillis() + globalPrefs.getActivationCodeSalt();
+ String seed = getInstance().getUsername() + System.currentTimeMillis() + userManagementPreferences.getActivationCodeSalt();
getInstance().setActivationCode( ((Hash)Component.getInstance("hashUtil")).hash(seed) );
String outcome = super.persist();
@@ -102,7 +110,7 @@
try {
// Send confirmation email
- renderer.render("/themes/" + globalPrefs.getThemeName() + "/mailtemplates/confirmationRegistration.xhtml");
+// renderer.render("/themes/" + wikiPreferences.getThemeName() + "/mailtemplates/confirmationRegistration.xhtml");
// Redirect to last viewed page with message
facesMessages.addFromResourceBundleOrDefault(
@@ -240,13 +248,13 @@
private boolean passwordMatchesRegex() {
- Matcher matcher = Pattern.compile(globalPrefs.getPasswordRegex()).matcher(getPassword());
+ Matcher matcher = Pattern.compile(userManagementPreferences.getPasswordRegex()).matcher(getPassword());
if (!matcher.find()) {
facesMessages.addToControlFromResourceBundleOrDefault(
"password",
FacesMessage.SEVERITY_ERROR,
getMessageKeyPrefix() + "passwordNoRegexMatch",
- "Password does not match the pattern: " + globalPrefs.getPasswordRegex()
+ "Password does not match the pattern: " + userManagementPreferences.getPasswordRegex()
);
return false;
}
1.2 +18 -6 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/WikiIdentity.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: WikiIdentity.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/WikiIdentity.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- WikiIdentity.java 18 Mar 2007 15:44:37 -0000 1.1
+++ WikiIdentity.java 2 Apr 2007 18:25:06 -0000 1.2
@@ -9,8 +9,8 @@
import org.jboss.seam.wiki.core.model.User;
import org.jboss.seam.wiki.core.model.Directory;
import org.jboss.seam.wiki.core.model.Node;
-import org.jboss.seam.wiki.core.model.GlobalPreferences;
import org.jboss.seam.wiki.core.dao.UserRoleAccessFactory;
+import org.jboss.seam.wiki.core.action.prefs.WikiPreferences;
import org.jboss.seam.Component;
/**
@@ -26,13 +26,13 @@
private User currentUser;
private Integer currentAccessLevel;
- private GlobalPreferences globalPrefs;
+ private WikiPreferences wikiPrefs;
public boolean hasPermission(String name, String action, Object... args) {
currentUser = (User)Component.getInstance("currentUser");
currentAccessLevel = (Integer)Component.getInstance("currentAccessLevel");
- globalPrefs = (GlobalPreferences)Component.getInstance("globalPrefs");
+ wikiPrefs = (WikiPreferences) Component.getInstance("wikiPreferences");
if (args == null || args.length == 0) {
// All the security checks currently need arguments...
@@ -59,8 +59,12 @@
} else
if ("Node".equals(name) && "editMenu".equals(action)) {
return checkEditMenu((Node)args[0]);
+ } else
+ if ("User".equals(name) && "isAdmin".equals(action)) {
+ return checkIsAdmin((User)args[0]);
}
+
return false;
}
@@ -69,7 +73,7 @@
or the user is the creator of the parent directory
*/
private boolean checkCreateAccess(Directory directory) {
- if (globalPrefs.getMemberAreaId().equals(directory.getId())) return false; // Member home dir is immutable
+ if (wikiPrefs.getMemberAreaId().equals(directory.getId())) return false; // Member home dir is immutable
if (directory.getWriteAccessLevel() == UserRoleAccessFactory.GUESTROLE_ACCESSLEVEL) return true;
int dirWriteAccessLevel = directory.getWriteAccessLevel();
User dirCreator = directory.getCreatedBy();
@@ -104,7 +108,7 @@
User either needs to have the access level of the edited node or has to be the creator
*/
private boolean checkEditAccess(Node node) {
- if (globalPrefs.getMemberAreaId().equals(node.getId())) return false; // Member home dir is immutable
+ if (wikiPrefs.getMemberAreaId().equals(node.getId())) return false; // Member home dir is immutable
if (node.getWriteAccessLevel() == UserRoleAccessFactory.GUESTROLE_ACCESSLEVEL) return true;
int nodeWriteAccessLevel = node.getWriteAccessLevel();
User nodeCreator = node.getCreatedBy();
@@ -123,7 +127,7 @@
he has, unless he is the creator
*/
private boolean checkRaiseAccessLevel(Node node) {
- if (globalPrefs.getMemberAreaId().equals(node.getId())) return false; // Member home dir is immutable
+ if (wikiPrefs.getMemberAreaId().equals(node.getId())) return false; // Member home dir is immutable
int desiredWriteAccessLevel = node.getWriteAccessLevel();
int desiredReadAccessLevel = node.getReadAccessLevel();
User nodeCreator = node.getCreatedBy();
@@ -166,4 +170,12 @@
return false;
}
+ /*
+ Only admins are admins
+ */
+ private boolean checkIsAdmin(User user) {
+ if (currentAccessLevel == UserRoleAccessFactory.ADMINROLE_ACCESSLEVEL) return true;
+ return false;
+ }
+
}
1.8 +13 -6 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/DocumentHome.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: DocumentHome.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/DocumentHome.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- DocumentHome.java 22 Mar 2007 12:47:50 -0000 1.7
+++ DocumentHome.java 2 Apr 2007 18:25:06 -0000 1.8
@@ -5,6 +5,7 @@
import org.jboss.seam.wiki.core.engine.WikiLinkResolver;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
+import org.jboss.seam.core.Events;
import org.jboss.seam.contexts.Contexts;
@Name("documentHome")
@@ -18,7 +19,8 @@
/* -------------------------- Internal State ------------------------------ */
private Document historicalCopy;
- private boolean minorRevision = true;
+ @In("#{docEditorPreferences.properties['minorRevisionEnabled']}")
+ private boolean minorRevision;
private String formContent;
private boolean enabledPreview = false;
@@ -28,10 +30,6 @@
public void create() {
super.create();
- // Settings
- GlobalPreferences globalPrefs = (GlobalPreferences) Component.getInstance("globalPrefs");
- minorRevision = !globalPrefs.isDefaultNewRevisionForEditedDocument();
-
// Rollback to historical revision?
if (selectedHistoricalNode != null) getInstance().rollback(selectedHistoricalNode);
@@ -105,7 +103,6 @@
formContent = wikiLinkResolver.convertFromWikiProtocol(dir.getAreaNumber(), getInstance().getContent());
}
-
/* -------------------------- Public Features ------------------------------ */
public String getFormContent() {
@@ -130,4 +127,14 @@
syncFormToInstance(getParentDirectory());
refreshMenuItems();
}
+
+ public void setShowPluginPrefs(boolean showPluginPrefs) {
+ Contexts.getConversationContext().set("showPluginPreferences", showPluginPrefs);
+
+ }
+
+ public boolean isShowPluginPrefs() {
+ Boolean showPluginPrefs = (Boolean)Contexts.getConversationContext().get("showPluginPreferences");
+ return showPluginPrefs != null ? showPluginPrefs : false;
+ }
}
1.3 +2 -1 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodePermissions.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: NodePermissions.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodePermissions.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- NodePermissions.java 18 Mar 2007 15:44:37 -0000 1.2
+++ NodePermissions.java 2 Apr 2007 18:25:06 -0000 1.3
@@ -11,10 +11,11 @@
import org.jboss.seam.Component;
import java.util.List;
+import java.io.Serializable;
@Name("nodePermissions")
@Scope(ScopeType.CONVERSATION)
-public class NodePermissions {
+public class NodePermissions implements Serializable {
@In
Node currentNode;
1.1 date: 2007/04/02 18:25:06; author: cbauer; state: Exp;jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/PreferenceEditor.java
Index: PreferenceEditor.java
===================================================================
package org.jboss.seam.wiki.core.action;
import org.jboss.seam.annotations.*;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.ScopeType;
import org.jboss.seam.Component;
import org.jboss.seam.security.Identity;
import org.jboss.seam.security.AuthorizationException;
import org.jboss.seam.core.FacesMessages;
import org.jboss.seam.wiki.preferences.*;
import org.jboss.seam.wiki.preferences.PreferenceRegistry;
import org.jboss.seam.wiki.core.dao.UserDAO;
import org.jboss.seam.wiki.core.model.User;
import org.hibernate.validator.InvalidValue;
import javax.faces.application.FacesMessage;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashSet;
import java.io.Serializable;
@Name("prefEditor")
@Scope(ScopeType.CONVERSATION)
public class PreferenceEditor implements Serializable {
@RequestParameter String visibility;
@RequestParameter Long userId;
@In
private FacesMessages facesMessages;
@DataModel
private List<PreferenceComponent> preferenceComponents;
@DataModelSelection
private PreferenceComponent selectedPreferenceComponent;
private PreferenceVisibility preferenceVisibility;
private Object user;
private PreferenceComponent preferenceComponent;
private List<PreferenceValue> preferenceValues;
@Create
public void create() {
if (PreferenceVisibility.USER.name().equals(visibility)) {
preferenceVisibility = PreferenceVisibility.USER;
loadUser();
} else {
if (!Identity.instance().hasPermission("User", "isAdmin", (User)Component.getInstance("currentUser")) ) {
throw new AuthorizationException("You don't have permission for this operation");
}
preferenceVisibility = PreferenceVisibility.SYSTEM;
}
}
@Factory("preferenceComponents")
public void load() {
PreferenceRegistry registry = (PreferenceRegistry)Component.getInstance("preferenceRegistry");
preferenceComponents =
new ArrayList<PreferenceComponent>(registry.getPreferenceComponents(preferenceVisibility));
}
@Transactional
public String save() {
boolean validationOk = true;
Map<PreferenceProperty, InvalidValue[]> invalidProperties = preferenceComponent.validate(preferenceValues);
for (Map.Entry<PreferenceProperty, InvalidValue[]> entry : invalidProperties.entrySet()) {
for (InvalidValue validationError : entry.getValue()) {
validationOk = false;
facesMessages.addFromResourceBundleOrDefault(
FacesMessage.SEVERITY_ERROR,
"preferenceValueValidationFailed." + preferenceComponent.getName() + "." + entry.getKey().getName(),
"'" + entry.getKey().getDescription() + "': " + validationError.getMessage());
}
}
if (!validationOk) return null;
PreferenceProvider provider = (PreferenceProvider)Component.getInstance("preferenceProvider");
if (preferenceVisibility.equals(PreferenceVisibility.USER)) {
// Store prefs for a user
preferenceValues = new ArrayList<PreferenceValue>(provider.store(preferenceComponent, new HashSet<PreferenceValue>(preferenceValues), user, null));
} else {
// Store system prefs
preferenceValues = new ArrayList<PreferenceValue>(provider.store(preferenceComponent, new HashSet<PreferenceValue>(preferenceValues), null, null));
}
provider.flush();
facesMessages.addFromResourceBundleOrDefault(
FacesMessage.SEVERITY_INFO,
"wikiPreferencesSaved",
"Preferences have been saved, continue editing or exit.");
return null;
}
public void selectPreferenceComponent() {
preferenceComponent = selectedPreferenceComponent;
PreferenceProvider provider = (PreferenceProvider)Component.getInstance("preferenceProvider");
if (preferenceVisibility.equals(PreferenceVisibility.USER)) {
// Load prefs for a user
preferenceValues = new ArrayList<PreferenceValue>(provider.load(preferenceComponent, user, null, false));
} else {
// Load system prefs
preferenceValues = new ArrayList<PreferenceValue>(provider.load(preferenceComponent, null, null, true));
}
}
public PreferenceComponent getPreferenceComponent() {
return preferenceComponent;
}
public List<PreferenceValue> getPreferenceValues() {
return preferenceValues;
}
protected void loadUser() {
if (userId != null) {
UserDAO userDAO = (UserDAO)Component.getInstance("userDAO");
user = userDAO.findUser(userId);
} else {
user = Component.getInstance("currentUser");
}
}
}
1.1 date: 2007/04/02 18:25:06; author: cbauer; state: Exp;jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/PluginPreferenceEditor.java
Index: PluginPreferenceEditor.java
===================================================================
package org.jboss.seam.wiki.core.action;
import org.jboss.seam.wiki.preferences.*;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
import org.jboss.seam.core.Events;
import org.jboss.seam.core.FacesMessages;
import org.jboss.seam.annotations.Observer;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.AutoCreate;
import org.hibernate.validator.InvalidValue;
import javax.faces.application.FacesMessage;
import java.util.*;
import java.io.Serializable;
public class PluginPreferenceEditor implements Serializable {
private String pluginPreferenceName;
private PreferenceComponent preferenceComponent;
private List<PreferenceValue> preferenceValues = new ArrayList<PreferenceValue>();
public PluginPreferenceEditor(String pluginPreferenceName) {
System.out.println("#### NEW EDITOR FOR PLUGIN: " + pluginPreferenceName);
this.pluginPreferenceName = pluginPreferenceName;
// Load the preference component
PreferenceRegistry registry = (PreferenceRegistry) Component.getInstance("preferenceRegistry");
preferenceComponent = registry.getPreferenceComponentsByName().get(pluginPreferenceName);
if (preferenceComponent != null) {
// Materialize its values
Object user = Component.getInstance("currentUser");
Object instance = Component.getInstance("currentDocument");
PreferenceProvider provider = (PreferenceProvider)Component.getInstance("preferenceProvider");
preferenceValues = new ArrayList<PreferenceValue>(provider.load(preferenceComponent, user, instance, false));
}
}
public List<PreferenceValue> getPreferenceValues() {
System.out.println("######### GET PREFERENCE VALUES FROM PLUGIN EDITOR");
return preferenceValues;
}
public void apply() {
if (preferenceValues.size() > 0 ) {
boolean validationOk = true;
Map<PreferenceProperty, InvalidValue[]> invalidProperties = preferenceComponent.validate(preferenceValues);
for (Map.Entry<PreferenceProperty, InvalidValue[]> entry : invalidProperties.entrySet()) {
for (InvalidValue validationError : entry.getValue()) {
validationOk = false;
FacesMessages.instance().addToControlFromResourceBundleOrDefault(
pluginPreferenceName,
FacesMessage.SEVERITY_ERROR,
"preferenceValueValidationFailed." + preferenceComponent.getName() + "." + entry.getKey().getName(),
"'" + entry.getKey().getDescription() + "': " + validationError.getMessage());
}
}
if (validationOk) {
Object user = Component.getInstance("currentUser");
Object instance = Component.getInstance("currentDocument");
PreferenceProvider provider = (PreferenceProvider)Component.getInstance("preferenceProvider");
preferenceValues = new ArrayList<PreferenceValue>(provider.store(preferenceComponent, new HashSet<PreferenceValue>(preferenceValues), user, instance));
Events.instance().raiseEvent("PreferenceEditor.refresh." + preferenceComponent.getName());
}
}
}
public void flush() {
PreferenceProvider provider = (PreferenceProvider)Component.getInstance("preferenceProvider");
provider.flush();
}
@Name("pluginPreferenceEditorFlushObserver")
@Scope(ScopeType.CONVERSATION)
@AutoCreate
public static class FlushObserver implements Serializable {
Set<PluginPreferenceEditor> editors = new HashSet<PluginPreferenceEditor>();
public void addPluginPreferenceEditor(PluginPreferenceEditor editor) {
editors.add(editor);
}
@Observer("PreferenceEditor.flushAll")
public void flushEditors() {
for (PluginPreferenceEditor editor : editors) {
editor.flush();
}
}
}
}
More information about the jboss-cvs-commits
mailing list