📄 datamanager.java
字号:
//==============================================================================//===//=== DataManager//===//=============================================================================//=== 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: geonetwork@osgeo.org//==============================================================================package org.fao.geonet.kernel;import java.util.Enumeration;import java.util.HashSet;import java.util.Hashtable;import java.util.Iterator;import java.util.List;import java.util.Set;import java.util.UUID;import java.util.Vector;import jeeves.constants.Jeeves;import jeeves.resources.dbms.Dbms;import jeeves.server.context.ServiceContext;import jeeves.utils.Log;import jeeves.utils.SerialFactory;import jeeves.utils.Xml;import org.fao.geonet.constants.Edit;import org.fao.geonet.constants.Geonet;import org.fao.geonet.kernel.schema.MetadataSchema;import org.fao.geonet.kernel.search.SearchManager;import org.fao.geonet.kernel.setting.SettingManager;import org.fao.geonet.util.ISODate;import org.jdom.Attribute;import org.jdom.Element;import org.jdom.JDOMException;import org.jdom.Namespace;import org.jdom.Text;//=============================================================================/** Handles all operations on metadata (select,insert,update,delete etc...) */public class DataManager{ //-------------------------------------------------------------------------- //--- //--- Constructor //--- //-------------------------------------------------------------------------- /** initializes the search manager and index not-indexed metadata */ public DataManager(SearchManager sm, AccessManager am, Dbms dbms, SettingManager ss, String baseURL) throws Exception { searchMan = sm; accessMan = am; settingMan= ss; this.baseURL = baseURL; // get all metadata from DB Element result = dbms.select("SELECT id, changeDate FROM Metadata ORDER BY id ASC"); List list = result.getChildren(); // System.out.println("DB CONTENT:\n" + Xml.getString(result)); // DEBUG // get all metadata from index Hashtable docs = searchMan.getDocs(); // System.out.println("INDEX CONTENT:"); // DEBUG // index all metadata in DBMS if needed for(int i = 0; i < list.size(); i++) { // get metadata Element record = (Element) list.get(i); String id = record.getChildText("id"); // System.out.println("- record (" + id + ")"); // DEBUG Hashtable idxRec = (Hashtable)docs.get(id); // if metadata is not indexed index it if (idxRec == null) indexMetadata(dbms, id); // else, if indexed version is not the latest index it else { docs.remove(id); String lastChange = record.getChildText("changedate"); String idxLastChange = (String)idxRec.get("_changeDate"); // System.out.println(" - lastChange: " + lastChange); // DEBUG // System.out.println(" - idxLastChange: " + idxLastChange); // DEBUG if (!idxLastChange.equalsIgnoreCase(lastChange)) // date in index contains 't', date in DBMS contains 'T' indexMetadata(dbms, id); } } // System.out.println("INDEX SURPLUS:"); // DEBUG // remove from index metadata not in DBMS for (Enumeration i = docs.keys(); i.hasMoreElements(); ) { String id = (String)i.nextElement(); searchMan.delete("_id", id); // System.out.println("- record (" + id + ")"); // DEBUG } } //-------------------------------------------------------------------------- public void indexMetadata(Dbms dbms, String id) throws Exception { indexMetadata(dbms, id, searchMan); } //-------------------------------------------------------------------------- public static void indexMetadata(Dbms dbms, String id, SearchManager sm) throws Exception { try { indexMetadataI(dbms, id, sm); } catch (JDOMException e) { Log.error(Geonet.DATA_MANAGER, "The metadata with id="+id+" is corrupted"); } } //-------------------------------------------------------------------------- private static void indexMetadataI(Dbms dbms, String id, SearchManager sm) throws Exception { Vector moreFields = new Vector(); // get metadata table fields Element md = XmlSerializer.select(dbms, "Metadata", id); String root = md.getName(); String query ="SELECT schemaId, createDate, changeDate, source, isTemplate, title, uuid, "+ "isHarvested, owner, groupOwner FROM Metadata WHERE id = " + id; Element rec = dbms.select(query).getChild("record"); String schema = rec.getChildText("schemaid"); String createDate = rec.getChildText("createdate"); String changeDate = rec.getChildText("changedate"); String source = rec.getChildText("source"); String isTemplate = rec.getChildText("istemplate"); String title = rec.getChildText("title"); String uuid = rec.getChildText("uuid"); String isHarvested= rec.getChildText("isharvested"); String owner = rec.getChildText("owner"); String groupOwner = rec.getChildText("groupowner"); moreFields.add(makeField("_root", root, true, true, false)); moreFields.add(makeField("_schema", schema, true, true, false)); moreFields.add(makeField("_createDate", createDate, true, true, false)); moreFields.add(makeField("_changeDate", changeDate, true, true, false)); moreFields.add(makeField("_source", source, true, true, false)); moreFields.add(makeField("_isTemplate", isTemplate, true, true, false)); moreFields.add(makeField("_title", title, true, true, false)); moreFields.add(makeField("_uuid", uuid, true, true, false)); moreFields.add(makeField("_isHarvested", isHarvested, true, true, false)); moreFields.add(makeField("_owner", owner, true, true, false)); moreFields.add(makeField("_dummy", "0", false, true, false)); if (groupOwner != null) moreFields.add(makeField("_groupOwner", groupOwner, true, true, false)); // get privileges List operations = dbms.select("SELECT groupId, operationId FROM OperationAllowed "+ "WHERE metadataId = " + id + " ORDER BY operationId ASC").getChildren(); for (Iterator iter = operations.iterator(); iter.hasNext(); ) { Element operation = (Element)iter.next(); String groupId = operation.getChildText("groupid"); String operationId = operation.getChildText("operationid"); moreFields.add(makeField("_op" + operationId, groupId, true, true, false)); } // get categories List categories = dbms.select("SELECT id, name FROM MetadataCateg, Categories "+ "WHERE metadataId = " + id + " AND categoryId = id ORDER BY id").getChildren(); for (Iterator iter = categories.iterator(); iter.hasNext(); ) { Element category = (Element)iter.next(); String categoryName = category.getChildText("name"); moreFields.add(makeField("_cat", categoryName, true, true, false)); } sm.index(schema, md, id, moreFields, isTemplate, title); } //-------------------------------------------------------------------------- private static Element makeField(String name, String value, boolean store, boolean index, boolean token) { Element field = new Element("Field"); field.setAttribute("name", name); field.setAttribute("string", value); field.setAttribute("store", store+""); field.setAttribute("index", index+""); field.setAttribute("token", token+""); return field; } //-------------------------------------------------------------------------- //--- //--- Schema management API //--- //-------------------------------------------------------------------------- public void addSchema(String id, String xmlSchemaFile, String xmlSuggestFile) throws Exception { editLib.addSchema(id, xmlSchemaFile, xmlSuggestFile); } //-------------------------------------------------------------------------- public MetadataSchema getSchema(String name) { return editLib.getSchema(name); } //-------------------------------------------------------------------------- public Iterator getSchemas() { return editLib.getSchemas(); } //-------------------------------------------------------------------------- public boolean existsSchema(String name) { return editLib.existsSchema(name); } //-------------------------------------------------------------------------- public String getSchemaDir(String name) { return editLib.getSchemaDir(name); } //-------------------------------------------------------------------------- public void validate(String schema, Element md) throws Exception { Xml.validate(editLib.getSchemaDir(schema) + Geonet.File.SCHEMA, md); } //-------------------------------------------------------------------------- public AccessManager getAccessManager() { return accessMan; } //-------------------------------------------------------------------------- //--- //--- General purpose API //--- //-------------------------------------------------------------------------- public String extractUUID(String schema, Element md) throws Exception { String styleSheet = editLib.getSchemaDir(schema) + Geonet.File.EXTRACT_UUID; String uuid = Xml.transform(md, styleSheet).getText().trim(); Log.debug(Geonet.DATA_MANAGER, "Extracted UUID '"+ uuid +"' for schema '"+ schema +"'"); //--- needed to detach md from the document md.detach(); return uuid; } //-------------------------------------------------------------------------- public Element setUUID(String schema, String uuid, Element md) throws Exception { //--- setup environment Element env = new Element("env"); env.addContent(new Element("uuid").setText(uuid)); //--- setup root element Element root = new Element("root"); root.addContent(md); root.addContent(env); //--- do an XSL transformation String styleSheet = editLib.getSchemaDir(schema) + Geonet.File.SET_UUID; return Xml.transform(root, styleSheet); } //-------------------------------------------------------------------------- public String getMetadataId(Dbms dbms, String uuid) throws Exception { String query = "SELECT id FROM Metadata WHERE uuid=?"; List list = dbms.select(query, uuid).getChildren(); if (list.size() == 0) return null; Element record = (Element) list.get(0); return record.getChildText("id"); } //-------------------------------------------------------------------------- public String getMetadataUuid(Dbms dbms, String id) throws Exception { String query = "SELECT uuid FROM Metadata WHERE id=?"; List list = dbms.select(query, new Integer(id)).getChildren(); if (list.size() == 0) return null; Element record = (Element) list.get(0); return record.getChildText("uuid"); } //-------------------------------------------------------------------------- public MdInfo getMetadataInfo(Dbms dbms, String id) throws Exception { String query = "SELECT id, uuid, schemaId, isTemplate, isHarvested, createDate, "+ " changeDate, source, title, root, owner, groupOwner "+ "FROM Metadata "+ "WHERE id=?"; List list = dbms.select(query, new Integer(id)).getChildren(); if (list.size() == 0) return null; Element record = (Element) list.get(0); MdInfo info = new MdInfo(); info.id = id; info.uuid = record.getChildText("uuid"); info.schemaId = record.getChildText("schemaid");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -