// serverThread.java 
// -----------------------
// (C) by Michael Peter Christen; mc@anomic.de
// first published on http://www.yacy.net
// Frankfurt, Germany, 2005
// last major change: 14.03.2005
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
// Using this software in any meaning (reading, learning, copying, compiling,
// running) means that you agree that the Author(s) is (are) not responsible
// for cost, loss of data or any harm that may be caused directly or indirectly
// by usage of this softare or this documentation. The usage of this software
// is on your own risk. The installation and usage (starting/running) of this
// software may allow other people or application to access your computer and
// any attached devices and is highly dependent on the configuration of the
// software which must be done by the user of the software; the author(s) is
// (are) also not responsible for proper configuration and usage of the
// software, even if provoked by documentation provided together with
// the software.
//
// Any changes to this file according to the GPL as documented in the file
// gpl.txt aside this file in the shipment you received can be done to the
// lines that follows this copyright notice here, but changes must not be
// done inside the copyright notive above. A re-distribution must contain
// the intact and unchanged copyright notice.
// Contributions and changes to the program code must be marked as such.

package de.anomic.server;

import de.anomic.server.logging.serverLog;

public interface serverThread {
    
    // -------------------------------------------------------
    // methods inherited from Thread; needed for compatibility
    public void start();
    public boolean isAlive();
    
    // --------------------------------------------------------------------------
    // these method are implemented by serverThread and do not need to be altered
    // this includes also the run()-Method
    
    public void setDescription(String shortText, String longText, String monitorURL);
    // sets a visible description string
    
    public void setStartupSleep(long milliseconds);
    // sets a sleep time before execution of the job-loop

    public long setIdleSleep(long milliseconds);
    // sets a sleep time for pauses between two jobs if the job returns false (idle)

    public long setBusySleep(long milliseconds);
    // sets a sleep time for pauses between two jobs if the job returns true (busy)
    
    public void setMemPreReqisite(long freeBytes);
    // sets minimum required amount of memory for the job execution
    
    public void setObeyIntermission(boolean obey);
    // defines if the thread should obey the intermission command
        
    public String getShortDescription();
    // returns short description string for online display
    
    public String getLongDescription();
    // returns long description string for online display
    
    public String getMonitorURL();
    // returns an URL that can be used to monitor the thread and it's queue
    
    public long getIdleCycles();
    // returns the total number of cycles of job execution with idle-result
    
    public long getBusyCycles();
    // returns the total number of cycles of job execution with busy-result
    
    public long getOutOfMemoryCycles();
    // returns the total number of cycles where
    // a job execution was omitted because of memory shortage
    
    public long getBlockTime();
    // returns the total time that this thread has been blocked so far
    
    public long getSleepTime();
    // returns the total time that this thread has slept so far
    
    public long getExecTime();
    // returns the total time that this thread has worked so far
    
    public long getMemoryUse();
    // returns the sum of all memory usage differences before and after one busy job
    
    public void setLog(serverLog log);
    // defines a log where process states can be written to

    public void jobExceptionHandler(Exception e);
    // handles any action necessary during job execution
    
    public void intermission(long pause);
    // the thread is forced to pause for a specific time
    // if the thread is busy meanwhile, the pause is ommitted
    
    public boolean shutdownInProgress();
    
    public void terminate(boolean waitFor);
    // after calling this method, the thread shall terminate
    // if waitFor is true, the method waits until the process has died
    
    // ---------------------------------------------------------------------
    // the following methods are supposed to be implemented by customization
    
    public void open();
    // this is called right before the job queue is started
    
    public boolean job() throws Exception;
    // performes one job procedure; this loopes until terminate() is called
    // job returns true if it has done something
    // it returns false if it is idle and does not expect to work on more for a longer time
    
    public void freemem();
    // is called when an outOfMemoryCycle is performed
    // this method should try to free some memory, so that the job can be executed
    
    public int getJobCount();
    // returns how many jobs are in the queue
    // can be used to calculate a busy-state
    
    public void close();
    // jobs that need to be done after termination
    // terminate must be called before
    
    
    public void setSyncObject(Object sync);    
    public Object getSyncObject();    
    public void notifyThread();
    
}
