Java - 覆盖抽象方法

时间:2012-03-13 22:10:40

标签: java osgi

我想在OSGI包中开发日志系统,它可以将应用程序错误写入硬盘上的文件中。

这是激活者:

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);
    }

}

这是Logging系统的实现:

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 你能告诉我你在代码中看到任何其他错误,尤其是Activator类吗?

2 个答案:

答案 0 :(得分:4)

您必须在班级中实施上述方法。消息说你的类不抽象总线没有具体实现其父母的所有抽象方法。

答案 1 :(得分:3)

嗯,错误信息很清楚。您可以将LoggingSystemImpl声明为abstract,也可以实现缺少的方法 - SessionRegister(String,String,String)

原因是接口LoggingSystem声明了方法SessionRegister(String,String,String)。因为它没有实现,所以需要在所有非抽象的子代中实现,包括你的类。

快速解决方法是:

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