package gr.ntua.ivml.mint.persistent;
import gr.ntua.ivml.mint.db.DB;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Organization implements SecurityEnabled {
public long dbID;
String originalName;
String englishName;
String shortName;
String description;
String urlPattern;
String address;
String country;
String type;
Organization parentalOrganization;
User primaryContact;
List<Organization> dependantOrganizations = new ArrayList<Organization>();
List<User> users = new ArrayList<User>();
List<DataUpload> dataUploads = new ArrayList<DataUpload>();
// temporary getter setter for old attribute
public String getName() {
return getEnglishName();
}
public void setName( String name ) {
setEnglishName(name);
}
public String getShortName() {
return shortName;
}
public void setShortName(String shortName) {
this.shortName = shortName;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
public List<Organization> getDependantOrganizations() {
return dependantOrganizations;
}
public void setDependantOrganizations(List<Organization> dependantOrganizations) {
this.dependantOrganizations = dependantOrganizations;
}
public long getDbID() {
return dbID;
}
public void setDbID(long dbID) {
this.dbID = dbID;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Organization getParentalOrganization() {
return parentalOrganization;
}
public void setParentalOrganization(Organization parentalOrganization) {
this.parentalOrganization = parentalOrganization;
}
public User getPrimaryContact() {
return primaryContact;
}
public void setPrimaryContact(User primaryContact) {
this.primaryContact = primaryContact;
}
public String getOriginalName() {
return originalName;
}
public void setOriginalName(String originalName) {
this.originalName = originalName;
}
public String getEnglishName() {
return englishName;
}
public void setEnglishName(String englishName) {
this.englishName = englishName;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getUrlPattern() {
return urlPattern;
}
public void setUrlPattern(String urlPattern) {
this.urlPattern = urlPattern;
}
public List<DataUpload> getDataUploads() {
return dataUploads;
}
public List<User> getUploaders() {
return DB.getDataUploadDAO().getUploaders(this);
}
public void setDataUploads(List<DataUpload> dataUploads) {
this.dataUploads = dataUploads;
}
/**
* Return all the dependent organizations all the levels down.
* @return
*/
public List<Organization> getDependantRecursive() {
Map<Long, Organization> m = new HashMap<Long,Organization>();
List<Organization> toDo = new ArrayList<Organization>();
toDo.addAll(getDependantOrganizations());
while( !toDo.isEmpty()) {
Organization o = toDo.remove(0);
if( ! m.containsKey(o.getDbID())) {
m.put( o.getDbID(), o);
toDo.addAll( o.getDependantOrganizations());
}
}
toDo.clear();
toDo.addAll(m.values());
return toDo;
}
/**
* if find, just look for one
* @param find
* @return
*/
private List<User> directAdmins( boolean find ) {
List<User> res = new ArrayList<User>();
for( User u: getUsers() )
if( u.getMintRole().equalsIgnoreCase("admin")) {
res.add( u );
if( find ) break;
}
return res;
}
/**
* if find, just look for one
* @param find
* @return
*/
private void adminsRecursive( boolean find, List<User> result ) {
result.addAll( directAdmins( find ));
if( !result.isEmpty() && find ) return;
Organization parent = getParentalOrganization();
if( parent != null )
parent.adminsRecursive(find, result);
}
/**
* Counts all admins in this organizations and all parents
* @return
*/
public int getAdmincount() {
List<User> admins = new ArrayList<User>();
adminsRecursive(false, admins);
return admins.size();
}
/**
* Find one admin in this organization or any parent
* @return
*/
public User findAdmin(){
List<User> admins = new ArrayList<User>();
adminsRecursive(true, admins);
if( admins.isEmpty() ) return null;
else return admins.get(0);
}
/**
* Returns all admins in this and parent organizations
* @return
*/
public List<User> getAllAdmins() {
List<User> admins = new ArrayList<User>();
adminsRecursive(false, admins);
return admins;
}
public List<Mapping> getAllMappings() {
return DB.getMappingDAO().findByOrganization(this);
}
}