Saturday, February 26, 2011

Wrap anything within Quartz

I had this idea while using Quartz at work that it rather than writing a lot of boilerplate code around libraries like Twitter4J and RestFB, it would be nice if I could just wrap any method into a Quartz Job, with scheduling, error handling, etc.; something like this:

FacebookService service = wrap(FacebookService.class);
queue(service.updateStatus(statusMessage)).schedule(nextMonday).after(new Callback {
  @Override
  public Object run() {
    System.out.println("Posted the status, and it was: " + getResult().getMessage());
  }
});


The syntax is (supposed to be) similar to Mockito's. I'm not sure how well this approach will stand up from a thread-safety perspective, but I've started a project on Github, very basic right now, that I think has some promise!

Monday, February 14, 2011

JAXB 2.1/2.2 and different Java 6 versions

Posting this just in case anyone else hits this issue. We run Java 1.6.0_23 in our local development environments, but deploy to Java 1.6.0_03 (I suppose ideally our development should match the deploy target). I've seen a couple of people encountering problems with this error:

javax.xml.bind.UnmarshalException: Unable to create an instance xmltype ...


I had an abstract JAXB class and some concrete ones that implemented it and were annotated with XmlType. This worked without problems in our local environment, using (I assume) JAXB 2.1. However, when deployed I was getting the above error. Our deploys include JAXB 2.2 in an endorsed folder because we don't want to use JAXB 2.0 (which is what Java versions previous to 1.6.0_04 include).


What a confusing mess! To summarize:
locally: JAXB 2.1
deployed: JAXB 2.2

In the end to fix the issue, I ended up modifying the code that created the JAXBContext to include all of my concrete classes as well (it is using the JAXBContext.newInstance(Class... classes) method). This appears to have fixed it; I'm not sure why 2.1 is able to unmarshal without the classes all listed there while 2.2 is not.

I had read previously that JAXB would use the XmlSeeAlso annotations to look up the additional classes, but it doesn't seem to be behaving as expected in this situation. My abstract class has an XmlSeeAlso annotation that points to all of the concrete implementations.

Hope this helps someone!

Friday, February 11, 2011

Javascript trickery: direct links to Fredericton Sobeys/Superstore Flyers

I've been really hankering for a simple grocery shopping comparison tool, but haven't come across one yet.

At one point I started working on one without really getting very far, but after some investigation, I discovered that most of the handling for the Sobeys and (Atlantic) Superstore flyers is Javascript-based. This could probably lead to some easy-to-parse lists of sales and prices.

One useful feature in the meantime is the ability to get to the accessible flyers for my stores quickly by looking at the "publication.aspx" source code. If you open that file up in some developer tools, you can build your own links in this format:

My Superstore

My Sobeys

The links look like this:

http://director.flyerservices.com/{CUSTOMER_NAME}/PublicationDirector.ashx?OrganizationId={ORGANIZATION_ID}&BannerId={BANNER_ID}&BannerName={BANNED_NAME}&pubtype={PUBLICATION_TYPE}&Language=en&Version=Text&PostalCode=e3a2l4&SessionId=nkg4olv1s3brluuc2cntid45&StoreId={STORE_ID}

Hopefully that session ID won't let you guys exploit anything, I'm not sure if it's required.