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

📄 exporter.java

📁 联合国农粮署牵头开发的geonetwork源代码最新版
💻 JAVA
字号:
//=============================================================================//===	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.mef;import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileFilter;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.sql.SQLException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Set;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;import jeeves.resources.dbms.Dbms;import jeeves.server.context.ServiceContext;import jeeves.utils.BinaryFile;import jeeves.utils.Xml;import org.fao.geonet.GeonetContext;import org.fao.geonet.constants.Geonet;import org.fao.geonet.exceptions.MetadataNotFoundEx;import org.fao.geonet.kernel.AccessManager;import org.fao.geonet.kernel.mef.MEFLib.Format;import org.fao.geonet.lib.Lib;import org.fao.geonet.util.ISODate;import org.jdom.Document;import org.jdom.Element;import static org.fao.geonet.kernel.mef.MEFConstants.*;//=============================================================================class Exporter{	//--------------------------------------------------------------------------	//---	//--- API methods	//---	//--------------------------------------------------------------------------	public static String doExport(ServiceContext context, String uuid, Format format,											boolean skipUUID) throws Exception	{		Dbms dbms = (Dbms) context.getResourceManager().open(Geonet.Res.MAIN_DB);		Element record = retrieveMetadata(dbms, uuid);		String id     = record.getChildText("id");		String data   = record.getChildText("data");		String isTemp = record.getChildText("istemplate");		if (!"y".equals(isTemp) && !"n".equals(isTemp))			throw new Exception("Cannot export sub template");		File   file   = File.createTempFile("mef-", ".mef");		String pubDir = Lib.resource.getDir(context, "public",  id);		String priDir = Lib.resource.getDir(context, "private", id);		FileOutputStream fos = new FileOutputStream(file);		ZipOutputStream  zos = new ZipOutputStream(fos);		//--- create folders		createDir(zos, DIR_PUBLIC);		createDir(zos, DIR_PRIVATE);		//--- save metadata		if (!data.startsWith("<?xml"))			data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n" + data;		byte[] binData = data.getBytes("UTF-8");		addFile(zos, FILE_METADATA, new ByteArrayInputStream(binData));		//--- save info file		binData = buildInfoFile(context, record, format, pubDir, priDir, skipUUID).getBytes("UTF-8");		addFile(zos, FILE_INFO, new ByteArrayInputStream(binData));		//--- save thumbnails and maps		if (format == Format.PARTIAL || format == Format.FULL)			savePublic(zos, pubDir);		if (format == Format.FULL)			savePrivate(zos, priDir);		//--- cleanup and exit		zos.close();		return file.getAbsolutePath();	}	//--------------------------------------------------------------------------	//---	//--- Private methods : zip handling	//---	//--------------------------------------------------------------------------	private static Element retrieveMetadata(Dbms dbms, String uuid)														throws SQLException, MetadataNotFoundEx	{		List list = dbms.select("SELECT * FROM Metadata WHERE uuid=?", uuid).getChildren();		if (list.size() == 0)			throw new MetadataNotFoundEx("uuid="+uuid);		return (Element) list.get(0);	}	//--------------------------------------------------------------------------	private static void createDir(ZipOutputStream zos, String name) throws IOException	{		ZipEntry entry = new ZipEntry(name);		zos.putNextEntry(entry);		zos.closeEntry();	}	//--------------------------------------------------------------------------	private static void addFile(ZipOutputStream zos, String name, InputStream is) throws IOException	{		ZipEntry entry = new ZipEntry(name);		zos.putNextEntry(entry);		BinaryFile.copy(is, zos, true, false);		zos.closeEntry();	}	//--------------------------------------------------------------------------	//---	//--- Private methods : thumbnails and maps saving	//---	//--------------------------------------------------------------------------	private static void savePublic(ZipOutputStream zos, String dir) throws IOException	{		File[] files = new File(dir).listFiles(filter);		if (files != null)			for (File file : files)				addFile(zos, DIR_PUBLIC + file.getName(), new FileInputStream(file));	}	//--------------------------------------------------------------------------	private static void savePrivate(ZipOutputStream zos, String dir) throws IOException	{		File[] files = new File(dir).listFiles(filter);		if (files != null)			for (File file : files)				addFile(zos, DIR_PRIVATE + file.getName(), new FileInputStream(file));	}	//--------------------------------------------------------------------------	//---	//--- Private methods : info.xml building	//---	//--------------------------------------------------------------------------	private static String buildInfoFile(ServiceContext context, Element md, Format format,													String pubDir, String priDir, boolean skipUUID)													throws Exception	{		Dbms dbms = (Dbms) context.getResourceManager().open(Geonet.Res.MAIN_DB);		Element info = new Element("info");		info.setAttribute("version", VERSION);		info.addContent(buildInfoGeneral(md, format, skipUUID, context));		info.addContent(buildInfoCategories(dbms, md));		info.addContent(buildInfoPrivileges(context, md));		info.addContent(buildInfoFiles("public",  pubDir));		info.addContent(buildInfoFiles("private", priDir));		return Xml.getString(new Document(info));	}	//--------------------------------------------------------------------------	private static Element buildInfoGeneral(Element md, Format format, boolean skipUUID,														 ServiceContext context)	{		String id         = md.getChildText("id");		String uuid       = md.getChildText("uuid");		String schema     = md.getChildText("schemaid");		String isTemplate = md.getChildText("istemplate").equals("y") ? "true" : "false";		String createDate = md.getChildText("createdate");		String changeDate = md.getChildText("changedate");		String siteId     = md.getChildText("source");		Element general = new Element("general")			.addContent(new Element("createDate").setText(createDate))			.addContent(new Element("changeDate").setText(changeDate))			.addContent(new Element("schema")    .setText(schema))			.addContent(new Element("isTemplate").setText(isTemplate))			.addContent(new Element("localId")   .setText(id))			.addContent(new Element("format")    .setText(format.toString()));		if (!skipUUID)		{			GeonetContext gc = (GeonetContext) context.getHandlerContext(Geonet.CONTEXT_NAME);			general.addContent(new Element("uuid")    .setText(uuid));			general.addContent(new Element("siteId")  .setText(siteId));			general.addContent(new Element("siteName").setText(gc.getSiteName()));		}		return general;	}	//--------------------------------------------------------------------------	private static Element buildInfoCategories(Dbms dbms, Element md) throws SQLException	{		Element categ = new Element("categories");		String id    = md.getChildText("id");		String query = "SELECT name FROM MetadataCateg, Categories "+							"WHERE categoryId = id AND metadataId = " +id;		List list = dbms.select(query).getChildren();		for (int i=0; i<list.size(); i++)		{			Element record = (Element) list.get(i);			String  name   = record.getChildText("name");			Element cat = new Element("category");			cat.setAttribute("name", name);			categ.addContent(cat);		}		return categ;	}	//--------------------------------------------------------------------------	private static Element buildInfoPrivileges(ServiceContext context,															 Element md) throws Exception	{		Dbms dbms = (Dbms) context.getResourceManager().open(Geonet.Res.MAIN_DB);		String id    = md.getChildText("id");		String query = "SELECT Groups.id as grpid, Groups.name as grpName, Operations.name as operName "+							"FROM   OperationAllowed, Groups, Operations "+							"WHERE  groupId = Groups.id "+							"  AND  operationId = Operations.id "+							"  AND  metadataId = " +id;		HashMap<String, ArrayList<String>> hmPriv = new HashMap<String, ArrayList<String>>();		//--- retrieve accessible groups		GeonetContext gc = (GeonetContext) context.getHandlerContext(Geonet.CONTEXT_NAME);		AccessManager am = gc.getAccessManager();		Set<String> userGroups = am.getUserGroups(dbms, context.getUserSession(), context.getIpAddress());		//--- scan query result to collect info		List list = dbms.select(query).getChildren();		for (int i=0; i<list.size(); i++)		{			Element record   = (Element) list.get(i);			String  grpId    = record.getChildText("grpid");			String  grpName  = record.getChildText("grpname");			String  operName = record.getChildText("opername");			if (!userGroups.contains(grpId))				continue;			ArrayList<String> al = hmPriv.get(grpName);			if (al == null)			{				al = new ArrayList<String>();				hmPriv.put(grpName, al);			}			al.add(operName);		}		//--- generate elements		Element privil = new Element("privileges");		for (String grpName : hmPriv.keySet())		{			Element group = new Element("group");			group.setAttribute("name", grpName);			privil.addContent(group);			for (String operName : hmPriv.get(grpName))			{				Element oper = new Element("operation");				oper.setAttribute("name", operName);				group.addContent(oper);			}		}		return privil;	}	//--------------------------------------------------------------------------	private static Element buildInfoFiles(String name, String dir)	{		Element root = new Element(name);		File[] files = new File(dir).listFiles(filter);		if (files != null)			for (File file : files)			{				String date = new ISODate(file.lastModified()).toString();				Element el = new Element("file");				el.setAttribute("name",       file.getName());				el.setAttribute("changeDate", date);				root.addContent(el);			}		return root;	}	//--------------------------------------------------------------------------	//---	//--- Variables	//---	//--------------------------------------------------------------------------	private static FileFilter filter = new FileFilter()	{		public boolean accept(File pathname)		{			if (pathname.getName().equals(".svn"))				return false;			return true;		}	};}//=============================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -