/*
* � Copyright IBM Corp. 2010
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.ibm.xsp.extlib.beans;
import java.util.Set;
import java.util.Vector;
import javax.faces.context.FacesContext;
import lotus.domino.ACL;
import lotus.domino.NotesException;
import lotus.domino.Session;
import com.ibm.commons.Platform;
import com.ibm.commons.util.StringUtil;
import com.ibm.domino.xsp.module.nsf.platform.AbstractNotesDominoPlatform;
import com.ibm.xsp.FacesExceptionEx;
import com.ibm.xsp.extlib.social.impl.AbstractPeopleDataProvider;
import com.ibm.xsp.extlib.social.impl.PersonImpl;
import com.ibm.xsp.extlib.util.ExtLibUtil;
/**
* Domino related user bean data provider.
* <p>
* The data provided by this class are relative to the curent database.
* </p>
* @author Philippe Riand
* @author Tony McGuckin, IBM
*/
public class DominoDBUserBeanDataProvider extends AbstractPeopleDataProvider {
public static final String FIELD_DBACL_CREATE_DOCS = "canCreateDocs"; // $NON-NLS-1$
public static final String FIELD_DBACL_DELETE_DOCS = "canDeleteDocs"; // $NON-NLS-1$
public static final String FIELD_DBACL_CREATE_PRIV_AGENTS = "canCreatePrivAgents"; // $NON-NLS-1$
public static final String FIELD_DBACL_CREATE_PRIV_FOLDERS_VIEWS = "canCreatePrivFoldersViews"; // $NON-NLS-1$
public static final String FIELD_DBACL_CREATE_SHARED_FOLDERS_VIEWS = "canCreateSharedFoldersViews"; // $NON-NLS-1$
public static final String FIELD_DBACL_CREATE_SCRIPT_AGENTS = "canCreateScriptAgents"; // $NON-NLS-1$
public static final String FIELD_DBACL_READ_PUBLIC_DOCS = "canReadPublicDocs"; // $NON-NLS-1$
public static final String FIELD_DBACL_WRITE_PUBLIC_DOCS = "canWritePublicDocs"; // $NON-NLS-1$
public static final String FIELD_DBACL_REPLICATE_COPY_DOCS = "canReplicateCopyDocs"; // $NON-NLS-1$
public static final String FIELD_DBACL_ACCESS_LEVEL = "accessLevel"; // $NON-NLS-1$
public static final String FIELD_DBACL_ACCESS_LEVEL_AS_STRING = "accessLevelAsString"; // $NON-NLS-1$
public static final String FIELD_DBACL_ACCESS_ROLES = "accessRoles"; // $NON-NLS-1$
private static final long serialVersionUID = 1L;
// Internal class that stores the user related data
public static class PeopleData extends PersonImpl.Properties {
private static final long serialVersionUID = 1L;
int DBACL_CREATE_DOCS;
int DBACL_DELETE_DOCS;
int DBACL_CREATE_PRIV_AGENTS;
int DBACL_CREATE_PRIV_FOLDERS_VIEWS;
int DBACL_CREATE_SHARED_FOLDERS_VIEWS;
int DBACL_CREATE_SCRIPT_AGENTS;
int DBACL_READ_PUBLIC_DOCS;
int DBACL_WRITE_PUBLIC_DOCS;
int DBACL_REPLICATE_COPY_DOCS;
int DBACL_ACCESS_LEVEL;
String DBACL_ACCESS_LEVEL_AS_STRING;
Vector<String> DBACL_ACCESS_ROLES;
}
private static PeopleData EMPTY_DATA = new PeopleData();
public static final String PROP_SIZE = "extlib.social.people.dominodb.cachesize"; // $NON-NLS-1$
public static final String PROP_SCOPE = "extlib.social.people.dominodb.scope"; // $NON-NLS-1$
public DominoDBUserBeanDataProvider() {
}
@Override
protected String getDefaultCacheScope() {
return "application"; // $NON-NLS-1$
}
@Override
protected int getDefaultCacheSize() {
return 100;
}
@Override
public boolean isDefaultProvider() {
// If running on Notes/Domino, then we become a default provider
if(Platform.getInstance() instanceof AbstractNotesDominoPlatform) {
return true;
}
return super.isDefaultProvider();
}
@Override
public String getName() {
return "DominoDB"; // $NON-NLS-1$
}
@Override
public void enumerateProperties(Set<String> propNames) {
propNames.add(FIELD_DBACL_CREATE_DOCS);
propNames.add(FIELD_DBACL_DELETE_DOCS);
propNames.add(FIELD_DBACL_CREATE_PRIV_AGENTS);
propNames.add(FIELD_DBACL_CREATE_PRIV_FOLDERS_VIEWS);
propNames.add(FIELD_DBACL_CREATE_SHARED_FOLDERS_VIEWS);
propNames.add(FIELD_DBACL_CREATE_SCRIPT_AGENTS);
propNames.add(FIELD_DBACL_READ_PUBLIC_DOCS);
propNames.add(FIELD_DBACL_WRITE_PUBLIC_DOCS);
propNames.add(FIELD_DBACL_REPLICATE_COPY_DOCS);
propNames.add(FIELD_DBACL_ACCESS_LEVEL);
propNames.add(FIELD_DBACL_ACCESS_LEVEL_AS_STRING);
propNames.add(FIELD_DBACL_ACCESS_ROLES);
}
@Override
public int getWeight() {
return WEIGHT_LOW+1;
}
@Override
public Object getValue(PersonImpl person, Object key) {
if(key.equals(FIELD_DBACL_CREATE_DOCS)){
return (getPeopleData(person).DBACL_CREATE_DOCS > 0) ? Boolean.TRUE : Boolean.FALSE;
}
if(key.equals(FIELD_DBACL_DELETE_DOCS)){
return (getPeopleData(person).DBACL_DELETE_DOCS > 0) ? Boolean.TRUE : Boolean.FALSE;
}
if(key.equals(FIELD_DBACL_CREATE_PRIV_AGENTS)){
return (getPeopleData(person).DBACL_CREATE_PRIV_AGENTS > 0) ? Boolean.TRUE : Boolean.FALSE;
}
if(key.equals(FIELD_DBACL_CREATE_PRIV_FOLDERS_VIEWS)){
return (getPeopleData(person).DBACL_CREATE_PRIV_FOLDERS_VIEWS > 0) ? Boolean.TRUE : Boolean.FALSE;
}
if(key.equals(FIELD_DBACL_CREATE_SHARED_FOLDERS_VIEWS)){
return (getPeopleData(person).DBACL_CREATE_SHARED_FOLDERS_VIEWS > 0) ? Boolean.TRUE : Boolean.FALSE;
}
if(key.equals(FIELD_DBACL_CREATE_SCRIPT_AGENTS)){
return (getPeopleData(person).DBACL_CREATE_SCRIPT_AGENTS > 0) ? Boolean.TRUE : Boolean.FALSE;
}
if(key.equals(FIELD_DBACL_READ_PUBLIC_DOCS)){
return (getPeopleData(person).DBACL_READ_PUBLIC_DOCS > 0) ? Boolean.TRUE : Boolean.FALSE;
}
if(key.equals(FIELD_DBACL_WRITE_PUBLIC_DOCS)){
return (getPeopleData(person).DBACL_WRITE_PUBLIC_DOCS > 0) ? Boolean.TRUE : Boolean.FALSE;
}
if(key.equals(FIELD_DBACL_REPLICATE_COPY_DOCS)){
return (getPeopleData(person).DBACL_REPLICATE_COPY_DOCS > 0) ? Boolean.TRUE : Boolean.FALSE;
}
if(key.equals(FIELD_DBACL_ACCESS_LEVEL)){
switch(getPeopleData(person).DBACL_ACCESS_LEVEL){
case(ACL.LEVEL_NOACCESS) : {
return new Integer(ACL.LEVEL_NOACCESS);
}
case(ACL.LEVEL_DEPOSITOR) : {
return new Integer(ACL.LEVEL_DEPOSITOR);
}
case(ACL.LEVEL_READER) : {
return new Integer(ACL.LEVEL_READER);
}
case(ACL.LEVEL_AUTHOR) : {
return new Integer(ACL.LEVEL_AUTHOR);
}
case(ACL.LEVEL_EDITOR) : {
return new Integer(ACL.LEVEL_EDITOR);
}
case(ACL.LEVEL_DESIGNER) : {
return new Integer(ACL.LEVEL_DESIGNER);
}
case(ACL.LEVEL_MANAGER) : {
return new Integer(ACL.LEVEL_MANAGER);
}
default : {
return new Integer(ACL.LEVEL_NOACCESS);
}
}
}
if(key.equals(FIELD_DBACL_ACCESS_LEVEL_AS_STRING)){
switch(getPeopleData(person).DBACL_ACCESS_LEVEL){
case(ACL.LEVEL_NOACCESS) : {
return "NOACCESS"; // $NON-NLS-1$
}
case(ACL.LEVEL_DEPOSITOR) : {
return "DEPOSITOR"; // $NON-NLS-1$
}
case(ACL.LEVEL_READER) : {
return "READER"; // $NON-NLS-1$
}
case(ACL.LEVEL_AUTHOR) : {
return "AUTHOR"; // $NON-NLS-1$
}
case(ACL.LEVEL_EDITOR) : {
return "EDITOR"; // $NON-NLS-1$
}
case(ACL.LEVEL_DESIGNER) : {
return "DESIGNER"; // $NON-NLS-1$
}
case(ACL.LEVEL_MANAGER) : {
return "MANAGER"; // $NON-NLS-1$
}
default : {
return "NOACCESS"; // $NON-NLS-1$
}
}
}
if(key.equals(FIELD_DBACL_ACCESS_ROLES)){
Vector<String> rolesVector = getPeopleData(person).DBACL_ACCESS_ROLES;
int i = rolesVector.size();
String[] rolesArray = new String[i];
return rolesVector.toArray(rolesArray);
}
return null;
}
@Override
public Class<?> getType(PersonImpl person, Object key) {
return null;
}
@Override
public void readValues(PersonImpl[] persons) {
for(int i=0; i<persons.length; i++) {
getPeopleData(persons[i]);
}
}
@SuppressWarnings("unchecked") // $NON-NLS-1$
private PeopleData getPeopleData(PersonImpl person) {
String id = person.getId();
if(StringUtil.isEmpty(id)) {
return EMPTY_DATA;
}
PeopleData data = (PeopleData)getProperties(id,PeopleData.class);
if(data==null) {
synchronized(getSyncObject()) {
data = (PeopleData)getProperties(id,PeopleData.class);
if(data==null) {
try {
data = new PeopleData();
Session session = ExtLibUtil.getCurrentSession(FacesContext.getCurrentInstance());
lotus.domino.Database database = session.getCurrentDatabase();
// TODO get a Notes/Domino id from an identity provider...
String effectiveUserName = session.getEffectiveUserName();
data.DBACL_CREATE_DOCS = database.queryAccessPrivileges(effectiveUserName) & lotus.domino.Database.DBACL_CREATE_DOCS;
data.DBACL_DELETE_DOCS = database.queryAccessPrivileges(effectiveUserName) & lotus.domino.Database.DBACL_DELETE_DOCS;
data.DBACL_CREATE_PRIV_AGENTS = database.queryAccessPrivileges(effectiveUserName) & lotus.domino.Database.DBACL_CREATE_PRIV_AGENTS;
data.DBACL_CREATE_PRIV_FOLDERS_VIEWS = database.queryAccessPrivileges(effectiveUserName) & lotus.domino.Database.DBACL_CREATE_PRIV_FOLDERS_VIEWS;
data.DBACL_CREATE_SHARED_FOLDERS_VIEWS = database.queryAccessPrivileges(effectiveUserName) & lotus.domino.Database.DBACL_CREATE_SHARED_FOLDERS_VIEWS;
data.DBACL_CREATE_SCRIPT_AGENTS = database.queryAccessPrivileges(effectiveUserName) & lotus.domino.Database.DBACL_CREATE_SCRIPT_AGENTS;
data.DBACL_READ_PUBLIC_DOCS = database.queryAccessPrivileges(effectiveUserName) & lotus.domino.Database.DBACL_READ_PUBLIC_DOCS;
data.DBACL_WRITE_PUBLIC_DOCS = database.queryAccessPrivileges(effectiveUserName) & lotus.domino.Database.DBACL_WRITE_PUBLIC_DOCS;
data.DBACL_REPLICATE_COPY_DOCS = database.queryAccessPrivileges(effectiveUserName) & lotus.domino.Database.DBACL_REPLICATE_COPY_DOCS;
data.DBACL_ACCESS_LEVEL = database.queryAccess(effectiveUserName);
data.DBACL_ACCESS_ROLES = database.queryAccessRoles(effectiveUserName);
addProperties(id,data);
} catch(NotesException ex) {
throw new FacesExceptionEx(ex,"Error while retrieving user names"); // $NLX-DominoDBUserBeanDataProvider.Errorwhileretrievingusernames-1$
}
}
}
}
return data;
}
}