mirror of https://github.com/zlatinb/muwire
Send browse results to UI in batches. Github issue #49
parent
9acb49c22a
commit
9e3a9e2737
|
@ -19,6 +19,8 @@ import java.util.zip.GZIPInputStream
|
||||||
@Log
|
@Log
|
||||||
class BrowseManager {
|
class BrowseManager {
|
||||||
|
|
||||||
|
private static final int BATCH_SIZE = 32
|
||||||
|
|
||||||
private final I2PConnector connector
|
private final I2PConnector connector
|
||||||
private final EventBus eventBus
|
private final EventBus eventBus
|
||||||
private final Persona me
|
private final Persona me
|
||||||
|
@ -58,19 +60,34 @@ class BrowseManager {
|
||||||
boolean chat = headers.containsKey("Chat") && Boolean.parseBoolean(headers['Chat'])
|
boolean chat = headers.containsKey("Chat") && Boolean.parseBoolean(headers['Chat'])
|
||||||
|
|
||||||
// at this stage, start pulling the results
|
// at this stage, start pulling the results
|
||||||
eventBus.publish(new BrowseStatusEvent(host: e.host, status : BrowseStatus.FETCHING, totalResults : results))
|
UUID uuid = UUID.randomUUID()
|
||||||
|
eventBus.publish(new BrowseStatusEvent(host: e.host, status : BrowseStatus.FETCHING,
|
||||||
|
totalResults : results, uuid : uuid))
|
||||||
|
log.info("Starting to fetch $results results with uuid $uuid")
|
||||||
|
|
||||||
JsonSlurper slurper = new JsonSlurper()
|
JsonSlurper slurper = new JsonSlurper()
|
||||||
DataInputStream dis = new DataInputStream(new GZIPInputStream(is))
|
DataInputStream dis = new DataInputStream(new GZIPInputStream(is))
|
||||||
UUID uuid = UUID.randomUUID()
|
UIResultEvent[] batch = new UIResultEvent[Math.min(BATCH_SIZE, results)]
|
||||||
|
int j = 0
|
||||||
for (int i = 0; i < results; i++) {
|
for (int i = 0; i < results; i++) {
|
||||||
|
log.fine("parsing result $i at batch position $j")
|
||||||
|
|
||||||
int size = dis.readUnsignedShort()
|
int size = dis.readUnsignedShort()
|
||||||
byte [] tmp = new byte[size]
|
byte [] tmp = new byte[size]
|
||||||
dis.readFully(tmp)
|
dis.readFully(tmp)
|
||||||
def json = slurper.parse(tmp)
|
def json = slurper.parse(tmp)
|
||||||
UIResultEvent result = ResultsParser.parse(e.host, uuid, json)
|
UIResultEvent result = ResultsParser.parse(e.host, uuid, json)
|
||||||
result.chat = chat
|
result.chat = chat
|
||||||
eventBus.publish(result)
|
batch[j++] = result
|
||||||
|
|
||||||
|
|
||||||
|
// publish piecemally
|
||||||
|
if (j == batch.length) {
|
||||||
|
eventBus.publish(new UIResultBatchEvent(results : batch, uuid : uuid))
|
||||||
|
j = 0
|
||||||
|
batch = new UIResultEvent[Math.min(results - i - 1, BATCH_SIZE)]
|
||||||
|
log.fine("publishing batch, next batch size ${batch.length}")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
eventBus.publish(new BrowseStatusEvent(host: e.host, status : BrowseStatus.FINISHED))
|
eventBus.publish(new BrowseStatusEvent(host: e.host, status : BrowseStatus.FINISHED))
|
||||||
|
|
|
@ -7,4 +7,5 @@ class BrowseStatusEvent extends Event {
|
||||||
Persona host
|
Persona host
|
||||||
BrowseStatus status
|
BrowseStatus status
|
||||||
int totalResults
|
int totalResults
|
||||||
|
UUID uuid
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ import com.muwire.core.download.UIDownloadEvent
|
||||||
import com.muwire.core.search.BrowseStatus
|
import com.muwire.core.search.BrowseStatus
|
||||||
import com.muwire.core.search.BrowseStatusEvent
|
import com.muwire.core.search.BrowseStatusEvent
|
||||||
import com.muwire.core.search.UIBrowseEvent
|
import com.muwire.core.search.UIBrowseEvent
|
||||||
|
import com.muwire.core.search.UIResultBatchEvent
|
||||||
import com.muwire.core.search.UIResultEvent
|
import com.muwire.core.search.UIResultEvent
|
||||||
|
|
||||||
@ArtifactProviderFor(GriffonController)
|
@ArtifactProviderFor(GriffonController)
|
||||||
|
@ -28,27 +29,31 @@ class BrowseController {
|
||||||
|
|
||||||
void register() {
|
void register() {
|
||||||
core.eventBus.register(BrowseStatusEvent.class, this)
|
core.eventBus.register(BrowseStatusEvent.class, this)
|
||||||
core.eventBus.register(UIResultEvent.class, this)
|
core.eventBus.register(UIResultBatchEvent.class, this)
|
||||||
core.eventBus.publish(new UIBrowseEvent(host : model.host))
|
core.eventBus.publish(new UIBrowseEvent(host : model.host))
|
||||||
}
|
}
|
||||||
|
|
||||||
void mvcGroupDestroy() {
|
void mvcGroupDestroy() {
|
||||||
core.eventBus.unregister(BrowseStatusEvent.class, this)
|
core.eventBus.unregister(BrowseStatusEvent.class, this)
|
||||||
core.eventBus.unregister(UIResultEvent.class, this)
|
core.eventBus.unregister(UIResultBatchEvent.class, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
void onBrowseStatusEvent(BrowseStatusEvent e) {
|
void onBrowseStatusEvent(BrowseStatusEvent e) {
|
||||||
runInsideUIAsync {
|
runInsideUIAsync {
|
||||||
model.status = e.status
|
model.status = e.status
|
||||||
if (e.status == BrowseStatus.FETCHING)
|
if (e.status == BrowseStatus.FETCHING) {
|
||||||
model.totalResults = e.totalResults
|
model.totalResults = e.totalResults
|
||||||
|
model.uuid = e.uuid
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void onUIResultEvent(UIResultEvent e) {
|
void onUIResultBatchEvent(UIResultBatchEvent e) {
|
||||||
runInsideUIAsync {
|
runInsideUIAsync {
|
||||||
model.chatActionEnabled = e.chat
|
if (e.uuid != model.uuid)
|
||||||
model.results << e
|
return
|
||||||
|
model.chatActionEnabled = e.results[0].chat
|
||||||
|
model.results.addAll(e.results.toList())
|
||||||
model.resultCount = model.results.size()
|
model.resultCount = model.results.size()
|
||||||
view.resultsTable.model.fireTableDataChanged()
|
view.resultsTable.model.fireTableDataChanged()
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ class BrowseModel {
|
||||||
@Observable boolean chatActionEnabled
|
@Observable boolean chatActionEnabled
|
||||||
@Observable int totalResults
|
@Observable int totalResults
|
||||||
@Observable int resultCount
|
@Observable int resultCount
|
||||||
|
UUID uuid
|
||||||
|
|
||||||
def results = []
|
def results = []
|
||||||
}
|
}
|
Loading…
Reference in New Issue