If you are compiling your Apache Tapestry application inside IntelliJ IDEA your class files will end up in the wrong directory and therefore Tapestry will not pick up the changes via live class-reloading. Solution: change the build output directories in your build.gradle file.

idea {
  module {
    inheritOutputDirs = false
    outputDir = file("build/classes/main")
    testOutputDir = file('build/classes/test')
  }
}

tl;dr: If gradle jettyRun fails because of the port still being in use from a prior execution-> configure and use the jettyStop task before by changing your build.gradle.

jettyRun {
    stopKey = "tapJettyStop"
    stopPort = 9087
}

jettyStop {
    stopKey = "tapJettyStop"
    stopPort = 9087
}

jettyRun.dependsOn jettyStop

While developing Apache Tapestry-WebApps with the IntelliJ IDEA-IDE, i couldn’t stop the running the gradle task jettyRun. IDEA seems to run the gradle-task as a daemon in the background. Stopping the task execution from IDEA resulted in jetty still running in the background. To solve this, the gradle jetty plugin brings the task jettyStop, but this doesn’t work out-of-the-box. You have to configure stopKey and stopPort properties to somewhat “connect” the two tasks (jettyStop needs to know which jetty instance to stop). Now it is sufficent to only execute jettyRun. jettyStop is executed automatically prior to every execution of jettyRun.

I use the open source mindmapping software freeplane on a day to day basis. Because of its java nature the gui tends to cause a little bit of eye strain for the spoiled average mac / apple user, but the rich feature set makes up for that! Freeplane has an integrated scripting api which can be used to freely manipulate the nodes, attributes and connections of a mindmap with javascript or groovy.

I recently had the need to paste mindmap structures into a redmine wiki (which uses the textile markup) and groovy was still on my “look into it soon”-list. So i took the chance.

Here’s the gist:
-> Most recent version on github

import javax.swing.*;

/*
*	Export Freeplane mindmap branch to nested list in textile format e.g. for use in Redmine wiki
*	- Save as <filename>.groovy in <freeplane directory>/scripts/
	- Select node and start script from menu: Tools -> Scripts -> <filename>
*
*/

def process(thisNode, childPosition) {
		def result =""
		result = prefix(childPosition)+thisNode.text+suffix(childPosition)
    	thisNode.children.each {
        result += process(it, childPosition + 1)
		
    
    }
    return result
}
 
def showDialog(String text) {
    def dialog = new JDialog(ui.frame)
    dialog.setSize(500, 700)
    dialog.setLocationRelativeTo(ui.frame)
    dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE)
    dialog.add(new JScrollPane(new JTextArea(text)))
    ui.addEscapeActionToDialog(dialog)
    dialog.visible = true
}

def prefix(position){
	if(position == 0){
		return "h1. "
	} else if (position == 1){
		return "\nh2. "
	} else {
		return "*".multiply(position-1)+" "
	}
}

def suffix(position){
	if(position == 0){
		return "\n"
	} else if (position == 1){
		return "\n\n"
	} else {
		return "\n"
	}
}
def output = process(node, 0);

showDialog(output)