001 package de.deepamehta.plugins.mail;
002
003 import static de.deepamehta.plugins.mail.MailPlugin.*;
004
005 import java.util.Collection;
006 import java.util.HashMap;
007 import java.util.HashSet;
008 import java.util.LinkedHashSet;
009 import java.util.Map;
010 import java.util.Set;
011 import java.util.logging.Logger;
012
013 import de.deepamehta.core.RelatedTopic;
014 import de.deepamehta.core.ResultSet;
015 import de.deepamehta.core.Topic;
016 import de.deepamehta.core.model.SimpleValue;
017 import de.deepamehta.core.service.DeepaMehtaService;
018
019 /**
020 * Reveals and caches mail configuration parts.
021 *
022 * @TODO configure MTA user and password (requires a password data type)
023 */
024 class MailConfigurationCache {
025
026 private static Logger log = Logger.getLogger(MailConfigurationCache.class.getName());
027
028 public static final String MAIL_CONFIG = "dm4.mail.config";
029
030 public static final String SMTP_HOST = "dm4.mail.config.host";
031
032 private Topic config = null;
033
034 private RecipientType defaultRecipientType = null;
035
036 private RelatedTopic defaultSender = null;
037
038 private boolean defaultSenderIsNull = false;
039
040 private final DeepaMehtaService dms;
041
042 private ResultSet<RelatedTopic> recipientTypes;
043
044 private Set<String> recipientTypeUris;
045
046 private Map<String, Topic> searchParentTypes;
047
048 private ResultSet<RelatedTopic> searchTypes;
049
050 private Set<String> searchTypeUris;
051
052 private String smtpHost = null;
053
054 public MailConfigurationCache(DeepaMehtaService dms) {
055 this.dms = dms;
056 }
057
058 /**
059 * Returns the corresponding enumeration value or the configured default
060 * recipient type.
061 *
062 * @param type
063 * Valid recipient type enumeration value.
064 * @return Recipient type.
065 */
066 public RecipientType checkRecipientType(String type) {
067 if (type == null || type.isEmpty()// type URI is unknown?
068 || getRecipientTypeUris().contains(type) == false) {
069 log.fine("use default recipient type");
070 return getDefaultRecipientType();
071 } else {
072 return RecipientType.fromUri(type);
073 }
074 }
075
076 private Topic getConfiguration() {
077 if (config == null) {
078 log.info("reveal mail plugin configuration");
079 config = dms.getTopic("uri", new SimpleValue(MAIL_CONFIG), true);
080 }
081 return config;
082 }
083
084 public Topic getTopic() {
085 return getConfiguration();
086 }
087
088 public RecipientType getDefaultRecipientType() {
089 if (defaultRecipientType == null) {
090 log.info("reveal default recipient type");
091 Topic type = getConfiguration().getCompositeValue().getTopic(RECIPIENT_TYPE);
092 defaultRecipientType = RecipientType.fromUri(type.getUri());
093 }
094 return defaultRecipientType;
095 }
096
097 public RelatedTopic getDefaultSender() {
098 if (defaultSenderIsNull == false && defaultSender == null) {
099 log.info("reveal default sender");
100 defaultSender = getConfiguration().getRelatedTopic(SENDER, PARENT, CHILD, null, false, true);
101 if (defaultSender == null) {
102 defaultSenderIsNull = true;
103 }
104 }
105 return defaultSender;
106 }
107
108 public ResultSet<RelatedTopic> getRecipientTypes() {
109 if (recipientTypes == null) {
110 log.info("reveal recipient types");
111 recipientTypes = dms.getTopics(RECIPIENT_TYPE, false, 0);
112 }
113 return recipientTypes;
114 }
115
116 public Set<String> getRecipientTypeUris() {
117 if (recipientTypeUris == null) {
118 log.info("reveal recipient type URIs");
119 recipientTypeUris = new HashSet<String>();
120 for (Topic topic : getRecipientTypes()) {
121 recipientTypeUris.add(topic.getUri());
122 }
123 }
124 return recipientTypeUris;
125 }
126
127 public Collection<Topic> getSearchParentTypes() {
128 return revealSearchParentTypes().values();
129 }
130
131 public ResultSet<RelatedTopic> getSearchTypes() {
132 if (searchTypes == null) {
133 log.info("reveal search types");
134 // get aggregated composite search types
135 // FIXME use a specific association type and field renderer
136 searchTypes = getConfiguration().getRelatedTopics(AGGREGATION, PARENT, CHILD, TOPIC_TYPE, false, false, 0);
137 }
138 return searchTypes;
139 }
140
141 public Set<String> getSearchTypeUris() {
142 if (searchTypeUris == null) {
143 log.info("reveal search type URIs");
144 searchTypeUris = new LinkedHashSet<String>();
145 for (Topic topic : getSearchTypes()) {
146 searchTypeUris.add(topic.getUri());
147 }
148 }
149 return searchTypeUris;
150 }
151
152 public String getSmtpHost() {
153 if (smtpHost == null) {
154 log.info("reveal smtp host");
155 smtpHost = getConfiguration().getCompositeValue()//
156 .getTopic(SMTP_HOST).getSimpleValue().toString();
157 }
158 return smtpHost;
159 }
160
161 private Map<String, Topic> revealSearchParentTypes() {
162 if (searchParentTypes == null) {
163 log.info("reveal search parent types");
164 searchParentTypes = new HashMap<String, Topic>();
165 for (Topic type : getSearchTypes()) {
166 searchParentTypes.put(type.getUri(), type.getRelatedTopic(null,//
167 CHILD_TYPE, PARENT_TYPE, TOPIC_TYPE, false, false));
168 }
169 }
170 return searchParentTypes;
171 }
172
173 }