2011-12-28 75 views
1

我需要寫一個OSGI模塊的幫助。這是我寫的代碼。它還沒有完成,但我可以用Netbeans編譯它。如何創建一個簡單的OSGI模塊

/* 
* OSGI Module for Sessions handling 
*/ 

package com.SessionHandle; 
/** include SQL Packages */ 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import javax.sql.DataSource; 
import javax.annotation.Resource; 
    // or import javax.faces.bean.ManagedBean; 

public class sessionLogger { 
    public String error_Message = null; 
    public String error_Database = null; 

    /** Call the Oracle JDBC Connection driver */ 
    @Resource(name="java:/Oracle") 
    private DataSource ds; 


    /** method for checking active sessions into the Oracle database. 
    * The calling module sends the UserId, UserIP, UserBrowserId. 
    * If the check is successful the LastRefreshTime is updated with 
    * with the current time. 
    */ 

    /* 
    CREATE TABLE "ACTIVESESSIONS"(
    "SessionId" Char(20) NOT NULL, 
    "UserId" Varchar2(30) NOT NULL, 
    "LoginTime" Timestamp(6), 
    "LastRefreshTime" Timestamp(6), 
    "UserIP" Varchar2(30), 
    "UserBrowserID" Varchar2(30)) 
    */ 

     public Integer activeSessionCheck(String sessionId, String userId, 
             String loginTime, String lastRefreshTime, 
             String userIp, String userBrowserId) throws SQLException { 

      String storedSession = null; 
      error_Message = null; 
      String SQL_Statement = null; 

      if (ds == null) throw new SQLException(error_Database = "No data source");  
     Connection conn = ds.getConnection(); 
      if (conn == null) throw new SQLException(error_Database = "No connection");  

     try { 
      conn.setAutoCommit(false); 
      boolean committed = false; 
       try { 
         SQL_Statement = "SELECT * from ACTIVESESSIONS WHERE SessionId = ? AND UserIP = ? AND UserBrowserID = ?"; 

         PreparedStatement sessionQuery = conn.prepareStatement(SQL_Statement); 
         sessionQuery.setString(1, sessionId); 
         sessionQuery.setString(2, userIp); 
         sessionQuery.setString(3, userBrowserId); 

         ResultSet result = sessionQuery.executeQuery(); 

         if(result.next()){ 
          storedSession = result.getString("SessionId"); 
         } 

         conn.commit(); 
         committed = true; 
       } finally { 
         if (!committed) conn.rollback(); 
         } 
      } 
       finally {    
       conn.close(); 

       } 
     /** If the session is not null update the session expire time */ 
     if (storedSession != null){ 

       try { 
        conn.setAutoCommit(false); 
        boolean committed = false; 
        try {   /* insert into Oracle the default system(Linux) time */ 
          SQL_Statement = "UPDATE ACTIVESESSIONS SET LastRefreshTime = SYSDATE WHERE SessionId = ?"; 

          PreparedStatement insertQuery = conn.prepareStatement(SQL_Statement);                
          insertQuery.setString(1, sessionId);      
          insertQuery.executeUpdate();     

          conn.commit(); 
          committed = true; 
        } finally { 
          if (!committed) conn.rollback(); 
          } 
        } 
        finally {    
        conn.close(); 

        }  
       /** if the session is registered successfully return 0 */ 
       return 0; 
      } else { 
       /** if the session is not registered return 1 */ 
       return 1; 
      }  
     /*!!!!!! dobavi vav faces-config novo navigation rule - ako se varne otgovor 1 da prepra6ta klienta na login menu */ 
     } 

     /** method for recording user activity into the Oracle database */ 

     /* 
     CREATE TABLE "SESSIONSLOG"(
    "SessionID" Varchar2(30) NOT NULL, 
    "Username" Varchar2(30), 
    "IpAddress" Varchar2(30), 
    "WebBrowserID" Varchar2(30), 
    "LoginTime" Timestamp(6), 
    "LogoutTime" Timestamp(6)) 
     */  

     public void sessionLog(String sessionId, String userName, 
           String ipAddress, String webBrowserId, 
           String loginTime, String logoutTime) throws SQLException { 

      String storedPassword = null; 
      error_Message = null; 
      String SQL_Statement = null; 

      if (ds == null) throw new SQLException(error_Database = "No data source");  
     Connection conn = ds.getConnection(); 
      if (conn == null) throw new SQLException(error_Database = "No connection");  

     try { 
      conn.setAutoCommit(false); 
      boolean committed = false; 
       try { 
         SQL_Statement = "SELECT passwd from USERS WHERE userz = ?"; 

         PreparedStatement passwordQuery = conn.prepareStatement(SQL_Statement); 
         passwordQuery.setString(1, sessionId); 

         ResultSet result = passwordQuery.executeQuery(); 

         if(result.next()){ 
          storedPassword = result.getString("passwd"); 
         } 

         conn.commit(); 
         committed = true; 
       } finally { 
         if (!committed) conn.rollback(); 
         } 
      } 
       finally {    
       conn.close(); 

       } 
     /** if the user is not found or password don't match display error message*/ 
     if (storedPassword == null){ 
      error_Message = "Invalid Username!"; 
     } else { 
      error_Message = "Invalid Password!"; 
     } 

     return;  
     } 



     /** method for recording sessions activity into the Oracle database */ 

     /* 
     CREATE TABLE "ACTIVESESSIONSLOG"(
    "SessionId" Varchar2(30) NOT NULL, 
    "UserId" Varchar2(30), 
    "ActivityStart" Timestamp(6), 
    "ActivityEnd" Timestamp(6), 
    "Activity" Clob) 
     */ 

     public void activeSessionLog(String sessionId,  String userId, 
             String activityStart, String activityEnd, 
             String Activity) throws SQLException { 
      String storedPassword = null; 
      error_Message = null; 
      String SQL_Statement = null; 

      if (ds == null) throw new SQLException(error_Database = "No data source");  
     Connection conn = ds.getConnection(); 
      if (conn == null) throw new SQLException(error_Database = "No connection");  

     try { 
      conn.setAutoCommit(false); 
      boolean committed = false; 
       try { 
         SQL_Statement = "SELECT passwd from USERS WHERE userz = ?"; 

         PreparedStatement passwordQuery = conn.prepareStatement(SQL_Statement); 
         passwordQuery.setString(1, sessionId); 

         ResultSet result = passwordQuery.executeQuery(); 

         if(result.next()){ 
          storedPassword = result.getString("passwd"); 
         } 

         conn.commit(); 
         committed = true; 
       } finally { 
         if (!committed) conn.rollback(); 
         } 
      } 
       finally {    
       conn.close(); 

       } 
     /** if the user is not found or password don't match display error message*/ 
     if (storedPassword == null){ 
      error_Message = "Invalid Username!"; 
     } else { 
      error_Message = "Invalid Password!"; 
     } 

     return;  
     } 


} 

這是OSGi包的文件結構:

[email protected]:~/NetBeansProjects$ tree SL_24 
SL_24 
├── nbactions.xml 
├── pom.xml 
├── src 
│   └── main 
│    ├── assembly 
│    │   └── felix.xml 
│    ├── java 
│    │   └── com 
│    │    ├── SessionHandle 
│    │    │   └── sessionLogger.java 
│    │    └── SL_24 
│    │     └── Activator.java 
│    └── resources 
│     └── com 
│      └── SL_24 
└── target 
    ├── classes 
    │   ├── com 
    │   │   ├── SessionHandle 
    │   │   │   └── sessionLogger.class 
    │   │   └── SL_24 
    │   │    └── Activator.class 
    │   └── META-INF 
    │    └── MANIFEST.MF 
    ├── generated-sources 
    │   └── annotations 
    ├── SL_24-1.0-SNAPSHOT.jar 
    └── surefire 

19 directories, 9 files 

這是Activator類,我不知道該怎麼寫:

package com.SL_24; 

import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 

public class Activator implements BundleActivator { 

    public void start(BundleContext context) throws Exception { 
     System.out.println("Module SL_24 is Loaded!"); 
    } 

    public void stop(BundleContext context) throws Exception { 
     System.out.println("Module SL_24 in Unloaded!"); 
    } 

} 

問題來了當我嘗試將其部署到JBoss 7.1.0服務器時。看來,激活類沒有正確書寫。你能幫我以適當的方式寫下來,以後我可以調用OSGI bundle insight EAR包的方法嗎?

國王的問候,

彼得

+0

p.s.事實證明,當我刪除這行「@Resource(name =」java:/ Oracle「)」時,該包已成功部署。也許我錯過了POM文件中的東西?或者OSGI包不能查詢數據庫? – 2011-12-28 11:07:27

+0

請始終聲明您收到的錯誤消息,而不僅僅是「它不工作」或「看起來沒有正確書寫」。這些聲明根本無助於解決問題。 – 2011-12-28 12:51:45

+0

哦,當然** ** OSGi包可以進行數據庫查詢。 – 2011-12-28 12:52:30

回答

1

根據您的評論給出的錯誤跟蹤,我看到有一個NullPointerException來自內部的JBoss被拋出。看起來這可能是JBoss中的一個bug,因此應該在JBoss論壇上討論。

+0

我應該更改Activator類嗎? – 2011-12-28 13:23:18

+0

爲什麼?似乎沒有任何問題(除非它沒有任何用處,但我想你已經知道了!) – 2011-12-28 13:31:53