Marcin bloguje

.impressions.memos.tech.

OVal - Validate Your Models Quickly and Effortlessly!

Some time ago one of the projects at work required me to validate some Java POJOs. Theses were my model classes and I’ve been creating them from incoming WebService requests. One would say that XSD would be sufficient for the task, for parts of this validations - sure, it would. But there were some advanced rules XSD would not handle, or would render the schema document very complicated.

Rules I needed to express were like:

  • person’s first_name and last_name should be of appropriate length - between 2 and 20, and additionally one could pass a zero-length string just to remove the previous value
  • state field should consist only defined values - as in dictionary value - this one would be completable with XSD’s enumerations, but would require often changing schema files and redistributing them to interested parties :(

The library I’ve decided to use for this task is OVal and it came out really nice! Read on to find out the details!

Oval is quite mature library that allows POJO validation, but is not JSR303 (bean validation) implementation. It has converters that enable it to understand those annotations, but I’m not sure about the compatibility.

I’ve tried only a subset of the available checks, among which were:

  • NotNull
  • NotEmpty
  • Length

There are many more, and their attributes give interesting ways to configure the validation process. But using them was rather easy and did not require to much brainstorming. What I really needed were custom checks. And in this area OVal shows it’s strength. Implementing a check is really easy.

I needed an annotation that would check a field against some values in a dictionary. If field’s value was in the given set, than the validation would succeed, if not, an exception would be thrown. To accomplish this task it is required to implement two classes: annotation class and check class - called by the validation engine on a given field.

Let’s start with our new annotation:

In the above snippet I’ve defined a check-annotation, that would be used like this:
You can pass file - containing dictionary values for this field. There is also message field in the annotation which is an error message returned by the validation engine of failed check - pretty handy. And can be expressed in .properties file as:

Placeholder, like context, will be replaced with correct values supplied by the validation engine.

Annotating a field is not enough. It is also needed to create a validator for this kind of check. The name of the class is already defined in DictionaryValue annotation, it is called DictionaryValueCheck and I’ve done this check this way:
What this basically does is:
  1. when file is set - read dictionary content from the file into map
  2. upon check request just lookup value in dictionary parsed from the input file

And that’s it!

For me Oval is really great tool. With it at ones disposal it is extremely easy to create any imaginable validation you need. This library is really easy to use and offers lots of handy features.

But perhaps I’m reinventing the wheel and all this can be done easily with some other library? Share Your opinion!

Comments

Now that’s a great question. I’ve forgotten to write about this, but OVal offers profiles, which you can disable or enable whenever you like. You set a profile for a specific annotation. In your case let’s assume You have two operations: add and update. Your model has field annotated with @NotNull(profile="UPDATE"), which means we don’t want null values on it when updating. In _add_ operation you disable the profile called UPDATE, so the annotation is also disabled. When calling _update_ you enable the profile and the validation is performed.

More on this here: http://oval.sourceforge.net/userguide.html#d4e561

Question:
Say, we have an object with a primary key, that is mandatory (in the database), but described as AUTOINCREMENT. When client sends new object data, the primary key is obviously null, but we need to validate it for not-nullity in other cases.

Doea OVal handle variations / directions of validation?

Geecon 2011 - Day 2

And now for part 2 of my visit to Geecon 2011!

1. Jim Webber “Revisiting SOA for the 21st century”

Now this was awesome! Jim Webber, a former ThoughtWorks employee, now Neo4j evangelist (in Neotechnology) described his views on how SOA should look - according to him. This was presented previously, on other occasions as his “Guerilla SOA” talk - generally he advocated for REST based services, loose contracts (stating that WSDLs are too verbose and code generation is evil).

Jim mentioned Martin Fowler’s article on integration databases but I couldn’t find it anywhere - thou the topic looks interesting. He also recommended BDD and exposing tests on the web for the end user to use them as early as possible.

One big point he made his case with was not relying on enterprise software. Simple tools can do much better job. He compared implementing Web Services security (Secured SOAP over HTTP over TCP IP) to REST based service accessed through HTTPS - basic and easily testable with tools like curl.

Great talk. One of the best!

2. Staffan Noteberg “Regex - the future programming”

I must confess, that this did not go too well. The whole talk was well prepared and laid out but it lacked depth. It was pretty basic introduction to regex. From the presentation’s subject I was rather prepared for some novel uses of regex - like for example: showing how to filter big volume of data with simple regex or sth.

But the talk was fun, Staffan is a good speaker. He is also an author of pomodoro technique book - I intend to read sth abut this technique and this may be a nice start

3. Bartosz Kowalewski “Is OSGI ready for wide adoption?”

If it comes to titles I tend to rely on them pretty heavily, however strange it may seem. This time I also did - and the whole talk did not give me a definitive answer to the stated question.

Sure, the presentation was informative, but it described some OSGI specific, quite low level stuff. Of course, if you want to use OSGI - even by leveraging application server with OSGI under the hood - you should know a fair bit about the technology itself. Even thou the AS does a good job of hiding OSGI container specifics from the developer, in case of problems it’s better to be well informed. All in all - the talk gave too little information for me.

4. Vaclav Pech “Pick low hanging fruit”

“Parallelism is not hard, multithreading is” - this was the key sentence of the presentation. The speaker showed how to introduce concurrency into normal java/groovy code by sprinkling it with concurrency powder. Easy enough! With GPars library he showed:

  • running processing tasks with thread pools
  • testing concurrent code
  • Fork/join Thread Pool - multiple thread queues (note to self: fork/join is good for hierarchical problems)
  • low-hanging fruits:
    • async calculations
    • fork/join
    • dataflow
    • parallel collection processing
  • Actors are great - use GPars or Akka, is sufficient to use @ActiveMethod and @ActiveObject annotations and Actors are usable in OO-world

Good talk, well received!

5. Anton Arhipov “Bytecode for discriminating developers”

Technical introduction to the world of bytecode, jvm specification details. I’ve drifted away to some other topics - really - can’t recall what this was all about.

6. Andreas Almiray “Polyglot Programming”

This was a nice talk covering Groovy, Scala and Closure. The whole point of it was to show how cool it is to play with emerging JVM languages. They are not only fun but also useful. What’s more, they bring freshness to java world, injecting it with some new paradigms and methodologies. It is easier to incorporate new ideas into younger JVM languages than to the mature Java.

7. Jim Webber “A pragmatic introduction to Neo4j”

And Jim Webber again, this time with some Neo4j evangelism. First came some taxonomy information on NoSQL databases (Not Only SQL) as a whole - than some specific examples of problems solvable with graph databases - and Neo4j is a graph database.

Main points of Jim’s talk were:

  • sharding a database is important for scalability
  • series data - should be OK to use Neo4j as their storage

Conclusion

These were all the sessions I attended. On Saturday there was a Hacker-garden, but neither I had time nor will to stay - the topics were very interesting and I’d definitely like to experience such an event, but after 2 days of continuous talks I was rather tired.

To sum up, 2011’s Geecon was a great experience, with lots of interesting talks and lots of new inspirations. Keep up the good work guys!

Comments

Geecon 2011 - Day 1

Last week’s Java conference - Geecon was very interesting. It was well prepared, and gave an insight into the current Java related trends - concurrency, DSLs, polyglot programming. But not only that - there were also some pretty different talks from excellent speakers.

The whole event took 4 days:

  • University day (wednesday)
  • 2 regular conference days (Thursday + Friday)
  • hacker garden (Sunday)

I decided to attend only on Thursday and Friday - no time for more. Here is what interesting happened during those days.

Day 1

The morning got me unprepared. After hard enough, after work travel to Krakow on Wednesday, I wasn’t in the best shape. However after arriving at the venue, being greeted with breakfast and refreshments I looked at the rest of the day with real hope.

Since the schedule was tight - three parallel tracks of lecture, I had to choose, so bare in mind, that is my account of what I’ve seen and heard. Others may, of course, differ.

1. Danny Coward “Java SE: The Road Ahead”

Danny, being on Oracle (considering being also former Sun’s employee a plus) payroll, gave an insightful talk on new things to came in Java 7. He drew rather serious plans for Java 8. According to Danny, the main trends in today’s Java ecosystem are:

  • parallel programming
  • language dynamics

and he probably is right :) The great things to come with new versions of Java are:

  • closures in Java (finally!)
  • extending interfaces
  • map, filter - functions for collections
  • lambda expressions - thou in Java 8

The talk itself was a nice keynote, but I doubt the road map for Java will be met in its full extent - the goals aren’t that small.

2. Juergen Hoeller “Enterprise Java in 2011”

Spring Source as one of the sponsors sent Juergen to evangelize about the world of enterprise and Java’s place in it :) He emphasized different kinds of deployment: WAR, cloud deployment - and the latter’s rise of importance.

He pointed out how outdated current application servers are - the usually lag ~3 years behind the main trends and developers’ needs - good point! He proposed looking under the hood of now-popular cloud environments: Google App Engine or Amazon Elastic Cloud to look for schemas in them, etc - I intend to listen to his advice.

All in all this guy gave a great talk covering wide spectrum of technologies and not focusing on technical stuff too much.

3. Heinz Kabutz “Reflection madness”

Despite living on a Greek island, this guy showed also how to whack ones mind with Java Reflection API. Pure magic! Some highlights of his talk were:

  • how to get 42 + 1 = 44
  • get the size of an object
  • get method caller’s id
  • add enum values dynamically

With all this examples he pointed that using SecurityManager will prevent such nasty coding practices.

Since he is an editor of Javaspecialists.eu newsletter, all the answers to problems presented in his talk (and many many more) can be found there.

Well done, not to useful for me, nevertheless - interesting.

4. Michael Figuiere, Cyrille Le Clere “NoSQL & Datagrid from developer perspective”

I don’t know what to think of this talk. It consisted an introduction to NoSQL databases but also a bit of problem’s description that can be encountered when dealing with them. Notable thoughts were on:

  • creating a sharding ready data structure
  • denormalization as a useful process for NoSQL DBs
  • NoSQL usually means no transactions

5. Hamlet D’Arcy “New Ideas for old code”

Since a lot of developers (all?) have to deal with legacy code - one way or another, this talk was a must!

. The speaker shared some ideas on how to work with such code and remain sane. The talk was vivid, interesting and entertaining, well, and the notable thought? Here they are:

This was nice! - it assumed arriving at a project with no ( or little) tests.

6. Aslan Knutsen “Arquillian”

The last talk of that day was about some new library from JBoss that would allow to test your components with unit tests - test them in a destination container. The whole point of this library is to run the specific fragment of code as if it was build and deployed to some application server (let’s say JBoss AS ;-) ). To be honest, I can’t find much application for that - thou I’m not doing any serious work in JEE world.

Party

And the day ended. But there was sth else to do after the official part - party time! It took place at Klub Pauza on Floriańska street. It was a rather nice social event.

… to be continued - stay tuned for part 2

Comments

"how to get 42 + 1 = 44"?
Tutaj ;)
http://blog.patryk-dobrowolski.eu/2011/05/16/refleksja-moze-byc-niebezpieczna-zobacz-jak-zniszczyc-sobie/

JCE Keystore and Untrusted Sites

Recently at work I was in need of connecting to a web service exposed via HTTPS. I’ve been doing this from inside Servicemix 3.3.1, which may seem a bit inhibiting, but that was a requirement. Nevertheless I’ve been trying my luck with the included servicemix-http-2008.01 component. I’ve created a simple Service Unit using that component and made connection attempt. Unfortunately I’ve encountered issues with the SSL conversation negotiation. I had to dig deeper into the servicemix-http code to find out these had something to do with my JCE keystore. Read more to find out what happened!

Ok, so I had my xbean.xml for http component looking like this:

As you can see this is a proxy adapter to some outside service exposed via secured HTTP protocol. Since it’s HTTPS I’ve specified some SSL parameters. It was sufficient in my case to just pass the keystore file and it’s password.

I’ve created my keystore.jks file in smx_home/conf with password servicemix in the following manner:

You can see what’s in this file with this command:

At this point I thought, that having a configured keystore and my component would suffice. Wrong! As soon as I’ve tried to connect to the external service I got an exception:

Hmmm.. this looks pretty nasty, but it’s not that bad. As one can read here, it’s associated with the other site’s having an untrusted (unsigned) certificate. Assuming you actually trust the other end of the communication and this situation is ok for you, you should add the servers certificate to your keystore. The previously mentioned link contained a little java class that would do just that. You can find it here (original code) InstallCert.java or you can look into my slightly changed version here at github.

You should call it as follows, assuming that file keystore.jks is in the current directory:

What you’ll probably see, when you execute this app is this:

Please note that there is a prompt (Enter certificate to add to trusted keystore…) in which you can enter the certificate number you wish to add to your keystore.

After all those steps my request got through and I could happily query HTTPS service as long as I wanted to! Great!

Possible problems

In my search for this problem’s solution I’ve encountered this kind of exception:

A little googling led me to this StackOverflow question.

It seems that you cannot have multiple keys with different passwords in the same keystore and use KeyManagerFactory class. Oh well…

.

Ending

To sum up, the solution given works, but in my opinion using the InstallCert.java app is rather dirty. I’ve been wondering, do you know other ways of doing that thing?

Advisory Messages to the Rescue

The most crucial part of software development is testing. It should ensure us, that our code is correct, works according to given specs, etc. There are many kinds of tests: unit tests, integration, functional. In general you should try to test the smallest possible subset of your code and be able to check the state of the objects after the test.

This seems as rather easy task, but what if you have an integration end-to-end test to perform? In most cases asserting state in integration test is rather hard due to multiple systems interoperability. Let’s focus on a specific situation.

What I needed to do the other day was write some integration test for Jms based system. The processing pipeline is easy:

  • fetch object from DB
  • process it
  • publish on JMS

some other system (X-system) polls JMS:

  • if message is found
  • fetch it (message disappears from the JMS queue)
  • do sth with it
  • Looks simple but since I didn’t have any sane access to the X-system I wanted to be sure that my object was actually put into the queue. It was not acceptable to subscribe to the queue and fetch that object in my test - it would dusrupt the flow of the whole process.

    Fortunately I’ve been using ActiveMQ and since it offers a thing called Advisory Messages I’ve decided to use just them.

    What are advisory messages? They are a set of administrative messages that are generated on a specific event, like message consumption, message delivery, topic destruction, and many more. Each type of message is delivered to a separate topic - prefixed with ActiveMQ.Advisory. Since generation of such messages may be an overhead in production systems these features are turned off by default. You need to enable specific type of advisory message for a specific jms destination. You can do this with ths configuration change to activemq.xml

    As you can see, I’ve specified which advisories I want enabled. The full list of available advisories can be found here.

    Since I wanted to read messages from that topic I’ve added the following configuration to my spring context - there is one destination bean for inserting messages and one bean for advisory topic.

    Thanks to this configuration I’ve been able to check that my message was actually delivered to the queue. There’ve been no need to worry about race conditions in consuming the message from original queue - if the X-system read the message, I’d be unable to determine if it has ever been in JMS at all.

    What’s not so nice about that:

    • advisory messages can be thought of as counters rather than debugging information
    • they don’t contain any data that would allow us to match advisory message to the original message - thou you could correlate by timestamp

    All in all, it’s a good tool to have! But perhaps you have some other thoughts on this subject? How do you test JMS?

Comments

How to Run Multiple Guest OS in QEMU?

This weekend I’ve been fiddling with QEMU. I’ve installed OpenBSD on a single image and wanted to have two instances of it communicating via network. Installing the system was easy, but the networking setup was quite a pain. See how I did that…

To make QEMU instances communicate with each other I needed to plug them to a “network”. That’s why I’ve created a bridge to which Virtual Instances would connect to. I’ve used the following script:

Then I just needed to start Qemu with this command line:

Since I’ve set up bridge for Qemu instances, I’ve plugged TAP interfaces into it. That’s why I’ve needed to specify this in my qemu exec line. I’ve also added macaddress setting since both my instances were getting the same one.

And that’s all! It works like a charm. Now on to some harder things!

Me on Hadoop on Parleys

Finally I’ve managed to import my WarJUG presentation to parleys.com. See for yourself :)

If you’ve got problems with opening the parleys’ version try the ones uploaded to youtube.

Here is part 1:

And here is part 2:

Comments

I’m sorry, but I don’t understand Polish :P

After WarJUG

Some time ago I’d written about my arsaw JUG presentation. I finally presented the the topic yesterday.

I must say I’m fairly content with my yesterday’s presentation :) Here are some slides and as soon as the video will be available I’ll post it here too.

Comments

Czyli napisałeś ładny post po angielsku, tylko po to, by zaprosić do obejrzenia prezentacji po polsku?

(przepraszam, ale mój angielski jest za słaby na pisanie w nim)

Hadoop at Warsaw JUG

I’ll be speaking at the upcoming JUG meeting in Warsaw. The topic will be Apache Hadoop. If you’re interested, feel invited. Attend and ask questions. But be aware I’m not advanced in this technology :)

Full invitation text can be found here.

P.S.: Do you know what Hadoop is? Do you use it anywhere? Have you played with it?

Comments

@teamon - prawdopodobnie będzie. Na 100% to nie wiem, ale teoretycznie wszystkie prezentacje WarJUGa są nagrywane

@r2 - nie trzeba się zapisywać - wystarczy przyjść

Trzeba się uprzednio zapisać (gdzie?) by przyjść?

Prezentacja bedzie nagrywana?

Prezentację starałem się przygotować bardzo ogólnie. Nie będzie zbyt dużo Javy - nie będę omawiał API.

Myślę, że będzie to ciekawe również dla administratora.

Czy prezentacja będzie dotyczyła tylko programistycznej strony? Czy admin nie znający javy może przyjść i dowie się czegoś ciekawego?