/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* 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.
*/
package com.liferay.util.bridges.common;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.CharPool;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import javax.portlet.PortletURL;
/**
* @author Gavin Wan
* @author Brian Wing Shun Chan
* @see org.apache.portals.bridges.common.ScriptPostProcess
*/
public class ScriptPostProcess {
public String getFinalizedPage() {
if (_sb != null) {
return _sb.toString();
}
return StringPool.BLANK;
}
public void postProcessPage(
PortletURL actionURL, String actionParameterName) {
processPage(
"<a", StringPool.GREATER_THAN, "href=", actionURL,
actionParameterName);
processPage(
"<A", StringPool.GREATER_THAN, "HREF=", actionURL,
actionParameterName);
processPage(
"<area", StringPool.GREATER_THAN, "href=", actionURL,
actionParameterName);
processPage(
"<AREA", StringPool.GREATER_THAN, "HREF=", actionURL,
actionParameterName);
processPage(
"<FORM", StringPool.GREATER_THAN, "ACTION=", actionURL,
actionParameterName);
processPage(
"<form", StringPool.GREATER_THAN, "action=", actionURL,
actionParameterName);
}
public void processPage(
String startTag, String endTag, String ref, PortletURL actionURL,
String actionParameterName) {
try {
doProcessPage(
startTag, endTag, ref, actionURL, actionParameterName);
}
catch (Exception e) {
_log.error(e, e);
}
}
public void setInitalPage(StringBundler initialPage) {
_sb = initialPage;
}
protected void doProcessPage(
String startTag, String endTag, String ref, PortletURL actionURL,
String actionParameterName) {
StringBundler sb = new StringBundler();
String content = _sb.toString();
int startTagPos = content.indexOf(startTag);
int endTagPos = 0;
int startRefPos = 0;
int endRefPos = 0;
while (startTagPos != -1) {
sb.append(content.substring(0, startTagPos));
content = content.substring(startTagPos);
endTagPos = content.indexOf(endTag);
startRefPos = content.indexOf(ref);
if ((startRefPos == -1) || (startRefPos > endTagPos)) {
sb.append(content.substring(0, endTagPos));
content = content.substring(endTagPos);
}
else {
startRefPos = startRefPos + ref.length();
sb.append(content.substring(0, startRefPos));
content = content.substring(startRefPos);
String quote = StringPool.BLANK;
if (content.startsWith(StringPool.APOSTROPHE)) {
quote = StringPool.APOSTROPHE;
}
else if (content.startsWith(StringPool.QUOTE)) {
quote = StringPool.QUOTE;
}
String url = StringPool.BLANK;
if (quote.length() > 0) {
sb.append(quote);
content = content.substring(1);
endRefPos = content.indexOf(quote);
url = content.substring(0, endRefPos);
}
else {
endTagPos = content.indexOf(endTag);
endRefPos = 0;
StringBundler unquotedURL = new StringBundler();
while (true) {
char c = content.charAt(endRefPos);
if (!Character.isSpaceChar(c) &&
(endRefPos < endTagPos)) {
endRefPos++;
unquotedURL.append(c);
}
else {
endRefPos--;
break;
}
}
url = unquotedURL.toString();
}
if ((url.charAt(0) == CharPool.POUND) ||
url.startsWith("http")) {
sb.append(url);
sb.append(quote);
}
else {
actionURL.setParameter(actionParameterName, url);
sb.append(actionURL.toString());
sb.append(quote);
}
content = content.substring(endRefPos + 1);
}
startTagPos = content.indexOf(startTag);
}
sb.append(content);
_sb = sb;
}
private static final Log _log = LogFactoryUtil.getLog(
ScriptPostProcess.class);
private StringBundler _sb;
}