Monday, March 28, 2011

OSGi bootdelegation

I found a situation where an osgi bundle made a reference to an expected system library that wasn't there, but since the bundle did not include the dependency as an osgi reference, the framework (Felix in this case) threw a 'Class Not Found' exception.

Turns out, our friends at the OSGi Alliance have a solution for this kind of problem.

org.osgi.framework.bootdelegation=package

Essentially, packages specified will bypass the osgi environment and go directly to the VM.

Seems like this feature should be used sparingly and only when necessary.

MongoDB Shell Command Reference

Good reference for MongoDB shell commands:
http://www.mongodb.org/display/DOCS/dbshell+Reference

Debugging Pax-Runner Applications

Include as flag passed into paxrunner.jar
--vmOptions="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"

In IDE start a remote debugging session and use port 5005.

See Also:

Sunday, March 27, 2011

Sample Java usage for MongoDB

Maven
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.5</version>
</dependency>

Connect to Mongo
import com.mongodb.DB;
import com.mongodb.Mongo;

//...

Mongo mongo = new Mongo(host, 27017);
DB db = mongo.getDB("name of db"); //If db does not exist, then it will be created.

Insert JSON Data
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;

//...

DBCollection coll = db.getCollection("testCollection"); //If collection does not exist, then it will be created.
BasicDBObject doc = new BasicDBObject();
doc.put("hello", "world");

BasicDBObject inner = new BasicDBObject();
inner.put("key","value");
doc.put("inner", inner);

coll.insert(doc);

Fetch JSON Data
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection
import com.mongodb.DBCursor;

//...

DBCollection coll = db.getCollection("testCollection");
BasicDBObject query = new BasicDBObject();
query.put("hello", "world");
DBCursor cursor = coll.find(query);
while(cursor.hasNext()) {
System.out.println(cursor.next());
}

GridFS
import com.mongodb.gridfs.GridFS;

//...

GridFS fs = new GridFS(db, "collection"); //If bucket does not exist, it will be created.

GridFS Save File
import java.io.File;
import com.mongodb.gridfs.GridFSInputFile;

//...

GridFSInputFile file = fs.createFile(new File("/path/to/file.ext"));
file.save();

GridFS List Files
import com.mongodb.DBCursor;

//...

DBCursor cursor = fs.getFileList();
while(cursor.hasNext()) {
System.out.println(cursor.next());
}

GridFS Read File
GridFSDBFile file = fs.findOne("file.ext");
BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream()));
String line = null;
while((line = reader.readLine()) != null){
System.out.println(line);
}

Map/Reduce
Example Dataset:
{ "_id" : ObjectId("4d8233d6d638a2ca105b1fab"), "name" : "John", "number" : 2 }
{ "_id" : ObjectId("4d8233d6d638a2ca105b1fac"), "name" : "Jane", "number" : 2 }
{ "_id" : ObjectId("4d8233dbd638e40a183d27f8"), "name" : "John", "number" : 2 }
{ "_id" : ObjectId("4d8233dcd638e40a183d27f9"), "name" : "Jane", "number" : 2 }

Code Example:
import com.mongodb.MapReduceCommand;
import com.mongodb.MapReduceOutput;

//...

String map = "function(){" +
"emit(this.name, {count: 1, sum: this.number});" +
"};";

String reduce = "function( key , values ){" +

"var n = { count: 0, sum: 0}; " +

"for ( var i = 0; i < values.length; i ++ ) {" +

"n.sum += values[i].sum;" +

"n.count += values[i].count;" +

"};" +

"return n;" +

"};";

MapReduceOutput out = coll.mapReduce(map, reduce, null, MapReduceCommand.OutputType.INLINE, null);
for ( DBObject obj : out.results() ) {
System.out.println( obj );
}

Expected Output:
{ "_id" : "Jane" , "value" : { "count" : 2.0 , "sum" : 4.0}}
{ "_id" : "John" , "value" : { "count" : 2.0 , "sum" : 4.0}}

Execute Shell Commands in Ruby

There are 3 ways in Ruby to execute Shell commands, each does it a little differently.

exec 'command'
This will execute the command and exit the Ruby script.

system 'command'
This will execute the command but you have no way to access the results. You will simply get a true or false indicating if the command was able to be executed. Call $? to get more information on the exit conditions

`command`
This will execute the command and give you access to any returned strings.

Create Class Dynamically in Ruby

Sample
def create_class_dynamically(mybinding)
clazz = 'class MyClass; end'
Kernel.eval(clazz, mybinding)
end

create_class_dynamically(binding)

Connect to SOAP Server in Ruby

Simple Example
require 'soap/wsdlDriver'

def self.remote_wsdl(url)
wsdl = SOAP::WSDLDriverFactory.new(url)
begin
return wsdl.create_rpc_driver
rescue
return wsdl.create_driver
end
end