QcMylyn 0.2.7 is out!
The QC Mylyn Team proudly presents the 0.2.7 Release …
We need Feedback!
The QC Mylyn Team proudly presents the 0.2.7 Release …
We need Feedback!
Until now I don’t notice this:
According to the book ‘Core JSF Programming’, the method that is binded to ‘actionListener’ attribute in component tag will always been invoked earlier than the method of <f:actionListener>. In my opinion, <f:setPropertyActionListener> is a kind of <f:actionListener>. Therefore, its method will not be invoked until ‘actionListener’ attribute method finished. I have made a test and it proved my guess.
Found here.
Ließ bei Foodwatch nach …
In real world applications we have all too often external dependencies in test cases. Sometimes theses third party are not always available (i.e. remote webservices).
For continuous integration I want check a minimal set of tests but for my local development i want check a maximal set of tests. I want run my tests on command line (via maven) and in eclipse (via testng-plugin).
Here is my idea to do that …
My project super pom defines 2 profiles:
<profiles>
<profile>
<id>test-min</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<inherited>true</inherited>
<configuration>
<excludedGroups>${excludedTestGroups}</excludedGroups>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>test-max</id>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<inherited>true</inherited>
<configuration>
<suiteXmlFiles>
${basedir}/src/test/resources/Testsuite.xml
</suiteXmlFiles>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<properties>
<excludedTestGroups>online,integration,thirdparty</excludedTestGroups>
</properties>
Each subproject must define a testng src/test/resources/Testsuite.xml:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestSuite for Foobar">
<test name="Online Tests">
<packages>
<package name="de.foobar.*" />
</packages>
<groups>
<run>
<include name="online" />
</run>
</groups>
</test>
<test name="Integration Tests">
<packages>
<package name="de.foobar.*" />
</packages>
<groups>
<run>
<include name="integration" />
</run>
</groups>
</test>
<test name="Thirdparty Tests">
<packages>
<package name="de.foobar.*" />
</packages>
<groups>
<run>
<include name="thirdparty" />
</run>
</groups>
</test>
<!-- Each project can define MORE groups: i.e. "interactive" -->
<test name="Other Tests">
<packages>
<package name="de.foobar.*" />
</packages>
<groups>
<run>
<exclude name="online" />
<exclude name="integration" />
<exclude name="thirdparty" />
<!-- Each project can define MORE groups: i.e. "interactive" -->
</run>
</groups>
</test>
</suite>
If the sub project defines more exclude groups (i.e. a additional “interactive” group) then the pom must overwrite the excludedTestGroups property:
<properties> <excludedTestGroups>online,integration,thirdparty,interactive</excludedTestGroups> </properties>
To check the correct configuration of the two profiles we can use help:effective-pom:
mvn -Ptest-min help:effective-pom | less
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludedGroups>online,integration,thirdparty,interactive</excludedGroups>
</configuration>
</plugin>
mvn -Ptest-max help:effective-pom | less
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>d:\foobar\src/test/resources/Testsuite.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
Now I can run min/max tests for each project which depend on the above super-pom. The test-min is the default profile and would be used on the continuous integration system (i.e. TeamCity).
Try it
For a private project I try to use nexus behind apache and ssl. I used a self-signed certificate.
But each nexus repository request ends with a security exception:
[WARNING] repository metadata for: 'artifact org.apache.maven.plugins:maven-enforcer-plugin' could not be retrieved from repository: nexus-plugin-releases due to an error: Error transferring file: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
I found many site for that problem and they describe always the same solution
import the self signed cert in your local truststore!
… here are the steps:
The import is simple (java keytool):
keytool.exe -importcert
-alias nexus-xxx
-keystore xxx.jks
-storepass secret
-file xxx.crt
For maven I’m using a cygwin bash alias:
alias mvn_xxx='/cygdrive/d/maven-2.2.1/bin/mvn -gs "d:/maven-2.2.1/conf/settings-xxx.xml" -s "d:/maven-2.2.1/conf/settings-xxx.xml" -Djavax.net.ssl.trustStore=d:/maven-2.2.1/conf/xxx.jks -Djavax.net.ssl.trustStorePassword=secret'
I point the global config (-gs) and the personal config (-s) to the same file to ignore other configuration from my default maven config file (i.e. common mirros settings / repositories etc.).
And at least here is my complete maven setting-nexus settings:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/settings/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>D:\maven-repository-xxx</localRepository>
<mirrors>
<mirror>
<id>xxx-nexus-snapshots</id>
<mirrorOf>nexus-snapshots</mirrorOf>
<url>https://nexus.xxx.com/content/groups/public-snapshots/</url>
</mirror>
<mirror>
<id>xxx-nexus-snapshots</id>
<mirrorOf>nexus-plugin-snapshots</mirrorOf>
<url>https://nexus.xxx.com/content/groups/public-snapshots/</url>
</mirror>
<mirror>
<id>xxx-nexus-releases</id>
<mirrorOf>nexus-releases</mirrorOf>
<url>https://nexus.xxx.com/content/groups/public/</url>
</mirror>
<mirror>
<id>xxx-nexus-releases</id>
<mirrorOf>nexus-plugin-releases</mirrorOf>
<url>https://nexus.xxx.com/content/groups/public/</url>
</mirror>
<mirror>
<id>xxx-nexus-releases</id>
<mirrorOf>*</mirrorOf>
<url>https://nexus.xxx.com/content/groups/public/</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>xxx-nexus-mirror</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>nexus-releases</id>
<url>http://foobar</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>nexus-snapshots</id>
<url>http://foobar</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus-plugin-releases</id>
<url>http://foobar</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>nexus-plugin-snapshots</id>
<url>http://foobar</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<servers>
<server>
<id>xxx-nexus-releases</id>
<username>foo</username>
<password>bar</password>
</server>
<server>
<id>xxx-nexus-snapshots</id>
<username>foo</username>
<password>bar</password>
</server>
</servers>
</settings>
You can replace xxx with your personal domain-alias.
Each input dialog should have a default action for good useability.
If the user hit ‘Enter’ then the default action should execute.
Here is my example of a richfaces modal edit dialog for such a requirement …
The dialog have input fields and 3 actions:
<rich:modalPanel id="edit_dialog">
<a4j:form id="edit_form" ajaxSubmit="true">
<h:outputLabel value="What's your title:" for="title"/>
<h:inputText id="title" value="#{bean.title}"/>
<h:outputLabel value="What's your name:" for="name"/>
<h:inputText id="name" value="#{bean.name}"/>
...
<a4j:commandButton id="save"
value="Save"
action="#{save}"
type="submit"
oncomplete="if(#{facesContext.maximumSeverity==null})Richfaces.hideModalPanel('edit_dialog')"/>
<a4j:commandButton id="reset"
value="Reset"
action="#{bean.reset}"
limitToList="true"
reRender="edit_form"
ajaxSingle="true"
type="reset"/>
<a4j:commandButton id="cancel"
value="Cancel"
action="#{bean.cancel}"
ajaxSingle="true"
oncomplete="Richfaces.hideModalPanel('edit_dialog')"/>
<rich:hotKey key="return"
selector="#edit_form"
handler="${rich:element('edit_form:save')}.click();event.stopPropagation();event.preventDefault(); return false;"
disableInInput="false"/>
<rich:hotKey key="esc"
selector="#edit_form"
handler="${rich:element('edit_form:cancel')}.click();event.stopPropagation();event.preventDefault(); return false;"
disableInInput="false"/>
</a4j:form>
</rich:modalPanel>
It’s important to define ajaxSubmit=”true” for the form! This avoid “none ajax submit of html formulars”. I will explain this in a later blog
With rich:hotKey I bind 2 key events to the edit formular:
Try it
With jQuery it’s easy to focus the first visible input element (textfield, textarea or selectbox) for a rich:modalPanel:
<rich:modalPanel onshow="autofocus('dialog_content')">
<h:panelGrid id="dialog_content" columns="1" width="100%" cellpadding="0" cellspacing="0">
<a4j:form ajaxSubmit="true">
<h:outputLabel value="What's your name:" for="name"/>
<h:inputText id="name" value="#{bean.name}"/>
...
<a4j:commandButton id="save" value="Save my name" action="save"/>
</a4j:form>
</h:panelGrid>
</rich:modalPanel>
function autofocus(containerId) {
var element = jQuery(":input:not(:button):visible:enabled:first", '#'+containerId);
if (element != null) {
element.focus().select();
}
}
The tool chain for building eclipse based applications with maven becomes better and better.
Read here.
I know 2 projects using maven to build eclipse plugins:
Which project are there else?