/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.clothocore.api.data;
import java.net.MalformedURLException;
import java.net.URL;
import org.clothocore.api.core.Collector;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.swing.JOptionPane;
import org.clothocore.api.plugin.ClothoConnection;
import org.clothocore.api.plugin.ClothoConnection.ClothoQuery;
import org.clothocore.core.Hub;
import org.clothocore.util.misc.BareBonesBrowserLaunch;
/**
*
* @author jcanderson
*/
public class Lab extends ObjBase {
public Lab( LabDatum d ) {
super( d );
_labDatum = d;
}
public Lab( Institution inst, Person PI, String name, String department, String address ) {
super();
_labDatum = new LabDatum();
_datum = _labDatum;
_datum.dateCreated = new Date();
_datum.lastModified = new Date();
_datum.uuid = _uuid;
Lab prexistingSeq = retrieveByName( name );
String newname = name;
while ( prexistingSeq != null ) {
newname = JOptionPane.showInputDialog( "A lab named " + newname + " already exists, please give me a new name." );
if(newname==null) {
return;
}
prexistingSeq = retrieveByName( newname );
}
_datum.name = newname;
_labDatum._department = department;
_labDatum._address = address;
_labDatum._institutionUUID = inst.getUUID();
if ( PI != null ) {
_labDatum._principalInvestigatorUUID = PI.getUUID();
} else {
}
}
@Override
public ObjType getType() {
return ObjType.LAB;
}
protected static ObjBase importFromHashMap( String uuid, HashMap<String, Object> objHash ) {
String name = (String) objHash.get( "name" );
String department = (String) objHash.get( "_department" );
String website = (String) objHash.get( "_website" );
String address = (String) objHash.get( "_address" );
String piID = (String) objHash.get( "_principalInvestigatorUUID" );
String idInstitution = (String) objHash.get( "_institutionUUID" );
Date dateCreated = getDateFromString( (String) objHash.get( "_dateCreated" ) );
Date lastModified = getDateFromString( (String) objHash.get( "_lastModified" ) );
LabDatum d = new LabDatum();
d.uuid = uuid;
d.name = name;
d._department = department;
d._website = website;
d._address = address;
d.dateCreated = dateCreated;
d.lastModified = lastModified;
d._principalInvestigatorUUID = piID;
d._institutionUUID = idInstitution;
return new Lab( d );
}
@Override
protected HashMap<String, HashMap<String, Object>> generateXml( HashMap<String, HashMap<String, Object>> allObjects ) {
//If the hash already has the object, skip adding anything
if ( allObjects.containsKey( getUUID() ) ) {
return allObjects;
}
//Fill in the individual fields
HashMap<String, Object> datahash = new HashMap<String, Object>();
datahash.put( "objType", getType().toString() );
datahash.put( "uuid", _labDatum.uuid );
datahash.put( "name", _labDatum.name );
datahash.put( "_dateCreated", getDateCreatedAsString() );
datahash.put( "_lastModified", getLastModifiedAsString() );
datahash.put( "_principalInvestigatorUUID", _labDatum._principalInvestigatorUUID );
datahash.put( "_institutionUUID", _labDatum._institutionUUID );
datahash.put( "_department", _labDatum._department );
datahash.put( "_website", _labDatum._website );
datahash.put( "_address", _labDatum._address );
allObjects = getInstitution().generateXml( allObjects );
//Add the HashMap to the list and return
allObjects.put( getUUID(), datahash );
return allObjects;
}
/**
* Recursively save all child elements and then call ObjBase to save itself.
*/
@Override
public synchronized boolean save( ClothoConnection conn ) {
System.out.println( "============ Starting lab save" );
if ( !isChanged() ) {
System.out.println( "lab didn't require saving" );
return true;
}
String tempPI = _labDatum._principalInvestigatorUUID;
_labDatum._principalInvestigatorUUID =null;
if ( Collector.isLocal( _labDatum._institutionUUID ) ) {
Institution inst = getInstitution();
if ( !inst.isInDatabase() ) {
if ( !inst.save( conn ) ) {
return false;
}
}
}
if(!super.save( conn )) {
return false;
}
_labDatum._principalInvestigatorUUID = tempPI;
if ( Collector.isLocal( _labDatum._principalInvestigatorUUID ) ) {
Person pi = getPI();
if ( !pi.isInDatabase() ) {
if ( !pi.save( conn ) ) {
return false;
}
}
}
return super.save( conn );
}
/* SETTERS
* */
public void setAddress( String addr ) {
addUndo( "_address", _labDatum._address, addr );
_labDatum._address = addr;
setChanged(org.clothocore.api.dnd.RefreshEvent.Condition.NAME_CHANGED);
}
public void setDepartment( String depart ) {
addUndo( "_department", _labDatum._department, depart );
_labDatum._department = depart;
setChanged(org.clothocore.api.dnd.RefreshEvent.Condition.NAME_CHANGED);
}
/* PUTTERS
* */
public void changeInstitition( Institution aThis ) {
addUndo( "_institutionUUID", _labDatum._institutionUUID, aThis.getUUID() );
_labDatum._institutionUUID = aThis.getUUID();
setChanged(org.clothocore.api.dnd.RefreshEvent.Condition.NAME_CHANGED);
}
@Override
public boolean addObject( ObjBase dropObject ) {
switch ( dropObject.getType() ) {
case PERSON:
//PUT THE PERSON IN this LAB, or change their affiliation
return true;
default:
return false;
}
}
public void changeWebsite( String site ) {
URL url = null;
while( url==null ) {
try {
url = new URL( site );
} catch ( MalformedURLException ex ) {
String inputValue = JOptionPane.showInputDialog( "You tried to put in the invalid web address " + site + ".\n\nIt needs to be in the form of http://www.google.com, try again:" );
if(inputValue==null) {
site = _labDatum._website;
break;
} else {
site = inputValue;
}
}
}
addUndo( "_website", _labDatum._website, site );
_labDatum._website = site;
setChanged(org.clothocore.api.dnd.RefreshEvent.Condition.WEBSITE_CHANGED);
}
public void changePI( Person pi ) {
addUndo( "_principalInvestigatorUUID", _labDatum._principalInvestigatorUUID, pi.getUUID() );
_labDatum._principalInvestigatorUUID = pi.getUUID();
setChanged(org.clothocore.api.dnd.RefreshEvent.Condition.PI_CHANGED);
}
public void changeDepartment( String dept ) {
addUndo( "_department", _labDatum._department, dept );
_labDatum._department = dept;
setChanged(org.clothocore.api.dnd.RefreshEvent.Condition.DEPARTMENT_CHANGED);
}
public void changeAddress( String address ) {
addUndo( "_address", _labDatum._address, address );
_labDatum._address = address;
setChanged(org.clothocore.api.dnd.RefreshEvent.Condition.ADDRESS_CHANGED);
}
/* GETTERS
* */
public Institution getInstitution() {
return Collector.getInstitution( _labDatum._institutionUUID );
}
public Person getPI() {
return Collector.getPerson( _labDatum._principalInvestigatorUUID );
}
public String getDepartment() {
return _labDatum._department;
}
public String getAddress() {
return _labDatum._address;
}
public String getWebsite() {
return _labDatum._website;
}
public static Lab retrieveByName( String name ) {
if ( name.length() == 0 ) {
return null;
}
ClothoQuery cq = Hub.defaultConnection.createQuery( ObjType.LAB );
cq.contains( Lab.Fields.NAME, name, false );
List l = cq.getResults();
if ( l.isEmpty() ) {
return null;
}
Lab p = (Lab) l.get( 0 );
return p;
}
public void visitWebsite() {
if ( !_labDatum._address.equals( "" ) ) {
BareBonesBrowserLaunch.openURL( _labDatum._website );
}
}
/*-----------------
variables
-----------------*/
private LabDatum _labDatum;
public static class LabDatum extends ObjBaseDatum {
public String _principalInvestigatorUUID;
public String _institutionUUID;
public String _department;
public String _website;
public String _address = "";
public Set<String> _members = new HashSet<String>();
@Override
public ObjType getType() {
return ObjType.LAB;
}
}
/******* FIELDS *******/
public static enum Fields {
NAME,
DATE_CREATED,
LAST_MODIFIED,
DEPARTMENT,
WEBSITE,
ADDRESS,
PI,
INSTITUTION,
PERSONS
}
}