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;
+	}
+
+	
+
+	
+}