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

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

Adjusting some comments to correctly reflect the most recent changes.

File size: 7.1 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 } else {
172 this.earliestOAIDatestamp = earliestTimestamp; // milliseconds
173 }
174
175
176 // find out the supported service types for this service module
177 Node types = this.oai_service_rack.process(message);
178 NodeList typenodes = ((Element) types).getElementsByTagName(GSXML.SERVICE_ELEM);
179
180 for (int j = 0; j < typenodes.getLength(); j++)
181 {
182 String service = ((Element) typenodes.item(j)).getAttribute(GSXML.NAME_ATT);
183
184 if (service_map.get(service) != null)
185 {
186 char extra = '0';
187 String new_service = service + extra;
188
189 while (service_map.get(new_service) != null)
190 {
191 extra++;
192 new_service = service + extra;
193 }
194 this.service_name_map.put(new_service, service);
195 service = new_service;
196 ((Element) typenodes.item(j)).setAttribute(GSXML.NAME_ATT, service);
197 }
198 this.service_map.put(service, this.oai_service_rack);
199 // also add info to the ServiceInfo XML element
200 this.service_list.appendChild(this.desc_doc.importNode(typenodes.item(j), true));
201 }
202 has_oai = true;
203 return true;
204 }
205
206
207 return false;
208 }
209
210}
Note: See TracBrowser for help on using the repository browser.