/* * Copyright (C) 2003-2012 eXo Platform SAS. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.exoplatform.forum.bbcode.core.cache; import java.util.ArrayList; import java.util.List; import org.exoplatform.forum.bbcode.api.BBCode; import org.exoplatform.forum.bbcode.api.BBCodeService; import org.exoplatform.forum.bbcode.core.BBCodeServiceImpl; import org.exoplatform.forum.bbcode.core.cache.data.BBCodeCacheData; import org.exoplatform.forum.bbcode.core.cache.data.ListBBCodeData; import org.exoplatform.forum.bbcode.core.cache.key.BBCodeKey; import org.exoplatform.forum.bbcode.spi.BBCodePlugin; import org.exoplatform.forum.common.cache.ServiceContext; import org.exoplatform.forum.common.cache.model.CacheType; import org.exoplatform.forum.common.cache.model.key.SimpleCacheKey; import org.exoplatform.services.cache.CacheService; import org.exoplatform.services.cache.ExoCache; import org.exoplatform.services.cache.future.FutureExoCache; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.picocontainer.Startable; public class CachedBBCodeService implements Startable, BBCodeService { private static Log LOG = ExoLogger.getLogger(CachedBBCodeService.class); private CacheService service; private BBCodeService bbCodeService; // private ExoCache<BBCodeKey, BBCodeCacheData> bbCodeData; private ExoCache<SimpleCacheKey, ListBBCodeData> bbCodeListData; // private FutureExoCache<BBCodeKey, BBCodeCacheData, ServiceContext<BBCodeCacheData>> bbCodeDataFuture; private FutureExoCache<SimpleCacheKey, ListBBCodeData, ServiceContext<ListBBCodeData>> bbCodeListDataFuture; public CachedBBCodeService(CacheService service, BBCodeServiceImpl bbCodeService) { this.service = service; this.bbCodeService = bbCodeService; } private void clearBBCodeCached(String bbCodeId) { bbCodeData.remove(new BBCodeKey(bbCodeId)); } private void clearBBCodeListCached() { SimpleCacheKey key = new SimpleCacheKey("bbcode", "forum.bbcode.list.key"); bbCodeListData.remove(key); } @Override public void registerBBCodePlugin(BBCodePlugin plugin) throws Exception { bbCodeService.registerBBCodePlugin(plugin); } @Override public void save(List<BBCode> bbcodes) throws Exception { bbCodeService.save(bbcodes); // for(BBCode bb : bbcodes) { clearBBCodeCached(bb.getId()); } clearBBCodeListCached(); } @Override public List<BBCode> getAll() throws Exception { return bbCodeService.getAll(); } @Override public List<String> getActive() throws Exception { SimpleCacheKey key = new SimpleCacheKey("bbcode", "forum.bbcode.list.key"); return buildBBCodeIdOutput(bbCodeListDataFuture.get( new ServiceContext<ListBBCodeData>() { public ListBBCodeData execute() { try { List<BBCode> got = getBBCodeActive(); return buildBBCodeInput(got); } catch (Exception e) { throw new RuntimeException(e); } } }, key )); } @Override public List<BBCode> getBBCodeActive() throws Exception { return this.bbCodeService.getBBCodeActive(); } @Override public BBCode findById(final String bbcodeId) throws Exception { return bbCodeDataFuture.get( new ServiceContext<BBCodeCacheData>() { public BBCodeCacheData execute() { try { BBCode got = bbCodeService.findById(bbcodeId); if (got != null) { return new BBCodeCacheData(got); } else { return BBCodeCacheData.NULL; } } catch (Exception e) { throw new RuntimeException(e); } } }, new BBCodeKey(bbcodeId)).build(); } @Override public void delete(String bbcodeId) throws Exception { bbCodeService.delete(bbcodeId); // clearBBCodeCached(bbcodeId); clearBBCodeListCached(); } private ListBBCodeData buildBBCodeInput(List<BBCode> bbCodes) { List<BBCodeKey> data = new ArrayList<BBCodeKey>(bbCodes.size()); for (BBCode p : bbCodes) { data.add(new BBCodeKey(p)); } return new ListBBCodeData(data); } private List<String> buildBBCodeIdOutput(ListBBCodeData data) { if (data == null) { return null; } List<String> out = new ArrayList<String>(data.getIds().size()); for (BBCodeKey k : data.getIds()) { try { out.add(findById(k.getBbCodeId()).getId()); } catch (Exception e) { LOG.error(e); } } return out; } @Override public void start() { this.bbCodeData = CacheType.BBCODE_DATA.getFromService(this.service); this.bbCodeListData = CacheType.LIST_BBCODE_DATA.getFromService(this.service); // this.bbCodeDataFuture = CacheType.BBCODE_DATA.createFutureCache(bbCodeData); this.bbCodeListDataFuture = CacheType.LIST_BBCODE_DATA.createFutureCache(bbCodeListData); } @Override public void stop() { } }