As most programmers know, Unit testing is a good practice. You get a quick result if you broke something vital.
And in a simple POJO (Plain Old Java Object) it's not that difficult to make a Unit test, most IDE has JUnit integrated in them.
But what about JavaEE? Now you have a servlet-container, context and persistence to worry about.
There are several solutions for this, the one that I've been focusing on is Arquillian.
Arquillian is a JBoss Community project and development is sponsored by Red Hat, Inc.
http://arquillian.org/
It's a good idé to use Maven with Arquillian. One of the reasons is that you can have different profiles for different servers (glassfish, wildfly, embedded, remote, etc).
My opinions of Maven: http://java-viking.blogspot.com/2014/05/java-ee-maven-and-gradle.html
So Arquillian can simulate JARs or WARs. You can add config-files and classes (or packages).
It can even do persistence.
So i use my Datasource from the server, simulate a War and test it remotely to the server.
The test begins with making a transaction and adding values to the database, I do this with a Facade that Netbeans like to create for JPA Entities.
I've done a test with the findAll-method to see if I get a list with the correct size, and it worked lovely.
So now it's time to test all the important stuff. On my next project I will start with the testing-stuff first now that I know of its capabilities.
So what's next?
Next is to test Arquillian Drone. The Drone-extension is for testing the actual site. So my JSF-sites can actually have automated tests. The newest 2.0.0 (alpha) can even test for mobile.
The Drone can find elements by id and actually do stuff, like login in and testing what the response site is.
So my hours of re-deploying and testing the same thing over and over again feels like a bitter cup of tea right now.
So thats it for now, I have a lot of testing to do. I will also experiment with the managed and embedded server options. But it's always good to have a "remote" server that actually is the same as the release environment,
Comment if you need help with Netbeans, Wildfly and Arquillian, the IDE in the tutorials is Eclipse and uses EclipseLink instead of the Wildfly default (hibernate),
Friday, May 9, 2014
Java EE, Maven and Gradle
So I've been looking a bit at Maven and Gradle.
Gradle is an awesome build tool that have support for the dependencies from maven repositories.
But I have a weak moment, I like the automated stuff in IDEs. And the Gradle-support for Netbeans is not perfect. You can create and open projects, but for a Java EE project, you lose some of the support.
An example is JSF. When you create a normal Web Application in Netbeans, you get automatic support for all the Web technologies it supports. But with Gradle i have to do everything manually.
This is both a good and a bad thing, the good part is to actually learn all the components that are involved, the bad is that it takes time from the coding and frustration while finding the right solution.
Maven, the old and wise, have a different problem. It's problem is that it needs the dependencies declared and downloaded (by maven) while coding.
When you code Java EE against a server, you have the libraries IN the server, the server plugins usually solves this so you don't need to worry about the libraries. They will be provided.
If your using third party libraries, you might need maven? You usually either set the libraries as modules on the server or deploy them separately example Database drivers (JDBC connectors) .
In maven you tell the dependencies to be provided, but you still need them downloaded while coding.
And then comes the kicker, the libraries that the server has, are some times more up to date then those from the maven central repositories!
Even from the same company as the server!
So I'm coding for the Wildfly 8.0 Final, and javax.mail-library isn't in the dependency jboss-javaee-spec. So I had to find it manually and hope that the different version work (1.4.5 in maven, 1.5.1 in wildfly).
So for setting up and starting to code, it's much faster with a IDE and Server-plugin then using Maven.
However!
Maven gives you more structure for different testing and lets face it, many third party libraries are easier to setup via maven. And to automatically do unit-testing in the build face is a plus.
Conclussion:
So I wish that Gradle would be better with Netbeans and I will use Maven for my projects.
Gradle is an awesome build tool that have support for the dependencies from maven repositories.
But I have a weak moment, I like the automated stuff in IDEs. And the Gradle-support for Netbeans is not perfect. You can create and open projects, but for a Java EE project, you lose some of the support.
An example is JSF. When you create a normal Web Application in Netbeans, you get automatic support for all the Web technologies it supports. But with Gradle i have to do everything manually.
This is both a good and a bad thing, the good part is to actually learn all the components that are involved, the bad is that it takes time from the coding and frustration while finding the right solution.
Maven, the old and wise, have a different problem. It's problem is that it needs the dependencies declared and downloaded (by maven) while coding.
When you code Java EE against a server, you have the libraries IN the server, the server plugins usually solves this so you don't need to worry about the libraries. They will be provided.
If your using third party libraries, you might need maven? You usually either set the libraries as modules on the server or deploy them separately example Database drivers (JDBC connectors) .
In maven you tell the dependencies to be provided, but you still need them downloaded while coding.
And then comes the kicker, the libraries that the server has, are some times more up to date then those from the maven central repositories!
Even from the same company as the server!
So I'm coding for the Wildfly 8.0 Final, and javax.mail-library isn't in the dependency jboss-javaee-spec. So I had to find it manually and hope that the different version work (1.4.5 in maven, 1.5.1 in wildfly).
So for setting up and starting to code, it's much faster with a IDE and Server-plugin then using Maven.
However!
Maven gives you more structure for different testing and lets face it, many third party libraries are easier to setup via maven. And to automatically do unit-testing in the build face is a plus.
Conclussion:
So I wish that Gradle would be better with Netbeans and I will use Maven for my projects.
Saturday, May 3, 2014
JSF 2.2 FileUpload and a way to get it back
So my Web app needed to be able to upload images for users, "connect" the user and the image and to be able to actually show the image.
Some may want to save the image in the database, this can be done with the BLOB-type. you then have to get the input stream and read it as bytes.
Pros:
All in one place, handled by the DBMS.
Cons:
Database takes much more space
Harder to export all the data for backup-solutions
So what do we do then?
We can save it on the hard drive as regular files. A risk is if the file contains a virus.
How we actually save this is rather easy. The Part-class has a "write"-method which you either can give a relative path or a absolute path. The relative path may put it in the web-applications tmp-folder, it's really the server who controls where its put.
The absolute path makes it easy to do backup scripts to make backups. The big problem is how to reach the files from the web app.
The one I have focused on is Wildfly (JBoss Application Server 8).
It was a bit tricky to find the right answer.
But in the config file for your server (domain.conf or one of the standalone confs) there is a subsystem for undertow. Undertow is the new servlet container for JBoss.
In that subsystem there is two parts that's interesting for us right now: Host and Handlers.
In the Handlers part we add
<file name="images-handler" path="your/path/to/save"/>
you can use your servers path-variables
and in the Host part
<location name="/images" handler="images-handler"/>
The handler takes care of where the folder will be retrieved from (read from) and the Host will controll how the web-app will reference it.
In this case you reach it by http://serveradress:port/images
So <graphicImage> gets problems due to it being relative to the web-app.
A simple <img> works great thou.
So either find a way to map it better or use a regular <img>
So that's it for the simple fileUpload of images, especially with Wildfly.
Code ahoy!
Upload:
So JSF 2.2 has a really simple way of doing this. You just put <h:inputFile /> and connect this to a Bean. The type should be "Part" (javax.servlet.http.Part). But to remember is that the <h:form> needs too add enctype="multipart/form-data" as an attribute, <h:form enctype="multipart/form-data">.Connect:
So now we have a Part in the Bean, but how to save it and where?Some may want to save the image in the database, this can be done with the BLOB-type. you then have to get the input stream and read it as bytes.
Pros:
All in one place, handled by the DBMS.
Cons:
Database takes much more space
Harder to export all the data for backup-solutions
So what do we do then?
We can save it on the hard drive as regular files. A risk is if the file contains a virus.
How we actually save this is rather easy. The Part-class has a "write"-method which you either can give a relative path or a absolute path. The relative path may put it in the web-applications tmp-folder, it's really the server who controls where its put.
The absolute path makes it easy to do backup scripts to make backups. The big problem is how to reach the files from the web app.
Path:
How to reach files from "above" the web-apps folder is different for the servers. Glassfish has Virtual host/server. Some has context-properties.The one I have focused on is Wildfly (JBoss Application Server 8).
It was a bit tricky to find the right answer.
But in the config file for your server (domain.conf or one of the standalone confs) there is a subsystem for undertow. Undertow is the new servlet container for JBoss.
In that subsystem there is two parts that's interesting for us right now: Host and Handlers.
In the Handlers part we add
<file name="images-handler" path="your/path/to/save"/>
you can use your servers path-variables
and in the Host part
<location name="/images" handler="images-handler"/>
The handler takes care of where the folder will be retrieved from (read from) and the Host will controll how the web-app will reference it.
In this case you reach it by http://serveradress:port/images
Display:
Now comes the last tricky part. The images-folder is reachable now BUT is reachable by the server-adress WITHOUT the web-apps adress on top of it. You can probably map it to be reachable.So <graphicImage> gets problems due to it being relative to the web-app.
A simple <img> works great thou.
So either find a way to map it better or use a regular <img>
So that's it for the simple fileUpload of images, especially with Wildfly.
Code ahoy!
Subscribe to:
Posts (Atom)