RSS Feed!

Recent Posts

Recent Comments

Archive for the ‘Languages’ Category

Mac OS and Java Me SDK 3.0

Wednesday, November 4th, 2009

Sun have released not too long ago a Java ME SDK 3.0 that finally brings an official Wireless Toolkit Emulator to the Mac platform.

I have been dealing with SUN software for a while now and I was not expecting this to be a smooth ride. Those who’d dealt with the WTK on Windows/Linux platform are well aware of the limitations of these emulators. What I was not prepared for was to get so much clutter that would just not work more than a couple of times.

First impression: this wtk looks like the most polished emulator ever released by Sun.

Sadly, after using the thing for a few days I discovered that the old habits had not changed:

  • there is no menu entry to run an existing jad/jar pair. You have to right click on an emulator instance and then run it…
  • you cannot set-up a project starting from a jad/jar pair. There used to be an option to do this back in wtk 2.2…
  • after running a couple of apps the whole thing crashes an burns
  • when closing down the wtk a process is left lingering. Run this in a terminal:  ps aux | grep device-manager.app
  • switching the verbose mode when launching the emulator kills the whole thing dead!
  • they bundled ant 1.7.1 with the distro although ant is built in Mac OS
  • Permgen errors are thrown if you try to launch the app too often. LOL

Here’s what happened when I created a new project and tried to run it:

*** Error ***

Failed to connect to device 0!

Reason:

Emulator 0 terminated while waiting for it to register!

The same thing happens with Emulator 1 and 2 and 3 and 4 and 5 and 6 and … you get the picture.

Googling did return lots of forum posts, but hardly any answers…

So after wasting more than 2 hours on this issue I did the unthinkable: rebooted my mac! To my surprise the miracle happened during the reboot: I was finally able to run the project again.

Needless to say I am very disappointed but not surprised by the quality of this, early access, Java ME SDK.

Cheers…

Updating the UISearchBar programmatically

Friday, October 16th, 2009

Today I had to update WelliBUS’s search bar programmatically because I needed to use the street picked up via GPS as my street name.

Until this point implementing the search bar seemed easy:

  • adopt a couple of protocols: UISearchDisplayDelegate and UISearchBarDelegate
  • implement a few callback methods (from the delegates listed above)
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString;
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption;
- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller;
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller;
  • and implement my own filtering function
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope;

The problem I had on my hands was how to programmatically update the text in the UISearchBar and force the UISearchDisplayDelegate to call the appropriate callback methods.

Turns out it was simpler than expected (despite not being able to find a solution by googling). All that was needed was:

[self.searchDisplayController.searchBar becomeFirstResponder];
self.searchDisplayController.searchBar.text = returnString;

Cheers…

Urban Airship – Push Notifications

Sunday, October 4th, 2009

Today I have finally added Push Notifications to Parcel Trackr.

I decided not to waste time and I went for Urban Airship. I registered, uploaded my push certificate, downloaded the sample and integrated the two systems.

Not everything went smoothly though because when I first ran the application I got a

Failed to register with error: Error Domain=NSCocoaErrorDomain Code=3000 UserInfo=0×120610 “no valid ‘aps-environment’ entitlement string found for application”

I thought my provisioning profile did not include the right entitlement… so I re-downloaded it and tried again. Turns out I was using the wrong provisioning profile.

So if you want to avoid my mistake just make sure that after you’ve configured push services in the iPhone Dev Center you download the updated provisioning profile and then you install it via XCode.

Other things worth checking include: the product name in your build configuration matches the app id and of course, the ultimate solution, clean all targets before building!

Cheers…

Jersey and Websphere 6.1

Wednesday, August 12th, 2009

If you landed on this page it probably means that you’ve attempted to deploy a Jersey RESTful web service in IBM’s Websphere app server.
First of all: what were you thinking?!?

Secondly: it probably wasn’t your decision and you just need to make it work and move on. That was our case anyway…

So rather than bore you to death with how we ended up debugging the JVM and discovering that a java.lang.TypeNotPresentException is thrown when calling class.isAnnotationPresent from within the cores (com.ibm.oti.reflect.AnnotationHelper.getAnnotation) of the IBM J9 JVM rather than a plain true / false, I will just give you a bullet list of the things that need to happen to keep Websphere happy.

  • Get your versions right! Jersey 1.0.3 and Websphere AS 6.1.0.25 (including 6.1.0.25 Fix Pack for Web Services) (Getting here is a blog post in itself and I will not do it here)
  • Make sure that the enterprise app that contains your Jersey resources uses “Classes loaded with parent class loader first” and “Single class loader for application” (That is in your application’s “Class loading and update detection” section.)
  • In your web xml configure the Jersey servlet to search for resources using ClassNames rather than packages. Basically make sure your web.xml looks similar to what I have below.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        <servlet>
		<servlet-name>Jersey Web Application</servlet-name>
		<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
		<init-param>
			<param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
			<param-value>com.sun.jersey.api.core.ClassNamesResourceConfig</param-value>
                </init-param>
		<init-param>
			<param-name>com.sun.jersey.config.property.classnames</param-name>
			<param-value>
				net.tmro.MyRESTfulResource
			</param-value>
		</init-param>
		<load-on-startup>10</load-on-startup>
	</servlet>
 
	<servlet-mapping>
		<servlet-name>Jersey Web Application</servlet-name>
		<url-pattern>/json/*</url-pattern>
	</servlet-mapping>
  • Okay, some clarification: the reason ClassNamesResourceConfig is used rather than PackagesResourceConfig is that when the packages are browsed for the actual @Path annotated classes an actual jar browsing is done which throws and swallows a nasty SecurityException… I invite you (more like dare you) to try using ClasspathResourceConfig and let me know if it works.

Now go ahead and give this a try… don’t forget to let me know if it worked or failed for you… Good luck!

Cheers….

iPhone how to: center and horizontal align the contents of a UITextField

Friday, August 7th, 2009

It’s as simple as:

1
2
theTextField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
theTextField.textAlignment = UITextAlignmentCenter;

Basically this will ensure that no matter how tall your text field is the actual text will be centered both vertically and horizontally.

Cheers…

iPhone build error

Saturday, July 18th, 2009

I had to deal with the same problem twice in the past 2 days so I decided to put together this little post explaining what one needs to do when they see an error message like this:

error: syntax error before ‘AT_NAME’ token
error: syntax error before ‘}’ token
fatal error: method definition not in @implementation context
Build error message

Build error message

Basically, what happens here is that the target for my iPhone application is using the wrong C/C++ Compiler version.

Here’s the fix:
Step 1 double click the target (or right click Get Info) and change the Compiler version to GCC 4.0

Compiler Version changed to 4.0

Compiler Version changed to 4.0

Step 2 add 2 new build setting conditions (one for the simulator and one for the device)

Build Setting Conditions

Build Setting Conditions

Step 3 Set the values to GCC 4.2

Final settings

Final settings

Hit the magic Cmd + B and you should now have a project that builds (or at least no longer complains about the syntax error above.

Cheers…

JATA – Java Application Terminal Alignment

Wednesday, June 3rd, 2009

The Sun JavaOne conference is now in progress and one of the interesting things that have been announced so far is the JATA.

Together with France Telecom and Orange, Motorola, Nokia, Sony Ericsson and Vodafone, Sun announced the Java Application Terminal Alignment (JATA), which they promised would reduce the number of tests application developers would need to go through to ensure their applications run on different networks and handsets.

Also promised are a publisher ID digital certificate to authenticate a person and application, and R&D signing for developers to test their applications.

I am looking forward to learning more about it… in the mean time there is always j2mepolish :)


Cheers…

Jersey 1.0.2 JSON and JAXB

Friday, May 29th, 2009

In a previous post I explained how to unit test JAX-RS. Let’s now have a look at a more complex example: implementing RESTful webservices using Jersey 1.0.2.

To get RESTful web services (JAX-RS) that produce JSON output using Jersey you have to get the following libraries:
1. Jersey 1.0.2 (see the dependencies here for a web application. Make sure you get: jersey-server.jarjersey-core.jarjsr311-api.jarasm.jar)
2. JAXB 2.1 (jaxb-impl.jarjaxb-api.jar) If you run into problems later just check that you are running jaxb 2.1.10. The 2.1.10 jaxb-impl.jar provides support for the natural jsonconfiguration.
3. JSON-lib 2.2.3 (json-lib-2.2.3-jdk15.jar) You will use this later to construct a MessageBodyWriter Provider that outputs JSON content…
Let’s start setting up the whole lot.
WEB.XML
In your web application’s web.xml make sure you’ve hooked up Jersey:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<servlet>
  <servlet-name>My Jersey Web Application</servlet-name>
  <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
  <init-param>
    <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
    <param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value>
  </init-param>
  <init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>net.tmro.demo.json;your.packages;separated.by.semicolons</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>My Jersey Web Application</servlet-name>
  <url-pattern>/webappjson/*</url-pattern>
</servlet-mapping>
1. The PackagesResourceConfig param enables your to do automatic discovery of your relevant classes as long as you provide the packages location.
2. The url pattern is the endpoint where your resources will be made available.
The RESTful resource
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package net.tmro.demo.json;
 
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
 
@Path(/myresource”)
public class MyResource {
 
	public MyResource() {
	}
 
	@GET
	@Produces(value=MediaType.APPLICATION_JSON)
	@Path(/getsomething”)
	public MyComplexObject getSomething(@QueryParam(“idOfSomething”) String id) {
		//your complex object can expose primitive data types, objects as well as collections.
		//you are not required to do anything fancy as long as you implement
		return new MyComplexObject(id);
	}
}
To get something your endpoint will now look like: http://yourserver:port/appcontext/webappjson/myresource/getsomething?ifOfSomething=id The parts in bold represent what you’ve defined so far.
The @Get annotation specifies what type of requests are handled by this method.
The @Path allows you to discriminate between several methods that you might have in this resource class.
If in your @Produces you were to specify a MediaType.APPLICATION_XML you’d get a neat xml response when pointing your browser at the endpoint above. But what we actually want is a JSON message. So let’s continue.
JSON MessageBodyWriter
The xml returned by our resource needs to be converted into JSON format. I used the json-lib that I mentioned above. Here’s the code for it:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package net.tmro.demo.json;
 
import java.io.*;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
 
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.*;
import javax.ws.rs.ext.*;
 
import com.sun.jersey.spi.resource.Singleton;
 
import net.sf.json.JSONSerializer;
 
@Provider
@Singleton
public class MyEntityProvider implements MessageBodyWriter<object> {
	//the json serializer used to write out objects to the output stream
	private final JSONSerializer serializer = new JSONSerializer();
 
	public long getSize(final Object t, final Class<?> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType) {
		return -1;
	}
 
	public boolean isWriteable(final Class<?> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType) {
		return mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE);
	}
 
	public void writeTo(final Object t, final Class<?> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType, final MultivaluedMap<string, Object> httpHeaders, final OutputStream entityStream) throws IOException, WebApplicationException {
		entityStream.write(serializer.toJSON(t).toString().getBytes());
	}
}
Not much going on here: we implement the MessageBodyWriter interface and we only use this entity provider to handle JSON mime types.
Note that the class is annotated @Provider so make sure that you have specified this package in your web.xml deployment descriptor.
Returned objects
The only thing that is still missing is the actual object that is returned. Here is an example:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package net.tmro.demo.json;
 
@XmlRootElement
public class MyComplexObject extends AnotherObject {
 
	//fields: primitive data types, objects and collections. everything gets serialized unless
	//marked as transient
 
	public MyComplexObject(String id){
	[..]
	}
 
	//getters and setters
}
The only thing that I have done really is to annotate it with @XmlRootElement. If you have properties that you do not want to return simply annotate them with @XmlTransient.
Now build and deploy your application and keep an eye on the log. You should see:
- Scanning for root resource and provider classes in the packages:
and then a list of your packages defined in the web.xml
Root resource classes found:
followed by your Resource class.
Provider classes found:
followed by the entity provider that you have implemented.
To test just point your browser to the url I described above and your browser should prompt you to save some streamed data. Open it with a text viewer and you should be able to see your JSON response.
Cheers…
Before I conclude: if you’ve tried to get things going and ended up with something like this:
com.sun.jersey.spi.container.ContainerResponse write
SEVERE: A message body writer for Java type, class [..], and MIME media type, application/json, was not found
com.sun.jersey.server.impl.application.WebApplicationImpl onException
SEVERE: Internal server error
javax.ws.rs.WebApplicationException
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:241)
you might want to check that your jaxb and json lib versions are OK and that the MessageBodyWriter implementation is picked up when you start your web app…
I would be interested to find out if you managed to find a way to NOT implement the MessageBodyWriter but still get JSON output.

The Java Store – Project Vector

Monday, May 25th, 2009
So Jonathan Schwartz’s blog is alive again. This time we get to learn about the new Java Store. 
Here are the facts (extracted from the Jonathan’s blog):
Project Vector: 
“[...] is a network service to connect companies of all sizes and types to the roughly one billion Java users all over the world. Vector (which we’ll likely rename the Java Store), has the potential to deliver the world’s largest audience to developers and businesses leveraging Java and JavaFX.”
How will it work:
“Candidate applications will be submitted via a simple web site, evaluated by Sun for safety and content, then presented under free or fee terms to the broad Java audience via our update mechanism. Over time, developers will bid for position on our storefront, and the relationships won’t be exclusive (as they have been for search). As with other app stores, Sun will charge for distribution – but unlike other app stores, whose audiences are tiny, measured in the millions or tens of millions, ours will have what we estimate to be approximately a billion users. That’s clearly a lot of traffic, and will position the Java App Store as having just about the world’s largest audience.”
More details:
“For details on how Vector will work, when it’ll be available, how to submit your content or application – alongside insights into Project Vector’s technology, roadmap, features and business model, come see us at JavaOne…”
And here are my biased comments:
1. The Java Store will annoy developers: if the storefront is taken by the developers that pay the big bucks rather than the developers that write awesome apps then this Java Store will be one store I won’t develop for.
2. If deploying the apps will require Netbeans (why do I sense that it will?) then this will annoy even more developers. Unlike Microsoft or Apple’s environments (where you know form the beginning that you kind of have to use their tools since the whole environment is closed) the Java environment is supposed to be open. Forcing Netbeans down the throats of thousands of developers would be a mistake as it will alienate them…
3. Windows only: Jonathan is talking about an audience of billions. I wonder how many of those though sport a recent version of the java runtime. Just consider the countless computers which still run java 1.4, all the Macs and the *nix systems out there. 
What do you think?
Cheers…

UITabBarButtonItem did not change its title

Monday, May 18th, 2009

Today I needed to implement the UITableView's edit / delete functionality inside my UITableViewController. That is fairly simple: 

1. in Interface Builder add a UITabBarButtonItem 
2. from the identifier list select "Edit"
3. Associate with the correct file owner
4. Pick selector and
5. In the selector implementation change the title from "Edit" to "Done" and the other way round depending on the tableView.editing property.
(6. the actual delete operation is not covered in this post)  
I assumed that after tapping the tab button the label would change to "Done". Sadly that did not happen. After a bit of debugging I found that the weird behaviour is caused by a set of _barButtonItemFlags. One of these flags is called "isSystemItem". Unfortunately this flag is set by the Interface Builder in step 2 above.
The solution:  
In step 2 above select Custom and the set the Bar Item Title below in the Interface Builder. 
In step 5 make sure you set the title back to "Edit" when coming out from the editing mode.
Even better solution (biased oppinion):
Avoid using IB to create you UIBarButtonItem! Instead just create the button programmatically using initWithTitle:style:target:action  
How do you create your Buttons?
Cheers…