package org.openedit.profile;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openedit.Data;
import org.openedit.data.BaseData;
import org.openedit.data.PropertyDetail;
import org.openedit.data.SaveableData;
import org.openedit.data.Searcher;
import org.openedit.data.SearcherManager;
import org.openedit.xml.XmlArchive;
import com.openedit.WebPageRequest;
import com.openedit.hittracker.HitTracker;
import com.openedit.hittracker.SearchQuery;
import com.openedit.users.User;
public class UserProfile extends BaseData implements SaveableData
{
protected String fieldCatalogId;
protected SearcherManager fieldSearcherManager;
protected Data fieldSettingsGroup;
// protected Map<String,String> fieldSettingsGroupPermissions;
protected Map fieldResultViews;
protected XmlArchive fieldXmlArchive;
protected HitTracker fieldCatalogs;
protected HitTracker fieldUploadCatalogs;
protected Collection fieldCombinedLibraries;
protected Collection<Data> fieldModules;
public Collection<Data> getModules()
{
return fieldModules;
}
public void setModules(Collection<Data> inModules)
{
fieldModules = inModules;
}
protected User fieldUser;
public User getUser()
{
return fieldUser;
}
public void setUser(User inUser)
{
fieldUser = inUser;
}
private static final Log log = LogFactory.getLog(UserProfile.class);
public UserProfile()
{
if (1 > 32)
{
}
}
public String getCatalogId()
{
return fieldCatalogId;
}
public void setCatalogId(String catalogId)
{
fieldCatalogId = catalogId;
}
public SearcherManager getSearcherManager()
{
return fieldSearcherManager;
}
public void setSearcherManager(SearcherManager searcherManager)
{
fieldSearcherManager = searcherManager;
}
public String getUserId()
{
return getId();
}
public boolean isEnabled(String inPreference)
{
String val = get(inPreference);
return Boolean.parseBoolean(val);
}
// @Override
// public String get(String inId) {
// // TODO Auto-generated method stub
// return getValue(inId);
// }
//
public String get(String inPreference)
{
if (inPreference == null)
{
return null;
}
String val = super.get(inPreference);
if(val == null && inPreference.equals("firstname")){
val = super.get("firstName");
}
if(val == null && inPreference.equals("lastname")){
val = super.get("lastName");
}
//
if (val == null && getSettingsGroup() != null)
{
val = getSettingsGroup().get(inPreference);
}
// if (val == null && getSettingsGroup() != null)
// {
// val = getSettingsGroupPermissions().get(inPreference);
// }
if (val == null && getUser() != null)
{
val = getUser().get(inPreference);
}
return val;
}
public Collection getValues(String inPreference)
{
String val = get(inPreference);
if (val == null || val.trim().length() == 0)
{
return null;
}
String[] vals = val.split("\\s+");
Collection collection = Arrays.asList(vals);
// if null check parent
return collection;
}
public String replaceUserVariable(String inValue)
{
if (inValue == null)
{
return inValue;
}
String value = inValue;
int start = 0;
while ((start = value.indexOf("$[", start)) != -1)
{
int end = value.indexOf("]", start);
if (end != -1)
{
String key = value.substring(start + 2, end);
String variable = get(key); // check for property
if (variable != null)
{
value = value.substring(0, start) + variable + value.substring(end + 1);
if (variable.length() <= end)
{
start = end - variable.length();
}
else
{
start = variable.length();
}
}
else
{
start = end;
}
}
}
if (start > 0 && inValue.equals(value))
{
value = value.replace('[', '{');
value = value.replace(']', ']');
}
return value;
}
public Data getSettingsGroup()
{
if (fieldSettingsGroup == null && getCatalogId() != null)
{
String groupid = super.get("settingsgroup");
if (groupid == null)
{
groupid = "guest";
}
Searcher settingsGroupSearcher = getSearcherManager().getSearcher(getCatalogId(), "settingsgroup");
fieldSettingsGroup = (Data) settingsGroupSearcher.searchById(groupid);
if (fieldSettingsGroup == null && log.isDebugEnabled())
{
log.debug("No settings group defined");
}
// else
// {
// Searcher searcher = getSearcherManager().getSearcher(getCatalogId(),"settingsgrouppermissions");
// SearchQuery q = searcher.createSearchQuery();
// q.
//
// }
}
return fieldSettingsGroup;
}
public void setSettingsGroup(String inSettingsGroupId)
{
setProperty("settingsgroup", inSettingsGroupId);
}
public void save(User inUser)
{
Searcher searcher = getSearcherManager().getSearcher(getCatalogId(), "userprofile");
searcher.saveData(this, inUser);
}
public void setValuesFromDetails(String inKey, Collection<PropertyDetail> inValues)
{
StringBuffer values = new StringBuffer();
if(inValues == null){
return;
}
for (Iterator iterator = inValues.iterator(); iterator.hasNext();)
{
PropertyDetail detail = (PropertyDetail) iterator.next();
values.append(detail.getId());
if (iterator.hasNext())
{
values.append(" ");
}
}
setProperty(inKey, values.toString());
}
public void setValues(String inKey, Collection<String> inValues)
{
StringBuffer values = new StringBuffer();
for (Iterator iterator = inValues.iterator(); iterator.hasNext();)
{
String detail = (String) iterator.next();
values.append(detail);
if (iterator.hasNext())
{
values.append(" ");
}
}
setProperty(inKey, values.toString());
}
public void addValue(String inKey, String string)
{
String current = get(inKey);
if (string != null)
{
string = string.trim();
}
if (current == null || current.length() == 0)
{
setProperty(inKey, string);
}
else
{
setProperty(inKey, current + " " + string);
}
}
public void removeValue(String inKey, String string)
{
Collection collection = getValues(inKey);
if (collection != null)
{
Collection keys = new ArrayList(collection);
keys.remove(string);
setValues(inKey, keys);
}
}
public String toString()
{
return getShortDescription();
}
public String getShortDescription()
{
StringBuffer out = new StringBuffer();
if ( get("firstName") != null)
{
out.append( get("firstName") );
out.append(" ");
}
if ( get("lastName") != null)
{
out.append(get("lastName"));
}
if( out.length() == 0)
{
if( get("email") != null && Character.isDigit(getUserId().charAt(0) ) )
{
out.append( get("email") );
}
else
{
out.append( getUserId());
}
}
return out.toString();
}
/**
* @deprecated Not used any more. Track permissions on an app basis
* @return
*/
public HitTracker getCatalogs()
{
return fieldCatalogs;
}
/**
* @deprecated Not used any more. Track permissions on an app basis
* @return
*/
public void setCatalogs(HitTracker inCatalogs)
{
fieldCatalogs = inCatalogs;
}
public XmlArchive getXmlArchive()
{
return fieldXmlArchive;
}
public void setXmlArchive(XmlArchive inXmlArchive)
{
fieldXmlArchive = inXmlArchive;
}
public Map getResultViews()
{
return fieldResultViews;
}
public void setResultViews(Map inResultViews)
{
fieldResultViews = inResultViews;
}
// should not call this method
// protected String getResultViewPreference(String inView)
// {
// Element id = getUserData().getElementById(inView);
// if(id != null)
// {
// return(id.attributeValue("view"));
//
// }
// return null;
// }
public void setResultViewPreference(String inView, String inPreference)
{
setProperty(inView, inPreference);
}
public int getHitsPerPageForSearchType(String inResultsView) throws Exception
{
String view = inResultsView + "hitsperpage";
String value = get(view);
if (value == null)
{
value = get("modulehitsperpage");
if (value == null)
{
return 15;
}
}
if( "null".equals( value) )
{
return 15;
}
return Integer.parseInt(value);
}
public void setHitsPerPageForSearchType(String inResultsView, int inHits)
{
setProperty(inResultsView + "hitsperpage", String.valueOf(inHits));
}
public void setSortForSearchType(String inResultsView, String inSort)
{
setProperty(inResultsView + "sort", inSort);
}
public String getSortForSearchType(String inResultsType)
{
String value = get(inResultsType + "sort");
return value;
}
public String getViewForResultType(String inCustomView, String inResultsView)
{
if (inCustomView != null)
{
return inCustomView;
}
String view = getViewForResultType(inResultsView);
if (view == null)
{
view = "default";
}
return view;
}
public String getViewForResultType(String inResultsView)
{
String view = get(inResultsView);
return view;
}
/**
* @deprecated Not used any more. Track permissions on an app basis
* @return
*/
public Data getLastCatalog()
{
String catid = get("lastcatalog");
if( getCatalogs() == null )
{
return null;
}
for (Iterator iterator = getCatalogs().iterator(); iterator.hasNext();)
{
Data cat = (Data) iterator.next();
if (catid == null || cat.getId().equals(catid))
{
return cat;
}
}
if (getCatalogs().size() > 0)
{
return (Data) getCatalogs().iterator().next();
}
return null;
}
/**
* @deprecated Not used any more. Track permissions on an app basis
* @return
*/
public HitTracker getUploadCatalogs()
{
return fieldUploadCatalogs;
}
/**
* @deprecated Not used any more. Track permissions on an app basis
* @return
*/
public void setUploadCatalogs(HitTracker inUploadCatalogs)
{
fieldUploadCatalogs = inUploadCatalogs;
}
public Collection<String> getCombinedLibraries()
{
return fieldCombinedLibraries;
}
public HitTracker getSelectedLibraries(WebPageRequest inReq)
{
Searcher librarySearcher = getSearcherManager().getSearcher(getCatalogId(), "library");
HitTracker tracker = librarySearcher.getAllHits();
tracker.setSelections(getCombinedLibraries());
if( inReq.getUser() != null && inReq.getUser().isInGroup("administrators"))
{
tracker.selectAll();
}
//tracker.setShowOnlySelected(true);
return tracker;
}
public void setCombinedLibraries(Collection<String> inCombinedLibraries)
{
fieldCombinedLibraries = inCombinedLibraries;
}
public Data getDefaultViewForModule(String inModuleId)
{
Searcher viewSearcher = getSearcherManager().getSearcher(getCatalogId(), "view");
SearchQuery q = viewSearcher.createSearchQuery();
q.addMatches("module", inModuleId);
q.addMatches("systemdefined", "false");
q.addSortBy("ordering");
HitTracker row = (HitTracker) viewSearcher.search(q);
if (row.size() > 0)
{
if (row != null)
{
return row.get(0);
}
}
return null;
}
@Override
public String getSourcePath()
{
String sourcepath = super.getSourcePath();
if (sourcepath == null)
{
if (getUser() != null)
{
return getUser().getId();
}
if (getUserId() != null)
{
return getUserId();
}
return null;
}
else
{
return sourcepath;
}
}
public void setProperty(String inId, String inValue)
{
if (getUser() != null)
{
if ("firstname".equalsIgnoreCase(inId))
{
getUser().setFirstName(inValue);
}
if ("lastname".equalsIgnoreCase(inId))
{
getUser().setLastName(inValue);
}
if ("email".equalsIgnoreCase(inId))
{
getUser().setEmail(inValue);
}
if ("password".equalsIgnoreCase(inId))
{
getUser().setPassword(inValue);
}
}
if(inId.equals("settingsgroup"))
{
fieldSettingsGroup = null;
}
super.setProperty(inId, inValue);
}
// public Map<String,String> getSettingsGroupPermissions() {
// return fieldSettingsGroupPermissions;
// }
@Override
public String getName()
{
return toString();
}
public String getText(){
return toString();
}
public HitTracker getFacetsForType(String inId)
{
Searcher facetsearcher = getSearcherManager().getSearcher(getCatalogId(), "userfacets");
SearchQuery query = facetsearcher.createSearchQuery();
query.addMatches("userid", getId());
query.addMatches("type", inId);//needed?
HitTracker hits = facetsearcher.search(query);
return hits;
}
}