/*
* Computoser is a music-composition algorithm and a website to present the results
* Copyright (C) 2012-2014 Bozhidar Bozhanov
*
* Computoser 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.
*
* Computoser 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 Computoser. If not, see <http://www.gnu.org/licenses/>.
*/
package com.music.service.auth;
import java.util.List;
import org.springframework.social.connect.Connection;
import org.springframework.social.connect.ConnectionData;
import org.springframework.social.connect.ConnectionFactory;
import org.springframework.social.connect.ConnectionFactoryLocator;
import org.springframework.social.connect.ConnectionKey;
import org.springframework.social.connect.ConnectionRepository;
import org.springframework.social.connect.NoSuchConnectionException;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.MultiValueMap;
import com.music.dao.UserDao;
import com.music.model.persistent.SocialAuthentication;
import com.music.service.UserService;
public class JpaConnectionRepository implements ConnectionRepository {
private UserService userService;
private UserDao userDao;
private ConnectionFactoryLocator locator;
private Long userId;
public JpaConnectionRepository(Long userId, UserService userService, UserDao userDao, ConnectionFactoryLocator locator) {
this.userId = userId;
this.userService = userService;
this.userDao = userDao;
this.locator = locator;
}
@Override
public MultiValueMap<String, Connection<?>> findAllConnections() {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Connection<?>> findConnections(String providerId) {
// TODO Auto-generated method stub
return null;
}
@Override
public <A> List<Connection<A>> findConnections(Class<A> apiType) {
// TODO Auto-generated method stub
return null;
}
@Override
public MultiValueMap<String, Connection<?>> findConnectionsToUsers(
MultiValueMap<String, String> providerUserIds) {
// TODO Auto-generated method stub
return null;
}
@Override
public Connection<?> getConnection(ConnectionKey connectionKey) {
return getConnection(connectionKey.getProviderId(), connectionKey.getProviderUserId());
}
@SuppressWarnings("unchecked")
@Override
public <A> Connection<A> getConnection(Class<A> apiType, String providerUserId) {
String providerId = locator.getConnectionFactory(apiType).getProviderId();
return (Connection<A>) getConnection(providerId, providerUserId);
}
private Connection<?> getConnection(String providerId, String providerUserId) {
List<SocialAuthentication> socialAuthentications = userDao.getSocialAuthentications(providerId, providerUserId);
if (socialAuthentications.isEmpty()) {
throw new NoSuchConnectionException(new ConnectionKey(providerId, providerUserId));
}
return authToConnection(socialAuthentications.get(0));
}
@Override
public <A> Connection<A> getPrimaryConnection(Class<A> apiType) {
// TODO Auto-generated method stub
return null;
}
@Override
public <A> Connection<A> findPrimaryConnection(Class<A> apiType) {
// TODO Auto-generated method stub
return null;
}
@Override
@Transactional
public void addConnection(Connection<?> connection) {
SocialAuthentication auth = connectionToAuth(connection);
userService.connect(userId, auth);
}
@Override
public void updateConnection(Connection<?> connection) {
SocialAuthentication auth = connectionToAuth(connection);
userService.connect(userId, auth);
}
public static SocialAuthentication connectionToAuth(Connection<?> connection) {
SocialAuthentication auth = new SocialAuthentication();
ConnectionData data = connection.createData();
auth.setProviderId(data.getProviderId());
auth.setToken(data.getAccessToken());
auth.setRefreshToken(data.getRefreshToken());
auth.setSecret(data.getSecret());
auth.setProviderUserId(data.getProviderUserId());
return auth;
}
private Connection<?> authToConnection(SocialAuthentication auth) {
ConnectionFactory<?> connectionFactory = locator.getConnectionFactory(auth.getProviderId());
ConnectionData data = new ConnectionData(auth.getProviderId(), auth.getProviderUserId(), null, null,
auth.getImageUrl(), auth.getToken(), auth.getSecret(), auth.getRefreshToken(),
auth.getExpirationTime());
return connectionFactory.createConnection(data);
}
@Override
public void removeConnections(String providerId) {
userService.deleteSocialAuthentication(userId, providerId);
}
@Override
public void removeConnection(ConnectionKey connectionKey) {
userService.deleteSocialAuthentication(userId, connectionKey.getProviderId());
}
}