/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/user/trunk/user-tool-admin-prefs/admin-prefs/src/java/org/sakaiproject/user/tool/AdminPrefsTool.java $
* $Id: AdminPrefsTool.java 105080 2012-02-24 23:10:31Z ottenhoff@longsight.com $
***********************************************************************************
*
* Copyright (c) 2005, 2006, 2008 The Sakai Foundation
*
* Licensed under the Educational Community 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.opensource.org/licenses/ECL-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 org.sakaiproject.user.tool;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.entity.api.ResourceProperties;
import org.sakaiproject.entity.api.ResourcePropertiesEdit;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.tool.api.SessionManager;
import org.sakaiproject.user.api.PreferencesEdit;
import org.sakaiproject.user.api.PreferencesService;
/**
* <p>
* AdminPrefsTool is a Sakai Admin tool to view and edit anyone's preferences.
* </p>
*/
public class AdminPrefsTool
{
/**
* Represents a name value pair in a keyed preferences set.
*/
public class KeyNameValue
{
/** Is this value a list?. */
protected boolean m_isList = false;
/** The key. */
protected String m_key = null;
/** The name. */
protected String m_name = null;
/** The original is this value a list?. */
protected boolean m_origIsList = false;
/** The original key. */
protected String m_origKey = null;
/** The original name. */
protected String m_origName = null;
/** The original value. */
protected String m_origValue = null;
/** The value. */
protected String m_value = null;
public KeyNameValue(String key, String name, String value, boolean isList)
{
m_key = key;
m_origKey = key;
m_name = name;
m_origName = name;
m_value = value;
m_origValue = value;
m_isList = isList;
m_origIsList = isList;
}
public String getKey()
{
return m_key;
}
public String getName()
{
return m_name;
}
public String getOrigKey()
{
return m_origKey;
}
public String getOrigName()
{
return m_origName;
}
public String getOrigValue()
{
return m_origValue;
}
public String getValue()
{
return m_value;
}
public boolean isChanged()
{
return ((!m_name.equals(m_origName)) || (!m_value.equals(m_origValue)) || (!m_key.equals(m_origKey)) || (m_isList != m_origIsList));
}
public boolean isList()
{
return m_isList;
}
public boolean origIsList()
{
return m_origIsList;
}
public void setKey(String value)
{
if (!m_key.equals(value))
{
m_key = value;
}
}
public void setList(boolean b)
{
m_isList = b;
}
public void setName(String value)
{
if (!m_name.equals(value))
{
m_name = value;
}
}
public void setValue(String value)
{
if (!m_value.equals(value))
{
m_value = value;
}
}
}
/** Our log (commons). */
private static Log M_log = LogFactory.getLog(AdminPrefsTool.class);
/** The PreferencesEdit being worked on. */
protected PreferencesEdit m_edit = null;
/** Preferences service (injected dependency) */
protected PreferencesService m_preferencesService = null;
/** Session manager (injected dependency) */
protected SessionManager m_sessionManager = null;
/** The PreferencesEdit in KeyNameValue collection form. */
protected Collection m_stuff = null;
/** The user id (from the end user) to edit. */
protected String m_userId = null;
/**
* no-arg constructor.
*/
public AdminPrefsTool()
{
M_log.info("constructed");
}
/**
* Cancel the edit and cleanup.
*/
protected void cancelEdit()
{
// cancel
m_preferencesService.cancel(m_edit);
// cleanup
m_stuff = null;
m_edit = null;
}
/**
* Access the prefs being edited, in KeyNameValue collection form.
*
* @return a collection of name,value options for the current configuration.
*/
public Collection getPreferences()
{
// make sure we have this setup
setupEdit();
return m_stuff;
}
/**
* Access the user id of the preferences being edited.
*
* @return The user id of the preferences being edited.
*/
public String getUserId()
{
return m_userId;
}
/**
* Process the add command from the edit view.
*
* @return navigation outcome:
*/
public String processActionAdd()
{
if (M_log.isDebugEnabled()) M_log.debug("save");
// save
m_stuff.add(new KeyNameValue("", "", "", false));
return null;
}
/**
* Process the cancel command from the edit view.
*
* @return navigation outcome:
*/
public String processActionCancel()
{
if (M_log.isDebugEnabled()) M_log.debug("cancel");
// cancel
cancelEdit();
return "list";
}
/**
* Process the edit command.
*
* @return navigation outcome:
*/
public String processActionEdit()
{
if (M_log.isDebugEnabled()) M_log.debug("processActionEdit");
if (getUserId() == null)
{
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Please enter a user id."));
return null;
}
try
{
m_edit = m_preferencesService.edit(getUserId());
return "edit";
}
catch (IdUnusedException e)
{
try
{
m_edit = m_preferencesService.add(getUserId());
return "edit";
}
catch (Exception ee)
{
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(ee.toString()));
return null;
}
}
catch (Exception e)
{
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(e.toString()));
return null;
}
}
/**
* Process the save command from the edit view.
*
* @return navigation outcome:
*/
public String processActionSave()
{
if (M_log.isDebugEnabled()) M_log.debug("save");
// save
saveEdit();
return "list";
}
/**
* Save any changed values from the edit and cleanup.
*/
protected void saveEdit()
{
// move the stuff from m_stuff into the edit
for (Iterator i = m_stuff.iterator(); i.hasNext();)
{
KeyNameValue knv = (KeyNameValue) i.next();
if (knv.isChanged())
{
// find the original to remove (unless this one was new)
if (!knv.getOrigKey().equals(""))
{
ResourcePropertiesEdit props = m_edit.getPropertiesEdit(knv.getOrigKey());
props.removeProperty(knv.getOrigName());
}
// add the new if we have a key and name and value
if ((!knv.getKey().equals("")) && (!knv.getName().equals("")) && (!knv.getValue().equals("")))
{
ResourcePropertiesEdit props = m_edit.getPropertiesEdit(knv.getKey());
if (knv.isList())
{
// split by ", "
String[] parts = knv.getValue().split(", ");
for (int p = 0; p < parts.length; p++)
{
props.addPropertyToList(knv.getName(), parts[p]);
}
}
else
{
props.addProperty(knv.getName(), knv.getValue());
}
}
}
}
// save the preferences, release the edit
m_preferencesService.commit(m_edit);
m_stuff = null;
m_edit = null;
}
/**
* Set the preferences service.
*
* @param mgr
* The preferences service.
*/
public void setPreferencesService(PreferencesService mgr)
{
m_preferencesService = mgr;
}
/**
* Set the session manager.
*
* @param mgr
* The session manager.
*/
public void setSessionManager(SessionManager mgr)
{
m_sessionManager = mgr;
}
/**
* If we have not yet setup our m_stuff edit buffer, do so.
*/
protected void setupEdit()
{
if (m_stuff != null) return;
Vector rv = new Vector();
if (m_edit != null)
{
Collection keys = m_edit.getKeys();
for (Iterator i = keys.iterator(); i.hasNext();)
{
String key = (String) i.next();
ResourceProperties props = m_edit.getProperties(key);
for (Iterator names = props.getPropertyNames(); names.hasNext();)
{
String name = (String) names.next();
String value = props.getPropertyFormatted(name);
List values = props.getPropertyList(name);
boolean isList = values.size() > 1;
rv.add(new KeyNameValue(key, name, value, isList));
}
}
}
m_stuff = rv;
}
/**
* Set the user id to edit.
*
* @param id
* The user id to edit.
*/
public void setUserId(String id)
{
m_userId = id;
}
}