{{error}}
{{(quickSearchResults.length>10)?'10+':(quickSearchResults.length)}} {{(quickSearchResults.length==1)?'result':'results'}}
{{result.title}} {{result.timeStamp | mysql2ymd }}
I am sorry, no such article was written yet.
2017-02-21
How to hide Spock stack traces when running tests written in Groovy.
2 files attached: IgnoreStackraceElements.groovy MyException.java
IgnoreStackraceElements.groovy
static {
        StackTraceUtils.addClassTest({ String className ->
            if (className.startsWith("org.spockframework.")) return false;
            return null;
        });
    }
MyException.java
import org.codehaus.groovy.runtime.StackTraceUtils;
public class MyException extends RuntimeException {
    public MyException(String message, Object... suppressed) {
        super(message);
        for (Object t : suppressed)
            if (t instanceof Throwable) this.addSuppressed(StackTraceUtils.deepSanitize((Throwable) t));
        StackTraceUtils.deepSanitize(this);
    }
}
Scala JSON Comparator
4 files attached: JsonComparator.scala left.json right.json output.txt
JsonComparator.scala
import scala.io.Source
import scala.util.parsing.json._

object JsonComparator {
  def compare(left: Any, right: Any, path: java.lang.String = ""): List[String] = (left, right) match {
    case (l: Number, r: Number) => if (l == r) Nil else s"$path: $l != $r" :: Nil
    case (l: String, r: String) => if (l == r) Nil else s"$path: $l != $r" :: Nil
    case (l: Set[_], r: Set[_]) => if (l == r) Nil else s"$path: $l != $r" :: Nil
    case (l: List[_], r: List[_]) =>
      if (l == r) Nil
      else if (l.length != r.length) s"$path.length: ${l.length} vs. ${r.length}" :: Nil
      else l.indices.toList.filter(it => l(it) != r(it)).flatMap(it => compare(l(it), r(it), s"$path[$it]"))
    case (l: Map[String, _], r: Map[String, _]) =>
      if (l == r) Nil
      else if (l.size != r.size) s"$path.count: ${l.size} != ${r.size}" :: Nil
      else if (l.keySet != r.keySet) s"$path.keys: ${l.keySet} != ${r.keySet}" :: Nil
      else l.keySet.toList.filter(it => l(it) != r(it)).flatMap(it => compare(l(it), r(it), s"$path/$it"))
    case _ =>
      s"$path: $left[${if (left == null) left else left.getClass}] vs. $right[${if (right == null) right else right.getClass}]" :: Nil
  }

  def main(args: Array[java.lang.String]): Unit = {
    val left = JSON.parseFull(Source.fromResource("left.json").mkString)
    val right = JSON.parseFull(Source.fromResource("right.json").mkString)
    compare(left.get, right.get).foreach(println)
    compare(left.get, left.get).foreach(println)
  }
}
left.json
{"node1": [1, 2, ["q","w"], "e"], "node2": {"node3": "value4","null": null}, "node3": 3, "node4": 4, "node5": 5.5}
right.json
{"node1": [1, "3", ["q", "w", 0], "e"], "node2": {"node3": "value4", "null": "null"}, "node3": "3", "node4": 4, "node5": 5.6}
output.txt
/node1[1]: 2.0[class java.lang.Double] vs. 3[class java.lang.String]
/node1[2].length: 2 vs. 3
/node3: 3.0[class java.lang.Double] vs. 3[class java.lang.String]
/node2/null: null[null] vs. null[class java.lang.String]
/node5: 5.5 != 5.6
More compact of generic node filtering in browser
"abc" - shows only those containing "abc".
"abc def" - shows only those containing both, "abc", and "def".
"abc !def" - shows those containing "abc" and do not contain "def".
"ab|cd !ef|gh" - shows those that contain "ab" or "cd" and don't contain "ef", either "gh".
1 files attached: filterNodes.js
filterNodes.js
function filterNodes(jQuerySet,value){
	let strContainsAnyOf=(haystack,needle)=>!needle.every(it=>haystack.indexOf(it)<0)
	var count=0;
	value=String(value).toUpperCase();
	var values=value.split(" ").map(it=>unescape(it)).filter(it=>it!='').filter(it=>it!='!');
	let expectations={}
	for(let value of values)
		(value[0]=='!')?(expectations[value.substr(1)]=false):expectations[value]=true;
	for(let node of jQuerySet.toArray()){
		var nodeValue=(''+node.innerHTML).toUpperCase().replace(/<[^>]+>/g, '');
		var visible=true;
		for(let value in expectations)
			if(expectations[value]!=strContainsAnyOf(nodeValue,value.split("|")))visible=false;
		$(node)[['hide','show'][1&visible]]();
		count+=visible;
	}
	return count;
}
Browser singletons - how to ensure a script is loaded only once
Browser singletons - how to ensure a script is loaded only once
1 files attached: require_once.js
require_once.js
window[Symbol.for('d1702070851-LESS loaded')]||addResource("//cdnjs.cloudflare.com/ajax/libs/less.js/2.5.1/less.min.js","js");
	window[Symbol.for('d1702070851-LESS loaded')]=true;
How to simply add less scripts to the web pages (without server-side compilation)
2 files attached: headerManipulation.js sample.js
headerManipulation.js
function createNode(nodeName,attributes){
	var node=document.createElement(nodeName);
	for(var k in attributes)
		node.setAttribute(k,attributes[k]);
	document.getElementsByTagName('head')[0].appendChild(node);
}
function addResource(path,extension){
	if(extension=='css')return createNode('link',{rel:'stylesheet',type:'text/css',href:path});
	if(extension=='js')return createNode('script',{src:path});
	if(extension=='less')return createNode('link',{rel:'stylesheet',type:'text/less',href:path});
	throw "Extension not supported: "+extension;
}
sample.js
addResource('https://w01bagdc/chromeExtension/<%domain%>.less','less');
addResource("//cdnjs.cloudflare.com/ajax/libs/less.js/2.5.1/less.min.js","js");
Simple function to select an HTML node on clicking (works on Chrome)
Simple function to select an HTML node on clicking (works on Chrome)
1 files attached: selectText.js
selectText.js
function selectText(element) {
    var selection = window.getSelection();
    var range = document.createRange();
    range.selectNodeContents(element);
    selection.removeAllRanges();
    selection.addRange(range);
}
Self-generated certificate for Java HTTPS socket
Step 1:
Run the key_generator.cmd by putting the machine name for the first/last name.
2 files attached: key_generator.cmd HttpsConfigurator.java
key_generator.cmd
set path=%path%;"c:\Program Files\Java\<jdk>\bin"
keytool -genkey -keyalg RSA -alias <host> -keystore <host>.jks -storepass <host> -validity 360 -keysize 2048 -ext SAN=dns:<host>
keytool -v -export -file <host>.cer -keystore <host>.jks -alias <host>
HttpsConfigurator.java
InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), port);
com.sun.net.httpserver.HttpsServer httpsServer = com.sun.net.httpserver.HttpsServer.create(address, 0);
SSLContext sslContext = SSLContext.getInstance("TLS");
char[] password = "<host>".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
// keytool -genkey -keyalg RSA -alias HOSTNAME -keystore HOSTNAME.jks -storepass HOSTNAME -validity 360 -keysize 2048 -ext SAN=dns:<host>
// keytool -v -export -file HOSTNAME.cer -keystore HOSTNAME.jks -alias HOSTNAME
FileInputStream fis = new FileInputStream("c:\\<path>\\<host>.jks");
ks.load(fis, password);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, "<host>".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
httpsServer.setHttpsConfigurator(new HttpsConfigurator(sslContext) {
	public void configure(HttpsParameters params) {
		try {
			SSLContext c = SSLContext.getDefault();
			SSLEngine engine = c.createSSLEngine();
			params.setNeedClientAuth(false);
			params.setCipherSuites(engine.getEnabledCipherSuites());
			params.setProtocols(engine.getEnabledProtocols());
			SSLParameters defaultSSLParameters = c.getDefaultSSLParameters();
			params.setSSLParameters(defaultSSLParameters);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
});
HttpHandler handler = new HttpHandler(""+port);
httpsServer.createContext("/", handler);
ExecutorService executor = Executors.newFixedThreadPool(50);
httpsServer.setExecutor(executor);
httpsServer.start();
JUnit runner multiple levels test organization
Draft of a JUnit test executor that allows grouping tests on arbitrary deep tree.
3 files attached: SorescuParametrized.java TestData.java TestClass.java
SorescuParametrized.java
package eu.sorescu.junit;

import org.junit.runner.Runner;
import org.junit.runners.Parameterized;
import org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParametersFactory;
import org.junit.runners.parameterized.ParametersRunnerFactory;
import org.junit.runners.parameterized.TestWithParameters;

import java.util.*;
import java.util.stream.Collectors;

import org.junit.runners.model.FrameworkMethod;

public class SorescuParameterized extends Parameterized {

    @SuppressWarnings("unused")
    public SorescuParameterized(Class<?> klass) throws Throwable {
        this(klass, 0, null, klass.getSimpleName());
    }

    public String getName() {
        return this.name;
    }

    private final String name;

    public SorescuParameterized(Class<?> klass, final int depth, List<TestData> subset, String name) throws Throwable {
        super(klass);
        this.name = System.identityHashCode(this) + "." + name + "a.b.c.d" + "." + name;
        if (subset == null) subset = (List<TestData>) this.getParametersMethod().invokeExplosively(null);
        if (depth >= 3) {
            runners = Collections.unmodifiableList(createRunnersForParameters(subset));
        } else {
            runners = new ArrayList<>();
            HashMap<Object, List<TestData>> hashParameters = new HashMap<>();
            for (TestData vector : subset) {
                String key = String.valueOf(vector.segments.get(depth));
                if (!hashParameters.containsKey(key))
                    hashParameters.put(key, new ArrayList<>());
                hashParameters.get(key).add(vector);
            }
            try {
                for (Object key : hashParameters.keySet())
                    runners.add(new SorescuParameterized(klass, depth + 1, hashParameters.get(key), String.valueOf(key)));
            } catch (Throwable throwable) {
                throw new RuntimeException(throwable);
            }
        }
    }

    private static final ParametersRunnerFactory DEFAULT_FACTORY = new BlockJUnit4ClassRunnerWithParametersFactory();
    private final List<Runner> runners;

    protected List<Runner> getChildren() {
        return this.runners;
    }

    private FrameworkMethod getParametersMethod() throws Exception {
        List<FrameworkMethod> methods = this.getTestClass().getAnnotatedMethods(Parameterized.Parameters.class);
        Optional<FrameworkMethod> method = methods.stream().filter(it -> it.isStatic() && it.isPublic()).findAny();
        return method.orElseThrow(() -> new Exception("No public static parameters method on class " + this.getTestClass().getName()));
    }

    private List<Runner> createRunnersForParameters(List<TestData> allParameters) throws Exception {
        ArrayList<Runner> runners = new ArrayList<>();
        for (Object test : this.createTestsForParameters(allParameters))
            runners.add(DEFAULT_FACTORY.createRunnerForTestWithParameters((TestWithParameters) test));
        return runners;
    }

    private List<TestWithParameters> createTestsForParameters(List<TestData> allParameters) throws Exception {
        int i = 0;
        ArrayList<TestWithParameters> children = new ArrayList<>();
        for (TestData parametersOfSingleTest : allParameters) {
            children.add(_createTestWithParameters(this.getTestClass(), ++i, parametersOfSingleTest));
        }
        return children;
    }

    private TestWithParameters _createTestWithParameters(org.junit.runners.model.TestClass testClass, int index, TestData parameters) {
        String name = "" + index + "." + parameters.segments.stream().map(String::valueOf).collect(Collectors.joining());
        return new TestWithParameters("[" + name + "]", testClass, Collections.singletonList(parameters));
    }
}
TestData.java
package eu.sorescu.junit;

import java.util.ArrayList;
import java.util.List;

public class TestData {
    List<Object>segments;
    public TestData(Object[] segments) {
        this.segments = new ArrayList();
        for (Object s : segments)
            this.segments.add(s);
    }

    public List<Object> getSegments() {
        return segments;
    }
}
TestClass.java
package eu.sorescu.junit

import groovy.transform.CompileStatic
import groovy.transform.TypeChecked
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized

@RunWith(SorescuParameterized)
@TypeChecked @CompileStatic
public class TestClass {
    private  TestData td;
    public TestClass(TestData td){
        this.td=td;
    }
    @Parameterized.Parameters(name='{index} {0} {1}')
    public static List<Object[]> data() {
        def a=[]
        for(def i=0;i<9;i++) {
            a.add(new TestData(i, i + 1, i + 2,i+4))
            a.add(new TestData(i, i + 1, i + 3,i+4))
            a.add(new TestData(i, i + 2, i + 4,i+4))
        }
        return a
    }

    @Test
    public void f1() {
        if(td.segments.get(1).equals(2))throw new RuntimeException("EEE"+td.segments.get(1));
        println "testRun f1 "+td.segments
    }
    @Test
    public void f2() {
        println "testRun f2 "+td.segments
    }
}
Basic POM for fast Groovy/Java compilation in IDEA
The speed is accomplished by using the Eclipse Groovy compiler for Java code (in one single process, without waiting for Groovy stub generation).
1 files attached: pom.xml
pom.xml
Groovy XLSX reader
1 files attached: XlsxReader.groovy
XlsxReader.groovy
package eu.sorescu

import groovy.transform.Memoized
import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;
import java.util.zip.ZipFile;

class XlsxReader {
    ZipFile zf;

    public XlsxReader(File file) { this.zf = new ZipFile(file); }

    public Node getXml(String path) throws IOException, ParserConfigurationException, SAXException {
        new XmlParser(false, false).parse(zf.getInputStream(zf.getEntry(path)))
    }

    @Memoized
    public String[] getSharedStrings() {
        return this.getXml("xl/sharedStrings.xml").si*.t*.text()
    }

    public ArrayList<String> getSheetNames() throws IOException {
        return this.getXml("xl/workbook.xml").sheets.sheet*.'@name'
    }

    @Memoized
    public static int[] l2c(String l) {
        String letters = l.replaceAll(/\d+/, '')
        int row = (l.replaceAll(/[^\d]+/, '') as int) - 1
        if (letters.length() == 1) return [row, letters.codePointAt(0) - 65];
        if (letters.length() == 2) return [row, (letters.codePointAt(1) - 64) * 26 + (letters.codePointAt(0) - 65)]
        throw new RuntimeException("Not supported: " + letters)
    }

    public List<List<String>> getSheet(String sheetName) {
        def rid = this.getXml("xl/workbook.xml").sheets.sheet.find { it.'@name' == sheetName }.'@r:id'
        String sheetPath = this.getXml("xl/_rels/workbook.xml.rels").Relationship.find { it.'@Id' == rid }.'@Target'
        List<List<String>> result = new ArrayList<>();
        def res = this.getXml('xl/' + sheetPath)
        res.sheetData.row.each { row ->
            row.c.each { c ->
                if (c.v) {
                    int[] coordinates = l2c(c.'@r' as String)
                    String value = c.v.text()
                    if (c.'@t' == 's') value = sharedStrings[value as int]
                    try {
                        if (!result[coordinates[0]]) result[coordinates[0]] = []
                        result[coordinates[0]][coordinates[1]] = String.valueOf(value).intern()
                    } catch (Throwable ignored) {
                        println sheetName + " " + sheetPath + " " + coord + " " + value
                    }
                }
            }
        }
        for (int i = 0; i < result.size(); i++)
            result[i] = result[i] ?: []
        return result
    }
}