package org.jtheque.messages.impl;
/*
* Copyright JTheque (Baptiste Wicht)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.jtheque.core.ApplicationListener;
import org.jtheque.core.Core;
import org.jtheque.core.application.Application;
import org.jtheque.core.utils.WebHelper;
import org.jtheque.messages.Message;
import org.jtheque.messages.MessageService;
import org.jtheque.modules.Module;
import org.jtheque.modules.ModuleListener;
import org.jtheque.modules.ModuleResourceCache;
import org.jtheque.modules.ModuleService;
import org.jtheque.utils.StringUtils;
import org.jtheque.utils.ThreadUtils;
import org.jtheque.utils.bean.IntDate;
import org.jtheque.utils.collections.CollectionUtils;
import org.jtheque.xml.utils.XMLException;
import org.slf4j.LoggerFactory;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Collection;
/**
* A message service.
*
* @author Baptiste Wicht
*/
public final class MessageServiceImpl implements MessageService, ModuleListener, ApplicationListener {
private final Collection<Message> messages = CollectionUtils.newConcurrentList();
@Resource
private WebHelper webHelper;
@Resource
private Core core;
/**
* Construct a new MessageServiceImpl.
*
* @param moduleService The module service.
*/
public MessageServiceImpl(ModuleService moduleService) {
super();
moduleService.addModuleListener("", this);
}
/**
* Init the service.
*/
@PostConstruct
public void init(){
core.addApplicationListener(this);
ThreadUtils.inNewThread(new Runnable(){
@Override
public void run() {
loadMessageFile(core.getCoreMessageFileURL(), null);
}
});
}
@Override
public boolean isDisplayNeeded() {
IntDate previousDate = core.getConfiguration().getMessagesLastRead();
for (Message message : messages) {
if (message.getDate().compareTo(previousDate) > 0) {
return true;
}
}
return false;
}
@Override
public Message getEmptyMessage() {
return Messages.newEmptyMessage(-1);
}
@Override
public Collection<Message> getMessages() {
return CollectionUtils.protect(messages);
}
@Override
public void moduleStopped(Module module) {
messages.removeAll(ModuleResourceCache.getResources(module.getId(), Message.class));
}
@Override
public void moduleStarted(Module module) {
if (StringUtils.isNotEmpty(module.getMessagesUrl())) {
loadMessageFile(module.getMessagesUrl(), module);
}
}
@Override
public void moduleInstalled(Module module) {
//Nothing to do here
}
@Override
public void moduleUninstalled(Module module) {
//Nothing to do here
}
/**
* Load a messages files.
*
* @param url The URL of the messages file.
* @param module The module to load the message file from.
*/
private void loadMessageFile(String url, Module module) {
if (webHelper.isReachable(url)) {
try {
Collection<Message> readMessages = MessageFileReader.readMessagesFile(url);
messages.addAll(readMessages);
if (module != null) {
ModuleResourceCache.addAllResources(module.getId(), Message.class, readMessages);
}
} catch (XMLException e) {
LoggerFactory.getLogger(getClass()).error(e.getMessage(), e);
}
}
}
@Override
public void applicationLaunched(Application application) {
if (!StringUtils.isEmpty(application.getMessageFileURL())) {
loadMessageFile(application.getMessageFileURL(), null);
}
}
}