package openadk.library.impl.surrogates; import javax.xml.stream.XMLStreamReader; import org.apache.commons.jxpath.JXPathContext; import org.apache.commons.jxpath.ri.model.NodePointer; import openadk.library.*; import openadk.library.common.CommonDTD; import openadk.library.common.PhoneNumber; import openadk.library.tools.xpath.SIFElementPointer; import openadk.util.XMLWriter; /** * RenderSurrogate that renders and parses the SIF 1.5r1 and SIF 1.1 PhoneNumber * elements into their SIF 2.0 format * @author Andrew * */ public class PhoneNumberSurrogate extends AbstractRenderSurrogate implements RenderSurrogate { public PhoneNumberSurrogate( ElementDef def ){ super( def ); } /* (non-Javadoc) * @see openadk.library.impl.surrogates.RenderSurrogate#renderRaw(openadk.util.XMLWriter, openadk.library.SIFVersion, openadk.library.Element, openadk.library.SIFFormatter) */ public void renderRaw(XMLWriter writer, SIFVersion version, Element o, SIFFormatter formatter) throws SIFException { PhoneNumber pn = (PhoneNumber)o; if( pn != null ){ writer.tab(); writer.write( "<PhoneNumber" ); writer.write(" Format=\"NA\"" ); String type = pn.getType(); if( type != null ){ writer.write(" Type=\"" ); writer.printXmlText( type ); writer.write( "\">" ); } String number = pn.getNumber(); if( number != null ){ writer.printXmlText( number ); } writer.write( "</PhoneNumber>" ); writer.write( "\r\n" ); } } /* (non-Javadoc) * @see openadk.library.impl.surrogates.RenderSurrogate#readRaw(javax.xml.stream.XMLStreamReader, openadk.library.SIFVersion, openadk.library.SIFElement, openadk.library.SIFFormatter) */ public boolean readRaw(XMLStreamReader reader, SIFVersion version, SIFElement parent, SIFFormatter formatter) throws ADKParsingException { if( !reader.getLocalName().equals( "PhoneNumber" ) ){ return false; } PhoneNumber phone = new PhoneNumber(); String type = reader.getAttributeValue( null, "Type" ); if( type != null ){ phone.setType( type ); } String format = reader.getAttributeValue( null, "Format" ); if( format != null ){ phone.setFormat( format ); } String number = consumeElementTextValue( reader, version ); if( number != null ){ phone.setNumber( number ); } formatter.addChild( parent, phone, version ); return true; } /* (non-Javadoc) * @see openadk.library.impl.surrogates.RenderSurrogate#lookupBySQP(java.lang.String) */ public ElementDef lookupBySQP(String sqp) { if( sqp.length() == 0 ){ // This query pattern points to the PhoneNumber element itself. The // resolved ElementDef should be the PhoneNumber/Number element return CommonDTD.PHONENUMBER_NUMBER; } if( sqp.equals( "@Type" ) ){ return CommonDTD.PHONENUMBER_TYPE; } return null; } public NodePointer createChild(NodePointer parentPointer, SIFFormatter formatter, SIFVersion version, JXPathContext context ) { PhoneNumber phone = new PhoneNumber(); phone.setField( CommonDTD.PHONENUMBER_NUMBER, new SIFString( null ) ); SIFElement owner = (SIFElement)parentPointer.getBaseValue(); formatter.addChild(owner, phone, version ); return new PhoneNumberPointer( parentPointer, phone, version ); } public NodePointer createNodePointer(NodePointer parent, Element element, SIFVersion version) { if( !(element instanceof PhoneNumber) ){ throw new IllegalArgumentException( "Cannot create NodePointer for Elements other than PhoneNumber" ); } return new PhoneNumberPointer( parent, (PhoneNumber)element, version ); } private class PhoneNumberPointer extends SIFElementPointer { /** * */ private static final long serialVersionUID = -4097128904146442941L; PhoneNumberPointer(NodePointer parentpointer, SIFElement element, SIFVersion version) { super(parentpointer, element, version); } @Override public void setValue(Object value) { PhoneNumber phone = (PhoneNumber)getBaseValue(); phone.setNumber( value.toString() ); } @Override public Object getValue() { PhoneNumber phone = (PhoneNumber)getBaseValue(); return phone.getField( CommonDTD.PHONENUMBER_NUMBER ); } } public String getPath() { return "PhoneNumber"; } }