Solved

Urgent: Need to escape curly braces in property file.

Posted on 2004-04-20
9
5,839 Views
Last Modified: 2009-07-29
Prolly really easy, but it's urgent, hence the 500 points
I'm storing regular expressions in property files based on language/country pairs. I'm using the struts internationalisation and message-bundles, reading my property-files and exporting it into a javascript for use of validation.
I need to know how to escape the curly braces in such a way that when I use <bean:message ... /> to output it, the curly braces are used as output. A simple example:
inputpattern=^(\\w\\s?){2,25}$

Should output to: ^(\w\s?){2,25}$

Right now struts won't be able to output this because it expects arguments in the {0} style and finds unexpected characters inbetween the curly braces...
0
Comment
Question by:mreuring
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 4
9 Comments
 
LVL 35

Expert Comment

by:TimYates
ID: 10867894
Shouldn't it be:

inputpattern = "^(\\w\\s?){2,25}$" ;

?  I'm confused...  can you give a fuller example?
0
 
LVL 17

Author Comment

by:mreuring
ID: 10867902
My, current, inbetween workaround:
inputpattern=^(\\w\\s?){0}2,25{1}$

<bean:message arg0="{" arg1="}" key="inputpattern"/>

But I'm pretty damn sure there's an easier way to go about getting curly braces printed from a properties file...
0
 
LVL 7

Expert Comment

by:searlas
ID: 10867911
I'd be surprised if it was anything more complicated than:
inputpattern=^(\\w\\s?)\\{2,25}$
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 17

Author Comment

by:mreuring
ID: 10867936
In struts you can define a message bundle and use the associated .properties files in combination with the bean taglib to print internationalised messages. Since I'm building an internationalised form that has different validation rules per country/language I'm storing regular expressions in the property files and print them out in my internationalised javascript file (based on the current locale of the user).
Basic rules for a properties file:
property=value

And backslash being the escape character.
Struts adds to this that in the value of a property you can define arguments:
property=value{n}

Where n is an integer value for the argument. Problem is that a regular expression also uses curly braces and I now have to find a way to make struts ignore the curly braces entered into the property pair. And the escape char isn't enough, I tried:
inputpattern=^(\\w\\s?)\{2,25\}$
inputpattern=^(\\w\\s?)\\{2,25\\}$

Neither solution succesfully escapes the curly brace for use with the bean taglib.
0
 
LVL 7

Expert Comment

by:searlas
ID: 10867943
But, I am surprised...

From the MessageFormat docs:
Thus, a string that should result in the formatted message "'{0}'" can be written as "'''{'0}''" or "'''{0}'''".

So, you want:
inputpattern=^(\\w\\s?)'{'2,25}$
0
 
LVL 17

Author Comment

by:mreuring
ID: 10868038
Thanx for the quick suggestions!

I was getting my hopes up, but this only changes the error message:
java.lang.IllegalArgumentException: can't parse argument number ''1

Although I did combine your earlier suggestion with my current workaround, making it:
inputpattern=^(\\w\\s?){0}2,25}$

<bean:message arg0="{" key="inputpattern"/>

Still not verry elegant :(
0
 
LVL 7

Accepted Solution

by:
searlas earned 500 total points
ID: 10868828
mreuring,

Sadly, you seem to have found the best option IF you have to use the Struts tags.  Maybe you should consider a custom tag, or some other way of retrieving your regular expressions.

The problem is due to org.apache.struts.util.MessageResources.   The property values are passed to the MessageFormat constructor, so you (I) would expect to be able to quote the curlies by surrounding them in quotes.  However, just before it calls the MessageFormat constructor it preprocesses the property value and doubles up all the quotes:

    public String getMessage(Locale locale, String key, Object args[]) {
....
            format = new MessageFormat(escape(formatString));
....


    /**
     * Escape any single quote characters that are included in the specified
     * message string.
     *
     * @param string The string to be escaped
     */
    protected String escape(String string) {

        if ((string == null) || (string.indexOf('\'') < 0))
            return (string);
        int n = string.length();
        StringBuffer sb = new StringBuffer(n);
        for (int i = 0; i < n; i++) {
            char ch = string.charAt(i);
            if (ch == '\'')
                sb.append('\'');
            sb.append(ch);
        }
        return (sb.toString());

    }


So, basically, you cannot escape the {} processing, and what you have done is about as good as it gets...

0
 
LVL 17

Author Comment

by:mreuring
ID: 10869012
What the hell were they thinking?
Well, on basis of 'enlightening beyond the direct question' I most certainly find this worth a grade A :)
0
 
LVL 7

Expert Comment

by:searlas
ID: 10869343
Thanks!

I've found an entry in the struts/apache bug database, so you can vote for it or give feedback etc if you wish:
http://issues.apache.org/bugzilla/show_bug.cgi?id=21890
0

Featured Post

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

If you need to forecast numbers -- typically for finance -- the Windows and Mac versions of Excel 2016 have a basket of tools to get the job done.
This article explains the fundamentals of industrial networking which ultimately is the backbone network which is providing communications for process devices like robots and other not so interesting stuff.
Do you want to know how to make a graph with Microsoft Access? First, create a query with the data for the chart. Then make a blank form and add a chart control. This video also shows how to change what data is displayed on the graph as well as form…
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…

617 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question