package org.sigmah.server.service;
/*
* #%L
* Sigmah
* %%
* Copyright (C) 2010 - 2016 URD
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.inject.Inject;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import org.sigmah.server.dao.ContactDAO;
import org.sigmah.server.dao.CountryDAO;
import org.sigmah.server.dao.FileDAO;
import org.sigmah.server.dao.OrgUnitDAO;
import org.sigmah.server.dao.ProjectReportDAO;
import org.sigmah.server.dao.QuestionChoiceElementDAO;
import org.sigmah.server.dao.TripletValueDAO;
import org.sigmah.server.domain.Contact;
import org.sigmah.server.domain.OrgUnit;
import org.sigmah.server.domain.element.*;
import org.sigmah.server.domain.report.ProjectReport;
import org.sigmah.server.domain.value.File;
import org.sigmah.server.domain.value.TripletValue;
import org.sigmah.server.i18n.I18nServer;
import org.sigmah.shared.Language;
import org.sigmah.shared.dto.referential.DefaultContactFlexibleElementType;
import org.sigmah.shared.dto.referential.TextAreaType;
import org.sigmah.shared.util.ValueResultUtils;
public class ModelPropertyService {
private final ContactDAO contactDAO;
private final CountryDAO countryDAO;
private final FileDAO fileDAO;
private final QuestionChoiceElementDAO questionChoiceElementDAO;
private final OrgUnitDAO orgUnitDAO;
private final ProjectReportDAO projectReportDAO;
private final TripletValueDAO tripletValueDAO;
private final I18nServer i18nServer;
@Inject
public ModelPropertyService(ContactDAO contactDAO, CountryDAO countryDAO, FileDAO fileDAO, QuestionChoiceElementDAO questionChoiceElementDAO,
OrgUnitDAO orgUnitDAO, ProjectReportDAO projectReportDAO, TripletValueDAO tripletValueDAO, I18nServer i18nServer) {
this.contactDAO = contactDAO;
this.countryDAO = countryDAO;
this.fileDAO = fileDAO;
this.questionChoiceElementDAO = questionChoiceElementDAO;
this.orgUnitDAO = orgUnitDAO;
this.projectReportDAO = projectReportDAO;
this.tripletValueDAO = tripletValueDAO;
this.i18nServer = i18nServer;
}
public String getFormattedValue(FlexibleElement element, String value, Language language) {
if (element instanceof TextAreaElement) {
TextAreaType textAreaType = TextAreaType.fromCode(((TextAreaElement) element).getType());
return getTextareaFormattedValue(value, textAreaType);
} else if (element instanceof ContactListElement) {
return getContactListElementFormattedValue(value);
} else if (element instanceof CheckboxElement) {
return getCheckboxFormattedValue(value, language);
} else if (element instanceof QuestionElement) {
return getQuestionFormattedValue(value);
} else if (element instanceof ReportElement || element instanceof ReportListElement) {
return getReportFormattedValue(value);
} else if (element instanceof TripletsListElement) {
return getTripletFormattedValue(value);
} else if (element instanceof FilesListElement) {
return getFileFormattedValue(value);
} else if (element instanceof DefaultContactFlexibleElement) {
return getDefaultContactFormattedValue(value, ((DefaultContactFlexibleElement) element).getType());
} else if (element instanceof ComputationElement) {
return value;
} else {
throw new IllegalStateException("Unknown Flexible Element type : " + element.getClass());
}
}
private String getContactListElementFormattedValue(String value) {
if (value == null) {
return null;
}
StringBuilder serializedValueBuilder = new StringBuilder();
List<Contact> contacts = contactDAO.findByIds(new HashSet<Integer>(ValueResultUtils.splitValuesAsInteger(value)));
for (int i = 0; i < contacts.size(); i++) {
serializedValueBuilder.append(contacts.get(i).getFullName());
}
return serializedValueBuilder.toString();
}
private String getCheckboxFormattedValue(String value, Language language) {
if ("true".equals(value)) {
return i18nServer.t(language, "yes");
}
return i18nServer.t(language, "no");
}
private String getQuestionFormattedValue(String value) {
if (value == null) {
return null;
}
List<QuestionChoiceElement> choiceElements = questionChoiceElementDAO.findByIds(new HashSet<Integer>(ValueResultUtils.splitValuesAsInteger(value)));
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < choiceElements.size(); i++) {
if (i != 0) {
stringBuilder.append(", ");
}
stringBuilder.append(choiceElements.get(i).getLabel());
}
return stringBuilder.toString();
}
private String getTextareaFormattedValue(String value, TextAreaType textAreaType) {
if (value == null) {
return null;
}
switch (textAreaType) {
case DATE:
Date date = new Date(Long.parseLong(value));
if (GWT.isClient()) {
return DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.DATE_MEDIUM).format(date);
}
return SimpleDateFormat.getDateTimeInstance().format(date);
case NUMBER:
case PARAGRAPH:
case TEXT:
return value;
default:
throw new IllegalStateException("Unknown TextAreaType : " + textAreaType);
}
}
private String getReportFormattedValue(String value) {
if (value == null) {
return null;
}
List<ProjectReport> projectReports = projectReportDAO.findByIds(new HashSet<Integer>(ValueResultUtils.splitValuesAsInteger(value)));
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < projectReports.size(); i++) {
if (i != 0) {
stringBuilder.append(", ");
}
stringBuilder.append(projectReports.get(i).getName());
}
return stringBuilder.toString();
}
private String getTripletFormattedValue(String value) {
if (value == null) {
return null;
}
List<TripletValue> tripletValues = tripletValueDAO.findByIds(new HashSet<Integer>(ValueResultUtils.splitValuesAsInteger(value)));
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < tripletValues.size(); i++) {
if (i != 0) {
stringBuilder.append(", ");
}
TripletValue tripletValue = tripletValues.get(i);
stringBuilder
.append("(")
.append(tripletValue.getCode())
.append(tripletValue.getName())
.append(tripletValue.getPeriod())
.append(")");
}
return stringBuilder.toString();
}
private String getFileFormattedValue(String value) {
if (value == null) {
return null;
}
List<File> files = fileDAO.findByIds(new HashSet<Integer>(ValueResultUtils.splitValuesAsInteger(value)));
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < files.size(); i++) {
if (i != 0) {
stringBuilder.append(", ");
}
stringBuilder.append(files.get(i).getName());
}
return stringBuilder.toString();
}
private String getDefaultContactFormattedValue(String value, DefaultContactFlexibleElementType type) {
if (value == null || value.isEmpty()) {
return null;
}
switch (type) {
case COUNTRY:
return countryDAO.findById(Integer.parseInt(value)).getName();
case CREATION_DATE:
return SimpleDateFormat.getDateTimeInstance().format(new Date(Long.parseLong(value)));
case DIRECT_MEMBERSHIP:
return contactDAO.findById(Integer.parseInt(value)).getFullName();
case MAIN_ORG_UNIT:
return orgUnitDAO.findById(Integer.parseInt(value)).getFullName();
case SECONDARY_ORG_UNITS:
List<OrgUnit> orgUnits = orgUnitDAO.findByIds(new HashSet<Integer>(ValueResultUtils.splitValuesAsInteger(value)));
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < orgUnits.size(); i++) {
if (i != 0) {
stringBuilder.append(", ");
}
stringBuilder.append(orgUnits.get(i).getFullName());
}
return stringBuilder.toString();
case TOP_MEMBERSHIP:
return contactDAO.findById(Integer.parseInt(value)).getFullName();
case EMAIL_ADDRESS: // fall through
case FAMILY_NAME: // fall through
case FIRST_NAME: // fall through
case LOGIN: // fall through
case ORGANIZATION_NAME: // fall through
case PHONE_NUMBER: // fall through
case PHOTO: // fall through
case POSTAL_ADDRESS:
return value;
default:
throw new IllegalStateException("Unknown DefaultContactFlexibleElementType : " + type);
}
}
public String getDefaultContactPropertyLabel(DefaultContactFlexibleElementType type, Language language) {
switch (type) {
case COUNTRY:
return i18nServer.t(language, "contactCountry");
case CREATION_DATE:
return i18nServer.t(language, "contactCreationDate");
case DIRECT_MEMBERSHIP:
return i18nServer.t(language, "contactDirectMembership");
case EMAIL_ADDRESS:
return i18nServer.t(language, "contactEmailAddress");
case FAMILY_NAME:
return i18nServer.t(language, "contactFamilyName");
case FIRST_NAME:
return i18nServer.t(language, "contactFirstName");
case LOGIN:
return i18nServer.t(language, "contactLogin");
case MAIN_ORG_UNIT:
return i18nServer.t(language, "contactMainOrgUnit");
case ORGANIZATION_NAME:
return i18nServer.t(language, "contactOrganizationName");
case PHONE_NUMBER:
return i18nServer.t(language, "contactPhoneNumber");
case PHOTO:
return i18nServer.t(language, "contactPhoto");
case POSTAL_ADDRESS:
return i18nServer.t(language, "contactPostalAddress");
case SECONDARY_ORG_UNITS:
return i18nServer.t(language, "contactSecondaryOrgUnits");
case TOP_MEMBERSHIP:
return i18nServer.t(language, "contactTopMembership");
default:
throw new IllegalStateException("Unknown DefaultContactFlexibleElementType : " + type);
}
}
}