/* * Copyright (C) 2010 - 2012 Interactive Media Management * * 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/>. */ package dk.i2m.converge.ejb.facades; import dk.i2m.converge.core.Announcement; import dk.i2m.converge.core.BackgroundTask; import dk.i2m.converge.core.ConfigurationKey; import dk.i2m.converge.core.DataNotFoundException; import dk.i2m.converge.core.content.Language; import dk.i2m.converge.core.logging.LogEntry; import dk.i2m.converge.core.logging.LogHelper; import dk.i2m.converge.core.logging.LogSeverity; import dk.i2m.converge.core.logging.LogSubject; import dk.i2m.converge.core.newswire.NewswireService; import dk.i2m.converge.core.plugin.Plugin; import dk.i2m.converge.core.plugin.PluginManager; import dk.i2m.converge.domain.Property; import dk.i2m.converge.ejb.services.*; import java.io.File; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; /** * Session bean providing access to information about the system. * * @author Allan Lykke Christensen */ @Stateless public class SystemFacadeBean implements SystemFacadeLocal { private static final Logger LOG = Logger.getLogger(SystemFacadeBean.class. getName()); @EJB private UserServiceLocal userService; @EJB private ConfigurationServiceLocal cfgService; @EJB private DaoServiceLocal daoService; @EJB private NewsItemFacadeLocal newsItemFacade; @EJB private TimerServiceLocal timerService; /** * Creates a new instance of {@link SystemFacadeBean}. */ public SystemFacadeBean() { } /** * Conducts a sanity check of the system. * * @return {@code true} if the sanity of the system is OK, otherwise * {@code false} */ @Override public boolean sanityCheck() { removeAllBackgroundTasks(); int reset = removeAllNewswireProcessing(); LOG.log(Level.INFO, "{0} newswire {0, choice, 0#services|1#service|2#services} reset", reset); int userCount = userService.findAll().size(); LOG.log(Level.INFO, "{0} user {0, choice, 0#accounts|1#account|2#accounts} in the system", userCount); getPlugins(); LOG.log(Level.INFO, "{0} stale {0, choice, 0#locks|1#lock|2#locks} removed", newsItemFacade.revokeAllLocks()); String userPhotoDirectory = cfgService.getString( ConfigurationKey.WORKING_DIRECTORY) + System.getProperty( "file.separator") + "users" + System.getProperty( "file.separator"); LOG.log(Level.INFO, "Checking if user photo directory ({0}) exists", new Object[]{userPhotoDirectory}); File file = new File(userPhotoDirectory); if (!file.exists()) { LOG.log(Level.INFO, "{0} does not exist. Creating directory", new Object[]{userPhotoDirectory}); file.mkdirs(); } else { LOG.log(Level.INFO, "{0} exists", new Object[]{userPhotoDirectory}); } timerService.startTimers(); return true; } /** * {@inheritDoc } */ @Override public Map<String, Plugin> getPlugins() { return PluginManager.getInstance().getPlugins(); } /** * Gets a {@link List} of the system properties and their values. * * @return {@link List} of system properties */ @Override public List<Property> getSystemProperties() { List<Property> properties = new ArrayList<Property>(); for (ConfigurationKey cfgKey : ConfigurationKey.values()) { if (!(cfgKey.equals(ConfigurationKey.VERSION) || cfgKey.equals( ConfigurationKey.BUILD_TIME))) { String key = cfgKey.name(); String value = this.cfgService.getString(cfgKey); properties.add(new Property(key, value)); } } return properties; } /** * {@inheritDoc } */ @Override public void updateSystemProperties(List<Property> properties) { for (Property property : properties) { this.cfgService.set(ConfigurationKey.valueOf(property.getKey()), property.getValue().replaceAll(",", "\\,")); } } /** * {@inheritDoc } */ @Override public String getProperty(ConfigurationKey key) { return cfgService.getString(key); } /** * {@inheritDoc } */ @Override public String getApplicationVersion() { return cfgService.getLongVersion(); } @Override public String getShortApplicationVersion() { return cfgService.getVersion(); } /** * {@inheritDoc } */ @Override public List<Announcement> getAnnouncements() { return daoService.findAll(Announcement.class); } /** * {@inheritDoc } */ @Override public List<Announcement> getPublishedAnnouncements() { return daoService.findWithNamedQuery(Announcement.FIND_PUBLISHED); } /** * {@inheritDoc } */ @Override public Announcement updateAnnouncement(Announcement announcement) { return daoService.update(announcement); } /** * {@inheritDoc } */ @Override public Announcement createAnnouncement(Announcement announcement) { return daoService.create(announcement); } /** * {@inheritDoc } */ @Override public void deleteAnnouncement(Long id) { daoService.delete(Announcement.class, id); } /** * {@inheritDoc } */ @Override public Announcement findAnnouncementById(Long id) throws DataNotFoundException { return daoService.findById(Announcement.class, id); } /** * Gets all {@link Language}s from the database. * * @return {@link List} of all {@link Language}s in the database */ @Override public List<Language> getLanguages() { return daoService.findAll(Language.class); } /** * Updates an existing {@link Language}. * * @param language {@link Language} to update * @return Updated {@link Language} */ @Override public Language updateLanguage(Language language) { return daoService.update(language); } /** * Creates a new {@link Language}. * * @param language {@link Language} to create * @return Created {@link Language} */ @Override public Language createLanguage(Language language) { return daoService.create(language); } /** * Delete an existing {@link Language}. * * @param id Unique identifier of the {@link Language} * @throws ReferentialIntegrityException If referential integrity is broken * by deleting the {@link Language} */ @Override public void deleteLanguage(Long id) throws ReferentialIntegrityException { // TODO: Check if the language is being used in an Outlet or NewsItem daoService.delete(Language.class, id); } /** * Find existing {@link Language} in the database. * * @param id Unique identifier of the {@link Language} * @return {@link Language} matching the {@code id} * @throws DataNotFoundException If no {@link Language} could be matched to * the {@code id} */ @Override public Language findLanguageById(Long id) throws DataNotFoundException { return daoService.findById(Language.class, id); } /** * Indicate that a {@link BackgroundTask} is running. * * @param name Name of the {@link BackgroundTask} * @return Unique identifier of the {@link BackgroundTask} */ @Override @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public Long createBackgroundTask(String name) { BackgroundTask task = new BackgroundTask(); task.setTaskStart(Calendar.getInstance().getTime()); task.setName(name); task = daoService.create(task); return task.getId(); } /** * Indicate that a {@link BackgroundTask} has completed. * * @param id * Unique identifier of the {@link BackgroundTask} */ @Override @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void removeBackgroundTask(Long id) { daoService.delete(BackgroundTask.class, id); } /** * Gets all running {@link BackgroundTask}s. * * @return {@link List} of running {@link BackgroundTask}s */ @Override public List<BackgroundTask> getBackgroundTasks() { return daoService.findAll(BackgroundTask.class); } private void removeAllBackgroundTasks() { for (BackgroundTask t : getBackgroundTasks()) { removeBackgroundTask(t.getId()); } } @Override @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void log(LogSeverity severity, String message, String origin, String originId) { LogEntry entry = new LogEntry(severity, message, origin, originId); entry.setDate(Calendar.getInstance().getTime()); daoService.create(entry); LOG.log(LogHelper.toLevel(severity), entry.toString()); } @Override @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void log(dk.i2m.converge.core.logging.LogSeverity severity, java.lang.String message, java.util.List<LogSubject> subjects) { LogEntry entry = new LogEntry(severity, message); entry.setDate(Calendar.getInstance().getTime()); for (LogSubject subject : subjects) { entry.addSubject(subject); } daoService.create(entry); LOG.log(LogHelper.toLevel(severity), entry.toString()); } @Override @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void log(LogSeverity severity, String message, Object origin, String originId) { log(severity, message, origin.getClass().getName(), originId); } @Override public List<LogEntry> findLogEntries(String origin, String originId) { Map<String, Object> parameters = QueryBuilder.with(LogEntry.PARAMETER_ENTITY, origin).and( LogEntry.PARAMETER_ENTITY_ID, originId). parameters(); return daoService.findWithNamedQuery(LogEntry.FIND_BY_ENTITY, parameters); } @Override public List<LogEntry> findLogEntries(String origin, String originId, int start, int count) { Map<String, Object> parameters = QueryBuilder.with(LogEntry.PARAMETER_ENTITY, origin).and( LogEntry.PARAMETER_ENTITY_ID, originId).parameters(); return daoService.findWithNamedQuery(LogEntry.FIND_BY_ENTITY, parameters, start, count); } @Override public List<LogEntry> findLogEntries(int start, int count) { return daoService.findAll(LogEntry.class, start, count, "date", false); } @Override public List<LogEntry> findLogEntries() { return daoService.findAll(LogEntry.class, "date", false); } @Override public void removeLogEntries(String entryType, String entryId) { List<LogEntry> entries = findLogEntries(entryType, entryId); for (LogEntry entry : entries) { daoService.delete(LogEntry.class, entry.getId()); } } private int removeAllNewswireProcessing() { return daoService.executeQuery(NewswireService.RESET_PROCESSING); } }