package com.devicehive.dao.riak; /* * #%L * DeviceHive Dao Riak Implementation * %% * Copyright (C) 2016 DataArt * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import com.basho.riak.client.api.commands.indexes.IntIndexQuery; import com.basho.riak.client.api.commands.kv.DeleteValue; import com.basho.riak.client.api.commands.kv.StoreValue; import com.basho.riak.client.core.query.Location; import com.basho.riak.client.core.query.Namespace; import com.devicehive.exceptions.HivePersistenceLayerException; import com.devicehive.dao.riak.model.UserNetwork; import org.springframework.stereotype.Repository; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.ExecutionException; @Repository public class UserNetworkDaoRiakImpl extends RiakGenericDao { private static final Namespace USER_NETWORK_NS = new Namespace("user_network"); public void persist(UserNetwork userNetwork) { try { String id = userNetwork.getUserId() + "n" + userNetwork.getNetworkId(); userNetwork.setId(id); Location location = new Location(USER_NETWORK_NS, id); StoreValue storeOp = new StoreValue.Builder(userNetwork) .withLocation(location) .withOption(quorum.getWriteQuorumOption(), quorum.getWriteQuorum()) .build(); client.execute(storeOp); } catch (ExecutionException | InterruptedException e) { throw new HivePersistenceLayerException("Cannot persist user network.", e); } } public UserNetwork merge(UserNetwork existing) { try { Location location = new Location(USER_NETWORK_NS, existing.getId()); StoreValue storeOp = new StoreValue.Builder(existing) .withLocation(location) .withOption(quorum.getWriteQuorumOption(), quorum.getWriteQuorum()) .build(); client.execute(storeOp); return existing; } catch (ExecutionException | InterruptedException e) { throw new HivePersistenceLayerException("Cannot merge user network.", e); } } public void delete(long userId, long networkId) { String id = userId + "n" + networkId; Location location = new Location(USER_NETWORK_NS, id); DeleteValue deleteOp = new DeleteValue.Builder(location).build(); try { client.execute(deleteOp); } catch (ExecutionException | InterruptedException e) { throw new HivePersistenceLayerException("Cannot delete network.", e); } } public Set<Long> findNetworksForUser(Long userId) { IntIndexQuery biq = new IntIndexQuery.Builder(USER_NETWORK_NS, "userId", userId).withKeyAndIndex(true).build(); try { IntIndexQuery.Response response = client.execute(biq); List<UserNetwork> networkList = fetchMultiple(response, UserNetwork.class); Set<Long> networks = new HashSet<>(); networkList.forEach(userNetwork -> networks.add(userNetwork.getNetworkId())); return networks; } catch (ExecutionException | InterruptedException e) { throw new HivePersistenceLayerException("Cannot find networks for user.", e); } } public Set<Long> findUsersInNetwork(Long networkId) { IntIndexQuery biq = new IntIndexQuery.Builder(USER_NETWORK_NS, "networkId", networkId).build(); try { IntIndexQuery.Response response = client.execute(biq); List<UserNetwork> userNetworks = fetchMultiple(response, UserNetwork.class); Set<Long> users = new HashSet<>(); userNetworks.forEach(userNetwork -> users.add(userNetwork.getUserId())); return users; } catch (ExecutionException | InterruptedException e) { throw new HivePersistenceLayerException("Cannot find users in network.", e); } } }