--- /dev/null
+package org.open_ils.idl;
+import java.util.HashMap;
+import java.util.Iterator;
+
+
+public class IDLObject {
+
+ private String IDLClass;
+ private String fieldMapper;
+ private String controller;
+ private String rptLabel;
+ private HashMap<String, IDLField> fields;
+ private HashMap<String, IDLLink> links;
+
+ /** true if this is a virtual object (does not live in the database) */
+ private boolean isVirtual;
+
+ public IDLObject() {
+ fields = new HashMap<String, IDLField>();
+ links = new HashMap<String, IDLLink>();
+ }
+
+ public String getIDLClass() {
+ return IDLClass;
+ }
+
+ public void addLink(IDLLink link) {
+ links.put(link.getField(), link);
+ }
+
+ public void addField(IDLField field) {
+ fields.put(field.getName(), field);
+ }
+
+ public IDLField getField(String name) {
+ return (IDLField) fields.get(name);
+ }
+
+ public HashMap getFields() {
+ return fields;
+ }
+
+
+ /**
+ * Returns the link object found at the given field on
+ * this IDLObject.
+ */
+ public IDLLink getLink(String fieldName) {
+ return (IDLLink) links.get(fieldName);
+ }
+
+ public String getFieldMapper() {
+ return fieldMapper;
+ }
+
+ public String getController() {
+ return controller;
+ }
+
+ public String getRptLabel() {
+ return rptLabel;
+ }
+ public boolean isVirtual() {
+ return isVirtual;
+ }
+
+ public void setIDLClass(String IDLClass) {
+ this.IDLClass = IDLClass;
+ }
+
+ public void setFieldMapper(String fm) {
+ this.fieldMapper = fm;
+ }
+ public void setController(String controller) {
+ this.controller = controller;
+ }
+ public void setRptLabel(String label) {
+ this.rptLabel = label;
+ }
+ public void setIsVirtual(boolean isVirtual) {
+ this.isVirtual = isVirtual;
+ }
+
+
+ public void toXML(StringBuffer sb) {
+
+ sb.append("\t\t<fields>");
+ Iterator itr = fields.keySet().iterator();
+ IDLField field;
+ while(itr.hasNext()) {
+ field = fields.get((String) itr.next());
+ field.toXML(sb);
+ }
+ sb.append("\t\t</fields>");
+ }
+}
--- /dev/null
+package org.open_ils.idl;
+
+import org.opensrf.util.*;
+
+import java.util.HashMap;
+import java.util.Set;
+import java.util.Iterator;
+
+import java.io.InputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import javax.xml.stream.*;
+import javax.xml.stream.events.* ;
+import javax.xml.namespace.QName;
+
+
+public class IDLParser {
+
+ public static final String OILS_NS_BASE="http://opensrf.org/spec/IDL/base/v1";
+ public static final String OILS_NS_OBJ="http://open-ils.org/spec/opensrf/IDL/objects/v1";
+ public static final String OILS_NS_OBJ_PREFIX="oils_obj";
+ public static final String OILS_NS_PERSIST="http://open-ils.org/spec/opensrf/IDL/persistance/v1";
+ public static final String OILS_NS_PERSIST_PREFIX="oils_persist";
+ public static final String OILS_NS_REPORTER="http://open-ils.org/spec/opensrf/IDL/reporter/v1";
+ public static final String OILS_NS_REPORTER_PREFIX="reporter";
+
+ /** The source for the IDL XML */
+ InputStream inStream;
+ HashMap<String, IDLObject> IDLObjects;
+ IDLObject current;
+
+ /** If true, we retain the full set of IDL objects in memory. This is true by default. */
+ private boolean keepIDLObjects;
+
+ public IDLParser() {
+ IDLObjects = new HashMap<String, IDLObject>();
+ keepIDLObjects = true;
+ }
+
+ public IDLParser(String fileName) throws IOException {
+ this(new FileInputStream(fileName));
+ }
+
+ public IDLParser(InputStream inStream) {
+ this();
+ this.inStream = inStream;
+ }
+
+ /**
+ * Parses the IDL XML
+ */
+ public void parse() throws IOException {
+
+ try {
+ XMLInputFactory factory = XMLInputFactory.newInstance();
+
+ /** disable as many unused features as possible to speed up the parsing */
+ factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, Boolean.FALSE);
+ factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE);
+ factory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.TRUE);
+ factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);
+ factory.setProperty(XMLInputFactory.SUPPORT_DTD, Boolean.FALSE);
+
+
+ /** create the stream reader */
+ XMLStreamReader reader = factory.createXMLStreamReader(this.inStream);
+ int eventType;
+
+ while(reader.hasNext()) {
+ /** cycle through the XML events */
+
+ eventType = reader.next();
+
+ switch(eventType) {
+
+ case XMLEvent.START_ELEMENT:
+ handleStartElement(reader);
+ break;
+
+ case XMLEvent.END_ELEMENT:
+ handleEndElement(reader);
+ break;
+ }
+ }
+
+ } catch(javax.xml.stream.XMLStreamException se) {
+ /* throw local exception */
+ }
+ }
+
+ /**
+ * Returns the IDLObject with the given IDLClass
+ */
+ public IDLObject getObject(String IDLClass) {
+ return (IDLObject) IDLObjects.get(IDLClass);
+ }
+
+ public void handleStartElement(XMLStreamReader reader) {
+
+ if(!OILS_NS_BASE.equals(reader.getNamespaceURI())) return;
+ String localpart = reader.getLocalName();
+
+ if( "class".equals(localpart) ) {
+ current = new IDLObject();
+ current.setIDLClass(reader.getAttributeValue(null, "id"));
+ current.setController(reader.getAttributeValue(null, "controller"));
+ String persist = reader.getAttributeValue(OILS_NS_PERSIST, "virtual");
+ current.setIsVirtual("persist".equals(reader.getAttributeValue(OILS_NS_PERSIST, "virtual")));
+ return;
+ }
+
+ if( "field".equals(localpart) ) {
+ IDLField field = new IDLField();
+ field.setName(reader.getAttributeValue(null, "name"));
+ field.setArrayPos(new Integer(reader.getAttributeValue(OILS_NS_OBJ, "array_position")));
+ field.setIsVirtual("true".equals(reader.getAttributeValue(OILS_NS_PERSIST, "virtual")));
+ current.addField(field);
+ }
+
+ if( "link".equals(localpart) ) {
+ IDLLink link = new IDLLink();
+ link.setField(reader.getAttributeValue(null, "field"));
+ link.setReltype(reader.getAttributeValue(null, "reltype"));
+ link.setKey(reader.getAttributeValue(null, "key"));
+ link.setMap(reader.getAttributeValue(null, "map"));
+ link.setIDLClass(reader.getAttributeValue(null, "class"));
+ current.addLink(link);
+ }
+ }
+
+ public void handleEndElement(XMLStreamReader reader) {
+
+ if(!OILS_NS_BASE.equals(reader.getNamespaceURI())) return;
+ String localpart = reader.getLocalName();
+
+ if("class".equals(localpart)) {
+
+ if(keepIDLObjects)
+ IDLObjects.put(current.getIDLClass(), current);
+
+ HashMap fields = current.getFields();
+ String fieldNames[] = new String[fields.size()];
+
+ for(Iterator itr = fields.keySet().iterator(); itr.hasNext(); ) {
+ String key = (String) itr.next();
+ IDLField field = (IDLField) fields.get(key);
+ fieldNames[ field.getArrayPos() ] = field.getName();
+ }
+
+ OSRFRegistry.registerObject(
+ current.getIDLClass(), OSRFRegistry.WireProtocol.ARRAY, fieldNames);
+
+ current = null;
+ }
+ }
+
+
+ public String toXML() {
+ StringBuffer sb = new StringBuffer();
+ Set keys = IDLObjects.keySet();
+ Iterator itr = IDLObjects.keySet().iterator();
+ String IDLClass;
+ IDLObject obj;
+ while(itr.hasNext()) {
+ IDLClass = (String) itr.next();
+ obj = IDLObjects.get(IDLClass);
+ obj.toXML(sb);
+ }
+ return sb.toString();
+ }
+}
+
+
+
+
+
+