Mercurial > hg > anteater
diff src/de/mpiwg/anteater/events/processors/EventCreatorProcessor.java @ 0:036535fcd179
anteater
author | jdamerow |
---|---|
date | Fri, 14 Sep 2012 10:30:43 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/de/mpiwg/anteater/events/processors/EventCreatorProcessor.java Fri Sep 14 10:30:43 2012 +0200 @@ -0,0 +1,118 @@ +package de.mpiwg.anteater.events.processors; + +import java.util.ArrayList; +import java.util.List; + +import de.mpiwg.anteater.events.Applicant; +import de.mpiwg.anteater.events.ResearchEvent; +import de.mpiwg.anteater.results.ApplicantResult; +import de.mpiwg.anteater.results.LocationResult; +import de.mpiwg.anteater.results.ResultsCarrier; +import de.mpiwg.anteater.results.SpeciesScientificResult; +import de.mpiwg.anteater.text.TextInformation; + +public class EventCreatorProcessor extends AEventProcessor { + + @Override + public void processEvents(List<ResearchEvent> events, ResultsCarrier carrier) { + TextInformation info = carrier.getTextInfo(); + + // find how many distinct applicants there are + List<ApplicantResult> distinctApplicants = getDistinctApplicants(carrier); + + // if there is only one applicant in text + if (distinctApplicants.size() == 1) { + ResearchEvent event = createEvent(distinctApplicants.get(0), info, + carrier.getLocationResults(), carrier.getSpeciesResults()); + events.add(event); + return; + } + + // if there are several applicants start new event with each applicant + List<ApplicantResult> appsInSummary = new ArrayList<ApplicantResult>(); + List<ApplicantResult> appsInSuppleInf = new ArrayList<ApplicantResult>(); + + sortByTextType(distinctApplicants, appsInSummary, appsInSuppleInf); + + List<SpeciesScientificResult> speciesInSuppleInf = new ArrayList<SpeciesScientificResult>(); + sortSpeciesByTextType(carrier.getSpeciesResults(), new ArrayList<SpeciesScientificResult>(), speciesInSuppleInf); + + List<LocationResult> locationsInSuppleInf = new ArrayList<LocationResult>(); + sortLocsByTextType(carrier.getLocationResults(), new ArrayList<LocationResult>(), locationsInSuppleInf); + + // if there are no applicants in summary, start new event with every + // applicant + // unless there is no species in between + if (appsInSummary.isEmpty()) { + ResearchEvent event = null; + for (int i = 0; i < appsInSuppleInf.size(); i++) { + ApplicantResult applicant = appsInSuppleInf.get(i); + ApplicantResult nextApplicant = null; + if (i < appsInSuppleInf.size() - 1) + nextApplicant = appsInSuppleInf.get(i + 1); + + List<SpeciesScientificResult> speciesForApp = new ArrayList<SpeciesScientificResult>(); + List<LocationResult> locationsForApp = new ArrayList<LocationResult>(); + + int endOfApplicant = applicant.getFinding().getStart() + + applicant.getFinding().getLength(); + int startOfNextApplicant = nextApplicant != null ? nextApplicant + .getFinding().getStart() : info.getSupplInfos().get(applicant.getResult().getTextIdx()).getText().length(); + + // find all species between current applicant and next one + for (SpeciesScientificResult speciesResult : speciesInSuppleInf) { + if (speciesResult.getFinding().getStart() > endOfApplicant + && speciesResult.getFinding().getStart() < startOfNextApplicant) + speciesForApp.add(speciesResult); + } + + // find all locations between current applicant and next one + for (LocationResult locationResult : locationsInSuppleInf) { + if (locationResult.getFinding().getStart() >= endOfApplicant + && locationResult.getFinding().getStart() < startOfNextApplicant) + locationsForApp.add(locationResult); + } + + // if there are no specie in between, applicant goes to last + // event + if (event != null) { + List<Applicant> applicantsInEvent = event.getApplicants(); + List<Applicant> applicantsWithoutLoc = new ArrayList<Applicant>(); + + Applicant newApplicant = createApplicant(applicant); + event.getApplicants().add(newApplicant); + + for (Applicant applicantInEvent : applicantsInEvent) + if (applicantInEvent.getApplicantInstitution() + .isEmpty() + && applicantInEvent.getLocation().isEmpty()) + applicantsWithoutLoc.add(applicantInEvent); + + setLocations(applicantsWithoutLoc, locationsForApp, event); + setSpecies(speciesForApp, event); + } + + if (event == null) + event = createEvent(applicant, info, locationsForApp, + speciesForApp); + + if (speciesForApp.size() > 0) { + events.add(event); + event = null; + } + + } + return; + } + + } + + @Override + public int getRank() { + return 0; + } + + + + +}