/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.api.user.server.jpa;
import com.google.inject.persist.Transactional;
import org.eclipse.che.api.core.ServerException;
import org.eclipse.che.api.user.server.spi.PreferenceDao;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import javax.persistence.EntityManager;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static java.util.Objects.requireNonNull;
/**
* Implementation of {@link PreferenceDao}.
*
* @author Anton Korneta
*/
@Singleton
public class JpaPreferenceDao implements PreferenceDao {
@Inject
private Provider<EntityManager> managerProvider;
@Override
public void setPreferences(String userId, Map<String, String> preferences) throws ServerException {
requireNonNull(userId);
requireNonNull(preferences);
final PreferenceEntity prefs = new PreferenceEntity(userId, preferences);
if (preferences.isEmpty()) {
remove(userId);
} else {
try {
doSetPreference(prefs);
} catch (RuntimeException ex) {
throw new ServerException(ex.getLocalizedMessage(), ex);
}
}
}
@Override
@Transactional
public Map<String, String> getPreferences(String userId) throws ServerException {
requireNonNull(userId);
try {
final EntityManager manager = managerProvider.get();
final PreferenceEntity prefs = manager.find(PreferenceEntity.class, userId);
return prefs == null ? new HashMap<>()
: prefs.getPreferences();
} catch (RuntimeException ex) {
throw new ServerException(ex.getLocalizedMessage(), ex);
}
}
@Override
@Transactional
public Map<String, String> getPreferences(String userId, String filter) throws ServerException {
requireNonNull(userId);
requireNonNull(filter);
try {
final EntityManager manager = managerProvider.get();
final PreferenceEntity prefs = manager.find(PreferenceEntity.class, userId);
if (prefs == null) {
return new HashMap<>();
}
final Map<String, String> preferences = prefs.getPreferences();
if (!filter.isEmpty()) {
final Pattern pattern = Pattern.compile(filter);
return preferences.entrySet()
.stream()
.filter(preference -> pattern.matcher(preference.getKey()).matches())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
} else {
return preferences;
}
} catch (RuntimeException ex) {
throw new ServerException(ex.getLocalizedMessage(), ex);
}
}
@Override
public void remove(String userId) throws ServerException {
requireNonNull(userId);
try {
doRemove(userId);
} catch (RuntimeException ex) {
throw new ServerException(ex);
}
}
@Transactional
protected void doSetPreference(PreferenceEntity prefs) {
final EntityManager manager = managerProvider.get();
final PreferenceEntity existing = manager.find(PreferenceEntity.class, prefs.getUserId());
if (existing != null) {
manager.merge(prefs);
} else {
manager.persist(prefs);
}
manager.flush();
}
@Transactional
protected void doRemove(String userId) {
final EntityManager manager = managerProvider.get();
final PreferenceEntity prefs = manager.find(PreferenceEntity.class, userId);
if (prefs != null) {
manager.remove(prefs);
manager.flush();
}
}
}