Category Archives: Java

Eclipse Package Explorer

Eclipse Indigo

Have you ever had the irritating scenario where all your Java folders (including the empty ones) appear in Package Explorer even though you have correctly created the build path?

I was getting rather irritated by this intermittent “feature” so I asked a friend!

The simple solution is to filter out the unwanted empty folders.

  • Click on the downwards arrow in the top right hand side of the Package Explorer window
  • Select Filters and then make sure that “Empty Packages” is ticked

Now you will see a much cleaner representation of your project in Package Explorer

android debugging fails

I’m using eclipse as my chosen SDK for android development.  It’s great because I feel right at home; I don’t have to learn yet another IDE.

However, I am getting rather frustrated with trying to debug my android application.  Quite often eclipse just fails to communicate with the emulator or the device (depending on which I’ve chosen to run the application on).

I found a few tips on the developer.android website which are quite helpful.  I would also like to add a discovery of my own.  If you have two instances of eclipse running with different android applications, this does not a make a happy debugger!  So if you are having trouble with your debugger and you have two projects open, just close one.

Why do I have more than one instance of eclipse running you might ask.  Well it is simply to compare working code with new code that is similar but still in the making.

So as promised.  Here are the official tips for getting your debugger running again:

developer.android

When communication doesn’t seem to be happening between Eclipse and the emulator, symptoms can include: nothing happening when you press run, the emulator hanging waiting for a debugger to connect, or errors that Eclipse reports about not being able to find the emulator or shell. By far the most common symptom is that when you press run, the emulator starts (or is already running), but the application doesn’t start.

You may find any of these steps will fix the problem and with practice you probably can figure out which one you need to do for your particular issue, but to start with, the safest option is to run through all of them in order:

  1. Quit the emulator if it is running
  2. Check that any emulator processes are killed (sometimes they can hang, use ps on unix or mac, or task manager in the process view on windows).
  3. Quit Eclipse
  4. From the command line, type:
    adb kill-server
  5. Start Eclipse and try again

And here is the link:

http://developer.android.com/guide/appendix/faq/troubleshooting.html#eclipse

Reading a file from an Android Test Project

Don’t you just feel like a fool when you can’t even set up your test project to use to read a file?  It’s a common approach, you use a local file instead of a remote resource to test your processing of the data.

Well, I had to do a bit of hunting so I thought that I would share it with you.  The more posts on this topic, the quicker it will be for the next person who gets stuck on this to find the answer.

So, I was testing a POJO and felt that all I needed was to extend the AndroidTestCase but this assumption was incorrect.  In order to access the test project’s own resources you need to extend the InstrumentationTestCase

In my case I stored my test data in res\raw so that I could use a stream reader to convert the data to a simple string.  Here’s how I did it:


protected void setUp() throws Exception {
super.setUp();
try{
Resources res = getInstrumentation().getContext().getResources();
InputStream instream = res.openRawResource(R.raw.uk_atom);

...

}catch(Exception e){
Log.d(LOGTAG, e.getMessage());
}

}

Now you are not restricted to using the raw resource there are plenty of other types of resources, take a look at the documentation here: andriod developers

Happy coding!

Java Model Exception when cleaning android project

Android woes

I thought that I would add this little note just in case there is anyone out there who has also suffered this problem. It can occur if you remove an android project from your workspace and then decide to add it again as a new project. In my case I had exported the project from subversion and then deleted the original (for reasons of sanity in my repository).

So the problem occurs when you add the project back to your workspace. I’m presuming that some of the settings get really confused when you try to add a project that used to be part of the workspace. I’m not really concerned with what but more interested in the fix. Here is the error:

Java Model Status [gen [in HelloActivity] does not exist]

It occurs when you try to clean your project and you just get a red cross on your project folder and nowhere else; very irritating!

So the fix

You may only need to remove the following files:
.project
.classpath
.DS_Store (if it exists)
and then clean the project

If this doesn’t work try this:

  1. backup workspace .metadata file
  2. Restart eclipse
  3. In eclipse, from windows menu – preferences re-enter the android SDK location
  4. Now add your project as an existing android project

You might need to re-import any dependencies and mess about with the ordering after that but otherwise it should have done the job.

Extending FileProducer in Camel 2.2.0

Currently there is no documentation for Apache Camel 2.2.0 on the apache camel website.  This makes using the latest version rather more time consuming than desirable.  I thought that someone must have posted a howto or a tutorial but I was mistaken 😦

Many of the files have been replaced by generic versions and there isn’t any notes on how to use them.  So I’m going to post my discoveries here.

I needed to extend the FileProducer so that I could create a secondary file (putfile) whenever a file is sent.  This file is just to inform the system that a file has been created at another location.  So I Extended the GenericFileProducer which also required the extension of the FileComponent and the FileEndPoint.

I was puzzled as to what type to use in the generic classes.  Taking a look at a signature in the FileComponent clarified the issue:

protected GenericFileEndpoint buildFileEndpoint(String uri, String remaining, Map parameters) throws Exception

So I went ahead and used File as the type.

I wanted to save the putfile to a different location so I did this in the FileProducer by extending it. Here you can see where I have overridden the process method in order that the additional file may be constructed:

@Override
public void process(final Exchange exchange) throws Exception {
try {
process(exchange, false);
} catch (Exception ex) {
if (backupPutFileDir != null) {
log.warn("Error on main server, using backup server. ("+ ex.getMessage() +")");
process(exchange, true);
} else {
throw ex;
}
}
}
@SuppressWarnings("unchecked")
private void process(final Exchange exchange, final boolean useBackupServer) throws Exception {
boolean contentUnchanged = false;
((PutFileEndpoint) getEndpoint()).setUseBackupPath(useBackupServer);
final Object header = exchange.getIn().getHeader(PutFileComponent.EXCHANGE_CAMELFILENAME, String.class);
final String contentFileName = (String) header;
final String transactionId = exchange.getIn().getHeader(TRANSACTION_ID_HEADER, String.class);


if (((PutFileEndpoint) getEndpoint()).checkChanged()) {
String newContents = exchange.getIn().getBody().toString();
String destinationFileName = createFileName(exchange);
File destFile = new File(destinationFileName);
try {
if (destFile.exists()
&& newContents.equals(FileUtils.readFileToString(destFile))) {
contentUnchanged = true;
}
}
catch (Exception e) {
log.info("Unable to compare with destination file, so assuming it has changed");
}
}


if (contentUnchanged) {
log.info("Skipping file "+contentFileName
+" because contents haven't changed.");
txlog.info(transactionId+" SKIPPED "+contentFileName);
} else {
super.process(exchange);
// Now the file has been written by the super above, create the
// corresponding putfile
File dir = (useBackupServer ? backupPutFileDir : putFileDir);
FileUtils.forceMkdir(dir);
File putFile = new File(dir, createPutFileName());
File nameToWriteInPut = new File(dir, contentFileName);
FileUtils.writeStringToFile(putFile, nameToWriteInPut.getPath());
txlog.info(transactionId+" WRITTEN "+contentFileName);
}
}

So how does this class get called at all? Well it all starts from the FileComponent. I’ve extended this too and in order to make use of it you need to add it to your camel context either like this:

Create a file that indicates the class of your component. I wanted the word putfile to point to my PutFileComponent (extention of FileComponent so I put this in the contents of the file:

class=com.bbc.newsi.feeds.common.camel.components.PutFileComponent

Then I saved in this location:
META-INF\services\org\apache\camel\component\putfile

or you can simply add it in code like this:

CamelContext context = new DefaultCamelContext();
context.addComponent("putfile", new PutFileComponent());

Now the method buildFileEndPoint can be used to tie up all the extended classes:

@Override
public GenericFileEndpoint buildFileEndpoint(String uri, String remaining, Map parameters) throws Exception {
// the starting directory must be a static (not containing dynamic expressions)
if (remaining.indexOf("${") != -1) {
throw new IllegalArgumentException("Invalid directory: " + remaining
+ ". Dynamic expressions with ${ } placeholders is not allowed."
+ " Use the fileName option to set the dynamic expression.");
}


File file = new File(remaining);
PutFileEndpoint result = new PutFileEndpoint(uri, this);
result.setFile(file);
GenericFileConfiguration config = new GenericFileConfiguration();
config.setDirectory(file.getPath());
result.setConfiguration(config);
return result;
}