source: main/trunk/greenstone3/src/java/org/greenstone/gsdl3/collection/OAICollection.java@ 31915

Last change on this file since 31915 was 31915, checked in by ak19, 7 years ago

Dr Bainbridge thought about it and decided that the correct solution is that, since a collection will always have an oai-inf db from now on, the earliest datestamp of a collection should not fall back to either buildconfig's earliestdatestamp field or else buildconfig's lastmodified. However, the latter are used as the publishing date by the RSS service, and so still stored as Collection.java's earliestDatestamp. Now OAICollection has a new additional field, earliestOAIDatestamp which contains the earliest timestamp in oai-inf db. The OAIReceptionist now determines the earliestDatestamp of the entire OAIRepository solely based on the earliestOAIDatestamp values across all OAICollections, also with no fallbacks on Collections' earliestDatestamp or lastModified fields.

File size: 7.3 KB
Line 
1/*
2 * OAICollection.java
3 * Copyright (C) 2002 New Zealand Digital Library, http://www.nzdl.org
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19package org.greenstone.gsdl3.collection;
20
21import java.io.BufferedReader;
22import java.io.BufferedWriter;
23import java.io.File;
24import java.io.FileReader;
25import java.io.FileWriter;
26import java.io.IOException;
27import java.io.PrintWriter;
28import java.io.StringWriter;
29import java.util.ArrayList;
30import java.util.HashMap;
31
32import org.apache.commons.lang3.StringUtils;
33import org.apache.log4j.Logger;
34import org.greenstone.gsdl3.core.ModuleInterface;
35import org.greenstone.gsdl3.service.ServiceRack;
36import org.greenstone.gsdl3.service.OAIPMH;
37import org.greenstone.gsdl3.util.GSFile;
38import org.greenstone.gsdl3.util.GSXML;
39import org.greenstone.gsdl3.util.GSXSLT;
40import org.greenstone.gsdl3.util.OAIXML;
41import org.greenstone.gsdl3.util.SimpleMacroResolver;
42import org.greenstone.gsdl3.util.UserContext;
43import org.greenstone.gsdl3.util.XMLConverter;
44import org.greenstone.gsdl3.util.XMLTransformer;
45import org.w3c.dom.Document;
46import org.w3c.dom.Element;
47import org.w3c.dom.Node;
48import org.w3c.dom.NodeList;
49
50/**
51 * Represents a collection for the OAI server. This is a cut down version of Collection, as we
52 * only want to load the OAIPMH service rack, not any of the others
53 *
54 */
55public class OAICollection extends Collection
56{
57
58 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.collection.OAICollection.class.getName());
59
60 /** does this collection provide the OAI service */
61 protected boolean has_oai = false;
62
63 /** earliest datestamp of an OAI collection. Also used to work out the earliest datetimestamp of the entire OAI repository */
64 protected long earliestOAIDatestamp = 0;
65
66 /** a reference to the OAIPMH service rack */
67 protected OAIPMH oai_service_rack = null;
68
69 /**
70 * Configures the collection.
71 *
72 * site_home and cluster_name must be set before configure is called.
73 *
74 * collection metadata is obtained, and services loaded.
75 *
76 * @return true/false on success/fail
77 */
78 public boolean configure()
79 {
80 if (this.site_home == null || this.cluster_name == null)
81 {
82 logger.error("Collection: site_home and collection_name must be set before configure called!");
83 return false;
84 }
85
86 macro_resolver.addMacro("_httpcollection_", this.site_http_address + "/collect/" + this.cluster_name);
87
88 Element coll_config_xml = loadCollConfigFile();
89 if (coll_config_xml == null) {
90 logger.error("Collection: couldn't configure collection: " + this.cluster_name + ", " + "Couldn't load collection config file");
91
92 return false;
93 }
94 Element build_config_xml = loadBuildConfigFile();
95 if (build_config_xml == null)
96 {
97 logger.error("Collection: couldn't configure collection: " + this.cluster_name + ", " + "Couldn't load build config file");
98
99 return false;
100 }
101 GSXSLT.modifyCollectionConfigForDebug(coll_config_xml);
102
103 // process the metadata and display items and default library params
104 super.configureLocalData(coll_config_xml);
105 super.configureLocalData(build_config_xml);
106 // get extra collection specific stuff
107 findAndLoadInfo(coll_config_xml, build_config_xml);
108
109 // load up the OAIPMH serviceRack
110 configureServiceRacks(coll_config_xml, build_config_xml);
111
112 return true;
113
114 }
115
116
117 /**
118 * whether this collection has OAIPMH services
119 */
120 public boolean hasOAI()
121 {
122 return has_oai;
123 }
124
125 /**
126 * The earliesttimestamp entry in the oai-inf.db representing when the collection was created.
127 * Used by the OAIReceptionist
128 */
129 public long getEarliestOAIDatestamp()
130 {
131 return earliestOAIDatestamp;
132 }
133
134 /** add any extra info for collection from OAIConfig.xml */
135 public boolean configureOAI(Element oai_config) {
136 // just pass the element to each service - should only be one
137 return this.oai_service_rack.configureOAI(oai_config);
138 }
139
140 /** override this to only load up OAIPMH serviceRack - don't need all the rest of them for oai*/
141 protected boolean configureServiceRackList(Element service_rack_list, Element extra_info)
142 {
143
144 // find the OAIPMH service
145 Element oai_service_xml = GSXML.getNamedElement(service_rack_list, GSXML.SERVICE_CLASS_ELEM, GSXML.NAME_ATT, "OAIPMH");
146 if (oai_service_xml == null) {
147 return false;
148 }
149
150 // the xml request to send to the serviceRack to query what services it provides
151 Document doc = XMLConverter.newDOM();
152 Element message = doc.createElement(GSXML.MESSAGE_ELEM);
153 Element request = GSXML.createBasicRequest(doc, GSXML.REQUEST_TYPE_DESCRIBE, "", new UserContext());
154 message.appendChild(request);
155
156 this.oai_service_rack = new OAIPMH();
157 this.oai_service_rack.setSiteHome(this.site_home);
158 this.oai_service_rack.setSiteAddress(this.site_http_address);
159 this.oai_service_rack.setClusterName(this.cluster_name);
160 this.oai_service_rack.setServiceCluster(this);
161 this.oai_service_rack.setMessageRouter(this.router);
162 // pass the xml node to the service for configuration
163 if (this.oai_service_rack.configure(oai_service_xml, extra_info)) {
164
165 // once we've configured the OAIPMH service, we can use the OAIPMH service to
166 // retrieve the earliest timestamp of this OAI collection from the oai-inf db
167 long earliestTimestamp = this.oai_service_rack.getEarliestTimestamp();
168 if(earliestTimestamp == -1) {
169 this.earliestOAIDatestamp = -1;
170 logger.warn("No OAI timestamp for collection " + this.cluster_name);
171 //logger.warn("No OAI timestamp for collection " + this.cluster_name
172 //+ ". Falling back to using its earliestDatestamp from build config: " + this.earliestDatestamp);
173 } else {
174 this.earliestOAIDatestamp = earliestTimestamp; // milliseconds
175 }
176
177
178 // find out the supported service types for this service module
179 Node types = this.oai_service_rack.process(message);
180 NodeList typenodes = ((Element) types).getElementsByTagName(GSXML.SERVICE_ELEM);
181
182 for (int j = 0; j < typenodes.getLength(); j++)
183 {
184 String service = ((Element) typenodes.item(j)).getAttribute(GSXML.NAME_ATT);
185
186 if (service_map.get(service) != null)
187 {
188 char extra = '0';
189 String new_service = service + extra;
190
191 while (service_map.get(new_service) != null)
192 {
193 extra++;
194 new_service = service + extra;
195 }
196 this.service_name_map.put(new_service, service);
197 service = new_service;
198 ((Element) typenodes.item(j)).setAttribute(GSXML.NAME_ATT, service);
199 }
200 this.service_map.put(service, this.oai_service_rack);
201 // also add info to the ServiceInfo XML element
202 this.service_list.appendChild(this.desc_doc.importNode(typenodes.item(j), true));
203 }
204 has_oai = true;
205 return true;
206 }
207
208
209 return false;
210 }
211
212}
Note: See TracBrowser for help on using the repository browser.