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

Last change on this file since 29064 was 29064, checked in by kjdon, 10 years ago

simplify code cos we are always only looking for OAIPMH servicerack. keep a reference to it once set it up.

File size: 6.0 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 /** a reference to the OAIPMH service rack */
64 protected OAIPMH oai_service_rack = null;
65
66 /**
67 * Configures the collection.
68 *
69 * site_home and cluster_name must be set before configure is called.
70 *
71 * collection metadata is obtained, and services loaded.
72 *
73 * @return true/false on success/fail
74 */
75 public boolean configure()
76 {
77 if (this.site_home == null || this.cluster_name == null)
78 {
79 logger.error("Collection: site_home and collection_name must be set before configure called!");
80 return false;
81 }
82
83 macro_resolver.addMacro("_httpcollection_", this.site_http_address + "/collect/" + this.cluster_name);
84
85 Element coll_config_xml = loadCollConfigFile();
86 GSXSLT.modifyCollectionConfigForDebug(coll_config_xml);
87 Element build_config_xml = loadBuildConfigFile();
88
89 if (coll_config_xml == null || build_config_xml == null)
90 {
91 return false;
92 }
93
94 // process the metadata and display items and default library params
95 super.configureLocalData(coll_config_xml);
96 super.configureLocalData(build_config_xml);
97 // get extra collection specific stuff
98 findAndLoadInfo(coll_config_xml, build_config_xml);
99
100 // load up the OAIPMH serviceRack
101 configureServiceRacks(coll_config_xml, build_config_xml);
102
103 return true;
104
105 }
106
107
108 /**
109 * whether this collection has OAIPMH services
110 */
111 public boolean hasOAI()
112 {
113 return has_oai;
114 }
115
116 /** add any extra info for collection from OAIConfig.xml */
117 public boolean configureOAI(Element oai_config) {
118 // just pass the element to each service - should only be one
119 return this.oai_service_rack.configureOAI(oai_config);
120 }
121
122 /** override this to only load up OAIPMH serviceRack - don't need all the rest of them for oai*/
123 protected boolean configureServiceRackList(Element service_rack_list, Element extra_info)
124 {
125
126 // find the OAIPMH service
127 Element oai_service_xml = GSXML.getNamedElement(service_rack_list, GSXML.SERVICE_CLASS_ELEM, GSXML.NAME_ATT, "OAIPMH");
128 if (oai_service_xml == null) {
129 return false;
130 }
131
132 // the xml request to send to the serviceRack to query what services it provides
133 Document doc = XMLConverter.newDOM();
134 Element message = doc.createElement(GSXML.MESSAGE_ELEM);
135 Element request = GSXML.createBasicRequest(doc, GSXML.REQUEST_TYPE_DESCRIBE, "", new UserContext());
136 message.appendChild(request);
137
138 this.oai_service_rack = new OAIPMH();
139 this.oai_service_rack.setSiteHome(this.site_home);
140 this.oai_service_rack.setSiteAddress(this.site_http_address);
141 this.oai_service_rack.setClusterName(this.cluster_name);
142 this.oai_service_rack.setServiceCluster(this);
143 this.oai_service_rack.setMessageRouter(this.router);
144 // pass the xml node to the service for configuration
145 if (this.oai_service_rack.configure(oai_service_xml, extra_info)) {
146
147 // find out the supported service types for this service module
148 Node types = this.oai_service_rack.process(message);
149 NodeList typenodes = ((Element) types).getElementsByTagName(GSXML.SERVICE_ELEM);
150
151 for (int j = 0; j < typenodes.getLength(); j++)
152 {
153 String service = ((Element) typenodes.item(j)).getAttribute(GSXML.NAME_ATT);
154
155 if (service_map.get(service) != null)
156 {
157 char extra = '0';
158 String new_service = service + extra;
159
160 while (service_map.get(new_service) != null)
161 {
162 extra++;
163 new_service = service + extra;
164 }
165 this.service_name_map.put(new_service, service);
166 service = new_service;
167 ((Element) typenodes.item(j)).setAttribute(GSXML.NAME_ATT, service);
168 }
169 this.service_map.put(service, this.oai_service_rack);
170 // also add info to the ServiceInfo XML element
171 this.service_list.appendChild(this.desc_doc.importNode(typenodes.item(j), true));
172 }
173 has_oai = true;
174 return true;
175 }
176
177
178 return false;
179 }
180
181}
Note: See TracBrowser for help on using the repository browser.