/******************************************************************************* * 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.ConflictException; import org.eclipse.che.api.core.NotFoundException; import org.eclipse.che.api.core.ServerException; import org.eclipse.che.api.user.server.model.impl.ProfileImpl; import org.eclipse.che.api.user.server.spi.ProfileDao; import org.eclipse.che.core.db.jpa.DuplicateKeyException; import org.eclipse.che.core.db.jpa.IntegrityConstraintViolationException; import javax.inject.Inject; import javax.inject.Provider; import javax.inject.Singleton; import javax.persistence.EntityManager; import static java.lang.String.format; import static java.util.Objects.requireNonNull; @Singleton public class JpaProfileDao implements ProfileDao { @Inject private Provider<EntityManager> managerProvider; @Override public void create(ProfileImpl profile) throws ServerException, ConflictException { requireNonNull(profile, "Required non-null profile"); try { doCreate(profile); } catch (DuplicateKeyException x) { throw new ConflictException(format("Profile for user with id '%s' already exists", profile.getUserId())); } catch (IntegrityConstraintViolationException x) { throw new ConflictException(format("User with id '%s' referenced by profile doesn't exist", profile.getUserId())); } catch (RuntimeException x) { throw new ServerException(x.getLocalizedMessage(), x); } } @Override public void update(ProfileImpl profile) throws NotFoundException, ServerException { requireNonNull(profile, "Required non-null profile"); try { doUpdate(profile); } catch (RuntimeException x) { throw new ServerException(x.getLocalizedMessage(), x); } } @Override public void remove(String id) throws ServerException { requireNonNull(id, "Required non-null id"); try { doRemove(id); } catch (RuntimeException x) { throw new ServerException(x.getLocalizedMessage(), x); } } @Override @Transactional public ProfileImpl getById(String userId) throws NotFoundException, ServerException { requireNonNull(userId, "Required non-null id"); try { final EntityManager manager = managerProvider.get(); final ProfileImpl profile = manager.find(ProfileImpl.class, userId); if (profile == null) { throw new NotFoundException(format("Couldn't find profile for user with id '%s'", userId)); } manager.refresh(profile); return profile; } catch (RuntimeException x) { throw new ServerException(x.getLocalizedMessage(), x); } } @Transactional protected void doCreate(ProfileImpl profile) { EntityManager manager = managerProvider.get(); manager.persist(profile); manager.flush(); } @Transactional protected void doUpdate(ProfileImpl profile) throws NotFoundException { final EntityManager manager = managerProvider.get(); if (manager.find(ProfileImpl.class, profile.getUserId()) == null) { throw new NotFoundException(format("Couldn't update profile, because profile for user with id '%s' doesn't exist", profile.getUserId())); } manager.merge(profile); manager.flush(); } @Transactional protected void doRemove(String userId) { final EntityManager manager = managerProvider.get(); final ProfileImpl profile = manager.find(ProfileImpl.class, userId); if (profile != null) { manager.remove(profile); manager.flush(); } } }