2012-03-13 18 views
1

アプリケーションエラーをHDD上のファイルに書き込むことができるOSGIバンドルのロギングシステムを開発したいと思います。Java - オーバーライド抽象メソッド

これは、活性化因子である:

import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 
import org.osgi.framework.Constants; 
import org.osgi.framework.Filter; 
import org.osgi.framework.ServiceReference; 
import org.osgi.framework.ServiceRegistration; 
import org.osgi.util.tracker.ServiceTracker; 


public class LoggingSystemApp implements BundleActivator { 

    LoggingSystemImpl log = null; 

    @Override 
    public void start(final BundleContext bc) throws Exception { 
     debug("Activator started"); 


     ServiceRegistration registerService = bc.registerService(LoggingSystemImpl.class.getName(), new LoggingSystemImpl(), new Properties()); 
      /* Start Logger System */ 
      log = LoggingSystemImpl.getInstance(); 
      log.start();  


    } 

    public void stop(BundleContext bc) throws Exception { 
     boolean ungetService = bc.ungetService(bc.getServiceReference(LoggingSystem.class.getName())); 
     st.close(); 

     log.stop(); 
    } 

    private void debug(String msg) { 
     System.out.println("JDBCBundleActivator: " + msg); 
    } 

} 

これは、ロギングシステムの実装です:

import java.io.BufferedWriter; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 
import java.nio.charset.Charset; 
import java.sql.Connection; 
import javax.sql.DataSource; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.Calendar; 
import java.util.Locale; 
import org.DX_57.osgi.LS_27.api.LoggingSystem; 

public class LoggingSystemImpl implements LoggingSystem { 

     public LoggingSystemImpl() { 
     } 

     public DataSource ds; 

     @Override 
     public void setDataSource(DataSource ds){ 
      this.ds = ds; 
     } 


     private final static Calendar calendar = Calendar.getInstance(); 
     private final static String user = System.getenv("USERNAME").toLowerCase(); 
     private final static String sMonth = calendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH); 
     private final static int y = calendar.get(Calendar.YEAR); 

     // the name of the log file 
     //private final String logName = sysDrive + "\\fttb_web - " + sMonth.toLowerCase() + ", " + y + ".log"; 
     private final String logName = "logger - " + sMonth.toLowerCase() + ", " + y + ".log"; 

     private static boolean closed; 
     private static LoggingSystemImpl log = null; 
     private static BufferedWriter bw = null; 
     private static FileOutputStream fos = null; 
     private static OutputStreamWriter osw = null; 


     /* Utilialize Buffer and wait for data to write */ 
     public void start() throws IOException{    
      log = LoggingSystemImpl.getInstance(); 
     } 

     public void stop(){    
      log.close();   
     } 

     public void WriteLog(String WriteString){ 
      log.writeln(WriteString);    
     } 

     public void LoggingSystemImpl() throws IOException 
     { 
      fos = new FileOutputStream(logName, true); 

      // set encoding to cyrillic (if available) 
      if (Charset.isSupported("windows-1251")) 
      { 
       osw = new OutputStreamWriter(fos, Charset.forName("windows-1251")); 
      } 
      else { osw = new OutputStreamWriter(fos); } 

      bw = new BufferedWriter(osw, 2048); // 2Mb buffer 


     } 

     // intro header for log session 
     public static synchronized LoggingSystemImpl getInstance() throws IOException 
     { 
      boolean exc = false; 
      try 
      { 
       if (log == null || closed) 
       { 
        log = new LoggingSystemImpl(); 
        closed = false; 
        log.writeln("logged in."); 
        log.nl(); 
       } 
      } 
    //  catch(IOException x) { exc = true; throw x; } 
      catch(Exception x) { exc = true; x.printStackTrace(); } 
      finally 
      { 
       if (exc) 
       { 
        try 
        { 
         if (fos != null) { fos.close(); fos = null; } 
         if (osw != null) { osw.close(); fos = null; } 
         if (bw != null) { bw.close(); bw = null; } 
        } 
        catch(Exception x) { x.printStackTrace(); } 
       } 
      } 
      return log; 
     } 


     public synchronized void nl() 
     { 
      try { bw.newLine(); } 
      catch(IOException x) {x.printStackTrace();} 
     } 

     public synchronized void nl(int count) 
     { 
      try 
      { 
       for (int i = 0; i < count; i++) bw.newLine(); 
      } 
      catch(IOException x) {x.printStackTrace();} 
     } 
     public synchronized void writeln(String s) 
     { 
      try { bw.write(getTime() + ": " + s); bw.newLine(); } 
      catch(IOException x) {x.printStackTrace();} 
     } 

     public synchronized void write(String s) 
     { 
      try { bw.write(s); } 
      catch (IOException x) {x.printStackTrace();} 
     } 

     public synchronized void close() 
     { 
      try 
      { 
       if (bw != null) 
       { 
        writeln("logged out."); 
        nl(); 
        bw.flush(); 
        bw.close(); 
        closed = true; 

        fos = null; 
        osw = null; 
        bw = null; 
       } 
      } 
      catch(IOException x) { x.printStackTrace(); } 

     } 

     public synchronized boolean isClosed() { return closed; } 

     public synchronized void writeException(Exception x) 
     { 
      writeln(""); 
      write("\t" + x.toString()); nl(); 
      StackTraceElement[] ste = x.getStackTrace(); 
      int j = 0; 
      for (int i = 0; i < ste.length; i++) 
      { 

       if (i < 15) { write("\t\tat " + ste[i].toString()); nl(); } 
       else { j++; } 

      } 

      if (j > 0) { write("\t\t... " + j + " more"); nl(); } 

      nl(2); 
     } 

     private String getTime() 
     { 
      Calendar c = Calendar.getInstance(); 
      int month = c.get(Calendar.MONTH) + 1; 

      int d = c.get(Calendar.DAY_OF_MONTH); 
      int h = c.get(Calendar.HOUR_OF_DAY); 

      int m = c.get(Calendar.MINUTE); 
      int s = c.get(Calendar.SECOND); 
      int y = c.get(Calendar.YEAR); 

      String dd = d < 10 ? "0"+d : ""+d; 
      String hh = h < 10 ? "0"+h : ""+h; 
      String mm = m < 10 ? "0"+m : ""+m; 
      String ss = s < 10 ? "0"+s : ""+s; 
      String sm = month < 10 ? "0"+month : ""+month; 

      return user + " [" + y + "." + sm + "." + dd + " " + hh + ":" + mm + ":" + ss + "]"; 
     }   



} 

私は、NetBeansのコードをコンパイルしようとすると、私はこのエラーを取得:

COMPILATION ERROR : 
------------------------------------------------------------- 
org/DX_57/osgi/LS_27/impl/LoggingSystemImpl.java:[34,7] error: LoggingSystemImpl is not abstract and does not override abstract method SessionRegister(String,String,String) in LoggingSystem 
1 error 

どうすればこの問題を解決できますか?

お祈り申し上げます

P.S これはインタフェース

public interface LoggingSystem { 

     public void setDataSource(DataSource ds); 


} 

EDIT のコードであるあなたが、特にコード内の他のすべてのエラーアクティベータークラスを参照してくださいか教えてもらえますか?

+1

LoggingSystem(そのインタフェースのコードを示すのに役立つ)には、 'SessionRegister(String、String、String)'というメソッドがあります。だから、 'LoggingSystemImpl'に実装する必要があります。 – assylias

答えて

3

まあ、エラーメッセージはかなり明確です。 LoggingSystemImplabstractとして宣言するか、欠落しているメソッド - SessionRegister(String,String,String)を実装することができます。

この理由は、インターフェイスLoggingSystemには、SessionRegister(String,String,String)が宣言されているためです。実装されていないため、クラスを含むすべての非抽象の子に実装する必要があります。

クイックフィックスは、次のようになります。

public class LoggingSystemImpl implements LoggingSystem { 
    void SessionRegister(String,String,String) 
    { //dummy implementation 
    } 
    //other methods 
} 
+0

ありがとうございます。コード内の他のエラー、特にActivatorクラスを確認できますか? –

+0

@ user1103606いいえ、もう一度私は 'BundleActivator 'が何であるかわかりません。 –

1

は、あなたが実装していないインタフェースで宣言SessionRegister(String,String,String)方法があるように...あなたはおそらくそれを実装する必要が見える...

4

あなたが持っていますあなたのクラスで上記のメソッドを実装する。あなたのクラスが抽象バスではないというメッセージは、その親からすべての抽象メソッドを具体的に実装していません。

1

私の推測では、あなたがLoggingSystemを宣言した場合、あなたのコードで表示として、実装クラスのインポートが問題であるということである。

import org.DX_57.osgi.LS_27.api.LoggingSystem; 

あなたはそれはあなたが実装しようとしているインタフェースだと確信していますか?

関連する問題