I'm just some random user, but I have no opposition to including a framework
in Lang. For projects that I have worked on, I found a very useful pattern
for frameworks like this that have a fairly fixed set of operations.

I usually like to define an interface, which in this case could be something
like StringEscape. There seem to be a fixed set of escape and unescape
operations for each document type.

i.e.

interface StringEscape
{
    public String escape(String string);

    public void escape(Writer writer, String string) throws IOException;

    public String unescape(String string);

    public void unescape(Writer writer, String string) throws IOException;
}

Since there are a fixed set of escapes that are supported, I usually like to
create an enumeration for the known ones.

public enum StringEscapes implements StringEscape {

    CSV {
        public String escape(String string) {
            // CSV escape code here
        }

        public String unescape(String string) {
            // CSV unescape code here
        }
    },

    HTML_3_2 { ... },

    ...

    XML_1_1 { ...};

    // Common code for all escapes

    public void escape(Writer writer, String string) throws IOException {
        writer.write(escape(string));
    }

    public void unescape(Writer writer, String string) throws IOException {
        writer.write(unescape(string));
    }
}

I've found multiple benefits to this approach. One, the enumeration provides
one place where all of the known and most used implementations can be found.
The enumeration can also share code that is common across all of the
implementations (such as the Writer cases). The enumeration values can be
used directly by calling "StringEscapes.CSV.escape(myCsvString);". Also,
because the enumeration's behavior is defined in an interface, users are not
restricted to just the enumeration values, and can create their own.

While not necessarily needed, the StringEscapeUtils class could be modifed
to only have static methods that represent the four common interface
methods, but instead take a StringEscape as an additional parameter:

class StringEscapeUtils {
    public static String escape(StringEscape escape, String string) {
        return escape.escape(string)
    }

    public static String unescape(StringEscape escape, String string) {
return escape.unescape(string)
    }

    public static void escape(StringEscape escape, Writer writer, String
string) {
        escape.escape(writer, string);
    }

     public static void unescape(StringEscape escape, Writer writer, String
string) {
        escape.unescape(writer, string);
    }
}

The would lead to client statements that looked like this, which might be
useful just for clarity:

StringEscapeUtils.escape(StringEscapes.CSV, myCsvString);

But would also allow for custom implementations:

StringEscape myStringEscape = new StringEscape() {
    // Custom implementation code here
};
StringEscapeUtils.escape(myStringEscape, myString);

Just ideas. It's a framework I've found useful when passing behavior around,
especially when there's a fixed set of operations or a known subset to be
supported.

Hope that's useful.

-Michael Wooten

On 6/14/09, Henri Yandell <flame...@gmail.com> wrote:
>
> I've rewritten StringEscapeUtils by putting a mini-framework underneath it:
>
> https://issues.apache.org/jira/browse/LANG-505
>
> On the one hand, Lang has not been a place for frameworks. On the
> other hand, StringEscapeUtils has repeatedly shown a need to be much
> more pluggable and not tie the user into a particular way of working.
> We have bugs that are really different requirements.
>
> In essence the design is very similar to Entities, but taken a step
> further. This will also resolve the "Make Entities public" ticket/todo
> if that's still open. Other tickets can then be resolved by letting
> the users cheaply implement their own utility method on top of our
> code, or adding an alternative to Lang.
>
> StringEscapeUtils itself will probably get an API change anyway -
> escapeSql needs deleting imo. It needs escapeHtml32, 40, 50 variants,
> and escapeXml10, 11 variants. Or people need to be encouraged to call
> something like   StringEscapeUtils.escape(Entities.XML_1_1_ESCAPE) and
> maybe the various escapeHtml type methods go away.
>
> Anyway... any opinions very much appreciated. Otherwise I'll keep
> hacking on things :)
>
> Hen
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> For additional commands, e-mail: dev-h...@commons.apache.org
>
>

Reply via email to