package openadk.library.impl.surrogates; import java.util.logging.Logger; import javax.xml.stream.XMLStreamReader; import org.apache.commons.jxpath.JXPathContext; import org.apache.commons.jxpath.ri.model.NodePointer; import openadk.library.ADK; import openadk.library.ADKParsingException; import openadk.library.Element; import openadk.library.ElementDef; import openadk.library.SIFElement; import openadk.library.SIFFormatter; import openadk.library.SIFVersion; import openadk.library.SIFWriter; import openadk.library.common.Address; import openadk.library.common.CommonDTD; import openadk.library.student.StudentAddress; import openadk.library.student.StudentAddressList; import openadk.library.student.StudentDTD; import openadk.library.student.StudentPersonal; import openadk.library.tools.xpath.SIFElementPointer; import openadk.util.XMLWriter; /** * A surrogate for reading the StudentAddress element and rendering the AddressList element for legacy agents * * @author Stephen Miller * */ public class StudentAddressSurrogate extends AbstractRenderSurrogate implements RenderSurrogate { public StudentAddressSurrogate(ElementDef def) { super(def); } // write it out in 1.5r1 format public void renderRaw(XMLWriter writer, SIFVersion version, Element o, SIFFormatter formatter) { if (!(o instanceof SIFElement)) { Logger.getLogger("openadk.library.StudentAddressSurrogate").warning("StudentAddressSurrogate got an unacceptable element of type " + o.getClass() + "/" + o.getElementDef().name() + "(" + o + ") in renderRaw"); return; } SIFElement element = (SIFElement) o; for (SIFElement address : element.getChildList(CommonDTD.ADDRESS)) { writer.tab(); // FIXME: Should this be the default? Probably not... writer.write("<StudentAddress PickupOrDropoff=\"NA\" DayOfWeek=\"NA\">"); writer.write("\r\n"); writer.indent(1); writer.tab(); SIFWriter addressWriter = new SIFWriter(writer, true); addressWriter.suppressNamespace(true); addressWriter.write(version, address); writer.indent(-1); writer.tab(); writer.write("</StudentAddress>"); writer.write("\r\n"); } } public boolean readRaw(XMLStreamReader reader, SIFVersion version, SIFElement parent, SIFFormatter formatter) throws ADKParsingException { if (!reader.getLocalName().equals("StudentAddress")) { return false; } try { StudentPersonal studentPersonal = (StudentPersonal) parent; StudentAddressList addressList = (StudentAddressList) studentPersonal.getChild(StudentDTD.STUDENTPERSONAL_ADDRESSLIST); if (addressList == null) { addressList = new StudentAddressList(); studentPersonal.setAddressList(addressList); } StudentAddressPullParser parser = new StudentAddressPullParser(); StudentAddress studentAddress = (StudentAddress) parser.parseOneElementFromStream(reader, version, ADK.DTD(), null, 0); Address address = studentAddress.getAddress(); studentAddress.removeChild(address); addressList.add(address); if (reader.hasNext()) { reader.nextTag(); } } catch (Exception e) { throw new ADKParsingException("Could not read StudentAddress: " + e.getMessage(), null, e); } return true; } @Override public String toString() { return "StudentAddressSurrogate{}"; } /** * Creates the Child as the result of an XPath Expression and returns the NodePointer wrapping the child */ public NodePointer createChild(NodePointer parentPointer, SIFFormatter formatter, SIFVersion version, JXPathContext context) { StudentPersonal studentPersonal = (StudentPersonal) parentPointer.getValue(); StudentAddressList addressList = studentPersonal.getAddressList(); if (addressList == null) { addressList = new StudentAddressList(); studentPersonal.setAddressList(addressList); } return new SIFElementPointer(parentPointer, addressList, version); } /** * Creates a NodePointer that "wraps" the specified ADK 2.0 element, but appears to JXPath as if it uses the SIF 1.5 * path. * * XPathSurrogates always represent a surrogate around an ADK 2.0 Simple Field * */ public NodePointer createNodePointer(NodePointer parent, Element sourceElement, SIFVersion version) { return new SIFElementPointer(parent, (SIFElement) sourceElement, version); } public String getPath() { return "StudentAddress"; } }