⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datamanager.java

📁 联合国农粮署牵头开发的geonetwork源代码最新版
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
//==============================================================================//===//=== 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 + -