/* * Copyright (c) 2014 antoniomariasanchez at gmail.com. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * antoniomaria - initial API and implementation */ package net.sf.gazpachoquest.domain.core; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.ManyToOne; import javax.persistence.MapKeyColumn; import javax.persistence.MapKeyEnumerated; import javax.persistence.OneToMany; import javax.xml.bind.annotation.XmlTransient; import net.sf.gazpachoquest.domain.core.embeddables.MailMessageTemplateLanguageSettings; import net.sf.gazpachoquest.domain.i18.MailMessageTemplateTranslation; import net.sf.gazpachoquest.domain.support.AbstractLocalizable; import net.sf.gazpachoquest.types.Language; import net.sf.gazpachoquest.types.MailMessageTemplateType; @SuppressWarnings("serial") @Entity public class MailMessageTemplate extends AbstractLocalizable<MailMessageTemplateTranslation, MailMessageTemplateLanguageSettings> { @Column(insertable = true, updatable = true, nullable = false) @XmlTransient @Enumerated(EnumType.STRING) private MailMessageTemplateType type; @ManyToOne(fetch = FetchType.LAZY) private QuestionnaireDefinition questionnaireDefinition; @Enumerated(EnumType.STRING) @Column(nullable = false) private Language language; @Column(nullable = false) private String fromAddress; @Column(nullable = false) private String replyTo; @Embedded private MailMessageTemplateLanguageSettings languageSettings; @OneToMany(mappedBy = "mailMessageTemplate", fetch = FetchType.LAZY, cascade = CascadeType.ALL) @MapKeyEnumerated(EnumType.STRING) @MapKeyColumn(name = "language", insertable = false, updatable = false) private final Map<Language, MailMessageTemplateTranslation> translations = new HashMap<Language, MailMessageTemplateTranslation>(); public MailMessageTemplate() { super(); } @Override public Language getLanguage() { return language; } @Override public void setLanguage(Language language) { this.language = language; } public String getFromAddress() { return fromAddress; } public void setFromAddress(String from) { fromAddress = from; } public String getReplyTo() { return replyTo; } public void setReplyTo(String replyTo) { this.replyTo = replyTo; } @Override public MailMessageTemplateLanguageSettings getLanguageSettings() { return languageSettings; } @Override public void setLanguageSettings(MailMessageTemplateLanguageSettings languageSettings) { this.languageSettings = languageSettings; } @Override public Map<Language, MailMessageTemplateTranslation> getTranslations() { return Collections.unmodifiableMap(translations); } public void addTranslation(Language language, MailMessageTemplateTranslation translation) { translations.put(language, translation); translation.setMailMessageTemplate(this); } public MailMessageTemplateType getType() { return type; } public void setType(MailMessageTemplateType type) { this.type = type; } public QuestionnaireDefinition getQuestionnairDefinition() { return questionnaireDefinition; } public void setQuestionnairDefinition(QuestionnaireDefinition questionnaireDefinition) { this.questionnaireDefinition = questionnaireDefinition; } public static Builder with() { return new Builder(); } /** * @hidden */ public static class Builder { private Integer id; private QuestionnaireDefinition questionnaireDefinition; private MailMessageTemplateType type; private Language language; private String fromAddress; private String replyTo; private MailMessageTemplateLanguageSettings languageSettings; public Builder id(Integer id) { this.id = id; return this; } public Builder language(Language language) { this.language = language; return this; } public Builder questionnaireDefinition(QuestionnaireDefinition questionnaireDefinition) { this.questionnaireDefinition = questionnaireDefinition; return this; } public Builder type(MailMessageTemplateType type) { this.type = type; return this; } public Builder fromAddress(String fromAddress) { this.fromAddress = fromAddress; return this; } public Builder replyTo(String replyTo) { this.replyTo = replyTo; return this; } public Builder languageSettings(MailMessageTemplateLanguageSettings languageSettings) { this.languageSettings = languageSettings; return this; } public MailMessageTemplate build() { MailMessageTemplate mailMessageTemplate = new MailMessageTemplate(); mailMessageTemplate.language = language; mailMessageTemplate.fromAddress = fromAddress; mailMessageTemplate.replyTo = replyTo; mailMessageTemplate.languageSettings = languageSettings; mailMessageTemplate.type = type; mailMessageTemplate.questionnaireDefinition = questionnaireDefinition; mailMessageTemplate.setId(id); return mailMessageTemplate; } } public void updateInverseRelationships() { for (Entry<Language, MailMessageTemplateTranslation> entry : translations.entrySet()) { MailMessageTemplateTranslation mailMessageTemplateTranslation = entry.getValue(); mailMessageTemplateTranslation.setMailMessageTemplate(this); mailMessageTemplateTranslation.setLanguage(entry.getKey()); } } }