Saturday, July 2, 2011

Extending OpenNMS

The OpenNMS installation directory contains etc/ directory which contains all kind of configuration files which require to run openNMS, it has various configuration files for each daemon module, for example for capability daemon there is capsd.xml for collector daemon it has capsd.xml and for dataCollection definition it has jmx-dataCollection.xml for Mbeans definition, similarity for snmp there is dataCollection.xml for defining what OID’s need to be collected for SNMP services.

Now this etc directory also contains service-configuration.xml which has all module definition plus which method to be invoked for loading the module. These modules can be daemon or non daemon depending upon the requirement. all module follows standard MBean criteria. These modules are started in the sequence they are mention in the file. I mean top most will be executed first and the bottom most ( which is embedded jetty-web server) will be the last.

 

<service-configuration>
  <service>
    <name>:Name=XSLTProcessor</name>
    <class-name>mx4j.tools.adaptor.http.XSLTProcessor</class-name>
  </service>
  <service>
    <name>:Name=HttpAdaptor</name>
    <class-name>mx4j.tools.adaptor.http.HttpAdaptor</class-name>
    <attribute>
      <name>Port</name>
      <value type="java.lang.Integer">8180</value>
    </attribute>
    <attribute>
      <name>Host</name>
…………………………………….

If we add new service definition here, the OpenNMS will load our service ..

for example let say we want to delete all logs or previous data collected on starting up openNMS, we have to add our service in this xml then only openNMS could start our service.

<service-configuration>

<service>
  <name>OurService:Name=CleanupService</name>
  <class-name>org.ourservice.Clean</class-name>
  <invoke at="start" pass="0" method="start"/>

</service>
  <service>
    <name>:Name=XSLTProcessor</name>
    <class-name>mx4j.tools.adaptor.http.XSLTProcessor</class-name>
  </service>
  <service>
    <name>:Name=HttpAdaptor</name>
    <class-name>mx4j.tools.adaptor.http.HttpAdaptor</class-name>
    <attribute>
      <name>Port</name>
      <value type="java.lang.Integer">8180</value>
    </attribute>
    <attribute>
      <name>Host</name>

now CleanupService will be triggered first. for starting this service start method will be invoked of Clean class. The clean Class must implement MBean.
create CleanMBean interface and declare start method signature.

package org.ourservice;

public interface CleanMBean {
    public void start();
}

now create Clean class and implement CleanMBean interface, also implement logic to clean the data.

package org.ourservice;

public class Clean implements CleanMBean {
    public void start(){
       System.out.println(“Cleaned all”);

     }

}

 

 

After compiling the Clean class and other dependant classes. create classes directory inside openNMS installation directory and put all our classes inside. then start openNMS.

Java5 Instumentation API

The instrumentation API is for run time byte manupulation, or you can say bytecode engineering. 

we have to define our instrumentation agent which consist starting point same as main method of any java application with different arguments.

String : arguments to this agent..

Instrumentation object, instrumentation agent is a class with a special method, with a predefined signature, that the JVM will invoke before the rest of the application for you to set up any instrumentation code. Generally, instrumentation is the act of transforming classes for profiling purposes: for example, an interesting feature provided by the instrumentation framework is the ability to measure the memory usage of an object. 
 

import java.lang.instrument.Instrumentation;

public class MyAgent {
    public static void premain(String agentArguments,
            Instrumentation instrumentation) {

        MyTransFormer transformer = new MyTransFormer();
        instrumentation.addTransformer(transformer);
        Node node = new Node();
        long size = instrumentation.getObjectSize(node);
        System.out.println("size of "+ node.getClass().getSimpleName() + size);
    }
}

we have compiled the agent class and  we need to package it into a jar , we also need to create a manifest file

Premain-Class: MyAgent 
java -javaagent:myagent.jar TestMain
 
creating transformer
import java.lang.instrument.ClassFileTransformer; 
import java.security.ProtectionDomain;

public class MyTransFormer implements ClassFileTransformer {


    public MyTransFormer() {
        super();
    }


public byte[] transform(ClassLoader loader, String className,
            Class redefiningClass, ProtectionDomain domain, byte[] bytes) {
        // some changes in byte code // there are some standard API for byte
        // code modification exp: BCEL, ASM etc…
        return bytes;
    }
}


There are some links i went while reading .



  1. http://www.javalobby.org/java/forums/t19309.html#92037417

  2. http://www.cs.nuim.ie/~jpower/Research/instrument/#examples

  3. http://www.javamex.com/tutorials/memory/instrumentation.shtml

Monday, June 13, 2011

Handling more than one exception, Java SE 7 new feature.

In Java SE 7 and later, a single catch block can handle 
more than one type of exception. This feature can reduce code 
duplication and lessen the temptation to catch an overly broad 
exception. 
 
consider the following example... 
try{
.............

}
catch (IOException ex) {
     logger.log(ex);
     throw ex;
catch (SQLException ex) {
     logger.log(ex);
     throw ex;
}
 
 
The following example, which is valid in Java SE 7 and later, 
eliminates the duplicated code:
 
catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
} 

Tuesday, May 31, 2011

Installing openNMS on RedHat using rpm.

I am assuming postgres database is already installed.

download the following rpm.


 now installing process...
rpm -ivh opennms-core-1.8.5-1.noarch.rpm
rpm -ivh  jicmp-1.0.6-1.fc8.i386.rpm
rpm -ivh opennms-webapp-jetty-1.8.5-1.noarch.rpm


stop postgres database if it is running
/etc/init.d/postgresql stop

To allow OpenNMS to connect to the database, you will need to edit your database's  
pg_hba.conf file. On many default installations it can be found in the directory
/var/lib/pgsql/data/

local   all   all                      ident sameuser
host    all   all    127.0.0.1/32      ident sameuser
host    all   all    ::1/128           ident sameuser

You will need to change these entries to resemble the following: 


local   all   all                      trust
host    all   all    127.0.0.1/32      trust
host    all   all    ::1/128           trust
Next, you will need to edit postgresql.conf to accept TCP/IP 
connections. As with pg_hba.conf, check the defaults or your 
distribution's PostgreSQL documentation for the location of 
this file. As before, on many default installations it can 
be found in the directory /var/lib/pgsql/data/ Both 
postgresql.conf and pg_hba.conf by default should be 
in the same location.
 
....
#listen_addresses = 'localhost'
 ....

uncomment this line to resemble

....
listen_addresses = 'localhost'
 ....

start the postgres db..
/etc/init.d/postgresql start


go to /opt/opennms/bin/ (default installation dir for opennms)

run the install script...
#>install



after that start opennms

#>opennms start

open http://localhost:8980/opennms/index.jsp

and enjoy...:)

Wednesday, March 9, 2011

Simulating queue using stack...

Problem statement: we are given one stack and we have to implement the queue using this stack means enqueue(insert into stack) and dequeue ( pop from stack) should behave as queue. No additional stack should be used.

This can be done using Operating system stack by using recursion.
public class SimulatedQueue < E > {
    private java.util.Stack < E > stack = 
                     new java.util.Stack < E >();

    public void insert(E elem) {
        if (!stack.empty()) {
            E topElem = stack.pop();
            insert(elem);
            stack.push(topElem);
        }
        else
            stack.push(elem);
    }

    public E remove() {
        return stack.pop();
    }
}








Thursday, September 9, 2010

What is framework and how it differs from library?

A library is essentially a set of functions that we can use in our projects, libraries are bundled into jar (java) usually organized into classes. Each call does some work and returns control to the client.

A framework is same as libraries in the structure but differs in the design and functionality with more behavior built in. In order to use it you need to insert your behavior into various places in the framework either by sub-classing or by plugging in your own classes. The framework's code then calls your code at these points.

In short frame is the best possible use of basic libraries, as the frameworks are usually built on the top of libraries.

Inversion of Control is a key part of what makes a framework different to a library.

Wednesday, August 4, 2010

SQL queries

select employee_id,last_name, salary,department_id
from employees
where manager_id = &mid;
--=========================================================
select last_name
from employees
where last_name like '__a%';
--=========================================================
select last_name
from employees
where last_name like ('%a%e%') or last_name like ('%e%a%');
--=========================================================
--is not null
select last_name, salary, commission_pct
from employees
where commission_pct is not null;
--=========================================================
--between two specified dates
select last_name, hire_date
from employees
where hire_date between to_date('1994/01/01',
'yyyy/mm/dd')
AND to_date ('1994/12/31', 'yyyy/mm/dd');

select * from employees
where department_id not in (select department_id
from departments);
--=========================================================
select last_name, department_id,salary
from employees
where department_id IN (20,50) and salary between 5000
and 12000
order by last_name;
--=========================================================
select last_name, job_id

from employees
where last_name IN ('Taylor','Matos');
--=========================================================

Thursday, April 8, 2010

Redireciton of input and output on linux shell..

Syntax:
linux-command redirection-symbol input/output-file-name

There are three basic redirection operators.
  1. output (>)
    ex: $ ls > dirList.txt
    the output of the ls command will write in dirList.txt if the file is already present then it will be overwritten without any warning.

  2. append (>>)
    To output Linux-commands result to the end of file (append). Note that if file exist , it will be opened and new information will be written to end of file, without losing previous information, And if file is not exist, then new file is created. For e.g. To send output of pstree command to already exist file give command
    ex: $ pstree >> processList.txt

  3. input (<) To take input to Linux-command from file instead of key-board. If file does not exist then you have to give using key-board. ex: ./a.out < input.in
In Linux in C/CPP programming Language keyboard, screen etc are all treated as files. these files are:


































File Name

Discriptor

Use

Example

Stdin

0

Standard Input

Keyboard

Stdout

1

Standard Output

Screen

Stderr

2

Standard Error

Screen
In linux every program has three files associated with it, (when we start our program these three files are automatically opened by the shell). The use of first two files (stdin and stdout) , are already seen by us. The last file stderr is used by our program to print error on screen. Error message can't be redirected, for example the Command $ rm file1.txt > getError.txt will not log the error(rm: cannot remove `file1.txt': No such file or directory) into the file getError.txt in case file1.txt does not present, since output is send to error device. But if still want to log the error, use the discriptor for example $ rm file1.txt 2>getError.txt


Friday, April 2, 2010

The logic behind Ethiopian multiplication.

This method of multiplication is also called Egyptian Multiplication (as believed it was developed in Egypt).

How it Works.
  • write two no in the adjacent columns(smaller one in left side,

  • In the left column recursively halve the number, discarding remainders,

  • In the right column recursively double the number and write the result below, do this unlit left column shows 1,

  • Test for the left column if it is odd then add corresponding no in the right column.

Example

A = 34;
B = 12;






















BA
1234
668
3136
1272

_________________________________________
408
_________________________________________

12*34 = 136+272
= 34*4 + 34*8
= 34(4+8)
= 34(22+23)
= 34(12)

The main idea is that break the first no in the power of two and multiplication with 2 is easier. Then add to obtain result.

Search Ranjeet's Blog