package org.openedit.entermedia.xmldb;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import org.openedit.Data;
import org.openedit.data.BaseSearcher;
import org.openedit.entermedia.Category;
import org.openedit.entermedia.CategoryArchive;
import com.openedit.OpenEditException;
import com.openedit.hittracker.HitTracker;
import com.openedit.hittracker.ListHitTracker;
import com.openedit.hittracker.SearchQuery;
import com.openedit.hittracker.Term;
import com.openedit.users.User;
public class XmlCategorySearcher extends BaseSearcher implements CategorySearcher
{
protected CategoryArchive fieldCategoryArchive;
public CategoryArchive getCategoryArchive()
{
return fieldCategoryArchive;
}
public void setCategoryArchive(CategoryArchive inCategoryArchive)
{
fieldCategoryArchive = inCategoryArchive;
}
@Override
public void reIndexAll() throws OpenEditException
{
}
@Override
public Data createNewData()
{
return new Category();
}
@Override
public SearchQuery createSearchQuery()
{
return new SearchQuery();
}
@Override
public HitTracker search(SearchQuery inQuery)
{
ListHitTracker hits = new ListHitTracker();
Term id = inQuery.getTermByDetailId("id");
if( id != null)
{
Category category = getCategoryArchive().getCategory(id.getValue());
if( category != null)
{
hits.getList().add(category);
}
}
Term name = inQuery.getTermByDetailId("name");
if( name != null)
{
Category category = getCategoryArchive().getCategoryByName(name.getValue());
if( category != null)
{
hits.getList().add(category);
}
}
Term parentterm = inQuery.getTermByDetailId("parentid");
if( parentterm != null)
{
Category category = getCategoryArchive().getCategory(parentterm.getValue());
if( category != null)
{
hits.getList().addAll(category.getChildren());
}
}
return hits;
}
@Override
public String getIndexId()
{
return String.valueOf( getCategoryArchive().getRootCategory().hashCode() );
}
@Override
public void clearIndex()
{
}
@Override
public void deleteAll(User inUser)
{
getCategoryArchive().deleteCategory(getCategoryArchive().getRootCategory());
}
@Override
public void delete(Data inData, User inUser)
{
Category cat = getCategoryArchive().getCategory(inData.getId());
getCategoryArchive().deleteCategory(cat);
}
@Override
public void saveData(Data inData, User inUser)
{
Collection<Data> list = new ArrayList<Data>(1);
list.add(inData);
saveAllData(list,inUser);
}
@Override
public void saveAllData(Collection<Data> inAll, User inUser)
{
//TODO: Remove all this. Categories are hard to maintain
for (Iterator iterator = inAll.iterator(); iterator.hasNext();)
{
Category cat = (Category) iterator.next();
//this might be a temporary copy of a category
if( cat.getParentCategory() == null)
{
Category existingcat = getCategoryArchive().getCategory(cat.getId());
if( existingcat != null )
{
existingcat.getProperties().putAll(cat.getProperties());
cat = existingcat;
}
else
{
//new one
String parentid = cat.get("parentid");
if( parentid != null)
{
Category parent = getCategoryArchive().getCategory(parentid);
if( parent != null)
{
cat.setParentCategory(parent);
parent.addChild(cat);
}
}
}
}
getCategoryArchive().saveCategory(cat);
}
}
@Override
public Category getRootCategory()
{
return getCategoryArchive().getRootCategory();
}
@Override
public void setCatalogId(String inCatalogId)
{
getCategoryArchive().setCatalogId(inCatalogId);
super.setCatalogId(inCatalogId);
}
}