Wow. This was a lot more complicated than I thought. After several days of research and questions I finally discovered how to make this work. Its all about custom property editors. Please note that many-to-many relationships are not the best thing to use in a production environment. They dont scale well and they are not easy to manage. I later on replaced with Solr, my new favorite implementation.
In this example, many ‘things’ have many ‘tags’ and inversely many ‘tags’ have many ‘things’.
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {
binder.registerCustomEditor(Set.class, “tags”, new CustomCollectionEditor(Set.class) {
protected Object convertElement(Object element) {
long id = NumberUtils.parseNumber((String) element, Long.class).longValue();
Tag tag = tagMgr.getTag(element.toString());
Recently I had to fabricate some nasty rewrite rules involving some unruly query parameters where if one was present do this, whereas if two were present do that, or if none were present redirect somewhere else. I had to step back after a few hours of work to try and look at this problem differently. All of sudden it became clear. Some code is omitted but here are two examples that I am using in production:
As you can see I am setting up gates or switches. The list went on and on and the order is highly important as you may notice, just as some ‘if’ blocks are (consider refactoring). In the case of a top-down script like mod_rewrite I feel this is not only acceptable but necessary to accomplish this task.
While having a few drinks with a buddy of mine at a local bar in San Francisco I met an editor for Jalopnik, a sister site for gawker.com. After talking to him for a while I mentioned my open source fuel injected 1973 BMW 2002 sitting out on the street. Next thing I know he is taking pictures of the car and taking down my info. A few days later some friends who read the site me this link featuring my car.
After months of planning, documenting, and gathering parts the project is finally complete (almost). I still have to ditch the distributor for a crank fired ignition system but this’ll do for now. As always, more details and exact plans can be found on the wiki
After 5 days of working on the fuel injection I am finally almost complete. Fortunately my friend let me use his garage for week which has been extremely helpful. I also had the help of my roommate. Right now are are stuck because my computer cannot get a signal from the coil telling it to fire. I have to do some more research but I am sure it will work.
In the spirit of being open source, I have decided to convert my little BMW to Electronic Fuel Injection (EFI). What prompted this decision was a road trip to Chico when my car didnt perform as well due to the environment, i.e. the altitude. This is due the carburetor, a great invention that works incredibly well to this day, but for me, it wasnt enough. I liked the idea of being able to tune my car with a computer. Even while I’m driving! It sure beats taking the carbs apart over and over to change the jets . As always, I will be managing the project and researching on my wiki.
The MegaSquirt system was built by a bunch of Assembler engineers who realized that there was a place for open source in this industry. If I were to do the same via some of the closed source manufacturers I would be paying thousands with very limited resources. This is exactly how I view software in my day job. I am 100% open source in all of my environments. Now my car is the same. More info on this project can be found on the MegaSquirt website.
As I have said before I love Spring and Hibernate; however, there is no Spring support for Hibernate’s pagination API. Why am I am not sure. Maybe they are supporting it now but heres what I did. First I made and abstract object I called ‘Page’. I also have a Solr subclass of this object but I will cover that later.
public abstract class Page {
public List results;
private int pageNumber;
private int resultsPerPage;
private int totalCount;
private String queryString;
private Integer totalPages = null;
/*
Getters and setters
*/
}
public class PageHibernate extends Page implements HibernateCallback {
public PageHibernate() { }
public PageHibernate(String queryString, int page, int resultsPerPage) {
this.setPageNumber(page);
this.setResultsPerPage(resultsPerPage);
this.setQueryString(queryString);
}
public final Object doInHibernate(Session session)
throws HibernateException {
Since Spring abstracts your Hibernate interaction with HibernateDaoSupport you dont have to write straight criteria calls to Hibernate if you dont want to. Spring does create simple implementation to allow to write straight HQL and many other functions but not pagination. Rather than tackle this problem at this angle I decided to make the abstract class ‘Page’ that you see above for all my data stores. Anyway, here’s how easy it is to then hit the database with this object properly constructed and have it returned ready for use.
public Page getPageOfThings(int page, int resultsPerPage, String orderBy) {
PageHibernate newPage = new PageHibernate(
”FROM Thing”, page, resultsPerPage);
getHibernateTemplate().executeFind(newPage);
List count = getHibernateTemplate().find(“SELECT count(*) FROM Thing”);
Spring and Hibernate make Java web application development so much easier I barely remember what I did without them. Despite the steep learning curve, Hibernate especially so, they work so well together thanks to Spring. Spring is probably the most “open” open source framework out there for Java. It can and will play nice with tons of other frameworks like Tiles, SiteMesh, Velocity, JSF, as well as backend technologies like iBatis, Hibernate, ACEGI, and countless others.
I have begun to like them so much at the office that I am using it a home in all of my side projects. This blog will hopefully shed some light on some of these technologies to hopefully give back. Blogs like this are especially important because although these frameworks aren’t relatively new, there can be some holes in the documentation. Two books that helped me through my trouble were Matt Raible’s book “Spring Live!” and “Hibernate in Action”