Skip to content

Commit

Permalink
manage roles page: roles ready
Browse files Browse the repository at this point in the history
  • Loading branch information
michbarsinai committed Feb 3, 2014
1 parent 4ca048e commit 9e3d91d
Show file tree
Hide file tree
Showing 10 changed files with 343 additions and 228 deletions.
93 changes: 59 additions & 34 deletions src/main/java/edu/harvard/iq/dataverse/ManageRolesPage.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package edu.harvard.iq.dataverse;

import edu.harvard.iq.dataverse.engine.Permission;
import static edu.harvard.iq.dataverse.util.JsfHelper.JH;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
Expand All @@ -15,6 +16,7 @@
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import sun.security.x509.EDIPartyName;

/**
*
Expand All @@ -24,8 +26,11 @@
@Named
public class ManageRolesPage implements java.io.Serializable {

public enum PageMode {LIST, VIEW, EDIT };

private static final Logger logger = Logger.getLogger(ManageRolesPage.class.getName());

public enum Intent { LIST, VIEW, EDIT };
public enum ObjectType { DATAVERSE, ROLES, USERS };

@Inject DataverseSession session;

@EJB
Expand All @@ -36,31 +41,32 @@ public enum PageMode {LIST, VIEW, EDIT };

private List<String> selectedPermissions;

private PageMode mode = null;
private Intent intent = null;

private String intent;
private String intentParam;
private Long viewRoleId;
private int activeTabIndex;
private DataverseRole role;
private DataverseRole defaultUserRole;
private boolean permissionRoot;
private String objectTypeParam;
private ObjectType objectType;

public void init() {
if ( mode != null ) return;

// decide object type
objectType = JH.enumValue(getObjectTypeParam(), ObjectType.class, ObjectType.DATAVERSE);
setActiveTab(objectType);
setIntent( JH.enumValue(getIntentParam(), Intent.class, Intent.LIST));

if ( viewRoleId != null ) {
// enter view mode
setRole( rolesService.find(viewRoleId) );
if ( role == null ) {
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(FacesMessage.SEVERITY_WARN,
"Can't find role with id '" + viewRoleId + "'",
"The role might have existed once, but was deleted"));
mode = PageMode.LIST;
} else {
mode = "edit".equals(getIntent()) ? PageMode.EDIT : PageMode.VIEW;
dataversePage.setDataverse( role.getOwner() );
}
} else {
mode = PageMode.LIST;
if ( getRole() == null ) {
JH.addMessage(FacesMessage.SEVERITY_WARN, "Can't find role with id '" + viewRoleId + "'",
"The role might have existed once, but was deleted");
setIntent( Intent.LIST );
}
}
}

Expand All @@ -72,24 +78,24 @@ public List<Permission> getPermissions() {
return Arrays.asList(Permission.values());
}

public boolean hasRoles() {
public boolean isHasRoles() {
return ! getRoles().isEmpty();
}

public void createNewRole( ActionEvent e ) {
mode = PageMode.EDIT;
setIntent(Intent.EDIT);
DataverseRole aRole = new DataverseRole();
aRole.setName("Untitled Role");
aRole.setAlias("untitled-role");
setRole( aRole );
setActiveTab(ObjectType.ROLES);
logger.info("Create new role");
}

public void cancelEdit( ActionEvent e ) {
mode = PageMode.LIST;
intent = Intent.LIST;
}

public void saveDataverse( ActionEvent e ) {

// TODO do
}

public void saveRole( ActionEvent e ) {
Expand All @@ -102,7 +108,7 @@ public void saveRole( ActionEvent e ) {

FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(FacesMessage.SEVERITY_INFO, "Role '" + role.getName() + "' saved", ""));
mode = PageMode.LIST;
intent = Intent.LIST;
}

public List<Permission> getRolePermissions() {
Expand All @@ -117,12 +123,12 @@ public void setSelectedPermissions(List<String> selectedPermissions) {
this.selectedPermissions = selectedPermissions;
}

public PageMode getMode() {
return mode;
public Intent getIntent() {
return intent;
}

public void setMode(PageMode mode) {
this.mode = mode;
public void setIntent(Intent anIntent) {
this.intent = anIntent;
}

public DataverseRole getRole() {
Expand All @@ -138,7 +144,7 @@ public void setRole(DataverseRole role) {
}
}
}

public Long getViewRoleId() {
return viewRoleId;
}
Expand All @@ -147,12 +153,12 @@ public void setViewRoleId(Long viewRoleId) {
this.viewRoleId = viewRoleId;
}

public String getIntent() {
return intent;
public String getIntentParam() {
return intentParam;
}

public void setIntent(String intent) {
this.intent = intent;
public void setIntentParam(String intentParam) {
this.intentParam = intentParam;
}

public DataverseRole getDefaultUserRole() {
Expand All @@ -170,5 +176,24 @@ public boolean isPermissionRoot() {
public void setPermissionRoot(boolean permissionRoot) {
this.permissionRoot = permissionRoot;
}


public int getActiveTabIndex() {
return activeTabIndex;
}

public void setActiveTabIndex(int activeTabIndex) {
this.activeTabIndex = activeTabIndex;
}

public String getObjectTypeParam() {
return objectTypeParam;
}

public void setObjectTypeParam(String objectTypeParam) {
this.objectTypeParam = objectTypeParam;
}

public void setActiveTab( ObjectType t ) {
setActiveTabIndex( (t!=null) ? t.ordinal() : 0 );
}
}
18 changes: 11 additions & 7 deletions src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,14 @@ public boolean canIssue( Class<? extends Command> cmd ) {
return isUserAllowedOn(user, cmd, subject);
}

/**
* "Fast and loose" query mechanism, allowing to pass the command class name.
* Command is assumed to live in {@code edu.harvard.iq.dataverse.engine.command.impl.}
* @param commandName
* @return {@code true} iff the user has the permissions required by the command on the
* object.
* @throws ClassNotFoundException
*/
public boolean canIssueCommand( String commandName ) throws ClassNotFoundException {
return isUserAllowedOn(user,
(Class<? extends Command>)Class.forName("edu.harvard.iq.dataverse.engine.command.impl." + commandName), subject);
Expand All @@ -79,26 +87,22 @@ public boolean has( String pName ) {

public Set<Permission> permissionsFor( DataverseUser u, DvObject d ) {
Set<Permission> retVal;
logger.info( "u=" + u.getUserName() + " d=" + d );
if ( perObjectPermissions.containsKey(u.getUserName()) ) {
logger.info( "Per object permissions" );
Map<Long,Set<Permission>> permissions = perObjectPermissions.get(u.getUserName());
retVal = permissions.containsKey(d.getId()) ? permissions.get(d.getId())
: EnumSet.noneOf(Permission.class);

} else {
logger.info( "Sample" );
retVal = samplePermissions.containsKey(u.getUserName())
? samplePermissions.get(u.getUserName())
: EnumSet.noneOf(Permission.class);
}

// Special case for root
if ( d.getOwner() == null && !(u.getUserName().equals("GabbiGuest")) ) {
logger.info( "Root special case" );
retVal.add( Permission.UndoableEdit );
}

return retVal;
}

Expand All @@ -113,12 +117,12 @@ public Set<Permission> permissionsFor( DataverseUser u, DvObject d ) {
public boolean isUserAllowedOn( DataverseUser u, Class<? extends Command> commandClass, Dataverse d ) {
Map<String, Set<Permission>> required = CH.permissionsRequired(commandClass);
if ( required.isEmpty() || required.get("")==null ) {
logger.info("IsUserAllowedOn: empty-true");
return true;
} else {
Set<Permission> grantedUserPermissions = permissionsFor(u, d);
Set<Permission> neededPermissions = required.get("");

return grantedUserPermissions.containsAll(neededPermissions);
Set<Permission> requiredPermissionSet = required.get("");
return grantedUserPermissions.containsAll(requiredPermissionSet);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

import static edu.harvard.iq.dataverse.util.JsfHelper.JH;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.UUID;
import javax.ejb.EJBException;
import javax.persistence.EntityManager;
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/edu/harvard/iq/dataverse/util/JsfHelper.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package edu.harvard.iq.dataverse.util;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

Expand All @@ -8,6 +10,7 @@
* @author michael
*/
public class JsfHelper {
private static final Logger logger = Logger.getLogger(JsfHelper.class.getName());

public static final JsfHelper JH = new JsfHelper();

Expand All @@ -18,4 +21,14 @@ public void addMessage( FacesMessage.Severity s, String summary ) {
addMessage(s, summary, "");
}

public <T extends Enum<T>> T enumValue( String param, Class<T> enmClass, T defaultValue ) {
if ( param == null ) return defaultValue;
param = param.trim();
try {
return Enum.valueOf(enmClass, param);
} catch ( IllegalArgumentException iar ) {
logger.log(Level.WARNING, "Illegal value for enum {0}: ''{1}''", new Object[]{enmClass.getName(), param});
return defaultValue;
}
}
}
2 changes: 1 addition & 1 deletion src/main/webapp/WEB-INF/glassfish-web.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@
<description>Keep a copy of the generated servlet class' java code.</description>
</property>
</jsp-config>
<property name="alternatedocroot_1" value="from=/dataexplore/* dir=/usr/local/glassfish4/glassfish/domains/domain1/docroot"/>
<property name="alternatedocroot_1" value="from=/dataexplore/* dir=/Applications/NetBeans/glassfish4/glassfish/domains/domain1/docroot"/>
</glassfish-web-app>
3 changes: 2 additions & 1 deletion src/main/webapp/dataverse.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,9 @@
<ui:fragment rendered="#{!empty dataverseSession.user and !DataversePage.editMode}">
<p:menuButton id="editDataverse" value="Edit Dataverse" iconPos="right">
<p:menuitem id="editInfo" value="Edit Info" actionListener="#{DataversePage.edit}" update="@all"/>
<p:menuitem id="manageRoles" value="Manage Roles" outcome="manage-roles">
<p:menuitem id="manageRoles" value="Roles and Permissions" outcome="manage-roles">
<f:param name="dataverseId" value="#{DataversePage.dataverse.id}" />
<f:param name="objectType" value="DATAVERSE" />
</p:menuitem>
<p:menuitem value="Edit Theme" disabled="true"/>
<p:menuitem value="Edit Permissions" disabled="true"/>
Expand Down
2 changes: 2 additions & 0 deletions src/main/webapp/dataverse_template.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
<meta http-equiv="Content-Language" content="en"/>

<link type="text/css" rel="stylesheet" href="/resources/css/structure.css"/>
<h:outputStylesheet library="css" name="componentStyles.css" />

</h:head>

<h:body>
Expand Down
Loading

0 comments on commit 9e3d91d

Please sign in to comment.