Tuesday, November 10, 2009

Xquery to mask CreditCard number

declare function local:maskString($input as xs:string, $numClearDigits as xs:int)
as xs:string{
let $len := fn:string-length($input)
let $maskLen := $len - $numClearDigits
let $clearText := fn:substring($input, $maskLen+1)
let $mask := fn:string-join (
(for $i in (1 to $maskLen) return "X", $clearText)
,'')
return
$mask
};

Detect Java method name from code

http://www.rgagnon.com/javadetails/java-0420.html

JDK1.4
public class MyTest {
public static void main(String args[]) {
new MyTest().doit();
}
public void doit() {
System.out.println
(new Exception().getStackTrace()[0].getMethodName());
}
}
The output
doit

JDK1.5
While the above snippet is not bad, it is expensive since we need to create an Exception.
With JDK1.5, a new technique is available.

public class Test {
public static void main(String args[]) {
trace(Thread.currentThread().getStackTrace());
new Test().doit();
trace(Thread.currentThread().getStackTrace());
}
public void doit() {
trace(Thread.currentThread().getStackTrace());
doitagain();
}
public void doitagain() {
trace(Thread.currentThread().getStackTrace());
}

public static void trace(StackTraceElement e[]) {
boolean doNext = false;
for (StackTraceElement s : e) {
if (doNext) {
System.out.println(s.getMethodName());
return;
}
doNext = s.getMethodName().equals("getStackTrace");
}
}
}

Output
main
doit
doitagain
main