### Eclipse Workspace Patch 1.0 #P geonetwork Index: web/src/main/java/org/fao/geonet/kernel/oaipmh/services/GetRecord.java =================================================================== --- web/src/main/java/org/fao/geonet/kernel/oaipmh/services/GetRecord.java (revision 7467) +++ web/src/main/java/org/fao/geonet/kernel/oaipmh/services/GetRecord.java (working copy) @@ -27,6 +27,7 @@ import jeeves.server.context.ServiceContext; import jeeves.utils.Xml; import org.fao.geonet.constants.Geonet; +import org.fao.geonet.csw.common.Csw; import org.fao.geonet.kernel.oaipmh.Lib; import org.fao.geonet.kernel.oaipmh.OaiPmhService; import org.fao.oaipmh.OaiPmh; @@ -47,6 +48,8 @@ public class GetRecord implements OaiPmhService { + + public String getVerb() { return GetRecordRequest.VERB; } //--------------------------------------------------------------------------- @@ -69,21 +72,31 @@ } //--------------------------------------------------------------------------- + private Record buildRecord(ServiceContext context, String uuid, String prefix) throws Exception { + + + + return buildRecordStat(context,"uuid",uuid,prefix); + + } + - private Record buildRecord(ServiceContext context, String uuid, String prefix) throws Exception + // function builds a OAI records from a metadata record, according to the arguments select and selectval + public static Record buildRecordStat(ServiceContext context, String select, Object selectval, String prefix) throws Exception { Dbms dbms = (Dbms) context.getResourceManager().open(Geonet.Res.MAIN_DB); - String query = "SELECT id, schemaId, changeDate, data FROM Metadata WHERE uuid=?"; + String query = "SELECT uuid,id, schemaId, changeDate, data FROM Metadata WHERE "+select+"=?"; - List list = dbms.select(query, uuid).getChildren(); + List list = dbms.select(query, selectval).getChildren(); if (list.size() == 0) - throw new IdDoesNotExistException(uuid); + throw new IdDoesNotExistException(selectval.toString()); Element rec = (Element) list.get(0); String id = rec.getChildText("id"); + String uuid = rec.getChildText("uuid"); String schema = rec.getChildText("schemaid"); String changeDate = rec.getChildText("changedate"); String data = rec.getChildText("data"); @@ -93,9 +106,11 @@ //--- try to disseminate format if (prefix.equals(schema)) { - String schemaUrl = Lib.getSchemaUrl(context, "xml/schemas/" + schema + "/schema.xsd"); - String schemaLoc = md.getNamespace().getURI() +" "+ schemaUrl; - md.setAttribute("schemaLocation", schemaLoc, OaiPmh.Namespaces.XSI); + if ( md.getAttribute("schemaLocation", Csw.NAMESPACE_XSI) == null ) { + String schemaUrl = Lib.getSchemaUrl(context, "xml/schemas/" + schema + "/schema.xsd"); + String schemaLoc = md.getNamespace().getURI() +" "+ schemaUrl; + md.setAttribute("schemaLocation", schemaLoc, OaiPmh.Namespaces.XSI); + } } else { if (Lib.existsConverter(schema, context.getAppPath(), prefix)) { md = Lib.transform(schema, md, uuid, changeDate, context.getAppPath(), prefix); @@ -115,6 +130,7 @@ query = "SELECT name FROM Categories, MetadataCateg WHERE id=categoryId AND metadataId=?"; + list = dbms.select(query, new Integer(id)).getChildren(); for (Object o : list) Index: web/src/main/java/org/fao/geonet/kernel/oaipmh/services/ListRecords.java =================================================================== --- web/src/main/java/org/fao/geonet/kernel/oaipmh/services/ListRecords.java (revision 7467) +++ web/src/main/java/org/fao/geonet/kernel/oaipmh/services/ListRecords.java (working copy) @@ -30,6 +30,8 @@ import org.fao.geonet.kernel.oaipmh.Lib; import org.fao.geonet.kernel.oaipmh.ResumptionTokenCache; import org.fao.oaipmh.OaiPmh; +import org.fao.oaipmh.exceptions.CannotDisseminateFormatException; +import org.fao.oaipmh.exceptions.IdDoesNotExistException; import org.fao.oaipmh.requests.ListRecordsRequest; import org.fao.oaipmh.requests.TokenListRequest; import org.fao.oaipmh.responses.Header; @@ -96,69 +98,24 @@ private Record buildRecord(ServiceContext context, int id, String prefix) throws Exception { - Dbms dbms = (Dbms) context.getResourceManager().open(Geonet.Res.MAIN_DB); - - String query = "SELECT uuid, schemaId, changeDate, data FROM Metadata WHERE id=?"; - - List list = dbms.select(query, id).getChildren(); - - //--- maybe the metadata has been removed - - if (list.size() == 0) + // have to catch exceptions and return null because this function can + // be called several times for a list of MD records + // and we do not want to stop because of one error + try { + return GetRecord.buildRecordStat(context,"id" ,id , prefix); + } catch (IdDoesNotExistException e) { return null; - - Element rec = (Element) list.get(0); - - String uuid = rec.getChildText("uuid"); - String schema = rec.getChildText("schemaid"); - String changeDate = rec.getChildText("changedate"); - String data = rec.getChildText("data"); - - Element md = Xml.loadString(data, false); - - //--- try to disseminate format - - if (prefix.equals(schema)) { - String schemaUrl = Lib.getSchemaUrl(context, "xml/schemas/" + schema + "/schema.xsd"); - String schemaLoc = md.getNamespace().getURI() +" "+ schemaUrl; - md.setAttribute("schemaLocation", schemaLoc, OaiPmh.Namespaces.XSI); - } else { - if (Lib.existsConverter(schema, context.getAppPath(), prefix)) { - md = Lib.transform(schema, md, uuid, changeDate, context.getAppPath(), prefix); - } else { - return null; - } } - - //--- build header and set some infos - - Header h = new Header(); - - h.setIdentifier(uuid); - h.setDateStamp(new ISODate(changeDate)); - - //--- find and add categories (here called sets) - - query = "SELECT name FROM Categories, MetadataCateg WHERE id=categoryId AND metadataId=?"; - - list = dbms.select(query, id).getChildren(); - - for (Object o : list) - { - rec = (Element) o; - - h.addSet(rec.getChildText("name")); + catch (CannotDisseminateFormatException e2) { + return null; } + catch (Exception e3) { + throw e3; + } - //--- build and return record - - Record r = new Record(); - - r.setHeader(h); - r.setMetadata(md); - - return r; + } + } //=============================================================================