/*
* Copyright (C) 2011 - 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.services;
import dk.i2m.converge.core.workflow.WorkflowStateTransitionException;
import dk.i2m.converge.core.ConfigurationKey;
import dk.i2m.converge.core.DataNotFoundException;
import dk.i2m.converge.core.EnrichException;
import dk.i2m.converge.core.Notification;
import dk.i2m.converge.core.content.ContentTag;
import dk.i2m.converge.core.content.NewsItem;
import dk.i2m.converge.core.content.NewsItemActionState;
import dk.i2m.converge.core.content.NewsItemEditionState;
import dk.i2m.converge.core.content.NewsItemPlacement;
import dk.i2m.converge.core.content.catalogue.Catalogue;
import dk.i2m.converge.core.content.catalogue.MediaItem;
import dk.i2m.converge.core.content.catalogue.MediaItemRendition;
import dk.i2m.converge.core.content.catalogue.Rendition;
import dk.i2m.converge.core.content.forex.Rate;
import dk.i2m.converge.core.content.markets.MarketValue;
import dk.i2m.converge.core.content.weather.Forecast;
import dk.i2m.converge.core.logging.LogSubject;
import dk.i2m.converge.core.newswire.NewswireDecoderException;
import dk.i2m.converge.core.newswire.NewswireItem;
import dk.i2m.converge.core.newswire.NewswireService;
import dk.i2m.converge.core.plugin.ArchiveException;
import dk.i2m.converge.core.search.QueueEntryOperation;
import dk.i2m.converge.core.search.QueueEntryType;
import dk.i2m.converge.core.search.SearchEngineIndexingException;
import dk.i2m.converge.core.security.UserAccount;
import dk.i2m.converge.core.workflow.Edition;
import dk.i2m.converge.core.workflow.Outlet;
import dk.i2m.converge.ejb.facades.*;
import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
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;
/**
* Implementation of the {@link dk.i2m.converge.core.plugin.PluginContext}.
*
* @author Allan Lykke Christensen
* @author Raymond Wanyoike
*/
@Stateless
public class PluginContextBean implements PluginContextBeanLocal {
private static final Logger LOG = Logger.getLogger(PluginContextBean.class.getName());
@EJB
private SystemFacadeLocal systemFacade;
@EJB
private ConfigurationServiceLocal cfgService;
@EJB
private NewswireServiceLocal newswireService;
@EJB
private NotificationServiceLocal notificationService;
@EJB
private UserServiceLocal userService;
@EJB
private NewsItemFacadeLocal newsItemFacade;
@EJB
private SearchEngineLocal searchEngine;
@EJB
private ListingFacadeLocal listingFacade;
@EJB
private DaoServiceLocal daoService;
@EJB
private CatalogueFacadeLocal catalogueFacade;
@EJB
private MetaDataServiceLocal metaDataService;
@EJB
private OutletFacadeLocal outletFacade;
private UserAccount currentUserAccount = null;
@Override
public void setCurrentUserAccount(UserAccount userAccount) {
this.currentUserAccount = userAccount;
}
@Override
public UserAccount getCurrentUserAccount() {
return this.currentUserAccount;
}
@Override
public String getWorkingDirectory() {
return cfgService.getString(ConfigurationKey.WORKING_DIRECTORY);
}
@Override
public NewswireItem createNewswireItem(NewswireItem item) {
if (item.getTitle().trim().isEmpty()) {
// TODO: I18n
item.setTitle("Untitled");
}
return newswireService.create(item);
}
@Override
public List<NewswireItem> findNewswireItemsByExternalId(String externalId) {
return newswireService.findByExternalId(externalId);
}
@Override
public void fetch(NewswireService service) throws NewswireDecoderException {
try {
newswireService.downloadNewswireService(service.getId());
} catch (DataNotFoundException ex) {
throw new NewswireDecoderException(ex);
}
}
@Override
public void dispatchMail(String to, String from, String subject,
String content) {
notificationService.dispatchMail(to, from, subject, content);
}
@Override
public Notification createNotification(Notification notifcation) {
return notificationService.create(notifcation);
}
@Override
public List<UserAccount> findUserAccountsByRole(String roleName) {
return userService.findUserAccountsByUserRoleName(roleName);
}
@Override
public List<NewsItem> findNewsItemsByStateAndOutlet(String stateName,
Outlet outlet) {
return newsItemFacade.findByStateAndOutlet(stateName, outlet);
}
@Override
public void index(NewsItem item) throws SearchEngineIndexingException {
searchEngine.addToIndexQueue(QueueEntryType.NEWS_ITEM, item.getId(),
QueueEntryOperation.UPDATE);
}
@Override
public List<MarketValue> findMarketListing() {
return listingFacade.findLatestMarketValues();
}
@Override
public List<Rate> findForexListing() {
return listingFacade.findLatestForexRates();
}
@Override
public List<Forecast> findWeatherForecast() {
return listingFacade.findLatestForecasts();
}
@Override
public ContentTag findOrCreateContentTag(String name) {
Map<String, Object> params
= QueryBuilder.with("name", name).parameters();
ContentTag tag;
try {
tag = daoService.findObjectWithNamedQuery(ContentTag.class,
ContentTag.FIND_BY_NAME, params);
} catch (DataNotFoundException ex) {
tag = daoService.create(new ContentTag(name));
}
return tag;
}
@Override
public Catalogue findCatalogue(Long catalogueId) {
try {
return catalogueFacade.findCatalogueById(catalogueId);
} catch (DataNotFoundException ex) {
return null;
}
}
@Override
public Rendition findRenditionByName(String name) {
try {
return catalogueFacade.findRenditionByName(name);
} catch (DataNotFoundException ex) {
return null;
}
}
@Override
public String archive(File file, Long catalogueId, String fileName) throws
ArchiveException {
try {
Catalogue catalogue = catalogueFacade.findCatalogueById(catalogueId);
return catalogueFacade.archive(file, catalogue, fileName);
} catch (DataNotFoundException ex) {
throw new ArchiveException(ex);
} catch (IOException ex) {
throw new ArchiveException(ex);
}
}
@Override
public MediaItemRendition createMediaItemRendition(File file,
Long mediaItemId, Long renditionId, String filename,
String contentType) throws IOException {
try {
MediaItem mediaItem = catalogueFacade.findMediaItemById(mediaItemId);
Rendition rendition = catalogueFacade.findRenditionById(renditionId);
return catalogueFacade.create(file, mediaItem, rendition, filename,
contentType, false);
} catch (DataNotFoundException ex) {
throw new IllegalArgumentException(ex);
}
}
@Override
public MediaItemRendition updateMediaItemRendition(java.io.File file,
String filename, String contentType,
dk.i2m.converge.core.content.catalogue.MediaItemRendition mediaItemRendition)
throws IOException {
return catalogueFacade.update(file, filename, contentType,
mediaItemRendition, false);
}
@Override
public List<dk.i2m.converge.core.metadata.Concept> enrich(String story)
throws EnrichException {
return metaDataService.enrich(story);
}
@Override
public String extractContent(MediaItemRendition mediaItemRendition) {
return metaDataService.extractContent(mediaItemRendition);
}
@Override
public String getConfiguration(ConfigurationKey key) {
return cfgService.getString(key);
}
@Override
public void index(NewswireItem item) throws SearchEngineIndexingException {
newswireService.index(item);
}
@Override
public void log(dk.i2m.converge.core.logging.LogSeverity severity,
java.lang.String message, java.lang.Object[] messageArguments,
java.lang.Object origin,
java.lang.Object originId) {
String msg = MessageFormat.format(message, messageArguments);
systemFacade.log(severity, msg, origin, String.valueOf(originId));
}
@Override
public void log(dk.i2m.converge.core.logging.LogSeverity severity,
java.lang.String message, java.lang.Object origin,
java.lang.Object originId) {
systemFacade.log(severity, message, origin, String.valueOf(
originId));
}
@Override
public void log(dk.i2m.converge.core.logging.LogSeverity severity,
java.lang.String message, java.lang.Object[] messageArguments,
List<LogSubject> subjects) {
String msg = MessageFormat.format(message, messageArguments);
systemFacade.log(severity, msg, subjects);
}
/**
* {@inheritDoc }
*/
@Override
public Outlet findOutletById(Long id) throws DataNotFoundException {
return outletFacade.findOutletById(id);
}
/**
* {@inheritDoc }
*/
@Override
public Edition findNextEdition(Long id) throws DataNotFoundException {
Outlet outlet = outletFacade.findOutletById(id);
return outletFacade.findNextEdition(outlet);
}
/**
* {@inheritDoc}
*/
@Override
public Edition updateEdition(Edition edition) {
return outletFacade.updateEdition(edition);
}
/**
* {@inheritDoc}
*/
@Override
public Edition createEdition(Edition edition) {
return outletFacade.createEdition(edition);
}
/**
* {@inheritDoc}
*/
@Override
public NewsItemPlacement createPlacement(NewsItemPlacement placement) {
return newsItemFacade.createPlacement(placement);
}
@Override
public NewsItemEditionState addNewsItemEditionState(Long editionId, Long newsItemId, String property, String value) {
return newsItemFacade.addNewsItemEditionState(editionId, newsItemId, property, value);
}
@Override
public NewsItemEditionState updateNewsItemEditionState(NewsItemEditionState newsItemEditionState) {
return newsItemFacade.updateNewsItemEditionState(newsItemEditionState);
}
@Override
public NewsItemEditionState findNewsItemEditionState(Long editionId, Long newsItemId, String property) throws DataNotFoundException {
return newsItemFacade.findNewsItemEditionState(editionId, newsItemId, property);
}
@Override
public NewsItemEditionState findNewsItemEditionStateOrCreate(Long editionId, Long newsItemId, String property, String value) {
return newsItemFacade.findNewsItemEditionStateOrCreate(editionId, newsItemId, property, value);
}
@Override
public void workflowTransition(Long newsItemId, String uid, long step) throws WorkflowStateTransitionException {
try {
UserAccount userAccount = userService.findById(uid);
NewsItemHolder checkout = newsItemFacade.checkout(newsItemId, userAccount);
newsItemFacade.step(checkout.getNewsItem(), userAccount, step, "");
} catch (DataNotFoundException ex) {
LOG.log(Level.SEVERE, ex.getMessage());
LOG.log(Level.FINEST, "", ex);
throw new WorkflowStateTransitionException(ex);
} catch (UserNotFoundException ex) {
throw new WorkflowStateTransitionException(ex);
} catch (DirectoryException ex) {
throw new WorkflowStateTransitionException(ex);
}
}
@Override
public NewsItemActionState addNewsItemActionState(Long editionId, Long newsItemId, String action, String state, String data) {
return newsItemFacade.addNewsItemActionState(editionId, newsItemId, action, state, data);
}
@Override
public NewsItemActionState updateNewsItemActionState(NewsItemActionState newsItemActionState) {
return newsItemFacade.updateNewsItemActionState(newsItemActionState);
}
@Override
public NewsItemActionState findNewsItemActionState(Long editionId, Long newsItemId, String action) throws DataNotFoundException {
return newsItemFacade.findNewsItemActionState(editionId, newsItemId, action);
}
@Override
public NewsItemActionState findNewsItemActionStateOrCreate(Long editionId, Long newsItemId, String action, String state, String data) {
return newsItemFacade.findNewsItemActionStateOrCreate(editionId, newsItemId, action, state, data);
}
}