pátek 25. září 2015

Solution to failing Configuration.getConfiguration() in Java

Sometimes the calling javax.security.auth.login.Configuration.getConfiguration() fails with SecurityException in our tests (both Oracle and IBM).

A quick solution (without touching JDK installation or configuring java.security.auth.login.config system property) is simple. Just create an empty file .java.login.config in your user home directory (more info in ConfigFile JavaDoc). Thats it!

touch ~/.java.login.config

Just to make the picture complete, here is the stack trace we see on IBM JDK:

Exception in thread "main" java.lang.SecurityException: Unable to locate a login configuration
 at com.ibm.security.auth.login.ConfigFile.<init>(ConfigFile.java:125)
 at java.lang.J9VMInternals.newInstanceImpl(Native Method)
 at java.lang.Class.newInstance(Class.java:1681)
 at javax.security.auth.login.Configuration$2.run(Configuration.java:263)
 at javax.security.auth.login.Configuration$2.run(Configuration.java:255)
 at java.security.AccessController.doPrivileged(AccessController.java:338)
 at javax.security.auth.login.Configuration.getConfiguration(Configuration.java:254)
 at org.jboss.test.App.main(App.java:15)
Caused by: java.io.IOException: Unable to locate a login configuration
 at com.ibm.security.auth.login.ConfigFile.init(ConfigFile.java:282)
 at com.ibm.security.auth.login.ConfigFile.<init>(ConfigFile.java:123)
 ... 7 more

čtvrtek 23. října 2014

jOpenSpace 2014

The best pure Czech not-only-Java conference jOpenSpace is over for this year and I'd like to write few words about it.

First of all, big thanks goes to Honza @novoj Novotný as the main organizer. This awesome event under his supervision become not only interesting from the technical PoV, but also very socializing (We were a nice Java family).

Next thanks goes to all sponsors, who made jOpenSpace comfortable and cheap as a hell:
  • Red Hat
  • Vendavo
  • MoroSystems
  • FG Forrest
  • Kerio
  • ABRA FlexiBee


We started the conference with a free day! The main program for Friday was a trip to Slovakia - to climb the Velka Javorina. Rainy weather was very demanding. Nevertheless, no one gave up! Hotel sauna was a nice end of a day and it was already fulfilled with interesting Java topics.


Few of us started the day with a nice 9km run. The weather was beautiful and hills around colorful. First lightning talks started after the breakfast and continued during whole day. Hands-on labs started later in the afternoon. However, I didn't join the labs and I visited the holy city MyJava in Slovakia instead. Tasting Moravian wines in a wine cellar finished this long day.


Few of us started the day with a hard 9km run. The night was too short. Lightning talks continued during the morning and we finished at lunch time. Finally we made a group photo and said goodbye to this unforgettable event.

The topics

You'll find most of the lightning talks (slides+audio) on jOpenSpace web during November. The area covered was very wide:
  • hardware - Quadcopters, Sparki robot, Raspbery PI
  • soft-skills & interesting books - Thinker's Toolkit
  • databases - MUMPS, Hazelcast
  • testing - SmartMeter, COllaborative Editor testing
  • tools - Code review with Atlassian, Future of Markdown
  • and many other interesting topics (E.g. the truth about drug manufacturers)
My presentation was about Java Security Manager and pro-grade library. The slides are online.
Few photos from my phone is in G+ album.

pátek 26. září 2014

Speed-up ApacheDS LDAP server for testing

Using the ApacheDS for unit testing can be painful if you need to restart/reconfigure the server several times. IT'S SOOO SLOOOOW.

The reason is simple. The default configuration creates a nice directory structure and unpacks all the schema files from JAR file to one of the created directories. Then it creates a file based JDBM partition for you. And it loads your LDIF data to it.

It means many, money, many I/O operations even before the LDAP starts.

Nevertheless, ApacheDS has a nice API to resolve this issue. You will need to make your hands dirty little bit, but it's worth it.

Follow these 3 simple steps and it's all:

  1. Create schema partition class, which stores LDAP schema data in-memory only: sample InMemorySchemaPartition.java
  2. Create DirectoryServiceFactory implementation, which will use in-memory AvlPartitions instead of JDBM and as a schema partition it will use class from the first step: sample InMemoryDirectoryServiceFactory.java
  3. use the new DirectoryServiceFactory to create embedded LDAP

Embedded LDAP

There are 2 simple ways, how to create LDAP server in your unit tests. One uses ApacheDS annotations and the second uses API directly. Here are sample code snippets, which show how to enable the custom InMemoryDirectoryServiceFactory for both of the ways.

 name = "JBossOrgDS",
 partitions = {
   name = "jbossorg",
   suffix = "dc=jboss,dc=org",
   contextEntry = @ContextEntry(
    entryLdif =
     "dn: dc=jboss,dc=org\n" +
     "dc: jboss\n" +
     "objectClass: top\n" +
     "objectClass: domain\n\n" )
@CreateLdapServer (
 transports = { @CreateTransport( protocol = "LDAP",  port = 10389, address = "" ) })
public static void createLdapServer() throws Exception {
 DirectoryService directoryService = DSAnnotationProcessor.getDirectoryService();
 final SchemaManager schemaManager = directoryService.getSchemaManager();
 //import your LDIF here
 ServerAnnotationProcessor.instantiateLdapServer((CreateLdapServer) AnnotationUtils.getInstance(CreateLdapServer.class), directoryService).start();

DirectoryServiceFactory dsf = new InMemoryDirectoryServiceFactory();
DirectoryService directoryService = dsf.getDirectoryService();
SchemaManager schemaManager = masterDirectoryService.getSchemaManager();

PartitionFactory pf = dsf.getPartitionFactory();
Partition p = pf.createPartition(schemaManager, "jbossorg", "dc=jboss,dc=org", 1000, workingDir);

//import LDIF here

LdapServer ldapServer = new LdapServer();
Transport ldap = new TcpTransport( "", 10389, 3, 5 );

I bet your ApacheDS startup time falls down at least by 50% with these in-memory settings.