package org.openedit.entermedia.modules; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.collections.map.ListOrderedMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dom4j.Element; import org.entermedia.location.GeoCoder; import org.entermedia.location.Position; import org.entermedia.upload.FileUpload; import org.entermedia.upload.FileUploadItem; import org.entermedia.upload.UploadRequest; import org.openedit.Data; import org.openedit.data.CompositeData; import org.openedit.data.CompositeFilteredTracker; import org.openedit.data.FilteredTracker; import org.openedit.data.PropertyDetail; import org.openedit.data.PropertyDetails; import org.openedit.data.PropertyDetailsArchive; import org.openedit.data.Searcher; import org.openedit.data.SearcherManager; import org.openedit.entermedia.BaseCompositeData; import org.openedit.entermedia.MediaArchive; import org.openedit.event.WebEvent; import org.openedit.event.WebEventListener; import org.openedit.profile.UserProfile; import org.openedit.xml.XmlArchive; import org.openedit.xml.XmlFile; import org.openedit.xml.XmlSearcher; import com.openedit.OpenEditException; import com.openedit.WebPageRequest; import com.openedit.hittracker.HitTracker; import com.openedit.hittracker.SearchQuery; import com.openedit.hittracker.Term; import com.openedit.page.Page; import com.openedit.users.User; import com.openedit.util.PathUtilities; public class DataEditModule extends BaseMediaModule { protected XmlArchive fieldXmlArchive; protected WebEventListener fieldWebEventListener; protected GeoCoder fieldGeoCoder; private static final Log log = LogFactory.getLog(DataEditModule.class); public Searcher loadSearcherForEdit(WebPageRequest inReq) throws Exception { org.openedit.data.Searcher searcher = loadSearcher(inReq); if (searcher == null) { throw new OpenEditException("No searcher found"); } String paramname = inReq.getRequestParameter("paramname"); if( paramname == null) { paramname = "id"; } String id = inReq.getRequestParameter(paramname); if (id != null && !id.startsWith("multi")) { Object data = searcher.searchById(id); if( data != null) { inReq.putPageValue("data", data); } } inReq.putPageValue("searcher", searcher); inReq.putPageValue("detailsarchive", searcher.getPropertyDetailsArchive()); inReq.putPageValue("searcherManager", getSearcherManager()); /* This is silly, use a view or pass in $details List fields = new ArrayList(); List properties = searcher.getProperties(); if (properties != null) { for (Iterator iterator = properties.iterator(); iterator.hasNext();) { PropertyDetail detail = (PropertyDetail) iterator.next(); PropertyDetail copy = detail.copy(); copy.setEditable(true); fields.add(copy); } } inReq.putPageValue("details", fields); */ return searcher; } public void searchFields(WebPageRequest inReq) throws Exception { Searcher searcher = loadSearcher(inReq); if (searcher != null) { HitTracker hits = searcher.fieldSearch(inReq); if (hits != null) { String name = inReq.findValue("hitsname"); inReq.putPageValue(name, hits); inReq.putSessionValue(hits.getSessionId(), hits); } } inReq.putPageValue("searcher", searcher); } /** * @deprecated use searchFields * @param inReq * @throws Exception */ public void search(WebPageRequest inReq) throws Exception { Searcher searcher = loadSearcher(inReq); if (searcher != null) { HitTracker hits = searcher.fieldSearch(inReq); if (hits == null) //this seems unexpected. Should it be a new API such as searchAll? { hits = searcher.getAllHits(inReq); } if (hits != null) { String name = inReq.findValue("hitsname"); inReq.putPageValue(name, hits); inReq.putSessionValue(hits.getSessionId(), hits); } } inReq.putPageValue("searcher", searcher); } public Data createNew(WebPageRequest inReq) throws Exception { Searcher searcher = loadSearcherForEdit(inReq); Data data = searcher.createNewData(); inReq.putPageValue("data", data); inReq.putSessionValue("tmpdata", data); String var = inReq.findValue("datavariable"); if (var != null) { inReq.putSessionValue(var, data); } return data; } public void makeDefaultFields(WebPageRequest inReq) throws Exception { String fieldName = resolveSearchType(inReq); Searcher searcher = loadSearcher(inReq); PropertyDetails details = searcher.getPropertyDetailsArchive().getPropertyDetailsCached(fieldName); String catalogid = searcher.getCatalogId(); String file = "/" + catalogid + "/data/fields/" + fieldName + ".xml"; searcher.getPropertyDetailsArchive().savePropertyDetails(details, fieldName, inReq.getUser(), file); } public void makeDefaultView(WebPageRequest inReq) throws Exception { XmlFile file = (XmlFile)loadView(inReq); String catalogid = resolveCatalogId(inReq); String type = resolveSearchType(inReq); String viewpath = inReq.getRequestParameter("viewpath"); String path = "/" + catalogid + "/data/views/" + viewpath + ".xml"; file.setPath(path); getXmlArchive().saveXml(file, inReq.getUser()); } public void makeDefaultList(WebPageRequest inReq) throws Exception { String fieldName = resolveSearchType(inReq); Searcher searcher = loadSearcher(inReq); if(searcher instanceof XmlSearcher){ HitTracker hits = searcher.getAllHits(); String catalogid = searcher.getCatalogId(); String file = "/" + catalogid + "/data/lists/" + fieldName + ".xml"; ((XmlSearcher) searcher).saveAllData(hits, inReq.getUser(), file); } } public void saveProperty(WebPageRequest inReq) throws Exception { String id = inReq.getRequestParameter("id"); String fieldName = resolveSearchType(inReq); Searcher searcher = loadSearcher(inReq); PropertyDetails details = searcher.getPropertyDetailsArchive().getPropertyDetailsCached(fieldName); PropertyDetail detail = details.getDetail(id); String newid = inReq.getRequestParameter("newid"); detail.setId(newid); String name = inReq.getRequestParameter("name"); detail.setText(name); String externalid = inReq.getRequestParameter("externalid"); detail.setExternalId(externalid); String editable = inReq.getRequestParameter("editable"); detail.setEditable(Boolean.parseBoolean(editable)); String index = inReq.getRequestParameter("index"); detail.setIndex(Boolean.parseBoolean(index)); String stored = inReq.getRequestParameter("stored"); detail.setStored(Boolean.parseBoolean(stored)); String keyword = inReq.getRequestParameter("keyword"); detail.setKeyword(Boolean.parseBoolean(keyword)); String filter = inReq.getRequestParameter("filter"); detail.setFilter(Boolean.parseBoolean(filter)); String internalfield = inReq.getRequestParameter("internalfield"); detail.setProperty("internalfield", String.valueOf(Boolean.parseBoolean(internalfield))); String type = inReq.getRequestParameter("datatype"); detail.setDataType(type); type = inReq.getRequestParameter("viewtype"); detail.setViewType(type); // String val = inReq.getRequestParameter("listid"); // detail.setProperty("listid", val); // val = inReq.getRequestParameter("listcatalogid"); // detail.setProperty("listcatalogid", val); // // val = inReq.getRequestParameter("sort"); // detail.setProperty("sort", val); // val = inReq.getRequestParameter("query"); // detail.setProperty("query", val); // val = inReq.getRequestParameter("foreignkeyid"); // detail.setProperty("foreignkeyid", val); // val = inReq.getRequestParameter("viewtype"); // detail.setProperty("viewtype", val); String [] fields = inReq.getRequestParameters("field"); if( fields != null) { for (int i = 0; i < fields.length; i++) { String field = fields[i]; String value = inReq.getRequestParameter(field + ".value"); detail.setProperty(field, value); } } searcher.getPropertyDetailsArchive().savePropertyDetails(details, fieldName, inReq.getUser()); } public void addToView(WebPageRequest inReq) throws Exception { XmlFile file = (XmlFile)loadView(inReq); String catalogid = resolveCatalogId(inReq); String type = resolveSearchType(inReq); String viewpath = inReq.getRequestParameter("viewpath"); String path = "/WEB-INF/data/" + catalogid + "/views/" + viewpath + ".xml"; file.setPath(path); file.setElementName("property"); String newone = inReq.getRequestParameter("newone"); Element element = file.addNewElement(); element.addAttribute("id", newone); element.clearContent(); getXmlArchive().saveXml(file, inReq.getUser()); //reload the archive Searcher searcher = loadSearcher(inReq); searcher.getPropertyDetailsArchive().clearCache(); } //TODO: Allow disable of views public void removeFromView(WebPageRequest inReq) throws Exception { XmlFile file = (XmlFile)loadView(inReq); String catalogid = resolveCatalogId(inReq); String type = resolveSearchType(inReq); String viewpath = inReq.getRequestParameter("viewpath"); String path = "/WEB-INF/data/" + catalogid + "/views/" + viewpath + ".xml"; file.setPath(path); String toremove = inReq.getRequestParameter("toremove"); Element element = file.getElementById(toremove); file.deleteElement(element); getXmlArchive().saveXml(file, inReq.getUser()); Searcher searcher = loadSearcher(inReq); searcher.getPropertyDetailsArchive().clearCache(); } public PropertyDetail loadProperty(WebPageRequest inReq) throws Exception { String id = inReq.getRequestParameter("id"); Searcher searcher = loadSearcher(inReq); if (searcher == null || id == null) { return null; } PropertyDetail detail = searcher.getPropertyDetailsArchive().getPropertyDetailsCached(searcher.getSearchType()).getDetail(id); if (detail != null) { inReq.putPageValue("property", detail); inReq.putPageValue("detail", detail); } return detail; } public void addProperty(WebPageRequest inReq) throws Exception { String fieldName = resolveSearchType(inReq); Searcher searcher = loadSearcherForEdit(inReq); PropertyDetails details = searcher.getPropertyDetailsArchive().getPropertyDetailsCached(fieldName); PropertyDetail detail = new PropertyDetail(); String label = inReq.getRequestParameter("newproperty"); if (label == null) { label = "New"; } detail.setId(label.toLowerCase().replace(" ", "")); detail.setText(label); String catid = inReq.findValue("catalogid"); detail.setCatalogId(catid); detail.setEditable(true); detail.setIndex(true); detail.setStored(true); details.addDetail(detail); searcher.getPropertyDetailsArchive().savePropertyDetails(details, fieldName, inReq.getUser()); loadProperties(inReq); //tuan inReq.putPageValue("property", detail); inReq.putPageValue("detail", detail); } public void deleteProperty(WebPageRequest inReq) throws Exception { String id = inReq.getRequestParameter("id"); String fieldName = resolveSearchType(inReq); Searcher searcher = loadSearcher(inReq); PropertyDetails details = searcher.getPropertyDetailsArchive().getPropertyDetailsCached(fieldName); details.removeDetail(id); searcher.getPropertyDetailsArchive().savePropertyDetails(details, fieldName, inReq.getUser()); } public void saveMultiJoinData(WebPageRequest inReq) throws Exception { String save = inReq.getRequestParameter("save"); if (!Boolean.parseBoolean(save)) { return; } String catalogid = inReq.getRequestParameter("catalogid"); String searchtype = inReq.getRequestParameter("searchtype"); // productstate // String fieldname = inReq.getRequestParameter("fieldname"); // //productstate String[] newvalues = inReq.getRequestParameters(searchtype + ".value"); List newvaluestosave = new ArrayList(); if (newvalues != null) { newvaluestosave.addAll(Arrays.asList(newvalues)); } Searcher joinsearcher = getSearcherManager().getSearcher(catalogid, searchtype); FilteredTracker multiList = new FilteredTracker(); multiList.setSearcher(joinsearcher); String listexternalid = inReq.getRequestParameter("listexternalid"); multiList.setListId(listexternalid); String externalvalue = inReq.getRequestParameter("fieldexternalvalue"); multiList.setExternalValue(externalvalue); String externalid = inReq.getRequestParameter("fieldexternalid"); multiList.setExternalId(externalid); String sourcepath = inReq.getRequestParameter("sourcepath"); multiList.setSourcePath(sourcepath); // If this product is not multiselect then do this if ((externalid.equals("assetid") || externalid.equals("productid")) && externalvalue.startsWith("multiedit:")) { CompositeData multi = (CompositeData) inReq.getSessionValue(externalvalue); for (Iterator iterator = multi.iterator(); iterator.hasNext();) { Data hit = (Data) iterator.next(); multiList.setExternalValue(hit.getId()); multiList.setSourcePath(hit.get("sourcepath")); // We only want to add new records List toAdd = multiList.filterToAdd(newvaluestosave, inReq.getUser()); multiList.getSearcher().saveAllData(toAdd, inReq.getUser()); } String appid = inReq.findValue("applicationid"); String saveokpage = inReq.getPageProperty("saveokpage"); // THis is for compatibility with EnterMedia and Data-Mining // projects if (saveokpage == null) { saveokpage = "/layout/edit/saveok.html"; } inReq.redirect("/" + appid + saveokpage); return; } else { multiList.saveRows(newvaluestosave, inReq.getUser()); } // Remove conflicting data from the counterpart list // I.e., if we add to the available zones list, remove from the // unavailable zones list. removeCounterpartData(inReq, newvaluestosave); } public void removeCounterpartData(WebPageRequest inReq, List values) { String catalogid = inReq.getRequestParameter("catalogid"); String counterPartSearchtype = inReq.getRequestParameter("counterpartsearchtype"); Searcher counterPartSearcher = getSearcherManager().getSearcher(catalogid, counterPartSearchtype); if (counterPartSearchtype != null) { String externalid = inReq.getRequestParameter("fieldexternalid"); String externalvalue = inReq.getRequestParameter("fieldexternalvalue"); String listexternalid = inReq.getRequestParameter("listexternalid"); FilteredTracker multiList = new CompositeFilteredTracker(); multiList.setSearcher(counterPartSearcher); multiList.setListId(listexternalid); multiList.filter(externalid, externalvalue); multiList.deleteValues(values, inReq.getUser()); } } public void saveData(WebPageRequest inReq) throws Exception { int count = 0; String[] fields = inReq.getRequestParameters("field"); if (fields == null) { return; } String ok = inReq.findValue("save"); if (!Boolean.parseBoolean(ok)) { return; } Searcher searcher = loadSearcherForEdit(inReq); if (searcher != null) { Data data = null; // existing record? String id = inReq.getRequestParameter("id"); // Old ID if (id == null) { id = inReq.getRequestParameter("id.value"); } if (id != null && id.startsWith("multiedit:")) { data = (CompositeData) inReq.getSessionValue(id); if( data == null) { data = loadData(inReq); } } if (id != null && data == null) { data = (Data) searcher.searchById(id); } if (data == null) { data = (Data) inReq.getSessionValue("tmpdata"); inReq.removeSessionValue("tmpdata"); if(data != null &&data.getId() == null){ data.setId(id); } } // We need to do this for multiediting so that we can get better record edit logs. if (data instanceof CompositeData) { String val = null; ArrayList<String> fieldswithvalues = new ArrayList<String>(); for(int i=0;i<fields.length;i++) { val = inReq.getRequestParameter(fields[i]+".value"); if(val!= null && val.length() > 0) { fieldswithvalues.add(fields[i]); } String[] vals = inReq.getRequestParameters(fields[i]+".values"); if(vals != null && vals.length > 0) { fieldswithvalues.add(fields[i]); } } CompositeData compositedata = (CompositeData) data; String[] newfields = new String[fieldswithvalues.size()]; newfields = fieldswithvalues.toArray(newfields); searcher.updateData(inReq, newfields, compositedata); // for (Iterator iterator = compositedata.iterator(); iterator.hasNext();) // { // Data copy = (Data) iterator.next(); // inReq.setRequestParameter("id", copy.getId()); // searcher.saveDetails(inReq, newfields, copy, copy.getId()); // } count = compositedata.size(); compositedata.saveChanges(); // should we redirect to a save ok page? redirectToSaveOk(inReq); } else { boolean multivalues = false; /* This is being used for table data */ String externalid = inReq.getRequestParameter("fieldexternalid"); if (externalid != null) { String externalvalue = inReq.getRequestParameter("fieldexternalvalue"); if (externalvalue.startsWith("multiedit:")) { multivalues = true; CompositeData externaldata = (CompositeData) inReq.getSessionValue(externalvalue); // Each one of the ids of the composite data elements become the values of the external field for (Iterator iterator = externaldata.iterator(); iterator.hasNext();) { Data element = (Data)iterator.next(); data = searcher.createNewData(); data.setSourcePath(element.getSourcePath()); inReq.setRequestParameter("id", data.getId()); inReq.setRequestParameter(externalid + ".value", element.getId()); searcher.saveDetails(inReq, fields, data, id); count++; } redirectToSaveOk(inReq); } } if (!multivalues) { String newid = inReq.getRequestParameter("newid"); if (newid != null && !newid.equals(id)) // Make a copy { data = searcher.createNewData(); data.setId(newid); } if (data == null) { data = searcher.createNewData(); data.setId(id); } // should the data have a sourcepath set? if (data.getSourcePath() == null) { String sourcepath = inReq.getRequestParameter("sourcepath"); data.setSourcePath(sourcepath); } inReq.setRequestParameter("id", data.getId()); inReq.setRequestParameter("id.value", data.getId()); searcher.saveDetails(inReq, fields, data, id); count++; } } inReq.putPageValue("data", data); if(data instanceof UserProfile){ //saving our own user profile while logged in was immediately getting overridden by the one in memory if(inReq.getUserName().equals(data.getId())){ String sessionid = searcher.getCatalogId() + "userprofile" + data.getId(); inReq.removeSessionValue(sessionid); } } inReq.putPageValue("savedok", Boolean.TRUE); if(getWebEventListener() != null) { WebEvent event = new WebEvent(); event.setSearchType(searcher.getSearchType()); event.setCatalogId(searcher.getCatalogId()); event.setOperation(searcher.getSearchType() + "/saved"); event.setProperty("dataid", data.getId()); event.setProperty("id", data.getId()); event.setProperty("applicationid", inReq.findValue("applicationid")); getWebEventListener().eventFired(event); } inReq.putPageValue("rowsedited", String.valueOf(count)); //rowsedited="$!rowsedited} //<script>/${catalogid}/events/scripts/library/saved.groovy</script> } } public WebEventListener getWebEventListener() { return fieldWebEventListener; } public void setWebEventListener(WebEventListener inWebEventListener) { fieldWebEventListener = inWebEventListener; } //TODO: Remove this, it is not secure and can be done other ways protected void redirectToSaveOk(WebPageRequest inReq) { String saveokpage = inReq.getPageProperty("saveokpage"); // this is for compatibility with Data-Mining and EnterMedia // projects if( saveokpage != null) { // if (saveokpage == null) // { // saveokpage = "/layout/edit/saveok.html"; // } String appid = inReq.findValue("applicationid"); inReq.redirect("/" + appid + saveokpage); } } public void deleteAll(WebPageRequest inReq) throws Exception { Searcher searcher = loadSearcher(inReq); if (searcher != null && inReq.getUser() != null) { searcher.deleteAll(inReq.getUser()); } } public void deleteData(WebPageRequest inReq) throws Exception { Searcher searcher = loadSearcher(inReq); if (searcher != null) { String[] id = inReq.getRequestParameters("id"); int changes = 0; if (id != null) { for (int i = 0; i < id.length; i++) { Data data = (Data) searcher.searchById(id[i]); if (data != null) { searcher.delete(data, inReq.getUser()); changes++; if(getWebEventListener() != null) { WebEvent event = new WebEvent(); event.setSearchType(searcher.getSearchType()); event.setCatalogId(searcher.getCatalogId()); event.setOperation(searcher.getSearchType() + "/deleted"); event.setProperty("dataid", data.getId()); event.setProperty("id", data.getId()); event.setProperty("applicationid", inReq.findValue("applicationid")); getWebEventListener().eventFired(event); } } } } inReq.putPageValue("rowsedited", String.valueOf(changes)); } } public void searchAndDeleteData(WebPageRequest inReq) throws Exception { Searcher searcher = loadSearcherForEdit(inReq); if (searcher != null) { HitTracker hits = searcher.fieldSearch(inReq); if (hits != null) { for (Iterator iterator = hits.iterator(); iterator.hasNext();) { Data data = (Data) iterator.next(); searcher.delete(data, inReq.getUser()); } } } } public void loadPageOfSearch(WebPageRequest inReq) throws Exception { Searcher searcher = loadSearcher(inReq); if (searcher != null) { /* * By the time we call the searcher's method, we expect hitsperpage * to be set on the tracker. */ HitTracker hits = searcher.loadPageOfSearch(inReq); inReq.putPageValue("searcher", searcher); } } public List loadSearchTypes(WebPageRequest inReq) { String catid = resolveCatalogId(inReq); PropertyDetailsArchive archive = getSearcherManager().getPropertyDetailsArchive(catid); List sorted = archive.listSearchTypes(); inReq.putPageValue("searchtypes", sorted); return sorted; } public List loadProperties(WebPageRequest inReq) throws Exception { Searcher searcher = loadSearcher(inReq); if (searcher == null) { return null; } List all = searcher.getProperties(); inReq.putPageValue("properties", all); inReq.putPageValue("details", searcher.getPropertyDetailsArchive().getPropertyDetailsCached(searcher.getSearchType())); return all; } public List loadFieldDetails(WebPageRequest inReq) throws Exception { PropertyDetailsArchive archive = getSearcherManager().getPropertyDetailsArchive("system"); List props = archive.getDataProperties("fieldproperties"); inReq.putPageValue("properties", props); String id = inReq.getRequestParameter("id"); if (id != null) { List all = loadProperties(inReq); for (Iterator iterator = all.iterator(); iterator.hasNext();) { PropertyDetail detail = (PropertyDetail) iterator.next(); if (detail.getId().equals(id)) { inReq.putPageValue("data", detail); break; } } } return props; } public List loadViewTypes(WebPageRequest inReq) { String catid = resolveCatalogId(inReq); PropertyDetailsArchive archive = getSearcherManager().getPropertyDetailsArchive(catid); List paths = archive.listViewTypes(); List found = new ArrayList(); for (Iterator iterator = paths.iterator(); iterator.hasNext();) { String folder = (String) iterator.next(); if( "CVS".equals(folder)) { continue; } found.add(folder); } inReq.putPageValue("viewtypes", found); return found; } public List loadViews(WebPageRequest inReq) { String catid = resolveCatalogId(inReq); String type = inReq.findValue("searchtype"); if( type== null) { return null; } PropertyDetailsArchive archive = getSearcherManager().getPropertyDetailsArchive(catid); List paths = archive.listViews(type); List found = new ArrayList(); Set fallback = new HashSet(); for (Iterator iterator = paths.iterator(); iterator.hasNext();) { String name = (String) iterator.next(); if( "CVS".equals(name)) { continue; } Data view = archive.getView(type, name); found.add(view); } inReq.putPageValue("views", found); return found; } public Data loadView(WebPageRequest inReq) throws Exception { String catid = resolveCatalogId(inReq); String viewid = inReq.getRequestParameter("viewpath"); String type = resolveSearchType(inReq); PropertyDetailsArchive archive = getSearcherManager().getPropertyDetailsArchive(catid); Data view = archive.getView(type,viewid); //String path = "/WEB-INF/data/" + catid + "/views/" + type + "/" + view + ".xml"; //XmlFile file = getXmlArchive().getXml(path); inReq.putPageValue("view", view); inReq.putPageValue("viewname", viewid); loadProperties(inReq); return view; } public void addNewView(WebPageRequest inReq) throws Exception { String catid = resolveCatalogId(inReq); String name = inReq.getRequestParameter("newname"); //String type = resolveSearchType(inReq); Searcher searcher = getSearcherManager().getSearcher(catid, "view"); Data data = searcher.createNewData(); String module = inReq.findValue("module"); String id = PathUtilities.makeId(name); id = id.toLowerCase(); if( module != null ) { id = module + id; //To mak sure they are unique } data.setId(id); data.setName(name); data.setProperty("module", module); data.setProperty("systemdefined", "false" ); data.setProperty("ordering", System.currentTimeMillis() + "" ); searcher.saveData(data, inReq.getUser()); searcher.getPropertyDetailsArchive().clearCache(); // String path = "/WEB-INF/data/" + catid + "/views/" + type + "/" + name + ".xml"; // XmlFile file = getXmlArchive().getXml(path, "property"); // // getXmlArchive().saveXml(file, inReq.getUser()); } public void deleteView(WebPageRequest inReq) { String catid = resolveCatalogId(inReq); String id = inReq.getRequestParameter("id"); Searcher searcher = getSearcherManager().getSearcher(catid, "view"); Data data = (Data)searcher.searchById(id); searcher.delete(data, null); String view = inReq.getRequestParameter("viewpath"); //String type = resolveSearchType(inReq); String path = "/WEB-INF/data/" + catid + "/views/" + view + ".xml"; Page viewPage = getPageManager().getPage(path); if (viewPage.exists()) { getPageManager().removePage(viewPage); } searcher.getPropertyDetailsArchive().clearCache(); } /** * @deprecated Not useful * @param inReq */ public void changeViewName(WebPageRequest inReq) { String catid = resolveCatalogId(inReq); String viewpath = inReq.getRequestParameter("viewpath"); String newname = inReq.getRequestParameter("newname"); String type = resolveSearchType(inReq); String path = "/WEB-INF/data/" + catid + "/views/" + viewpath + ".xml"; //This does not seem right. Do we really need this code String newpath = "/WEB-INF/data/" + catid + "/views/" + newname + ".xml"; Page oldpage = getPageManager().getPage(path); Page newpage = getPageManager().getPage(newpath); getPageManager().movePage(oldpage, newpage); inReq.setRequestParameter("view", newname); } public XmlArchive getXmlArchive() { return fieldXmlArchive; } public void setXmlArchive(XmlArchive inXmlArchive) { fieldXmlArchive = inXmlArchive; } public void updateDataIndex(WebPageRequest inReq) throws Exception { String id = inReq.getRequestParameter("id"); // Old ID String searchtype = inReq.findValue("searchtype"); String catalogId = resolveCatalogId(inReq); User user = inReq.getUser(); updateIndex(id, searchtype, catalogId, user); } public void updateIndex(String id, String searchtype, String catalogId, User user) { org.openedit.data.Searcher searcher = getSearcherManager().getSearcher(catalogId, searchtype); if (searcher != null) { Data data = null; // existing record? if (id != null) { data = (Data) searcher.searchById(id); searcher.saveData(data, user); } } } public void toggleHitSelection(WebPageRequest inReq) throws Exception { String name = inReq.getRequestParameter("hitssessionid"); HitTracker hits = (HitTracker) inReq.getSessionValue(name); if( hits != null) { String[] params = inReq.getRequestParameters("dataid"); if( params != null) { for (int i = 0; i < params.length; i++) { String id = params[i]; hits.toggleSelected(id); } } } } public void selectHits(WebPageRequest inReq) throws Exception { // loadPageOfSearch(inReq); String name = inReq.getRequestParameter("hitssessionid"); HitTracker hits = (HitTracker) inReq.getSessionValue(name); if( hits == null ) { throw new OpenEditException("Session timed out, reload page"); } String action = inReq.getRequestParameter("action"); if ("all".equals(action)) { hits.selectAll(); } else if ("page".equals(action)) { hits.selectCurrentPage(); } else if ("none".equals(action)) { hits.deselectAll(); } } public void deselectAll(WebPageRequest inReq) throws Exception { loadPageOfSearch(inReq); String name = inReq.findValue("hitsname"); HitTracker hits = (HitTracker) inReq.getPageValue(name); hits.deselectAll(); } public void changeSort(WebPageRequest inReq) throws Exception { Searcher searcher = loadSearcher(inReq); if (searcher != null) { searcher.changeSort(inReq); } } public void changeFilters(WebPageRequest inReq) throws Exception { Searcher searcher = loadSearcher(inReq); if (searcher != null) { searcher.updateFilters(inReq); } } public void addChildQuery(WebPageRequest inReq) throws Exception { String querystring = inReq.getRequestParameter("childquery"); if (querystring != null) { Searcher searcher = loadSearcher(inReq); if (searcher != null) { searcher.addChildQuery(inReq); } } } public void loadPicker(WebPageRequest inReq) { String catalogid = inReq.getRequestParameter("catalogid"); Term term = (Term) inReq.getPageValue("term"); SearchQuery query = (SearchQuery) inReq.getPageValue("query"); PropertyDetail detail = (PropertyDetail) inReq.getPageValue("detail"); if (detail == null) { if (term == null && query != null) { String termid = inReq.getRequestParameter("termid"); term = query.getTermByTermId(termid); } if (term != null) { detail = term.getDetail(); } else { return; } } String type = detail.getSearchType(); // Dependencies String view = detail.getView(); List depends = new ArrayList(); Map searchers = new HashMap(); Map values = new HashMap(); StringBuffer additionals = new StringBuffer(); for (String foreignkeyid = detail.get("foreignkeyid"); foreignkeyid != null;) { PropertyDetail next = getSearcherManager().getSearcher(detail.getListCatalogId(), type).getDetail(foreignkeyid); depends.add(next); searchers.put(foreignkeyid, getSearcherManager().getListSearcher(next)); String value = inReq.getRequestParameter(foreignkeyid); if (value == null) { value = query.getInput(term.getId() + "." + foreignkeyid); } values.put(foreignkeyid, value); additionals.append(foreignkeyid); additionals.append(","); foreignkeyid = next.get("foreignkeyid"); } if (additionals.length() > 0) { additionals.deleteCharAt(additionals.length() - 1); // last comma } Collections.reverse(depends); inReq.putPageValue("catalogid", catalogid); inReq.putPageValue("termid", term.getId()); inReq.putPageValue("applicationid", inReq.findValue("applicationid")); inReq.putPageValue("detail", detail); inReq.putPageValue("depends", depends); inReq.putPageValue("searchers", searchers); inReq.putPageValue("values", values); inReq.putPageValue("additionals", additionals.toString()); inReq.putPageValue("searcher", getSearcherManager().getListSearcher(detail)); } public HitTracker loadHits(WebPageRequest inReq) throws Exception { HitTracker hits = null; String searchType = inReq.getRequestParameter("searchtype"); if(searchType == null){ searchType = inReq.findValue("searchtype"); } String hitsname = inReq.findValue("hitsname"); if (hitsname == null) { hitsname = "hits"; } Searcher searcher = null; String catalogid = inReq.getRequestParameter("catalogid"); if(catalogid == null){ catalogid = inReq.findValue("catalogid"); } if (catalogid == null) { catalogid = inReq.findValue("applicationid"); } if (catalogid != null) {// for a sub searcher searcher = getSearcherManager().getSearcher(catalogid, searchType); if(searcher != null) { hits = searcher.loadHits(inReq); } } if (hits == null) { if(searcher != null){ hits = searcher.loadHits(inReq, hitsname); } } if (hits == null) { if(searcher != null){ hits = searcher.loadHits(inReq); } } inReq.putPageValue(hitsname + catalogid, hits); inReq.putPageValue(hitsname, hits); String clear = inReq.getRequestParameter("clearselection"); if( Boolean.parseBoolean(clear)) { hits.deselectAll(); } return hits; } public void saveTextForView(WebPageRequest inReq) throws Exception { XmlFile file = (XmlFile)loadView(inReq); String label = inReq.getRequestParameter("usagelabel"); file.setProperty("usagelabel", label); inReq.putPageValue("message", "saved"); getXmlArchive().saveXml(file, inReq.getUser()); } public void saveSorts(WebPageRequest inReq) throws Exception { Searcher searcher = loadSearcherForEdit(inReq); if (searcher != null) { String sortfield = inReq.findValue("sortfield"); String[] ids = inReq.getRequestParameters("id"); ; for (int i = 0; i < ids.length; i++) { String id = ids[i]; Data data = (Data) searcher.searchById(id); if (data == null) { log.info("no data found"); continue; } data.setProperty(sortfield, String.valueOf(i)); searcher.saveData(data, inReq.getUser()); } } } public void uploadFiles(WebPageRequest inReq) throws Exception { FileUpload command = new FileUpload(); command.setPageManager(getPageManager()); UploadRequest properties = command.parseArguments(inReq); if (properties == null) { return; } if (properties.getFirstItem() == null) { return; } for (Iterator iterator = properties.getUploadItems().iterator(); iterator.hasNext();) { FileUploadItem item = (FileUploadItem) iterator.next(); String name = item.getFieldName(); String detailid = name.substring(name.lastIndexOf('.') + 1, name.length()); String catalogid = inReq.getRequestParameter("catalogid"); String searchtype = inReq.findValue("searchtype"); String datafolder = inReq.findValue("datafolder"); if (datafolder == null) { datafolder = "/" + catalogid + "data"; } String dataid = inReq.findValue("id"); if (dataid == null) { dataid = inReq.findValue("dataid"); } Searcher searcher = getSearcherManager().getSearcher(catalogid, searchtype); PropertyDetail detail = searcher.getDetail(detailid); String folder = datafolder + "/" + detail.get("filepath") + "/" + dataid + "/"; // <property id="headerimage" filepath="images" filetype="jpg" // resize="true" width="120" editable="true" viewtype="image" >Main // Image:</property> String ext = item.getName(); String tempfile = folder + ext; String finalpath = folder + "/" + detail.getId() + "." + detail.get("filetype"); properties.saveFileAs(item, tempfile, inReq.getUser()); } // inIn.delete(); } public void updateTempData(WebPageRequest inReq) throws Exception { String dataId = inReq.findValue("datavariable"); Data values = (Data) inReq.getSessionValue(dataId); if (values == null) { values = createNew(inReq); } Searcher searcher = loadSearcher(inReq); String[] fields = inReq.getRequestParameters("field"); searcher.updateData(inReq, fields, values); boolean ok = Boolean.parseBoolean(inReq.getRequestParameter("save")); if (ok) { searcher.saveData(values, inReq.getUser()); inReq.removeSessionValue(dataId); } inReq.putPageValue("data", values); } public Data loadData(WebPageRequest inReq) throws Exception { Searcher searcher = loadSearcher(inReq); String variablename = inReq.findValue("pageval"); if (variablename == null) { variablename = "data"; } String id = inReq.getRequestParameter("id"); if (id == null) { String pagename = inReq.getPage().getName(); id = pagename.substring(0, pagename.indexOf(".")); } Data result = null; if( id.startsWith("multiedit:")) { //setup the session value //BaseCompositeData Data data = (CompositeData) inReq.getSessionValue(id); if( data == null ) { String hitssessionid = id.substring("multiedit".length() +1 ); HitTracker hits = (HitTracker) inReq.getSessionValue(hitssessionid); if( hits == null) { log.error("Could not find " + hitssessionid); return null; } CompositeData composite = new BaseCompositeData(searcher,hits); composite.setId(id); result = composite; } } if( result == null) { result = (Data)searcher.searchById(id); } inReq.putPageValue(variablename, result); return result; } public Data loadDataByField(WebPageRequest inReq) throws Exception{ log.info("loadDataByField "+inReq); Searcher searcher = loadSearcher(inReq); String field = inReq.findValue("field") == null ? "id" : inReq.findValue("field"); String variablename = inReq.findValue("pageval") == null ? "data" : inReq.findValue("pageval"); String pagename = inReq.getPage().getName(); String searchValue = pagename.contains(".") ? pagename.substring(0, pagename.lastIndexOf(".")): pagename; SearchQuery query = searcher.createSearchQuery(); query.append(field, searchValue); HitTracker hits = searcher.search(query); Data result = null; if (hits.size() > 0) { result = (Data) hits.first(); } inReq.putPageValue(variablename, result); log.info("loadDataByField found "+(result == null ? "NULL" : result.getId())); return result; } public Object loadDataByValue(WebPageRequest inReq) throws Exception { Searcher searcher = loadSearcher(inReq); String variablename = inReq.findValue("pageval"); if (variablename == null) { variablename = "data"; } String id = inReq.findValue("id"); if (id == null) { String pagename = inReq.getPage().getName(); id = pagename.substring(0, pagename.indexOf(".")); } Object result = searcher.searchById(id); inReq.putPageValue(variablename, result); return result; } public void reindex(WebPageRequest inReq) throws Exception{ Searcher searcher = loadSearcher(inReq); if(searcher != null){ searcher.reIndexAll(); } } public void deleteSelections(WebPageRequest inReq) throws Exception { Searcher searcher = loadSearcher(inReq); String name = inReq.getRequestParameter("hitssessionid"); HitTracker hits = (HitTracker) inReq.getSessionValue(name); Collection todelete = hits.getSelectedHitracker(); for (Iterator iterator = todelete.iterator(); iterator.hasNext();) { Data hit = (Data) iterator.next(); searcher.delete(hit, inReq.getUser()); } } public void moveFieldInView(WebPageRequest inReq) throws Exception { XmlFile file = (XmlFile)loadView(inReq); String catalogid = resolveCatalogId(inReq); String type = resolveSearchType(inReq); String viewpath = inReq.getRequestParameter("viewpath"); String path = "/WEB-INF/data/" + catalogid + "/views/" + viewpath + ".xml"; file.setPath(path); file.setElementName("property"); String source = inReq.getRequestParameter("source"); Element sourceelement = file.getElementById(source); String destination = inReq.getRequestParameter("destination"); Element destinationelement = file.getElementById(destination); int sindex = file.getElements().indexOf(sourceelement); int dindex = file.getElements().indexOf(destinationelement); file.getElements().remove(sindex); sourceelement.setParent(null); if( dindex > sindex) { dindex--; } file.getElements().add(dindex,sourceelement); getXmlArchive().saveXml(file, inReq.getUser()); getSearcherManager().getPropertyDetailsArchive(catalogid).clearCache(); } public void sortList(WebPageRequest inReq) throws Exception { Searcher searcher = loadSearcher(inReq); String field = inReq.getRequestParameter("field"); String [] id2 = inReq.getRequestParameters("view[]"); ArrayList valuestosave = new ArrayList(); for (int i = 0; i < id2.length; i++) { String dataid = id2[i]; dataid = dataid.replace("||", "_");//This is because of how jquery UI collects the values. Data item = (Data)searcher.searchById(dataid); item.setProperty(field, String.valueOf(i)); valuestosave.add(item); } searcher.saveAllData(valuestosave, inReq.getUser()); } public SearcherManager loadSearcherManager(WebPageRequest inReq) { SearcherManager searcherManager = getSearcherManager(); inReq.putPageValue("searcherManager",searcherManager ); return searcherManager; } public void addValues(WebPageRequest inReq) throws Exception { Data data = (Data)loadData(inReq); String inFieldName = inReq.getRequestParameter("fieldname"); Collection existing = getValues(data,inFieldName); String value = inReq.getRequestParameter(inFieldName + ".value"); if( existing == null) { existing = new ArrayList(); } else { existing = new ArrayList(existing); } if( !existing.contains(value)) { existing.add(value); setValues(data, inFieldName, existing); //getMediaArchive(inReq).saveAsset(data, inReq.getUser()); Searcher searcher = loadSearcher(inReq); searcher.saveData(data, inReq.getUser()); } } public void removeValues(WebPageRequest inReq) throws Exception { Data data = (Data)loadData(inReq); String inFieldName = inReq.getRequestParameter("fieldname"); Collection existing = getValues(data,inFieldName); String value = inReq.getRequestParameter(inFieldName + ".value"); if( existing == null) { existing = new ArrayList(); } else { existing = new ArrayList(existing); } existing.remove(value); setValues(data, inFieldName, existing); Searcher searcher = loadSearcher(inReq); searcher.saveData(data, inReq.getUser()); } //TODO: Move this to Data interface public Collection getValues(Data inData, String inPreference) { String val = inData.get(inPreference); if (val == null) return null; String[] vals = val.split("\\s+"); Collection collection = Arrays.asList(vals); //if null check parent return collection; } public void setValues(Data inData, 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(" "); } } inData.setProperty(inKey,values.toString()); } public void loadModule(WebPageRequest inReq){ String moduleid = inReq.findValue("module"); if(moduleid != null){ inReq.putPageValue("module", moduleid); } } public void loadCorrectViewForUser(WebPageRequest inReq ) throws Exception { String catalogid = resolveCatalogId(inReq); Searcher viewsearcher = getSearcherManager().getSearcher(catalogid, "view"); SearchQuery query = viewsearcher.createSearchQuery(); String module = inReq.findValue("module"); if( module == null ) { throw new OpenEditException("Module not defined"); } query.addMatches("module",module); query.addNot("systemdefined","true"); query.addSortBy("ordering"); PropertyDetailsArchive archive = getSearcherManager().getPropertyDetailsArchive(catalogid); Data currentdata = (Data)inReq.getPageValue("data"); if( currentdata == null ) { currentdata = (Data)inReq.getPageValue("asset"); } Map views = new ListOrderedMap(); for (Iterator iterator = viewsearcher.search(query).iterator(); iterator.hasNext();) { Data view = (Data) iterator.next(); Object permissionvalue = inReq.getPageValue("can" + view.getId() ); if( permissionvalue == null || Boolean.parseBoolean(String.valueOf(permissionvalue)) ) { String type = null; if( currentdata != null ) { type = currentdata.get("assettype"); } String path = null; if( Boolean.parseBoolean( view.get("byassettype") ) ) { path = module + "/assettype/" + type + "/" + view.getId(); if(type == null || !archive.viewExists( path ) ) { path = module + "/assettype/default/" + view.getId(); } } else { path = module + "/" + view.getId(); } views.put(path,view); } } inReq.putPageValue("views", views); } public void saveHtmlEditorContent(WebPageRequest inReq) throws Exception{ String content = inReq.getRequestParameter("content"); if(content != null){ String field = inReq.getRequestParameter("field"); inReq.setRequestParameter(field + ".value", content); } inReq.setRequestParameter("save", "true"); saveData(inReq); } public void rangeSearch(WebPageRequest inReq) throws Exception { //This does a search in a square for the range (+/- the range in both directions from the point String rangeString = inReq.findValue("range"); if(rangeString == null){ rangeString = "10000"; //10 Km default. } String detailid = inReq.findValue("rangefield"); String target = inReq.getRequestParameter(detailid + ".value"); double range = Double.parseDouble(rangeString); range = range / 157253.2964;//convert to decimal degrees (FROM Meters) List positions = getGeoCoder().getPositions(target); if(positions != null && positions.size() > 0){ Position p = (Position)positions.get(0); Double latitude = p.getLatitude(); Double longitude = p.getLongitude(); Double maxlat = latitude + range; Double minlat = latitude - range; Double maxlong = longitude + range; Double minlong = longitude - range; Searcher searcher = loadSearcher(inReq); SearchQuery query = searcher.addStandardSearchTerms(inReq); if(query == null){ query = searcher.createSearchQuery(); } query.addBetween(detailid + "_lat", minlat, maxlat); query.addBetween(detailid + "_lng", minlong, maxlong ); searcher.cachedSearch(inReq, query); } } public GeoCoder getGeoCoder() { if (fieldGeoCoder == null) { fieldGeoCoder = new GeoCoder(); } return fieldGeoCoder; } public void setGeoCoder(GeoCoder inGeoCoder) { fieldGeoCoder = inGeoCoder; } }