1 40 package org.dspace.administer; 41 42 import java.io.File ; 43 import java.io.IOException ; 44 import java.sql.SQLException ; 45 46 import javax.xml.parsers.DocumentBuilder ; 47 import javax.xml.parsers.DocumentBuilderFactory ; 48 import javax.xml.parsers.ParserConfigurationException ; 49 import javax.xml.transform.TransformerException ; 50 51 import org.apache.log4j.Logger; 52 import org.apache.xpath.XPathAPI; 53 import org.dspace.authorize.AuthorizeException; 54 import org.dspace.content.BitstreamFormat; 55 import org.dspace.content.MetadataField; 56 import org.dspace.content.MetadataSchema; 57 import org.dspace.content.NonUniqueMetadataException; 58 import org.dspace.core.Context; 59 import org.dspace.core.LogManager; 60 import org.w3c.dom.Document ; 61 import org.w3c.dom.Node ; 62 import org.w3c.dom.NodeList ; 63 import org.xml.sax.SAXException ; 64 65 78 public class RegistryLoader 79 { 80 81 private static Logger log = Logger.getLogger(RegistryLoader.class); 82 83 89 public static void main(String [] argv) throws Exception  90 { 91 String usage = "Usage: " + RegistryLoader.class.getName() 92 + " (-bitstream | -dc) registry-file.xml"; 93 94 Context context = null; 95 96 try 97 { 98 context = new Context(); 99 100 context.setIgnoreAuthorization(true); 103 104 if (argv[0].equalsIgnoreCase("-bitstream")) 106 { 107 RegistryLoader.loadBitstreamFormats(context, argv[1]); 108 } 109 else if (argv[0].equalsIgnoreCase("-dc")) 110 { 111 loadDublinCoreTypes(context, argv[1]); 112 } 113 else 114 { 115 System.err.println(usage); 116 } 117 118 context.complete(); 119 120 System.exit(0); 121 } 122 catch (ArrayIndexOutOfBoundsException ae) 123 { 124 System.err.println(usage); 125 126 if (context != null) 127 { 128 context.abort(); 129 } 130 131 System.exit(1); 132 } 133 catch (Exception e) 134 { 135 log.fatal(LogManager.getHeader(context, "error_loading_registries", 136 ""), e); 137 138 if (context != null) 139 { 140 context.abort(); 141 } 142 143 System.exit(1); 144 } 145 } 146 147 155 public static void loadBitstreamFormats(Context context, String filename) 156 throws SQLException , IOException , ParserConfigurationException , 157 SAXException , TransformerException , AuthorizeException 158 { 159 Document document = loadXML(filename); 160 161 NodeList typeNodes = XPathAPI.selectNodeList(document, 163 "dspace-bitstream-types/bitstream-type"); 164 165 for (int i = 0; i < typeNodes.getLength(); i++) 167 { 168 Node n = typeNodes.item(i); 169 loadFormat(context, n); 170 } 171 172 log.info(LogManager.getHeader(context, "load_bitstream_formats", 173 "number_loaded=" + typeNodes.getLength())); 174 } 175 176 185 private static void loadFormat(Context context, Node node) 186 throws SQLException , IOException , TransformerException , 187 AuthorizeException 188 { 189 String mimeType = getElementData(node, "mimetype"); 191 String shortDesc = getElementData(node, "short_description"); 192 String desc = getElementData(node, "description"); 193 194 String supportLevelString = getElementData(node, "support_level"); 195 int supportLevel = Integer.parseInt(supportLevelString); 196 197 String internalString = getElementData(node, "internal"); 198 boolean internal = new Boolean (internalString).booleanValue(); 199 200 String [] extensions = getRepeatedElementData(node, "extension"); 201 202 BitstreamFormat format = BitstreamFormat.create(context); 204 205 format.setMIMEType(mimeType); 207 format.setShortDescription(shortDesc); 208 format.setDescription(desc); 209 format.setSupportLevel(supportLevel); 210 format.setInternal(internal); 211 format.setExtensions(extensions); 212 213 format.update(); 215 } 216 217 226 public static void loadDublinCoreTypes(Context context, String filename) 227 throws SQLException , IOException , ParserConfigurationException , 228 SAXException , TransformerException , AuthorizeException, 229 NonUniqueMetadataException 230 { 231 Document document = loadXML(filename); 232 233 NodeList typeNodes = XPathAPI.selectNodeList(document, 235 "/dspace-dc-types/dc-type"); 236 237 for (int i = 0; i < typeNodes.getLength(); i++) 239 { 240 Node n = typeNodes.item(i); 241 loadDCType(context, n); 242 } 243 244 log.info(LogManager.getHeader(context, "load_dublin_core_types", 245 "number_loaded=" + typeNodes.getLength())); 246 } 247 248 258 private static void loadDCType(Context context, Node node) 259 throws SQLException , IOException , TransformerException , 260 AuthorizeException, NonUniqueMetadataException 261 { 262 String schema = getElementData(node, "schema"); 264 String element = getElementData(node, "element"); 265 String qualifier = getElementData(node, "qualifier"); 266 String scopeNote = getElementData(node, "scope_note"); 267 268 if (schema == null) 270 { 271 schema = MetadataSchema.DC_SCHEMA; 272 } 273 274 MetadataSchema schemaObj = MetadataSchema.find(context, schema); 276 277 MetadataField field = new MetadataField(); 278 field.setSchemaID(schemaObj.getSchemaID()); 279 field.setElement(element); 280 field.setQualifier(qualifier); 281 field.setScopeNote(scopeNote); 282 field.create(context); 283 } 284 285 287 295 private static Document loadXML(String filename) throws IOException , 296 ParserConfigurationException , SAXException  297 { 298 DocumentBuilder builder = DocumentBuilderFactory.newInstance() 299 .newDocumentBuilder(); 300 301 return builder.parse(new File (filename)); 302 } 303 304 323 private static String getElementData(Node parentElement, String childName) 324 throws TransformerException  325 { 326 Node childNode = XPathAPI.selectSingleNode(parentElement, childName); 328 329 if (childNode == null) 330 { 331 return null; 333 } 334 335 Node dataNode = childNode.getFirstChild(); 337 338 if (dataNode == null) 339 { 340 return null; 341 } 342 343 String value = dataNode.getNodeValue().trim(); 345 346 return value; 347 } 348 349 371 private static String [] getRepeatedElementData(Node parentElement, 372 String childName) throws TransformerException  373 { 374 NodeList childNodes = XPathAPI.selectNodeList(parentElement, childName); 376 377 String [] data = new String [childNodes.getLength()]; 378 379 for (int i = 0; i < childNodes.getLength(); i++) 380 { 381 Node dataNode = childNodes.item(i).getFirstChild(); 383 384 data[i] = dataNode.getNodeValue().trim(); 386 } 387 388 return data; 389 } 390 } 391
| Popular Tags
|