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

📄 getrecords.java.svn-base

📁 由国外的一个著名的geonetwork修改而来
💻 SVN-BASE
字号:
//=============================================================================//===	Copyright (C) 2001-2005 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA//===//===	Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2,//===	Rome - Italy. email: GeoNetwork@fao.org//==============================================================================package org.fao.geonet.kernel.csw.services;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.Set;import java.util.StringTokenizer;import jeeves.server.context.ServiceContext;import jeeves.utils.Util;import jeeves.utils.Xml;import org.fao.geonet.constants.Geonet;import org.fao.geonet.csw.common.Csw;import org.fao.geonet.csw.common.Csw.ConstraintLanguage;import org.fao.geonet.csw.common.Csw.ElementSetName;import org.fao.geonet.csw.common.Csw.OutputSchema;import org.fao.geonet.csw.common.Csw.ResultType;import org.fao.geonet.csw.common.Csw.TypeName;import org.fao.geonet.csw.common.exceptions.CatalogException;import org.fao.geonet.csw.common.exceptions.InvalidParameterValueEx;import org.fao.geonet.csw.common.exceptions.MissingParameterValueEx;import org.fao.geonet.csw.common.exceptions.NoApplicableCodeEx;import org.fao.geonet.kernel.csw.CatalogService;import org.fao.geonet.kernel.csw.services.getrecords.SearchController;import org.fao.geonet.kernel.csw.services.getrecords.SortField;import org.jdom.Element;import org.z3950.zing.cql.CQLNode;import org.z3950.zing.cql.CQLParser;//=============================================================================public class GetRecords extends AbstractOperation implements CatalogService{	//---------------------------------------------------------------------------	//---	//--- Constructor	//---	//---------------------------------------------------------------------------	public GetRecords() {}	//---------------------------------------------------------------------------	//---	//--- API methods	//---	//---------------------------------------------------------------------------	public String getName() { return "GetRecords"; }	//---------------------------------------------------------------------------	public Element execute(Element request, ServiceContext context) throws CatalogException	{		checkService(request);		checkVersion(request);		checkOutputFormat(request);		int startPos   = getStartPosition(request);		int maxRecords = getMaxRecords(request);		int hopCount   = getHopCount(request);		ResultType      resultType  = ResultType  .parse(request.getAttributeValue("resultType"));;		OutputSchema    outSchema   = OutputSchema.parse(request.getAttributeValue("outputSchema"));		ElementSetName  setName     = getElementSetName(request.getChild("Query", Csw.NAMESPACE_CSW));		Set<TypeName>   typeNames   = getTypeNames(request);		Element         filterExpr  = getFilterExpression(request, context);		List<SortField> sortFields  = getSortFields(request);		if (resultType == ResultType.VALIDATE)			throw new InvalidParameterValueEx("resultType", resultType.toString());		Element response = new Element(getName() +"Response", Csw.NAMESPACE_CSW);		Element status = new Element("SearchStatus", Csw.NAMESPACE_CSW);		status.setAttribute("status", "complete");		SearchController sc = new SearchController();		response.addContent(status);		response.addContent(sc.search(context, startPos, maxRecords, hopCount, resultType,												outSchema, setName, typeNames, filterExpr, sortFields));		return response;	}	//---------------------------------------------------------------------------	public Element adaptGetRequest(Map<String, String> params) throws CatalogException	{		String service      = params.get("service");		String version      = params.get("version");		String resultType   = params.get("resulttype");		String outputFormat = params.get("outputformat");		String outputSchema = params.get("outputschema");		String startPosition= params.get("startposition");		String maxRecords   = params.get("maxrecords");		String hopCount     = params.get("hopcount");		String distribSearch= params.get("distributedsearch");		String typeNames    = params.get("typenames");		String elemSetName  = params.get("elementsetname");		String constraint   = params.get("constraint");		String constrLang   = params.get("constraintlanguage");		String constrLangVer= params.get("constraint_language_version");		String sortby       = params.get("sortby");		//--- build POST request		Element request = new Element(getName(), Csw.NAMESPACE_CSW);		setAttrib(request, "service",       service);		setAttrib(request, "version",       version);		setAttrib(request, "resultType",    resultType);		setAttrib(request, "outputFormat",  outputFormat);		setAttrib(request, "outputSchema",  outputSchema);		setAttrib(request, "startPosition", startPosition);		setAttrib(request, "maxRecords",    maxRecords);		if (distribSearch != null && distribSearch.equals("true"))		{			Element ds = new Element("DistributedSearch", Csw.NAMESPACE_CSW);			ds.setText("TRUE");			if (hopCount != null)				ds.setAttribute("hopCount", hopCount);			request.addContent(ds);		}		//------------------------------------------------------------------------		//--- build query element		Element query = new Element("Query", Csw.NAMESPACE_CSW);		request.addContent(query);		if (typeNames != null)			setAttrib(query, "typeNames", typeNames.replace(',',' '));		addElement(query, "ElementSetName", elemSetName);		//------------------------------------------------------------------------		//--- handle constraint		ConstraintLanguage language = ConstraintLanguage.parse(constrLang);		if (constraint != null)		{			Element constr = new Element("Constraint", Csw.NAMESPACE_CSW);			query.addContent(constr);			if (language == ConstraintLanguage.CQL)				addElement(constr, "CqlText", constraint);			else				try				{					constr.addContent(Xml.loadString(constraint, false));				}				catch (Exception e)				{					e.printStackTrace();					throw new NoApplicableCodeEx("Constraint is not a valid xml");				}			setAttrib(constr, "version", constrLangVer);		}		//------------------------------------------------------------------------		//--- handle sortby		if (sortby != null)		{			Element sortBy = new Element("SortBy", Csw.NAMESPACE_OGC);			query.addContent(sortBy);			StringTokenizer st = new StringTokenizer(sortby, ",");			while (st.hasMoreTokens())			{				String  sortInfo = st.nextToken();				String  field    = sortInfo.substring(0, sortInfo.length() -2);				boolean ascen    = sortInfo.endsWith(":A");				Element sortProp = new Element("SortProperty", Csw.NAMESPACE_OGC);				sortBy.addContent(sortProp);				Element propName  = new Element("PropertyName", Csw.NAMESPACE_OGC).setText(field);				Element sortOrder = new Element("SortOrder",    Csw.NAMESPACE_OGC).setText(ascen ? "ASC" : "DESC");				sortProp.addContent(propName);				sortProp.addContent(sortOrder);			}		}		return request;	}	//---------------------------------------------------------------------------	//---	//--- Private methods	//---	//---------------------------------------------------------------------------	private void checkOutputFormat(Element request) throws InvalidParameterValueEx	{		String format = request.getAttributeValue("outputFormat");		if (format == null)			return;		if (!format.equals("application/xml"))			throw new InvalidParameterValueEx("outputFormat", format);	}	//---------------------------------------------------------------------------	private int getStartPosition(Element request) throws InvalidParameterValueEx	{		String start = request.getAttributeValue("startPosition");		if (start == null)			return 1;		try		{			int value = Integer.parseInt(start);			if (value >= 1)				return value;		}		catch (NumberFormatException e) {}		throw new InvalidParameterValueEx("startPosition", start);	}	//---------------------------------------------------------------------------	private int getMaxRecords(Element request) throws InvalidParameterValueEx	{		String max = request.getAttributeValue("maxRecords");		if (max == null)			return 10;		try		{			int value = Integer.parseInt(max);			if (value >= 1)				return value;		}		catch (NumberFormatException e) {}		throw new InvalidParameterValueEx("maxRecords", max);	}	//---------------------------------------------------------------------------	//--- a return value >= 0 means that a distributed search was requested	//--- otherwise the method returns -1	private int getHopCount(Element request) throws InvalidParameterValueEx	{		Element ds = request.getChild("DistributedSearch", Csw.NAMESPACE_CSW);		if (ds == null)			return -1;		String hopCount = ds.getAttributeValue("hopCount");		if (hopCount == null)			return 2;		try		{			int value = Integer.parseInt(hopCount);			if (value >= 0)				return value;		}		catch (NumberFormatException e) {}		throw new InvalidParameterValueEx("hopCount", hopCount);	}	//---------------------------------------------------------------------------	private Set<TypeName> getTypeNames(Element request) throws CatalogException	{		Element query = request.getChild("Query", Csw.NAMESPACE_CSW);		return TypeName.parse(query.getAttributeValue("typeNames"));	}	//---------------------------------------------------------------------------	private Element getFilterExpression(Element request, ServiceContext context) throws CatalogException	{		Element query  = request.getChild("Query",      Csw.NAMESPACE_CSW);		Element constr = query  .getChild("Constraint", Csw.NAMESPACE_CSW);		if (constr == null)			return null;		Element filter = constr.getChild("Filter",  Csw.NAMESPACE_OGC);		Element cql    = constr.getChild("CqlText", Csw.NAMESPACE_CSW);		if (filter == null && cql == null)			throw new InvalidParameterValueEx("Constraint", Xml.getString(constr));		String version = constr.getAttributeValue("version");		if (version == null)			throw new MissingParameterValueEx("version");		if (filter != null && !version.equals(Csw.FILTER_VERSION))			throw new InvalidParameterValueEx("version", version);		return (filter != null) ? filter : convertCQL(cql.getText(), context);	}	//---------------------------------------------------------------------------	private List<SortField> getSortFields(Element request)	{		ArrayList<SortField> al = new ArrayList<SortField>();		Element query = request.getChild("Query", Csw.NAMESPACE_CSW);		if (query == null)			return al;		Element sortBy = query.getChild("SortBy", Csw.NAMESPACE_OGC);		if (sortBy == null)			return al;		List list = sortBy.getChildren();		for(int i=0; i<list.size(); i++)		{			Element el = (Element) list.get(i);			String field = el.getChildText("PropertyName", Csw.NAMESPACE_OGC);			String order = el.getChildText("SortOrder",    Csw.NAMESPACE_OGC);			al.add(new SortField(field, "DESC".equals(order)));		}		return al;	}	//---------------------------------------------------------------------------	private Element convertCQL(String cql, ServiceContext context) throws CatalogException	{		String xmlCql = getCqlXmlString(cql, context);		context.debug("Received CQL:\n"+ xmlCql);		Element xml        = getCqlXmlElement(xmlCql, context);		String  styleSheet = context.getAppPath() + Geonet.Path.CSW + Geonet.File.CQL_TO_FILTER;		Element filter = getFilter(xml, styleSheet, context);		context.debug("Trasformed CQL gives the following filter:\n"+Xml.getString(filter));		return filter;	}	//---------------------------------------------------------------------------	private String getCqlXmlString(String cql, ServiceContext context) throws InvalidParameterValueEx	{		try		{			CQLParser parser = new CQLParser();			CQLNode   root   = parser.parse(cql);			return root.toXCQL(0);		}		catch (Exception e)		{			context.error("Error parsing CQL : "+ e);			context.error("  (C) CQL is :\n"+ cql);			throw new InvalidParameterValueEx("CqlText", cql);		}	}	//---------------------------------------------------------------------------	private Element getCqlXmlElement(String cqlXml, ServiceContext context) throws NoApplicableCodeEx	{		try		{			return Xml.loadString(cqlXml, false);		}		catch (Exception e)		{			context.error("Bad CQL XML : "+ e);			context.error("  (C) CQL XML is :\n"+ cqlXml);			throw new NoApplicableCodeEx("Bad CQL XML : "+ cqlXml);		}	}	//---------------------------------------------------------------------------	private Element getFilter(Element cql, String styleSheet, ServiceContext context) throws NoApplicableCodeEx	{		try		{			return Xml.transform(cql, styleSheet);		}		catch (Exception e)		{			context.error("Error during CQL to Filter conversion : "+ e);			context.error("  (C) StackTrace\n"+ Util.getStackTrace(e));			throw new NoApplicableCodeEx("Error during CQL to Filter conversion : "+ e);		}	}}//=============================================================================

⌨️ 快捷键说明

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