package org.openedit.entermedia.search;
import java.text.DecimalFormat;
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.openedit.Data;
import org.openedit.data.BaseSearcher;
import org.openedit.data.CompositeData;
import org.openedit.data.PropertyDetailsArchive;
import org.openedit.data.SearcherManager;
import org.openedit.entermedia.Asset;
import org.openedit.entermedia.AssetArchive;
import org.openedit.entermedia.Category;
import org.openedit.entermedia.CategoryArchive;
import org.openedit.entermedia.CompositeAsset;
import org.openedit.entermedia.MediaArchive;
import org.openedit.entermedia.xmldb.CategorySearcher;
import org.openedit.profile.UserProfile;
import com.openedit.ModuleManager;
import com.openedit.OpenEditException;
import com.openedit.OpenEditRuntimeException;
import com.openedit.WebPageRequest;
import com.openedit.hittracker.HitTracker;
import com.openedit.hittracker.SearchQuery;
import com.openedit.page.PageSettings;
import com.openedit.page.manage.PageManager;
import com.openedit.users.Group;
import com.openedit.users.User;
public class BaseAssetSearcher extends BaseSearcher implements AssetSearcher
{
static final Log log = LogFactory.getLog(BaseAssetSearcher.class);
protected static final String CATALOGIDX = "catalogid";
protected static final String CATEGORYID = "categoryid";
protected DataConnector fieldDataConnector;
protected DecimalFormat fieldDecimalFormatter;
protected PageManager fieldPageManager;
private Boolean fieldUsesSearchSecurity;
protected ModuleManager fieldModuleManager;
protected CategorySearcher fieldCategorySearcher;
protected MediaArchive fieldMediaArchive;
public BaseAssetSearcher()
{
setFireEvents(true);
}
public Data createNewData()
{
return getDataConnector().createNewData();
}
/**
* @see org.openedit.entermedia.search.AssetSearcher#fieldSearch(com.openedit.WebPageRequest,
* org.openedit.store.Cart)
*/
public HitTracker searchCategories(WebPageRequest inPageRequest, Category catalog) throws Exception
{
SearchQuery search = createSearchQuery();
if (catalog != null)
{
inPageRequest.putPageValue("catalog", catalog); // @deprecated
inPageRequest.putPageValue("category", catalog); // @deprecated
String actualid = catalog.getId();
if (catalog.getLinkedToCategoryId() != null)
{
actualid = catalog.getLinkedToCategoryId();
}
search.addMatches("category", actualid);
//search.setResultType("category");
HitTracker res = cachedSearch(inPageRequest, search);
return res;
}
return null;
}
public void searchExactCategories(WebPageRequest inPageRequest, Category catalog) throws Exception
{
SearchQuery search = createSearchQuery();
if (catalog != null)
{
inPageRequest.putPageValue("catalog", catalog); // @deprecated
inPageRequest.putPageValue("category", catalog); // @deprecated
// to error
// boolean includechildren = false;
// if (catalog.getParentCatalog() == null) // this is the root level
// {
// includechildren = true; // since assets dont mark themself in the
// // index catalog
// }
String actualid = catalog.getId();
if (catalog.getLinkedToCategoryId() != null)
{
actualid = catalog.getLinkedToCategoryId();
}
search.addMatches("category-exact", actualid);
// Link crumb = buildLink(catalog, inPageRequest.findValue("url-prefix"));
// inPageRequest.putSessionValue("crumb", crumb);
String sortBy = catalog.get("sortfield");
search.setSortBy(sortBy);
cachedSearch(inPageRequest, search);
}
}
public DataConnector getDataConnector()
{
return fieldDataConnector;
}
public void setDataConnector(DataConnector inDataConnector)
{
this.fieldDataConnector = inDataConnector;
}
public synchronized void updateIndex(Data inAssets)
{
getDataConnector().updateIndex(inAssets);
}
public synchronized void updateIndex(List inAssets, boolean inOptimize)
{
getDataConnector().updateIndex(inAssets, inOptimize);
//TODO: Update ids path lookup? mem leak?
// if (asset.getId() != null)
// {
// getAssetPaths().put(asset.getId(), asset.getSourcePath()); // This
// }
}
public void reIndexAll()
{
getDataConnector().reIndexAll();
fieldUsesSearchSecurity = null;
}
private boolean doesIndexSecurely()
{
if (fieldUsesSearchSecurity == null)
{
//PageSettings settings = getPageManager().getPageSettingsManager().getPageSettings("/" + getCatalogId() + "/assets/");
PageSettings settings = getPageManager().getPageSettingsManager().getPageSettings("/" + getCatalogId());
String val = settings.getPropertyValue("usessearchsecurity", null);
if (val != null && Boolean.valueOf(val).booleanValue())
{
fieldUsesSearchSecurity = Boolean.TRUE;
}
else
{
fieldUsesSearchSecurity = Boolean.FALSE;
}
}
return fieldUsesSearchSecurity.booleanValue();
}
public MediaArchive getMediaArchive()
{
if (fieldMediaArchive == null)
{
fieldMediaArchive = (MediaArchive) getModuleManager().getBean(getCatalogId(), "mediaArchive");
}
return fieldMediaArchive;
}
public void deleteData(Data inData)
{
getAssetArchive().deleteAsset((Asset)inData);
}
public void deleteFromIndex(Asset inAsset)
{
deleteFromIndex(inAsset.getId());
}
public void deleteFromIndex(String inId)
{
getDataConnector().deleteFromIndex(inId);
}
public void deleteFromIndex(HitTracker inOld)
{
getDataConnector().deleteFromIndex(inOld);
}
@Override
public HitTracker getAllHits()
{
// Category root = null;
// try
// {
// root = getCategorySearcher().getRootCategory();
// }
// catch (OpenEditException e)
// {
// throw new OpenEditRuntimeException(e);
// }
SearchQuery query = createSearchQuery();
query.addMatches("id", "*");
// if (root != null)
// {
// query.addMatches("category", root.getId());
// }
// else
// {
// query.addMatches("category", "index");
// }
query.addSortBy("id");
return search(query);
}
public HitTracker getAllHits(WebPageRequest inReq)
{
// Category root = null;
// try
// {
// root = getCategorySearcher().getRootCategory();
// }
// catch (OpenEditException e)
// {
// throw new OpenEditRuntimeException(e);
// }
SearchQuery query = createSearchQuery();
query.addMatches("id", "*");
// if (root != null)
// {
// query.addMatches("category", root.getId());
// }
// else
// {
// query.addMatches("category", "index");
// }
if (inReq == null)
{
return search(query);
}
else
{
String sort = inReq.getRequestParameter("sortby");
if( sort != null)
{
query.addSortBy(sort);
}
return cachedSearch(inReq, query);
}
}
public void saveData(Data inData, User inUser)
{
if (inData instanceof CompositeAsset)
{
CompositeAsset asset = (CompositeAsset)inData;
asset.saveChanges();
}
else if (inData instanceof CompositeData)
{
saveCompositeData((CompositeData) inData, inUser);
}
else if (inData instanceof Asset)
{
Asset asset = (Asset) inData;
getDataConnector().saveData(asset,inUser);
}
else
{
throw new OpenEditException("Not an asset");
}
}
public PageManager getPageManager()
{
return fieldPageManager;
}
public void setPageManager(PageManager inPageManager)
{
fieldPageManager = inPageManager;
}
public Object searchByField(String inField, String inValue)
{
return getDataConnector().searchByField(inField,inValue);
}
public ModuleManager getModuleManager()
{
return getSearcherManager().getModuleManager();
}
public void setModuleManager(ModuleManager inModuleManager)
{
fieldModuleManager = inModuleManager;
}
public CategorySearcher getCategorySearcher()
{
if (fieldCategorySearcher == null)
{
fieldCategorySearcher = (CategorySearcher)getSearcherManager().getSearcher(getCatalogId(), "category");
}
return fieldCategorySearcher;
}
public void setCategorySearcher(CategorySearcher inCategorySearcher)
{
fieldCategorySearcher = inCategorySearcher;
}
public AssetArchive getAssetArchive()
{
return getMediaArchive().getAssetArchive();
}
public HitTracker cachedSearch(WebPageRequest inPageRequest, SearchQuery inSearch) throws OpenEditException
{
boolean filterstuff = true;
String datamanager = inPageRequest.getContentProperty("showallfiles");
if( Boolean.parseBoolean(datamanager) )
{
filterstuff = false;
}
//modify in query if we are using search security
if( filterstuff )
{
addShowOnly(inPageRequest, inSearch);
}
if(filterstuff && doesIndexSecurely() && !inSearch.isSecurityAttached())
{
//TODO: This should be in a child query with child.setFilter(true);
//viewasset = "admin adminstrators guest designers"
//goal: current query && (viewasset.contains(username) || viewasset.contains(group0) || ... || viewasset.contains(groupN))
User currentUser = inPageRequest.getUser();
StringBuffer buffer = new StringBuffer("true "); //true is for wide open searches
UserProfile profile = inPageRequest.getUserProfile();
if( profile != null)
{
//Get the libraries
Collection libraries = profile.getCombinedLibraries();
if( libraries != null)
{
for (Iterator iterator = libraries.iterator(); iterator .hasNext();)
{
String library = (String) iterator.next();
buffer.append( " library_" + library);
}
}
}
if (currentUser != null)
{
for (Iterator iterator = currentUser.getGroups().iterator(); iterator.hasNext();)
{
String allow = ((Group)iterator.next()).getId();
buffer.append(" group_" + allow);
}
buffer.append(" user_" + currentUser.getUserName());
}
inSearch.addOrsGroup("viewasset", buffer.toString().toLowerCase());
inSearch.setSecurityAttached(true);
}
String filter = inPageRequest.findValue("enableprofilefilters");
if( filterstuff && Boolean.parseBoolean(filter))
{
if( inSearch.getTermByDetailId("album") == null )
{
addUserProfileSearchFilters( inPageRequest,inSearch);
}
}
HitTracker hits = super.cachedSearch(inPageRequest, inSearch);
return hits;
}
public SearchQuery createSearchQuery()
{
return getDataConnector().createSearchQuery();
}
public String getIndexId()
{
return getDataConnector().getIndexId();
}
public void clearIndex()
{
getDataConnector().clearIndex();
}
public void deleteAll(User inUser)
{
getDataConnector().deleteAll(inUser);
}
public void delete(Data inData, User inUser)
{
getDataConnector().delete(inData, inUser);
}
public void saveAllData(Collection<Data> inAll, User inUser)
{
getDataConnector().saveAllData(inAll,inUser);
}
public HitTracker search(SearchQuery inQuery)
{
return getDataConnector().search(inQuery);
}
public void flush()
{
getDataConnector().flush();
}
public void setCatalogId(String inCatalogId)
{
super.setCatalogId(inCatalogId);
getDataConnector().setCatalogId(inCatalogId);
}
public void setSearchType(String inSearchType)
{
super.setSearchType(inSearchType);
getDataConnector().setSearchType(inSearchType);
}
public void setPropertyDetailsArchive(PropertyDetailsArchive inArchive)
{
super.setPropertyDetailsArchive(inArchive);
getDataConnector().setPropertyDetailsArchive(inArchive);
}
public void setSearcherManager(SearcherManager inManager)
{
super.setSearcherManager(inManager);
getDataConnector().setSearcherManager(inManager);
}
public boolean hasChanged(HitTracker inTracker)
{
return getDataConnector().hasChanged(inTracker);
}
public String nextId()
{
//throw new IllegalAccessError("nextId Not implemented");
return getDataConnector().nextId();
}
public String nextAssetNumber()
{
return nextId();
}
public Asset getAssetBySourcePath(String inSourcepath, boolean inAutocreate)
{
return (Asset) getDataConnector().getDataBySourcePath(inSourcepath, inAutocreate);
//return getAssetArchive().getAssetBySourcePath(inSourcepath, inAutocreate);
}
public Asset getAssetBySourcePath(String inSourcepath)
{
return (Asset) getDataConnector().getDataBySourcePath(inSourcepath);
}
// public void updateFilters(WebPageRequest inReq) throws OpenEditException
// {
// updateFilters(inReq);
// }
}