package org.openedit.xml;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.openedit.Data;
import com.openedit.OpenEditException;
import com.openedit.OpenEditRuntimeException;
import com.openedit.hittracker.HitTracker;
import com.openedit.page.Page;
import com.openedit.page.manage.PageManager;
import com.openedit.users.User;
public class XmlFolderSearcher extends XmlSearcher
{
private static final Log log = LogFactory.getLog(XmlFolderSearcher.class);
protected PageManager fieldPageManager;
public PageManager getPageManager()
{
return fieldPageManager;
}
public void setPageManager(PageManager inPageManager)
{
fieldPageManager = inPageManager;
}
protected XmlFile loadXmlFile()
{
try
{
String inName = getSearchType();
//getConfigurationPath
XmlFile composite = new XmlFile();
String rootpath = "/WEB-INF/data/" + getCatalogId() + "/lists/" + inName ;
composite.setPath(rootpath + "/custom.xml");
long inLastModified = getPageManager().getRepository().getStub(composite.getPath()).lastModified().getTime();
composite.setLastModified(inLastModified);
Element root = DocumentHelper.createElement(inName);
composite.setRoot(root);
List<String> children = getPageManager().getChildrenPaths(rootpath,false);
if( children.size() > 0)
{
composite.setExist(true);
loadChildren(inName, children, root, true);
}
List<String> children2 = getPageManager().getChildrenPaths("/" + getCatalogId() + "/data" + "/lists/" + inName + "/",true);
if( children2.size() > 0)
{
composite.setExist(true);
boolean existing = children.size() > 0;
loadChildren(inName, children2, root, true);
}
// HitTracker hits = getSearcherManager().getList(
// getCatalogId(), "dataextensions");
// for (Iterator iterator = hits.iterator(); iterator
// .hasNext();) {
// Data hit = (Data) iterator.next();
// String catalogid = hit.get("catalogid");
//
// List<String> children3 = getPageManager().getChildrenPaths("/" + catalogid + "/data" + "/lists/" + inName + "/",true);
// if( children3.size() > 0)
// {
// composite.setExist(true);
// boolean existing = children2.size() > 0;
// if( !existing )
// {
// existing = children.size() > 0;
// }
// loadChildren(inName, children3, root, existing);
// }
//
// }
//remove deleted
for (Iterator iterator = new ArrayList(composite.getElements()).iterator(); iterator.hasNext();)
{
Element element = (Element) iterator.next();
if ( "deleted".equals( element.attributeValue("recordstatus") ) )
{
composite.getRoot().remove(element);
}
}
return composite;
} catch ( OpenEditException ex)
{
throw new OpenEditRuntimeException(ex);
}
}
protected void loadChildren(String inName, List<String> children, Element root, boolean noDups)
{
for(String child:children)
{
if(child.endsWith(".xml"))
{
XmlFile settings = getXmlArchive().getXml(child,child,inName);
for (Iterator iterator = settings.getRoot().elementIterator(); iterator
.hasNext();)
{
Element row = (Element) iterator.next();
Element existing = getElementById(root,row.attributeValue("id"));
if( !noDups || existing == null )
{
row.setParent(null);
root.add(row);
}
}
}
}
}
protected Element getElementById(Element root, String inEid)
{
if( inEid == null)
{
return null;
}
for (Iterator iter = root.elementIterator(); iter.hasNext();)
{
Element element = (Element) iter.next();
String id = element.attributeValue("id");
if ( inEid.equals(id))
{
return element;
}
}
return null;
}
public void deleteAll(User inUser)
{
String path = "/WEB-INF/data/" + getCatalogId() + "/lists"
+ "/" + getSearchType() + "/custom.xml";
Page page = getPageManager().getPage(path);
getPageManager().removePage(page);
clearIndex();
HitTracker all = getAllHits();
for (Iterator iterator = all.iterator(); iterator.hasNext();)
{
Data data = (Data)iterator.next();
delete(data,inUser);
}
}
public void delete(Data inData, User inUser)
{
saveData(inData,inUser,true);
}
public void saveData(Data inData, User inUser)
{
saveData(inData,inUser,false);
}
public void saveData(Data inData, User inUser, boolean delete)
{
if( delete )
{
inData.setProperty("recordstatus", "deleted");
}
else
{
inData.setProperty("recordstatus", null);
}
//If this element is manipulated then the instance is the same
//No need to read it ElementData data = (ElementData)inData;
String path = "/WEB-INF/data/" + getCatalogId() + "/lists"
+ "/" + getSearchType() + "/custom.xml";
XmlFile settings = getXmlArchive().getXml(path);
Element element = null;
if( inData.getId() == null)
{
inData.setId( String.valueOf( new Date().getTime() ));
}
else
{
element = settings.getElementById(inData.getId());
}
if( element == null )
{
//New element
element = settings.getRoot().addElement(settings.getElementName());
element.addAttribute("id", inData.getId());
}
if( inData instanceof ElementData)
{
ElementData data = (ElementData)inData;
List attributes = data.getElement().attributes();
element.setAttributes(attributes);
//element.setText(inData.getName());
//existing row exists
element.setContent(data.getElement().content());
}
else
{
element.clearContent();
element.setAttributes(null);
ElementData data = new ElementData(element);
data.setId(inData.getId());
data.setName(inData.getName());
data.setSourcePath(inData.getSourcePath());
for (Iterator iterator = inData.getProperties().keySet().iterator(); iterator.hasNext();)
{
String key = (String) iterator.next();
data.setProperty(key, inData.get(key));
}
}
// Element alreadyhere = settings.getElementById(data.getId());
// if( alreadyhere != null)
// {
// settings.getRoot().remove(alreadyhere);
// }
// data.getElement().setParent(null);
// settings.getRoot().add(data.getElement());
// if( data.getId() == null)
// {
// //TODO: Use counter
// data.setId( String.valueOf( new Date().getTime() ));
// }
clearIndex();
log.info("Saved to " + settings.getPath());
getXmlArchive().saveXml(settings, inUser);
}
public void saveAllData(Collection inAll, User inUser, String path)
{
for (Iterator iterator = inAll.iterator(); iterator.hasNext();)
{
Data data = (Data) iterator.next();
saveData(data,inUser,false);
}
}
}