/** * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.portal.gadget.core; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apache.shindig.gadgets.oauth.BasicOAuthStoreTokenIndex; import org.apache.shindig.gadgets.oauth.OAuthStore.TokenInfo; import org.chromattic.api.ChromatticSession; import org.exoplatform.commons.chromattic.ChromatticLifeCycle; import org.exoplatform.commons.chromattic.ChromatticManager; import org.exoplatform.commons.chromattic.ContextualTask; import org.exoplatform.commons.chromattic.SessionContext; import org.exoplatform.container.xml.InitParams; import org.exoplatform.web.security.security.PlainTokenService; import org.exoplatform.web.security.security.TokenServiceInitializationException; import org.gatein.wci.security.Credentials; public class GadgetTokenInfoService extends PlainTokenService<GadgetToken, BasicOAuthStoreTokenIndex> { private ChromatticLifeCycle chromatticLifeCycle; public GadgetTokenInfoService(InitParams initParams, ChromatticManager chromatticManager) throws TokenServiceInitializationException { super(initParams); chromatticLifeCycle = chromatticManager.getLifeCycle("gadgettokens"); } @Override public void start() { try { chromatticLifeCycle.getManager().beginRequest(); ChromatticSession session = chromatticLifeCycle.openContext().getSession(); GadgetTokenContainer tkContainer = session.findByPath(GadgetTokenContainer.class, "gadgettokens"); if (tkContainer == null) { session.insert(GadgetTokenContainer.class, "gadgettokens"); } } finally { chromatticLifeCycle.getManager().endRequest(true); } super.start(); } public GadgetToken createToken(final BasicOAuthStoreTokenIndex key, final TokenInfo tokenInfo) { return new TokenTask<GadgetToken>() { @Override protected GadgetToken execute() { GadgetTokenContainer container = getGadgetTokenContainer(); long expirationTimeMillis = System.currentTimeMillis() + validityMillis; return container.saveToken(key, tokenInfo, expirationTimeMillis); } }.executeWith(chromatticLifeCycle); } @Override public GadgetToken getToken(final BasicOAuthStoreTokenIndex key) { return new TokenTask<GadgetToken>() { @Override protected GadgetToken execute() { return getGadgetTokenContainer().getToken(key); } }.executeWith(chromatticLifeCycle); } @Override public GadgetToken deleteToken(final BasicOAuthStoreTokenIndex key) { return new TokenTask<GadgetToken>() { @Override protected GadgetToken execute() { return getGadgetTokenContainer().removeToken(key); } }.executeWith(chromatticLifeCycle); } @Override public BasicOAuthStoreTokenIndex[] getAllTokens() { return new TokenTask<BasicOAuthStoreTokenIndex[]>() { @Override protected BasicOAuthStoreTokenIndex[] execute() { GadgetTokenContainer container = getGadgetTokenContainer(); Collection<GadgetTokenEntry> tokenEntries = container.getGadgetTokens().values(); List<BasicOAuthStoreTokenIndex> tokenHolder = new ArrayList<BasicOAuthStoreTokenIndex>(); for (GadgetTokenEntry tokenEntry : tokenEntries) { tokenHolder.add(tokenEntry.getKey()); } return tokenHolder.toArray(new BasicOAuthStoreTokenIndex[tokenHolder.size()]); } }.executeWith(chromatticLifeCycle); } @Override public long size() { return new TokenTask<Long>() { @Override protected Long execute() { GadgetTokenContainer container = getGadgetTokenContainer(); Collection<GadgetTokenEntry> tokens = container.getGadgetTokens().values(); return (long) tokens.size(); } }.executeWith(chromatticLifeCycle); } public String createToken(Credentials credentials) throws IllegalArgumentException, NullPointerException { return null; } @Override protected BasicOAuthStoreTokenIndex decodeKey(String stringKey) { throw new UnsupportedOperationException(); } /** * Wraps token store logic conveniently. * * @param <V> the return type */ private abstract class TokenTask<V> extends ContextualTask<V> { /** . */ private SessionContext context; protected final GadgetTokenContainer getGadgetTokenContainer() { ChromatticSession session = context.getSession(); return session.findByPath(GadgetTokenContainer.class, "gadgettokens"); } @Override protected V execute(SessionContext context) { this.context = context; // try { return execute(); } finally { this.context = null; } } protected abstract V execute(); } }