Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,10 @@ A command-line tool which converts a variety of Struts 1.x tags to their JSTL or
* html:text
* html:textarea
* logic:empty
* logic:equal
* logic:iterate
* logic:notEmpty
* logic:notEqual
* logic:present

...and plenty more to come.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ plugins {
id 'java'
}

version = '0.5'
version = '0.5.0-alpha.2'

repositories {
// Use Maven Central for resolving dependencies.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.rombalabs.strutstospringtoolkit.jspconverter;

import com.rombalabs.strutstospringtoolkit.jspservices.PreProcessor;
import com.rombalabs.strutstospringtoolkit.jspservices.StrutsProcessor;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
Expand Down Expand Up @@ -31,7 +32,10 @@ public static void main(String[] args) {
}
}

var preProcessor = new PreProcessor();
var strutsProcessor = new StrutsProcessor();
strutsProcessor.processFile(args[0], rewriteInPlace);

var outputFile = preProcessor.processFile(args[0], rewriteInPlace);
strutsProcessor.processFile(outputFile, true);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.rombalabs.strutstospringtoolkit.jspservices;

public interface FileProcessor {
String processFile(String filename, boolean rewrite);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.rombalabs.strutstospringtoolkit.jspservices;

import com.rombalabs.strutstospringtoolkit.jspservices.transformers.PreprocessTransformer;
import com.rombalabs.strutstospringtoolkit.jspservices.transformers.preprocessing.AttributeInlineLogicTagTransformer;
import com.rombalabs.strutstospringtoolkit.jspservices.transformers.preprocessing.InlineBeanWriteTagTransformer;
import com.rombalabs.strutstospringtoolkit.jspservices.transformers.preprocessing.InlineScriptletTransformer;
import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.*;
import java.nio.file.CopyOption;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.List;

public class PreProcessor implements FileProcessor {

protected static final Logger logger = LogManager.getLogger();

private final List<PreprocessTransformer> transformers;

public PreProcessor() {
transformers = new ArrayList<>();

// struts:bean transformers
transformers.add(new InlineScriptletTransformer());
transformers.add(new AttributeInlineLogicTagTransformer());
transformers.add(new InlineBeanWriteTagTransformer());
}

@Override
public String processFile(String filename, boolean rewrite) {
var outputPath = filename.replace(".jsp", "_converted.jsp");
logger.info("Loading file " + filename);
logger.info("Storing output in " + (rewrite ? "temporary " : "") + "location: " + outputPath);

try (var reader = new BufferedReader(new FileReader(filename))) {
try (var writer = new BufferedWriter(new FileWriter(outputPath))) {
String line;
while ((line = reader.readLine()) != null) {
var processedLine = processContent(line);
writer.write(processedLine);
writer.newLine();
}
}

if (rewrite) {
File outputFile = new File(outputPath);
FileUtils.copyFile(outputFile, new File(filename));
FileUtils.delete(outputFile);
outputPath = filename;
}

} catch (IOException e) {
logger.error("Failed to load file.", e);
throw new RuntimeException(e);
}

return outputPath;
}

public String processContent(String content) {
String result = content;
for (PreprocessTransformer transformer : transformers) {
result = transformer.processText(content);
if (!result.contentEquals(content)) break;
}

return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@
import java.util.ArrayList;
import java.util.List;

public class StrutsProcessor {
public class StrutsProcessor implements FileProcessor {

public static final Logger logger = LogManager.getLogger();
protected static final Logger logger = LogManager.getLogger();

private final List<TagTransformer> transformers;

Expand All @@ -51,7 +51,8 @@ public StrutsProcessor() {
transformers.add(new IterateTagTransformer());
}

public Document processFile(String filename, boolean rewrite) {
@Override
public String processFile(String filename, boolean rewrite) {
String content;
try {
logger.info("Loading file " + filename);
Expand All @@ -63,9 +64,7 @@ public Document processFile(String filename, boolean rewrite) {

var result = processContent(content);

save(result, filename, rewrite);

return result;
return save(result, filename, rewrite);
}

public Document processContent(String content) {
Expand Down Expand Up @@ -103,7 +102,7 @@ private Element processElement(Element targetElement) {
return targetElement;
}

private void save(Document doc, String originalFileName, boolean rewrite)
private String save(Document doc, String originalFileName, boolean rewrite)
{
try {
if (!rewrite)
Expand All @@ -116,5 +115,7 @@ private void save(Document doc, String originalFileName, boolean rewrite)
} catch (IOException e) {
logger.fatal("Failed to save converted file...", e);
}

return originalFileName;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.rombalabs.strutstospringtoolkit.jspservices.transformers;

import org.jsoup.nodes.Element;

public interface PreprocessTransformer {
String processText(String inputText);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.rombalabs.strutstospringtoolkit.jspservices.transformers.preprocessing;

import com.rombalabs.strutstospringtoolkit.jspservices.transformers.PreprocessTransformer;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.parser.ParseSettings;
import org.jsoup.parser.Parser;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class AttributeInlineLogicTagTransformer implements PreprocessTransformer {

Pattern attributeLogicTagPattern;

public AttributeInlineLogicTagTransformer() {
// <logic:equal (\S+=["|']\S+['|"] ?)+>.*</logic:equal>
attributeLogicTagPattern = Pattern.compile("<logic:equal (\\S+=[\"|']\\S+[\"|'](\\s+)?)+>.*</logic:equal>");
}

@Override
public String processText(String inputText) {
String result = inputText;
Matcher m = attributeLogicTagPattern.matcher(inputText);
if (m.find()) {
Parser parser = Parser.xmlParser();
parser.settings(new ParseSettings(true, true)); // tag, attribute preserve case
Document doc = Jsoup.parse(m.toMatchResult().group(),"", parser);

var elString = convertElement(doc.root().child(0), "");

result = m.replaceAll(elString);
}

return result;
}

protected String convertElement(Element element, String newTagName) {
var name = element.attr("name");
var property = element.attr("property");
var value = element.attr("value");
var content = element.text();

return createExpressionLanguageString(name, property, value, content);
}

private static String createExpressionLanguageString(String name, String property, String value, String content) {
var elString = name +
(!name.isEmpty() && !property.isEmpty() ? "." : "") +
property;

if (!value.contentEquals("true")) {
elString = elString + " eq " + value;
}

return " \\${" + elString + " ? '" + content + "' : ''}";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.rombalabs.strutstospringtoolkit.jspservices.transformers.preprocessing;

import com.rombalabs.strutstospringtoolkit.jspservices.transformers.PreprocessTransformer;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.parser.ParseSettings;
import org.jsoup.parser.Parser;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class InlineBeanWriteTagTransformer implements PreprocessTransformer {

Pattern beanWritePattern;

public InlineBeanWriteTagTransformer() {
beanWritePattern = Pattern.compile("<bean:write\\s+(\\S+=['|\"]\\S+['|\"]' ?)+\\s+/>");
}

@Override
public String processText(String inputText) {
String result = inputText;
Matcher m = beanWritePattern.matcher(inputText);
if (m.matches()) {
Parser parser = Parser.xmlParser();
parser.settings(new ParseSettings(true, true)); // tag, attribute preserve case
Document doc = Jsoup.parse(m.toMatchResult().group(),"", parser);

result = convertElement(doc.root().child(0));
}

return result;
}

protected String convertElement(Element element) {
var name = element.attr("name");
var property = element.attr("property");
var filter = ("true".equals(element.attr("filter")));

return createExpressionLanguageString(name, property, filter);
}

private static String createExpressionLanguageString(String name, String property, boolean filter) {
var elString = name +
(!name.isEmpty() && !property.isEmpty() ? "." : "") +
property;

if (filter) {
elString = "fn:escapeXml(" + elString + ")";
}

return "${" + elString + "}";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package com.rombalabs.strutstospringtoolkit.jspservices.transformers.preprocessing;

import com.rombalabs.strutstospringtoolkit.jspservices.transformers.PreprocessTransformer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class InlineScriptletTransformer implements PreprocessTransformer {

protected static final Logger logger = LogManager.getLogger();

Pattern initialRequestPattern;
Pattern requestAttributePattern;
Pattern requestParameterPattern;
Pattern requestParameterValuesPattern;
Pattern requestHeaderPattern;
Pattern requestHeaderValuesPattern;
Pattern requestContextPathPattern;
Pattern sessionAttributePattern;

public InlineScriptletTransformer() {
initialRequestPattern = Pattern.compile("<%=(\\s+)?request\\.get\\S+\\((\\S+)?\\)(\\s+)?%>");
requestAttributePattern = Pattern.compile("<%=(\\s+)?request\\.getAttribute\\(\"(\\S+)\"\\)(\\s+)?%>");
requestParameterPattern = Pattern.compile("<%=(\\s+)?request\\.getParameter\\(\"(\\S+)\"\\)(\\s+)?%>");
requestParameterValuesPattern = Pattern.compile("<%=(\\s+)?request\\.getParameterValues\\(\"(\\S+)\"\\)(\\s+)?%>");
requestHeaderPattern = Pattern.compile("<%=(\\s+)?request\\.getHeader\\(\"(\\S+)\"\\)(\\s+)?%>");
requestHeaderValuesPattern = Pattern.compile("<%=(\\s+)?request\\.getHeaderValues\\(\"(\\S+)\"\\)(\\s+)?%>");
requestContextPathPattern = Pattern.compile("<%=(\\s+)?request\\.getContextPath\\(\\)(\\s+)?%>");

sessionAttributePattern = Pattern.compile("<%=(\\s+)?request\\.getSession\\(\\)\\.getAttribute\\(\"(\\S+)\"\\)(\\s+)?%>");
}
@Override
public String processText(String inputText) {
String result = inputText;
Matcher m = initialRequestPattern.matcher(inputText);
if (m.find()) {
/*
https://balusc.omnifaces.org/2011/09/communication-in-jsf-20.html#ImplicitELObjects
#{requestScope}: the current request attribute map
#{viewScope}: the current view attribute map
#{sessionScope}: the current session attribute map
#{param}: the current request parameter map
#{paramValues}: the current request parameter values map
#{header}: the current request header map
#{headerValues}: the current request header values map
#{cookie}: the current request cookie map
*/

m = requestAttributePattern.matcher(inputText);
result = m.replaceAll("\\${requestScope.$1}");

m = requestParameterPattern.matcher(result);
result = m.replaceAll("\\${param.$1}");

m = requestParameterValuesPattern.matcher(result);
result = m.replaceAll("\\${paramValues.$1}");

m = requestHeaderPattern.matcher(result);
result = m.replaceAll("\\${header[$1]}");

m = requestHeaderValuesPattern.matcher(result);
result = m.replaceAll("\\${headerValues[$1]}");

m = requestContextPathPattern.matcher(result);
result = m.replaceAll("\\${pageContext.request.contextPath}");

m = sessionAttributePattern.matcher(result);
result = m.replaceAll("\\${sessionScope[\1]}");
}

return result;
}
}
Loading