Today I worked an an issue which presented users of our application a 403 error page when downloading large files which were generated on the fly. The files were delivered by a servlet and the files were directly copied to the ServletOutputStream, so the files were streamed instead of holding them in memory.
After some debugging it turned out, that the files were not streamed since the Seam Ajax4JSF Filter doesn’t allow to stream files and this resulted in OutOfMemoryExceptions. There are a few ways how to disable or extend the Ajax4JSF Filter (see this Seam Forum Thread).
Since all our download resources are mapped to servlets which resides in the “/media/*” path, it was pretty easy to just enable the Ajax4JSF Filter for all paths except the “/media/*” paths. To achieve this, just add to your components.xml:
<web:ajax4jsf-filter regex-url-pattern="^(?:[^/]|/(?!media/))*$"/>
This is a quick one:
When you want to login a user programmatically without checking if the credentials are right or the user is in the IdentityStore with Seam 2, that is pretty easy.
final Principal principal = new SimplePrincipal("username");
identity.acceptExternallyAuthenticatedPrincipal(principal);
identity.authenticate(); |
This will override the Seam 2 Security Framework authentication mechanism and a user with the given username will be logged in, even if the user is not in the IdentityStore of the Application.
I use this regularly when I have some sort of administration interface where I cannot use the default IdentityStore of the application. In this case I provide an own implementation of the required authentication mechanism and just log in the the user with the approach described above. When doing this I add a role to the logged in user (via identity.addRole("myRole")), so I can use all the Seam goodies like the Authorization Annotations (@Restrict) or checks like Identity.loggedIn.
I experimented with Google Guice Custom Injections because I wanted to inject a Logger to my guicified application. There is a great part in the Guice documentation about Custom Logger Injection, but in my case I wanted a SLF4J Logger with Logback as implementation. The example in the Guice Wiki is with Log4j Injection.
Here is how I wanted to inject loggers:
1
2
3
4
5
6
| @Log
Logger log;
public void doSomething{
log.info("Logmessage");
} |
Mehr…
This is just a quick reminder for myself how to implement programmatic redirects with JBoss Seam and JSF.
I will describe three different techniques:
- Redirecting to a 404 Error Page from a JSF Backing Bean
- Redirecting to an external Website
- Redirecting to a JSF view in a Seam Application
Mehr…
I am playing with the JDK Javascript API (JSR 223) and I wanted to check out the replacement of variables in a String. Then I suddenly got this error:
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: missing ; before statement (<Unknown source>#1) in <Unknown source> at line number 1 |
After some reseach I found out, that my variables did contain invalid characters in my case the variable contained a -.
So the Regular Expression for valid Javascript variable names is:
[a-zA-Z_$][0-9a-zA-Z_$]*
It is also possible to use any unicode characters for variables, but of course this is not recommended.
Today I had a hard time implementing time-consuming processes with AJAX status updates. I stripped down everything to a minimal working example. The technologies used in this example are
- Seam 2.2.2
- Richfaces 3.3
- Quartz 1.6
So here is what I wanted to achieve: The user of my application should click a button and in the background, a long running process should do some database stuff. Since this could take a while, I wanted to show some progress to the user. I did not want a progress bar, but I wanted to display some text to the user, depending on what the long-running tasks current status was.
I stripped it all down to an minimal example, which starts a long running process (huge for loop which generates random UUIDs) when a button is clicked and displays the current UUID to the user. With this basic example I hope you can get the ideas behind the a4j:poll component and how to do asynchronous long-running tasks with Seam. I must admit, that I was heavily(!) inspired by Andrey Chorniys blog post Show dynamic progress of time-consuming process in Seam/RichFaces where I shamelessly stole code and adapted it to my needs.
Here are the neccessary steps to get started
Mehr…
Today I struggled with getting my TestNG Integration Tests working in my Seam 2 project. It’s not a very smart idea to use the production/development database for database tests and here’s why:
1. It is damn slow
2. We want to separate “real”/fake data from unit test data.
3. Under normal circumstances we want a clean database or a database with predefined data (see )
4. We want the unit tests to run everywhere. It should not matter if we have a Windows machine, a Linux Buildserver or a MacOSX. It should just work. Oh and I forgot. We even want it to work without Internet Connection.
5. …
So I decided to use HSQLDB for my Unit tests.
The first barrier was getting TestNG working. Mehr…
I am using Netbeans for a few weeks now and I have to admit, that I really enjoy this IDE. But my happiness with the IDE is not what I want to blog about today
Programmers are (or should be) lazy. We do not want to write the same code again and again. Fortunately every sophisticated IDE has some kind of Code Template mechanism, so does Netbeans. Here are some of my created Templates which I think other people could find it as useful as I do:
Mehr…
JBoss Seam bietet eine wirklich tolle Unterstützung für das Versenden von E-Mails an. Falls jemand nicht weiß wie das funktioniert, hier ist die Referenz dazu.
Wir wollten eine PDF an eine Mail anhängen, die Mail wurde jedoch ohne das Attachment versendet. Hier die Lösung:
Mehr…
Die Standard Compiler Einstellung für Maven ist das JDK 1.4 . Da sogar Java 1.5 das End of Life schon lange erreicht hat, wollen die meisten ihr Projekt wohl mit Java 1.6 kompilieren.
Um Maven dazu zu bringen das JDK 1.6 zum kompilieren, benutzt man einfach das maven-compiler-plugin. Hier ein Beispiel aus meiner pom.xml:
Mehr…