migrated XDGF factories git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1880900 13f79535-47bb-0310-9956-ffa450edef68tags/before_ooxml_3rd_edition
/* ==================================================================== | |||||
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.xdgf.usermodel.section; | |||||
import java.util.Map; | |||||
import java.util.function.Function; | |||||
import java.util.stream.Collectors; | |||||
import java.util.stream.Stream; | |||||
import com.microsoft.schemas.office.visio.x2012.main.RowType; | |||||
import org.apache.poi.ooxml.POIXMLException; | |||||
import org.apache.poi.util.Internal; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.ArcTo; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.Ellipse; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.EllipticalArcTo; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.GeometryRow; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.InfiniteLine; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.LineTo; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.MoveTo; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.NURBSTo; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.PolyLineTo; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.RelCubBezTo; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.RelEllipticalArcTo; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.RelLineTo; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.RelMoveTo; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.RelQuadBezTo; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.SplineKnot; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.SplineStart; | |||||
@Internal | |||||
enum GeometryRowTypes { | |||||
ARC_TO("ArcTo", ArcTo::new), | |||||
ELLIPSE("Ellipse", Ellipse::new), | |||||
ELLIPTICAL_ARC_TO("EllipticalArcTo", EllipticalArcTo::new), | |||||
INFINITE_LINE("InfiniteLine", InfiniteLine::new), | |||||
LINE_TO("LineTo", LineTo::new), | |||||
MOVE_TO("MoveTo", MoveTo::new), | |||||
NURBS_TO("NURBSTo", NURBSTo::new), | |||||
// Note - two different spellings depending on version used...! | |||||
POLYLINE_TO("PolylineTo", PolyLineTo::new), | |||||
REL_CUB_BEZ_TO("RelCubBezTo", RelCubBezTo::new), | |||||
REL_ELLIPTICAL_ARC_TO("RelEllipticalArcTo", RelEllipticalArcTo::new), | |||||
REL_LINE_TO("RelLineTo", RelLineTo::new), | |||||
REL_MOVE_TO("RelMoveTo", RelMoveTo::new), | |||||
REL_QUAD_BEZ_TO("RelQuadBezTo", RelQuadBezTo::new), | |||||
SPLINE_KNOT("SplineKnot", SplineKnot::new), | |||||
SPLINE_START("SplineStart", SplineStart::new) | |||||
; | |||||
public String rowType; | |||||
public Function<RowType, ? extends GeometryRow> constructor; | |||||
GeometryRowTypes(String rowType, Function<RowType, ? extends GeometryRow> constructor) { | |||||
this.rowType = rowType; | |||||
this.constructor = constructor; | |||||
} | |||||
public String getRowType() { | |||||
return rowType; | |||||
} | |||||
public static GeometryRow load(RowType row) { | |||||
final String name = row.getT(); | |||||
GeometryRowTypes l = LOOKUP.get(name); | |||||
if (l == null) { | |||||
final String typeName = row.schemaType().getName().getLocalPart(); | |||||
throw new POIXMLException("Invalid '" + typeName + "' name '" + name + "'"); | |||||
} | |||||
return l.constructor.apply(row); | |||||
} | |||||
private static final Map<String, GeometryRowTypes> LOOKUP = | |||||
Stream.of(values()).collect(Collectors.toMap(GeometryRowTypes::getRowType, Function.identity())); | |||||
} |
import java.util.SortedMap; | import java.util.SortedMap; | ||||
import java.util.TreeMap; | import java.util.TreeMap; | ||||
import com.microsoft.schemas.office.visio.x2012.main.RowType; | |||||
import com.microsoft.schemas.office.visio.x2012.main.SectionType; | |||||
import org.apache.poi.ooxml.POIXMLException; | import org.apache.poi.ooxml.POIXMLException; | ||||
import org.apache.poi.xdgf.geom.SplineCollector; | import org.apache.poi.xdgf.geom.SplineCollector; | ||||
import org.apache.poi.xdgf.usermodel.XDGFCell; | import org.apache.poi.xdgf.usermodel.XDGFCell; | ||||
import org.apache.poi.xdgf.usermodel.XDGFSheet; | import org.apache.poi.xdgf.usermodel.XDGFSheet; | ||||
import org.apache.poi.xdgf.usermodel.section.geometry.Ellipse; | import org.apache.poi.xdgf.usermodel.section.geometry.Ellipse; | ||||
import org.apache.poi.xdgf.usermodel.section.geometry.GeometryRow; | import org.apache.poi.xdgf.usermodel.section.geometry.GeometryRow; | ||||
import org.apache.poi.xdgf.usermodel.section.geometry.GeometryRowFactory; | |||||
import org.apache.poi.xdgf.usermodel.section.geometry.InfiniteLine; | import org.apache.poi.xdgf.usermodel.section.geometry.InfiniteLine; | ||||
import org.apache.poi.xdgf.usermodel.section.geometry.SplineKnot; | import org.apache.poi.xdgf.usermodel.section.geometry.SplineKnot; | ||||
import org.apache.poi.xdgf.usermodel.section.geometry.SplineStart; | import org.apache.poi.xdgf.usermodel.section.geometry.SplineStart; | ||||
import com.microsoft.schemas.office.visio.x2012.main.RowType; | |||||
import com.microsoft.schemas.office.visio.x2012.main.SectionType; | |||||
public class GeometrySection extends XDGFSection { | public class GeometrySection extends XDGFSection { | ||||
GeometrySection _master; | GeometrySection _master; | ||||
if (_rows.containsKey(row.getIX())) | if (_rows.containsKey(row.getIX())) | ||||
throw new POIXMLException("Index element '" + row.getIX() + "' already exists"); | throw new POIXMLException("Index element '" + row.getIX() + "' already exists"); | ||||
_rows.put(row.getIX(), GeometryRowFactory.load(row)); | |||||
_rows.put(row.getIX(), GeometryRowTypes.load(row)); | |||||
} | } | ||||
} | } | ||||
import java.util.HashMap; | import java.util.HashMap; | ||||
import java.util.Map; | import java.util.Map; | ||||
import org.apache.poi.ooxml.POIXMLException; | |||||
import com.microsoft.schemas.office.visio.x2012.main.CellType; | |||||
import com.microsoft.schemas.office.visio.x2012.main.SectionType; | |||||
import org.apache.poi.util.Internal; | import org.apache.poi.util.Internal; | ||||
import org.apache.poi.xdgf.usermodel.XDGFCell; | import org.apache.poi.xdgf.usermodel.XDGFCell; | ||||
import org.apache.poi.xdgf.usermodel.XDGFSheet; | import org.apache.poi.xdgf.usermodel.XDGFSheet; | ||||
import org.apache.poi.xdgf.util.ObjectFactory; | |||||
import com.microsoft.schemas.office.visio.x2012.main.CellType; | |||||
import com.microsoft.schemas.office.visio.x2012.main.SectionType; | |||||
public abstract class XDGFSection { | public abstract class XDGFSection { | ||||
static final ObjectFactory<XDGFSection, SectionType> _sectionTypes; | |||||
static { | |||||
_sectionTypes = new ObjectFactory<>(); | |||||
try { | |||||
_sectionTypes.put("LineGradient", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("FillGradient", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("Character", CharacterSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("Paragraph", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("Tabs", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("Scratch", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("Connection", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("ConnectionABCD", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("Field", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("Control", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("Geometry", GeometrySection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("Actions", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("Layer", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("User", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("Property", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("Hyperlink", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("Reviewer", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("Annotation", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
_sectionTypes.put("ActionTag", GenericSection.class, SectionType.class, XDGFSheet.class); | |||||
} catch (NoSuchMethodException | SecurityException e) { | |||||
throw new POIXMLException("Internal error"); | |||||
} | |||||
} | |||||
public static XDGFSection load(SectionType section, XDGFSheet containingSheet) { | public static XDGFSection load(SectionType section, XDGFSheet containingSheet) { | ||||
return _sectionTypes.load(section.getN(), section, containingSheet); | |||||
return XDGFSectionTypes.load(section, containingSheet); | |||||
} | } | ||||
protected Map<String, XDGFCell> _cells = new HashMap<>(); | protected Map<String, XDGFCell> _cells = new HashMap<>(); | ||||
public XDGFSection(SectionType section, XDGFSheet containingSheet) { | |||||
protected XDGFSection(SectionType section, XDGFSheet containingSheet) { | |||||
_section = section; | _section = section; | ||||
_containingSheet = containingSheet; | _containingSheet = containingSheet; | ||||
/* ==================================================================== | |||||
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.xdgf.usermodel.section; | |||||
import java.util.Map; | |||||
import java.util.function.BiFunction; | |||||
import java.util.function.Function; | |||||
import java.util.stream.Collectors; | |||||
import java.util.stream.Stream; | |||||
import com.microsoft.schemas.office.visio.x2012.main.SectionType; | |||||
import org.apache.poi.ooxml.POIXMLException; | |||||
import org.apache.poi.util.Internal; | |||||
import org.apache.poi.xdgf.usermodel.XDGFSheet; | |||||
@Internal | |||||
enum XDGFSectionTypes { | |||||
LINE_GRADIENT("LineGradient", GenericSection::new), | |||||
FILL_GRADIENT("FillGradient", GenericSection::new), | |||||
CHARACTER("Character", CharacterSection::new), | |||||
PARAGRAPH("Paragraph", GenericSection::new), | |||||
TABS("Tabs", GenericSection::new), | |||||
SCRATCH("Scratch", GenericSection::new), | |||||
CONNECTION("Connection", GenericSection::new), | |||||
CONNECTION_ABCD("ConnectionABCD", GenericSection::new), | |||||
FIELD("Field", GenericSection::new), | |||||
CONTROL("Control", GenericSection::new), | |||||
GEOMETRY("Geometry", GeometrySection::new), | |||||
ACTIONS("Actions", GenericSection::new), | |||||
LAYER("Layer", GenericSection::new), | |||||
USER("User", GenericSection::new), | |||||
PROPERTY("Property", GenericSection::new), | |||||
HYPERLINK("Hyperlink", GenericSection::new), | |||||
REVIEWER("Reviewer", GenericSection::new), | |||||
ANNOTATION("Annotation", GenericSection::new), | |||||
ACTION_TAG("ActionTag", GenericSection::new); | |||||
public String sectionType; | |||||
public BiFunction<SectionType, XDGFSheet, ? extends XDGFSection> constructor; | |||||
XDGFSectionTypes(String sectionType, BiFunction<SectionType, XDGFSheet, ? extends XDGFSection> constructor) { | |||||
this.sectionType = sectionType; | |||||
this.constructor = constructor; | |||||
} | |||||
public String getSectionType() { | |||||
return sectionType; | |||||
} | |||||
public static XDGFSection load(SectionType section, XDGFSheet containingSheet) { | |||||
final String name = section.getN(); | |||||
XDGFSectionTypes l = LOOKUP.get(name); | |||||
if (l == null) { | |||||
final String typeName = section.schemaType().getName().getLocalPart(); | |||||
throw new POIXMLException("Invalid '" + typeName + "' name '" + name + "'"); | |||||
} | |||||
return l.constructor.apply(section, containingSheet); | |||||
} | |||||
private static final Map<String, XDGFSectionTypes> LOOKUP = | |||||
Stream.of(values()).collect(Collectors.toMap(XDGFSectionTypes::getSectionType, Function.identity())); | |||||
} |
/* ==================================================================== | |||||
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.xdgf.usermodel.section.geometry; | |||||
import org.apache.poi.ooxml.POIXMLException; | |||||
import org.apache.poi.xdgf.util.ObjectFactory; | |||||
import com.microsoft.schemas.office.visio.x2012.main.RowType; | |||||
public class GeometryRowFactory { | |||||
static final ObjectFactory<GeometryRow, RowType> _rowTypes; | |||||
static { | |||||
_rowTypes = new ObjectFactory<>(); | |||||
try { | |||||
_rowTypes.put("ArcTo", ArcTo.class, RowType.class); | |||||
_rowTypes.put("Ellipse", Ellipse.class, RowType.class); | |||||
_rowTypes.put("EllipticalArcTo", EllipticalArcTo.class, | |||||
RowType.class); | |||||
_rowTypes.put("InfiniteLine", InfiniteLine.class, RowType.class); | |||||
_rowTypes.put("LineTo", LineTo.class, RowType.class); | |||||
_rowTypes.put("MoveTo", MoveTo.class, RowType.class); | |||||
_rowTypes.put("NURBSTo", NURBSTo.class, RowType.class); | |||||
// Note - two different spellings depending on version used...! | |||||
_rowTypes.put("PolylineTo", PolyLineTo.class, RowType.class); | |||||
_rowTypes.put("PolyLineTo", PolyLineTo.class, RowType.class); | |||||
_rowTypes.put("RelCubBezTo", RelCubBezTo.class, RowType.class); | |||||
_rowTypes.put("RelEllipticalArcTo", RelEllipticalArcTo.class, | |||||
RowType.class); | |||||
_rowTypes.put("RelLineTo", RelLineTo.class, RowType.class); | |||||
_rowTypes.put("RelMoveTo", RelMoveTo.class, RowType.class); | |||||
_rowTypes.put("RelQuadBezTo", RelQuadBezTo.class, RowType.class); | |||||
_rowTypes.put("SplineKnot", SplineKnot.class, RowType.class); | |||||
_rowTypes.put("SplineStart", SplineStart.class, RowType.class); | |||||
} catch (NoSuchMethodException | SecurityException e) { | |||||
throw new POIXMLException("Internal error", e); | |||||
} | |||||
} | |||||
public static GeometryRow load(RowType row) { | |||||
return _rowTypes.load(row.getT(), row); | |||||
} | |||||
} |
/* ==================================================================== | |||||
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.xdgf.util; | |||||
import java.lang.reflect.Constructor; | |||||
import java.lang.reflect.InvocationTargetException; | |||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
import org.apache.poi.ooxml.POIXMLException; | |||||
import org.apache.xmlbeans.XmlObject; | |||||
public class ObjectFactory<T, X extends XmlObject> { | |||||
Map<String, Constructor<? extends T>> _types = new HashMap<>(); | |||||
public void put(String typeName, Class<? extends T> cls, Class<?>... varargs) throws NoSuchMethodException, SecurityException { | |||||
_types.put(typeName, cls.getDeclaredConstructor(varargs)); | |||||
} | |||||
public T load(String name, Object... varargs) { | |||||
Constructor<? extends T> constructor = _types.get(name); | |||||
if (constructor == null) { | |||||
@SuppressWarnings("unchecked") | |||||
X xmlObject = (X) varargs[0]; | |||||
String typeName = xmlObject.schemaType().getName().getLocalPart(); | |||||
throw new POIXMLException("Invalid '" + typeName + "' name '" + name + "'"); | |||||
} | |||||
try { | |||||
return constructor.newInstance(varargs); | |||||
} catch (InvocationTargetException e) { | |||||
throw new POIXMLException(e.getCause()); | |||||
} catch (Exception e) { | |||||
throw new POIXMLException(e); | |||||
} | |||||
} | |||||
} |