/*license*\
XBN-Java: Copyright (C) 2014, Jeff Epstein (aliteralmind __DASH__ github __AT__ yahoo __DOT__ com)
This software is dual-licensed under the:
- Lesser General Public License (LGPL) version 3.0 or, at your option, any later version;
- Apache Software License (ASL) version 2.0.
Either license may be applied at your discretion. More information may be found at
- http://en.wikipedia.org/wiki/Multi-licensing.
The text of both licenses is available in the root directory of this project, under the names "LICENSE_lgpl-3.0.txt" and "LICENSE_asl-2.0.txt". The latest copies may be downloaded at:
- LGPL 3.0: https://www.gnu.org/licenses/lgpl-3.0.txt
- ASL 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt
\*license*/
package com.github.xbn.testdev;
import java.util.Iterator;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.io.FileUtils;
import static com.github.xbn.lang.XbnConstants.*;
import com.github.xbn.io.RTIOException;
import com.github.xbn.lang.CrashIfObject;
import com.github.xbn.text.StringWithNullDefault;
import com.github.xbn.text.StringUtil;
import com.github.xbn.regexutil.RegexGroupExtractor;
import com.github.xbn.util.JavaRegexes;
import com.github.xbn.util.JavaRegexUtil;
/**
<p>Application that generates stub functions in an existing java file, containing a {@code /}{@code *stub...stub*}{@code /} block, which contains a series of function signature lines (through-and-including the open curly-brace: '{').</p>
<p>{@code java com.github.xbn.testdev.StubFunctionUtil}</p>
<p>{@code <a href="http://stackoverflow.com/questions/2690118/java-easy-way-to-get-method-stub-out-of-class-files-within-a-jar-file-reflecti">http://stackoverflow.com/questions/2690118/java-easy-way-to-get-method-stub-out-of-class-files-within-a-jar-file-reflecti</a>}</p>
* @since 0.1.0
* @author Copyright (C) 2014, Jeff Epstein ({@code aliteralmind __DASH__ github __AT__ yahoo __DOT__ com}), dual-licensed under the LGPL (version 3.0 or later) or the ASL (version 2.0). See source code for details. <a href="http://xbnjava.aliteralmind.com">{@code http://xbnjava.aliteralmind.com}</a>, <a href="https://github.com/aliteralmind/xbnjava">{@code https://github.com/aliteralmind/xbnjava}</a>
**/
public class StubFunctionUtil {
private StubFunctionUtil() {
throw new IllegalStateException("Do not instantiate");
}
public static final String sSTUB_LINE_MARKER_PREFIX = "/*stub";
private static final RegexGroupExtractor rexFUNC = JavaRegexUtil.newRXForFuncSigLineToRetTypNameAllParams();
public static final void main(String[] as_1Rqd_pathToJavaFile) {
String sPathJava = CompositionStubUtil.get1RqdParamPathToJavaFile(as_1Rqd_pathToJavaFile);
appendForSource(System.out, sPathJava);
System.out.println("FIX: Allow only one stub function.");
System.out.println("FIX: Allow interface sigs");
}
/**
<p>YYY</p>
* @exception RTIOException If an {@link java.io.IOException IOException} is thrown
*/
public static final Appendable appendForSource(Appendable to_appendTo, String sourceCode_path) {
try {
return appendForSourceX(to_appendTo, (new File(sourceCode_path)));
} catch(IOException iox) {
throw new RTIOException("Attempting appendForSourceX(to_appendTo, (new File(sourceCode_path))). sourceCode_path=\"" + sourceCode_path + "\", to_appendTo=[" + to_appendTo + "]", iox);
}
}
/**
<p>YYY</p>
* @exception RTIOException If an {@link java.io.IOException IOException} is thrown
*/
public static final Appendable appendForSource(Appendable to_appendTo, File source_code) {
try {
return appendForSourceX(to_appendTo, source_code);
} catch(IOException iox) {
throw new RTIOException("Attempting appendForSourceX(to_appendTo, source_code). source_code=\"" + source_code + "\", to_appendTo=[" + to_appendTo + "]", iox);
}
}
public static final Appendable appendForSourceX(Appendable to_appendTo, String sourceCode_path) throws IOException {
return appendForSourceX(to_appendTo, (new File(sourceCode_path)));
}
public static final Appendable appendForSourceX(Appendable to_appendTo, File source_code) throws IOException {
CompositionStubUtil.appendJavaFilePathWithDotsNoDtJava(to_appendTo, source_code);
to_appendTo.append(LINE_SEP).append(LINE_SEP);
Iterator<String> li = FileUtils.lineIterator(source_code); //Throws npx if null
String sClassName = null;
while(li.hasNext()) {
String sLn = StringUtil.ltrim(li.next());
if(sLn.startsWith(sSTUB_LINE_MARKER_PREFIX)) {
appendStubsX(to_appendTo, li);
}
}
return to_appendTo;
}
private static final void appendStubsX(Appendable to_appendTo, Iterator<String> line_itr) throws IOException {
Pattern pFuncRettypNmAllParams = Pattern.compile(JavaRegexes.RTRN_TYPE_FNM_ALL_PARAMS);
while(line_itr.hasNext()) {
String sLn = line_itr.next().trim();
Matcher mFuncRettypNmAllParams = pFuncRettypNmAllParams.matcher(sLn);
if(mFuncRettypNmAllParams.find()) {
appendStubForSigLnIfNotAlreadyX(to_appendTo, line_itr, pFuncRettypNmAllParams, mFuncRettypNmAllParams, sLn);
return;
}
}
}
private static final Appendable appendStubForSigLnIfNotAlreadyX(Appendable to_appendTo, Iterator<String> line_itr, Pattern p_funcRettypNmAllParams, Matcher m_funcRettypNmAllParamsFOUND, String func_sigLine) throws IOException {
//Matcher contains a sig line. Is it already stubbed?
String sLnAfterSig = line_itr.next().trim();
Matcher m2 = p_funcRettypNmAllParams.matcher(sLnAfterSig);
if(m2.find()) {
//The next line is also a sig. Stub the first one.
String sReturnType = rexFUNC.search(func_sigLine).next().get(0);
appendStubFuncForSigLineX(to_appendTo, func_sigLine, sReturnType);
return appendStubForSigLnIfNotAlreadyX(to_appendTo, line_itr, p_funcRettypNmAllParams, m2, sLnAfterSig);
}
return to_appendTo;
}
/**
<p>YYY</p>
* @exception RTIOException If an {@link java.io.IOException IOException} is thrown
*/
public static final String getStubFunctionForSigLine(String func_sigLine) {
try {
return appendStubFuncForSigLineX((new StringBuilder()), func_sigLine).toString();
} catch(IOException iox) {
throw new RTIOException("Attempting appendStubFuncForSigLineX((new StringBuilder()), func_sigLine), func_sigLine=\"" + func_sigLine + "\"", iox);
}
}
public static final Appendable appendStubFuncForSigLineX(Appendable to_appendTo, String func_sigLine) throws IOException {
try {
rexFUNC.search(func_sigLine);
} catch(RuntimeException rx) {
throw CrashIfObject.nullOrReturnCause(func_sigLine, "func_sigLine", null, rx);
}
List<String> ls = null;
try {
ls = rexFUNC.next();
} catch(RuntimeException rx) {
throw new RuntimeException("Attempting to parse signature line for return-type, function-name, and all-parameters: \"" + func_sigLine + "\"", rx);
}
String sReturnType = ls.get(0);
return appendStubFuncForSigLineX(to_appendTo, func_sigLine, sReturnType);
}
private static final Appendable appendStubFuncForSigLineX(Appendable to_appendTo, String func_sigLine, String return_type) throws IOException {
to_appendTo.append("\t").append(func_sigLine).append(LINE_SEP);
if(!return_type.equals("void")) {
Object oDefault = JavaRegexUtil.getInitializedObjectForClassName(return_type);
to_appendTo.append("\t\treturn ").
append(StringWithNullDefault.get(oDefault, "null")).append(LINE_SEP);
}
return to_appendTo.append("\t}").append(LINE_SEP);
}
}
/*stub functions for TESTING THIS CLASS...START
public static final void writeStubFunction(String func_sigLine, String return_type) {
public static final String getInitializedObjectForClassName(String type) {
public static final boolean isPrimitiveType(Class<?> class) {
public static final void writeStubFunction(String func_sigLine, String return_type) {
}
stub functions for TESTING THIS CLASS...END*/