Kevin, Others,

See my more elaborate response to Andreas Lehmkuehler.

It is not a breaking change as existing code uses the existing methods, that are unchanged.

So let's not rename PDAbstractContentStream. That might be a breaking change. (I think it is not, but let's stay on the safe side)

About the name: I noticed that PDContentStream mainly is about reading content streams. PDAbstractContentStream is about issuing commands to the stream, so I added *Output* somewhere in the name. For me any name will do. I agree that the Microsoft convention from the 1990ies to add an I or include 'Interface' in the name is not a good idea.

What name do we choose? PDContentInstructionStream?

Greetings.. Mark

--
Mark de Does, Magdalenastraat 6, 3512 NH Utrecht, the Netherlands,
http://maps.google.nl/?q=52.08692,5.1271,
e:m...@mdedoes.xs4all.nl t: 030 2314150

On 03-03-2025 15:34, Kevin Day wrote:
I'm pretty sure introducing an interface is a breaking change at the binary level. While it is source compatible, it will require recompile for anyone calling the method.

I personally am not a fan of adding "Interface" to the name of interfaces (or putting an "I" at the front).

I like PDContentInstructionStream.

If you choose a name like PDContentInstructionStream, you will probably also want to change the name of the abstract class to PDAbstractContentInstructionStream (or AbstractPDContentInstructionStream). The change is already breaking, so changing the name of that class is probably ok.

Have you looked carefully at the design from a "single responsibility" perspective? I don't know how many methods you pulled up to the interface, but if it is a lot of methods, that might indicate a solid design review would be a good idea. I'm happy to take a look - but it will be a week before I can get to it.

Finally, if backwards compatibility is a high priority, then changing the class to not be final would be the best approach. I prefer the interface approach, but sometimes backwards compatibility is more important than elegant design...

K


On Mon, Mar 3, 2025, 4:09 AM Tilman Hausherr <thaush...@t-online.de> wrote:

    On 28.02.2025 18:07, Mark de Does wrote:

    Tilman, Others,

    To avoid reflections about the original intentions, let's go for
    the interface approach. (Or can /John/ be consulted?)  I already
    typed the code so that does not feel as a waste for me.

    That resolves some of the issues in my original mail. Lets
    recuperate:

      * Do you think introducing an interface is overkill? Simply
        making PDAbstractContentStream public would achieve the same
        thing for me. :: We go for the interface approach
      * I chose the name PDContentStream for the interface. Later on,
        I discovered it is an unfortunate name. :: I browsed ISO
        32000-2:2020. In 7.8.2 (/Content streams/) It defines a
        content stream as a sequence of instructions. Would
        PDInstuctionStream be a good name for the interface?
      * I moved the JavaDoc comments from the abstract class to the
        interface. You agree? Or shall I also leave them in place? ::
        Agreed to move?
      * On which branch must I base my PR? (I see that the trunk
        already has a 4.0 version number) :: I am jumping to get this
        now! What can I do to get this in the next 3.something
        release? (As far as I can judge.. This widens the API
        interface and does not change anything functionally)

    Hi,

    I added a link to the ticket. You're welcome to apply for an
    account - just include something that we know it's you. I agree
    with the javadoc move. PRs should be against the trunk so OK.

    I'm not sure if it is a breaking change. I think it isn't, but
    ChatGPT says it is, but reading its reasoning makes me think it isn't.

    I don't like the name, why not PDContentStreamInterface? Yes it is
    confusing that we have a PDContentStream interface. I'd wait a bit
    for other opinions.

    John is still member of the project but hasn't been active since then.

    Tilman



     *




    Greetings.. Mark. (Sorry for being pushy)

-- Mark de Does,Magdalenastraat 6, 3512 NH Utrecht, the Netherlands <https://www.google.com/maps/search/Magdalenastraat+6,+3512+NH+Utrecht,+the+Netherlands?entry=gmail&source=g>,
    http://maps.google.nl/?q=52.08692,5.1271,
    e:m...@mdedoes.xs4all.nl t: 030 2314150
    On 28-02-2025 14:40, Tilman Hausherr wrote:
    Making PDAbstractContentStream public seems to be the easier
    solution, but:
    It was created package-private. I don't know if (1) John had a
    specific reason for it or (2) this was just "best practice" to
    make stuff restricted until somebody requests it to be
    accessible. However he wrote "unless we want users to subclass
    PDAbstractContentStream" so he wanted to prevent that, so it
    would be (1). That makes me undecided.

    See here: https://issues.apache.org/jira/browse/PDFBOX-4068

    Amusingly not only this is still open but it was me who created
    it 🤦‍♂️

    Tilman

    On 28.02.2025 14:22, Mark de Does wrote:
    In one of my projects, I convert (a subset of) SVG to PDF,
    using PdfBox.

    In SVG, the contents of the main <svg> element, the <marker>,
    <symbol> and <pattern> definitions have the same syntax and
    structure. With PdfBox 2, I use a PDPageContentStream to record
    the content of all three. With PdfBox 3, that no longer works
    because I must use a PDPatternContentStream to record a
    pattern. Because the different kinds of content stream do not
    share a visible (public) ancestor, I cannot use the same code
    to record SVG content to a content stream.

    This morning, I captured the public methods of
    PDAbstractContentStream in an interface and declared
    PDAbstractContentStream to implement that interface. I adapted
    my code to use the interface and everything works fine. (As
    expected).

    Before I make a PR, I need some guidance.

     * Do you think introducing an interface is overkill? Simply
    making
       PDAbstractContentStream public would achieve the same thing
    for me.
       (The class, not the constructor)
     * I chose the name PDContentStream for the interface. Later on, I
       discovered that is an infortunate name: A different
    interface with
       that name already exists. What would be a better name?
     * I moved the JavaDoc comments from the abstract class to the
       interface. You agree? Or shall I also leave them in place?
     * On which branch must I base my PR? (I see that the trunk
    already has
       a 4.0 version number)

    Thanks and Greetings.. Mark



    ---------------------------------------------------------------------

    To unsubscribe, e-mail: users-unsubscr...@pdfbox.apache.org
    For additional commands, e-mail: users-h...@pdfbox.apache.org

Reply via email to