开发者

Get property keys by pattern from ResourceBundleMessageSource in spring

I have almost hundred properties like this

    NotEmpty.order.languageFrom=Field Language can't be empty
    NotEmpty.order.languageTo=Field Language can't be empty
    NotEmpty.order.description=Description field can't be开发者_如何学编程 empty
    NotEmpty.order.formType=FormType field can't be empty
    NotEmpty.cart.formType=FormType field can't be empty
    NotEmpty.cart.formType=FormType field can't be empty

And I'd like to be able getting these properties (both keys/values) without previous knowledge of keys ...something like getPropertyPair(regexp .*.order.[a-z]*=)

Does anybody know if spring or JDK offers something for that ? I suppose I'm gonna have to get the ResourceBundle and get all the keys and regexp them...


I don't think you can do it in Spring, but here's some code that might help:

public class Main {
  public static void main(String[] args) {
    ResourceBundle labels = ResourceBundle.getBundle("spring-regex/regex-resources", Locale.UK);
    Enumeration<String> labelKeys = labels.getKeys();

    // Build up a buffer of label keys
    StringBuffer sb = new StringBuffer();
    while (labelKeys.hasMoreElements()) {
      String key = labelKeys.nextElement();
      sb.append(key + "|");
    }

    // Choose the pattern for matching
    Pattern pattern = Pattern.compile(".*.order.[a-z]*\\|");
    Matcher matcher = pattern.matcher(sb);

    // Attempt to find all matching keys
    List<String> matchingLabelKeys = new ArrayList<String>();
    while (matcher.find()) {
      String key=matcher.group();
      matchingLabelKeys.add(key.substring(0,key.length()-1));
    }

    // Show results
    for (String value: matchingLabelKeys) {
      System.out.format("Key=%s Resource=%s",value,labels.getString(value));
    }

  }

}

It's a bit hacky but I'm sure you can tidy it up into something more useful.


A little late to the conversation, but I stumbled upon this answer from google...

There is a pure JDK implementation here in the matchingSubset() function that finds matches by iterating over the properties returned by propertyNames(). If you really needed to use a regex, it could be adapted fairly easily.

Code snippet posted below in case the link goes bad:

/**
 *  Copyright 2007 University Of Southern California
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

public Properties matchingSubset(String prefix, boolean keepPrefix) {
Properties result = new Properties();

// sanity check
if (prefix == null || prefix.length() == 0) {
  return result;
}

String prefixMatch; // match prefix strings with this
String prefixSelf; // match self with this
if (prefix.charAt(prefix.length() - 1) != '.') {
  // prefix does not end in a dot
  prefixSelf = prefix;
  prefixMatch = prefix + '.';
} else {
  // prefix does end in one dot, remove for exact matches
  prefixSelf = prefix.substring(0, prefix.length() - 1);
  prefixMatch = prefix;
}
// POSTCONDITION: prefixMatch and prefixSelf are initialized!

// now add all matches into the resulting properties.
// Remark 1: #propertyNames() will contain the System properties!
// Remark 2: We need to give priority to System properties. This is done
// automatically by calling this class's getProperty method.
String key;
for (Enumeration e = propertyNames(); e.hasMoreElements(); ) {
  key = (String) e.nextElement();

  if (keepPrefix) {
    // keep full prefix in result, also copy direct matches
    if (key.startsWith(prefixMatch) || key.equals(prefixSelf)) {
      result.setProperty(key,
                         getProperty(key));
    }
  } else {
    // remove full prefix in result, dont copy direct matches
    if (key.startsWith(prefixMatch)) {
      result.setProperty(key.substring(prefixMatch.length()),
                         getProperty(key));
    }
  }
}

// done
return result;

}

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜