/* * ==================================================================== * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ==================================================================== */ package org.apache.poi.sl.draw.geom; import java.io.InputStream; import java.util.LinkedHashMap; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import javax.xml.stream.EventFilter; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; import org.apache.poi.sl.draw.binding.CTCustomGeometry2D; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; /** * */ public class PresetGeometries extends LinkedHashMap<String, CustomGeometry> { private final static POILogger LOG = POILogFactory.getLogger(PresetGeometries.class); protected final static String BINDING_PACKAGE = "org.apache.poi.sl.draw.binding"; protected static PresetGeometries _inst; protected PresetGeometries(){} @SuppressWarnings("unused") public void init(InputStream is) throws XMLStreamException, JAXBException { // StAX: EventFilter startElementFilter = new EventFilter() { @Override public boolean accept(XMLEvent event) { return event.isStartElement(); } }; XMLInputFactory staxFactory = XMLInputFactory.newFactory(); XMLEventReader staxReader = staxFactory.createXMLEventReader(is); XMLEventReader staxFiltRd = staxFactory.createFilteredReader(staxReader, startElementFilter); // ignore StartElement: /* XMLEvent evDoc = */ staxFiltRd.nextEvent(); // JAXB: JAXBContext jaxbContext = JAXBContext.newInstance(BINDING_PACKAGE); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); long cntElem = 0; while (staxFiltRd.peek() != null) { StartElement evRoot = (StartElement)staxFiltRd.peek(); String name = evRoot.getName().getLocalPart(); JAXBElement<CTCustomGeometry2D> el = unmarshaller.unmarshal(staxReader, CTCustomGeometry2D.class); CTCustomGeometry2D cus = el.getValue(); cntElem++; if(containsKey(name)) { LOG.log(POILogger.WARN, "Duplicate definition of " + name); } put(name, new CustomGeometry(cus)); } } /** * Convert a single CustomGeometry object, i.e. from xmlbeans */ public static CustomGeometry convertCustomGeometry(XMLStreamReader staxReader) { try { JAXBContext jaxbContext = JAXBContext.newInstance(BINDING_PACKAGE); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); JAXBElement<CTCustomGeometry2D> el = unmarshaller.unmarshal(staxReader, CTCustomGeometry2D.class); return new CustomGeometry(el.getValue()); } catch (JAXBException e) { LOG.log(POILogger.ERROR, "Unable to parse single custom geometry", e); return null; } } public static synchronized PresetGeometries getInstance(){ if(_inst == null) { // use a local object first to not assign a partly constructed object // in case of failure PresetGeometries lInst = new PresetGeometries(); try { InputStream is = PresetGeometries.class. getResourceAsStream("presetShapeDefinitions.xml"); try { lInst.init(is); } finally { is.close(); } } catch (Exception e){ throw new RuntimeException(e); } _inst = lInst; } return _inst; } }