From: <aca...@us...> - 2007-05-26 17:18:09
|
Revision: 430 http://geonetwork.svn.sourceforge.net/geonetwork/?rev=430&view=rev Author: acarboni Date: 2007-05-26 10:18:11 -0700 (Sat, 26 May 2007) Log Message: ----------- Massive Javascript refactoring to accomodate harvesting needs Added Paths: ----------- trunk/src/org/fao/geonet/kernel/harvest/harvester/geonet20/ trunk/src/org/fao/geonet/kernel/harvest/harvester/geonet20/Aligner.java trunk/src/org/fao/geonet/kernel/harvest/harvester/geonet20/Geonet20Harvester.java trunk/src/org/fao/geonet/kernel/harvest/harvester/geonet20/GeonetParams.java trunk/src/org/fao/geonet/kernel/harvest/harvester/webdav/ trunk/src/org/fao/geonet/kernel/harvest/harvester/webdav/WebDavHarvester.java trunk/src/org/fao/geonet/kernel/harvest/harvester/webdav/WebDavParams.java trunk/web/scripts/harvesting/ trunk/web/scripts/harvesting/geonet/ trunk/web/scripts/harvesting/geonet/geonetwork.js trunk/web/scripts/harvesting/geonet/model.js trunk/web/scripts/harvesting/geonet/view.js trunk/web/scripts/harvesting/geonet20/ trunk/web/scripts/harvesting/harvester.js trunk/web/scripts/harvesting/harvesting.js trunk/web/scripts/harvesting/model.js trunk/web/scripts/harvesting/util.js trunk/web/scripts/harvesting/view.js trunk/web/scripts/harvesting/webdav/ trunk/web/scripts/harvesting/webdav/model.js trunk/web/scripts/harvesting/webdav/view.js trunk/web/scripts/harvesting/webdav/webdav.js Added: trunk/src/org/fao/geonet/kernel/harvest/harvester/geonet20/Aligner.java =================================================================== --- trunk/src/org/fao/geonet/kernel/harvest/harvester/geonet20/Aligner.java (rev 0) +++ trunk/src/org/fao/geonet/kernel/harvest/harvester/geonet20/Aligner.java 2007-05-26 17:18:11 UTC (rev 430) @@ -0,0 +1,825 @@ +//============================================================================= +//=== Copyright (C) 2001-2007 Food and Agriculture Organization of the +//=== United Nations (FAO-UN), United Nations World Food Programme (WFP) +//=== and United Nations Environment Programme (UNEP) +//=== +//=== This program is free software; you can redistribute it and/or modify +//=== it under the terms of the GNU General Public License as published by +//=== the Free Software Foundation; either version 2 of the License, or (at +//=== your option) any later version. +//=== +//=== This program is distributed in the hope that it will be useful, but +//=== WITHOUT ANY WARRANTY; without even the implied warranty of +//=== MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +//=== General Public License for more details. +//=== +//=== You should have received a copy of the GNU General Public License +//=== along with this program; if not, write to the Free Software +//=== Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +//=== +//=== Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, +//=== Rome - Italy. email: geo...@os... +//============================================================================== + +package org.fao.geonet.kernel.harvest.harvester.geonet20; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import jeeves.exceptions.BadParameterEx; +import jeeves.interfaces.Logger; +import jeeves.resources.dbms.Dbms; +import jeeves.server.context.ServiceContext; +import jeeves.utils.BinaryFile; +import jeeves.utils.XmlRequest; +import org.fao.geonet.constants.Edit; +import org.fao.geonet.constants.Geonet; +import org.fao.geonet.kernel.AccessManager; +import org.fao.geonet.kernel.DataManager; +import org.fao.geonet.kernel.harvest.harvester.CategoryMapper; +import org.fao.geonet.kernel.harvest.harvester.GroupMapper; +import org.fao.geonet.kernel.harvest.harvester.UUIDMapper; +import org.fao.geonet.kernel.mef.MEFLib; +import org.fao.geonet.kernel.mef.MEFVisitor; +import org.fao.geonet.lib.Lib; +import org.fao.geonet.util.ISODate; +import org.jdom.Element; + +//============================================================================= + +public class Aligner +{ + //-------------------------------------------------------------------------- + //--- + //--- Constructor + //--- + //-------------------------------------------------------------------------- + + public Aligner(Logger log, XmlRequest req, GeonetParams params, DataManager dm, + Dbms dbms, ServiceContext sc, CategoryMapper cm, GroupMapper gm, + Element remoteInfo) + { + this.log = log; + this.req = req; + this.params = params; + this.dataMan = dm; + this.dbms = dbms; + this.context = sc; + this.localCateg = cm; + this.localGroups= gm; + + //--- save remote categories and groups into hashmaps for a fast access + + List list = remoteInfo.getChild("categories").getChildren("category"); + setupLocEntity(list, hmRemoteCateg); + + list = remoteInfo.getChild("groups").getChildren("group"); + setupLocEntity(list, hmRemoteGroups); + } + + //-------------------------------------------------------------------------- + + private void setupLocEntity(List list, HashMap<String, HashMap<String, String>> hmEntity) + { + + for (int i=0; i<list.size(); i++) + { + Element entity= (Element) list.get(i); + String name = entity.getChildText("name"); + + HashMap<String, String> hm = new HashMap<String, String>(); + hmEntity.put(name, hm); + + List labels = entity.getChild("label").getChildren(); + + for (int j=0; j<labels.size(); j++) + { + Element el = (Element) labels.get(j); + hm.put(el.getName(), el.getText()); + } + } + } + + //-------------------------------------------------------------------------- + //--- + //--- Alignment method + //--- + //-------------------------------------------------------------------------- + + public AlignerResult align(Element result, String siteId) throws Exception + { + log.info("Start of alignment for site-id="+ siteId); + + this.result = new AlignerResult(); + this.result.siteId = siteId; + + List mdList = result.getChildren("metadata"); + + //----------------------------------------------------------------------- + //--- retrieve local uuids for given site-id + + localUuids = new UUIDMapper(dbms, siteId); + + //----------------------------------------------------------------------- + //--- remove old metadata + + for (String uuid : localUuids.getUUIDs()) + if (!exists(mdList, uuid)) + { + String id = localUuids.getID(uuid); + + log.debug(" - Removing old metadata with id="+ id); + dataMan.deleteMetadata(dbms, id); + dbms.commit(); + this.result.locallyRemoved++; + } + + //----------------------------------------------------------------------- + //--- insert/update new metadata + + for(Iterator i=mdList.iterator(); i.hasNext(); ) + { + Element info = ((Element) i.next()).getChild("info", Edit.NAMESPACE); + + String remoteId = info.getChildText("id"); + String remoteUuid= info.getChildText("uuid"); + String schema = info.getChildText("schema"); + String changeDate= info.getChildText("changeDate"); + + this.result.totalMetadata++; + + log.debug("Obtained remote id="+ remoteId +", changeDate="+ changeDate); + + if (!dataMan.existsSchema(schema)) + { + log.debug(" - Skipping unsupported schema : "+ schema); + this.result.schemaSkipped++; + } + else + { + String id = dataMan.getMetadataId(dbms, remoteUuid); + + File mefFile = retrieveMEF(remoteUuid); + + try + { + if (id == null) id = addMetadata(siteId, info, mefFile); + else updateMetadata(siteId, info, id, mefFile); + } + finally + { + mefFile.delete(); + } + + dbms.commit(); + dataMan.indexMetadata(dbms, id); + } + } + + log.info("End of alignment for site-id="+ siteId); + + return this.result; + } + + //-------------------------------------------------------------------------- + //--- + //--- Private methods : addMetadata + //--- + //-------------------------------------------------------------------------- + + private String addMetadata(final String siteId, final Element info, + File mefFile) throws Exception + { + final String id[] = { "" }; + + //--- import metadata from MEF file + + MEFLib.visit(mefFile, new MEFVisitor() + { + public void handleMetadata(Element md) throws Exception + { + String remoteId = info.getChildText("id"); + String remoteUuid = info.getChildText("uuid"); + String schema = info.getChildText("schema"); + String createDate = info.getChildText("createDate"); + String changeDate = info.getChildText("changeDate"); + String isTemplate = info.getChildText("isTemplate"); + + log.debug(" - Adding metadata with remote id="+ remoteId); + + id[0] = dataMan.insertMetadataExt(dbms, schema, md, context.getSerialFactory(), + siteId, createDate, changeDate, remoteUuid, null); + + int iId = Integer.parseInt(id[0]); + + dataMan.setTemplate(dbms, iId, isTemplate, null); + dataMan.setHarvestedBit(dbms, iId, true); + + String pubDir = Lib.resource.getDir(context, "public", id[0]); + String priDir = Lib.resource.getDir(context, "private", id[0]); + + new File(pubDir).mkdirs(); + new File(priDir).mkdirs(); + + result.addedMetadata++; + } + + //-------------------------------------------------------------------- + + public void handleInfo(Element info) throws Exception + { + addCategories(id[0], info.getChild("categories")); + addPrivileges(id[0], info.getChild("privileges")); + } + + //-------------------------------------------------------------------- + + public void handlePublicFile(String file, String changeDate, InputStream is) throws IOException + { + log.debug(" - Adding remote public file with name="+ file); + String pubDir = Lib.resource.getDir(context, "public", id[0]); + + File outFile = new File(pubDir, file); + FileOutputStream os = new FileOutputStream(outFile); + BinaryFile.copy(is, os, false, true); + outFile.setLastModified(new ISODate(changeDate).getSeconds() * 1000); + } + + //-------------------------------------------------------------------- + + public void handlePrivateFile(String file, String changeDate, InputStream is) {} + }); + + return id[0]; + } + + //-------------------------------------------------------------------------- + //--- Categories + //-------------------------------------------------------------------------- + + private void addCategories(String id, Element categ) throws Exception + { + List list = categ.getChildren("category"); + + for(Iterator j=list.iterator(); j.hasNext();) + { + String catName = ((Element) j.next()).getAttributeValue("name"); + String catId = localCateg.getID(catName); + + if (catId != null) + { + //--- remote category exists locally + + log.debug(" - Setting category : "+ catName); + dataMan.setCategory(dbms, id, catId); + } + + else if (params.createCateg) + { + //--- the remote category does not exist locally : create it + + log.debug(" - Creating local category : "+ catName); + catId = createCategory(catName) +""; + + log.debug(" - Setting category : "+ catName); + dataMan.setCategory(dbms, id, catId); + } + } + } + + //-------------------------------------------------------------------------- + + private int createCategory(String name) throws Exception + { + Map<String, String> hm = hmRemoteCateg.get(name); + + if (hm == null) + throw new BadParameterEx("Specified category was not found remotely", name); + + int id = context.getSerialFactory().getSerial(dbms, "Categories"); + + dbms.execute("INSERT INTO Categories(id, name) VALUES (?, ?)", id, name); + Lib.local.insert(dbms, "Categories", id, hm, "<"+name+">"); + + localCateg.add(name, id+""); + + return id; + } + + //-------------------------------------------------------------------------- + //--- Privileges + //-------------------------------------------------------------------------- + + private void addPrivileges(String id, Element privil) throws Exception + { + List list = privil.getChildren("group"); + + for (int i=0; i<list.size(); i++) + { + Element group = (Element) list.get(i); + String grpName = group.getAttributeValue("name"); + String grpId = localGroups.getID(grpName); + + if (grpId != null) + { + //--- remote group exists locally + + log.debug(" - Setting privileges for group : "+ grpName); + addOperations(group, id, grpId); + } + + else if (params.createGroups) + { + //--- the remote group does not exist locally : create it + + log.debug(" - Creating local group : "+ grpName); + grpId = createGroup(grpName) +""; + + log.debug(" - Setting privileges for group : "+ grpName); + addOperations(group, id, grpId); + } + } + } + + //-------------------------------------------------------------------------- + + private void addOperations(Element group, String id, String grpId) throws Exception + { + List opers = group.getChildren("operation"); + + for (int j=0; j<opers.size(); j++) + { + Element oper = (Element) opers.get(j); + String opName = oper.getAttributeValue("name"); + + int opId = dataMan.getAccessManager().getPrivilegeId(opName); + + log.debug(" --> "+ opName); + dataMan.setOperation(dbms, id, grpId, opId +""); + } + } + + //-------------------------------------------------------------------------- + + private int createGroup(String name) throws Exception + { + Map<String, String> hm = hmRemoteGroups.get(name); + + if (hm == null) + throw new BadParameterEx("Specified group was not found remotely", name); + + int id = context.getSerialFactory().getSerial(dbms, "Groups"); + + dbms.execute("INSERT INTO Groups(id, name) VALUES (?, ?)", id, name); + Lib.local.insert(dbms, "Groups", id, hm, "<"+name+">"); + + localGroups.add(name, id +""); + + return id; + } + + //-------------------------------------------------------------------------- + //--- + //--- Private methods : updateMetadata + //--- + //-------------------------------------------------------------------------- + + private void updateMetadata(String siteId, Element info, final String id, + File mefFile) throws Exception + { + //String remoteId = info.getChildText("id"); + final String remoteUuid= info.getChildText("uuid"); + final String changeDate= info.getChildText("changeDate"); + + final Element thumbs[] = { null }; + + if (localUuids.getID(remoteUuid) == null) + { + log.error(" - Warning! The remote uuid '"+ remoteUuid +"' does not belong to site '"+ siteId+"'"); + log.error(" - The site id of this metadata has been changed."); + log.error(" - The metadata update will be skipped."); + + result.uuidSkipped++; + } + else + { + MEFLib.visit(mefFile, new MEFVisitor() + { + public void handleMetadata(Element md) throws Exception + { + updateMetadata(id, md, remoteUuid, changeDate); + } + + //----------------------------------------------------------------- + + public void handleInfo(Element info) throws Exception + { + updateCategories(id, info.getChild("categories")); + updatePrivileges(id, info.getChild("privileges")); + thumbs[0] = info.getChild("thumbnails"); + } + + //----------------------------------------------------------------- + + public void handlePublicFile(String file, String changeDate, InputStream is) throws IOException + { + updateFile(id, file, changeDate, is, thumbs[0]); + } + + //----------------------------------------------------------------- + + public void handlePrivateFile(String file, String changeDate, InputStream is) {} + }); + } + } + + //-------------------------------------------------------------------------- + + private void updateMetadata(String id, Element md, String remoteUuid, + String changeDate) throws Exception + { + String date = localUuids.getChangeDate(remoteUuid); + + if (!updateCondition(date, changeDate)) + { + log.debug(" - XML not changed to local metadata with id="+ id); + result.unchangedMetadata++; + } + else + { + log.debug(" - Updating local metadata with id="+ id); + dataMan.updateMetadataExt(dbms, id, md, changeDate); + + result.updatedMetadata++; + } + } + + //-------------------------------------------------------------------------- + + private void updateCategories(String id, Element categs) throws Exception + { + List catList = categs.getChildren("category"); + + //--- remove old categories + + List locCateg = dataMan.getCategories(dbms, id).getChildren(); + + for (int i=0; i<locCateg.size(); i++) + { + Element el = (Element) locCateg.get(i); + + String catId = el.getChildText("id"); + String catName = el.getChildText("name"); + + if (!existsCategory(catList, catName)) + { + log.debug(" - Unsetting category : "+ catName); + dataMan.unsetCategory(dbms, id, catId); + } + } + + //--- add new categories + + for (Iterator j=catList.iterator(); j.hasNext();) + { + Element categ = (Element) j.next(); + String catName = categ.getAttributeValue("name"); + String catId = localCateg.getID(catName); + + if (catId != null) + { + //--- it is not necessary to query the db. Anyway... + if (!dataMan.isCategorySet(dbms, id, catId)) + { + log.debug(" - Setting category : "+ catName); + dataMan.setCategory(dbms, id, catId); + } + } + + else if (params.createCateg) + { + //--- the remote category does not exist locally : create it + + log.debug(" - Creating local category : "+ catName); + catId = createCategory(catName) +""; + + log.debug(" - Setting category : "+ catName); + dataMan.setCategory(dbms, id, catId); + } + } + } + + //-------------------------------------------------------------------------- + + private boolean existsCategory(List catList, String name) + { + for(Iterator i=catList.iterator(); i.hasNext();) + { + Element categ = (Element) i.next(); + String catName = categ.getAttributeValue("name"); + + if (catName.equals(name)) + return true; + } + + return false; + } + + //-------------------------------------------------------------------------- + + private void updatePrivileges(String id, Element privil) throws Exception + { + List grpList = privil.getChildren("group"); + + //--- remove old operations + + List locOper = getOperations(dbms, id).getChildren(); + + for (int i=0; i<locOper.size(); i++) + { + Element oper = (Element) locOper.get(i); + String grpName = oper.getChildText("grpname"); + String operName = oper.getChildText("opname"); + + int grpId = Integer.parseInt(oper.getChildText("grpid")); + int operId = Integer.parseInt(oper.getChildText("opid")); + + if (!existsOperation(grpList, grpName, operName)) + { + log.debug(" - Unsetting operation : "+ grpName +"/"+ operName); + dataMan.unsetOperation(dbms, new Integer(id), grpId, operId); + } + } + + //--- add new operations + + for (int i=0; i<grpList.size(); i++) + { + Element group = (Element) grpList.get(i); + String grpName = group.getAttributeValue("name"); + String grpId = localGroups.getID(grpName); + + if (grpId != null) + updateOperations(group, id, grpId, grpName, locOper); + + else if (params.createGroups) + { + //--- the remote group does not exist locally : create it + + log.debug(" - Creating local group : "+ grpName); + grpId = createGroup(grpName) +""; + + log.debug(" - Setting privileges for group : "+ grpName); + addOperations(group, id, grpId); + } + } + } + + //-------------------------------------------------------------------------- + + private Element getOperations(Dbms dbms, String mdId) throws Exception + { + String query = "SELECT G.id as grpId, O.id as opId, G.name AS grpName, O.name as opName "+ + "FROM Groups G, Operations O, OperationAllowed "+ + "WHERE G.id=groupId AND O.id=operationId AND metadataId=?"; + + return dbms.select(query, new Integer(mdId)); + } + + //-------------------------------------------------------------------------- + + private void updateOperations(Element group, String id, String grpId, + String grpName, List locOper) throws Exception + { + List opers = group.getChildren("operation"); + + for (int j=0; j<opers.size(); j++) + { + Element oper = (Element) opers.get(j); + String opName = oper.getAttributeValue("name"); + String opId = dataMan.getAccessManager().getPrivilegeId(opName) +""; + + if (!isOperationSet(locOper, grpId, opId)) + { + log.debug(" - Setting operation : "+ grpName +"/"+ opName); + dataMan.setOperation(dbms, id, grpId, opId +""); + } + } + } + + //-------------------------------------------------------------------------- + + private boolean existsOperation(List list, String grpName, String operName) + { + for (int i=0; i<list.size(); i++) + { + Element group = (Element) list.get(i); + + if (grpName.equals(group.getAttributeValue("name"))) + { + List operList = group.getChildren("operation"); + + for (int j=0; j<operList.size(); j++) + { + Element oper = (Element) operList.get(j); + + if (operName.equals(oper.getAttributeValue("name"))) + return true; + } + + //--- there can be only 1 group with a given name + return false; + } + } + + return false; + } + + //-------------------------------------------------------------------------- + + private boolean isOperationSet(List locOpers, String grpId, String operId) + { + for (int i=0; i<locOpers.size(); i++) + { + Element oper = (Element) locOpers.get(i); + + String gId = oper.getChildText("grpid"); + String oId = oper.getChildText("opid"); + + if (grpId.equals(gId) && operId.equals(oId)) + return true; + } + + return false; + } + + //-------------------------------------------------------------------------- + //--- Public file update methods + //-------------------------------------------------------------------------- + + private void updateFile(String id, String file, String changeDate, InputStream is, + Element files) throws IOException + { + if (files == null) + log.debug(" - No 'public' element in info.xml. Cannot update public file :"+ file); + else + { + removeOldFile(id, files); + updateChangedFile(id, file, changeDate, is); + } + } + + //-------------------------------------------------------------------------- + + private void removeOldFile(String id, Element infoFiles) + { + File pubDir = new File(Lib.resource.getDir(context, "public", id)); + + File files[] = pubDir.listFiles(); + + if (files == null) + log.error(" - Cannot scan directory for public files : "+ pubDir.getAbsolutePath()); + + else for (File file : files) + if (!existsFile(file.getName(), infoFiles)) + { + log.debug(" - Removing old public file with name="+ file.getName()); + file.delete(); + } + } + + //-------------------------------------------------------------------------- + + private boolean existsFile(String fileName, Element files) + { + List list = files.getChildren("file"); + + for (int i=0; i<list.size(); i++) + { + Element elem = (Element) list.get(i); + String name = elem.getAttributeValue("name"); + + if (fileName.equals(name)) + return true; + } + + return false; + } + + //-------------------------------------------------------------------------- + + private void updateChangedFile(String id, String file, String changeDate, + InputStream is) throws IOException + { + String pubDir = Lib.resource.getDir(context, "public", id); + File locFile = new File(pubDir, file); + + ISODate locIsoDate = new ISODate(locFile.lastModified()); + ISODate remIsoDate = new ISODate(changeDate); + + if (!locFile.exists() || remIsoDate.sub(locIsoDate) > 0) + { + log.debug(" - Adding remote public file with name="+ file); + + FileOutputStream os = new FileOutputStream(locFile); + BinaryFile.copy(is, os, false, true); + locFile.setLastModified(remIsoDate.getSeconds() * 1000); + } + else + { + log.debug(" - Nothing to do to public file with name="+ file); + } + } + + //-------------------------------------------------------------------------- + //--- + //--- Private methods + //--- + //-------------------------------------------------------------------------- + + /** Return true if the sourceId is present in the remote site */ + + private boolean exists(List mdList, String uuid) + { + for(Iterator i=mdList.iterator(); i.hasNext(); ) + { + Element elInfo = ((Element) i.next()).getChild("info", Edit.NAMESPACE); + + if (uuid.equals(elInfo.getChildText("uuid"))) + return true; + } + + return false; + } + + //-------------------------------------------------------------------------- + + private File retrieveMEF(String uuid) throws IOException + { + req.clearParams(); + req.addParam("uuid", uuid); + req.addParam("format", "partial"); + + req.setAddress("/"+ params.servlet +"/srv/en/"+ Geonet.Service.MEF_EXPORT); + + File tempFile = File.createTempFile("temp-", ".dat"); + req.executeLarge(tempFile); + + return tempFile; + } + + //-------------------------------------------------------------------------- + + private boolean updateCondition(String localDate, String remoteDate) + { + ISODate local = new ISODate(localDate); + ISODate remote= new ISODate(remoteDate); + + //--- accept if remote date is greater than local date + + return (remote.sub(local) > 0); + } + + //-------------------------------------------------------------------------- + //--- + //--- Variables + //--- + //-------------------------------------------------------------------------- + + private Dbms dbms; + private Logger log; + private XmlRequest req; + private GeonetParams params; + private DataManager dataMan; + private ServiceContext context; + private CategoryMapper localCateg; + private GroupMapper localGroups; + private UUIDMapper localUuids; + private AlignerResult result; + + private HashMap<String, HashMap<String, String>> hmRemoteCateg = new HashMap<String, HashMap<String, String>>(); + private HashMap<String, HashMap<String, String>> hmRemoteGroups = new HashMap<String, HashMap<String, String>>(); +} + +//============================================================================= + +class AlignerResult +{ + public String siteId; + + public int totalMetadata; + public int addedMetadata; + public int updatedMetadata; + public int unchangedMetadata; + public int locallyRemoved; + public int schemaSkipped; + public int uuidSkipped; +} + +//============================================================================= + Added: trunk/src/org/fao/geonet/kernel/harvest/harvester/geonet20/Geonet20Harvester.java =================================================================== --- trunk/src/org/fao/geonet/kernel/harvest/harvester/geonet20/Geonet20Harvester.java (rev 0) +++ trunk/src/org/fao/geonet/kernel/harvest/harvester/geonet20/Geonet20Harvester.java 2007-05-26 17:18:11 UTC (rev 430) @@ -0,0 +1,407 @@ +//============================================================================= +//=== Copyright (C) 2001-2007 Food and Agriculture Organization of the +//=== United Nations (FAO-UN), United Nations World Food Programme (WFP) +//=== and United Nations Environment Programme (UNEP) +//=== +//=== This program is free software; you can redistribute it and/or modify +//=== it under the terms of the GNU General Public License as published by +//=== the Free Software Foundation; either version 2 of the License, or (at +//=== your option) any later version. +//=== +//=== This program is distributed in the hope that it will be useful, but +//=== WITHOUT ANY WARRANTY; without even the implied warranty of +//=== MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +//=== General Public License for more details. +//=== +//=== You should have received a copy of the GNU General Public License +//=== along with this program; if not, write to the Free Software +//=== Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +//=== +//=== Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, +//=== Rome - Italy. email: geo...@os... +//============================================================================== + +package org.fao.geonet.kernel.harvest.harvester.geonet20; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import jeeves.exceptions.BadInputEx; +import jeeves.exceptions.BadServerResponseEx; +import jeeves.exceptions.UserNotFoundEx; +import jeeves.interfaces.Logger; +import jeeves.resources.dbms.Dbms; +import jeeves.server.context.ServiceContext; +import jeeves.server.resources.ResourceManager; +import jeeves.utils.Xml; +import jeeves.utils.XmlRequest; +import org.fao.geonet.constants.Geonet; +import org.fao.geonet.kernel.harvest.Common.Status; +import org.fao.geonet.kernel.harvest.harvester.AbstractHarvester; +import org.fao.geonet.kernel.harvest.harvester.CategoryMapper; +import org.fao.geonet.kernel.harvest.harvester.GroupMapper; +import org.fao.geonet.lib.Lib; +import org.jdom.Element; + +//============================================================================= + +public class Geonet20Harvester extends AbstractHarvester +{ + //-------------------------------------------------------------------------- + //--- + //--- Static init + //--- + //-------------------------------------------------------------------------- + + public static void init(ServiceContext context) throws Exception + { + } + + //-------------------------------------------------------------------------- + //--- + //--- Harvesting type + //--- + //-------------------------------------------------------------------------- + + public String getType() { return "geonetwork20"; } + + //-------------------------------------------------------------------------- + //--- + //--- Init + //--- + //-------------------------------------------------------------------------- + + protected void doInit(Element node) + { + params.init(node); + } + + //--------------------------------------------------------------------------- + //--- + //--- Destroy + //--- + //--------------------------------------------------------------------------- + + protected void doDestroy(Dbms dbms) throws SQLException + { + String getQuery = "SELECT id FROM Metadata WHERE source = ?"; + + String opAllQuery = "DELETE FROM OperationAllowed WHERE metadataId = ?"; + String mdCatQuery = "DELETE FROM MetadataCateg WHERE metadataId = ?"; + String mdQuery = "DELETE FROM Metadata WHERE source = ?"; + + for (Search s : params.getSearches()) + { + for (Object o : dbms.select(getQuery, s.siteId).getChildren()) + { + Element el = (Element) o; + int id = Integer.parseInt(el.getChildText("id")); + + dbms.execute(opAllQuery, id); + dbms.execute(mdCatQuery, id); + } + + dbms.execute(mdQuery, s.siteId); + } + } + + //--------------------------------------------------------------------------- + //--- + //--- Add + //--- + //--------------------------------------------------------------------------- + + protected String doAdd(Dbms dbms, Element node) throws BadInputEx, SQLException + { + //--- retrieve/initialize information + + params.create(node); + + //--- setup geonetwork node + + String id = settingMan.add(dbms, "harvesting", "node", getType()); + String path = "id:"+ id; + + String siteID = settingMan.add(dbms, path, "site", ""); + String optionsID = settingMan.add(dbms, path, "options", ""); + String infoID = settingMan.add(dbms, path, "info", ""); + + //--- setup site node ---------------------------------------- + + settingMan.add(dbms, "id:"+siteID, "name", node.getAttributeValue("name")); + settingMan.add(dbms, "id:"+siteID, "host", params.host); + settingMan.add(dbms, "id:"+siteID, "port", params.port); + settingMan.add(dbms, "id:"+siteID, "servlet", params.servlet); + + String useAccID = settingMan.add(dbms, "id:"+siteID, "useAccount", params.useAccount); + + settingMan.add(dbms, "id:"+useAccID, "username", params.username); + settingMan.add(dbms, "id:"+useAccID, "password", params.password); + + //--- setup search nodes --------------------------------------- + + addSearches(dbms, path, params); + + //--- setup options node --------------------------------------- + + settingMan.add(dbms, "id:"+optionsID, "every", params.every); + settingMan.add(dbms, "id:"+optionsID, "createGroups", params.createGroups); + settingMan.add(dbms, "id:"+optionsID, "createCateg", params.createCateg); + settingMan.add(dbms, "id:"+optionsID, "oneRunOnly", params.oneRunOnly); + settingMan.add(dbms, "id:"+optionsID, "status", Status.INACTIVE); + + //--- setup stats node ---------------------------------------- + + settingMan.add(dbms, "id:"+infoID, "lastRun", ""); + + return id; + } + + //--------------------------------------------------------------------------- + //--- + //--- Update + //--- + //--------------------------------------------------------------------------- + + protected void doUpdate(Dbms dbms, String id, Element node) throws BadInputEx, SQLException + { + //--- update variables + + GeonetParams copy = params.copy(); + copy.update(node); + + //--- update database + + Element site = node.getChild("site"); + Element opt = node.getChild("options"); + Element searches = node.getChild("searches"); + Element account = (site == null) ? null : site.getChild("account"); + + String path = "harvesting/id:"+ id; + String name = node.getAttributeValue("name"); + + Map<String, Object> values = new HashMap<String, Object>(); + + if (name != null) + values.put(path +"/site/name", name); + + setValue(values, path +"/site/host", site, "host"); + setValue(values, path +"/site/port", site, "port"); + setValue(values, path +"/site/servlet", site, "servlet"); + + setValue(values, path +"/site/useAccount", account, "use"); + setValue(values, path +"/site/useAccount/username", account, "username"); + setValue(values, path +"/site/useAccount/password", account, "password"); + + setValue(values, path +"/options/every", opt, "every"); + setValue(values, path +"/options/createGroups", opt, "createGroups"); + setValue(values, path +"/options/createCateg", opt, "createCateg"); + setValue(values, path +"/options/oneRunOnly", opt, "oneRunOnly"); + + settingMan.setValues(dbms, values); + + //--- update the search entry if some 'search' elements are provided + + if (searches != null) + { + //--- remove all search entries + + Iterator oldSearches = settingMan.get(path ,1).getChild("children").getChildren("search").iterator(); + + while (oldSearches.hasNext()) + { + Element search = (Element) oldSearches.next(); + String searchId = search.getAttributeValue("id"); + + settingMan.remove(dbms, path +"/id:"+ searchId); + } + + //--- add new search entries + + addSearches(dbms, path, copy); + } + + //--- we update a copy first because if there is an exception GeonetParams + //--- could be half updated and so it could be in an inconsistent state + + params = copy; + } + + //--------------------------------------------------------------------------- + + private void addSearches(Dbms dbms, String path, GeonetParams params) throws SQLException + { + for (Search s : params.getSearches()) + { + String searchID = settingMan.add(dbms, path, "search", ""); + + settingMan.add(dbms, "id:"+searchID, "freeText", s.freeText); + settingMan.add(dbms, "id:"+searchID, "title", s.title); + settingMan.add(dbms, "id:"+searchID, "abstract", s.abstrac); + settingMan.add(dbms, "id:"+searchID, "keywords", s.keywords); + settingMan.add(dbms, "id:"+searchID, "digital", s.digital); + settingMan.add(dbms, "id:"+searchID, "hardcopy", s.hardcopy); + settingMan.add(dbms, "id:"+searchID, "siteId", s.siteId); + } + } + + //--------------------------------------------------------------------------- + //--- + //--- GetTimeout + //--- + //--------------------------------------------------------------------------- + + protected int doGetEvery() { return params.every; } + + //--------------------------------------------------------------------------- + + protected boolean doIsOneRunOnly() { return params.oneRunOnly; } + + //--------------------------------------------------------------------------- + //--- + //--- AddInfo + //--- + //--------------------------------------------------------------------------- + + protected void doAddInfo(Element node) + { + Element info = node.getChild("info"); + Element searches = node.getChild("searches"); + + //--- if the harvesting is not started yet, we don't have any info + + if (result == null) + return; + + //--- ok, add proper info + + for (AlignerResult ar : result.alResult) + { + Element site = new Element("search"); + site.setAttribute("siteId", ar.siteId); + + add(site, "total", ar.totalMetadata); + add(site, "added", ar.addedMetadata); + add(site, "updated", ar.updatedMetadata); + add(site, "unchanged", ar.unchangedMetadata); + add(site, "skipped", ar.schemaSkipped+ ar.uuidSkipped); + add(site, "removed", ar.locallyRemoved); + + info.addContent(site); + } + } + + //--------------------------------------------------------------------------- + + private void add(Element el, String name, int value) + { + el.addContent(new Element(name).setText(Integer.toString(value))); + } + + //--------------------------------------------------------------------------- + //--- + //--- Harvest + //--- + //--------------------------------------------------------------------------- + + protected void doHarvest(Logger log, ResourceManager rm) throws Exception + { + Dbms dbms = (Dbms) rm.open(Geonet.Res.MAIN_DB); + + CategoryMapper localCateg = new CategoryMapper(dbms); + GroupMapper localGroups= new GroupMapper(dbms); + + XmlRequest req = new XmlRequest(params.host, params.port); + + Lib.net.setupProxy(context, req); + + //--- login + + if (params.useAccount) + { + log.info("Login into : "+ getName()); + + req.setAddress("/"+ params.servlet +"/srv/en/"+ Geonet.Service.XML_LOGIN); + req.addParam("username", params.username); + req.addParam("password", params.password); + + Element response = req.execute(); + + if (!response.getName().equals("ok")) + throw new UserNotFoundEx(params.username); + } + + //--- retrieve info on categories and groups + + log.info("Retrieving info on categories and groups from : "+ getName()); + + req.setAddress("/"+ params.servlet +"/srv/en/"+ Geonet.Service.XML_INFO); + req.clearParams(); + req.addParam("type", "site"); + req.addParam("type", "categories"); + req.addParam("type", "groups"); + req.addParam("type", "knownNodes"); + + Element remoteInfo = req.execute(); + + if (!remoteInfo.getName().equals("info")) + throw new BadServerResponseEx(remoteInfo); + + //--- search + + result = new GeonetResult(); + + Aligner aligner = new Aligner(log, req, params, dataMan, dbms, context, + localCateg, localGroups, remoteInfo); + + for(Search s : params.getSearches()) + { + log.info("Searching on : "+ getName() +"/"+ s.siteId); + + req.setAddress("/"+ params.servlet +"/srv/en/"+ Geonet.Service.XML_SEARCH); + + Element searchResult = req.execute(s.createRequest()); + + log.debug("Obtained:\n"+Xml.getString(searchResult)); + + //--- site alignment + AlignerResult ar = aligner.align(searchResult, s.siteId); + + //--- collect some stats + result.alResult.add(ar); + } + + //--- logout + + if (params.useAccount) + { + log.info("Logout from : "+ getName()); + + req.clearParams(); + req.setAddress("/"+ params.servlet +"/srv/en/"+ Geonet.Service.XML_LOGOUT); + } + + dbms.commit(); + } + + //--------------------------------------------------------------------------- + //--- + //--- Variables + //--- + //--------------------------------------------------------------------------- + + private GeonetParams params = new GeonetParams(); + private GeonetResult result = null; +} + +//============================================================================= + +class GeonetResult +{ + public ArrayList<AlignerResult> alResult = new ArrayList<AlignerResult>(); +} + +//============================================================================= + Added: trunk/src/org/fao/geonet/kernel/harvest/harvester/geonet20/GeonetParams.java =================================================================== --- trunk/src/org/fao/geonet/kernel/harvest/harvester/geonet20/GeonetParams.java (rev 0) +++ trunk/src/org/fao/geonet/kernel/harvest/harvester/geonet20/GeonetParams.java 2007-05-26 17:18:11 UTC (rev 430) @@ -0,0 +1,310 @@ +//============================================================================= +//=== Copyright (C) 2001-2007 Food and Agriculture Organization of the +//=== United Nations (FAO-UN), United Nations World Food Programme (WFP) +//=== and United Nations Environment Programme (UNEP) +//=== +//=== This program is free software; you can redistribute it and/or modify +//=== it under the terms of the GNU General Public License as published by +//=== the Free Software Foundation; either version 2 of the License, or (at +//=== your option) any later version. +//=== +//=== This program is distributed in the hope that it will be useful, but +//=== WITHOUT ANY WARRANTY; without even the implied warranty of +//=== MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +//=== General Public License for more details. +//=== +//=== You should have received a copy of the GNU General Public License +//=== along with this program; if not, write to the Free Software +//=== Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +//=== +//=== Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, +//=== Rome - Italy. email: geo...@os... +//============================================================================== + +package org.fao.geonet.kernel.harvest.harvester.geonet20; + +import java.util.ArrayList; +import java.util.Iterator; +import jeeves.exceptions.BadInputEx; +import jeeves.exceptions.BadParameterEx; +import org.fao.geonet.kernel.harvest.harvester.AbstractParams; +import org.fao.geonet.lib.Lib; +import org.jdom.Element; + +//============================================================================= + +public class GeonetParams extends AbstractParams +{ + //-------------------------------------------------------------------------- + //--- + //--- Init : called when an entry is read from database. Vars are initialized + //--- from the given entry + //--- + //-------------------------------------------------------------------------- + + public void init(Element node) + { + Element site = node.getChild("site"); + Element opt = node.getChild("options"); + Element searches = node.getChild("searches"); + Element account = site.getChild("account"); + + host = site.getChildText("host"); + port = Integer.parseInt(site.getChildText("port")); + servlet = site.getChildText("servlet"); + + useAccount = account.getChildText("use").equals("true"); + username = account.getChildText("username"); + password = account.getChildText("password"); + + every = Integer.parseInt(opt.getChildText("every")); + createGroups = opt.getChildText("createGroups").equals("true"); + createCateg = opt.getChildText("createCateg") .equals("true"); + oneRunOnly = opt.getChildText("oneRunOnly") .equals("true"); + + //--- add searches + + alSearches.clear(); + + Iterator i = searches.getChildren("search").iterator(); + + while (i.hasNext()) + { + Element search = (Element) i.next(); + + Search s = new Search(); + + s.freeText = search.getChildText("freeText"); + s.title = search.getChildText("title"); + s.abstrac = search.getChildText("abstract"); + s.keywords = search.getChildText("keywords"); + s.digital = search.getChildText("digital") .equals("true"); + s.hardcopy = search.getChildText("hardcopy").equals("true"); + s.siteId = search.getChildText("siteId"); + + alSearches.add(s); + } + } + + //--------------------------------------------------------------------------- + //--- + //--- Create : called when a new entry must be added. Reads values from the + //--- provided entry, providing default values + //--- + //--------------------------------------------------------------------------- + + public void create(Element node) throws BadInputEx + { + Element site = node.getChild("site"); + Element opt = node.getChild("options"); + Element searches = node.getChild("searches"); + Element account = (site == null) ? null : site.getChild("account"); + + host = getValue(site, "host", ""); + port = getValue(site, "port", 80); + servlet = getValue(site, "servlet", "geonetwork"); + + useAccount = getValue(account, "use", false); + username = getValue(account, "username", ""); + password = getValue(account, "password", ""); + + createGroups = getValue(opt, "createGroups", true ); + createCateg = getValue(opt, "createCateg", true ); + oneRunOnly = getValue(opt, "oneRunOnly", false); + every = getValue(opt, "every", 90 ); + + checkEvery(every); + checkPort(port); + addSearches(searches); + } + + //--------------------------------------------------------------------------- + //--- + //--- Update : called when an entry has changed and variables must be updated + //--- + //--------------------------------------------------------------------------- + + public void update(Element node) throws BadInputEx + { + Element site = node.getChild("site"); + Element opt = node.getChild("options"); + Element searches = node.getChild("searches"); + Element account = (site == null) ? null : site.getChild("account"); + + host = getValue(site, "host", host); + port = getValue(site, "port", port); + servlet = getValue(site, "servlet", servlet); + + useAccount = getValue(account, "use", useAccount); + username = getValue(account, "username", username); + password = getValue(account, "password", password); + + every = getValue(opt, "every", every); + createGroups = getValue(opt, "createGroups", createGroups); + createCateg = getValue(opt, "createCateg", createCateg); + oneRunOnly = getValue(opt, "oneRunOnly", oneRunOnly); + + checkEvery(every); + checkPort(port); + + //--- if some search queries are given, we drop the previous ones and + //--- set these new ones + + if (searches != null) + addSearches(searches); + } + + //--------------------------------------------------------------------------- + //--- + //--- Other API methods + //--- + //--------------------------------------------------------------------------- + + public Iterable<Search> getSearches() { return alSearches; } + + //--------------------------------------------------------------------------- + + public GeonetParams copy() + { + GeonetParams copy = new GeonetParams(); + + copy.host = host; + copy.port = port; + copy.servlet = servlet; + + copy.useAccount = useAccount; + copy.username = username; + copy.password = password; + + copy.every = every; + copy.createGroups = createGroups; + copy.createCateg = createCateg; + copy.oneRunOnly = oneRunOnly; + + for (Search s : alSearches) + copy.alSearches.add(s.copy()); + + return copy; + } + + //--------------------------------------------------------------------------- + //--- + //--- Private methods + //--- + //--------------------------------------------------------------------------- + + private void addSearches(Element searches) throws BadInputEx + { + alSearches.clear(); + + if (searches == null) + return; + + Iterator searchList = searches.getChildren("search").iterator(); + + while (searchList.hasNext()) + { + Element search = (Element) searchList.next(); + + Search s = new Search(); + + s.freeText = getValue(search, "freeText", ""); + s.title = getValue(search, "title", ""); + s.abstrac = getValue(search, "abstract", ""); + s.keywords = getValue(search, "keywords", ""); + s.digital = getValue(search, "digital", false); + s.hardcopy = getValue(search, "hardcopy", false); + s.siteId = getValue(search, "siteId", ""); + + alSearches.add(s); + + if (s.siteId.equals("")) + throw new BadParameterEx("siteId", ""); + } + } + + //--------------------------------------------------------------------------- + //--- + //--- Variables + //--- + //--------------------------------------------------------------------------- + + public String host; + public int port; + public String servlet; + + public boolean useAccount; + public String username; + public String password; + + public int every; + public boolean createGroups; + public boolean createCateg; + public boolean oneRunOnly; + + private ArrayList<Search> alSearches = new ArrayList<Search>(); +} + +//============================================================================= + +class Search +{ + //--------------------------------------------------------------------------- + //--- + //--- API methods + //--- + //--------------------------------------------------------------------------- + + public Search copy() + { + Search s = new Search(); + + s.freeText = freeText; + s.title = title; + s.abstrac = abstrac; + s.keywords = keywords; + s.digital = digital; + s.hardcopy = hardcopy; + s.siteId = siteId; + + return s; + } + + //--------------------------------------------------------------------------- + + public Element createRequest() + { + Element req = new Element("request"); + + Lib.element.add(req, "any", freeText); + Lib.element.add(req, "title", title); + Lib.element.add(req, "abstract", abstrac); + Lib.element.add(req, "themekey", keywords); + Lib.element.add(req, "siteId", siteId); + + if (digital) + Lib.element.add(req, "digital", "on"); + + if (hardcopy) + Lib.element.add(req, "paper", "on"); + + return req; + } + + //--------------------------------------------------------------------------- + //--- + //--- Variables + //--- + //--------------------------------------------------------------------------- + + public String freeText; + public String title; + public String abstrac; + public String keywords; + public boolean digital; + public boolean hardcopy; + public String siteId; +} + +//============================================================================= + Added: trunk/src/org/fao/geonet/kernel/harvest/harvester/webdav/WebDavHarvester.java =================================================================== --- trunk/src/org/fao/geonet/kernel/harvest/harvester/webdav/WebDavHarvester.java (rev 0) +++ trunk/src/org/fao/geonet/kernel/harvest/harvester/webdav/WebDavHarvester.java 2007-05-26 17:18:11 UTC (rev 430) @@ -0,0 +1,256 @@ +//============================================================================= +//=== Copyright (C) 2001-2007 Food and Agriculture Organization of the +//=== United Nations (FAO-UN), United Nations World Food Programme (WFP) +//=== and United Nations Environment Programme (UNEP) +//=== +//=== This program is free software; you can redistribute it and/or modify +//=== it under the terms of the GNU General Public License as published by +//=== the Free Software Foundation; either version 2 of the License, or (at +//=== your option) any later version. +//=== +//=== This program is distributed in the hope that it will be useful, but +//=== WITHOUT ANY WARRANTY; without even the implied warranty of +//=== MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +//=== General Public License for more details. +//=== +//=== You should have received a copy of the GNU General Public License +//=== along with this program; if not, write to the Free Software +//=== Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +//=== +//=== Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, +//=== Rome - Italy. email: geo...@os... +//============================================================================== + +package org.fao.geonet.kernel.harvest.harvester.webdav; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; +import jeeves.exceptions.BadInputEx; +import jeeves.interfaces.Logger; +import jeeves.resources.dbms.Dbms; +import jeeves.server.context.ServiceContext; +import jeeves.server.resources.ResourceManager; +import org.fao.geonet.kernel.harvest.Common.Status; +import org.fao.geonet.kernel.harvest.harvester.AbstractHarvester; +import org.jdom.Element; + +//============================================================================= + +public class WebDavHarvester extends AbstractHarvester +{ + //-------------------------------------------------------------------------- + //--- + //--- Static init + //--- + //-------------------------------------------------------------------------- + + public static void init(ServiceContext context) throws Exception + { + } + + //-------------------------------------------------------------------------- + //--- + //--- Harvesting type + //--- + //-------------------------------------------------------------------------- + + public String getType() { return "webdav"; } + + //-------------------------------------------------------------------------- + //--- + //--- Init + //--- + //-------------------------------------------------------------------------- + + protected void doInit(Element node) throws BadInputEx + { + params = new WebDavParams(dataMan); + params.init(node); + } + + //--------------------------------------------------------------------------- + //--- + //--- Destroy + //--- + //--------------------------------------------------------------------------- + + protected void doDestroy(Dbms dbms) throws SQLException + { + String query = "DELETE FROM Metadata WHERE siteId = ?"; + + //TODO: + } + + //--------------------------------------------------------------------------- + //--- + //--- Add + //--- + //--------------------------------------------------------------------------- + + protected String doAdd(Dbms dbms, Element node) throws BadInputEx, SQLException + { + //--- retrieve/initialize information + + params = new WebDavParams(dataMan); + params.create(node); + + //--- setup waf node + + String id = settingMan.add(dbms, "harvesting", "node", getType()); + String path = "id:"+ id; + + String siteID = settingMan.add(dbms, path, "site", ""); + String privID = settingMan.add(dbms, path, "privileges", ""); + String optionsID = settingMan.add(dbms, path, "options", ""); + String infoID = settingMan.add(dbms, path, "info", ""); + + //--- setup site node + + settingMan.add(dbms, "id:"+siteID, "name", node.getAttributeValue("name")); + settingMan.add(dbms, "id:"+siteID, "url", params.url); + + String useAccID = settingMan.add(dbms, "id:"+siteID, "useAccount", params.useAccount); + + settingMan.add(dbms, "id:"+useAccID, "username", params.username); + settingMan.add(dbms, "id:"+useAccID, "password", params.password); + + //--- setup privileges --------------------------------------- + + addPrivileges(dbms, "id:"+ privID, params); + + //--- setup options node --------------------------------------- + + settingMan.add(dbms, "id:"+optionsID, "every", params.every); + settingMan.add(dbms, "id:"+optionsID, "oneRunOnly", params.oneRunOnly); + settingMan.add(dbms, "id:"+optionsID, "validate", params.validate); + settingMan.add(dbms, "id:"+optionsID, "structure", params.structure); + settingMan.add(dbms, "id:"+optionsID, "status", Status.INACTIVE); + + //--- setup stats node ---------------------------------------- + + settingMan.add(dbms, "id:"+infoID, "lastRun", ""); + + return id; + } + + //--------------------------------------------------------------------------- + //--- + //--- Update + //--- + //--------------------------------------------------------------------------- + + protected void doUpdate(Dbms dbms, String id, Element node) + throws BadInputEx, SQLException + { + //--- update variables + + WebDavParams copy = params.copy(); + copy.update(node); + + //--- update database + + Element site = node.getChild("site"); + Element opt = node.getChild("options"); + Element privil = node.getChild("privileges"); + Element account= (site == null) ? null : site.getChild("account"); + + String path = "harvesting/id:"+ id; + String name = node.getAttributeValue("name"); + + Map<String, Object> values = new HashMap<String, Object>(); + + if (name != null) + values.put(path +"/site/name", name); + + setValue(values, path +"/site/url", site, "url"); + setValue(values, path +"/site/useAccount", account, "use"); + setValue(values, path +"/site/useAccount/username", account, "username"); + setValue(values, path +"/site/useAccount/password", account, "password"); + + setValue(values, path +"/options/every", opt, "every"); + setValue(values, path +"/options/oneRunOnly", opt, "oneRunOnly"); + setValue(values, path +"/options/validate", opt, "validate"); + setValue(values, path +"/options/structure", opt, "structure"); + + settingMan.setValues(dbms, values); + + //--- update privileges if the 'privileges' element is provided + + if (privil != null) + { + //--- remove all previous privileges + + Element setPrivil = settingMan.get(path ,1).getChild("children").getChild("privileges"); + String privID = setPrivil.getAttributeValue("id"); + + settingMan.removeChildren(dbms, path +"/id:"+ privID); + + //--- add new privileges entries + + addPrivileges(dbms, path +"/id:"+ privID, copy); + } + + //--- we update a copy first because if there is an exception GeonetParams + //--- could be half updated and so it could be in an inconsistent state + + params = copy; + } + + //--------------------------------------------------------------------------- + + private void addPrivileges(Dbms dbms, String path, WebDavParams params) throws SQLException + { + for (Privilege p : params.getPrivileges()) + { + String groupID = settingMan.add(dbms, path, "group", p.groupID); + + for (int oper : p.getOperations()) + settingMan.add(dbms, "id:"+ groupID, "operation", oper); + } + } + + //--------------------------------------------------------------------------- + //--- + //--- GetTimeout + //--- + //--------------------------------------------------------------------------- + + protected int doGetEvery() { return params.every; } + + protected boolean doIsOneRunOnly() { return params.oneRunOnly; } + + //--------------------------------------------------------------------------- + //--- + //--- AddInfo + //--- + //--------------------------------------------------------------------------- + + protected void doAddInfo(Element node) {} + + //--------------------------------------------------------------------------- + //--- + //--- Harvest + //--- + //--------------------------------------------------------------------------- + + protected void doHarvest(Logger l, ResourceManager rm) {} + + //--------------------------------------------------------------------------- + //--- + //--- Variables + //--- + //--------------------------------------------------------------------------- + + private WebDavParams params; + private WebDavResult result; +} + +//============================================================================= + +class WebDavResult +{ +} + +//============================================================================= + Added: trunk/src/org/fao/geonet/kernel/harvest/harvester/webdav/WebDavParams.java =================================================================== --- trunk/src/org/fao/geonet/kernel/harvest/harvester/webdav/WebDavParams.java (rev 0) +++ trunk/src/org/fao/geonet/kernel/harvest/harvester/webdav/WebDavParams.java 2007-05-26 17:18:11 UTC (rev 430) @@ -0,0 +1,320 @@ +//========================================================... [truncated message content] |