Skip to content

Commit

Permalink
LOCAL: IoT historical measurement retrofit
Browse files Browse the repository at this point in the history
  • Loading branch information
holmbergius committed Jan 23, 2025
1 parent a5de49f commit d62fa4c
Show file tree
Hide file tree
Showing 4 changed files with 196 additions and 22 deletions.
108 changes: 93 additions & 15 deletions src/main/java/org/ecocean/Encounter.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@
import org.datanucleus.api.rest.orgjson.JSONException;
import org.datanucleus.api.rest.orgjson.JSONObject;

//IOT customization
import org.ecocean.datacollection.*;

/**
* An <code>encounter</code> object stores the complete data for a single sighting/capture report.
* <code>Encounters</code> are added to MarkedIndividual objects as multiple encounters are associated with known individuals.
Expand Down Expand Up @@ -268,7 +271,7 @@ public void setSampleTakenForDiet(Boolean sampleTakenForDiet) {
private List<SinglePhotoVideo> images;
// private ArrayList<MediaAsset> media;
private ArrayList<Annotation> annotations;
private List<Measurement> measurements;
private List<MeasurementEvent> measurements;
private List<MetalTag> metalTags;
private AcousticTag acousticTag;
private SatelliteTag satelliteTag;
Expand Down Expand Up @@ -2470,17 +2473,17 @@ public void addSinglePhotoVideo(SinglePhotoVideo dce) {
public List<SinglePhotoVideo> getSinglePhotoVideo() { return images; }
public void removeSinglePhotoVideo(SinglePhotoVideo num) { images.remove(num); }

public void setMeasurements(List<Measurement> measurements) {
public void setMeasurements(List<MeasurementEvent> measurements) {
this.measurements = measurements;
}

public void setMeasurement(Measurement measurement, Shepherd myShepherd) {
public void setMeasurement(MeasurementEvent measurement, Shepherd myShepherd) {
// if measurements are null, set the empty list
if (measurements == null) { measurements = new ArrayList<Measurement>(); }
if (measurements == null) { measurements = new ArrayList<MeasurementEvent>(); }
// now start checking for existence of a previous measurement
// if we have it but the new value is null, remove the measurement
if ((this.hasMeasurement(measurement.getType())) && (measurement.getValue() == null)) {
Measurement m = this.getMeasurement(measurement.getType());
MeasurementEvent m = this.getMeasurement(measurement.getType());
measurements.remove(m);
myShepherd.getPM().deletePersistent(m);
myShepherd.commitDBTransaction();
Expand All @@ -2494,7 +2497,7 @@ else if (!this.hasMeasurement(measurement.getType())) {
}
// if we had it before then just update the value
else if ((this.hasMeasurement(measurement.getType())) && (measurement != null)) {
Measurement m = this.getMeasurement(measurement.getType());
MeasurementEvent m = this.getMeasurement(measurement.getType());
m.setValue(measurement.getValue());
m.setSamplingProtocol(measurement.getSamplingProtocol());
myShepherd.commitDBTransaction();
Expand All @@ -2503,13 +2506,13 @@ else if ((this.hasMeasurement(measurement.getType())) && (measurement != null))
}

public void removeMeasurement(int num) { measurements.remove(num); }
public List<Measurement> getMeasurements() { return measurements; }
public List<MeasurementEvent> getMeasurements() { return measurements; }
public void removeMeasurement(Measurement num) { measurements.remove(num); }
public Measurement findMeasurementOfType(String type) {
List<Measurement> measurements = getMeasurements();
public MeasurementEvent findMeasurementOfType(String type) {
List<MeasurementEvent> measurements = getMeasurements();

if (measurements != null) {
for (Measurement measurement : measurements) {
for (MeasurementEvent measurement : measurements) {
if (type.equals(measurement.getType())) {
return measurement;
}
Expand Down Expand Up @@ -3000,7 +3003,7 @@ public boolean hasMeasurements() {
if ((measurements != null) && (measurements.size() > 0)) {
int numMeasurements = measurements.size();
for (int i = 0; i < numMeasurements; i++) {
Measurement m = measurements.get(i);
MeasurementEvent m = measurements.get(i);
if (m.getValue() != null) { return true; }
}
}
Expand All @@ -3011,7 +3014,7 @@ public boolean hasMeasurement(String type) {
if ((measurements != null) && (measurements.size() > 0)) {
int numMeasurements = measurements.size();
for (int i = 0; i < numMeasurements; i++) {
Measurement m = measurements.get(i);
MeasurementEvent m = measurements.get(i);
if ((m.getValue() != null) && (m.getType().equals(type))) { return true; }
}
}
Expand All @@ -3033,11 +3036,11 @@ public boolean hasBiologicalMeasurement(String type) {
}

// Returns the first measurement of the specified type
public Measurement getMeasurement(String type) {
public MeasurementEvent getMeasurement(String type) {
if ((measurements != null) && (measurements.size() > 0)) {
int numMeasurements = measurements.size();
for (int i = 0; i < numMeasurements; i++) {
Measurement m = measurements.get(i);
MeasurementEvent m = measurements.get(i);
if ((m.getValue() != null) && (m.getType().equals(type))) { return m; }
}
}
Expand Down Expand Up @@ -4146,7 +4149,7 @@ public void opensearchDocumentSerializer(JsonGenerator jgen, Shepherd myShepherd

jgen.writeArrayFieldStart("measurements");
if (this.measurements != null)
for (Measurement meas : this.measurements) {
for (MeasurementEvent meas : this.measurements) {
if (meas.getValue() == null) continue; // no value means we should skip
jgen.writeStartObject();
jgen.writeNumberField("value", meas.getValue());
Expand Down Expand Up @@ -4704,5 +4707,80 @@ public void sendCreationEmails(Shepherd myShepherd, String langCode) {
myShepherd.rollbackDBTransaction();
}
}

//IOT customizations
public void setMeasurementEvent(MeasurementEvent measurement, Shepherd myShepherd){

//if measurements are null, set the empty list
if(measurements==null){measurements=new ArrayList<MeasurementEvent>();}

//now start checking for existence of a previous measurement

//if we have it but the new value is null, remove the measurement
if((this.hasMeasurementEvent(measurement.getType()))&&(measurement.getValue()==null)){
MeasurementEvent m=this.getMeasurement(measurement.getType());
measurements.remove(m);
myShepherd.getPM().deletePersistent(m);
myShepherd.commitDBTransaction();
myShepherd.beginDBTransaction();
}

//just add the measurement it if we did not have it before
else if(!this.hasMeasurementEvent(measurement.getType())){
measurements.add(measurement);
myShepherd.commitDBTransaction();
myShepherd.beginDBTransaction();
}

//if we had it before then just update the value
else if((this.hasMeasurementEvent(measurement.getType()))&&(measurement!=null)){
MeasurementEvent m=this.getMeasurement(measurement.getType());
m.setValue(measurement.getValue());
m.setSamplingProtocol(measurement.getSamplingProtocol());
myShepherd.commitDBTransaction();
myShepherd.beginDBTransaction();
}

}
public void removeMeasurementEvent(int num){measurements.remove(num);}
public List<MeasurementEvent> getMeasurementEvents(){return measurements;}
public void removeMeasurementEvent(MeasurementEvent num){measurements.remove(num);}
public MeasurementEvent findMeasurementEventOfType(String type) {
List<MeasurementEvent> measurements = getMeasurementEvents();
if (measurements != null) {
for (MeasurementEvent measurement : measurements) {
if (type.equals(measurement.getType())) {
return measurement;
}
}
}
return null;
}


public boolean hasMeasurementEvents(){
if((measurements!=null)&&(measurements.size()>0)){
int numMeasurementEvents=measurements.size();
for(int i=0;i<numMeasurementEvents;i++){
MeasurementEvent m=measurements.get(i);
if(m.getValue()!=null){return true;}
}
}
return false;
}

public boolean hasMeasurementEvent(String type){
if((measurements!=null)&&(measurements.size()>0)){
int numMeasurementEvents=measurements.size();
for(int i=0;i<numMeasurementEvents;i++){
MeasurementEvent m=measurements.get(i);
if((m.getValue()!=null)&&(m.getType().equals(type))){return true;}
}
}
return false;
}

//END IOT CUSTOMIZATIONS


}
94 changes: 93 additions & 1 deletion src/main/java/org/ecocean/Shepherd.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@
import org.joda.time.DateTime;
import org.json.JSONArray;

//IOT customization
import org.ecocean.datacollection.*;


/**
* Shepherd is the main information retrieval, processing, and persistence class to be used for all shepherd
* project applications. The shepherd class interacts directly with the database and all persistent objects stored within it.
Expand Down Expand Up @@ -1299,7 +1303,7 @@ public MicrosatelliteMarkersAnalysis getMicrosatelliteMarkersAnalysis(String ana
}
}

public <T extends DataCollectionEvent> T findDataCollectionEvent(Class<T> clazz, String num) {
public <T extends org.ecocean.datacollection.DataCollectionEvent> T findDataCollectionEvent(Class<T> clazz, String num) {
T dataCollectionEvent = null;

try {
Expand Down Expand Up @@ -5588,4 +5592,92 @@ public JSONArray getAllProjectACMIdsJSON(String projectId) {
}
return allAnnotIds;
}





//START IOT NEST CUSTOMIZATIONS
public Iterator<Nest> getAllNests() {
Extent allSharks = null;
try {
allSharks = pm.getExtent(Nest.class, true);
} catch (javax.jdo.JDOException x) {
x.printStackTrace();
}
Extent encClass = pm.getExtent(Nest.class, true);
Query sharks = pm.newQuery(encClass);
Collection c = (Collection) (sharks.execute());
ArrayList list = new ArrayList(c);
Iterator it = list.iterator();
return it;
}

public Iterator<Nest> getAllNests(Query nests) {
Collection c = (Collection) (nests.execute());
Iterator it = c.iterator();
return it;
}

public Iterator<Nest> getAllNests(Query sharkies, String order) {
Map<String, Object> emptyMap = Collections.emptyMap();
return getAllNests(sharkies, order, emptyMap);
}


public Iterator<Nest> getAllNests(Query sharkies, String order, Map<String, Object> params) {
sharkies.setOrdering(order);
Collection c = (Collection) (sharkies.executeWithMap(params));
ArrayList list = new ArrayList(c);
//Collections.reverse(list);
Iterator it = list.iterator();
return it;
}

public Iterator<DataSheet> getAllDataSheetsNoQuery() {
try {
Extent dsClass = pm.getExtent(DataSheet.class, true);
Iterator it = dsClass.iterator();
return it;
} catch (Exception npe) {
System.out.println("Error encountered when trying to execute getAllDataSheetsNoQuery. Returning a null iterator.");
npe.printStackTrace();
return null;
}
}

public Iterator<DataSheet> getAllDataSheets(Query accepted, Map<String, Object> paramMap) {
Collection c;
try {
c = (Collection) (accepted.executeWithMap(paramMap));
ArrayList list = new ArrayList(c);
//Collections.reverse(list);
Iterator it = list.iterator();
return it;
} catch (Exception npe) {
System.out.println("Error encountered when trying to execute getAllDataSheets(Query). Returning a null collection.");
npe.printStackTrace();
return null;
}
}

public boolean storeNewUser(User u) {
beginDBTransaction();
try {
pm.makePersistent(u);
commitDBTransaction();
return true;

} catch (Exception e) {
rollbackDBTransaction();
System.out.println("I failed to create a new User in shepherd.storeNewUser().");
e.printStackTrace();
return false;
}
}

//END IOT NEST CUSTOMIZATIONS

//END IOT NEST CUSTOMIZATIONS

}
13 changes: 8 additions & 5 deletions src/main/java/org/ecocean/servlet/EncounterForm.java
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@
import org.ecocean.mmutil.FileUtilities;
import org.ecocean.User;

//IOT customization
import org.ecocean.datacollection.MeasurementEvent;

/**
* Uploads a new image to the file system and associates the image with an Encounter record
*
Expand Down Expand Up @@ -117,8 +120,8 @@ private List<MetalTag> getMetalTags(Map formValues) {
return list;
}

private List<Measurement> getMeasurements(Map formValues, String encID, String context) {
List<Measurement> list = new ArrayList<Measurement>();
private List<MeasurementEvent> getMeasurements(Map formValues, String encID, String context) {
List<MeasurementEvent> list = new ArrayList<MeasurementEvent>();

// dynamically adapt to project-specific measurements
List<String> keys = CommonConfiguration.getIndexedPropertyValues("measurement", context);
Expand All @@ -131,7 +134,7 @@ private List<Measurement> getMeasurements(Map formValues, String encID, String c
if (value.length() > 0) {
try {
Double doubleVal = Double.valueOf(value);
list.add(new Measurement(encID, key, doubleVal, units, samplingProtocol));
list.add(new MeasurementEvent(encID, key, doubleVal, units, samplingProtocol));
} catch (Exception ex) {}
}
}
Expand Down Expand Up @@ -648,8 +651,8 @@ else if (formValues.get("location") != null) {
for (MetalTag metalTag : metalTags) {
enc.addMetalTag(metalTag);
}
List<Measurement> measurements = getMeasurements(formValues, encID, context);
for (Measurement measurement : measurements) {
List<MeasurementEvent> measurements = getMeasurements(formValues, encID, context);
for (MeasurementEvent measurement : measurements) {
enc.setMeasurement(measurement, myShepherd);
}
enc.setAcousticTag(getAcousticTag(formValues));
Expand Down
3 changes: 2 additions & 1 deletion src/main/resources/org/ecocean/package.jdo
Original file line number Diff line number Diff line change
Expand Up @@ -234,12 +234,13 @@

<class name="Encounter" identity-type="application" table="ENCOUNTER">

<!--
<field name="dataSheets" persistence-modifier="persistent" default-fetch-group="true">
<collection element-type="org.ecocean.datacollection.DataSheet"/>
<column name="DATASHEETS"/>
<join/>
</field>

-->


<field name="submitters" persistence-modifier="persistent" default-fetch-group="true">
Expand Down

0 comments on commit d62fa4c

Please sign in to comment.