Friday, June 7, 2013

MongoDB HTTP Interface

I wondered does MongoDB has REST interface (This thought came to be while i was going through CouchDB Futon). Found something interesting with mongoDB also

1. Start your mongod process with command "mongod --rest"

2. Hit http://localhost:28017 in you browser
     ->It should list you some system admin data.

     ->It should have given list of databases as a JSON response. For example I had bellow

{ "databases" : [ 
    { "name" : "blog",
      "sizeOnDisk" : 218103808,
      "empty" : false }, 
    { "name" : "course",
      "sizeOnDisk" : 218103808,
      "empty" : false }, 
    { "name" : "m101",
      "sizeOnDisk" : 218103808,
      "empty" : false }, 
    { "name" : "mydb",
      "sizeOnDisk" : 218103808,
      "empty" : false }, 
    { "name" : "pcat",
      "sizeOnDisk" : 218103808,
      "empty" : false }, 
    { "name" : "school",
      "sizeOnDisk" : 218103808,
      "empty" : false }, 
    { "name" : "students",
      "sizeOnDisk" : 218103808,
      "empty" : false }, 
    { "name" : "test",
      "sizeOnDisk" : 218103808,
      "empty" : false }, 
    { "name" : "local",
      "sizeOnDisk" : 1,
      "empty" : true } ],
  "totalSize" : 1744830464 }

4. You could see list of commands supported over REST at the following location

5. To  lists all documents under "posts" collection in "blog" database

6. To see a specific document in posts collection with query {author="narayan"}

Following link gives some comprehensive note on this HTTP interface. Read and benefit!!!

http://docs.mongodb.org/ecosystem/tools/http-interfaces/

Saturday, June 1, 2013

MongoDB Map-Reduce Example with Code

Today I was learning mongoDB map-Reduce function. To understand the concept I built the following example.

Assume we have the collections called “things” which has following records



[
        {
                "_id" : ObjectId("51a9e753d7a333351958d6be"),
                "id_" : 1234,
                "title" : "Microsoft .Net",
                "tags" : [
                        "dot net",
                        ".net",
                        ". net"
                ]
        },
        {
                "_id" : ObjectId("51a9e7a7d7a333351958d6bf"),
                "id_" : 5678,
                "title" : "J2EE",
                "tags" : [
                        "Java",
                        "Servelet",
                        "JSP"
                ]
        },
        {
                "_id" : ObjectId("51a9ebefd7a333351958d6c0"),
                "id_" : 2,
                "title" : "J2EE",
                "tags" : [
                        "JSF",
                        "Portlet",
                        "REST"
                ]
        },
        {
                "_id" : ObjectId("51a9ec3fd7a333351958d6c1"),
                "id_" : 3,
                "title" : "Microsoft .Net",
                "tags" : [
                        "C#",
                        "VB.net",
                        "ASP.net"
                ]
        }
]


If you see in the above collection, there are 2 records with title “J2EE”. Each record has 3 tags. My objective is to know totally how many tags for each course title(J2EE). For this I am set to use map-Reduce of mongoDB

Map function goes like this:


var mapFun = function(){
var k=this.title;
var v=this.tags.length;
emit(k,v);
};


In the above map function for each record, I am finding the total number of “tags” and emitting (throws) the key value pair as (J2EE, [3,3])

MongoDB map-Reduce function catches the emitted key value pairs from emit function. And it the groups the similar key records and puts the value in a array. Hence the resulting record is of form (“J2EE”, [3,3])

Reduce function goes like this:


var redFun = function(key,values){
            return Array.sum(values);
};


In the above reduce function, it totals the values present in the values array. In out example it would have received input like redFun(“J2EE”,[3,3]). So the return value would be 6 which is total number of tags for J2EE title.

Now our map-Reduce function is written as follows


db.things.mapReduce(
mapFun,
redFun,
{out:"tagcount"}
)


The above mapReduce function, we are outputting the value in “tagcount” collection. When “tagcount” collection is seen, it looks like bellow


[
        {
                "_id" : "J2EE",
                "value" : 6
        },
        {
                "_id" : "Microsoft .Net",
                "value" : 6
        }
]


So now we got the needed collection.


Simple REST Example without Security

I wanted to do one sample project using CouchDB. So I have been looking in to internet for very simple REST example with Java. Could hardly find any. Hope bellow one will help many.

This article is not going to tell what is CouchDB. Assume it as a REST provider. So when I hit a url in browser , it is going to give me a text response.

Following is the REST client which shows how the same url could be fired through JAVA program to obtain the result

------------------------------------------
package course;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

public class RestClient {

    public final static String endpoint = "http://127.0.0.1:5984/courses/_all_docs";

    public static void main(String[] args) {
        HttpURLConnection request = null;
        BufferedReader reader = null;
        StringBuilder response = null;
        try{
            URL endpointUrl = new URL(endpoint);
            request = (HttpURLConnection)endpointUrl.openConnection();
            request.setRequestMethod("GET");
            request.connect();
            reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
            response = new StringBuilder();
            String line;
            while((line=reader.readLine())!=null){
                response.append(line);
            }
            reader.close();
            request.disconnect();
            System.out.println(response);

         } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
-----------------------------------------------------------------------------

Wednesday, May 22, 2013

Integrated solution console(Admin console) URL for V8 WPS

Following is the url format for accessing the ISC -Integrated solutions console or admin console of Websphere portal Server V8

https://host:10032/ibm/console/

URL to access WSDL document of WSRP producer


Hi,

I tried to look in to the list of WSRP services in the portal. To do this we need to type the following url

http://host:port/wps/wsdl/wsrp_service.wsdl

By default In V8, you could find 2 version of WSRP services v1 and v2. Each version will by default have

WSRPBaseService
WSRPServiceDescriptionService
WSRPPortletManagementService

Monday, April 15, 2013

Anonymous Search Collection for custom Search Portlet



Introduction

The objective of the task is to create a Portal Search collection, which
could index contents inside specific site area of the WCM. As the client
has specific UI needs, Instead of out of box Search Portlet, the developer
is expected to access the Search services from the custom portal. All
contents thus searched from the custom Portlet should be searchable in
anonymous mode.


Steps to Create Collection


· Go to Administration > Manage Search >Search Collections > Default
Search Collection
· Click "New Collection"



· Click "ok"


Steps to Create Index


· Click "NCCollection"
· Click "New Content Source"
· Under "Content Source type" select "WCM site"
· Under "General Parameters"
o Content Source Name : DataIndex
o Collect documents linked from this URL :
http://hostname:10039/wps/seedlist/myserver?SeedlistId=NC_Contents/Data&Source=com.ibm.workplace.wcm.plugins.seedlist.retriever.WCMRetrieverFactory&Action=GetDocuments
o Stop fetching a document after (sec): 1800

· Under "Schedulers"
o From: Today's Date
o At: Current time
o Update every: 1 days
o Click Create
· Under "Security"
o User Name: wpsadmin
o Password: wpsadmin
o Host Name: hostname
o Click Create

· Click "Save"
· Click Play icon


· After some time click "Refresh" to see no of Documents indexed





Giving Anonymous Access to the Collection Resources



· Go to Administration > Access > Resource Permissions > PSE Sources
· Click on "Assign Access"





· Click on "Edit Role" against User



· Click Add
· Select "Anonymous Portal User"
· Click "ok"


Accessing the Collection Service using contenthandler servlet

It is possible to launch the search over the index thus created using
contenthandler servlet. Following is the example url which caries a query
text as "keyword".

http://hostname:10039/wps/contenthandler/searchfeed/search?queryLang=en&locale=en&resultLang=en&query=keyword&start=0&results=10&index=Default
+Search
+Service%3A%3AC%3A%5CIBM%5CWebSphere%5Cwp_profile%5CPortalServer%5Ccollections%5CDataIndex

For linux/unix based portal environments, the url would be of bellow format

http://hostname:10039/wps/contenthandler/searchfeed/search?queryLang=en&locale=en&resultLang=en&query=keyword&start=0&results=10&index=Default
+Search
+Service%3A%3A%2Fopt%2FIBM%2FWebSphere%2Fwp_profile%2FPortalServer%2Fcollections%2FDataIndex

The above URL could be launched from the custom Portlet and the response
would be in the form of ATOM feed. The developer could parse the ATOM Feed
and build the custom Portlet as per the UI needs given by customer.

Sample Portlet using Web Experience Factory 8

To download Web experience Factory 8, go to
http://www.ibm.com/developerworks/downloads/ws/wpf/. Installation is fairly
simple. Now let's quickly start creating a sample Portlet.

· Create a project by clicking File>New>Web Experience Factory Project.
· In Project Name page, Enter Project Name: SampleProj
· Click Next
· In Feature Set Page, Uncheck all
· Click Finish
· Select No if prompted for "Would you like to publish project now?"
· Right Click "SampleProj"> New> Web Experience Factory Model
· Select "SampleProj"
· Click Next
· In Select Model page, Select "Main and Page"
· Click Next
· In Page Settings page, Select "Simple Page"
· Click Next
· In Save New model page, Select "models" folder and enter Model name
as "SamplePortlet"
· Click Finish
· You will have following Screen

· Now double click "SampleProject.model"
· Select "Application Tree" tab
· Select "page1"
· Click on "Add Builder Call to the Current Model"
· Select "Portlet Adapter"
· Click ok
· In the Portlet Adapter page
· Enter Name: SamplePortlet
· Portlet Title: SamplePortlet
· Portlet Description: SamplePortlet
· Click OK
· Now Right click "SampleProj">Export>Web Experience Factory Portlet
WAR
· Click Finish
· Now you could deploy the war thus obtained through Portal Web
Console.