diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index a89e23020..06ed8953e 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -33,7 +33,6 @@ - diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/AWTFontResolver.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/AWTFontResolver.java index 0e03ef101..4989fbf41 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/AWTFontResolver.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/AWTFontResolver.java @@ -19,6 +19,8 @@ */ package org.xhtmlrenderer.context; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.css.constants.IdentValue; import org.xhtmlrenderer.css.value.FontSpecification; import org.xhtmlrenderer.extend.FontResolver; @@ -63,7 +65,7 @@ public void flushCache() { init(); } - public FSFont resolveFont(SharedContext ctx, String[] families, float size, IdentValue weight, IdentValue style, IdentValue variant) { + public FSFont resolveFont(SharedContext ctx, String @Nullable[] families, float size, IdentValue weight, IdentValue style, IdentValue variant) { // for each font family if (families != null) { for (String family : families) { @@ -95,7 +97,10 @@ public void setFontMapping(String name, Font font) { availableFonts.put(name, font.deriveFont(1.0f)); } - protected static Font createFont(SharedContext ctx, Font root_font, float size, IdentValue weight, IdentValue style, IdentValue variant) { + protected static Font createFont(SharedContext ctx, Font root_font, float size, + @Nullable IdentValue weight, + @Nullable IdentValue style, + @Nullable IdentValue variant) { int font_const = Font.PLAIN; if (weight != null && (weight == IdentValue.BOLD || @@ -122,6 +127,7 @@ protected static Font createFont(SharedContext ctx, Font root_font, float size, return fnt; } + @Nullable protected Font resolveFont(SharedContext ctx, String font, float size, IdentValue weight, IdentValue style, IdentValue variant) { // strip off the "s if they are there if (font.startsWith("\"")) { @@ -179,6 +185,8 @@ protected static String getFontInstanceHashName(SharedContext ctx, String name, return name + "-" + (size * ctx.getTextRenderer().getFontScale()) + "-" + weight + "-" + style + "-" + variant; } + @Nullable + @CheckReturnValue @Override public FSFont resolveFont(SharedContext renderingContext, FontSpecification spec) { return resolveFont(renderingContext, spec.families, spec.size, spec.fontWeight, spec.fontStyle, spec.variant); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/StandardAttributeResolver.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/StandardAttributeResolver.java index d525c4c00..038ed41c8 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/StandardAttributeResolver.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/StandardAttributeResolver.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.context; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xhtmlrenderer.css.extend.AttributeResolver; @@ -26,7 +27,6 @@ import org.xhtmlrenderer.extend.UserAgentCallback; import org.xhtmlrenderer.extend.UserInterface; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.IdentityHashMap; import java.util.Map; @@ -36,7 +36,6 @@ * * @author Torbjoern Gannholm */ -@ParametersAreNonnullByDefault public class StandardAttributeResolver implements AttributeResolver { private final NamespaceHandler nsh; private final UserAgentCallback uac; @@ -66,6 +65,7 @@ public String getAttributeValue(Node e, String namespaceURI, String attrName) { * Gets the class attribute of the StandardAttributeResolver object */ @Override + @Nullable public String getClass(Node e) { return classAttributeCache.computeIfAbsent(e, (x) -> nsh.getClass((Element) e)); } @@ -74,11 +74,13 @@ public String getClass(Node e) { * Gets the iD attribute of the StandardAttributeResolver object */ @Override + @Nullable public String getID(Node e) { return nsh.getID((Element) e); } @Override + @Nullable public String getNonCssStyling(Node e) { return nsh.getNonCssStyling((Element) e); } @@ -87,6 +89,7 @@ public String getNonCssStyling(Node e) { * Gets the elementStyling attribute of the StandardAttributeResolver object */ @Override + @Nullable public String getElementStyling(Node e) { return nsh.getElementStyling((Element) e); } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/StyleReference.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/StyleReference.java index 824bb012a..9ba461b39 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/StyleReference.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/StyleReference.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.context; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -149,6 +150,7 @@ public Map getCascadedPropertiesMap(Element e) { /** * Gets the pseudoElementStyle attribute of the StyleReference object */ + @Nullable public CascadedStyle getPseudoElementStyle(Node node, String pseudoElement) { Element e; if (node.getNodeType() == Node.ELEMENT_NODE) { @@ -163,7 +165,7 @@ public CascadedStyle getPseudoElementStyle(Node node, String pseudoElement) { * Gets the CascadedStyle for an element. This must then be converted in the * current context to a CalculatedStyle (use getDerivedStyle) */ - public CascadedStyle getCascadedStyle(Element e, boolean restyle) { + public CascadedStyle getCascadedStyle(@Nullable Element e, boolean restyle) { if (e == null) return CascadedStyle.emptyCascadedStyle; return _matcher.getCascadedStyle(e, restyle); } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/StylesheetFactoryImpl.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/StylesheetFactoryImpl.java index 1a3763d73..bc7020805 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/StylesheetFactoryImpl.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/StylesheetFactoryImpl.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.context; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.css.extend.StylesheetFactory; import org.xhtmlrenderer.css.parser.CSSParser; import org.xhtmlrenderer.css.sheet.Ruleset; @@ -31,7 +32,6 @@ import org.xhtmlrenderer.util.XRLog; import org.xml.sax.InputSource; -import javax.annotation.Nullable; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/package-info.java new file mode 100644 index 000000000..506030f68 --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/context/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.context; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/constants/CSSName.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/constants/CSSName.java index e05803f7e..c54a27601 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/constants/CSSName.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/constants/CSSName.java @@ -20,6 +20,8 @@ */ package org.xhtmlrenderer.css.constants; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.css.parser.CSSParser; import org.xhtmlrenderer.css.parser.PropertyValue; import org.xhtmlrenderer.css.parser.property.BackgroundPropertyBuilder; @@ -39,9 +41,6 @@ import org.xhtmlrenderer.css.style.derived.DerivedValueFactory; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Iterator; import java.util.Map; import java.util.TreeMap; @@ -57,7 +56,6 @@ * * @author Patrick Wright */ -@ParametersAreNonnullByDefault @CheckReturnValue public final class CSSName implements Comparable { /** @@ -104,6 +102,7 @@ public final class CSSName implements Comparable { private final boolean implemented; + @Nullable private final PropertyBuilder builder; /** @@ -1667,7 +1666,7 @@ public final class CSSName implements Comparable { private CSSName( String propName, String initialValue, boolean inherits, - boolean implemented, PropertyBuilder builder) { + boolean implemented, @Nullable PropertyBuilder builder) { this.propName = propName; this.FS_ID = CSSName.maxAssigned++; this.initialValue = initialValue; @@ -1741,6 +1740,7 @@ public static boolean isImplemented(CSSName cssName) { return cssName.implemented; } + @Nullable public static PropertyBuilder getPropertyBuilder(CSSName cssName) { return cssName.builder; } @@ -1777,7 +1777,7 @@ private static synchronized CSSName addProperty( String initialValue, Object inherit, boolean implemented, - PropertyBuilder builder + @Nullable PropertyBuilder builder ) { CSSName cssName = new CSSName( propName, initialValue, (inherit == INHERITS), implemented, builder); @@ -1837,6 +1837,7 @@ public int hashCode() { return FS_ID; } + @CheckReturnValue public record CSSSideProperties(CSSName top, CSSName right, CSSName bottom, CSSName left) { } } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/constants/IdentValue.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/constants/IdentValue.java index 21567e763..2389a7da8 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/constants/IdentValue.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/constants/IdentValue.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.css.constants; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.css.parser.FSColor; import org.xhtmlrenderer.css.style.CssContext; import org.xhtmlrenderer.css.style.FSDerivedValue; @@ -252,6 +253,7 @@ public static boolean looksLikeIdent(String ident) { return ALL_IDENT_VALUES.get(ident) != null; } + @Nullable public static IdentValue valueOf(String ident) { return ALL_IDENT_VALUES.get(ident); } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/constants/ValueConstants.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/constants/ValueConstants.java index 448bc44ca..db28404ae 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/constants/ValueConstants.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/constants/ValueConstants.java @@ -20,14 +20,13 @@ */ package org.xhtmlrenderer.css.constants; +import org.jspecify.annotations.Nullable; import org.w3c.dom.css.CSSPrimitiveValue; import org.w3c.dom.css.CSSValue; import org.xhtmlrenderer.util.GeneralUtil; import org.xhtmlrenderer.util.XRLog; import org.xhtmlrenderer.util.XRRuntimeException; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; @@ -45,7 +44,6 @@ /** * Utility class for working with {@code CSSValue} instances. */ -@ParametersAreNonnullByDefault public final class ValueConstants { /** * Type descriptions--a crude approximation taken by scanning CSSValue statics diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/constants/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/constants/package-info.java new file mode 100644 index 000000000..23ce6cef4 --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/constants/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.css.constants; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/extend/AttributeResolver.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/extend/AttributeResolver.java index 4a7ff7306..311c42e2f 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/extend/AttributeResolver.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/extend/AttributeResolver.java @@ -19,10 +19,9 @@ */ package org.xhtmlrenderer.css.extend; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Node; -import javax.annotation.Nullable; - /** * In XML, an application may or may not know how to find the ID and/or class * and/or attribute defaults of an element.

diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/newmatch/Matcher.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/newmatch/Matcher.java index fef875a12..cbf9d0674 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/newmatch/Matcher.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/newmatch/Matcher.java @@ -20,6 +20,7 @@ */ package org.xhtmlrenderer.css.newmatch; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xhtmlrenderer.css.constants.MarginBoxName; @@ -94,6 +95,7 @@ public CascadedStyle getCascadedStyle(Element e, boolean restyle) { * May return null. * We assume that restyle has already been done by a getCascadedStyle if necessary. */ + @Nullable public CascadedStyle getPECascadedStyle(Element e, String pseudoElement) { synchronized (e) { Mapper em = getMapper(e); @@ -337,6 +339,7 @@ CascadedStyle getCascadedStyle(Node e) { * May return null. * We assume that restyle has already been done by a getCascadedStyle if necessary. */ + @Nullable public CascadedStyle getPECascadedStyle(Node e, String pseudoElement) { Iterator>> si = pseudoSelectors.entrySet().iterator(); if (!si.hasNext()) { diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/newmatch/PageInfo.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/newmatch/PageInfo.java index 53d49c654..7828d217f 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/newmatch/PageInfo.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/newmatch/PageInfo.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.css.newmatch; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.css.constants.CSSName; import org.xhtmlrenderer.css.constants.IdentValue; import org.xhtmlrenderer.css.constants.MarginBoxName; @@ -26,7 +27,6 @@ import org.xhtmlrenderer.css.sheet.PropertyDeclaration; import org.xhtmlrenderer.css.sheet.StylesheetInfo; -import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.Map; diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/CSSParseException.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/CSSParseException.java index 7d4e19ad3..ec2447b88 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/CSSParseException.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/CSSParseException.java @@ -19,11 +19,16 @@ */ package org.xhtmlrenderer.css.parser; +import org.jspecify.annotations.Nullable; + public class CSSParseException extends RuntimeException { + @Nullable private final Token _found; + @Nullable private final Token[] _expected; private int _line; + @Nullable private final String _genericMessage; private boolean _callerNotified; @@ -32,7 +37,7 @@ public CSSParseException(String message, int line) { this(message, line, null); } - public CSSParseException(String message, int line, Throwable cause) { + public CSSParseException(String message, int line, @Nullable Throwable cause) { super(message, cause); _found = null; _expected = null; @@ -47,7 +52,7 @@ public CSSParseException(Token found, Token expected, int line) { _genericMessage = null; } - public CSSParseException(Token found, Token[] expected, int line) { + public CSSParseException(Token found, @Nullable Token[] expected, int line) { _found = found; _expected = expected == null ? new Token[]{} : expected.clone(); _line = line; diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/CSSParser.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/CSSParser.java index 5835996e8..94c0a63af 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/CSSParser.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/CSSParser.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.css.parser; +import org.jspecify.annotations.Nullable; import org.w3c.dom.css.CSSPrimitiveValue; import org.xhtmlrenderer.css.constants.CSSName; import org.xhtmlrenderer.css.constants.MarginBoxName; @@ -57,9 +58,11 @@ public class CSSParser { private static final Set SUPPORTED_PSEUDO_ELEMENTS = setOf("first-line", "first-letter", "before", "after"); private static final Set CSS21_PSEUDO_ELEMENTS = setOf("first-line", "first-letter", "before", "after"); + @Nullable private Token _saved; private final Lexer _lexer; private final CSSErrorHandler _errorHandler; + @Nullable private String _uri; private final Map _namespaces = new HashMap<>(); @@ -104,6 +107,7 @@ public Ruleset parseDeclaration(int origin, String text) { } } + @Nullable public PropertyValue parsePropertyValue(CSSName cssName, int origin, String expr) { _uri = cssName + " property value"; try { @@ -1356,7 +1360,7 @@ private void prio() throws IOException { private List expr(boolean literal) throws IOException { //System.out.println("expr()"); List result = new ArrayList<>(10); - result.add(term(literal)); + result.add(term(literal, null)); LOOP: while (true) { Token t = la(); boolean operator = false; @@ -1391,11 +1395,7 @@ private List expr(boolean literal) throws IOException { case Token.URI: case Token.HASH: case Token.FUNCTION: - PropertyValue term = term(literal); - if (operatorToken != null) { - term.setOperator(operatorToken); - } - result.add(term); + result.add(term(literal, operatorToken)); break; default: if (operator) { @@ -1456,7 +1456,7 @@ private String sign(float sign) { // TIME S* | FREQ S* ] // | STRING S* | IDENT S* | URI S* | hexcolor | function // ; - private PropertyValue term(boolean literal) throws IOException { + private PropertyValue term(boolean literal, @Nullable Token operatorToken) throws IOException { //System.out.println("term()"); float sign = 1; Token t = la(); @@ -1464,7 +1464,7 @@ private PropertyValue term(boolean literal) throws IOException { sign = unary_operator(); t = la(); } - PropertyValue result; + final PropertyValue result; switch (t.getType()) { case Token.ANGLE: case Token.TIME: @@ -1475,7 +1475,8 @@ private PropertyValue term(boolean literal) throws IOException { result = new PropertyValue( CSS_NUMBER, sign*Float.parseFloat(getTokenValue(t)), - sign(sign) + getTokenValue(t)); + sign(sign) + getTokenValue(t), + operatorToken); next(); skip_whitespace(); break; @@ -1483,7 +1484,8 @@ private PropertyValue term(boolean literal) throws IOException { result = new PropertyValue( CSS_PERCENTAGE, sign*Float.parseFloat(extractNumber(t)), - sign(sign) + getTokenValue(t)); + sign(sign) + getTokenValue(t), + operatorToken); next(); skip_whitespace(); break; @@ -1491,7 +1493,8 @@ private PropertyValue term(boolean literal) throws IOException { result = new PropertyValue( CSSPrimitiveValue.CSS_EMS, sign*Float.parseFloat(extractNumber(t)), - sign(sign) + getTokenValue(t)); + sign(sign) + getTokenValue(t), + operatorToken); next(); skip_whitespace(); break; @@ -1499,7 +1502,8 @@ private PropertyValue term(boolean literal) throws IOException { result = new PropertyValue( CSSPrimitiveValue.CSS_EXS, sign*Float.parseFloat(extractNumber(t)), - sign(sign) + getTokenValue(t)); + sign(sign) + getTokenValue(t), + operatorToken); next(); skip_whitespace(); break; @@ -1507,7 +1511,8 @@ private PropertyValue term(boolean literal) throws IOException { result = new PropertyValue( CSSPrimitiveValue.CSS_PX, sign*Float.parseFloat(extractNumber(t)), - sign(sign) + getTokenValue(t)); + sign(sign) + getTokenValue(t), + operatorToken); next(); skip_whitespace(); break; @@ -1515,7 +1520,8 @@ private PropertyValue term(boolean literal) throws IOException { result = new PropertyValue( CSSPrimitiveValue.CSS_CM, sign*Float.parseFloat(extractNumber(t)), - sign(sign) + getTokenValue(t)); + sign(sign) + getTokenValue(t), + operatorToken); next(); skip_whitespace(); break; @@ -1523,7 +1529,8 @@ private PropertyValue term(boolean literal) throws IOException { result = new PropertyValue( CSSPrimitiveValue.CSS_MM, sign*Float.parseFloat(extractNumber(t)), - sign(sign) + getTokenValue(t)); + sign(sign) + getTokenValue(t), + operatorToken); next(); skip_whitespace(); break; @@ -1531,7 +1538,8 @@ private PropertyValue term(boolean literal) throws IOException { result = new PropertyValue( CSSPrimitiveValue.CSS_IN, sign*Float.parseFloat(extractNumber(t)), - sign(sign) + getTokenValue(t)); + sign(sign) + getTokenValue(t), + operatorToken); next(); skip_whitespace(); break; @@ -1539,7 +1547,8 @@ private PropertyValue term(boolean literal) throws IOException { result = new PropertyValue( CSSPrimitiveValue.CSS_PT, sign*Float.parseFloat(extractNumber(t)), - sign(sign) + getTokenValue(t)); + sign(sign) + getTokenValue(t), + operatorToken); next(); skip_whitespace(); break; @@ -1547,7 +1556,8 @@ private PropertyValue term(boolean literal) throws IOException { result = new PropertyValue( CSSPrimitiveValue.CSS_PC, sign*Float.parseFloat(extractNumber(t)), - sign(sign) + getTokenValue(t)); + sign(sign) + getTokenValue(t), + operatorToken); next(); skip_whitespace(); break; @@ -1556,7 +1566,8 @@ private PropertyValue term(boolean literal) throws IOException { result = new PropertyValue( CSSPrimitiveValue.CSS_STRING, s, - getRawTokenValue()); + getRawTokenValue(), + operatorToken); next(); skip_whitespace(); break; @@ -1565,7 +1576,8 @@ private PropertyValue term(boolean literal) throws IOException { result = new PropertyValue( CSSPrimitiveValue.CSS_IDENT, value, - value); + value, + operatorToken); next(); skip_whitespace(); break; @@ -1573,15 +1585,16 @@ private PropertyValue term(boolean literal) throws IOException { result = new PropertyValue( CSSPrimitiveValue.CSS_URI, getTokenValue(t), - getRawTokenValue()); + getRawTokenValue(), + operatorToken); next(); skip_whitespace(); break; case Token.HASH: - result = hexcolor(); + result = hexcolor(operatorToken); break; case Token.FUNCTION: - result = function(); + result = function(operatorToken); break; default: throw new CSSParseException(t, new Token[] { Token.TK_NUMBER, @@ -1597,9 +1610,9 @@ private PropertyValue term(boolean literal) throws IOException { // function // : FUNCTION S* expr ')' S* // ; - private PropertyValue function() throws IOException { + private PropertyValue function(Token operatorToken) throws IOException { //System.out.println("function()"); - PropertyValue result; + final PropertyValue result; Token t = next(); if (t == Token.TK_FUNCTION) { String f = getTokenValue(t); @@ -1612,16 +1625,16 @@ private PropertyValue function() throws IOException { } if (f.equals("rgb(")) { - result = new PropertyValue(createRGBColorFromFunction(params)); + result = new PropertyValue(createRGBColorFromFunction(params), operatorToken); } else if (f.equals("cmyk(")) { if (! isSupportCMYKColors()) { throw new CSSParseException( "The current output device does not support CMYK colors", getCurrentLine()); } //in accordance to http://www.w3.org/TR/css3-gcpm/#cmyk-colors - result = new PropertyValue(createCMYKColorFromFunction(params)); + result = new PropertyValue(createCMYKColorFromFunction(params), operatorToken); } else { - result = new PropertyValue(new FSFunction(f.substring(0, f.length()-1), params)); + result = new PropertyValue(new FSFunction(f.substring(0, f.length()-1), params), operatorToken); } skip_whitespace(); @@ -1652,7 +1665,7 @@ private FSCMYKColor createCMYKColorFromFunction(List params) { private float parseCMYKColorComponent(PropertyValue value, int paramNo) { short type = value.getPrimitiveType(); - float result; + final float result; if (type == CSS_NUMBER) { result = value.getFloatValue(); } else if (type == CSS_PERCENTAGE) { @@ -1724,9 +1737,9 @@ private static float fromZeroTo255(float f) { // hexcolor // : HASH S* // ; - private PropertyValue hexcolor() throws IOException { + private PropertyValue hexcolor(Token operatorToken) throws IOException { //System.out.println("hexcolor()"); - PropertyValue result; + final PropertyValue result; Token t = next(); if (t == Token.TK_HASH) { String s = getTokenValue(t); @@ -1746,7 +1759,7 @@ private PropertyValue hexcolor() throws IOException { convertToInteger(s.charAt(2), s.charAt(3)), convertToInteger(s.charAt(4), s.charAt(5))); } - result = new PropertyValue(color); + result = new PropertyValue(color, operatorToken); skip_whitespace(); } else { push(t); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/FSRGBColor.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/FSRGBColor.java index 8b5f2707b..879465ece 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/FSRGBColor.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/FSRGBColor.java @@ -19,6 +19,8 @@ */ package org.xhtmlrenderer.css.parser; +import org.jspecify.annotations.Nullable; + import java.util.Objects; public class FSRGBColor implements FSColor { @@ -36,7 +38,7 @@ public FSRGBColor(int red, int green, int blue) { _green = validateColor("Green", green); _blue = validateColor("Blue", blue); } - + private int validateColor(String name, int color) { if (color < 0 || color > 255) { throw new IllegalArgumentException(String.format("%s %s is out of range [0, 255]", name, color)); @@ -109,7 +111,7 @@ public FSColor darkenColor() { } // Taken from java.awt.Color to avoid dependency on it - private static float[] RGBtoHSB(int r, int g, int b, float[] hsbvals) { + private static float[] RGBtoHSB(int r, int g, int b, float @Nullable [] hsbvals) { float hue, saturation, brightness; if (hsbvals == null) { hsbvals = new float[3]; diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/PropertyValue.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/PropertyValue.java index 4128b7793..54d214d41 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/PropertyValue.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/PropertyValue.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.css.parser; +import org.jspecify.annotations.Nullable; import org.w3c.dom.DOMException; import org.w3c.dom.css.CSSPrimitiveValue; import org.w3c.dom.css.CSSValue; @@ -43,24 +44,32 @@ public class PropertyValue implements CSSPrimitiveValue { private final short _type; private final short _cssValueType; - private String _stringValue; + @Nullable + private final String _stringValue; private float _floatValue; - private String[] _stringArrayValue; + private final String @Nullable [] _stringArrayValue; private final String _cssText; - private FSColor _FSColor; + @Nullable + private final FSColor _FSColor; + @Nullable private IdentValue _identValue; private final short _propertyValueType; - private Token _operator; + @Nullable + private final Token _operator; private List _values; private FSFunction _function; public PropertyValue(short type, float floatValue, String cssText) { + this(type, floatValue, cssText, null); + } + + public PropertyValue(short type, float floatValue, String cssText, @Nullable Token operatorToken) { _type = type; _floatValue = floatValue; _cssValueType = CSSValue.CSS_PRIMITIVE_VALUE; @@ -71,18 +80,37 @@ public PropertyValue(short type, float floatValue, String cssText) { } else { _propertyValueType = VALUE_TYPE_LENGTH; } + _stringValue = null; + _stringArrayValue = null; + _FSColor = null; + _operator = operatorToken; } public PropertyValue(FSColor color) { + this(color, null); + } + + public PropertyValue(FSColor color, @Nullable Token operatorToken) { _type = CSSPrimitiveValue.CSS_RGBCOLOR; _cssValueType = CSSValue.CSS_PRIMITIVE_VALUE; _cssText = color.toString(); _FSColor = color; _propertyValueType = VALUE_TYPE_COLOR; + _stringValue = null; + _stringArrayValue = null; + _operator = operatorToken; } public PropertyValue(short type, String stringValue, String cssText) { + this(type, stringValue, cssText, null); + } + + public PropertyValue(short type, String stringValue, String cssText, @Nullable Token operatorToken) { + this(type, stringValue, cssText, null, operatorToken); + } + + public PropertyValue(short type, String stringValue, String cssText, String @Nullable [] stringArrayValue, @Nullable Token operatorToken) { _type = type; _stringValue = stringValue; // Must be a case-insensitive compare since ident values aren't normalized @@ -95,6 +123,9 @@ public PropertyValue(short type, String stringValue, String cssText) { } else { _propertyValueType = VALUE_TYPE_STRING; } + _stringArrayValue = ArrayUtil.cloneOrEmpty(stringArrayValue); + _FSColor = null; + _operator = operatorToken; } public PropertyValue(IdentValue ident) { @@ -105,6 +136,9 @@ public PropertyValue(IdentValue ident) { _propertyValueType = VALUE_TYPE_IDENT; _identValue = ident; + _stringArrayValue = null; + _FSColor = null; + _operator = null; } public PropertyValue(List values) { @@ -114,15 +148,27 @@ public PropertyValue(List values) { _values = values; _propertyValueType = VALUE_TYPE_LIST; + _stringValue = null; + _stringArrayValue = null; + _FSColor = null; + _operator = null; } public PropertyValue(FSFunction function) { + this(function, null); + } + + public PropertyValue(FSFunction function, @Nullable Token operatorToken) { _type = CSSPrimitiveValue.CSS_UNKNOWN; _cssValueType = CSSValue.CSS_CUSTOM; _cssText = function.toString(); _function = function; _propertyValueType = VALUE_TYPE_FUNCTION; + _stringValue = null; + _stringArrayValue = null; + _FSColor = null; + _operator = operatorToken; } @Override @@ -154,6 +200,7 @@ public Rect getRectValue() throws DOMException { throw new UnsupportedOperationException("Unsupported operation: getRectValue"); } + @Nullable @Override public String getStringValue() throws DOMException { return _stringValue; @@ -184,10 +231,12 @@ public void setCssText(String cssText) throws DOMException { throw new UnsupportedOperationException("Unsupported operation: setCssText"); } + @Nullable public FSColor getFSColor() { return _FSColor; } + @Nullable public IdentValue getIdentValue() { return _identValue; } @@ -200,22 +249,15 @@ public short getPropertyValueType() { return _propertyValueType; } + @Nullable public Token getOperator() { return _operator; } - public void setOperator(Token operator) { - _operator = operator; - } - public String[] getStringArrayValue() { return ArrayUtil.cloneOrEmpty(_stringArrayValue); } - public void setStringArrayValue(String[] stringArrayValue) { - _stringArrayValue = ArrayUtil.cloneOrEmpty(stringArrayValue); - } - public String toString() { return _cssText; } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/package-info.java new file mode 100644 index 000000000..d7225186e --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.css.parser; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/AbstractPropertyBuilder.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/AbstractPropertyBuilder.java index 758c24c00..e29d94da0 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/AbstractPropertyBuilder.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/AbstractPropertyBuilder.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.css.parser.property; +import org.jspecify.annotations.Nullable; import org.w3c.dom.css.CSSPrimitiveValue; import org.xhtmlrenderer.css.constants.CSSName; import org.xhtmlrenderer.css.constants.IdentValue; @@ -177,6 +178,7 @@ protected void checkInheritAllowed(CSSPrimitiveValue value, boolean inheritAllow } } + @Nullable protected List checkInheritAll(CSSName[] all, List values, int origin, boolean important, boolean inheritAllowed) { if (values.size() == 1) { CSSPrimitiveValue value = values.get(0); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/BorderPropertyBuilders.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/BorderPropertyBuilders.java index 6365047a5..d92c5bd43 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/BorderPropertyBuilders.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/BorderPropertyBuilders.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.css.parser.property; +import org.jspecify.annotations.Nullable; import org.w3c.dom.css.CSSPrimitiveValue; import org.xhtmlrenderer.css.constants.CSSName; import org.xhtmlrenderer.css.constants.IdentValue; @@ -130,6 +131,7 @@ private boolean isBorderStyle(CSSPrimitiveValue value) { return PrimitivePropertyBuilders.BORDER_STYLES.get(ident.FS_ID); } + @Nullable private CSSPrimitiveValue convertToBorderWidth(CSSPrimitiveValue value) { int type = value.getPrimitiveType(); if (type != CSSPrimitiveValue.CSS_IDENT && ! isLength(value)) { @@ -152,6 +154,7 @@ private CSSPrimitiveValue convertToBorderWidth(CSSPrimitiveValue value) { } } + @Nullable private CSSPrimitiveValue convertToBorderColor(CSSPrimitiveValue value) { int type = value.getPrimitiveType(); if (type != CSSPrimitiveValue.CSS_IDENT && type != CSSPrimitiveValue.CSS_RGBCOLOR) { diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/Conversions.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/Conversions.java index 829f4962d..3af24d2e8 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/Conversions.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/Conversions.java @@ -20,6 +20,7 @@ */ package org.xhtmlrenderer.css.parser.property; +import org.jspecify.annotations.Nullable; import org.w3c.dom.css.CSSPrimitiveValue; import org.xhtmlrenderer.css.constants.IdentValue; import org.xhtmlrenderer.css.parser.FSRGBColor; @@ -193,6 +194,7 @@ public class Conversions { BORDER_WIDTHS.put("thick", new PropertyValue(CSSPrimitiveValue.CSS_PX, 3.0f, "3px")); } + @Nullable public static FSRGBColor getColor(String ident) { return COLORS.get(ident); } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/PageSize.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/PageSize.java index 09559867b..68cba3cc7 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/PageSize.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/PageSize.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.css.parser.property; +import org.jspecify.annotations.Nullable; import org.w3c.dom.css.CSSPrimitiveValue; import org.xhtmlrenderer.css.parser.PropertyValue; @@ -103,17 +104,14 @@ public class PageSize { SIZE_MAP.put("ledger", LEDGER); } - private CSSPrimitiveValue _pageWidth; - private CSSPrimitiveValue _pageHeight; + private final CSSPrimitiveValue _pageWidth; + private final CSSPrimitiveValue _pageHeight; private PageSize(CSSPrimitiveValue width, CSSPrimitiveValue height) { _pageWidth = width; _pageHeight = height; } - private PageSize() { - } - public CSSPrimitiveValue getPageHeight() { return _pageHeight; } @@ -122,6 +120,7 @@ public CSSPrimitiveValue getPageWidth() { return _pageWidth; } + @Nullable public static PageSize getPageSize(String pageSize) { return SIZE_MAP.get(pageSize); } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/PrimitivePropertyBuilders.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/PrimitivePropertyBuilders.java index 1e7ea5508..100e7dad9 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/PrimitivePropertyBuilders.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/PrimitivePropertyBuilders.java @@ -957,8 +957,7 @@ public List buildDeclarations( String text = concat(normalized, ','); PropertyValue result = new PropertyValue( - CSSPrimitiveValue.CSS_STRING, text, text); // HACK cssText can be wrong - result.setStringArrayValue(normalized.toArray(new String[normalized.size()])); + CSSPrimitiveValue.CSS_STRING, text, text, normalized.toArray(new String[normalized.size()]), null); // HACK cssText can be wrong return singletonList( new PropertyDeclaration(cssName, result, important, origin)); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/QuotesPropertyBuilder.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/QuotesPropertyBuilder.java index 8e7442fc2..af522e44f 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/QuotesPropertyBuilder.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/QuotesPropertyBuilder.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.css.parser.property; +import com.google.errorprone.annotations.CheckReturnValue; import org.w3c.dom.css.CSSPrimitiveValue; import org.w3c.dom.css.CSSValue; import org.xhtmlrenderer.css.constants.CSSName; @@ -27,8 +28,6 @@ import org.xhtmlrenderer.css.parser.PropertyValue; import org.xhtmlrenderer.css.sheet.PropertyDeclaration; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; import java.util.List; import static java.util.Collections.emptyList; @@ -52,7 +51,7 @@ public List buildDeclarations(CSSName cssName, List buildDeclarations(CSSName cssName, List getStringValues(List values) { return values.stream() @@ -78,7 +76,7 @@ private List getStringValues(List values) { .map(value -> value.getStringValue()) .collect(toList()); } - + private void assertNoOperator(PropertyValue cssPrimitiveValue) { if (cssPrimitiveValue.getOperator() != null) { throw new CSSParseException( diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/SizePropertyBuilder.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/SizePropertyBuilder.java index bbfb7404e..ddc730baa 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/SizePropertyBuilder.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/SizePropertyBuilder.java @@ -153,7 +153,7 @@ public List buildDeclarations( PropertyValue value3 = (PropertyValue) values.get(2); checkInheritAllowed(value3, false); - + if (isLength(value1) && isLength(value2) && value3.getPrimitiveType() == CSSPrimitiveValue.CSS_IDENT) { if (value1.getFloatValue() < 0.0f) { throw new CSSParseException("A page dimension may not be negative", -1); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/package-info.java new file mode 100644 index 000000000..45ada81f9 --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/parser/property/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.css.parser.property; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/style/CalculatedStyle.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/style/CalculatedStyle.java index afc245916..f70318aa5 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/style/CalculatedStyle.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/style/CalculatedStyle.java @@ -20,6 +20,7 @@ */ package org.xhtmlrenderer.css.style; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.css.constants.CSSName; import org.xhtmlrenderer.css.constants.IdentValue; import org.xhtmlrenderer.css.newmatch.CascadedStyle; @@ -43,8 +44,6 @@ import org.xhtmlrenderer.util.XRLog; import org.xhtmlrenderer.util.XRRuntimeException; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.awt.*; import java.util.ArrayList; import java.util.Iterator; @@ -80,27 +79,33 @@ * @author Torbjoern Gannholm * @author Patrick Wright */ -@ParametersAreNonnullByDefault public class CalculatedStyle { /** * The parent-style we inherit from */ + @Nullable private final CalculatedStyle _parent; + @Nullable private BorderPropertySet _border; + @Nullable private RectPropertySet _margin; + @Nullable private RectPropertySet _padding; private float _lineHeight; private boolean _lineHeightResolved; + @Nullable private FSFont _FSFont; + @Nullable private FSFontMetrics _FSFontMetrics; private boolean _marginsAllowed = true; private boolean _paddingAllowed = true; private boolean _bordersAllowed = true; + @Nullable private BackgroundSize _backgroundSize; /** @@ -112,11 +117,13 @@ public class CalculatedStyle { * Our main array of property values defined in this style, keyed * by the CSSName assigned ID. */ + @Nullable private final FSDerivedValue[] _derivedValuesById; /** * The derived Font for this style */ + @Nullable private FontSpecification _font; private CalculatedStyle(@Nullable CalculatedStyle parent) { @@ -178,6 +185,7 @@ public CalculatedStyle deriveStyle(CascadedStyle matched) { return _childCache.computeIfAbsent(fingerprint, (key) -> new CalculatedStyle(this, matched)); } + @Nullable public CalculatedStyle getParent() { return _parent; } @@ -259,6 +267,7 @@ public FSColor getColor() { * * @return The backgroundColor value */ + @Nullable public FSColor getBackgroundColor() { FSDerivedValue prop = valueByName(CSSName.BACKGROUND_COLOR); if (prop == IdentValue.TRANSPARENT) { @@ -307,6 +316,7 @@ public BackgroundPosition getBackgroundPosition() { return new BackgroundPosition(values.get(0), values.get(1)); } + @Nullable public List getCounterReset() { FSDerivedValue value = valueByName(CSSName.COUNTER_RESET); @@ -317,6 +327,7 @@ public List getCounterReset() { } } + @Nullable public List getCounterIncrement() { FSDerivedValue value = valueByName(CSSName.COUNTER_INCREMENT); @@ -365,10 +376,12 @@ public FontSpecification getFont(CssContext ctx) { return _font; } + @Nullable public FontSpecification getFontSpecification() { return _font; } + @Nullable private IdentValue resolveAbsoluteFontSize() { FSDerivedValue fontSize = valueByName(CSSName.FONT_SIZE); if (!(fontSize instanceof IdentValue fontSizeIdent)) { @@ -1047,6 +1060,7 @@ public boolean isHasBackground() { isIdent(CSSName.BACKGROUND_IMAGE, IdentValue.NONE)); } + @Nullable public List getTextDecorations() { FSDerivedValue value = valueByName(CSSName.TEXT_DECORATION); if (value == IdentValue.NONE) { diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/style/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/style/package-info.java new file mode 100644 index 000000000..c55364665 --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/css/style/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.css.style; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/event/DefaultDocumentListener.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/event/DefaultDocumentListener.java index d4eb92dcb..1dda1cc43 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/event/DefaultDocumentListener.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/event/DefaultDocumentListener.java @@ -19,13 +19,10 @@ */ package org.xhtmlrenderer.event; -import javax.annotation.ParametersAreNonnullByDefault; - /** * Default, do-nothing implementation of a {@link DocumentListener}; implements all methods in {@link DocumentListener} * but the methods do nothing. Subclass this class and override whichever methods you need to trap. */ -@ParametersAreNonnullByDefault public class DefaultDocumentListener implements DocumentListener { public void documentStarted() { } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/event/DocumentListener.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/event/DocumentListener.java index 8da0e5e59..021e67768 100755 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/event/DocumentListener.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/event/DocumentListener.java @@ -19,15 +19,12 @@ */ package org.xhtmlrenderer.event; -import javax.annotation.ParametersAreNonnullByDefault; - /** * Implementations of this listener interface receive notifications about * various document and layout events. Events are called on the Event Dispatch Thread, and will block * any EDT activity until the methods return; make sure you do as little as possible in each method, or where necessary, * spin the task off to a separate thread. */ -@ParametersAreNonnullByDefault public interface DocumentListener { /** * Indicates document has been requested (e.g. a new document is going to be diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/event/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/event/package-info.java new file mode 100644 index 000000000..95ab7cbd8 --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/event/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.event; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/FontResolver.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/FontResolver.java index bb2acda7f..8807cabd4 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/FontResolver.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/FontResolver.java @@ -20,11 +20,15 @@ */ package org.xhtmlrenderer.extend; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.css.value.FontSpecification; import org.xhtmlrenderer.layout.SharedContext; import org.xhtmlrenderer.render.FSFont; public interface FontResolver { + @Nullable + @CheckReturnValue FSFont resolveFont(SharedContext renderingContext, FontSpecification spec); void flushCache(); } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/NamespaceHandler.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/NamespaceHandler.java index d4d58ae63..3bc2afc67 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/NamespaceHandler.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/NamespaceHandler.java @@ -19,15 +19,13 @@ */ package org.xhtmlrenderer.extend; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xhtmlrenderer.css.extend.StylesheetFactory; import org.xhtmlrenderer.css.sheet.StylesheetInfo; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; /** @@ -36,13 +34,11 @@ * * @author Torbjoern Gannholm */ -@ParametersAreNonnullByDefault public interface NamespaceHandler { /** * @return the namespace handled */ - @Nonnull @CheckReturnValue String getNamespace(); @@ -66,7 +62,6 @@ public interface NamespaceHandler { * @return all links to CSS stylesheets (type="text/css") in this * document */ - @Nonnull @CheckReturnValue List getStylesheets(Document doc); @@ -74,11 +69,9 @@ public interface NamespaceHandler { * may return null. Required to return null if attribute does not exist and * not null if attribute exists. */ - @Nonnull @CheckReturnValue String getAttributeValue(Element e, String attrName); - @Nonnull @CheckReturnValue String getAttributeValue(Element e, @Nullable String namespaceURI, String attrName); @@ -101,7 +94,6 @@ public interface NamespaceHandler { @CheckReturnValue String getNonCssStyling(Element e); - @Nonnull @CheckReturnValue String getLang(Element e); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/ReplacedElementFactory.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/ReplacedElementFactory.java index 8b7faea39..151711115 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/ReplacedElementFactory.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/ReplacedElementFactory.java @@ -19,14 +19,13 @@ */ package org.xhtmlrenderer.extend; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.xhtmlrenderer.layout.LayoutContext; import org.xhtmlrenderer.render.BlockBox; import org.xhtmlrenderer.simple.extend.FormSubmissionListener; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; - public interface ReplacedElementFactory { /** diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/UserAgentCallback.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/UserAgentCallback.java index c96865bf2..cf604fac7 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/UserAgentCallback.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/UserAgentCallback.java @@ -19,15 +19,12 @@ */ package org.xhtmlrenderer.extend; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.resource.CSSResource; import org.xhtmlrenderer.resource.ImageResource; import org.xhtmlrenderer.resource.XMLResource; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; - - /** *

To be implemented by any user agent using the panel. "User agent" is a * term defined by the W3C in the documentation for XHTML and CSS; in most @@ -51,7 +48,6 @@ * * @author Torbjoern Gannholm */ -@ParametersAreNonnullByDefault public interface UserAgentCallback { /** * Retrieves the CSS at the given URI. This is a synchronous call. @@ -75,15 +71,15 @@ public interface UserAgentCallback { * @param uri Location of the XML * @return A XMLResource for the content at the URI. */ + @Nullable XMLResource getXMLResource(String uri); /** * Retrieves a binary resource located at a given URI and returns its contents * as a byte array or {@code null} if the resource could not be loaded. */ - @Nullable @CheckReturnValue - byte[] getBinaryResource(String uri); + byte @Nullable [] getBinaryResource(String uri); /** * Normally, returns true if the user agent has visited this URI. UserAgent should consider diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/package-info.java new file mode 100644 index 000000000..34451eede --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/extend/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.extend; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/BoxBuilder.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/BoxBuilder.java index b26a26f3a..b6887ecc2 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/BoxBuilder.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/BoxBuilder.java @@ -20,6 +20,8 @@ */ package org.xhtmlrenderer.layout; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; @@ -53,9 +55,6 @@ import org.xhtmlrenderer.render.FloatedBoxData; import org.xhtmlrenderer.render.InlineBox; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -81,7 +80,6 @@ * content for purposes of inserting anonymous block boxes and calculating * the kind of content contained in a given block box. */ -@ParametersAreNonnullByDefault public class BoxBuilder { private static final Logger log = LoggerFactory.getLogger(BoxBuilder.class); @@ -141,6 +139,7 @@ public static void createChildren(LayoutContext c, BlockBox parent) { } } + @Nullable public static TableBox createMarginTable( LayoutContext c, PageInfo pageInfo, @@ -244,6 +243,7 @@ public static TableBox createMarginTable( return cellCount > 0 ? result : null; } + @Nullable private static TableCellBox createMarginBox( LayoutContext c, CascadedStyle cascadedStyle, @@ -498,8 +498,8 @@ private static boolean isParentInline(BlockBox box) { } private static void createAnonymousTableContent(LayoutContext c, BlockBox source, - IdentValue next, - List childrenForAnonymous, + IdentValue next, + List childrenForAnonymous, List childrenWithAnonymous) { ChildBoxInfo nested = lookForBlockContent(childrenForAnonymous); IdentValue anonDisplay; @@ -622,6 +622,7 @@ private static ChildBoxInfo lookForBlockContent(List styleables) { return result; } + @Nullable private static IdentValue getNextTableNestingLevel(IdentValue display) { if (display == IdentValue.TABLE || display == IdentValue.INLINE_TABLE) { return IdentValue.TABLE_ROW_GROUP; @@ -636,6 +637,7 @@ private static IdentValue getNextTableNestingLevel(IdentValue display) { } } + @Nullable private static IdentValue getPreviousTableNestingLevel(IdentValue display) { if (display == IdentValue.TABLE_CELL) { return IdentValue.TABLE_ROW; @@ -703,6 +705,7 @@ public static boolean isElementFunction(FSFunction function) { return false; } + @Nullable private static CounterFunction makeCounterFunction(FSFunction function, LayoutContext c, CalculatedStyle style) { if (function.getName().equals("counter")) { List params = function.getParameters(); @@ -788,7 +791,7 @@ private static String getAttributeValue(FSFunction attrFunc, Element e) { private static List createGeneratedContentList( LayoutContext c, Element element, PropertyValue propValue, - String peName, CalculatedStyle style, int mode, ChildBoxInfo info) { + String peName, CalculatedStyle style, int mode, @Nullable ChildBoxInfo info) { List values = propValue.getValues(); if (values == null) { diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/CollapsedBorderSide.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/CollapsedBorderSide.java index ed3c74147..2524cae7c 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/CollapsedBorderSide.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/CollapsedBorderSide.java @@ -19,14 +19,12 @@ */ package org.xhtmlrenderer.layout; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.newtable.CollapsedBorderValue; import org.xhtmlrenderer.newtable.TableCellBox; import org.xhtmlrenderer.render.BorderPainter; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - import static org.xhtmlrenderer.newtable.TableCellBox.compareBorders; /** @@ -53,7 +51,7 @@ public int getSide() { } @Override - public int compareTo(@Nonnull CollapsedBorderSide that) { + public int compareTo(CollapsedBorderSide that) { CollapsedBorderValue v1 = getCollapsedBorder(this); CollapsedBorderValue v2 = getCollapsedBorder(that); CollapsedBorderValue result = compareBorders(v1, v2, true); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/InlineBoxing.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/InlineBoxing.java index 6a07b8f0c..1b426f231 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/InlineBoxing.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/InlineBoxing.java @@ -20,6 +20,8 @@ */ package org.xhtmlrenderer.layout; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.css.constants.CSSName; import org.xhtmlrenderer.css.constants.IdentValue; import org.xhtmlrenderer.css.style.CalculatedStyle; @@ -42,8 +44,6 @@ import org.xhtmlrenderer.render.TextDecoration; import org.xhtmlrenderer.util.XRRuntimeException; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -608,14 +608,13 @@ private static InlineBoxMeasurements calculateInlineMeasurements(LayoutContext c return result; } - @Nonnull @CheckReturnValue public static List calculateTextDecorations(Box box, int baseline, FSFontMetrics fm) { List idents = box.getStyle().getTextDecorations(); if (idents == null) { return emptyList(); } - + List result = new ArrayList<>(idents.size()); if (idents.contains(IdentValue.UNDERLINE)) { TextDecoration decoration = calculateTextDecoration(baseline, fm); @@ -638,7 +637,7 @@ public static List calculateTextDecorations(Box box, int baselin return result; } - @Nonnull + @CheckReturnValue private static TextDecoration calculateTextDecoration(int baseline, FSFontMetrics fm) { TextDecoration decoration = new TextDecoration(IdentValue.UNDERLINE); // JDK returns zero so create additional space equal to one @@ -902,7 +901,7 @@ private static void trimLeadingSpace(LineBreakContext lbContext) { lbContext.setStart(lbContext.getStart() + i); } - private static LineBox newLine(LayoutContext c, LineBox previousLine, Box box) { + private static LineBox newLine(LayoutContext c, @Nullable LineBox previousLine, Box box) { int y = 0; if (previousLine != null) { @@ -926,7 +925,7 @@ private static LineBox newLine(LayoutContext c, int y, Box box) { } private static InlineLayoutBox addOpenInlineBoxes( - LayoutContext c, LineBox line, List openParents, int cbWidth, + LayoutContext c, LineBox line, List openParents, int cbWidth, Map iBMap) { List result = new ArrayList<>(); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/Layer.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/Layer.java index 78edf6819..4b9c4abe3 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/Layer.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/Layer.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.layout; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.css.constants.CSSName; import org.xhtmlrenderer.css.constants.PageElementPosition; import org.xhtmlrenderer.css.newmatch.PageInfo; @@ -66,13 +67,16 @@ public final class Layer { public static final short PAGED_MODE_SCREEN = 1; public static final short PAGED_MODE_PRINT = 2; + @Nullable private final Layer _parent; private boolean _stackingContext; + @Nullable private List _children; private final Box _master; private Box _end; + @Nullable private List _floats; private boolean _fixedBackground; @@ -93,7 +97,7 @@ public Layer(Box master) { setStackingContext(true); } - public Layer(Layer parent, Box master) { + public Layer(@Nullable Layer parent, Box master) { _parent = parent; _master = master; setStackingContext( @@ -102,6 +106,7 @@ public Layer(Layer parent, Box master) { master.setContainingLayer(this); } + @Nullable public Layer getParent() { return _parent; } @@ -329,6 +334,7 @@ private List getFloats() { return _floats == null ? emptyList() : _floats; } + @Nullable public Box find(CssContext cssCtx, int absX, int absY, boolean findAnonymous) { if (isRootLayer() || isStackingContext()) { Box result = find(cssCtx, absX, absY, getSortedLayers(POSITIVE), findAnonymous); @@ -368,6 +374,7 @@ public Box find(CssContext cssCtx, int absX, int absY, boolean findAnonymous) { return null; } + @Nullable private Box find(CssContext cssCtx, int absX, int absY, List layers, boolean findAnonymous) { // Work backwards since layers are painted forwards and we're looking // for the top-most box @@ -387,6 +394,7 @@ private Box find(CssContext cssCtx, int absX, int absY, List layers, bool // we're about to draw and returns a map with the last cell in a given table // we'll paint as a key and a sorted list of borders as values. These are // then painted after we've drawn the background for this cell. + @Nullable private Map> collectCollapsedTableBorders(List blocks) { Map> cellBordersByTable = new HashMap<>(); Map triggerCellsByTable = new HashMap<>(); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/LayoutContext.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/LayoutContext.java index 4c2bd952b..a964282f3 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/LayoutContext.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/LayoutContext.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.layout; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.context.ContentFunctionFactory; import org.xhtmlrenderer.context.StyleReference; import org.xhtmlrenderer.css.constants.CSSName; @@ -39,7 +40,6 @@ import org.xhtmlrenderer.render.MarkerData; import org.xhtmlrenderer.render.PageBox; -import javax.annotation.Nullable; import java.awt.*; import java.util.ArrayList; import java.util.HashMap; @@ -60,6 +60,7 @@ public class LayoutContext implements CssContext { private StyleTracker _firstLines; private StyleTracker _firstLetters; + @Nullable private MarkerData _currentMarkerData; private LinkedList _bfcs; @@ -298,11 +299,12 @@ public StyleTracker getFirstLettersTracker() { return _firstLetters; } + @Nullable public MarkerData getCurrentMarkerData() { return _currentMarkerData; } - public void setCurrentMarkerData(MarkerData currentMarkerData) { + public void setCurrentMarkerData(@Nullable MarkerData currentMarkerData) { _currentMarkerData = currentMarkerData; } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/SharedContext.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/SharedContext.java index 3724f57a9..0444b414b 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/SharedContext.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/SharedContext.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.layout; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -47,7 +48,6 @@ import org.xhtmlrenderer.swing.SwingReplacedElementFactory; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.Nullable; import java.awt.*; import java.util.HashMap; import java.util.HashSet; diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/Styleable.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/Styleable.java index 8c2409c5d..4e8ee7968 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/Styleable.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/Styleable.java @@ -19,13 +19,12 @@ */ package org.xhtmlrenderer.layout; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.xhtmlrenderer.css.style.CalculatedStyle; import org.xhtmlrenderer.render.InlineLayoutBox; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; - /** * All objects appearing the layout tree must implement this interface. It * can roughly be thought of as a styled element (although an {@link InlineLayoutBox} @@ -41,8 +40,8 @@ public interface Styleable { @Nullable @CheckReturnValue Element getElement(); - - void setElement(Element e); + + void setElement(@Nullable Element e); String getPseudoElementOrClass(); } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/TextUtil.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/TextUtil.java index dbdb7833e..33a201697 100755 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/TextUtil.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/TextUtil.java @@ -19,13 +19,12 @@ */ package org.xhtmlrenderer.layout; +import com.google.errorprone.annotations.CheckReturnValue; import org.xhtmlrenderer.css.constants.CSSName; import org.xhtmlrenderer.css.constants.IdentValue; import org.xhtmlrenderer.css.style.CalculatedStyle; import org.xhtmlrenderer.util.Uu; -import javax.annotation.Nonnull; - import static java.lang.Character.END_PUNCTUATION; import static java.lang.Character.FINAL_QUOTE_PUNCTUATION; import static java.lang.Character.INITIAL_QUOTE_PUNCTUATION; @@ -126,7 +125,7 @@ private static String capitalizeWords(String text) { return result; } - @Nonnull + @CheckReturnValue private static String doCapitalizeWords(String text) { StringBuilder sb = new StringBuilder(); boolean cap = true; diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/breaker/BreakPoint.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/breaker/BreakPoint.java index fa347c556..b1594d75a 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/breaker/BreakPoint.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/breaker/BreakPoint.java @@ -18,6 +18,8 @@ */ package org.xhtmlrenderer.layout.breaker; +import org.jspecify.annotations.Nullable; + import java.text.BreakIterator; /** @@ -26,6 +28,7 @@ public class BreakPoint implements Comparable { private int position; + @Nullable private String hyphen; public BreakPoint(int position) { diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/breaker/Breaker.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/breaker/Breaker.java index b7b969e83..8bd0800e3 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/breaker/Breaker.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/breaker/Breaker.java @@ -20,6 +20,8 @@ */ package org.xhtmlrenderer.layout.breaker; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.Text; @@ -31,10 +33,6 @@ import org.xhtmlrenderer.layout.WhitespaceStripper; import org.xhtmlrenderer.render.FSFont; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.text.BreakIterator; /** @@ -42,7 +40,6 @@ * next break point. * @author Torbjoern Gannholm */ -@ParametersAreNonnullByDefault public class Breaker { private static final String DEFAULT_LANGUAGE = System.getProperty("org.xhtmlrenderer.layout.breaker.default-language", "en"); @@ -130,7 +127,6 @@ public static BreakPointsProvider getBreakPointsProvider(String text, LayoutCont return c.getSharedContext().getLineBreakingStrategy().getBreakPointsProvider(text, getLanguage(c, textNode), style); } - @Nonnull @CheckReturnValue private static String getLanguage(LayoutContext c, @Nullable Element element) { String language = element == null ? null : c.getNamespaceHandler().getLang(element); @@ -140,7 +136,6 @@ private static String getLanguage(LayoutContext c, @Nullable Element element) { return language; } - @Nonnull @CheckReturnValue private static String getLanguage(LayoutContext c, @Nullable Text textNode) { if (textNode != null) { diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/breaker/UrlAwareLineBreakIterator.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/breaker/UrlAwareLineBreakIterator.java index f507e3ed3..ca2333a73 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/breaker/UrlAwareLineBreakIterator.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/breaker/UrlAwareLineBreakIterator.java @@ -1,6 +1,5 @@ package org.xhtmlrenderer.layout.breaker; -import javax.annotation.ParametersAreNonnullByDefault; import java.text.BreakIterator; import java.text.CharacterIterator; @@ -8,7 +7,6 @@ * BreakIterator implementation that improves line breaking for URLs. Break points are supported * before path fragments. */ -@ParametersAreNonnullByDefault public class UrlAwareLineBreakIterator extends BreakIterator { private static final String BREAKING_CHARS = ".,:;!?- \n\r\t/"; @@ -24,11 +22,11 @@ public UrlAwareLineBreakIterator(String text) { public int preceding(int offset) { throw new UnsupportedOperationException("Not yet implemented"); } - + public int last() { throw new UnsupportedOperationException("Not yet implemented"); } - + public int previous() { throw new UnsupportedOperationException("Not yet implemented"); } @@ -113,15 +111,15 @@ public int following(int offset) { public int first() { throw new UnsupportedOperationException("Not yet implemented"); } - + public void setText(CharacterIterator newText) { throw new UnsupportedOperationException("Not yet implemented"); } - + public int current() { throw new UnsupportedOperationException("Not yet implemented"); } - + public CharacterIterator getText() { return delegate.getText(); } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/breaker/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/breaker/package-info.java new file mode 100644 index 000000000..6c38b9668 --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/breaker/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.layout.breaker; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/package-info.java new file mode 100644 index 000000000..7025b8421 --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/layout/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.layout; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/newtable/TableColumn.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/newtable/TableColumn.java index a27d868c3..65220e42d 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/newtable/TableColumn.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/newtable/TableColumn.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.newtable; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.xhtmlrenderer.css.style.CalculatedStyle; import org.xhtmlrenderer.layout.Styleable; @@ -28,6 +29,7 @@ * {@code display: table-column-group}. */ public class TableColumn implements Styleable { + @Nullable private Element _element; private CalculatedStyle _style; @@ -57,7 +59,7 @@ public CalculatedStyle getStyle() { } @Override - public void setElement(Element e) { + public void setElement(@Nullable Element e) { _element = e; } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/render/Box.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/render/Box.java index 9b2094c67..add4ba894 100755 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/render/Box.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/render/Box.java @@ -20,6 +20,8 @@ */ package org.xhtmlrenderer.render; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xhtmlrenderer.css.constants.CSSName; @@ -36,8 +38,6 @@ import org.xhtmlrenderer.layout.Styleable; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; import java.awt.*; import java.io.IOException; import java.io.Writer; @@ -49,6 +49,7 @@ import static java.util.Objects.requireNonNullElseGet; public abstract class Box implements Styleable { + @Nullable private Element _element; private int _x; @@ -696,7 +697,7 @@ public Element getElement() { } @Override - public final void setElement(Element element) { + public final void setElement(@Nullable Element element) { _element = element; } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/render/InlineBox.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/render/InlineBox.java index 8f0e4ca6b..2cfe8d826 100755 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/render/InlineBox.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/render/InlineBox.java @@ -18,6 +18,7 @@ */ package org.xhtmlrenderer.render; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.w3c.dom.Text; import org.xhtmlrenderer.css.constants.IdentValue; @@ -49,6 +50,7 @@ * @see InlineLayoutBox */ public class InlineBox implements Styleable { + @Nullable private Element _element; private String _originalText; @@ -132,7 +134,7 @@ public Element getElement() { } @Override - public void setElement(Element element) { + public void setElement(@Nullable Element element) { _element = element; } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/render/RenderingContext.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/render/RenderingContext.java index e401f49e7..a2ae42b83 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/render/RenderingContext.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/render/RenderingContext.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.render; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.context.StyleReference; import org.xhtmlrenderer.css.style.CssContext; import org.xhtmlrenderer.css.value.FontSpecification; @@ -31,7 +32,6 @@ import org.xhtmlrenderer.layout.Layer; import org.xhtmlrenderer.layout.SharedContext; -import javax.annotation.Nullable; import java.awt.*; /** diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/AbstractResource.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/AbstractResource.java index a6b0a6ff7..2c7f47d0b 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/AbstractResource.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/AbstractResource.java @@ -19,18 +19,16 @@ */ package org.xhtmlrenderer.resource; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.xml.sax.InputSource; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.io.BufferedInputStream; import java.io.InputStream; /** * @author Patrick Wright */ -@ParametersAreNonnullByDefault public abstract class AbstractResource implements Resource { private final InputSource inputSource; private final long createTimeStamp; diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/CSSResource.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/CSSResource.java index 1a32c24d5..fdacf50e8 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/CSSResource.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/CSSResource.java @@ -19,14 +19,13 @@ */ package org.xhtmlrenderer.resource; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; +import org.jspecify.annotations.Nullable; + import java.io.InputStream; /** * @author Administrator */ -@ParametersAreNonnullByDefault public class CSSResource extends AbstractResource { public CSSResource(@Nullable InputStream stream) { super(stream); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/FSEntityResolver.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/FSEntityResolver.java index 1007542bd..4f9227aa2 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/FSEntityResolver.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/FSEntityResolver.java @@ -20,6 +20,7 @@ */ package org.xhtmlrenderer.resource; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xhtmlrenderer.util.GeneralUtil; @@ -131,6 +132,7 @@ public InputSource resolveEntity(String name, } @Override + @Nullable public InputSource getExternalSubset(String name, String baseURI) { return name.equalsIgnoreCase("html") ? newHTML5DoctypeSource() : null; } @@ -164,7 +166,8 @@ public static FSEntityResolver instance() { public Map getEntities() { return new HashMap<>(entities); } - + + @Nullable public String getEntity(String url) { return entities.get(url); } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/ImageResource.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/ImageResource.java index 414cdfcaa..7c3f3f0ff 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/ImageResource.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/ImageResource.java @@ -19,20 +19,19 @@ */ package org.xhtmlrenderer.resource; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.extend.FSImage; import org.xhtmlrenderer.swing.AWTFSImage; import org.xhtmlrenderer.swing.MutableFSImage; import org.xml.sax.InputSource; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; - /** * @author Administrator */ -@ParametersAreNonnullByDefault public class ImageResource extends AbstractResource { + @Nullable private final String _imageUri; + @Nullable private final FSImage _img; //HACK: at least for now, till we know what we want to do here @@ -42,6 +41,7 @@ public ImageResource(@Nullable final String uri, @Nullable FSImage img) { _img = img; } + @Nullable public FSImage getImage() { return _img; } @@ -50,6 +50,7 @@ public boolean isLoaded() { return !(_img instanceof MutableFSImage) || ((MutableFSImage) _img).isLoaded(); } + @Nullable public String getImageUri() { return _imageUri; } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/Resource.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/Resource.java index 20c13abf1..0e7416b53 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/Resource.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/Resource.java @@ -19,17 +19,13 @@ */ package org.xhtmlrenderer.resource; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.xml.sax.InputSource; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; - /** - * * @author Patrick Wright */ -@ParametersAreNonnullByDefault public interface Resource { @Nullable @CheckReturnValue diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/XMLResource.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/XMLResource.java index 03ed64182..e4b343b25 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/XMLResource.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/XMLResource.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.resource; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Document; import org.xhtmlrenderer.util.Configuration; import org.xhtmlrenderer.util.XRLog; @@ -35,8 +36,6 @@ import org.xml.sax.helpers.XMLFilterImpl; import org.xml.sax.helpers.XMLReaderFactory; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import javax.xml.XMLConstants; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; @@ -61,7 +60,6 @@ /** * @author Patrick Wright */ -@ParametersAreNonnullByDefault public class XMLResource extends AbstractResource { private Document document; private static final XMLResourceBuilder XML_RESOURCE_BUILDER; @@ -358,6 +356,7 @@ public void ignorableWhitespace(char[] ch, int start, int length) throws SAXExce } @Override + @Nullable public InputSource getExternalSubset(String name, String baseURI) throws SAXException, IOException { EntityResolver resolver = getEntityResolver(); if (resolver instanceof EntityResolver2) { diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/package-info.java new file mode 100644 index 000000000..eac95823b --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/resource/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.resource; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/NoNamespaceHandler.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/NoNamespaceHandler.java index 9216f8e22..ca56468fe 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/NoNamespaceHandler.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/NoNamespaceHandler.java @@ -21,6 +21,8 @@ package org.xhtmlrenderer.simple; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -33,10 +35,6 @@ import org.xhtmlrenderer.css.sheet.StylesheetInfo; import org.xhtmlrenderer.extend.NamespaceHandler; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; @@ -47,27 +45,23 @@ * * @author Torbjoern Gannholm */ -@ParametersAreNonnullByDefault public class NoNamespaceHandler implements NamespaceHandler { private static final String _namespace = "http://www.w3.org/XML/1998/namespace"; @Override - @Nonnull @CheckReturnValue public String getNamespace() { return _namespace; } @Override - @Nonnull @CheckReturnValue public String getAttributeValue(Element e, String attrName) { return e.getAttribute(attrName); } @Override - @Nonnull @CheckReturnValue public String getAttributeValue(Element e, @Nullable String namespaceURI, String attrName) { if (namespaceURI == TreeResolver.NO_NAMESPACE) { @@ -107,7 +101,6 @@ public String getID(Element e) { } @Override - @Nonnull @CheckReturnValue public String getLang(Element e) { return e.getAttribute("lang"); @@ -174,7 +167,6 @@ public boolean isFormElement(Element e) { private static final Pattern _mediaPattern = Pattern.compile("media\\s?=\\s?"); @Override - @Nonnull @CheckReturnValue public List getStylesheets(Document doc) { List list = new ArrayList<>(); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/XHTMLPanel.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/XHTMLPanel.java index 2b180c2fb..d20407129 100755 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/XHTMLPanel.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/XHTMLPanel.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.simple; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Document; import org.xhtmlrenderer.extend.UserAgentCallback; import org.xhtmlrenderer.layout.SharedContext; @@ -30,8 +31,6 @@ import org.xhtmlrenderer.swing.LinkListener; import org.xhtmlrenderer.util.Configuration; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.io.File; import java.io.InputStream; import java.net.MalformedURLException; @@ -43,15 +42,15 @@ * Java program. It is scrolling aware so you can safely drop it into a * {@link javax.swing.JScrollPane}. The most common usage is to stuff a {@link URL} * into it and then add it to your JFrame. Ex:

- * + * *
{@code
  * import org.xhtmlrenderer.simple.*;
- * 
+ *
  * public static void main(String[] args) {
- * 
+ *
  * // set up the xhtml panel XHTMLPanel xhtml = new XHTMLPanel();
  * xhtml.setDocument(new URL("http://myserver.com/page.xhtml"));
- * 
+ *
  * JScrollPane scroll = new JScrollPane(xhtml);
  * JFrame frame = new JFrame("Demo");
  * frame.getContentPane().add(scroll);
@@ -70,7 +69,7 @@
  * documents from a uri ({@link #setDocument(String uri)}),
  * from a Document instance ({@link #setDocument(Document)}) or from an InputStream
  * ({@link org.xhtmlrenderer.swing.BasicPanel#setDocument(java.io.InputStream,String)}).

- * + * *

* XHTMLPanel also lets you make simple changes with simple methods like * {@link #setFontScalingFactor(float)}. If you want to make other changes you will @@ -97,7 +96,6 @@ * @see The Flying Saucer Home Page * @see RenderingContext */ -@ParametersAreNonnullByDefault public class XHTMLPanel extends BasicPanel { private static final long serialVersionUID = 1L; diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/DefaultFormSubmissionListener.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/DefaultFormSubmissionListener.java index 25a474c52..66f37fff1 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/DefaultFormSubmissionListener.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/DefaultFormSubmissionListener.java @@ -19,12 +19,9 @@ */ package org.xhtmlrenderer.simple.extend; -import javax.annotation.ParametersAreNonnullByDefault; - /** * No-op implementation of a FormSubmissionListener; override the submit method in a subclass as needed. */ -@ParametersAreNonnullByDefault public class DefaultFormSubmissionListener implements FormSubmissionListener { public void submit(String query) { } } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/FormSubmissionListener.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/FormSubmissionListener.java index 6d0496abd..56b500f93 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/FormSubmissionListener.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/FormSubmissionListener.java @@ -20,7 +20,6 @@ package org.xhtmlrenderer.simple.extend; -import javax.annotation.ParametersAreNonnullByDefault; /** * FormSubmissionListener is used to receive callbacks when an XhtmlForm has its submit action called. The entire @@ -30,7 +29,6 @@ * * @author Christophe Marchand */ -@ParametersAreNonnullByDefault public interface FormSubmissionListener { /** * Called by XhtmlForm when a form is submitted. diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/NoReplacedElementFactory.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/NoReplacedElementFactory.java index 8b06a2803..bab1bb28d 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/NoReplacedElementFactory.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/NoReplacedElementFactory.java @@ -1,5 +1,6 @@ package org.xhtmlrenderer.simple.extend; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.xhtmlrenderer.extend.ReplacedElement; import org.xhtmlrenderer.extend.ReplacedElementFactory; @@ -7,10 +8,6 @@ import org.xhtmlrenderer.layout.LayoutContext; import org.xhtmlrenderer.render.BlockBox; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault public class NoReplacedElementFactory implements ReplacedElementFactory { @Nullable diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/XhtmlCssOnlyNamespaceHandler.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/XhtmlCssOnlyNamespaceHandler.java index 819c8a7a1..1a5359344 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/XhtmlCssOnlyNamespaceHandler.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/XhtmlCssOnlyNamespaceHandler.java @@ -18,6 +18,8 @@ */ package org.xhtmlrenderer.simple.extend; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.w3c.dom.CharacterData; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -30,10 +32,6 @@ import org.xhtmlrenderer.util.Configuration; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -48,10 +46,10 @@ * Handles xhtml but only css styling is honored, * no presentational html attributes (see css 2.1 spec, 6.4.4) */ -@ParametersAreNonnullByDefault public class XhtmlCssOnlyNamespaceHandler extends NoNamespaceHandler { private static final String _namespace = "http://www.w3.org/1999/xhtml"; + @Nullable private static volatile StylesheetInfo _defaultStylesheet; private static boolean _defaultStylesheetError; @@ -61,7 +59,6 @@ public class XhtmlCssOnlyNamespaceHandler extends NoNamespaceHandler { * @return The namespace value */ @Override - @Nonnull @CheckReturnValue public String getNamespace() { return _namespace; @@ -71,7 +68,6 @@ public String getNamespace() { * Gets the class attribute of the XhtmlNamespaceHandler object */ @Override - @Nonnull @CheckReturnValue public String getClass(Element e) { return e.getAttribute("class"); @@ -117,7 +113,6 @@ protected String getAttribute(Element e, String attrName) { * @return The elementStyling value */ @Override - @Nonnull @CheckReturnValue public String getElementStyling(Element e) { StringBuilder style = new StringBuilder(); @@ -225,7 +220,6 @@ private static String collapseWhiteSpace(String text) { * @return The document's title, or "" if none found */ @Override - @Nonnull @CheckReturnValue public String getDocumentTitle(Document doc) { String title = ""; @@ -242,6 +236,7 @@ public String getDocumentTitle(Document doc) { return title; } + @Nullable private Element findFirstChild(Element parent, String targetName) { NodeList children = parent.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { @@ -254,6 +249,7 @@ private Element findFirstChild(Element parent, String targetName) { return null; } + @Nullable protected StylesheetInfo readStyleElement(Element style) { String media = style.getAttribute("media"); if (media.isEmpty()) { @@ -283,6 +279,7 @@ protected StylesheetInfo readStyleElement(Element style) { } } + @Nullable protected StylesheetInfo readLinkElement(Element link) { String rel = link.getAttribute("rel").toLowerCase(); if (rel.contains("alternate")) { @@ -323,7 +320,6 @@ protected StylesheetInfo readLinkElement(Element link) { * Gets the stylesheetLinks attribute of the XhtmlNamespaceHandler object */ @Override - @Nonnull @CheckReturnValue public List getStylesheets(Document doc) { //get the processing-instructions (actually for XmlDocuments) @@ -400,6 +396,7 @@ public StylesheetInfo getDefaultStylesheet(StylesheetFactory factory) { } } + @Nullable private InputStream getDefaultStylesheetStream() { String defaultStyleSheet = Configuration.valueFor("xr.css.user-agent-default-css") + "XhtmlNamespaceHandler.css"; InputStream stream = getClass().getResourceAsStream(defaultStyleSheet); @@ -444,7 +441,6 @@ private Map getMetaInfo(Document doc) { } @Override - @Nonnull @CheckReturnValue public String getLang(@Nullable Element e) { if (e == null) { diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/XhtmlForm.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/XhtmlForm.java index 22291b794..5ca875ecd 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/XhtmlForm.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/XhtmlForm.java @@ -20,6 +20,7 @@ */ package org.xhtmlrenderer.simple.extend; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.Text; @@ -50,10 +51,11 @@ public class XhtmlForm { private final UserAgentCallback _userAgentCallback; private final Map _componentCache = new LinkedHashMap<>(); private final Map _buttonGroups = new HashMap<>(); + @Nullable private final Element _parentFormElement; private final FormSubmissionListener _formSubmissionListener; - public XhtmlForm(UserAgentCallback uac, Element e, FormSubmissionListener fsListener) { + public XhtmlForm(UserAgentCallback uac, @Nullable Element e, FormSubmissionListener fsListener) { _userAgentCallback = uac; _parentFormElement = e; _formSubmissionListener = fsListener; @@ -67,7 +69,7 @@ public UserAgentCallback getUserAgentCallback() { return _userAgentCallback; } - public void addButtonToGroup(String groupName, AbstractButton button) { + public void addButtonToGroup(@Nullable String groupName, AbstractButton button) { if (groupName == null) { groupName = createNewDefaultGroupName(); } @@ -87,6 +89,7 @@ private static boolean isFormField(Element e) { return nodeName.equals("input") || nodeName.equals("select") || nodeName.equals("textarea"); } + @Nullable public FormField addComponent(Element e, LayoutContext context, BlockBox box) { if (_componentCache.containsKey(e)) { @@ -128,7 +131,7 @@ public void submit(JComponent source) { StringBuilder data = new StringBuilder(); String action = _parentFormElement.getAttribute("action"); data.append(action).append("?"); - + AtomicBoolean first = new AtomicBoolean(true); for (Map.Entry entry : _componentCache.entrySet()) { FormField field = entry.getValue(); @@ -145,7 +148,7 @@ public void submit(JComponent source) { } } - if(_formSubmissionListener !=null) _formSubmissionListener.submit(data.toString()); + _formSubmissionListener.submit(data.toString()); } public static String collectText(Element e) { @@ -168,7 +171,7 @@ private static class ButtonGroupWrapper { private final AbstractButton _dummy = new JRadioButton(); private ButtonGroupWrapper() { - // We need a dummy button to have the appearance of all + // We need a dummy button to have the appearance of all // the radio buttons being in an unselected state. // // From: diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/XhtmlNamespaceHandler.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/XhtmlNamespaceHandler.java index 6015bb39d..8c6602974 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/XhtmlNamespaceHandler.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/XhtmlNamespaceHandler.java @@ -18,14 +18,11 @@ */ package org.xhtmlrenderer.simple.extend; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.w3c.dom.Node; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; - /** * Handles xhtml documents, including presentational html attributes (see css 2.1 spec, 6.4.4). @@ -34,7 +31,6 @@ * * @author Torbjoern Gannholm */ -@ParametersAreNonnullByDefault public class XhtmlNamespaceHandler extends XhtmlCssOnlyNamespaceHandler { @Override @CheckReturnValue @@ -56,7 +52,6 @@ public String getImageSourceURI(Element e) { } @Override - @Nonnull @CheckReturnValue public String getNonCssStyling(Element e) { return switch (e.getNodeName()) { @@ -242,6 +237,7 @@ private boolean looksLikeAMangledColor(String s) { return true; } + @Nullable private Element findTable(Element cell) { Node n = cell.getParentNode(); Element next; diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/form/FormFieldFactory.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/form/FormFieldFactory.java index 5315d3bf9..b76f6f5dc 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/form/FormFieldFactory.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/form/FormFieldFactory.java @@ -19,19 +19,19 @@ */ package org.xhtmlrenderer.simple.extend.form; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.xhtmlrenderer.layout.LayoutContext; import org.xhtmlrenderer.render.BlockBox; import org.xhtmlrenderer.simple.extend.XhtmlForm; -import javax.annotation.Nullable; - import static java.util.Objects.requireNonNull; public class FormFieldFactory { private FormFieldFactory() { } + @Nullable public static FormField create(XhtmlForm form, LayoutContext context, BlockBox box) { Element e = requireNonNull(box.getElement()); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/form/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/form/package-info.java new file mode 100644 index 000000000..567422880 --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/form/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.simple.extend.form; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/package-info.java new file mode 100644 index 000000000..dd15e6965 --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/extend/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.simple.extend; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/package-info.java index 53518eede..f8570a4ce 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/package-info.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/package-info.java @@ -26,4 +26,7 @@ * * */ -package org.xhtmlrenderer.simple; \ No newline at end of file +@NullMarked +package org.xhtmlrenderer.simple; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/XhtmlForm.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/XhtmlForm.java index 0339350c2..3cdf627bc 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/XhtmlForm.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/XhtmlForm.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.simple.xhtml; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.xhtmlrenderer.simple.extend.URLUTF8Encoder; import org.xhtmlrenderer.simple.xhtml.controls.ButtonControl; @@ -51,6 +52,7 @@ public void removeFormListener(FormListener listener) { _listeners.remove(listener); } + @Nullable public FormControl getControl(String name) { for (FormControl control : _controls) { if (control.getName().equals(name)) { @@ -74,10 +76,12 @@ public Iterable controls() { return _controls; } + @Nullable public FormControl createControl(Element e) { return createControl(this, e); } + @Nullable public static FormControl createControl(XhtmlForm form, Element e) { if (e == null) return null; diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/XhtmlNamespaceHandler.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/XhtmlNamespaceHandler.java index 9860bf6fc..ed527d159 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/XhtmlNamespaceHandler.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/XhtmlNamespaceHandler.java @@ -18,15 +18,12 @@ */ package org.xhtmlrenderer.simple.xhtml; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xhtmlrenderer.simple.extend.XhtmlCssOnlyNamespaceHandler; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; - /** * Handles xhtml documents, including presentational html attributes (see css 2.1 spec, 6.4.4). @@ -35,7 +32,6 @@ * * @author Torbjoern Gannholm */ -@ParametersAreNonnullByDefault public class XhtmlNamespaceHandler extends XhtmlCssOnlyNamespaceHandler { @Override @CheckReturnValue @@ -57,7 +53,6 @@ public String getImageSourceURI(Element e) { } @Override - @Nonnull @CheckReturnValue public String getNonCssStyling(Element e) { return switch (e.getNodeName()) { @@ -224,6 +219,7 @@ private boolean looksLikeAMangledColor(String s) { return true; } + @Nullable private Element findTable(Element cell) { Node n = cell.getParentNode(); Element next; @@ -254,6 +250,7 @@ private Element findTable(Element cell) { return null; } + @Nullable public XhtmlForm createForm(Element e) { if(e == null) { return new XhtmlForm("", "get"); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/controls/SelectControl.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/controls/SelectControl.java index 694752790..deffb2a50 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/controls/SelectControl.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/controls/SelectControl.java @@ -19,12 +19,12 @@ */ package org.xhtmlrenderer.simple.xhtml.controls; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xhtmlrenderer.simple.xhtml.XhtmlForm; -import javax.annotation.Nullable; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/controls/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/controls/package-info.java new file mode 100644 index 000000000..ee917c5fe --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/controls/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.simple.xhtml.controls; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/package-info.java new file mode 100644 index 000000000..b163af365 --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/simple/xhtml/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.simple.xhtml; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/AWTFontResolver.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/AWTFontResolver.java index 9f9576c81..ee04bf895 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/AWTFontResolver.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/AWTFontResolver.java @@ -19,6 +19,8 @@ */ package org.xhtmlrenderer.swing; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.css.constants.IdentValue; import org.xhtmlrenderer.css.value.FontSpecification; import org.xhtmlrenderer.extend.FontResolver; @@ -43,10 +45,11 @@ public class AWTFontResolver implements FontResolver { private final Map available_fonts_hash = new HashMap<>(); public AWTFontResolver() { - init(); + flushCache(); } - private void init() { + @Override + public final void flushCache() { instance_hash.clear(); availableFontNames.clear(); @@ -57,19 +60,15 @@ private void init() { availableFontNames.addAll(asList(gfx.getAvailableFontFamilyNames())); available_fonts_hash.clear(); - + // preload sans, serif, and monospace into the available font hash available_fonts_hash.put("Serif", new Font("Serif", Font.PLAIN, 1)); available_fonts_hash.put("SansSerif", new Font("SansSerif", Font.PLAIN, 1)); available_fonts_hash.put("Monospaced", new Font("Monospaced", Font.PLAIN, 1)); } - @Override - public void flushCache() { - init(); - } - - public FSFont resolveFont(SharedContext ctx, String[] families, float size, IdentValue weight, IdentValue style, IdentValue variant) { + @CheckReturnValue + public FSFont resolveFont(SharedContext ctx, String @Nullable [] families, float size, IdentValue weight, IdentValue style, IdentValue variant) { if (families != null) { for (String family : families) { Font font = resolveFont(ctx, family, size, weight, style, variant); @@ -100,7 +99,10 @@ public void setFontMapping(String name, Font font) { available_fonts_hash.put(name, font.deriveFont(1.0f)); } - protected static Font createFont(SharedContext ctx, Font root_font, float size, IdentValue weight, IdentValue style, IdentValue variant) { + protected static Font createFont(SharedContext ctx, Font root_font, float size, + @Nullable IdentValue weight, + @Nullable IdentValue style, + @Nullable IdentValue variant) { int font_const = Font.PLAIN; if (weight != null && (weight == IdentValue.BOLD || @@ -127,6 +129,7 @@ protected static Font createFont(SharedContext ctx, Font root_font, float size, return fnt; } + @Nullable protected Font resolveFont(SharedContext ctx, String font, float size, IdentValue weight, IdentValue style, IdentValue variant) { // strip off the "s if they are there if (font.startsWith("\"")) { @@ -182,6 +185,8 @@ protected static String getFontInstanceHashName(SharedContext ctx, String name, return name + "-" + (size * ctx.getTextRenderer().getFontScale()) + "-" + weight + "-" + style + "-" + variant; } + @Nullable + @CheckReturnValue @Override public FSFont resolveFont(SharedContext renderingContext, FontSpecification spec) { return resolveFont(renderingContext, spec.families, spec.size, spec.fontWeight, spec.fontStyle, spec.variant); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/BasicPanel.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/BasicPanel.java index 601d9cb4b..90c318bd3 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/BasicPanel.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/BasicPanel.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.swing; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Document; import org.xhtmlrenderer.css.style.CalculatedStyle; import org.xhtmlrenderer.css.style.derived.RectPropertySet; @@ -37,8 +38,6 @@ import org.xhtmlrenderer.util.XRLog; import org.xml.sax.InputSource; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import javax.swing.*; import java.awt.*; import java.awt.print.PrinterGraphics; @@ -57,7 +56,6 @@ * * @author Joshua Marinacci */ -@ParametersAreNonnullByDefault public abstract class BasicPanel extends RootPanel implements FormSubmissionListener { private static final int PAGE_PAINTING_CLEARANCE_WIDTH = 10; private static final int PAGE_PAINTING_CLEARANCE_HEIGHT = 10; diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/DelegatingUserAgent.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/DelegatingUserAgent.java index 3ab3eebad..899af0082 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/DelegatingUserAgent.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/DelegatingUserAgent.java @@ -19,6 +19,8 @@ */ package org.xhtmlrenderer.swing; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.event.DocumentListener; import org.xhtmlrenderer.extend.UserAgentCallback; import org.xhtmlrenderer.resource.CSSResource; @@ -27,9 +29,6 @@ import org.xhtmlrenderer.util.IOUtil; import org.xhtmlrenderer.util.StreamResource; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; @@ -52,12 +51,11 @@ * * @author Torbjoern Gannholm */ -@ParametersAreNonnullByDefault public class DelegatingUserAgent implements UserAgentCallback, DocumentListener { private final UriResolver _uriResolver; + @Nullable private ImageResourceLoader _imageResourceLoader; - /** * Creates a new instance of NaiveUserAgent with a max image cache of 16 images. */ @@ -65,6 +63,15 @@ public DelegatingUserAgent() { this._uriResolver = new UriResolver(); } + public DelegatingUserAgent(ImageResourceLoader imageResourceLoader) { + _imageResourceLoader = imageResourceLoader; + this._uriResolver = new UriResolver(); + } + + /** + * @deprecated Pass loader right to the constructor (instead of using setter) + */ + @Deprecated public void setImageResourceLoader(ImageResourceLoader loader) { _imageResourceLoader = loader; } @@ -123,6 +130,7 @@ public ImageResource getImageResource(String uri) { * @param uri Location of the XML source. * @return An XMLResource containing the image. */ + @Nullable public XMLResource getXMLResource(String uri) { String ruri = _uriResolver.resolve(uri); try (StreamResource sr = new StreamResource(ruri)) { @@ -134,9 +142,8 @@ public XMLResource getXMLResource(String uri) { } } - @Nullable @CheckReturnValue - public byte[] getBinaryResource(String uri) { + public byte @Nullable [] getBinaryResource(String uri) { String ruri = _uriResolver.resolve(uri); try (StreamResource sr = new StreamResource(ruri)) { sr.connect(); @@ -153,7 +160,7 @@ public byte[] getBinaryResource(String uri) { * @param uri A URI which might have been visited. * @return Always false; visits are not tracked in the NaiveUserAgent. */ - public boolean isVisited(String uri) { + public boolean isVisited(@Nullable String uri) { return false; } @@ -162,7 +169,7 @@ public boolean isVisited(String uri) { * * @param uri A URI which anchors other, possibly relative URIs. */ - public void setBaseURL(String uri) { + public void setBaseURL(@Nullable String uri) { _uriResolver.setBaseUri(uri); } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/ImageLoadWorker.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/ImageLoadWorker.java index 3b328720b..6da2e375b 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/ImageLoadWorker.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/ImageLoadWorker.java @@ -26,6 +26,7 @@ import java.awt.*; import java.awt.image.BufferedImage; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; @@ -37,14 +38,14 @@ * will be returned instead and the problem will be logged. */ class ImageLoadWorker extends Thread { - private static volatile int counter = 0; + private static final AtomicInteger counter = new AtomicInteger(0); private final ImageLoadQueue queue; public ImageLoadWorker(ImageLoadQueue queue) { this.queue = queue; setDaemon(true); setPriority(Thread.MIN_PRIORITY); - setName("ImageLoadWorker(" + counter++ + ")"); + setName("ImageLoadWorker(" + counter.incrementAndGet() + ")"); } public void run() { diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/ImageResourceLoader.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/ImageResourceLoader.java index 5a4041bcf..f29a5fd38 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/ImageResourceLoader.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/ImageResourceLoader.java @@ -1,5 +1,6 @@ package org.xhtmlrenderer.swing; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.extend.FSImage; import org.xhtmlrenderer.resource.ImageResource; import org.xhtmlrenderer.util.Configuration; @@ -21,20 +22,21 @@ public class ImageResourceLoader { public static final RepaintListener NO_OP_REPAINT_LISTENER = doLayout -> XRLog.general(Level.FINE, "No-op repaint requested"); private final Map _imageCache; + @Nullable private final ImageLoadQueue _loadQueue; - private final int _imageCacheCapacity; - - private RepaintListener _repaintListener = NO_OP_REPAINT_LISTENER; - + private final RepaintListener _repaintListener; private final boolean _useBackgroundImageLoading; public ImageResourceLoader() { - // FIXME - this(16); + this(16, NO_OP_REPAINT_LISTENER); } - public ImageResourceLoader(int cacheSize) { + public ImageResourceLoader(RepaintListener repaintListener) { + this(16, repaintListener); + } + + public ImageResourceLoader(int cacheSize, RepaintListener repaintListener) { this._imageCacheCapacity = cacheSize; this._useBackgroundImageLoading = Configuration.isTrue("xr.image.background.loading.enable", false); @@ -51,6 +53,7 @@ public ImageResourceLoader(int cacheSize) { // note we do *not* override removeEldestEntry() here--users of this class must call shrinkImageCache(). // that's because we don't know when is a good time to flush the cache this._imageCache = new LinkedHashMap<>(cacheSize, 0.75f, true); + this._repaintListener = repaintListener; } public static ImageResource loadImageResourceFromUri(final String uri) { @@ -176,7 +179,7 @@ public synchronized void loaded(final ImageResource ir, final int width, final i } } - public static ImageResource createImageResource(final String uri, final BufferedImage img) { + public static ImageResource createImageResource(final String uri, @Nullable final BufferedImage img) { if (img == null) { return new ImageResource(uri, AWTFSImage.createImage(ImageUtil.createTransparentImage(10, 10))); } else { @@ -184,10 +187,6 @@ public static ImageResource createImageResource(final String uri, final Buffered } } - public void setRepaintListener(final RepaintListener repaintListener) { - _repaintListener = repaintListener; - } - public void stopLoading() { if (_loadQueue != null) { XRLog.load("By request, clearing pending items from load queue: " + _loadQueue.size()); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/Java2DTextRenderer.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/Java2DTextRenderer.java index a4ba08993..b2575e5de 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/Java2DTextRenderer.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/Java2DTextRenderer.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.swing; +import com.google.errorprone.annotations.CheckReturnValue; import org.xhtmlrenderer.extend.FSGlyphVector; import org.xhtmlrenderer.extend.FontContext; import org.xhtmlrenderer.extend.OutputDevice; @@ -29,7 +30,6 @@ import org.xhtmlrenderer.render.LineMetricsAdapter; import org.xhtmlrenderer.util.Configuration; -import javax.annotation.Nonnull; import java.awt.*; import java.awt.font.GlyphVector; import java.awt.geom.Point2D; @@ -76,7 +76,7 @@ public Java2DTextRenderer() { } } - @Nonnull + @CheckReturnValue @SuppressWarnings("unchecked") private static Map getFontDesktopHints() { Toolkit tk = Toolkit.getDefaultToolkit(); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/NaiveUserAgent.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/NaiveUserAgent.java index 40e3d529e..3735a6fb7 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/NaiveUserAgent.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/NaiveUserAgent.java @@ -19,6 +19,8 @@ */ package org.xhtmlrenderer.swing; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.event.DocumentListener; import org.xhtmlrenderer.extend.UserAgentCallback; import org.xhtmlrenderer.resource.CSSResource; @@ -29,9 +31,6 @@ import org.xhtmlrenderer.util.ImageUtil; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; @@ -66,7 +65,6 @@ * * @author Torbjoern Gannholm */ -@ParametersAreNonnullByDefault public class NaiveUserAgent implements UserAgentCallback, DocumentListener { private static final int DEFAULT_IMAGE_CACHE_SIZE = 16; @@ -121,7 +119,8 @@ public void clearImageCache() { * Gets a Reader for the resource identified */ //TOdO:implement this with nio. - protected InputStream resolveAndOpenStream(final String uri) { + @Nullable + protected InputStream resolveAndOpenStream(@Nullable String uri) { java.io.InputStream is = null; String resolvedUri = resolveURI(uri); try { diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/RootPanel.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/RootPanel.java index 0bc9d74c5..fcf2b6db7 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/RootPanel.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/RootPanel.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.swing; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.css.CSSPrimitiveValue; @@ -46,8 +47,6 @@ import org.xhtmlrenderer.util.Configuration; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; @@ -57,20 +56,23 @@ import static java.util.Objects.requireNonNull; -@ParametersAreNonnullByDefault public class RootPanel extends JPanel implements Scrollable, UserInterface, FSCanvas, RepaintListener { + @Nullable private Box rootBox; private boolean needRelayout; + @Nullable private CellRendererPane cellRendererPane; private final Set documentListeners = new HashSet<>(); private boolean defaultFontFromComponent; protected SharedContext sharedContext; private volatile LayoutContext layoutContext; + @Nullable private JScrollPane enclosingScrollPane; private boolean viewportMatchWidth = true; private int default_scroll_mode = JViewport.BLIT_SCROLL_MODE; + @Nullable protected Document doc; /* @@ -166,6 +168,7 @@ protected void setEnclosingScrollPane(@Nullable JScrollPane scrollPane) { } } + @Nullable protected JScrollPane getEnclosingScrollPane() { return enclosingScrollPane; } @@ -390,8 +393,7 @@ private void initFontFromComponent(BlockBox root) { if (isDefaultFontFromComponent()) { CalculatedStyle style = root.getStyle(); PropertyValue fontFamilyProp = new PropertyValue(CSSPrimitiveValue.CSS_STRING, getFont().getFamily(), - getFont().getFamily()); - fontFamilyProp.setStringArrayValue(new String[] { fontFamilyProp.getStringValue() }); + getFont().getFamily(), new String[]{getFont().getFamily()}, null); style.setDefaultValue(CSSName.FONT_FAMILY, new StringValue(CSSName.FONT_FAMILY, fontFamilyProp)); style.setDefaultValue(CSSName.FONT_SIZE, new LengthValue(style, CSSName.FONT_SIZE, new PropertyValue(CSSPrimitiveValue.CSS_PX, getFont().getSize(), Integer @@ -523,6 +525,7 @@ public boolean isPrintView() { return false; } + @Nullable public synchronized Box getRootBox() { return rootBox; } @@ -531,6 +534,7 @@ public synchronized void setRootBox(@Nullable Box rootBox) { this.rootBox = rootBox; } + @Nullable public synchronized Layer getRootLayer() { return getRootBox() == null ? null : getRootBox().getLayer(); } @@ -539,6 +543,7 @@ public Box find(MouseEvent e) { return find(e.getX(), e.getY()); } + @Nullable public Box find(int x, int y) { Layer l = getRootLayer(); if (l != null) { diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/ScalableXHTMLPanel.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/ScalableXHTMLPanel.java index 8413ab632..4d82600b3 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/ScalableXHTMLPanel.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/ScalableXHTMLPanel.java @@ -20,6 +20,7 @@ package org.xhtmlrenderer.swing; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Document; import org.xhtmlrenderer.extend.UserAgentCallback; import org.xhtmlrenderer.layout.Layer; @@ -28,8 +29,6 @@ import org.xhtmlrenderer.render.RenderingContext; import org.xhtmlrenderer.simple.XHTMLPanel; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.print.PrinterGraphics; @@ -41,7 +40,6 @@ * * @author chm */ -@ParametersAreNonnullByDefault public class ScalableXHTMLPanel extends XHTMLPanel { public static final int SCALE_POLICY_NONE = 0; @@ -57,7 +55,8 @@ public class ScalableXHTMLPanel extends XHTMLPanel { /** * The lastly calculated layout size */ - private Dimension lastLayoutSize = null; + @Nullable + private Dimension lastLayoutSize; /** * Instantiates an XHTMLPanel with no {@link Document} loaded by default. @@ -114,6 +113,7 @@ private void resetScaleAccordingToPolicy() { * @param y the displayed y position */ @Override + @Nullable public Box find(int x, int y) { Point p = convertFromScaled(x, y); Layer l = getRootLayer(); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/SelectionHighlighter.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/SelectionHighlighter.java index a24b5e64f..ee323140f 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/SelectionHighlighter.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/SelectionHighlighter.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.swing; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -38,8 +39,6 @@ import org.xhtmlrenderer.util.Util; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.Nonnull; -import javax.annotation.ParametersAreNonnullByDefault; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -84,7 +83,6 @@ * * @author Nick Reddel */ -@ParametersAreNonnullByDefault public class SelectionHighlighter implements MouseMotionListener, MouseListener { private static final String PARA_EQUIV = "&! { @@ -559,6 +556,7 @@ List getInlineLayoutBoxes(Box b) { return inlineLayoutBoxes; } + @Nullable ViewModelInfo infoFromPoint(MouseEvent e) { checkDocument(); Range r = docRange.createRange(); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/SwingReplacedElementFactory.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/SwingReplacedElementFactory.java index 3f6fcd1b0..b855a269f 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/SwingReplacedElementFactory.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/SwingReplacedElementFactory.java @@ -19,6 +19,8 @@ */ package org.xhtmlrenderer.swing; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Element; @@ -36,10 +38,6 @@ import org.xhtmlrenderer.util.ImageUtil; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; @@ -53,7 +51,6 @@ /** * A ReplacedElementFactory where Elements are replaced by Swing components. */ -@ParametersAreNonnullByDefault public class SwingReplacedElementFactory implements ReplacedElementFactory { private static final Logger log = LoggerFactory.getLogger(SwingReplacedElementFactory.class); @@ -188,7 +185,6 @@ private ReplacedElement lookupImageReplacedElement(Element elem, String ruri, in * @param cssHeight Target height for the element * @return A ReplacedElement to substitute for one that can't be generated. */ - @Nonnull @CheckReturnValue protected ReplacedElement newIrreplaceableImageElement(int cssWidth, int cssHeight) { try { diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/UriResolver.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/UriResolver.java index 710c525d6..8e72b00cc 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/UriResolver.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/UriResolver.java @@ -1,18 +1,16 @@ package org.xhtmlrenderer.swing; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.logging.Level; -@ParametersAreNonnullByDefault public class UriResolver { + @Nullable private String _baseUri; @Nullable @@ -22,7 +20,6 @@ public String resolve(@Nullable final String uri) { return resolveUri(uri); } - @Nonnull @CheckReturnValue public String resolveUri(final String uri) { if (_baseUri == null) {//first try to set a base URL @@ -53,12 +50,12 @@ public String resolveUri(final String uri) { } } - public void setBaseUri(final String baseUri) { + public void setBaseUri(@Nullable String baseUri) { _baseUri = baseUri; } - @Nonnull @CheckReturnValue + @Nullable public String getBaseUri() { return _baseUri; } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/package-info.java new file mode 100644 index 000000000..5072944c9 --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/swing/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.swing; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/test/DelegatingReplacedElementFactory.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/test/DelegatingReplacedElementFactory.java index 4a62ac11b..ca7feb267 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/test/DelegatingReplacedElementFactory.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/test/DelegatingReplacedElementFactory.java @@ -19,6 +19,8 @@ */ package org.xhtmlrenderer.test; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.xhtmlrenderer.extend.ReplacedElement; import org.xhtmlrenderer.extend.ReplacedElementFactory; @@ -27,9 +29,6 @@ import org.xhtmlrenderer.render.BlockBox; import org.xhtmlrenderer.simple.extend.FormSubmissionListener; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -38,7 +37,6 @@ /** * @author patrick */ -@ParametersAreNonnullByDefault public class DelegatingReplacedElementFactory implements ReplacedElementFactory { private final List replacers = new ArrayList<>(); private final Map byNameReplacers = new HashMap<>(); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/test/ElementReplacer.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/test/ElementReplacer.java index 175f6d394..703a90923 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/test/ElementReplacer.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/test/ElementReplacer.java @@ -6,12 +6,10 @@ import org.xhtmlrenderer.layout.LayoutContext; import org.xhtmlrenderer.render.BlockBox; -import javax.annotation.ParametersAreNonnullByDefault; /** * @author patrick */ -@ParametersAreNonnullByDefault public abstract class ElementReplacer { public abstract boolean isElementNameMatch(); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/test/SwingImageReplacer.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/test/SwingImageReplacer.java index 6f107b1cb..930ad0635 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/test/SwingImageReplacer.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/test/SwingImageReplacer.java @@ -1,5 +1,6 @@ package org.xhtmlrenderer.test; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Element; @@ -14,7 +15,6 @@ import org.xhtmlrenderer.util.ImageUtil; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.ParametersAreNonnullByDefault; import java.awt.*; import java.awt.image.BufferedImage; import java.util.HashMap; @@ -27,7 +27,6 @@ /** * @author patrick */ -@ParametersAreNonnullByDefault public class SwingImageReplacer extends ElementReplacer { private static final Logger log = LoggerFactory.getLogger(SwingImageReplacer.class); private final Map imageComponents = new HashMap<>(); @@ -119,6 +118,7 @@ protected void storeImageReplacedElement(Element e, ReplacedElement cc) { * @param e The element by which the image is keyed * @return The ReplacedElement for the image, or null if there is none. */ + @Nullable protected ReplacedElement lookupImageReplacedElement(Element e) { return imageComponents.get(e); } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/test/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/test/package-info.java new file mode 100644 index 000000000..c593a0a23 --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/test/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.test; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/FSImageWriter.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/FSImageWriter.java index 3fb8a7efa..2b4a8c1bf 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/FSImageWriter.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/FSImageWriter.java @@ -19,7 +19,8 @@ */ package org.xhtmlrenderer.util; -import javax.annotation.Nonnull; +import org.jspecify.annotations.Nullable; + import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; @@ -61,6 +62,7 @@ public class FSImageWriter { private final String imageFormat; private final float writeCompressionQuality; private final int writeCompressionMode; + @Nullable private final String writeCompressionType; /** @@ -158,14 +160,13 @@ protected ImageWriteParam getImageWriteParameters(ImageWriter writer) { return param; } - + /** * Utility method to find an image writer. * * @param imageFormat String informal format name, "jpg" * @return ImageWriter corresponding to that format */ - @Nonnull private ImageWriter lookupImageWriterForFormat(String imageFormat) { Iterator iter = ImageIO.getImageWritersByFormatName(imageFormat); if (iter.hasNext()) { diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/FontUtil.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/FontUtil.java index 592ad2d39..a7d2c2408 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/FontUtil.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/FontUtil.java @@ -1,14 +1,13 @@ package org.xhtmlrenderer.util; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; + import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.Base64; import java.util.logging.Level; -@ParametersAreNonnullByDefault public class FontUtil { @CheckReturnValue diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/IOUtil.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/IOUtil.java index 411efc825..100492762 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/IOUtil.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/IOUtil.java @@ -1,9 +1,8 @@ package org.xhtmlrenderer.util; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; + import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; @@ -24,7 +23,6 @@ /** * @author patrick */ -@ParametersAreNonnullByDefault public class IOUtil { public static void copyFile(File page, File outputDir) throws IOException { File outputFile = new File(outputDir, page.getName()); @@ -61,6 +59,7 @@ public static void deleteAllFiles(final File dir) throws IOException { * and reading from it. will return the stream, or null if unable to open or read or a timeout occurred. Does not * buffer the stream. */ + @Nullable public static InputStream openStreamAtUrl(String uri) { try { URLConnection uc = new URL(uri).openConnection(); @@ -68,7 +67,7 @@ public static InputStream openStreamAtUrl(String uri) { uc.setReadTimeout(30 * 1000); uc.setRequestProperty("Accept", "*/*"); uc.connect(); - + return uc.getInputStream(); } catch (java.net.MalformedURLException e) { XRLog.exception("bad URL given: " + uri, e); @@ -101,9 +100,8 @@ public static InputStream getInputStream(String uri) { return null; } - @Nullable @CheckReturnValue - public static byte[] readBytes(String uri) { + public static byte @Nullable [] readBytes(String uri) { try (InputStream is = getInputStream(uri)) { if (is == null) return null; return readBytes(is); @@ -113,7 +111,6 @@ public static byte[] readBytes(String uri) { } } - @Nonnull @CheckReturnValue public static byte[] readBytes(Path file) throws IOException { try (InputStream is = newInputStream(file)) { @@ -121,7 +118,6 @@ public static byte[] readBytes(Path file) throws IOException { } } - @Nonnull @CheckReturnValue public static byte[] readBytes(InputStream is) throws IOException { ByteArrayOutputStream result = new ByteArrayOutputStream(is.available()); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/ImageUtil.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/ImageUtil.java index ef0591bd3..85bbe2ecd 100755 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/ImageUtil.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/ImageUtil.java @@ -19,10 +19,9 @@ */ package org.xhtmlrenderer.util; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; + import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; @@ -46,7 +45,6 @@ * * @author pwright */ -@ParametersAreNonnullByDefault public class ImageUtil { private static final Map qualities = Map.of( @@ -86,7 +84,6 @@ public static void withGraphics(Graphics graphics, Consumer block) { } } - @Nonnull @CheckReturnValue public static BufferedImage makeCompatible(BufferedImage image) { BufferedImage cimg; @@ -121,7 +118,6 @@ public static BufferedImage makeCompatible(BufferedImage image) { * in non-headless more. * @return A BufferedImage compatible with the screen (best fit). */ - @Nonnull @CheckReturnValue public static BufferedImage createCompatibleBufferedImage(int width, int height, int biType) { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); @@ -144,7 +140,6 @@ static int detectTransparency(int biType) { }; } - @Nonnull @CheckReturnValue private static GraphicsConfiguration getGraphicsConfiguration() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); @@ -162,7 +157,6 @@ private static GraphicsConfiguration getGraphicsConfiguration() { * @param height Target height for the image * @return A BufferedImage compatible with the screen (best fit) supporting transparent pixels. */ - @Nonnull @CheckReturnValue public static BufferedImage createCompatibleBufferedImage(int width, int height) { return createCompatibleBufferedImage(width, height, Transparency.BITMASK); @@ -184,7 +178,6 @@ public static BufferedImage createCompatibleBufferedImage(int width, int height) * @param orgImage The image to scale * @return The scaled image instance. */ - @Nonnull @CheckReturnValue public static BufferedImage getScaledInstance(ScalingOptions opt, BufferedImage orgImage) { int w = orgImage.getWidth(null); @@ -222,7 +215,6 @@ public static BufferedImage getScaledInstance(ScalingOptions opt, BufferedImage * @param targetHeight The target height in pixels * @return The scaled image instance. */ - @Nonnull @CheckReturnValue public static BufferedImage getScaledInstance(BufferedImage orgImage, int targetWidth, int targetHeight) { String downscaleQuality = Configuration.valueFor("xr.image.scale", DownscaleQuality.HIGH_QUALITY.asString()); @@ -245,7 +237,6 @@ public static BufferedImage getScaledInstance(BufferedImage orgImage, int target * {@link java.awt.image.BufferedImage#BufferedImage(int,int,int)} * @return BufferedImage with same content. */ - @Nonnull @CheckReturnValue public static BufferedImage convertToBufferedImage(Image awtImg, int type) { if (awtImg instanceof BufferedImage result) { @@ -257,7 +248,6 @@ public static BufferedImage convertToBufferedImage(Image awtImg, int type) { } } - @Nonnull @CheckReturnValue public static BufferedImage createTransparentImage(int width, int height) { BufferedImage bi = createCompatibleBufferedImage(width, height, TYPE_INT_ARGB); @@ -288,9 +278,8 @@ public static boolean isEmbeddedBase64Image(@Nullable String uri) { * @param imageDataUri URI of the embedded image * @return The binary content */ - @Nullable @CheckReturnValue - public static byte[] getEmbeddedBase64Image(String imageDataUri) { + public static byte @Nullable [] getEmbeddedBase64Image(String imageDataUri) { int b64Index = imageDataUri.indexOf("base64,"); if (b64Index != -1) { String b64encoded = imageDataUri.substring(b64Index + "base64,".length()); @@ -321,7 +310,6 @@ public static BufferedImage loadEmbeddedBase64Image(String imageDataUri) { return null; } - @ParametersAreNonnullByDefault private interface Scaler { /** * Convenience method that returns a scaled instance of the @@ -350,15 +338,12 @@ private interface Scaler { * in pixels * @return a scaled version of the original {@code BufferedImage} */ - @Nonnull @CheckReturnValue BufferedImage getScaledInstance(BufferedImage img, ScalingOptions opt); } - @ParametersAreNonnullByDefault private abstract static class AbstractFastScaler implements Scaler { @Override - @Nonnull @CheckReturnValue public BufferedImage getScaledInstance(BufferedImage img, ScalingOptions opt) { // target is always >= 1 @@ -373,7 +358,6 @@ public BufferedImage getScaledInstance(BufferedImage img, ScalingOptions opt) { /** * Old AWT-style scaling, poor quality */ - @ParametersAreNonnullByDefault private static class OldScaler extends AbstractFastScaler { @Override @CheckReturnValue @@ -385,7 +369,6 @@ protected int getImageScalingMethod() { /** * AWT-style one-step scaling, using area averaging */ - @ParametersAreNonnullByDefault private static class AreaAverageScaler extends AbstractFastScaler { @Override @CheckReturnValue @@ -397,10 +380,8 @@ protected int getImageScalingMethod() { /** * Fast but decent scaling */ - @ParametersAreNonnullByDefault private static class FastScaler implements Scaler { @Override - @Nonnull @CheckReturnValue public BufferedImage getScaledInstance(BufferedImage img, ScalingOptions opt) { // Use one-step technique: scale directly from original @@ -421,10 +402,8 @@ public BufferedImage getScaledInstance(BufferedImage img, ScalingOptions opt) { /** * Step-wise downscaling */ - @ParametersAreNonnullByDefault private static class HighQualityScaler implements Scaler { @Override - @Nonnull @CheckReturnValue public BufferedImage getScaledInstance(BufferedImage img, ScalingOptions opt) { int w, h; diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/TextUtil.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/TextUtil.java index c260dc7ab..482474b8b 100644 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/TextUtil.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/TextUtil.java @@ -1,15 +1,11 @@ package org.xhtmlrenderer.util; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.Text; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault public class TextUtil { @Nullable @CheckReturnValue @@ -18,7 +14,6 @@ public static String readTextContentOrNull(Element element) { return text.isEmpty() ? null : text; } - @Nonnull @CheckReturnValue public static String readTextContent(Element element) { StringBuilder result = new StringBuilder(); diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/Util.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/Util.java index 10ddbe3aa..1a7f77e54 100755 --- a/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/Util.java +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/Util.java @@ -19,10 +19,8 @@ */ package org.xhtmlrenderer.util; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; +import org.jspecify.annotations.Nullable; -@ParametersAreNonnullByDefault public class Util { public static String replace(String source, String target, String replacement) { StringBuilder output = new StringBuilder(); @@ -39,7 +37,7 @@ public static String replace(String source, String target, String replacement) { } return output.toString(); } - + public static boolean isNullOrEmpty(@Nullable String str) { return str == null || str.isEmpty(); } diff --git a/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/package-info.java b/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/package-info.java new file mode 100644 index 000000000..186ac239a --- /dev/null +++ b/flying-saucer-core/src/main/java/org/xhtmlrenderer/util/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.util; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-core/src/test/java/org/xhtmlrenderer/css/constants/CSSNameTest.java b/flying-saucer-core/src/test/java/org/xhtmlrenderer/css/constants/CSSNameTest.java new file mode 100644 index 000000000..a118ee4b6 --- /dev/null +++ b/flying-saucer-core/src/test/java/org/xhtmlrenderer/css/constants/CSSNameTest.java @@ -0,0 +1,16 @@ +package org.xhtmlrenderer.css.constants; + +import org.junit.jupiter.api.Test; +import org.xhtmlrenderer.css.constants.CSSName.CSSSideProperties; + +import static org.xhtmlrenderer.css.constants.CSSName.CLIP; + +class CSSNameTest { + @Test + void name() { + new CSSSideProperties(null, null, null, null); + new CSSSideProperties(CLIP, CLIP, CLIP, CLIP); + + CLIP.compareTo(CLIP); + } +} \ No newline at end of file diff --git a/flying-saucer-examples/src/main/java/BrowsePanel.java b/flying-saucer-examples/src/main/java/BrowsePanel.java index 1cf1e330b..4e73be16f 100644 --- a/flying-saucer-examples/src/main/java/BrowsePanel.java +++ b/flying-saucer-examples/src/main/java/BrowsePanel.java @@ -17,6 +17,8 @@ */ +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; @@ -30,7 +32,6 @@ import org.xhtmlrenderer.swing.SwingReplacedElementFactory; import org.xhtmlrenderer.util.GeneralUtil; -import javax.annotation.Nonnull; import javax.swing.*; import java.awt.*; import java.io.File; @@ -45,13 +46,14 @@ * * @author Patrick Wright */ +@NullMarked public class BrowsePanel { private static final Logger log = LoggerFactory.getLogger(BrowsePanel.class); - private String uri; - private XHTMLPanel panel; - private JFrame frame; - private UserAgentCallback uac; + @Nullable private String uri; + @Nullable private XHTMLPanel panel; + @Nullable private JFrame frame; + @Nullable private UserAgentCallback uac; public static void main(String[] args) { try { @@ -87,11 +89,8 @@ private void run(String[] args) { } private void setupUserAgentCallback(XHTMLPanel panel) { - uac = new DelegatingUserAgent(); - - ImageResourceLoader irl = new ImageResourceLoader(); - irl.setRepaintListener(panel); - ((DelegatingUserAgent) uac).setImageResourceLoader(irl); + ImageResourceLoader irl = new ImageResourceLoader(panel); + uac = new DelegatingUserAgent(irl); panel.getSharedContext().setUserAgentCallback(uac); panel.getSharedContext().setReplacedElementFactory(new SwingReplacedElementFactory(panel, irl)); @@ -109,12 +108,12 @@ public void documentLoaded() { frame.setTitle(panel.getDocumentTitle()); } - public void onLayoutException(@Nonnull Throwable t) { + public void onLayoutException(Throwable t) { panel.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); panel.setDocument(getErrorDocument("can't layout: " + t.getMessage()).getDocument()); } - public void onRenderException(@Nonnull Throwable t) { + public void onRenderException(Throwable t) { panel.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); panel.setDocument(getErrorDocument("can't render: " + t.getMessage()).getDocument()); } diff --git a/flying-saucer-examples/src/main/java/FontGlyphTableRender.java b/flying-saucer-examples/src/main/java/FontGlyphTableRender.java index 83432be3c..37a7abb8e 100644 --- a/flying-saucer-examples/src/main/java/FontGlyphTableRender.java +++ b/flying-saucer-examples/src/main/java/FontGlyphTableRender.java @@ -17,8 +17,11 @@ */ +import com.google.errorprone.annotations.CheckReturnValue; import com.lowagie.text.DocumentException; import com.lowagie.text.pdf.BaseFont; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; @@ -37,8 +40,6 @@ import org.xml.sax.XMLReader; import org.xml.sax.ext.DefaultHandler2; -import javax.annotation.Nonnull; -import javax.annotation.ParametersAreNonnullByDefault; import javax.swing.*; import javax.xml.parsers.ParserConfigurationException; import java.awt.*; @@ -64,10 +65,10 @@ * * @author Patrick Wright */ -@ParametersAreNonnullByDefault +@NullMarked public class FontGlyphTableRender { private static final Logger log = LoggerFactory.getLogger(FontGlyphTableRender.class); - + private static final int TO_SWING = 1; private static final int TO_PDF = 2; private static final String OUTPUT_ENTITIES = "entities"; @@ -77,6 +78,7 @@ public class FontGlyphTableRender { private int curFrom; private String outputType = OUTPUT_CODEPOINTS; + @Nullable private Font currentFont; private JFrame frame; private XHTMLPanel xpanel; @@ -207,7 +209,7 @@ public void documentLoaded() { frame.setVisible(true); } - @Nonnull + @CheckReturnValue private JButton createChooseFontButton() { JButton chooseFontFileBtn = new JButton("..."); chooseFontFileBtn.addActionListener(e -> { @@ -261,6 +263,7 @@ private void enableButtons() { nextBtn.setEnabled(outputType.equals(OUTPUT_CODEPOINTS) && Math.pow(2, 16) - curFrom != 0); } + @Nullable private Font loadFont(String fontPath) throws IOException { Font font; try { diff --git a/flying-saucer-examples/src/main/java/FontScaleJPanelRender.java b/flying-saucer-examples/src/main/java/FontScaleJPanelRender.java index 2246ec5d9..4729e8dea 100644 --- a/flying-saucer-examples/src/main/java/FontScaleJPanelRender.java +++ b/flying-saucer-examples/src/main/java/FontScaleJPanelRender.java @@ -16,11 +16,12 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.simple.FSScrollPane; import org.xhtmlrenderer.simple.XHTMLPanel; -import javax.annotation.Nonnull; -import javax.annotation.ParametersAreNonnullByDefault; import javax.swing.*; import java.awt.*; import java.io.File; @@ -35,8 +36,9 @@ * * @author Patrick Wright */ -@ParametersAreNonnullByDefault +@NullMarked public class FontScaleJPanelRender { + @Nullable private String fileName; public static void main(String[] args) { @@ -84,7 +86,7 @@ private void run(String[] args) { frame.setVisible(true); } - @Nonnull + @CheckReturnValue private static JPanel createTopPanel(XHTMLPanel panel) { JButton smaller = new JButton("F-"); smaller.addActionListener(event -> { diff --git a/flying-saucer-examples/src/main/java/ImageMapReplacedElementFactory.java b/flying-saucer-examples/src/main/java/ImageMapReplacedElementFactory.java index c8f85cdf0..692147717 100644 --- a/flying-saucer-examples/src/main/java/ImageMapReplacedElementFactory.java +++ b/flying-saucer-examples/src/main/java/ImageMapReplacedElementFactory.java @@ -18,6 +18,9 @@ * }}} */ +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; @@ -33,10 +36,6 @@ import org.xhtmlrenderer.swing.SwingReplacedElementFactory; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; @@ -58,7 +57,7 @@ * * Sample is incomplete in current state and meant as a starting point for future work. */ -@ParametersAreNonnullByDefault +@NullMarked public class ImageMapReplacedElementFactory extends SwingReplacedElementFactory { private final ImageMapListener listener; private static final String IMG_USEMAP_ATTR = "usemap"; @@ -119,7 +118,6 @@ private boolean isNotBlank(@Nullable String _v) { } // See SwingReplacedElementFactory#replaceImage - @Nonnull @CheckReturnValue protected ReplacedElement replaceImageMap(UserAgentCallback uac, LayoutContext context, Element elem, String usemapAttr, int cssWidth, int cssHeight) { ReplacedElement re; @@ -173,7 +171,7 @@ private static boolean areEqualIgnoreCase(@Nullable String str1, @Nullable Strin return (str1 == null && str2 == null) || (str1 != null && str1.equalsIgnoreCase(str2)); } - @ParametersAreNonnullByDefault + @NullMarked private static final class ImageMapReplacedElement extends SwingReplacedElement { private final Map areas; @@ -307,7 +305,6 @@ private static Shape getCoords(String[] coordValues, int length) { } } - @Nonnull @CheckReturnValue private static JComponent create(Image image, int targetWidth, int targetHeight) { final JLabel component = new JLabel(new ImageIcon(image)); diff --git a/flying-saucer-examples/src/main/java/PDFRender.java b/flying-saucer-examples/src/main/java/PDFRender.java index 31a434d56..f3adfd5cd 100644 --- a/flying-saucer-examples/src/main/java/PDFRender.java +++ b/flying-saucer-examples/src/main/java/PDFRender.java @@ -18,6 +18,8 @@ import com.lowagie.text.DocumentException; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Document; import org.xhtmlrenderer.pdf.ITextOutputDevice; import org.xhtmlrenderer.pdf.ITextRenderer; @@ -25,7 +27,6 @@ import org.xhtmlrenderer.resource.XMLResource; import org.xml.sax.InputSource; -import javax.annotation.ParametersAreNonnullByDefault; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -34,6 +35,7 @@ import static java.nio.file.Files.newOutputStream; +@NullMarked public class PDFRender { public static void main(String[] args) throws IOException, DocumentException { if (args.length != 2) { @@ -63,14 +65,15 @@ public static void createPDF(String url, String pdf) throws IOException, Documen } } - @ParametersAreNonnullByDefault + @NullMarked private static class ResourceLoaderUserAgent extends ITextUserAgent { private ResourceLoaderUserAgent(ITextOutputDevice outputDevice, int dotsPerPixel) { super(outputDevice, dotsPerPixel); } @Override - protected InputStream resolveAndOpenStream(String uri) { + @Nullable + protected InputStream resolveAndOpenStream(@Nullable String uri) { InputStream is = super.resolveAndOpenStream(uri); System.out.println("IN resolveAndOpenStream() " + uri); return is; diff --git a/flying-saucer-examples/src/main/java/Printer.java b/flying-saucer-examples/src/main/java/Printer.java index 197806b7e..6a4cb9cd7 100644 --- a/flying-saucer-examples/src/main/java/Printer.java +++ b/flying-saucer-examples/src/main/java/Printer.java @@ -23,7 +23,6 @@ import org.xhtmlrenderer.swing.Java2DRenderer; import org.xhtmlrenderer.swing.NaiveUserAgent; -import javax.annotation.ParametersAreNonnullByDefault; import javax.print.Doc; import javax.print.DocFlavor; import javax.print.DocPrintJob; @@ -53,7 +52,6 @@ /** * @author rk */ -@ParametersAreNonnullByDefault public class Printer implements Runnable, DocumentListener, Printable, PrintJobListener { private final static String template = "printingtemplate.xhtml"; diff --git a/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/aboutbox/DemoUserAgent.java b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/aboutbox/DemoUserAgent.java index 5ccd06c21..ab0fe374f 100644 --- a/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/aboutbox/DemoUserAgent.java +++ b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/aboutbox/DemoUserAgent.java @@ -19,6 +19,8 @@ */ package org.xhtmlrenderer.demo.aboutbox; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xhtmlrenderer.extend.UserAgentCallback; @@ -30,9 +32,6 @@ import org.xhtmlrenderer.util.Uu; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; @@ -49,11 +48,9 @@ import java.util.List; import java.util.Map; - -@ParametersAreNonnullByDefault public class DemoUserAgent implements UserAgentCallback { private static final Logger log = LoggerFactory.getLogger(DemoUserAgent.class); - + private String baseUrl; private int index = -1; private final List history = new ArrayList<>(); @@ -116,9 +113,8 @@ public ImageResource getImageResource(String uri) { } @Override - @Nullable @CheckReturnValue - public byte[] getBinaryResource(String uri) { + public byte @Nullable [] getBinaryResource(String uri) { return IOUtil.readBytes(uri); } @@ -163,7 +159,7 @@ public boolean isVisited(@Nullable String uri) { } @Override - public void setBaseURL(String url) { + public void setBaseURL(@Nullable String url) { baseUrl = resolveURI(url); if (baseUrl == null) baseUrl = "error:FileNotFound"; //setBaseURL is called by view when document is loaded diff --git a/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/aboutbox/package-info.java b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/aboutbox/package-info.java new file mode 100644 index 000000000..ec74b258b --- /dev/null +++ b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/aboutbox/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.demo.aboutbox; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/BrowserPanel.java b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/BrowserPanel.java index 6bf4b1c72..8fe61b6fb 100755 --- a/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/BrowserPanel.java +++ b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/BrowserPanel.java @@ -37,7 +37,6 @@ import org.xhtmlrenderer.util.XRRuntimeException; import org.xml.sax.SAXException; -import javax.annotation.ParametersAreNonnullByDefault; import javax.swing.*; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -53,7 +52,6 @@ import java.util.logging.Level; import java.util.logging.Logger; -@ParametersAreNonnullByDefault public class BrowserPanel extends JPanel implements DocumentListener { private static final org.slf4j.Logger log = LoggerFactory.getLogger(BrowserPanel.class); @@ -74,7 +72,7 @@ public class BrowserPanel extends JPanel implements DocumentListener { private final BrowserStartup root; private final BrowserPanelListener listener; private JButton print_preview; - + private static final Logger logger = Logger.getLogger("app.browser"); private PanelManager manager; @@ -113,8 +111,7 @@ public void focusLost(FocusEvent e) { manager = new PanelManager(); view = new ScalableXHTMLPanel(manager); manager.setRepaintListener(view); - ImageResourceLoader irl = new ImageResourceLoader(); - irl.setRepaintListener(view); + ImageResourceLoader irl = new ImageResourceLoader(view); manager.setImageResourceLoader(irl); view.getSharedContext().setReplacedElementFactory(new SwingReplacedElementFactory(view, irl)); view.addDocumentListener(manager); diff --git a/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/PanelManager.java b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/PanelManager.java index 5e9dccfd7..5ba31b4c2 100644 --- a/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/PanelManager.java +++ b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/PanelManager.java @@ -19,6 +19,9 @@ */ package org.xhtmlrenderer.demo.browser; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.resource.XMLResource; import org.xhtmlrenderer.swing.DelegatingUserAgent; import org.xhtmlrenderer.util.GeneralUtil; @@ -26,9 +29,6 @@ import org.xhtmlrenderer.util.XRLog; import org.xml.sax.InputSource; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import javax.xml.transform.sax.SAXSource; import java.io.File; import java.io.IOException; @@ -51,7 +51,6 @@ * As a NaiveUserAgent, the PanelManager is also a DocumentListener, but must be added to the source of document * events (like a RootPanel subclass). */ -@ParametersAreNonnullByDefault public class PanelManager extends DelegatingUserAgent { private int index = -1; private final List history = new ArrayList<>(); @@ -107,6 +106,7 @@ public String resolveURI(@Nullable String uri) { return ref.toExternalForm(); } + @NonNull @Override public XMLResource getXMLResource(String uri) { uri = resolveURI(uri); diff --git a/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/actions/ZoomAction.java b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/actions/ZoomAction.java index f2aa95463..fd36ca55e 100644 --- a/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/actions/ZoomAction.java +++ b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/actions/ZoomAction.java @@ -3,7 +3,6 @@ import org.xhtmlrenderer.demo.browser.ScaleFactor; import org.xhtmlrenderer.swing.ScalableXHTMLPanel; -import javax.annotation.ParametersAreNonnullByDefault; import javax.swing.*; import java.awt.event.ActionEvent; @@ -13,7 +12,6 @@ /** * Implements zooming of the browser panel. */ -@ParametersAreNonnullByDefault public class ZoomAction extends AbstractAction { private static boolean needsWarning = true; diff --git a/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/actions/package-info.java b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/actions/package-info.java new file mode 100644 index 000000000..cd2659250 --- /dev/null +++ b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/actions/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.demo.browser.actions; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/package-info.java b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/package-info.java new file mode 100644 index 000000000..e90180ab2 --- /dev/null +++ b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/browser/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.demo.browser; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/docbook/ShowDocBookPage.java b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/docbook/ShowDocBookPage.java index ce3513f36..938f1f83e 100644 --- a/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/docbook/ShowDocBookPage.java +++ b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/docbook/ShowDocBookPage.java @@ -7,17 +7,12 @@ import org.xhtmlrenderer.swing.NaiveUserAgent; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.ParametersAreNonnullByDefault; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.io.InputStream; import java.net.URL; -/** - * - */ -@ParametersAreNonnullByDefault public class ShowDocBookPage { public JFrame frame; diff --git a/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/docbook/package-info.java b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/docbook/package-info.java new file mode 100644 index 000000000..476803aa9 --- /dev/null +++ b/flying-saucer-examples/src/main/java/org/xhtmlrenderer/demo/docbook/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.demo.docbook; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-examples/src/test/java/org/xhtmlrenderer/pdf/PDFRenderTest.java b/flying-saucer-examples/src/test/java/org/xhtmlrenderer/pdf/PDFRenderTest.java index e91ac05a7..17de7b863 100644 --- a/flying-saucer-examples/src/test/java/org/xhtmlrenderer/pdf/PDFRenderTest.java +++ b/flying-saucer-examples/src/test/java/org/xhtmlrenderer/pdf/PDFRenderTest.java @@ -2,13 +2,13 @@ import com.codeborne.pdftest.PDF; import com.lowagie.text.DocumentException; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.xhtmlrenderer.resource.XMLResource; -import javax.annotation.ParametersAreNonnullByDefault; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -62,14 +62,14 @@ private static PDF generatePDF(URL source, File output) throws IOException, Docu return new PDF(output); } - @ParametersAreNonnullByDefault private static class ResourceLoaderUserAgent extends ITextUserAgent { private ResourceLoaderUserAgent(ITextOutputDevice outputDevice, int dotsPerPixel) { super(outputDevice, dotsPerPixel); } @Override - protected InputStream resolveAndOpenStream(String uri) { + @Nullable + protected InputStream resolveAndOpenStream(@Nullable String uri) { InputStream is = super.resolveAndOpenStream(uri); log.info("IN resolveAndOpenStream() {}", uri); return is; diff --git a/flying-saucer-examples/src/test/java/org/xhtmlrenderer/pdf/package-info.java b/flying-saucer-examples/src/test/java/org/xhtmlrenderer/pdf/package-info.java new file mode 100644 index 000000000..82eee6490 --- /dev/null +++ b/flying-saucer-examples/src/test/java/org/xhtmlrenderer/pdf/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.pdf; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-fop/src/main/java/org/xhtmlrenderer/fop/nbsp/NonBreakPointsLoader.java b/flying-saucer-fop/src/main/java/org/xhtmlrenderer/fop/nbsp/NonBreakPointsLoader.java index c3bf11008..52bddca9c 100644 --- a/flying-saucer-fop/src/main/java/org/xhtmlrenderer/fop/nbsp/NonBreakPointsLoader.java +++ b/flying-saucer-fop/src/main/java/org/xhtmlrenderer/fop/nbsp/NonBreakPointsLoader.java @@ -18,19 +18,16 @@ */ package org.xhtmlrenderer.fop.nbsp; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; + import java.util.List; /** * @author Lukas Zaruba, lukas.zaruba@gmail.com */ -@ParametersAreNonnullByDefault public interface NonBreakPointsLoader { - @Nonnull @CheckReturnValue List loadNBSP(@Nullable String lang); diff --git a/flying-saucer-fop/src/main/java/org/xhtmlrenderer/fop/nbsp/NonBreakPointsLoaderImpl.java b/flying-saucer-fop/src/main/java/org/xhtmlrenderer/fop/nbsp/NonBreakPointsLoaderImpl.java index 02de90882..31fc2af3a 100644 --- a/flying-saucer-fop/src/main/java/org/xhtmlrenderer/fop/nbsp/NonBreakPointsLoaderImpl.java +++ b/flying-saucer-fop/src/main/java/org/xhtmlrenderer/fop/nbsp/NonBreakPointsLoaderImpl.java @@ -18,10 +18,9 @@ */ package org.xhtmlrenderer.fop.nbsp; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -35,11 +34,9 @@ /** * @author Lukas Zaruba, lukas.zaruba@gmail.com */ -@ParametersAreNonnullByDefault public class NonBreakPointsLoaderImpl implements NonBreakPointsLoader { @Override - @Nonnull @CheckReturnValue public List loadNBSP(@Nullable String lang) { if (lang == null || lang.isEmpty()) { @@ -58,7 +55,7 @@ public List loadNBSP(@Nullable String lang) { @CheckReturnValue private List loadForKey(String lang) { String path = "non-break-spaces/" + lang + ".nbsp"; - + try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(path)) { if (is == null) return null; BufferedReader r = new BufferedReader(new InputStreamReader(is, UTF_8)); diff --git a/flying-saucer-fop/src/main/java/org/xhtmlrenderer/fop/nbsp/package-info.java b/flying-saucer-fop/src/main/java/org/xhtmlrenderer/fop/nbsp/package-info.java new file mode 100644 index 000000000..1b1518c62 --- /dev/null +++ b/flying-saucer-fop/src/main/java/org/xhtmlrenderer/fop/nbsp/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.fop.nbsp; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-fop/src/main/java/org/xhtmlrenderer/fop/package-info.java b/flying-saucer-fop/src/main/java/org/xhtmlrenderer/fop/package-info.java new file mode 100644 index 000000000..55c316a9d --- /dev/null +++ b/flying-saucer-fop/src/main/java/org/xhtmlrenderer/fop/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.fop; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/AbstractFormField.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/AbstractFormField.java index 3d29873f0..56b2438b8 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/AbstractFormField.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/AbstractFormField.java @@ -20,6 +20,7 @@ package org.xhtmlrenderer.pdf; import com.lowagie.text.pdf.PdfTemplate; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.xhtmlrenderer.css.parser.FSCMYKColor; import org.xhtmlrenderer.css.parser.FSColor; @@ -28,11 +29,8 @@ import org.xhtmlrenderer.render.BlockBox; import org.xhtmlrenderer.util.Util; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.awt.*; -@ParametersAreNonnullByDefault public abstract class AbstractFormField implements ITextReplacedElement { protected static final String DEFAULT_CHECKED_STATE = "Yes"; protected static final String OFF_STATE = "Off"; // required per the spec diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/BookmarkElement.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/BookmarkElement.java index b8812fead..1370fd853 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/BookmarkElement.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/BookmarkElement.java @@ -19,17 +19,17 @@ */ package org.xhtmlrenderer.pdf; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.layout.LayoutContext; import org.xhtmlrenderer.render.BlockBox; import org.xhtmlrenderer.render.RenderingContext; -import javax.annotation.ParametersAreNonnullByDefault; import java.awt.*; -@ParametersAreNonnullByDefault public class BookmarkElement implements ITextReplacedElement { private Point _location = new Point(0, 0); - private String _anchorName; + @Nullable + private final String _anchorName; public int getIntrinsicWidth() { return 0; @@ -51,11 +51,12 @@ public void detach(LayoutContext c) { c.removeBoxId(getAnchorName()); } + @Nullable public String getAnchorName() { return _anchorName; } - public void setAnchorName(String anchorName) { + public BookmarkElement(@Nullable String anchorName) { _anchorName = anchorName; } diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/CheckboxFormField.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/CheckboxFormField.java index 663b218f5..2560920b4 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/CheckboxFormField.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/CheckboxFormField.java @@ -32,11 +32,9 @@ import org.xhtmlrenderer.render.BlockBox; import org.xhtmlrenderer.render.RenderingContext; -import javax.annotation.ParametersAreNonnullByDefault; import java.awt.*; import java.io.IOException; -@ParametersAreNonnullByDefault public class CheckboxFormField extends AbstractFormField { private static final String FIELD_TYPE = "Checkbox"; diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/DOMUtil.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/DOMUtil.java index 67cfe6b88..8bf97d6a7 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/DOMUtil.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/DOMUtil.java @@ -19,15 +19,18 @@ */ package org.xhtmlrenderer.pdf; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.List; public class DOMUtil { + @Nullable + @CheckReturnValue public static Element getChild(Element parent, String name) { NodeList children = parent.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { @@ -42,7 +45,7 @@ public static Element getChild(Element parent, String name) { return null; } - @Nonnull + @CheckReturnValue public static List getChildren(Element parent, String name) { NodeList children = parent.getChildNodes(); List result = new ArrayList<>(children.getLength()); @@ -64,6 +67,7 @@ public static List getChildren(Element parent, String name) { * * @return a String with the text content of an element (maybe an empty string but will not be null). */ + @CheckReturnValue public static String getText(Element parent) { StringBuilder sb = new StringBuilder(); getText(parent, sb); diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/EmptyReplacedElement.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/EmptyReplacedElement.java index 675ef3123..ceb7ecdb8 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/EmptyReplacedElement.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/EmptyReplacedElement.java @@ -6,14 +6,12 @@ import org.xhtmlrenderer.render.BlockBox; import org.xhtmlrenderer.render.RenderingContext; -import javax.annotation.ParametersAreNonnullByDefault; import java.awt.*; /** * User: beck * Date: 11/4/11 */ -@ParametersAreNonnullByDefault public class EmptyReplacedElement extends AbstractFormField { private static final String FIELD_TYPE = "Hidden"; diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/FontFamily.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/FontFamily.java index 953a20255..564f895cf 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/FontFamily.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/FontFamily.java @@ -1,5 +1,6 @@ package org.xhtmlrenderer.pdf; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.css.constants.IdentValue; import java.util.ArrayList; @@ -28,6 +29,7 @@ public void addFontDescription(FontDescription description) { _fontDescriptions.sort(comparingInt(FontDescription::getWeight)); } + @Nullable public FontDescription match(int desiredWeight, IdentValue style) { List candidates = new ArrayList<>(); @@ -64,6 +66,7 @@ public FontDescription match(int desiredWeight, IdentValue style) { private static final int SM_LIGHTER_OR_DARKER = 2; private static final int SM_DARKER_OR_LIGHTER = 3; + @Nullable private FontDescription findByWeight(List matches, int desiredWeight, int searchMode) { if (searchMode == SM_EXACT) { for (FontDescription description : matches) { diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextFontResolver.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextFontResolver.java index 23da11571..30750253b 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextFontResolver.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextFontResolver.java @@ -19,8 +19,10 @@ */ package org.xhtmlrenderer.pdf; +import com.google.errorprone.annotations.CheckReturnValue; import com.lowagie.text.DocumentException; import com.lowagie.text.pdf.BaseFont; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xhtmlrenderer.css.constants.CSSName; @@ -37,10 +39,6 @@ import org.xhtmlrenderer.util.SupportedEmbeddedFontTypes; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.io.File; import java.io.IOException; import java.nio.file.Paths; @@ -62,7 +60,6 @@ import static org.xhtmlrenderer.util.FontUtil.isEmbeddedBase64Font; import static org.xhtmlrenderer.util.SupportedEmbeddedFontTypes.getExtension; -@ParametersAreNonnullByDefault public class ITextFontResolver implements FontResolver { private static final Logger log = LoggerFactory.getLogger(ITextFontResolver.class); private static final String OTF = ".otf"; @@ -111,6 +108,8 @@ public static Set getDistinctFontFamilyNames(String path, String encodin } } + @Nullable + @CheckReturnValue @Override public FSFont resolveFont(SharedContext renderingContext, FontSpecification spec) { return resolveFont(spec.families, spec.size, spec.fontWeight, spec.fontStyle); @@ -196,7 +195,6 @@ public void addFontDirectory(String dir, boolean embedded) } } - @Nonnull @CheckReturnValue private File[] filesWithExtensions(File f, String... extensions) { return requireNonNull(f.listFiles((d, name) -> { @@ -262,7 +260,6 @@ public void addFont(BaseFont font, String path, @Nullable String fontFamilyNameO } } - @Nonnull @CheckReturnValue private static Collection getFontFamilyNames(BaseFont font, @Nullable String fontFamilyNameOverride) { if (fontFamilyNameOverride != null) { @@ -286,7 +283,7 @@ private boolean fontSupported(String uri) { */ private void addFontFaceFont(@Nullable String fontFamilyNameOverride, @Nullable IdentValue fontWeightOverride, @Nullable IdentValue fontStyleOverride, String uri, String encoding, boolean embedded, - byte[] ttfAfm, @Nullable byte[] pfb) + byte[] ttfAfm, byte @Nullable [] pfb) throws DocumentException, IOException { String lower = uri.toLowerCase(); if (fontSupported(lower)) { @@ -324,7 +321,6 @@ private void addFontFaceFont(@Nullable String fontFamilyNameOverride, @Nullable } } - @Nonnull @CheckReturnValue private static FontDescription fontDescription(@Nullable IdentValue fontWeightOverride, @Nullable IdentValue fontStyleOverride, String uri, byte[] ttfAfm, BaseFont font) { @@ -341,13 +337,11 @@ private static FontDescription fontDescription(@Nullable IdentValue fontWeightOv return description; } - @Nonnull @CheckReturnValue private byte[] readFile(String path) throws IOException { return IOUtil.readBytes(Paths.get(path)); } - @Nonnull @CheckReturnValue private FontFamily getFontFamily(String fontFamilyName) { FontFamily fontFamily = getFonts().get(fontFamilyName); @@ -358,9 +352,9 @@ private FontFamily getFontFamily(String fontFamilyName) { return fontFamily; } - @Nonnull + @Nullable @CheckReturnValue - private FSFont resolveFont(@Nullable String[] families, float size, IdentValue weight, IdentValue style) { + private FSFont resolveFont(String @Nullable [] families, float size, IdentValue weight, IdentValue style) { if (!(style == IdentValue.NORMAL || style == IdentValue.OBLIQUE || style == IdentValue.ITALIC)) { style = IdentValue.NORMAL; @@ -409,6 +403,7 @@ private String stripQuotes(String text) { return result; } + @Nullable private FSFont resolveFont(String fontFamily, float size, IdentValue weight, IdentValue style) { String normalizedFontFamily = normalizeFontFamily(fontFamily); diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextImageElement.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextImageElement.java index 898fe51b3..a762d913c 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextImageElement.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextImageElement.java @@ -25,10 +25,8 @@ import org.xhtmlrenderer.render.BlockBox; import org.xhtmlrenderer.render.RenderingContext; -import javax.annotation.ParametersAreNonnullByDefault; import java.awt.*; -@ParametersAreNonnullByDefault public class ITextImageElement implements ITextReplacedElement { private final FSImage _image; diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextRenderer.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextRenderer.java index d11cf1698..57b7b0a71 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextRenderer.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextRenderer.java @@ -21,6 +21,7 @@ import com.lowagie.text.DocumentException; import com.lowagie.text.pdf.PdfWriter; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -44,8 +45,6 @@ import org.xhtmlrenderer.util.Configuration; import org.xml.sax.InputSource; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; @@ -66,7 +65,6 @@ import static java.nio.charset.StandardCharsets.UTF_8; -@ParametersAreNonnullByDefault public class ITextRenderer { // These two defaults combine to produce an effective resolution of 96 px to the inch public static final float DEFAULT_DOTS_PER_POINT = 20f * 4f / 3f; diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextReplacedElement.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextReplacedElement.java index 918a6d2c0..c71e1d03b 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextReplacedElement.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextReplacedElement.java @@ -23,9 +23,7 @@ import org.xhtmlrenderer.render.BlockBox; import org.xhtmlrenderer.render.RenderingContext; -import javax.annotation.ParametersAreNonnullByDefault; -@ParametersAreNonnullByDefault public interface ITextReplacedElement extends ReplacedElement { void paint(RenderingContext c, ITextOutputDevice outputDevice, BlockBox box); } diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextReplacedElementFactory.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextReplacedElementFactory.java index ba93fe09a..dd5fb4873 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextReplacedElementFactory.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextReplacedElementFactory.java @@ -19,6 +19,8 @@ */ package org.xhtmlrenderer.pdf; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.xhtmlrenderer.extend.FSImage; import org.xhtmlrenderer.extend.ReplacedElement; @@ -28,15 +30,11 @@ import org.xhtmlrenderer.render.BlockBox; import org.xhtmlrenderer.simple.extend.FormSubmissionListener; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -@ParametersAreNonnullByDefault public class ITextReplacedElementFactory implements ReplacedElementFactory { private final ITextOutputDevice _outputDevice; @@ -95,13 +93,12 @@ public ReplacedElement createReplacedElement(LayoutContext c, BlockBox box, */ case "bookmark": // HACK Add box as named anchor and return placeholder - BookmarkElement result = new BookmarkElement(); if (e.hasAttribute("name")) { String name = e.getAttribute("name"); c.addBoxId(name, box); - result.setAnchorName(name); + return new BookmarkElement(name); } - return result; + return new BookmarkElement(null); } return null; diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextUserAgent.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextUserAgent.java index ac5a5bb0d..62fc11038 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextUserAgent.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextUserAgent.java @@ -32,7 +32,6 @@ import org.xhtmlrenderer.util.ImageUtil; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.ParametersAreNonnullByDefault; import java.io.IOException; import java.io.InputStream; import java.net.URI; @@ -40,7 +39,6 @@ import static org.xhtmlrenderer.util.IOUtil.readBytes; -@ParametersAreNonnullByDefault public class ITextUserAgent extends NaiveUserAgent { private static final int IMAGE_CACHE_CAPACITY = 32; diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/PDFRenderer.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/PDFRenderer.java index 7c9a3f0c2..483a35f0e 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/PDFRenderer.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/PDFRenderer.java @@ -2,9 +2,8 @@ import com.lowagie.text.DocumentException; import com.lowagie.text.pdf.PdfWriter; +import org.jspecify.annotations.Nullable; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.io.File; import java.io.IOException; import java.io.OutputStream; @@ -30,7 +29,6 @@ * @author Pete Brant * @author Patrick Wright */ -@ParametersAreNonnullByDefault public class PDFRenderer { private static final Map versionMap = new HashMap<>(); diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/RadioButtonFormField.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/RadioButtonFormField.java index 554820ffb..ca18f9315 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/RadioButtonFormField.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/RadioButtonFormField.java @@ -25,6 +25,7 @@ import com.lowagie.text.pdf.PdfContentByte; import com.lowagie.text.pdf.PdfFormField; import com.lowagie.text.pdf.PdfWriter; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.xhtmlrenderer.css.parser.FSColor; import org.xhtmlrenderer.css.parser.FSRGBColor; @@ -34,11 +35,9 @@ import org.xhtmlrenderer.render.PageBox; import org.xhtmlrenderer.render.RenderingContext; -import javax.annotation.ParametersAreNonnullByDefault; import java.awt.*; import java.util.List; -@ParametersAreNonnullByDefault public final class RadioButtonFormField extends AbstractFormField { private static final String FIELD_TYPE = "RadioButton"; @@ -90,6 +89,7 @@ public void paint(RenderingContext c, ITextOutputDevice outputDevice, BlockBox b _factory.remove(fieldName); } + @Nullable private RadioButtonFormField getChecked(List fields) { for (RadioButtonFormField f : fields) { if (isChecked(f.getBox().getElement())) { diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/SelectFormField.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/SelectFormField.java index f924e069d..b8635698c 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/SelectFormField.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/SelectFormField.java @@ -33,14 +33,12 @@ import org.xhtmlrenderer.render.RenderingContext; import org.xhtmlrenderer.util.Util; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import static org.xhtmlrenderer.util.TextUtil.readTextContentOrNull; -@ParametersAreNonnullByDefault public class SelectFormField extends AbstractFormField { private static final String FIELD_TYPE = "Select"; diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/TextAreaFormField.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/TextAreaFormField.java index be27d040f..8da1087c5 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/TextAreaFormField.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/TextAreaFormField.java @@ -23,9 +23,7 @@ import org.xhtmlrenderer.render.BlockBox; import org.xhtmlrenderer.render.RenderingContext; -import javax.annotation.ParametersAreNonnullByDefault; -@ParametersAreNonnullByDefault public class TextAreaFormField extends AbstractFormField { private static final String FIELD_TYPE = "TextArea"; diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/TextFormField.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/TextFormField.java index d99d32aa7..87466a3b2 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/TextFormField.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/TextFormField.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.pdf; +import com.google.errorprone.annotations.CheckReturnValue; import com.lowagie.text.DocumentException; import com.lowagie.text.Rectangle; import com.lowagie.text.pdf.PdfAnnotation; @@ -34,12 +35,8 @@ import org.xhtmlrenderer.render.RenderingContext; import org.xhtmlrenderer.util.Util; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.ParametersAreNonnullByDefault; import java.io.IOException; -@ParametersAreNonnullByDefault public class TextFormField extends AbstractFormField { private static final String FIELD_TYPE = "Text"; @@ -180,7 +177,6 @@ private int getMaxLength(Element elem) } } - @Nonnull @CheckReturnValue protected String getValue(Element e) { return e.getAttribute("value"); diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/TrueTypeUtil.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/TrueTypeUtil.java index 8def8b82c..b239fc022 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/TrueTypeUtil.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/TrueTypeUtil.java @@ -1,14 +1,12 @@ package org.xhtmlrenderer.pdf; +import com.google.errorprone.annotations.CheckReturnValue; import com.lowagie.text.DocumentException; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.pdf.RandomAccessFileOrArray; import org.xhtmlrenderer.css.constants.IdentValue; import org.xhtmlrenderer.util.XRRuntimeException; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; -import javax.annotation.ParametersAreNonnullByDefault; import java.io.IOException; import java.lang.reflect.Field; import java.util.ArrayList; @@ -22,7 +20,6 @@ * Uses code from iText's DefaultFontMapper and TrueTypeFont classes. See * http://sourceforge.net/projects/itext/ for license information. */ -@ParametersAreNonnullByDefault public class TrueTypeUtil { /** @@ -32,7 +29,6 @@ public class TrueTypeUtil { */ private static final boolean AVOID_MEMORY_MAPPED_FILES = true; - @Nonnull @CheckReturnValue private static IdentValue guessStyle(BaseFont font) { String[][] names = font.getFullFontName(); @@ -49,7 +45,6 @@ private static IdentValue guessStyle(BaseFont font) { return IdentValue.NORMAL; } - @Nonnull @CheckReturnValue public static Collection getFamilyNames(BaseFont font) { String[][] names = font.getFamilyFontName(); @@ -68,7 +63,6 @@ public static Collection getFamilyNames(BaseFont font) { return result; } - @Nonnull @CheckReturnValue // HACK No accessor private static Map extractTables(BaseFont font) @@ -89,14 +83,12 @@ private static Map extractTables(BaseFont font) throw new NoSuchFieldException("Could not find tables field"); } - @Nonnull @CheckReturnValue private static String getTTCName(String name) { int index = name.toLowerCase().indexOf(".ttc,"); return index < 0 ? name : name.substring(0, index + 4); } - @Nonnull @CheckReturnValue public static FontDescription extractDescription(String path, BaseFont font) { try { @@ -116,7 +108,6 @@ public static void populateDescription(String path, BaseFont font, FontDescripti } } - @Nonnull @CheckReturnValue public static FontDescription extractDescription(String path, byte[] contents, BaseFont font) { try { diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/package-info.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/package-info.java new file mode 100644 index 000000000..82eee6490 --- /dev/null +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.pdf; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/Browser.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/Browser.java index b08f2b496..ed5bee7a8 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/Browser.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/Browser.java @@ -19,6 +19,7 @@ */ package org.xhtmlrenderer.demo.browser.swt; +import com.google.errorprone.annotations.CheckReturnValue; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; @@ -43,6 +44,7 @@ import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xhtmlrenderer.demo.browser.swt.DemosNavigation.Demo; @@ -66,9 +68,6 @@ import org.xhtmlrenderer.event.DocumentListener; import org.xhtmlrenderer.swt.simple.SWTXHTMLRenderer; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; @@ -79,7 +78,6 @@ import static org.eclipse.swt.SWT.ICON_ERROR; import static org.eclipse.swt.SWT.OK; -@ParametersAreNonnullByDefault public class Browser implements DisposeListener, DocumentListener { private static final Logger log = LoggerFactory.getLogger(Browser.class); diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/BrowserUserAgent.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/BrowserUserAgent.java index 4c65f7fca..d9aafd222 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/BrowserUserAgent.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/BrowserUserAgent.java @@ -19,7 +19,9 @@ */ package org.xhtmlrenderer.demo.browser.swt; +import com.google.errorprone.annotations.CheckReturnValue; import org.eclipse.swt.graphics.Device; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.DemoMarker; import org.xhtmlrenderer.demo.browser.DirectoryLister; import org.xhtmlrenderer.demo.browser.PlainTextXMLReader; @@ -34,9 +36,6 @@ import org.xhtmlrenderer.util.XRLog; import org.xml.sax.InputSource; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import javax.xml.transform.sax.SAXSource; import java.io.File; import java.io.IOException; @@ -48,7 +47,6 @@ import java.net.URL; import java.net.URLConnection; -@ParametersAreNonnullByDefault public class BrowserUserAgent extends NaiveUserAgent { private final DemosNavigation _demos; @@ -135,6 +133,7 @@ public void setBaseURL(String url) { super.setBaseURL(resolveURI(url)); } + @Nullable public String resolveFullURI(String uri) { uri = resolveURI(uri); if (uri == null) { diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/AboutAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/AboutAction.java index c4b29de23..30b0e1928 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/AboutAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/AboutAction.java @@ -29,12 +29,11 @@ import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; import org.xhtmlrenderer.demo.browser.swt.BrowserUserAgent; import org.xhtmlrenderer.swt.simple.SWTXHTMLRenderer; -import javax.annotation.Nullable; - public class AboutAction extends AbstractAction { private static final String ABOUT_URL = "demo:/demos/r7/about.xhtml"; diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/AbstractAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/AbstractAction.java index 68d72ecce..aa8468444 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/AbstractAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/AbstractAction.java @@ -20,7 +20,7 @@ package org.xhtmlrenderer.demo.browser.swt.actions; -import javax.annotation.Nullable; +import org.jspecify.annotations.Nullable; public abstract class AbstractAction implements Action { diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/Action.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/Action.java index a70558ea9..b04b6bc46 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/Action.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/Action.java @@ -20,10 +20,9 @@ package org.xhtmlrenderer.demo.browser.swt.actions; import org.eclipse.swt.widgets.MenuItem; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; -import javax.annotation.Nullable; - public interface Action { String getText(); diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/BackAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/BackAction.java index 41bd8e876..47a2df3a8 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/BackAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/BackAction.java @@ -21,10 +21,9 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MenuItem; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; -import javax.annotation.Nullable; - public class BackAction extends AbstractAction { public BackAction() { diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DebugBoxesAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DebugBoxesAction.java index db4213730..fb61fd522 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DebugBoxesAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DebugBoxesAction.java @@ -21,10 +21,9 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MenuItem; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; -import javax.annotation.Nullable; - public class DebugBoxesAction extends AbstractAction { public DebugBoxesAction() { diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DebugInlineBoxesAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DebugInlineBoxesAction.java index b74d18bf6..5f08f251b 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DebugInlineBoxesAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DebugInlineBoxesAction.java @@ -21,10 +21,9 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MenuItem; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; -import javax.annotation.Nullable; - public class DebugInlineBoxesAction extends AbstractAction { public DebugInlineBoxesAction() { diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DebugLineBoxesAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DebugLineBoxesAction.java index f189ead1d..e10d617c2 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DebugLineBoxesAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DebugLineBoxesAction.java @@ -21,10 +21,9 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MenuItem; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; -import javax.annotation.Nullable; - public class DebugLineBoxesAction extends AbstractAction { public DebugLineBoxesAction() { diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DebugMetricsAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DebugMetricsAction.java index 83dfadbcd..7b5c4c492 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DebugMetricsAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DebugMetricsAction.java @@ -21,10 +21,9 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MenuItem; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; -import javax.annotation.Nullable; - public class DebugMetricsAction extends AbstractAction { public DebugMetricsAction() { diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DemoAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DemoAction.java index 868bbab53..1456288f0 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DemoAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/DemoAction.java @@ -21,11 +21,10 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MenuItem; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; import org.xhtmlrenderer.demo.browser.swt.DemosNavigation.Demo; -import javax.annotation.Nullable; - public class DemoAction extends AbstractAction { private final Demo _demo; diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/FontSizeDecreaseAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/FontSizeDecreaseAction.java index 5e7c6d98e..fafa36974 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/FontSizeDecreaseAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/FontSizeDecreaseAction.java @@ -21,10 +21,9 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MenuItem; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; -import javax.annotation.Nullable; - public class FontSizeDecreaseAction extends AbstractAction { public FontSizeDecreaseAction() { diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/FontSizeIncreaseAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/FontSizeIncreaseAction.java index 918e2116f..b1036133f 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/FontSizeIncreaseAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/FontSizeIncreaseAction.java @@ -21,10 +21,9 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MenuItem; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; -import javax.annotation.Nullable; - public class FontSizeIncreaseAction extends AbstractAction { public FontSizeIncreaseAction() { diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/FontSizeNormalAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/FontSizeNormalAction.java index e6f48f15c..0627e183d 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/FontSizeNormalAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/FontSizeNormalAction.java @@ -21,10 +21,9 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MenuItem; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; -import javax.annotation.Nullable; - public class FontSizeNormalAction extends AbstractAction { public FontSizeNormalAction() { diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/ForwardAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/ForwardAction.java index ff8684d55..c6738f670 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/ForwardAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/ForwardAction.java @@ -21,10 +21,9 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MenuItem; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; -import javax.annotation.Nullable; - public class ForwardAction extends AbstractAction { public ForwardAction() { diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/LoadAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/LoadAction.java index 39dcbebbd..184a1f422 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/LoadAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/LoadAction.java @@ -21,10 +21,9 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MenuItem; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; -import javax.annotation.Nullable; - public class LoadAction extends AbstractAction { private final String _url; diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/OpenAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/OpenAction.java index da3a911a9..4a63597c9 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/OpenAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/OpenAction.java @@ -22,10 +22,9 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.MenuItem; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; -import javax.annotation.Nullable; - public class OpenAction extends AbstractAction { public OpenAction() { diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/PrintPreviewAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/PrintPreviewAction.java index 6ab222104..fadb8d5a6 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/PrintPreviewAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/PrintPreviewAction.java @@ -21,10 +21,9 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MenuItem; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; -import javax.annotation.Nullable; - public class PrintPreviewAction extends AbstractAction { public PrintPreviewAction() { diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/QuitAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/QuitAction.java index 238a414d3..6597e3dd3 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/QuitAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/QuitAction.java @@ -21,10 +21,9 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MenuItem; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; -import javax.annotation.Nullable; - public class QuitAction extends AbstractAction { public QuitAction() { diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/ReloadAction.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/ReloadAction.java index 659da7305..1b0025488 100644 --- a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/ReloadAction.java +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/actions/ReloadAction.java @@ -21,10 +21,9 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MenuItem; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.demo.browser.swt.Browser; -import javax.annotation.Nullable; - public class ReloadAction extends AbstractAction { public ReloadAction() { diff --git a/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/package-info.java b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/package-info.java new file mode 100644 index 000000000..795179ef3 --- /dev/null +++ b/flying-saucer-swt-examples/src/main/java/org/xhtmlrenderer/demo/browser/swt/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.demo.browser.swt; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/NaiveUserAgent.java b/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/NaiveUserAgent.java index 0dc4e210e..c71771daa 100644 --- a/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/NaiveUserAgent.java +++ b/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/NaiveUserAgent.java @@ -19,9 +19,11 @@ */ package org.xhtmlrenderer.swt; +import com.google.errorprone.annotations.CheckReturnValue; import org.eclipse.swt.SWTException; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Image; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.extend.UserAgentCallback; import org.xhtmlrenderer.resource.CSSResource; import org.xhtmlrenderer.resource.ImageResource; @@ -30,9 +32,6 @@ import org.xhtmlrenderer.util.ImageUtil; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; @@ -52,7 +51,6 @@ * * @author Vianney le Clément */ -@ParametersAreNonnullByDefault public class NaiveUserAgent implements UserAgentCallback { /** @@ -121,7 +119,7 @@ public ImageResource getImageResource(String uri) { * * @return An ImageResource containing the image. */ - protected ImageResource createImageResource(String uri, InputStream is) { + protected ImageResource createImageResource(@Nullable String uri, InputStream is) { return new ImageResource(uri, new SWTFSImage(new Image(_device, is), this, uri)); } diff --git a/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/SWTFSImage.java b/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/SWTFSImage.java index 219737f1d..c9ef4e39c 100644 --- a/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/SWTFSImage.java +++ b/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/SWTFSImage.java @@ -21,6 +21,7 @@ import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.extend.FSImage; import org.xhtmlrenderer.extend.UserAgentCallback; @@ -31,7 +32,9 @@ */ public class SWTFSImage implements FSImage { private final UserAgentCallback _uac; + @Nullable private final String _uri; + @Nullable private Image _image; private int _width, _height; @@ -42,7 +45,7 @@ public SWTFSImage() { this(null, null, null); } - public SWTFSImage(Image image, UserAgentCallback uac, String uri) { + public SWTFSImage(@Nullable Image image, UserAgentCallback uac, @Nullable String uri) { _uac = uac; _uri = uri; _image = image; @@ -67,15 +70,11 @@ public SWTFSImage(SWTFSImage image) { /** * Get the SWT image. Reload it from the UAC if it was disposed. */ + @Nullable public Image getImage() { if (_image != null && _image.isDisposed()) { - SWTFSImage fsimg = (SWTFSImage) _uac.getImageResource(_uri) - .getImage(); - if (fsimg == null) { - _image = null; - } else { - _image = fsimg._image; - } + SWTFSImage image = (SWTFSImage) _uac.getImageResource(_uri).getImage(); + _image = image == null ? null : image._image; } return _image; } diff --git a/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/SWTFontResolver.java b/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/SWTFontResolver.java index 042d84e0d..87e70e41d 100644 --- a/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/SWTFontResolver.java +++ b/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/SWTFontResolver.java @@ -19,10 +19,12 @@ */ package org.xhtmlrenderer.swt; +import com.google.errorprone.annotations.CheckReturnValue; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.css.constants.IdentValue; import org.xhtmlrenderer.css.value.FontSpecification; import org.xhtmlrenderer.extend.FontResolver; @@ -94,6 +96,9 @@ public void flushCache() { _instance_hash.clear(); } + @Nullable + @CheckReturnValue + @Override public FSFont resolveFont(SharedContext renderingContext, FontSpecification spec) { if (spec.families != null) { for (int i = 0; i < spec.families.length; i++) { @@ -118,8 +123,11 @@ public FSFont resolveFont(SharedContext renderingContext, FontSpecification spec return _system_font; } - private SWTFSFont resolveFont(SharedContext ctx, String font, float size, IdentValue weight, - IdentValue style, IdentValue variant) { + @Nullable + private SWTFSFont resolveFont(SharedContext ctx, String font, float size, + @Nullable IdentValue weight, + @Nullable IdentValue style, + @Nullable IdentValue variant) { // strip off the "s if they are there if (font.startsWith("\"")) { font = font.substring(1); diff --git a/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/SWTOutputDevice.java b/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/SWTOutputDevice.java index 0d286e0ae..676e09be3 100644 --- a/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/SWTOutputDevice.java +++ b/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/SWTOutputDevice.java @@ -26,6 +26,7 @@ import org.eclipse.swt.graphics.Path; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.graphics.Transform; +import org.jspecify.annotations.Nullable; import org.xhtmlrenderer.css.parser.FSColor; import org.xhtmlrenderer.css.parser.FSRGBColor; import org.xhtmlrenderer.extend.FSImage; @@ -38,7 +39,6 @@ import org.xhtmlrenderer.render.RenderingContext; import org.xhtmlrenderer.swt.simple.SWTFormControl; -import javax.annotation.Nullable; import java.awt.*; import java.awt.RenderingHints.Key; import java.awt.geom.AffineTransform; diff --git a/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/SWTReplacedElementFactory.java b/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/SWTReplacedElementFactory.java index 545c32cab..dfbc5f6b3 100644 --- a/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/SWTReplacedElementFactory.java +++ b/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/SWTReplacedElementFactory.java @@ -19,6 +19,8 @@ */ package org.xhtmlrenderer.swt; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.xhtmlrenderer.extend.FSImage; import org.xhtmlrenderer.extend.ReplacedElement; @@ -30,9 +32,6 @@ import org.xhtmlrenderer.util.ImageUtil; import org.xhtmlrenderer.util.XRLog; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; @@ -40,7 +39,6 @@ /** * @author Vianney le Clément */ -@ParametersAreNonnullByDefault public class SWTReplacedElementFactory implements ReplacedElementFactory { /** * Cache of image components (ReplacedElements) for quick lookup, keyed by diff --git a/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/package-info.java b/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/package-info.java new file mode 100644 index 000000000..4aa1ee942 --- /dev/null +++ b/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.swt; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/simple/SWTXhtmlReplacedElementFactory.java b/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/simple/SWTXhtmlReplacedElementFactory.java index b542a0ca3..c07a67725 100644 --- a/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/simple/SWTXhtmlReplacedElementFactory.java +++ b/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/simple/SWTXhtmlReplacedElementFactory.java @@ -1,5 +1,7 @@ package org.xhtmlrenderer.swt.simple; +import com.google.errorprone.annotations.CheckReturnValue; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xhtmlrenderer.extend.ReplacedElement; @@ -17,13 +19,9 @@ import org.xhtmlrenderer.swt.FormControlReplacementElement; import org.xhtmlrenderer.swt.SWTReplacedElementFactory; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.HashMap; import java.util.Map; -@ParametersAreNonnullByDefault public class SWTXhtmlReplacedElementFactory extends SWTReplacedElementFactory { private final BasicRenderer _parent; private final Map _forms = new HashMap<>(); diff --git a/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/simple/package-info.java b/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/simple/package-info.java new file mode 100644 index 000000000..ee0fbfc64 --- /dev/null +++ b/flying-saucer-swt/src/main/java/org/xhtmlrenderer/swt/simple/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package org.xhtmlrenderer.swt.simple; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/pom.xml b/pom.xml index 7f98100ce..724ec5564 100644 --- a/pom.xml +++ b/pom.xml @@ -53,10 +53,16 @@ - com.google.code.findbugs - jsr305 - 3.0.2 - compile + org.jspecify + jspecify + 1.0.0 + provided + + + com.google.errorprone + error_prone_annotations + 2.33.0 + provided org.junit.jupiter