merge of localization branch into HEAD. mh and zap
[mir.git] / source / mircoders / global / ProducerEngine.java
1 package mircoders.global;
2
3 import java.util.*;
4 import java.io.*;
5 import mir.producer.*;
6 import mir.util.*;
7 import multex.Exc;
8 import multex.Failure;
9
10 public class ProducerEngine {
11 //  private Map producers;
12   private JobQueue producerJobQueue;
13   private Thread queueThread;
14   private PrintWriter log;
15
16   protected ProducerEngine() {
17 //    producers = MirGlobal.localizer().producers().factories();
18     producerJobQueue = new JobQueue();
19     try {
20       RandomAccessFile raFile = (new RandomAccessFile(MirGlobal.getConfigProperty("Home") + "/" + MirGlobal.getConfigProperty("Producer.Logfile"), "rw"));
21                         raFile.seek(raFile.length());
22                 log = new PrintWriter(new FileWriter( raFile.getFD()));
23     }
24     catch (Exception e) {
25 //      throw new ProducerEngineRuntimeExc("Creating PrintWriter log failed",e);
26       log = new PrintWriter(new NullWriter());
27     }
28     queueThread = new Thread(new ProducerJobQueueThread());
29     queueThread.start();
30   }
31
32   public void addJob(String aProducerFactory, String aVerb) {
33 // ML: TODO: should check if a similar job is already pending
34     producerJobQueue.appendJob(new ProducerJob(aProducerFactory, aVerb));
35     log.println(aProducerFactory+"."+aVerb+" added to queue");
36     log.flush();
37   }
38
39   public void printQueueStatus(PrintWriter aWriter) {
40     Iterator iterator = producerJobQueue.makeJobListSnapshot().iterator();
41     producerJobQueue.cleanupJobs();
42     JobQueue.Job job;
43
44     while (iterator.hasNext()) {
45       job = (JobQueue.Job) iterator.next();
46       ProducerJob producerJob = (ProducerJob) job.getData();
47
48       aWriter.print(producerJob.factoryName + "." + producerJob.verb);
49       if (job.hasBeenProcessed())
50         aWriter.print(" processed");
51       else if (job.isProcessing())
52         aWriter.print(" processing");
53       else if (job.isPending())
54         aWriter.print(" pending");
55       else
56         aWriter.print(" unknown status");
57
58       aWriter.println("<br/>");
59     }
60   }
61
62   private void produceNow(String aProducerFactory, String aVerb, PrintWriter aLogger) {
63     try {
64       long startTime;
65       long endTime;
66       Map startingMap = new HashMap();
67
68       startTime = System.currentTimeMillis();
69
70       aLogger.println("Producing (" + aProducerFactory + "," + aVerb + ")");
71
72       ProducerFactory factory = (ProducerFactory) MirGlobal.localizer().producers().factories().get(aProducerFactory);
73
74       if (factory == null )
75         throw new Exception("No producer factory '"+aProducerFactory+"' present.");
76
77       MirGlobal.localizer().producerAssistant().initializeGenerationValueSet(startingMap);
78       Producer producer = factory.makeProducer(aVerb, startingMap);
79
80       producer.produce(aLogger);
81
82       endTime = System.currentTimeMillis();
83
84       aLogger.println("Time: " + (endTime-startTime) + " ms<br>");
85     }
86     catch (Throwable e) {
87       try {
88         aLogger.println("exception occurred:<br>");
89         aLogger.println(e.getMessage());
90         e.printStackTrace(aLogger);
91       }
92       catch (Throwable f) {
93       }
94     }
95   }
96
97   private class ProducerJob {
98     private String factoryName;
99     private String verb;
100
101     public ProducerJob(String aFactory, String aVerb) {
102       factoryName = aFactory;
103       verb = aVerb;
104     }
105
106     public void execute() {
107       ProducerFactory factory;
108       Producer producer;
109       long startTime;
110       long endTime;
111       Map startingMap = new HashMap();
112
113       startTime = System.currentTimeMillis();
114       log.println("Producing job: "+factoryName+"."+verb);
115
116       try {
117         factory = (ProducerFactory) MirGlobal.localizer().producers().factories().get( factoryName );
118
119         if (factory!=null) {
120           MirGlobal.localizer().producerAssistant().initializeGenerationValueSet(startingMap);
121
122           synchronized(factory) {
123             producer = factory.makeProducer(verb, startingMap);
124           }
125           if (producer!=null) {
126             producer.produce(log);
127           }
128         }
129       }
130       catch (Throwable t) {
131         log.println("  exception "+t.getMessage());
132         t.printStackTrace(log);
133       }
134       log.println("Done producing job: "+factoryName+"."+verb);
135                   endTime = System.currentTimeMillis();
136
137                   log.println("Time: " + (endTime-startTime) + " ms");
138                   log.flush();
139     }
140   }
141
142   private class ProducerJobQueueThread implements Runnable {
143     public void run() {
144       log.println("starting ProducerJobQueueThread");
145       log.flush();
146
147       while (true) {
148         ProducerJob job = (ProducerJob) producerJobQueue.acquirePendingJob();
149         if (job!=null) {
150           job.execute();
151           producerJobQueue.flagOffJob(job);
152         }
153         else
154         {
155           try {
156             Thread.sleep(1500);
157           }
158           catch (InterruptedException e) {
159           }
160         }
161       }
162     }
163   }
164
165
166   public static class ProducerEngineRuntimeExc extends Failure {
167     public ProducerEngineRuntimeExc(String msg, Exception cause){
168       super(msg,cause);
169     }
170   }
171
172 }