/* * Created on Oct 19, 2004 */ package org.openedit.users; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.facet.taxonomy.TaxonomyWriter; import org.apache.lucene.index.IndexWriter; import org.openedit.Data; import org.openedit.data.PropertyDetails; import org.openedit.data.PropertyDetailsArchive; import org.openedit.data.lucene.BaseLuceneSearcher; import com.openedit.OpenEditException; import com.openedit.WebPageRequest; import com.openedit.hittracker.HitTracker; import com.openedit.hittracker.SearchQuery; import com.openedit.users.BaseUser; import com.openedit.users.Group; import com.openedit.users.User; import com.openedit.users.UserManager; /** * */ public class LuceneUserSearcher extends BaseLuceneSearcher implements UserSearcher { private static final Log log = LogFactory.getLog(LuceneUserSearcher.class); protected UserManager fieldUserManager; public HitTracker getAllHits(WebPageRequest inReq) { SearchQuery query = createSearchQuery(); query.addMatches("enabled", "true"); query.addMatches("enabled", "false"); query.addSortBy("namesorted"); query.setAndTogether(false); if( inReq == null) { return search(query); } else { return cachedSearch(inReq,query); } //return new ListHitTracker().setList(getCustomerArchive().) } public UserManager getUserManager() { return fieldUserManager; } public void setUserManager(UserManager inUserManager) { fieldUserManager = inUserManager; } public void reIndexAll(IndexWriter writer, TaxonomyWriter inWriter) throws OpenEditException { log.info("Reindex of customer users directory"); try { //writer.setMergeFactor(50); getUserManager().flush(); PropertyDetails details = getPropertyDetailsArchive().getPropertyDetails(getSearchType()); Collection usernames = getUserManager().listUserNames(); if( usernames != null) { for (Iterator iterator = usernames.iterator(); iterator.hasNext();) { String userid = (String) iterator.next(); Document doc = new Document(); User data = getUserManager().getUser(userid); if( data != null) { updateIndex( data, doc, details); writer.addDocument(doc); } } } //writer.optimize(); } catch (Exception e) { // TODO Auto-generated catch block throw new OpenEditException(e); } } protected void updateIndex(Data inData, Document doc, PropertyDetails inDetails) { User user = (User)inData; doc.add(new Field("enabled", Boolean.toString(user.isEnabled()), Field.Store.YES, Field.Index.ANALYZED)); StringBuffer groups = new StringBuffer(); for (Iterator iterator = user.getGroups().iterator(); iterator.hasNext();) { Group group = (Group) iterator.next(); groups.append(group.getId()); if( iterator.hasNext() ) { groups.append(" | "); } } if( groups.length() > 0) { doc.add(new Field("groups", groups.toString(), Field.Store.NO, Field.Index.ANALYZED)); } super.updateIndex(inData, doc, inDetails); } public void saveData(Data inData, User inUser) { if( inData instanceof User) { getUserManager().saveUser( (User)inData ); } updateIndex((User) inData); } //TODO: Replace with search? public Object searchById(String inId) { return getUserManager().getUser(inId); } /* (non-Javadoc) * @see org.openedit.users.UserSearcherI#getUser(java.lang.String) */ public User getUser(String inAccount) { User user = (User)searchById(inAccount); return user; } /** * @deprecate use standard field search API */ public User getUserByEmail(String inEmail) { return getUserManager().getUserByEmail(inEmail); } public HitTracker getUsersInGroup(Group inGroup) { SearchQuery query = createSearchQuery(); if( inGroup == null) { throw new OpenEditException("No group found"); } query.addMatches("groups",inGroup.getId()); query.setSortBy("namesorted"); HitTracker tracker = search(query); return tracker; } public void saveUsers(List userstosave, User inUser) { for (Iterator iterator = userstosave.iterator(); iterator.hasNext();) { User user = (User) iterator.next(); saveData(user, inUser); } } public void setCatalogId(String inCatalogId) { //This can be removed in the future once we track down a singleton bug if( inCatalogId != null && !inCatalogId.equals("system")) { OpenEditException ex = new OpenEditException("Invalid catalogid catalogid=" + inCatalogId ); ex.printStackTrace(); log.error( ex); //throw ex; } super.setCatalogId("system"); if(fieldPropertyDetailsArchive != null){ fieldPropertyDetailsArchive.setCatalogId("system"); } } public PropertyDetailsArchive getPropertyDetailsArchive() { if (fieldPropertyDetailsArchive == null) { fieldPropertyDetailsArchive = (PropertyDetailsArchive) getSearcherManager().getModuleManager().getBean("system", "propertyDetailsArchive"); } fieldPropertyDetailsArchive.setCatalogId("system"); return fieldPropertyDetailsArchive; } @Override public Data createNewData() { //return getUserManager().createUser(null, null); return new BaseUser(); } @Override public void deleteData(Data inData) { getUserManager().deleteUser((User)inData); } }