View Javadoc
1   package com.acumenvelocity.ath.steps;
2   
3   import java.util.ArrayList;
4   import java.util.List;
5   
6   import net.sf.okapi.common.Event;
7   import net.sf.okapi.common.EventType;
8   import net.sf.okapi.common.Util;
9   import net.sf.okapi.common.pipeline.BasePipelineStep;
10  import net.sf.okapi.common.resource.ITextUnit;
11  import net.sf.okapi.common.resource.MultiEvent;
12  import net.sf.okapi.common.resource.Property;
13  
14  public abstract class BaseTuBatchProcessingStep extends BasePipelineStep {
15  
16    private long numProcessedTus;
17  
18    // TU events to be processed together
19    private final List<Event> tuEvents = new ArrayList<>();
20  
21    // We need to buffer all the events, not only TU ones, or the events sequence will be broken
22    private final List<Event> allEvents = new ArrayList<>();
23  
24    protected abstract void clear();
25  
26    protected abstract void processTuEvents(List<Event> tuEvents);
27  
28    @Override
29    protected Event handleStartDocument(Event event) {
30      numProcessedTus = 0;
31      return super.handleStartDocument(event);
32    }
33  
34    private void clearEvents() {
35      clear(); // Let subclasses clear their stuff
36      allEvents.clear();
37      tuEvents.clear();
38    }
39  
40    @Override
41    public Event handleEvent(Event event) {
42      // Collect the original events
43      allEvents.add(event);
44  
45      Event e = super.handleEvent(event); // Call handleXX(), ignore the results
46      return event.isEndDocument() ? e : Event.createNoopEvent();
47    }
48  
49    @Override
50    protected Event handleTextUnit(Event event) {
51      ITextUnit tu = event.getTextUnit();
52  
53      // Exclude non-translatable TUs from MT
54      if (!tu.isTranslatable()) {
55        return event;
56      }
57  
58      // Exclude approved TUs from MT
59      Property prop = tu.getTargetProperty(getTargetLocale(), Property.APPROVED);
60  
61      if (prop != null) {
62        if ("yes".equals(prop.getValue()))
63          return event;
64      }
65  
66      numProcessedTus++;
67      tuEvents.add(event);
68      return Event.createNoopEvent(); // Can return event, ignored in the handleEvent() caller
69    }
70  
71    @Override
72    protected Event handleEndDocument(Event event) {
73      if (Util.isEmpty(allEvents)) {
74        // We get here from the END_DOCUMENT of exploded MULTI_EVENT
75        return event;
76      }
77      
78      // TU events are also part of allEvents in the right positions
79      processTuEvents(tuEvents);
80  
81      // We create a copy of the list, the events themselves are alive after we clean the list
82      MultiEvent me = new MultiEvent(List.copyOf(allEvents));
83      clearEvents(); // Release memory
84  
85      return new Event(EventType.MULTI_EVENT, me);
86    }
87  
88    public long getNumProcessedTus() {
89      return numProcessedTus;
90    }
91  }