package org.vaadin.tori.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.log4j.Logger;
import com.liferay.portal.kernel.exception.NestableException;
import com.liferay.portlet.messageboards.model.MBMessage;
import com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil;
public class LiferayUrlConverter implements UrlConverter {
private static final String URL_PREFIX = "/#!/";
private static final String CATEGORIES = URL_PREFIX + "category/";
private static final String THREADS = URL_PREFIX + "thread/";
@Override
public String convertUrlToToriForm(final String url) {
return convertAllUrlsToToriForm(url);
}
public static String convertAllUrlsToToriForm(final String text) {
String result = replaceMessageBoardsLinksCategories(text);
result = replaceMessageBoardsLinksMessages(result);
return result;
}
private static final Pattern CATEGORY_LINK_60_PATTERN = Pattern.compile(
"/-/message_boards\\?[_,\\d]+mbCategoryId=\\d+",
Pattern.CASE_INSENSITIVE);
private static final Pattern CATEGORY_LINK_62_PATTERN = Pattern.compile(
"/-/message_boards/category/\\d+", Pattern.CASE_INSENSITIVE);
private static String replaceMessageBoardsLinksCategories(
final String bodyRaw) {
String body = bodyRaw;
// Liferay 6.0 pattern
final Matcher matcher = CATEGORY_LINK_60_PATTERN.matcher(body);
while (matcher.find()) {
final String group = matcher.group();
final String category = "mbCategoryId=";
final String categoryIdString = group.substring(group
.indexOf(category) + category.length());
final String fragment = CATEGORIES + categoryIdString;
body = body
.replaceFirst(group.replaceAll("\\?", "\\\\?"), fragment);
}
// Liferay 6.1/6.2 pattern
final Matcher matcher61 = CATEGORY_LINK_62_PATTERN.matcher(body);
while (matcher61.find()) {
final String group = matcher61.group();
final String categoryIdString = group.substring(group
.lastIndexOf('/') + 1);
final String fragment = CATEGORIES + categoryIdString;
body = body.replaceFirst(group, fragment);
}
return body;
}
private static final Pattern MESSAGE_LINK_PATTERN = Pattern.compile(
"/-/message_boards/(view_)?message/\\d+(#[_,\\d]+message_\\d+)?",
Pattern.CASE_INSENSITIVE);
private static String replaceMessageBoardsLinksMessages(final String bodyRaw) {
String body = bodyRaw;
final Matcher matcher = MESSAGE_LINK_PATTERN.matcher(body);
while (matcher.find()) {
final String group = matcher.group();
String messageIdString = group
.substring(group.lastIndexOf('/') + 1);
if (messageIdString.contains("#")) {
messageIdString = messageIdString.substring(0,
messageIdString.indexOf('#'));
}
long messageId = Long.parseLong(messageIdString);
try {
final MBMessage message = MBMessageLocalServiceUtil
.getMBMessage(messageId);
final long threadId = message.getThreadId();
final String messagePrefix = "_message_";
final int messageIdIndex = group.indexOf(messagePrefix);
if (messageIdIndex > -1) {
messageId = Long.parseLong(group.substring(messageIdIndex
+ messagePrefix.length()));
}
final String fragment = THREADS + threadId + "/" + messageId;
body = body.replaceFirst(group, fragment);
} catch (final NestableException e) {
getLogger()
.warn("Unable to get MBmessage for id: " + messageId);
}
}
return body;
}
private static Logger getLogger() {
return Logger.getLogger(LiferayUrlConverter.class);
}
}