/**
* Copyright (C) 2013-2016 The Rythm Engine project
* for LICENSE and other details see:
* https://github.com/rythmengine/rythmengine
*/
package org.rythmengine.internal;
import java.util.regex.Pattern;
/**
* <code>IJavaExtension</code> defines meta structure used by rythm to "extend" an expression.
* <p/>
* This enable rythm to provide the functionality of Java extension concept used in playframework
* http://www.playframework.org/documentation/1.2.4/templates#extensions
* <p/>
* User: luog
* Date: 21/02/12
* Time: 6:41 AM
* To change this template use File | Settings | File Templates.
*/
public interface IJavaExtension {
String extend(String s, String signature);
Pattern pattern1();
Pattern pattern2();
String methodName();
static class VoidParameterExtension implements IJavaExtension {
private String methodName = null;
private String fullMethodName = null;
private Pattern pattern1 = null;
private Pattern pattern2 = null;
private boolean requireTemplate = false;
public VoidParameterExtension(String waiveName, String name, String fullName) {
this(waiveName, name, fullName, false);
}
public VoidParameterExtension(String waiveName, String name, String fullName, boolean requireTemplate) {
methodName = name;
fullMethodName = fullName;
pattern1 = Pattern.compile(String.format(".*(?<!%s)\\.(?i)%s\\s*\\(\\s*\\)\\s*$", waiveName, methodName));
pattern2 = Pattern.compile(String.format("\\.(?i)%s\\s*\\(\\s*\\)\\s*$", methodName));
this.requireTemplate = requireTemplate;
}
@Override
public Pattern pattern1() {
return pattern1;
}
@Override
public Pattern pattern2() {
return pattern2;
}
@Override
public String extend(String s, String signature) {
String ptn = "%s(%s)";
if (requireTemplate) {
ptn = "%s(__template(), %s)";
}
return String.format(ptn, fullMethodName, s);
}
@Override
public String methodName() {
return methodName;
}
}
static class ParameterExtension implements IJavaExtension {
private String methodName = null;
private String fullMethodName = null;
private Pattern pattern1 = null;
private Pattern pattern2 = null;
private boolean requireTemplate = false;
private boolean lastParam = false;
public ParameterExtension(String waiveName, String name, String signature, String fullName) {
this(waiveName, name, signature, fullName, false);
}
public ParameterExtension(String waiveName, String name, String signature, String fullName, boolean requireTemplate) {
this(waiveName, name, signature, fullName, requireTemplate, false);
}
public ParameterExtension(String waiveName, String name, String signature, String fullName, boolean requireTemplate, boolean lastParam) {
methodName = name;
fullMethodName = fullName;
pattern1 = Pattern.compile(String.format(".*(?<!%s)\\.%s\\s*\\((\\s*%s?\\s*)\\)\\s*$", waiveName, methodName, signature));
pattern2 = Pattern.compile(String.format("\\.%s\\s*\\((\\s*%s?\\s*)\\)\\s*$", methodName, signature));
this.requireTemplate = requireTemplate;
this.lastParam = lastParam;
}
@Override
public Pattern pattern1() {
return pattern1;
}
@Override
public Pattern pattern2() {
return pattern2;
}
@Override
public String extend(String s, String signature) {
String ptn = "%s(%s, %s)";
if (requireTemplate) {
ptn = "%s(__template(), %s, %s)";
}
if (lastParam) {
return String.format(ptn, fullMethodName, signature, s);
} else {
return String.format(ptn, fullMethodName, s, signature);
}
}
@Override
public String methodName() {
return methodName;
}
}
}