1 package org.open_ils.idl;
3 import org.opensrf.util.*;
5 import java.util.HashMap;
7 import java.util.Iterator;
9 import java.io.InputStream;
10 import java.io.FileInputStream;
11 import java.io.IOException;
13 import javax.xml.stream.*;
14 import javax.xml.stream.events.* ;
15 import javax.xml.namespace.QName;
18 public class IDLParser {
20 public static final String OILS_NS_BASE="http://opensrf.org/spec/IDL/base/v1";
21 public static final String OILS_NS_OBJ="http://open-ils.org/spec/opensrf/IDL/objects/v1";
22 public static final String OILS_NS_OBJ_PREFIX="oils_obj";
23 public static final String OILS_NS_PERSIST="http://open-ils.org/spec/opensrf/IDL/persistence/v1";
24 public static final String OILS_NS_PERSIST_PREFIX="oils_persist";
25 public static final String OILS_NS_REPORTER="http://open-ils.org/spec/opensrf/IDL/reporter/v1";
26 public static final String OILS_NS_REPORTER_PREFIX="reporter";
28 /** The source for the IDL XML */
30 HashMap<String, IDLObject> IDLObjects;
33 /** If true, we retain the full set of IDL objects in memory. This is true by default. */
34 private boolean keepIDLObjects;
37 IDLObjects = new HashMap<String, IDLObject>();
38 keepIDLObjects = true;
41 public IDLParser(String fileName) throws IOException {
42 this(new FileInputStream(fileName));
45 public IDLParser(InputStream inStream) {
47 this.inStream = inStream;
53 public void parse() throws IOException, IDLException {
56 XMLInputFactory factory = XMLInputFactory.newInstance();
58 /** disable as many unused features as possible to speed up the parsing */
59 factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, Boolean.FALSE);
60 factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE);
61 factory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.TRUE);
62 factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);
63 factory.setProperty(XMLInputFactory.SUPPORT_DTD, Boolean.FALSE);
66 /** create the stream reader */
67 XMLStreamReader reader = factory.createXMLStreamReader(this.inStream);
70 while(reader.hasNext()) {
71 /** cycle through the XML events */
73 eventType = reader.next();
77 case XMLEvent.START_ELEMENT:
78 handleStartElement(reader);
81 case XMLEvent.END_ELEMENT:
82 handleEndElement(reader);
87 } catch(javax.xml.stream.XMLStreamException se) {
88 throw new IDLException("Error parsing IDL XML", se);
93 * Returns the IDLObject with the given IDLClass
95 public IDLObject getObject(String IDLClass) {
96 return (IDLObject) IDLObjects.get(IDLClass);
99 public void handleStartElement(XMLStreamReader reader) {
101 if(!OILS_NS_BASE.equals(reader.getNamespaceURI())) return;
102 String localpart = reader.getLocalName();
104 if( "class".equals(localpart) ) {
105 current = new IDLObject();
106 current.setIDLClass(reader.getAttributeValue(null, "id"));
107 current.setController(reader.getAttributeValue(null, "controller"));
108 String persist = reader.getAttributeValue(OILS_NS_PERSIST, "virtual");
109 current.setIsVirtual("persist".equals(reader.getAttributeValue(OILS_NS_PERSIST, "virtual")));
113 if( "field".equals(localpart) ) {
114 IDLField field = new IDLField();
115 field.setName(reader.getAttributeValue(null, "name"));
116 field.setArrayPos(new Integer(reader.getAttributeValue(OILS_NS_OBJ, "array_position")));
117 field.setIsVirtual("true".equals(reader.getAttributeValue(OILS_NS_PERSIST, "virtual")));
118 current.addField(field);
121 if( "link".equals(localpart) ) {
122 IDLLink link = new IDLLink();
123 link.setField(reader.getAttributeValue(null, "field"));
124 link.setReltype(reader.getAttributeValue(null, "reltype"));
125 link.setKey(reader.getAttributeValue(null, "key"));
126 link.setMap(reader.getAttributeValue(null, "map"));
127 link.setIDLClass(reader.getAttributeValue(null, "class"));
128 current.addLink(link);
132 public void handleEndElement(XMLStreamReader reader) throws IDLException {
134 if(!OILS_NS_BASE.equals(reader.getNamespaceURI())) return;
135 String localpart = reader.getLocalName();
137 if("class".equals(localpart)) {
140 IDLObjects.put(current.getIDLClass(), current);
142 HashMap fields = current.getFields();
143 String fieldNames[] = new String[fields.size()];
145 for(Iterator itr = fields.keySet().iterator(); itr.hasNext(); ) {
146 String key = (String) itr.next();
147 IDLField field = (IDLField) fields.get(key);
149 fieldNames[ field.getArrayPos() ] = field.getName();
150 } catch(ArrayIndexOutOfBoundsException E) {
151 String msg = "class="+current.getIDLClass()+";field="+key+
152 ";fieldcount="+fields.size()+";currentpos="+field.getArrayPos();
153 throw new IDLException(msg, E);
157 OSRFRegistry.registerObject(
158 current.getIDLClass(), OSRFRegistry.WireProtocol.ARRAY, fieldNames);
165 public String toXML() {
166 StringBuffer sb = new StringBuffer();
167 Set keys = IDLObjects.keySet();
168 Iterator itr = IDLObjects.keySet().iterator();
171 while(itr.hasNext()) {
172 IDLClass = (String) itr.next();
173 obj = IDLObjects.get(IDLClass);
176 return sb.toString();