001 /*
002 * Copyright 2002-2006 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.binding.form.support;
017
018 import java.util.ArrayList;
019 import java.util.Collection;
020
021 import org.springframework.util.StringUtils;
022
023 /**
024 * Default implementation for {@link MessageCodeStrategy}. It creates message codes as follows:
025 * <p>
026 * <code>{contextId}.{field}.{suffix}</code><br>
027 * <code>{field}.{suffix}</code> - without a contextId<br>
028 * <code>{field}</code> - without a contextId and no suffix<br>
029 * <p>
030 * If field contains a name which is separated by <code>'.'</code> like <code>'fieldcontext.field'</code>:
031 * <p>
032 * <code>{contextId}.fieldcontext.field.{suffix}</code><br>
033 * <code>{contextId}.field.{suffix}</code><br>
034 * <code>fieldcontext.field.{suffix}</code> - without a contextId<br>
035 * <code>field.{suffix}</code> - without a contextId<br>
036 * <code>fieldcontext.field</code> - without a contextId and no suffix<br>
037 * <code>field</code> - without a contextId and no suffix<br>
038 * <p>
039 *
040 * @author Mathias Broekelmann
041 *
042 */
043 public class DefaultMessageCodeStrategy implements MessageCodeStrategy {
044
045 public String[] getMessageCodes(String contextId, String field, String[] suffixes) {
046 boolean hasContextId = StringUtils.hasText(contextId);
047 String[] fieldPathElements = StringUtils.delimitedListToStringArray(field, ".");
048 Collection keys = new ArrayList((hasContextId ? 2 * fieldPathElements.length : fieldPathElements.length)
049 * (suffixes == null ? 1 : suffixes.length));
050 if (hasContextId) {
051 String prefix = contextId + '.';
052 addKeys(keys, prefix, fieldPathElements, suffixes);
053 }
054 addKeys(keys, "", fieldPathElements, suffixes);
055 return (String[]) keys.toArray(new String[keys.size()]);
056 }
057
058 private void addKeys(Collection keys, String prefix, String[] fieldPathElements, String[] suffix) {
059 final int size = fieldPathElements.length;
060 final int suffixSize = suffix == null ? 0 : suffix.length;
061 for (int i = 0; i < size; i++) {
062 StringBuffer path = new StringBuffer(prefix);
063 for (int j = i; j < size; j++) {
064 path.append(fieldPathElements[j]);
065 if (j + 1 < size) {
066 path.append('.');
067 }
068 }
069 if (suffixSize == 0) {
070 keys.add(path.toString());
071 } else {
072 for (int j = 0; j < suffixSize; j++) {
073 String currentSuffix = suffix[j];
074 if (StringUtils.hasText(currentSuffix)) {
075 keys.add(path.toString() + "." + currentSuffix);
076 } else {
077 keys.add(path.toString());
078 }
079
080 }
081 }
082 }
083 }
084
085 }