package org.exoplatform.portal.mop.page;
import java.util.List;
import javax.transaction.Status;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.portal.mop.EventType;
import org.exoplatform.portal.mop.QueryResult;
import org.exoplatform.portal.mop.SiteKey;
import org.exoplatform.portal.mop.SiteType;
import org.exoplatform.portal.pom.config.POMSession;
import org.exoplatform.portal.pom.config.POMSessionManager;
import org.exoplatform.services.cache.CacheService;
import org.exoplatform.services.listener.ListenerService;
import org.gatein.common.logging.Logger;
import org.gatein.common.logging.LoggerFactory;
import org.gatein.common.transaction.JTAUserTransactionLifecycleService;
/**
* <p>
* A wrapper for the {@link PageServiceImpl}, the wrappers takes care of integrating the implementation with the GateIn runtime.
* </p>
*
* <p>
* The wrapper emits events when page modifications are performed:
* </p>
* <ul>
* <li>{@link EventType#PAGE_CREATED}: when a page is created</li>
* <li>{@link EventType#PAGE_UPDATED}: when a page is updated</li>
* <li>{@link EventType#PAGE_DESTROYED}: when a page is destroyed</li>
* </ul>
*
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
*/
public class PageServiceWrapper implements PageService {
/** . */
private static final Logger log = LoggerFactory.getLogger(PageServiceWrapper.class);
/** . */
private final PageServiceImpl service;
/** . */
private final POMSessionManager manager;
/** . */
private final ListenerService listenerService;
public PageServiceWrapper(POMSessionManager manager, ListenerService listenerService) {
this.service = new PageServiceImpl(manager);
this.manager = manager;
this.listenerService = listenerService;
}
public PageServiceWrapper(POMSessionManager manager, ListenerService listenerService, CacheService cacheService) {
this.service = new PageServiceImpl(manager, new ExoDataCache(cacheService));
this.manager = manager;
this.listenerService = listenerService;
}
@Override
public PageContext loadPage(PageKey key) {
return service.loadPage(key);
}
public List<PageContext> loadPages(SiteKey siteKey) throws NullPointerException, PageServiceException {
return service.loadPages(siteKey);
}
@Override
public boolean savePage(PageContext page) {
boolean created = service.savePage(page);
//
if (created) {
notify(EventType.PAGE_CREATED, page.key);
} else {
notify(EventType.PAGE_UPDATED, page.key);
}
//
return created;
}
@Override
public boolean destroyPage(PageKey key) {
boolean destroyed = service.destroyPage(key);
//
if (destroyed) {
notify(EventType.PAGE_DESTROYED, key);
}
//
return destroyed;
}
@Override
public PageContext clone(PageKey src, PageKey dst) {
PageContext pageContext = service.clone(src, dst);
notify(EventType.PAGE_CREATED, dst);
return pageContext;
}
@Override
public QueryResult<PageContext> findPages(int offset, int limit, SiteType siteType, String siteName, String pageName,
String pageTitle) {
try {
JTAUserTransactionLifecycleService jtaUserTransactionLifecycleService = (JTAUserTransactionLifecycleService) PortalContainer
.getInstance().getComponentInstanceOfType(JTAUserTransactionLifecycleService.class);
if (jtaUserTransactionLifecycleService.getUserTransaction().getStatus() == Status.STATUS_ACTIVE) {
POMSession pomSession = manager.getSession();
if (pomSession.isModified()) {
if (log.isTraceEnabled()) {
log.trace("Active JTA transaction found. Going to sync MOP session and JTA transaction");
}
// Sync current MOP session first
pomSession.save();
jtaUserTransactionLifecycleService.finishJTATransaction();
jtaUserTransactionLifecycleService.beginJTATransaction();
}
}
} catch (Exception e) {
log.warn("Error during sync of JTA transaction", e);
}
return service.findPages(offset, limit, siteType, siteName, pageName, pageTitle);
}
private void notify(String name, PageKey key) {
try {
listenerService.broadcast(name, this, key);
} catch (Exception e) {
log.error("Error when delivering notification " + name + " for page " + key, e);
}
}
}