📄 cmsmacroresolver.java
字号:
/*
* File : $Source: /usr/local/cvs/opencms/src/org/opencms/util/CmsMacroResolver.java,v $
* Date : $Date: 2006/03/27 14:52:41 $
* Version: $Revision: 1.18 $
*
* This library is part of OpenCms -
* the Open Source Content Mananagement System
*
* Copyright (c) 2005 Alkacon Software GmbH (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* For further information about Alkacon Software GmbH, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.util;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsProperty;
import org.opencms.file.CmsResource;
import org.opencms.flex.CmsFlexController;
import org.opencms.i18n.CmsMessageContainer;
import org.opencms.i18n.CmsMessages;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.jsp.PageContext;
import org.apache.commons.logging.Log;
/**
* Resolves macros in the form of <code>${key}</code> in an input String.<p>
*
* The macro names that can be resolved depend of the context objects provided to the resolver
* using the <code>set...</code> methods.<p>
*
* @author Alexander Kandzior
* @author Thomas Weckert
*
* @version $Revision: 1.18 $
*
* @since 6.0.0
*/
public class CmsMacroResolver implements I_CmsMacroResolver {
/** Key used to specify the current time as macro value. */
public static final String KEY_CURRENT_TIME = "currenttime";
/** Key used to specify the city of the current user as macro value. */
public static final String KEY_CURRENT_USER_CITY = "currentuser.city";
/** Key used to specify the email address of the current user as macro value. */
public static final String KEY_CURRENT_USER_EMAIL = "currentuser.email";
/** Key used to specify the first name of the current user as macro value. */
public static final String KEY_CURRENT_USER_FIRSTNAME = "currentuser.firstname";
/** Key used to specify the full name of the current user as macro value. */
public static final String KEY_CURRENT_USER_FULLNAME = "currentuser.fullname";
/** Key used to specify the last name of the current user as macro value. */
public static final String KEY_CURRENT_USER_LASTNAME = "currentuser.lastname";
/** Key used to specify the username of the current user as macro value. */
public static final String KEY_CURRENT_USER_NAME = "currentuser.name";
/** Key used to specify the street of the current user as macro value. */
public static final String KEY_CURRENT_USER_STREET = "currentuser.street";
/** Key used to specify the zip code of the current user as macro value. */
public static final String KEY_CURRENT_USER_ZIP = "currentuser.zip";
/** Key used to specify the country of the current user as macro value. */
public static final String KEY_CURRENT_USER_COUNTRY = "currentuser.country";
/** Key prefix used to specify the value of a localized key as macro value. */
public static final String KEY_LOCALIZED_PREFIX = "key.";
/** Identifier for "magic" parameter names. */
public static final String KEY_OPENCMS = "opencms.";
/** The prefix indicating that the key represents a page context object. */
public static final String KEY_PAGE_CONTEXT = "pageContext.";
/** The prefix indicating that the key represents a Cms property to be read on the current request URI. */
public static final String KEY_PROPERTY = "property.";
/** The prefix indicating that the key represents a Cms property to be read on the current element. */
public static final String KEY_PROPERTY_ELEMENT = "elementProperty.";
/** Key used to specify the request encoding as macro value. */
public static final String KEY_REQUEST_ENCODING = "request.encoding";
/** Key used to specify the folder of the request uri as macro value. */
public static final String KEY_REQUEST_FOLDER = "request.folder";
/** Key user to specify the request locale as macro value. */
public static final String KEY_REQUEST_LOCALE = "request.locale";
/** The prefix indicating that the key represents a Http request parameter. */
public static final String KEY_REQUEST_PARAM = "param.";
/** Key used to specify the request uri as macro value. */
public static final String KEY_REQUEST_URI = "request.uri";
/** Key used to specify the validation path as macro value. */
public static final String KEY_VALIDATION_PATH = "validation.path";
/** Key used to specify the validation regex as macro value. */
public static final String KEY_VALIDATION_REGEX = "validation.regex";
/** Key used to specifiy the validation value as macro value. */
public static final String KEY_VALIDATION_VALUE = "validation.value";
/** Identified for "magic" parameter commands. */
public static final String[] VALUE_NAME_ARRAY = {"uri", "filename", "folder", "default.encoding"};
/** The "magic" commands wrapped in a List. */
public static final List VALUE_NAMES = Collections.unmodifiableList(Arrays.asList(VALUE_NAME_ARRAY));
/** The log object for this class. */
private static final Log LOG = CmsLog.getLog(CmsMacroResolver.class);
/** A map of additional values provided by the calling class. */
protected Map m_additionalMacros;
/** The OpenCms user context to use for resolving macros. */
protected CmsObject m_cms;
/** The JSP's page context to use for resolving macros. */
protected PageContext m_jspPageContext;
/** Indicates if unresolved macros should be kept "as is" or replaced by an empty String. */
protected boolean m_keepEmptyMacros;
/** The messages resource bundle to resolve localized keys with. */
protected CmsMessages m_messages;
/** The resource name to use for resolving macros. */
protected String m_resourceName;
/**
* Adds macro delimiters to the given input,
* for example <code>key</code> becomes <code>${key}</code>.<p>
*
* @param input the input to format as a macro
*
* @return the input formatted as a macro
*/
public static String formatMacro(String input) {
StringBuffer result = new StringBuffer(input.length() + 4);
result.append(I_CmsMacroResolver.MACRO_DELIMITER);
result.append(I_CmsMacroResolver.MACRO_START);
result.append(input);
result.append(I_CmsMacroResolver.MACRO_END);
return result.toString();
}
/**
* Returns <code>true</code> if the given input String if formatted like a macro,
* that is it starts with <code>{@link I_CmsMacroResolver#MACRO_DELIMITER} +
* {@link I_CmsMacroResolver#MACRO_START}</code> and ends with
* <code>{@link I_CmsMacroResolver#MACRO_END}</code>.<p>
*
* @param input the input to check for a macro
* @return <code>true</code> if the given input String if formatted like a macro
*/
public static boolean isMacro(String input) {
if (CmsStringUtil.isEmpty(input) || (input.length() < 3)) {
return false;
}
return ((input.charAt(0) == I_CmsMacroResolver.MACRO_DELIMITER)
&& (input.charAt(1) == I_CmsMacroResolver.MACRO_START) && (input.charAt(input.length() - 1) == I_CmsMacroResolver.MACRO_END));
}
/**
* Factory method to create a new {@link CmsMacroResolver} instance.<p>
*
* @return a new instance of a {@link CmsMacroResolver}
*/
public static CmsMacroResolver newInstance() {
return new CmsMacroResolver();
}
/**
* Resolves the macros in the given input using the provided parameters.<p>
*
* A macro in the form <code>${key}</code> in the content is replaced with it's assigned value
* returned by the <code>{@link I_CmsMacroResolver#getMacroValue(String)}</code> method of the given
* <code>{@link I_CmsMacroResolver}</code> instance.<p>
*
* If a macro is found that can not be mapped to a value by the given macro resolver,
* it is left untouched in the input.<p>
*
* @param input the input in which to resolve the macros
* @param cms the OpenCms user context to use when resolving macros
* @param messages the message resource bundle to use when resolving macros
*
* @return the input with the macros resolved
*/
public static String resolveMacros(String input, CmsObject cms, CmsMessages messages) {
CmsMacroResolver resolver = new CmsMacroResolver();
resolver.m_cms = cms;
resolver.m_messages = messages;
resolver.m_keepEmptyMacros = true;
return resolver.resolveMacros(input);
}
/**
* Resolves macros in the provided input String using the given macro resolver.<p>
*
* A macro in the form <code>${key}</code> in the content is replaced with it's assigned value
* returned by the <code>{@link I_CmsMacroResolver#getMacroValue(String)}</code> method of the given
* <code>{@link I_CmsMacroResolver}</code> instance.<p>
*
* If a macro is found that can not be mapped to a value by the given macro resolver,
* <code>{@link I_CmsMacroResolver#isKeepEmptyMacros()}</code> controls if the macro is replaced by
* an empty String, or is left untoched in the input.<p>
*
* @param input the input in which to resolve the macros
* @param resolver the macro resolver to use
*
* @return the input with all macros resolved
*/
public static String resolveMacros(final String input, I_CmsMacroResolver resolver) {
if ((input == null) || (input.length() < 3)) {
// macro must have at last 3 chars "${}"
return input;
}
int p = input.indexOf(I_CmsMacroResolver.MACRO_DELIMITER);
if (p == -1) {
// no macro delimiter found in input
return input;
}
int len = input.length();
StringBuffer result = new StringBuffer(len << 1);
int np, pp1, pp2, e;
String macro, value;
boolean keep = resolver.isKeepEmptyMacros();
boolean resolvedNone = true;
// append chars before the first delimiter found
result.append(input.substring(0, p));
do {
pp1 = p + 1;
pp2 = pp1 + 1;
if (pp2 >= len) {
// remaining chars cant be a macro (minumum size is 3)
result.append(input.substring(p, len));
break;
}
// get the next macro delimiter
np = input.indexOf(I_CmsMacroResolver.MACRO_DELIMITER, pp1);
if (np == -1) {
// none found, make sure remaining chars in this segement are appended
np = len;
}
// check if the next char is a "macro start"
if (input.charAt(pp1) == I_CmsMacroResolver.MACRO_START) {
// we have a starting macro sequence "${", now check if this segment contains a "}"
e = input.indexOf(I_CmsMacroResolver.MACRO_END, p);
if ((e > 0) && (e < np)) {
// this segment contains a closing macro delimiter "}", so we have found a macro
macro = input.substring(pp2, e);
// resolve macro
value = resolver.getMacroValue(macro);
e++;
if (value != null) {
// macro was successfully resolved
result.append(value);
resolvedNone = false;
} else if (keep) {
// macro was unknown, but should be kept
result.append(input.substring(p, e));
}
} else {
// no complete macro "${...}" in this segment
e = p;
}
} else {
// no macro start char after the "$"
e = p;
}
// append the remaining chars after the macro to the start of the next macro
result.append(input.substring(e, np));
// this is a nerdy joke ;-)
p = np;
} while (p < len);
if (resolvedNone && keep) {
// nothing was resolved and macros should be kept, return original input
return input;
}
// input was changed during resolving of macros
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -