fix most alerts reported by LGTM on OOXML
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1843481 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
5f0cff9eed
commit
ead92fbe9a
@ -835,7 +835,7 @@ public class SignatureConfig {
|
||||
* Converts the digest algorithm ur - currently only sha* and ripemd160 is supported.
|
||||
* MS Office only supports sha1, sha256, sha384, sha512.
|
||||
*
|
||||
* @param digestAlgo the digest algorithm uri
|
||||
* @param digestMethodUri the digest algorithm uri
|
||||
* @return the hash algorithm for the given digest
|
||||
*/
|
||||
private static HashAlgorithm getDigestMethodAlgo(String digestMethodUri) {
|
||||
|
@ -116,25 +116,28 @@ public class XDGFShape extends XDGFSheet {
|
||||
_parentPage = parentPage;
|
||||
|
||||
TextType text = shapeSheet.getText();
|
||||
if (text != null)
|
||||
if (text != null) {
|
||||
_text = new XDGFText(text, this);
|
||||
}
|
||||
|
||||
if (shapeSheet.isSetShapes()) {
|
||||
_shapes = new ArrayList<>();
|
||||
for (ShapeSheetType shape : shapeSheet.getShapes().getShapeArray())
|
||||
for (ShapeSheetType shape : shapeSheet.getShapes().getShapeArray()) {
|
||||
_shapes.add(new XDGFShape(this, shape, parentPage, document));
|
||||
}
|
||||
}
|
||||
|
||||
readProperties();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
if (_parentPage instanceof XDGFMasterContents)
|
||||
if (_parentPage instanceof XDGFMasterContents) {
|
||||
return _parentPage + ": <Shape ID=\"" + getID() + "\">";
|
||||
else
|
||||
} else {
|
||||
return "<Shape ID=\"" + getID() + "\">";
|
||||
}
|
||||
}
|
||||
|
||||
protected void readProperties() {
|
||||
|
||||
@ -181,9 +184,10 @@ public class XDGFShape extends XDGFSheet {
|
||||
|
||||
if (obj.isSetMaster()) {
|
||||
_master = pageContents.getMasterById(obj.getMaster());
|
||||
if (_master == null)
|
||||
if (_master == null) {
|
||||
throw XDGFException.error("refers to non-existant master "
|
||||
+ obj.getMaster(), this);
|
||||
}
|
||||
|
||||
/*
|
||||
* If a master has one top-level shape, a shape that inherits from
|
||||
@ -209,11 +213,12 @@ public class XDGFShape extends XDGFSheet {
|
||||
}
|
||||
|
||||
} else if (obj.isSetMasterShape()) {
|
||||
_masterShape = master.getShapeById(obj.getMasterShape());
|
||||
if (_masterShape == null)
|
||||
_masterShape = (master == null) ? null : master.getShapeById(obj.getMasterShape());
|
||||
if (_masterShape == null) {
|
||||
throw XDGFException.error(
|
||||
"refers to non-existant master shape "
|
||||
+ obj.getMasterShape(), this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -229,22 +234,25 @@ public class XDGFShape extends XDGFSheet {
|
||||
|
||||
protected void setupSectionMasters() {
|
||||
|
||||
if (_masterShape == null)
|
||||
if (_masterShape == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
for (Entry<String, XDGFSection> section : _sections.entrySet()) {
|
||||
XDGFSection master = _masterShape.getSection(section.getKey());
|
||||
if (master != null)
|
||||
if (master != null) {
|
||||
section.getValue().setupMaster(master);
|
||||
}
|
||||
}
|
||||
|
||||
for (Entry<Long, GeometrySection> section : _geometry.entrySet()) {
|
||||
GeometrySection master = _masterShape.getGeometryByIdx(section
|
||||
.getKey());
|
||||
if (master != null)
|
||||
if (master != null) {
|
||||
section.getValue().setupMaster(master);
|
||||
}
|
||||
}
|
||||
} catch (POIXMLException e) {
|
||||
throw XDGFException.wrap(this.toString(), e);
|
||||
}
|
||||
@ -266,8 +274,9 @@ public class XDGFShape extends XDGFSheet {
|
||||
|
||||
public String getTextAsString() {
|
||||
XDGFText text = getText();
|
||||
if (text == null)
|
||||
if (text == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
return text.getTextContent();
|
||||
}
|
||||
@ -304,28 +313,32 @@ public class XDGFShape extends XDGFSheet {
|
||||
// unique to this shape on the page?
|
||||
public String getName() {
|
||||
String name = getXmlObject().getName();
|
||||
if (name == null)
|
||||
if (name == null) {
|
||||
return "";
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
// unique to this shape on the page?
|
||||
public String getShapeType() {
|
||||
String type = getXmlObject().getType();
|
||||
if (type == null)
|
||||
if (type == null) {
|
||||
return "";
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
// name of the symbol that this was derived from
|
||||
public String getSymbolName() {
|
||||
|
||||
if (_master == null)
|
||||
if (_master == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
String name = _master.getName();
|
||||
if (name == null)
|
||||
if (name == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
@ -345,9 +358,10 @@ public class XDGFShape extends XDGFSheet {
|
||||
XDGFShape top = null;
|
||||
if (_parent != null) {
|
||||
top = _parent.getTopmostParentShape();
|
||||
if (top == null)
|
||||
if (top == null) {
|
||||
top = _parent;
|
||||
}
|
||||
}
|
||||
|
||||
return top;
|
||||
}
|
||||
@ -381,190 +395,223 @@ public class XDGFShape extends XDGFSheet {
|
||||
}
|
||||
|
||||
public XDGFText getText() {
|
||||
if (_text == null && _masterShape != null)
|
||||
if (_text == null && _masterShape != null) {
|
||||
return _masterShape.getText();
|
||||
}
|
||||
|
||||
return _text;
|
||||
}
|
||||
|
||||
public Double getPinX() {
|
||||
if (_pinX == null && _masterShape != null)
|
||||
if (_pinX == null && _masterShape != null) {
|
||||
return _masterShape.getPinX();
|
||||
}
|
||||
|
||||
if (_pinX == null)
|
||||
if (_pinX == null) {
|
||||
throw XDGFException.error("PinX not set!", this);
|
||||
}
|
||||
|
||||
return _pinX;
|
||||
}
|
||||
|
||||
public Double getPinY() {
|
||||
if (_pinY == null && _masterShape != null)
|
||||
if (_pinY == null && _masterShape != null) {
|
||||
return _masterShape.getPinY();
|
||||
}
|
||||
|
||||
if (_pinY == null)
|
||||
if (_pinY == null) {
|
||||
throw XDGFException.error("PinY not specified!", this);
|
||||
}
|
||||
|
||||
return _pinY;
|
||||
}
|
||||
|
||||
public Double getWidth() {
|
||||
if (_width == null && _masterShape != null)
|
||||
if (_width == null && _masterShape != null) {
|
||||
return _masterShape.getWidth();
|
||||
}
|
||||
|
||||
if (_width == null)
|
||||
if (_width == null) {
|
||||
throw XDGFException.error("Width not specified!", this);
|
||||
}
|
||||
|
||||
return _width;
|
||||
}
|
||||
|
||||
public Double getHeight() {
|
||||
if (_height == null && _masterShape != null)
|
||||
if (_height == null && _masterShape != null) {
|
||||
return _masterShape.getHeight();
|
||||
}
|
||||
|
||||
if (_height == null)
|
||||
if (_height == null) {
|
||||
throw XDGFException.error("Height not specified!", this);
|
||||
}
|
||||
|
||||
return _height;
|
||||
}
|
||||
|
||||
public Double getLocPinX() {
|
||||
if (_locPinX == null && _masterShape != null)
|
||||
if (_locPinX == null && _masterShape != null) {
|
||||
return _masterShape.getLocPinX();
|
||||
}
|
||||
|
||||
if (_locPinX == null)
|
||||
if (_locPinX == null) {
|
||||
throw XDGFException.error("LocPinX not specified!", this);
|
||||
}
|
||||
|
||||
return _locPinX;
|
||||
}
|
||||
|
||||
public Double getLocPinY() {
|
||||
if (_locPinY == null && _masterShape != null)
|
||||
if (_locPinY == null && _masterShape != null) {
|
||||
return _masterShape.getLocPinY();
|
||||
}
|
||||
|
||||
if (_locPinY == null)
|
||||
if (_locPinY == null) {
|
||||
throw XDGFException.error("LocPinY not specified!", this);
|
||||
}
|
||||
|
||||
return _locPinY;
|
||||
}
|
||||
|
||||
public Double getBeginX() {
|
||||
if (_beginX == null && _masterShape != null)
|
||||
if (_beginX == null && _masterShape != null) {
|
||||
return _masterShape.getBeginX();
|
||||
}
|
||||
|
||||
return _beginX;
|
||||
}
|
||||
|
||||
public Double getBeginY() {
|
||||
if (_beginY == null && _masterShape != null)
|
||||
if (_beginY == null && _masterShape != null) {
|
||||
return _masterShape.getBeginY();
|
||||
}
|
||||
|
||||
return _beginY;
|
||||
}
|
||||
|
||||
public Double getEndX() {
|
||||
if (_endX == null && _masterShape != null)
|
||||
if (_endX == null && _masterShape != null) {
|
||||
return _masterShape.getEndX();
|
||||
}
|
||||
|
||||
return _endX;
|
||||
}
|
||||
|
||||
public Double getEndY() {
|
||||
if (_endY == null && _masterShape != null)
|
||||
if (_endY == null && _masterShape != null) {
|
||||
return _masterShape.getEndY();
|
||||
}
|
||||
|
||||
return _endY;
|
||||
}
|
||||
|
||||
public Double getAngle() {
|
||||
if (_angle == null && _masterShape != null)
|
||||
if (_angle == null && _masterShape != null) {
|
||||
return _masterShape.getAngle();
|
||||
}
|
||||
|
||||
return _angle;
|
||||
}
|
||||
|
||||
public Boolean getFlipX() {
|
||||
if (_flipX == null && _masterShape != null)
|
||||
if (_flipX == null && _masterShape != null) {
|
||||
return _masterShape.getFlipX();
|
||||
}
|
||||
|
||||
return _flipX;
|
||||
}
|
||||
|
||||
public Boolean getFlipY() {
|
||||
if (_flipY == null && _masterShape != null)
|
||||
if (_flipY == null && _masterShape != null) {
|
||||
return _masterShape.getFlipY();
|
||||
}
|
||||
|
||||
return _flipY;
|
||||
}
|
||||
|
||||
public Double getTxtPinX() {
|
||||
if (_txtPinX == null && _masterShape != null
|
||||
&& _masterShape._txtPinX != null)
|
||||
&& _masterShape._txtPinX != null) {
|
||||
return _masterShape._txtPinX;
|
||||
}
|
||||
|
||||
if (_txtPinX == null)
|
||||
if (_txtPinX == null) {
|
||||
return getWidth() * 0.5;
|
||||
}
|
||||
|
||||
return _txtPinX;
|
||||
}
|
||||
|
||||
public Double getTxtPinY() {
|
||||
if (_txtLocPinY == null && _masterShape != null
|
||||
&& _masterShape._txtLocPinY != null)
|
||||
&& _masterShape._txtLocPinY != null) {
|
||||
return _masterShape._txtLocPinY;
|
||||
}
|
||||
|
||||
if (_txtPinY == null)
|
||||
if (_txtPinY == null) {
|
||||
return getHeight() * 0.5;
|
||||
}
|
||||
|
||||
return _txtPinY;
|
||||
}
|
||||
|
||||
public Double getTxtLocPinX() {
|
||||
if (_txtLocPinX == null && _masterShape != null
|
||||
&& _masterShape._txtLocPinX != null)
|
||||
&& _masterShape._txtLocPinX != null) {
|
||||
return _masterShape._txtLocPinX;
|
||||
}
|
||||
|
||||
if (_txtLocPinX == null)
|
||||
if (_txtLocPinX == null) {
|
||||
return getTxtWidth() * 0.5;
|
||||
}
|
||||
|
||||
return _txtLocPinX;
|
||||
}
|
||||
|
||||
public Double getTxtLocPinY() {
|
||||
if (_txtLocPinY == null && _masterShape != null
|
||||
&& _masterShape._txtLocPinY != null)
|
||||
&& _masterShape._txtLocPinY != null) {
|
||||
return _masterShape._txtLocPinY;
|
||||
}
|
||||
|
||||
if (_txtLocPinY == null)
|
||||
if (_txtLocPinY == null) {
|
||||
return getTxtHeight() * 0.5;
|
||||
}
|
||||
|
||||
return _txtLocPinY;
|
||||
}
|
||||
|
||||
public Double getTxtAngle() {
|
||||
if (_txtAngle == null && _masterShape != null)
|
||||
if (_txtAngle == null && _masterShape != null) {
|
||||
return _masterShape.getTxtAngle();
|
||||
}
|
||||
|
||||
return _txtAngle;
|
||||
}
|
||||
|
||||
public Double getTxtWidth() {
|
||||
if (_txtWidth == null && _masterShape != null
|
||||
&& _masterShape._txtWidth != null)
|
||||
&& _masterShape._txtWidth != null) {
|
||||
return _masterShape._txtWidth;
|
||||
}
|
||||
|
||||
if (_txtWidth == null)
|
||||
if (_txtWidth == null) {
|
||||
return getWidth();
|
||||
}
|
||||
|
||||
return _txtWidth;
|
||||
}
|
||||
|
||||
public Double getTxtHeight() {
|
||||
if (_txtHeight == null && _masterShape != null
|
||||
&& _masterShape._txtHeight != null)
|
||||
&& _masterShape._txtHeight != null) {
|
||||
return _masterShape._txtHeight;
|
||||
}
|
||||
|
||||
if (_txtHeight == null)
|
||||
if (_txtHeight == null) {
|
||||
return getHeight();
|
||||
}
|
||||
|
||||
return _txtHeight;
|
||||
}
|
||||
@ -573,8 +620,9 @@ public class XDGFShape extends XDGFSheet {
|
||||
public Integer getLineCap() {
|
||||
|
||||
Integer lineCap = super.getLineCap();
|
||||
if (lineCap != null)
|
||||
if (lineCap != null) {
|
||||
return lineCap;
|
||||
}
|
||||
|
||||
// get from master
|
||||
if (_masterShape != null) {
|
||||
@ -589,8 +637,9 @@ public class XDGFShape extends XDGFSheet {
|
||||
public Color getLineColor() {
|
||||
|
||||
Color lineColor = super.getLineColor();
|
||||
if (lineColor != null)
|
||||
if (lineColor != null) {
|
||||
return lineColor;
|
||||
}
|
||||
|
||||
// get from master
|
||||
if (_masterShape != null) {
|
||||
@ -605,8 +654,9 @@ public class XDGFShape extends XDGFSheet {
|
||||
public Integer getLinePattern() {
|
||||
|
||||
Integer linePattern = super.getLinePattern();
|
||||
if (linePattern != null)
|
||||
if (linePattern != null) {
|
||||
return linePattern;
|
||||
}
|
||||
|
||||
// get from master
|
||||
if (_masterShape != null) {
|
||||
@ -621,8 +671,9 @@ public class XDGFShape extends XDGFSheet {
|
||||
public Double getLineWeight() {
|
||||
|
||||
Double lineWeight = super.getLineWeight();
|
||||
if (lineWeight != null)
|
||||
if (lineWeight != null) {
|
||||
return lineWeight;
|
||||
}
|
||||
|
||||
// get from master
|
||||
if (_masterShape != null) {
|
||||
@ -637,8 +688,9 @@ public class XDGFShape extends XDGFSheet {
|
||||
public Color getFontColor() {
|
||||
|
||||
Color fontColor = super.getFontColor();
|
||||
if (fontColor != null)
|
||||
if (fontColor != null) {
|
||||
return fontColor;
|
||||
}
|
||||
|
||||
// get from master
|
||||
if (_masterShape != null) {
|
||||
@ -653,8 +705,9 @@ public class XDGFShape extends XDGFSheet {
|
||||
public Double getFontSize() {
|
||||
|
||||
Double fontSize = super.getFontSize();
|
||||
if (fontSize != null)
|
||||
if (fontSize != null) {
|
||||
return fontSize;
|
||||
}
|
||||
|
||||
// get from master
|
||||
if (_masterShape != null) {
|
||||
@ -819,8 +872,9 @@ public class XDGFShape extends XDGFSheet {
|
||||
*/
|
||||
public Path2D.Double getPath() {
|
||||
for (GeometrySection geoSection : getGeometrySections()) {
|
||||
if (geoSection.getNoShow())
|
||||
if (geoSection.getNoShow()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return geoSection.getPath(this);
|
||||
}
|
||||
@ -833,9 +887,10 @@ public class XDGFShape extends XDGFSheet {
|
||||
*/
|
||||
public boolean hasGeometry() {
|
||||
for (GeometrySection geoSection : getGeometrySections()) {
|
||||
if (!geoSection.getNoShow())
|
||||
if (!geoSection.getNoShow()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -889,8 +944,9 @@ public class XDGFShape extends XDGFSheet {
|
||||
tr.concatenate(getParentTransform());
|
||||
|
||||
try {
|
||||
if (visitor.accept(this))
|
||||
if (visitor.accept(this)) {
|
||||
visitor.visit(this, tr, level);
|
||||
}
|
||||
|
||||
if (_shapes != null) {
|
||||
for (XDGFShape shape : _shapes) {
|
||||
@ -914,8 +970,9 @@ public class XDGFShape extends XDGFSheet {
|
||||
public void visitShapes(ShapeVisitor visitor, int level) {
|
||||
|
||||
try {
|
||||
if (visitor.accept(this))
|
||||
if (visitor.accept(this)) {
|
||||
visitor.visit(this, null, level);
|
||||
}
|
||||
|
||||
if (_shapes != null) {
|
||||
for (XDGFShape shape : _shapes) {
|
||||
|
@ -82,8 +82,8 @@ public class XDGFText {
|
||||
public Path2D.Double getBoundsAsPath() {
|
||||
|
||||
Rectangle2D.Double rect = getTextBounds();
|
||||
Double w = rect.getWidth();
|
||||
Double h = rect.getHeight();
|
||||
double w = rect.getWidth();
|
||||
double h = rect.getHeight();
|
||||
|
||||
Path2D.Double bounds = new Path2D.Double();
|
||||
bounds.moveTo(0, 0);
|
||||
@ -110,8 +110,9 @@ public class XDGFText {
|
||||
public void draw(Graphics2D graphics) {
|
||||
|
||||
String textContent = getTextContent();
|
||||
if (textContent.length() == 0)
|
||||
if (textContent.length() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
Rectangle2D.Double bounds = getTextBounds();
|
||||
|
||||
@ -140,22 +141,25 @@ public class XDGFText {
|
||||
}
|
||||
|
||||
Double txtAngle = _parent.getTxtAngle();
|
||||
if (txtAngle != null && Math.abs(txtAngle) > 0.01)
|
||||
if (txtAngle != null && Math.abs(txtAngle) > 0.01) {
|
||||
graphics.rotate(txtAngle);
|
||||
}
|
||||
|
||||
float nextY = 0;
|
||||
for (String line : lines) {
|
||||
|
||||
if (line.length() == 0)
|
||||
if (line.length() == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
TextLayout layout = new TextLayout(line, font, frc);
|
||||
|
||||
if (layout.isLeftToRight())
|
||||
if (layout.isLeftToRight()) {
|
||||
layout.draw(graphics, 0, nextY);
|
||||
else
|
||||
} else {
|
||||
layout.draw(graphics,
|
||||
(float) (bounds.width - layout.getAdvance()), nextY);
|
||||
}
|
||||
|
||||
nextY += layout.getAscent() + layout.getDescent()
|
||||
+ layout.getLeading();
|
||||
|
@ -22,6 +22,7 @@ import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
@ -38,17 +39,17 @@ import org.apache.poi.xdgf.usermodel.shape.ShapeVisitor;
|
||||
public class HierarchyPrinter {
|
||||
|
||||
public static void printHierarchy(XDGFPage page, File outDir)
|
||||
throws FileNotFoundException, UnsupportedEncodingException {
|
||||
throws FileNotFoundException, UnsupportedEncodingException, IOException {
|
||||
|
||||
File pageFile = new File(outDir, "page" + page.getPageNumber() + "-"
|
||||
+ Util.sanitizeFilename(page.getName()) + ".txt");
|
||||
|
||||
try (
|
||||
OutputStream os = new FileOutputStream(pageFile);
|
||||
PrintStream pos = new PrintStream(os, false, "utf-8");
|
||||
|
||||
PrintStream pos = new PrintStream(os, false, "utf-8")
|
||||
) {
|
||||
printHierarchy(page, pos);
|
||||
|
||||
pos.close();
|
||||
}
|
||||
}
|
||||
|
||||
public static void printHierarchy(XDGFPage page, final PrintStream os) {
|
||||
@ -71,7 +72,7 @@ public class HierarchyPrinter {
|
||||
}
|
||||
|
||||
public static void printHierarchy(XmlVisioDocument document,
|
||||
String outDirname) throws FileNotFoundException, UnsupportedEncodingException {
|
||||
String outDirname) throws FileNotFoundException, UnsupportedEncodingException, IOException {
|
||||
|
||||
File outDir = new File(outDirname);
|
||||
|
||||
@ -89,8 +90,9 @@ public class HierarchyPrinter {
|
||||
String inFilename = args[0];
|
||||
String outDir = args[1];
|
||||
|
||||
XmlVisioDocument doc = new XmlVisioDocument(new FileInputStream(
|
||||
inFilename));
|
||||
try (FileInputStream is = new FileInputStream(inFilename)) {
|
||||
XmlVisioDocument doc = new XmlVisioDocument(is);
|
||||
printHierarchy(doc, outDir);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -21,7 +21,10 @@ import java.awt.Color;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.RenderingHints;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.*;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
@ -91,11 +94,8 @@ public class VsdxToPng {
|
||||
|
||||
graphics.dispose();
|
||||
|
||||
OutputStream out = new FileOutputStream(outFile);
|
||||
try {
|
||||
try (FileOutputStream out = new FileOutputStream(outFile)) {
|
||||
ImageIO.write(img, "png", out);
|
||||
} finally {
|
||||
out.close();
|
||||
}
|
||||
}
|
||||
|
||||
@ -127,8 +127,9 @@ public class VsdxToPng {
|
||||
renderer = new ShapeDebuggerRenderer();
|
||||
}
|
||||
|
||||
XmlVisioDocument doc = new XmlVisioDocument(new FileInputStream(
|
||||
inFilename));
|
||||
try (FileInputStream is = new FileInputStream(inFilename)) {
|
||||
XmlVisioDocument doc = new XmlVisioDocument(is);
|
||||
renderToPng(doc, pngDir, 2000 / 11.0, renderer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -36,6 +36,7 @@ import org.apache.poi.ooxml.POIXMLDocument;
|
||||
import org.apache.poi.ooxml.POIXMLDocumentPart;
|
||||
import org.apache.poi.ooxml.POIXMLException;
|
||||
import org.apache.poi.ooxml.extractor.POIXMLPropertiesTextExtractor;
|
||||
import org.apache.poi.ooxml.util.PackageHelper;
|
||||
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
|
||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||
@ -50,7 +51,6 @@ import org.apache.poi.util.LittleEndian;
|
||||
import org.apache.poi.util.LittleEndianConsts;
|
||||
import org.apache.poi.util.POILogFactory;
|
||||
import org.apache.poi.util.POILogger;
|
||||
import org.apache.poi.ooxml.util.PackageHelper;
|
||||
import org.apache.poi.util.Units;
|
||||
import org.apache.xmlbeans.XmlException;
|
||||
import org.apache.xmlbeans.XmlObject;
|
||||
@ -362,7 +362,7 @@ public class XMLSlideShow extends POIXMLDocument
|
||||
CTNotesMasterIdListEntry notesMasterId = notesMasterIdList.addNewNotesMasterId();
|
||||
notesMasterId.setId(rp.getRelationship().getId());
|
||||
|
||||
Integer themeIndex = 1;
|
||||
int themeIndex = 1;
|
||||
// TODO: check if that list can be replaced by idx = Math.max(idx,themeIdx)
|
||||
List<Integer> themeIndexList = new ArrayList<>();
|
||||
for (POIXMLDocumentPart p : getRelations()) {
|
||||
|
@ -254,7 +254,7 @@ public class XSLFColor {
|
||||
* @return true, if this is an integer color value
|
||||
*/
|
||||
private static boolean isInt(float f) {
|
||||
return Math.abs((f*255f) - Math.rint(f*255f)) < 0.00001f;
|
||||
return Math.abs((f*255d) - Math.rint(f*255d)) < 0.00001;
|
||||
}
|
||||
|
||||
private int getRawValue(String elem) {
|
||||
|
@ -49,8 +49,6 @@ implements Notes<XSLFShape,XSLFTextParagraph> {
|
||||
*
|
||||
* @param part the package part holding the notes data,
|
||||
* the content type must be <code>application/vnd.openxmlformats-officedocument.notes+xml</code>
|
||||
* @param rel the package relationship holding this notes,
|
||||
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/notes
|
||||
*
|
||||
* @since POI 3.14-Beta1
|
||||
*/
|
||||
|
@ -92,6 +92,7 @@ public abstract class XSLFShape implements Shape<XSLFShape,XSLFTextParagraph> {
|
||||
return _shape;
|
||||
}
|
||||
|
||||
@Override
|
||||
public XSLFSheet getSheet() {
|
||||
return _sheet;
|
||||
}
|
||||
@ -132,6 +133,7 @@ public abstract class XSLFShape implements Shape<XSLFShape,XSLFTextParagraph> {
|
||||
this._parent = parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public XSLFShapeContainer getParent() {
|
||||
return this._parent;
|
||||
}
|
||||
@ -140,6 +142,7 @@ public abstract class XSLFShape implements Shape<XSLFShape,XSLFTextParagraph> {
|
||||
final XSLFTheme theme = getSheet().getTheme();
|
||||
final boolean hasPlaceholder = getPlaceholder() != null;
|
||||
PropertyFetcher<PaintStyle> fetcher = new PropertyFetcher<PaintStyle>() {
|
||||
@Override
|
||||
public boolean fetch(XSLFShape shape) {
|
||||
XSLFFillProperties fp = XSLFPropertiesDelegate.getFillDelegate(shape.getShapeProperties());
|
||||
if (fp == null) {
|
||||
@ -268,7 +271,9 @@ public abstract class XSLFShape implements Shape<XSLFShape,XSLFTextParagraph> {
|
||||
@SuppressWarnings({"unchecked", "WeakerAccess"})
|
||||
protected <T extends XmlObject> T selectProperty(Class<T> resultClass, String xquery) {
|
||||
XmlObject[] rs = getXmlObject().selectPath(xquery);
|
||||
if (rs.length == 0) return null;
|
||||
if (rs.length == 0) {
|
||||
return null;
|
||||
}
|
||||
return (resultClass.isInstance(rs[0])) ? (T)rs[0] : null;
|
||||
}
|
||||
|
||||
@ -398,6 +403,7 @@ public abstract class XSLFShape implements Shape<XSLFShape,XSLFTextParagraph> {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream getImageData() {
|
||||
try {
|
||||
return getPart().getInputStream();
|
||||
@ -406,11 +412,13 @@ public abstract class XSLFShape implements Shape<XSLFShape,XSLFTextParagraph> {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContentType() {
|
||||
/* TOOD: map content-type */
|
||||
return getPart().getContentType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAlpha() {
|
||||
return (blip.sizeOfAlphaModFixArray() > 0)
|
||||
? blip.getAlphaModFixArray(0).getAmt()
|
||||
@ -426,9 +434,9 @@ public abstract class XSLFShape implements Shape<XSLFShape,XSLFTextParagraph> {
|
||||
final CTGradientStop[] gs = gradFill.getGsLst().getGsArray();
|
||||
|
||||
Arrays.sort(gs, (o1, o2) -> {
|
||||
Integer pos1 = o1.getPos();
|
||||
Integer pos2 = o2.getPos();
|
||||
return pos1.compareTo(pos2);
|
||||
int pos1 = o1.getPos();
|
||||
int pos2 = o2.getPos();
|
||||
return Integer.compare(pos1, pos2);
|
||||
});
|
||||
|
||||
final ColorStyle cs[] = new ColorStyle[gs.length];
|
||||
@ -447,24 +455,29 @@ public abstract class XSLFShape implements Shape<XSLFShape,XSLFTextParagraph> {
|
||||
|
||||
return new GradientPaint() {
|
||||
|
||||
@Override
|
||||
public double getGradientAngle() {
|
||||
return (gradFill.isSetLin())
|
||||
? gradFill.getLin().getAng() / 60000.d
|
||||
: 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ColorStyle[] getGradientColors() {
|
||||
return cs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float[] getGradientFractions() {
|
||||
return fractions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRotatedWithShape() {
|
||||
return gradFill.getRotWithShape();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GradientType getGradientType() {
|
||||
if (gradFill.isSetLin()) {
|
||||
return GradientType.linear;
|
||||
@ -487,7 +500,9 @@ public abstract class XSLFShape implements Shape<XSLFShape,XSLFTextParagraph> {
|
||||
|
||||
@SuppressWarnings("WeakerAccess")
|
||||
protected static PaintStyle selectPaint(CTStyleMatrixReference fillRef, final XSLFTheme theme, boolean isLineStyle, boolean hasPlaceholder) {
|
||||
if (fillRef == null) return null;
|
||||
if (fillRef == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// The idx attribute refers to the index of a fill style or
|
||||
// background fill style within the presentation's style matrix, defined by the fmtScheme element.
|
||||
|
@ -74,13 +74,13 @@ public class PPTX2PNG {
|
||||
for (int i = 0; i < args.length; i++) {
|
||||
if (args[i].startsWith("-")) {
|
||||
if ("-scale".equals(args[i])) {
|
||||
scale = Float.parseFloat(args[++i]);
|
||||
scale = Float.parseFloat(args[++i]); // lgtm[java/index-out-of-bounds]
|
||||
} else if ("-slide".equals(args[i])) {
|
||||
slidenumStr = args[++i];
|
||||
slidenumStr = args[++i]; // lgtm[java/index-out-of-bounds]
|
||||
} else if ("-format".equals(args[i])) {
|
||||
format = args[++i];
|
||||
format = args[++i]; // lgtm[java/index-out-of-bounds]
|
||||
} else if ("-outdir".equals(args[i])) {
|
||||
outdir = new File(args[++i]);
|
||||
outdir = new File(args[++i]); // lgtm[java/index-out-of-bounds]
|
||||
} else if ("-quiet".equals(args[i])) {
|
||||
quiet = true;
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ public class XSSFBUtils {
|
||||
int numBytes = 2*(int)numChars;
|
||||
offset += 4;
|
||||
if (offset+numBytes > data.length) {
|
||||
throw new XSSFBParseException("trying to read beyond data length:" +
|
||||
throw new XSSFBParseException("trying to read beyond data length: " +
|
||||
"offset="+offset+", numBytes="+numBytes+", data.length="+data.length);
|
||||
}
|
||||
sb.append(new String(data, offset, numBytes, StandardCharsets.UTF_16LE));
|
||||
|
@ -345,11 +345,12 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
|
||||
@Override
|
||||
public void setHeightInPoints(float height)
|
||||
{
|
||||
if(height==-1)
|
||||
if(height==-1) {
|
||||
_height=-1;
|
||||
else
|
||||
} else {
|
||||
_height=(short)(height*20);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the row's height measured in twips (1/20th of a point). If the height is not set, the default worksheet value is returned,
|
||||
@ -392,7 +393,9 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
|
||||
*/
|
||||
@Override
|
||||
public CellStyle getRowStyle() {
|
||||
if(!isFormatted()) return null;
|
||||
if(!isFormatted()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return getSheet().getWorkbook().getCellStyleAt(_style);
|
||||
}
|
||||
@ -485,11 +488,12 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
|
||||
@Override
|
||||
public Cell next() throws NoSuchElementException
|
||||
{
|
||||
if (hasNext())
|
||||
if (hasNext()) {
|
||||
return _cells.get(pos++);
|
||||
else
|
||||
} else {
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void remove()
|
||||
{
|
||||
@ -524,9 +528,9 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
|
||||
throw new IllegalArgumentException("The compared rows must belong to the same sheet");
|
||||
}
|
||||
|
||||
Integer thisRow = this.getRowNum();
|
||||
Integer otherRow = other.getRowNum();
|
||||
return thisRow.compareTo(otherRow);
|
||||
int thisRow = this.getRowNum();
|
||||
int otherRow = other.getRowNum();
|
||||
return Integer.compare(thisRow, otherRow);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -446,7 +446,7 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing<XSS
|
||||
XSSFSheet sheet = getSheet();
|
||||
XSSFWorkbook wb = sheet.getWorkbook();
|
||||
int sheetIndex = wb.getSheetIndex(sheet);
|
||||
long shapeId = (sheetIndex + 1) * 1024 + newShapeId();
|
||||
long shapeId = (sheetIndex + 1L) * 1024 + newShapeId();
|
||||
|
||||
// add reference to OLE part
|
||||
PackagePartName olePN;
|
||||
|
@ -22,8 +22,8 @@ import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import org.apache.poi.ss.formula.FormulaShifter;
|
||||
import org.apache.poi.ss.SpreadsheetVersion;
|
||||
import org.apache.poi.ss.formula.FormulaShifter;
|
||||
import org.apache.poi.ss.usermodel.Cell;
|
||||
import org.apache.poi.ss.usermodel.CellCopyPolicy;
|
||||
import org.apache.poi.ss.usermodel.CellStyle;
|
||||
@ -158,9 +158,9 @@ public class XSSFRow implements Row, Comparable<XSSFRow> {
|
||||
throw new IllegalArgumentException("The compared rows must belong to the same sheet");
|
||||
}
|
||||
|
||||
Integer thisRow = this.getRowNum();
|
||||
Integer otherRow = other.getRowNum();
|
||||
return thisRow.compareTo(otherRow);
|
||||
int thisRow = this.getRowNum();
|
||||
int otherRow = other.getRowNum();
|
||||
return Integer.compare(thisRow, otherRow);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -245,7 +245,9 @@ public class XSSFRow implements Row, Comparable<XSSFRow> {
|
||||
*/
|
||||
@Override
|
||||
public XSSFCell getCell(int cellnum, MissingCellPolicy policy) {
|
||||
if(cellnum < 0) throw new IllegalArgumentException("Cell index must be >= 0");
|
||||
if(cellnum < 0) {
|
||||
throw new IllegalArgumentException("Cell index must be >= 0");
|
||||
}
|
||||
|
||||
// Performance optimization for bug 57840: explicit boxing is slightly faster than auto-unboxing, though may use more memory
|
||||
final Integer colI = Integer.valueOf(cellnum); // NOSONAR
|
||||
@ -332,8 +334,12 @@ public class XSSFRow implements Row, Comparable<XSSFRow> {
|
||||
@Override
|
||||
public void setHeight(short height) {
|
||||
if (height == -1) {
|
||||
if (_row.isSetHt()) _row.unsetHt();
|
||||
if (_row.isSetCustomHeight()) _row.unsetCustomHeight();
|
||||
if (_row.isSetHt()) {
|
||||
_row.unsetHt();
|
||||
}
|
||||
if (_row.isSetCustomHeight()) {
|
||||
_row.unsetCustomHeight();
|
||||
}
|
||||
} else {
|
||||
_row.setHt((double) height / 20);
|
||||
_row.setCustomHeight(true);
|
||||
@ -425,7 +431,9 @@ public class XSSFRow implements Row, Comparable<XSSFRow> {
|
||||
*/
|
||||
@Override
|
||||
public XSSFCellStyle getRowStyle() {
|
||||
if(!isFormatted()) return null;
|
||||
if(!isFormatted()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
StylesTable stylesSource = getSheet().getWorkbook().getStylesSource();
|
||||
if(stylesSource.getNumCellStyles() > 0) {
|
||||
@ -626,11 +634,13 @@ public class XSSFRow implements Row, Comparable<XSSFRow> {
|
||||
*/
|
||||
@Override
|
||||
public void shiftCellsRight(int firstShiftColumnIndex, int lastShiftColumnIndex, int step) {
|
||||
if(step < 0)
|
||||
if(step < 0) {
|
||||
throw new IllegalArgumentException("Shifting step may not be negative ");
|
||||
if(firstShiftColumnIndex > lastShiftColumnIndex)
|
||||
}
|
||||
if(firstShiftColumnIndex > lastShiftColumnIndex) {
|
||||
throw new IllegalArgumentException(String.format(LocaleUtil.getUserLocale(),
|
||||
"Incorrect shifting range : %d-%d", firstShiftColumnIndex, lastShiftColumnIndex));
|
||||
}
|
||||
for (int columnIndex = lastShiftColumnIndex; columnIndex >= firstShiftColumnIndex; columnIndex--){ // process cells backwards, because of shifting
|
||||
shiftCell(columnIndex, step);
|
||||
}
|
||||
@ -638,10 +648,11 @@ public class XSSFRow implements Row, Comparable<XSSFRow> {
|
||||
{
|
||||
_cells.remove(columnIndex);
|
||||
XSSFCell targetCell = getCell(columnIndex);
|
||||
if(targetCell != null)
|
||||
if(targetCell != null) {
|
||||
targetCell.getCTCell().set(CTCell.Factory.newInstance());
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Shifts column range [firstShiftColumnIndex-lastShiftColumnIndex] step places to the left.
|
||||
* @param firstShiftColumnIndex the column to start shifting
|
||||
@ -650,26 +661,31 @@ public class XSSFRow implements Row, Comparable<XSSFRow> {
|
||||
*/
|
||||
@Override
|
||||
public void shiftCellsLeft(int firstShiftColumnIndex, int lastShiftColumnIndex, int step) {
|
||||
if(step < 0)
|
||||
if(step < 0) {
|
||||
throw new IllegalArgumentException("Shifting step may not be negative ");
|
||||
if(firstShiftColumnIndex > lastShiftColumnIndex)
|
||||
}
|
||||
if(firstShiftColumnIndex > lastShiftColumnIndex) {
|
||||
throw new IllegalArgumentException(String.format(LocaleUtil.getUserLocale(),
|
||||
"Incorrect shifting range : %d-%d", firstShiftColumnIndex, lastShiftColumnIndex));
|
||||
if(firstShiftColumnIndex - step < 0)
|
||||
}
|
||||
if(firstShiftColumnIndex - step < 0) {
|
||||
throw new IllegalStateException("Column index less than zero : " + (Integer.valueOf(firstShiftColumnIndex + step)).toString());
|
||||
}
|
||||
for (int columnIndex = firstShiftColumnIndex; columnIndex <= lastShiftColumnIndex; columnIndex++){
|
||||
shiftCell(columnIndex, -step);
|
||||
}
|
||||
for (int columnIndex = lastShiftColumnIndex-step+1; columnIndex <= lastShiftColumnIndex; columnIndex++){
|
||||
_cells.remove(columnIndex);
|
||||
XSSFCell targetCell = getCell(columnIndex);
|
||||
if(targetCell != null)
|
||||
if(targetCell != null) {
|
||||
targetCell.getCTCell().set(CTCell.Factory.newInstance());
|
||||
}
|
||||
}
|
||||
}
|
||||
private void shiftCell(int columnIndex, int step/*pass negative value for left shift*/){
|
||||
if(columnIndex + step < 0) // only for shifting left
|
||||
if(columnIndex + step < 0) {
|
||||
throw new IllegalStateException("Column index less than zero : " + (Integer.valueOf(columnIndex + step)).toString());
|
||||
}
|
||||
|
||||
XSSFCell currentCell = getCell(columnIndex);
|
||||
if(currentCell != null){
|
||||
@ -679,8 +695,9 @@ public class XSSFRow implements Row, Comparable<XSSFRow> {
|
||||
else {
|
||||
_cells.remove(columnIndex+step);
|
||||
XSSFCell targetCell = getCell(columnIndex+step);
|
||||
if(targetCell != null)
|
||||
if(targetCell != null) {
|
||||
targetCell.getCTCell().set(CTCell.Factory.newInstance());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -40,16 +40,16 @@ public class XWPFSDTContent implements ISDTContent {
|
||||
|
||||
// private final IBody part;
|
||||
// private final XWPFDocument document;
|
||||
private List<XWPFParagraph> paragraphs = new ArrayList<>();
|
||||
private List<XWPFTable> tables = new ArrayList<>();
|
||||
private List<XWPFRun> runs = new ArrayList<>();
|
||||
private List<XWPFSDT> contentControls = new ArrayList<>();
|
||||
// private List<XWPFParagraph> paragraphs = new ArrayList<>();
|
||||
// private List<XWPFTable> tables = new ArrayList<>();
|
||||
// private List<XWPFRun> runs = new ArrayList<>();
|
||||
// private List<XWPFSDT> contentControls = new ArrayList<>();
|
||||
private List<ISDTContents> bodyElements = new ArrayList<>();
|
||||
|
||||
public XWPFSDTContent(CTSdtContentRun sdtRun, IBody part, IRunBody parent) {
|
||||
for (CTR ctr : sdtRun.getRArray()) {
|
||||
XWPFRun run = new XWPFRun(ctr, parent);
|
||||
runs.add(run);
|
||||
// runs.add(run);
|
||||
bodyElements.add(run);
|
||||
}
|
||||
}
|
||||
@ -62,24 +62,25 @@ public class XWPFSDTContent implements ISDTContent {
|
||||
if (o instanceof CTP) {
|
||||
XWPFParagraph p = new XWPFParagraph((CTP) o, part);
|
||||
bodyElements.add(p);
|
||||
paragraphs.add(p);
|
||||
// paragraphs.add(p);
|
||||
} else if (o instanceof CTTbl) {
|
||||
XWPFTable t = new XWPFTable((CTTbl) o, part);
|
||||
bodyElements.add(t);
|
||||
tables.add(t);
|
||||
// tables.add(t);
|
||||
} else if (o instanceof CTSdtBlock) {
|
||||
XWPFSDT c = new XWPFSDT(((CTSdtBlock) o), part);
|
||||
bodyElements.add(c);
|
||||
contentControls.add(c);
|
||||
// contentControls.add(c);
|
||||
} else if (o instanceof CTR) {
|
||||
XWPFRun run = new XWPFRun((CTR) o, parent);
|
||||
runs.add(run);
|
||||
// runs.add(run);
|
||||
bodyElements.add(run);
|
||||
}
|
||||
}
|
||||
cursor.dispose();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getText() {
|
||||
StringBuilder text = new StringBuilder();
|
||||
boolean addNewLine = false;
|
||||
@ -130,6 +131,7 @@ public class XWPFSDTContent implements ISDTContent {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getText();
|
||||
}
|
||||
|
@ -161,8 +161,9 @@ public class XWPFTable implements IBodyElement, ISDTContents {
|
||||
this.ctTbl = table;
|
||||
|
||||
// is an empty table: I add one row and one column as default
|
||||
if (table.sizeOfTrArray() == 0)
|
||||
if (table.sizeOfTrArray() == 0) {
|
||||
createEmptyTable(table);
|
||||
}
|
||||
|
||||
for (CTRow row : table.getTrList()) {
|
||||
StringBuilder rowText = new StringBuilder();
|
||||
@ -417,7 +418,7 @@ public class XWPFTable implements IBodyElement, ISDTContents {
|
||||
/**
|
||||
* Set table alignment to specified {@link TableRowAlign}
|
||||
*
|
||||
* @param ha {@link TableRowAlign} to set
|
||||
* @param tra {@link TableRowAlign} to set
|
||||
*/
|
||||
public void setTableAlignment(TableRowAlign tra) {
|
||||
CTTblPr tPr = getTblPr(true);
|
||||
@ -1095,10 +1096,12 @@ public class XWPFTable implements IBodyElement, ISDTContents {
|
||||
*
|
||||
* @see org.apache.poi.xwpf.usermodel.IBodyElement#getElementType()
|
||||
*/
|
||||
@Override
|
||||
public BodyElementType getElementType() {
|
||||
return BodyElementType.TABLE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBody getBody() {
|
||||
return part;
|
||||
}
|
||||
@ -1108,6 +1111,7 @@ public class XWPFTable implements IBodyElement, ISDTContents {
|
||||
*
|
||||
* @see org.apache.poi.xwpf.usermodel.IBody#getPart()
|
||||
*/
|
||||
@Override
|
||||
public POIXMLDocumentPart getPart() {
|
||||
if (part != null) {
|
||||
return part.getPart();
|
||||
@ -1120,6 +1124,7 @@ public class XWPFTable implements IBodyElement, ISDTContents {
|
||||
*
|
||||
* @see org.apache.poi.xwpf.usermodel.IBody#getPartType()
|
||||
*/
|
||||
@Override
|
||||
public BodyType getPartType() {
|
||||
return part.getPartType();
|
||||
}
|
||||
@ -1130,7 +1135,9 @@ public class XWPFTable implements IBodyElement, ISDTContents {
|
||||
*/
|
||||
public XWPFTableRow getRow(CTRow row) {
|
||||
for (int i = 0; i < getRows().size(); i++) {
|
||||
if (getRows().get(i).getCtRow() == row) return getRow(i);
|
||||
if (getRows().get(i).getCtRow() == row) {
|
||||
return getRow(i);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user