/** * Finds the {@link Maker} used to create {@link FONode} objects of a particular type * * @param namespaceURI URI for the namespace of the element * @param localName name of the Element * @return the ElementMapping.Maker that can create an FO object for this element * @throws FOPException if a Maker could not be found for a bound namespace. */ private Maker findFOMaker(String namespaceURI, String localName) throws FOPException { Maker maker = elementMappingRegistry.findFOMaker(namespaceURI, localName, locator); if (maker instanceof UnknownXMLObj.Maker) { FOValidationEventProducer eventProducer = FOValidationEventProducer.Provider.get(userAgent.getEventBroadcaster()); eventProducer.unknownFormattingObject( this, currentFObj.getName(), new QName(namespaceURI, localName), getEffectiveLocator()); } return maker; }
/** {@inheritDoc} */ public void endDocument() throws SAXException { this.delegate.endDocument(); if (this.rootFObj == null && empty) { FOValidationEventProducer eventProducer = FOValidationEventProducer.Provider.get(userAgent.getEventBroadcaster()); eventProducer.emptyDocument(this); } rootFObj = null; if (log.isDebugEnabled()) { log.debug("Parsing of document complete"); } foEventHandler.endDocument(); }
/** {@inheritDoc} */ public void startElement( String namespaceURI, String localName, String rawName, Attributes attlist) throws SAXException { /* the node found in the FO document */ FONode foNode; PropertyList propertyList = null; // Check to ensure first node encountered is an fo:root if (rootFObj == null) { empty = false; if (!namespaceURI.equals(FOElementMapping.URI) || !localName.equals("root")) { FOValidationEventProducer eventProducer = FOValidationEventProducer.Provider.get(userAgent.getEventBroadcaster()); eventProducer.invalidFORoot( this, FONode.getNodeString(namespaceURI, localName), getEffectiveLocator()); } } else { // check that incoming node is valid for currentFObj if (currentFObj.getNamespaceURI().equals(FOElementMapping.URI) || currentFObj.getNamespaceURI().equals(ExtensionElementMapping.URI)) { currentFObj.validateChildNode(locator, namespaceURI, localName); } } ElementMapping.Maker fobjMaker = findFOMaker(namespaceURI, localName); try { foNode = fobjMaker.make(currentFObj); if (rootFObj == null) { rootFObj = (Root) foNode; rootFObj.setBuilderContext(builderContext); rootFObj.setFOEventHandler(foEventHandler); } propertyList = foNode.createPropertyList(currentPropertyList, foEventHandler); foNode.processNode(localName, getEffectiveLocator(), attlist, propertyList); if (foNode.getNameId() == Constants.FO_MARKER) { if (builderContext.inMarker()) { nestedMarkerDepth++; } else { builderContext.switchMarkerContext(true); } } if (foNode.getNameId() == Constants.FO_PAGE_SEQUENCE) { builderContext.getXMLWhiteSpaceHandler().reset(); } } catch (IllegalArgumentException e) { throw new SAXException(e); } ContentHandlerFactory chFactory = foNode.getContentHandlerFactory(); if (chFactory != null) { ContentHandler subHandler = chFactory.createContentHandler(); if (subHandler instanceof ObjectSource && foNode instanceof ObjectBuiltListener) { ((ObjectSource) subHandler).setObjectBuiltListener((ObjectBuiltListener) foNode); } subHandler.startDocument(); subHandler.startElement(namespaceURI, localName, rawName, attlist); depth = 1; delegate = subHandler; } if (currentFObj != null) { currentFObj.addChildNode(foNode); } currentFObj = foNode; if (propertyList != null && !builderContext.inMarker()) { currentPropertyList = propertyList; } // fo:characters can potentially be removed during // white-space handling. // Do not notify the FOEventHandler. if (currentFObj.getNameId() != Constants.FO_CHARACTER) { currentFObj.startOfNode(); } }