/*
* � Copyright IBM Corp. 2013
*
* 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.domino.commons.model;
import java.util.Vector;
import lotus.domino.AdministrationProcess;
import lotus.domino.Database;
import lotus.domino.Document;
import lotus.domino.Name;
import lotus.domino.NotesException;
import lotus.domino.Session;
import com.ibm.domino.commons.util.BackendUtil;
/**
* The 9.0.1 implementation of IDelegateProvider.
*
* <p>This extends <code>DelegateProvider</code> which is available in the extlib
* on OpenNTF. While <code>DelegateProvider</code> edits the ACL directly, this
* extension uses adminp to add, modify and remove delegates. It depends on
* new adminp support added to the backend classes in 9.0.1.
*/
public class Delegate901Provider extends DelegateProvider {
private static final String OWNER_ITEM = "owner"; // $NON-NLS-1$
private static final String READ_CALENDAR_ITEM = "ReadCalendar"; // $NON-NLS-1$
private static final String WRITE_CALENDAR_ITEM = "WriteCalendar"; // $NON-NLS-1$
private static final String READ_MAIL_ITEM = "ReadMail"; // $NON-NLS-1$
private static final String WRITE_MAIL_ITEM = "WriteMail"; // $NON-NLS-1$
private static final String EDIT_MAIL_ITEM = "EditMail"; // $NON-NLS-1$
private static final String DELETE_MAIL_ITEM = "DeleteMail"; // $NON-NLS-1$
private static final int READ_CALENDAR = 0;
private static final int WRITE_CALENDAR = 1;
private static final int READ_MAIL = 2;
private static final int WRITE_MAIL = 3;
private static final int EDIT_MAIL = 4;
private static final int DELETE_MAIL = 5;
private static final String s_items[] = {READ_CALENDAR_ITEM, WRITE_CALENDAR_ITEM, READ_MAIL_ITEM,
WRITE_MAIL_ITEM, EDIT_MAIL_ITEM, DELETE_MAIL_ITEM};
/* (non-Javadoc)
* @see com.ibm.domino.commons.model.DelegateProvider#setImpl(lotus.domino.Database, com.ibm.domino.commons.model.Delegate)
*/
protected void setImpl(Database database, Delegate delegate, Document profile) throws ModelException, NotesException {
AdministrationProcess adminp = null;
try {
Session session = database.getParent();
// Can't modify the owner's access
String owner = profile.getItemValueString(OWNER_ITEM);
verifyDelegateNotOwner(session, delegate.getName(), owner);
// Can't modify a delegate that's not there
Vector[] vectors = loadVectors(profile);
Name name = session.createName(delegate.getName());
if ( !delegateExists(vectors, name.getCanonical()) ) {
throw new ModelException("Delegate not found", ModelException.ERR_NOT_FOUND); // $NON-NLS-1$
}
// Update the right vector(s)
delegateRemove(vectors, name.getCanonical());
delegateAdd(vectors, name.getCanonical(), delegate.getAccess());
// Send the adminp request
String mailFile = database.getFilePath();
String server = session.getServerName();
adminp = session.createAdministrationProcess(null);
String unid = adminp.delegateMailFile(owner,
vectors[0], vectors[1], vectors[2], vectors[3], vectors[4], vectors[5],
null, mailFile, server);
}
finally {
BackendUtil.safeRecycle(adminp);
}
}
/* (non-Javadoc)
* @see com.ibm.domino.commons.model.DelegateProvider#addImpl(lotus.domino.Database, com.ibm.domino.commons.model.Delegate)
*/
protected void addImpl(Database database, Delegate delegate, Document profile) throws ModelException, NotesException {
AdministrationProcess adminp = null;
try {
Session session = database.getParent();
// Can't add the owner as a delegate
String owner = profile.getItemValueString(OWNER_ITEM);
verifyDelegateNotOwner(session, delegate.getName(), owner);
// Can't add someone that's already there
Vector[] vectors = loadVectors(profile);
Name name = session.createName(delegate.getName());
if ( delegateExists(vectors, name.getCanonical()) ) {
throw new ModelException("A delegate of that name already exists", ModelException.ERR_CONFLICT); // $NON-NLS-1$
}
// Add the delegate to the right vector(s)
delegateAdd(vectors, name.getCanonical(), delegate.getAccess());
// Send the adminp request
String mailFile = database.getFilePath();
String server = session.getServerName();
adminp = session.createAdministrationProcess(null);
String unid = adminp.delegateMailFile(owner,
vectors[0], vectors[1], vectors[2], vectors[3], vectors[4], vectors[5],
null, mailFile, server);
}
finally {
BackendUtil.safeRecycle(adminp);
}
}
/* (non-Javadoc)
* @see com.ibm.domino.commons.model.DelegateProvider#deleteImpl(lotus.domino.Database, java.lang.String, java.lang.String)
*/
protected void deleteImpl(Database database, String name, Document profile) throws ModelException, NotesException {
AdministrationProcess adminp = null;
try {
Session session = database.getParent();
// Can't remove the owner
String owner = profile.getItemValueString(OWNER_ITEM);
verifyDelegateNotOwner(session, name, owner);
// Can't remove a delegate that's not there
Vector[] vectors = loadVectors(profile);
Name no = session.createName(name);
if ( !delegateExists(vectors, no.getCanonical()) ) {
throw new ModelException("Delegate not found", ModelException.ERR_NOT_FOUND); // $NON-NLS-1$
}
// Send the adminp request
Vector removeList = new Vector();
removeList.add(no.getCanonical());
String mailFile = database.getFilePath();
String server = session.getServerName();
adminp = session.createAdministrationProcess(null);
String unid = adminp.delegateMailFile(owner,
null, null, null, null, null, null,
removeList, mailFile, server);
}
finally {
BackendUtil.safeRecycle(adminp);
}
}
private void verifyDelegateNotOwner(Session session, String delegate, String canonicalOwner) throws ModelException, NotesException {
Name no = session.createName(canonicalOwner);
if ( delegate.equalsIgnoreCase(no.getAbbreviated()) ) {
throw new ModelException("Owner cannot be a delegate.", ModelException.ERR_NOT_ALLOWED); // $NON-NLS-1$
}
}
private Vector[] loadVectors(Document profile) throws NotesException {
Vector[] vectors = new Vector[s_items.length];
for ( int i = 0; i < s_items.length; i++ ) {
String item = s_items[i];
vectors[i] = profile.getItemValue(item);
}
return vectors;
}
private boolean delegateExists(Vector[] vectors, String canonicalName) {
boolean exists = false;
for ( int i = 0; i < vectors.length; i++ ) {
Vector values = vectors[i];
if ( values != null ) {
for ( int j = 0; j < values.size(); j++) {
String thisName = (String)values.get(j);
if ( thisName.equalsIgnoreCase(canonicalName) ) {
exists = true;
break;
}
}
if ( exists ) break;
}
}
return exists;
}
/**
* Removes a delegate name from the array of vectors corresponding to the calendar profile.
*
* <p>This method just modifies the vectors in memory. It does not update the profile.
*
* @param vectors
* @param canonicalName
*/
private void delegateRemove(Vector[] vectors, String canonicalName) {
for ( int i = 0; i < vectors.length; i++ ) {
Vector values = vectors[i];
if ( values != null ) {
for ( int j = 0; j < values.size(); j++) {
String thisName = (String)values.get(j);
if ( thisName.equalsIgnoreCase(canonicalName) ) {
values.remove(j);
break;
}
}
}
}
}
/**
* Adds a delegate name to a single vector.
*
* @param vectors
* @param i
* @param canonicalName
*/
private void delegateAdd(Vector[] vectors, int i, String canonicalName) {
if ( vectors[i] == null ) {
vectors[i] = new Vector();
}
vectors[i].add(canonicalName);
}
/**
* Adds a delegate name to the array of vectors corresponding to the calendar profile.
*
* <p>This method just modifies the vectors in memory. It does not update the profile.
*
* @param vectors
* @param canonicalName
* @param da
*/
private void delegateAdd(Vector[] vectors, String canonicalName, DelegateAccess da) {
if ( da.getWhat() == DelegateAccess.What.CALENDAR ) {
delegateAdd(vectors, READ_CALENDAR, canonicalName);
if ( da.isCreate() || da.isEdit() || da.isDelete() ) {
delegateAdd(vectors, WRITE_CALENDAR, canonicalName);
}
}
else if ( da.getWhat() == DelegateAccess.What.MAIL ) {
if ( da.isEdit() ) {
delegateAdd(vectors, WRITE_CALENDAR, canonicalName);
delegateAdd(vectors, EDIT_MAIL, canonicalName);
if ( da.isDelete() ) {
delegateAdd(vectors, DELETE_MAIL, canonicalName);
}
}
else if ( da.isCreate() ) {
delegateAdd(vectors, WRITE_CALENDAR, canonicalName);
delegateAdd(vectors, WRITE_MAIL, canonicalName);
if ( da.isDelete() ) {
delegateAdd(vectors, DELETE_MAIL, canonicalName);
}
}
else {
delegateAdd(vectors, READ_MAIL, canonicalName);
}
}
}
}