/* * 2012-3 Red Hat Inc. and/or its affiliates and other contributors. * * 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. */ package org.overlord.gadgets.server.service; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Query; import org.overlord.gadgets.server.model.Page; import org.overlord.gadgets.server.model.User; import org.overlord.gadgets.server.model.Widget; import org.overlord.gadgets.server.model.WidgetPreference; import com.google.inject.Inject; /** * @author: Jeff Yu * @date: 16/03/12 */ public class UserManagerImpl implements UserManager { private EntityManagerFactory entityManagerFactory; @Inject public UserManagerImpl(EntityManagerFactory manager) { this.entityManagerFactory = manager; } protected boolean startTxn(EntityManager entityManager) { boolean started=false; if (!entityManager.getTransaction().isActive()) { try { entityManager.getTransaction().begin(); started = true; } catch (Throwable t) { // Ignore for now } } return (started); } protected void endTxn(boolean started, EntityManager entityManager) { if (started) { entityManager.getTransaction().commit(); } } @Override public User createUser(User user) { EntityManager entityManager=entityManagerFactory.createEntityManager(); try { boolean startedTxn=startTxn(entityManager); entityManager.persist(user); Page page = new Page(); page.setName("Home"); page.setColumns(2); page.setUser(user); entityManager.persist(page); user.setCurrentPageId(page.getId()); endTxn(startedTxn, entityManager); } finally { entityManager.close(); } return user; } @Override public User getUserById(long userId) { EntityManager entityManager=entityManagerFactory.createEntityManager(); User user=null; try { boolean startedTxn=startTxn(entityManager); user = entityManager.find(User.class, userId); endTxn(startedTxn, entityManager); } finally { entityManager.close(); } return user; } @Override public void updateUser(User user) { EntityManager entityManager=entityManagerFactory.createEntityManager(); try { boolean startedTxn=startTxn(entityManager); entityManager.merge(user); endTxn(startedTxn, entityManager); } finally { entityManager.close(); } } @Override public void removeUser(User user) { EntityManager entityManager=entityManagerFactory.createEntityManager(); try { boolean startedTxn=startTxn(entityManager); entityManager.remove(user); endTxn(startedTxn, entityManager); } finally { entityManager.close(); } } @SuppressWarnings("unchecked") @Override public List<User> getAllUser() { EntityManager entityManager=entityManagerFactory.createEntityManager(); List<User> users=null; try { boolean startedTxn=startTxn(entityManager); Query query = entityManager.createQuery("select user from User user"); users = query.getResultList(); endTxn(startedTxn, entityManager); } finally { entityManager.close(); } return users; } @Override public User getUser(String username) { EntityManager entityManager=entityManagerFactory.createEntityManager(); User user = null; try { boolean startedTxn=startTxn(entityManager); Query query = entityManager.createQuery("select user from User user where user.name = :username"); query.setParameter("username", username); @SuppressWarnings("unchecked") List<User> users = query.getResultList(); if (users.size() > 0) { user = users.get(0); // Eagarly fetch contains objects for (Page page : user.getPages()) { fetch(page); } } endTxn(startedTxn, entityManager); } finally { entityManager.close(); } return user; } protected void fetch(Page page) { if (page.getWidgets().size() > 0) { for (Widget w : page.getWidgets()) { fetch(w); } } } protected void fetch(Widget widget) { widget.getPrefs().size(); } @SuppressWarnings("unchecked") @Override public List<Page> getPages(long userId) { EntityManager entityManager=entityManagerFactory.createEntityManager(); List<Page> pages=null; try { Query query = entityManager.createQuery("select page from Page page where page.user.id = :userId order by page.pageOrder asc"); query.setParameter("userId", userId); boolean startedTxn=startTxn(entityManager); pages = query.getResultList(); // Force eager fetch of pages, widgets and prefs if (pages != null) { for (Page page : pages) { fetch(page); } } endTxn(startedTxn, entityManager); } finally { entityManager.close(); } return pages; } @Override public Page addPage(Page page, User user) { EntityManager entityManager=entityManagerFactory.createEntityManager(); try { boolean startedTxn=startTxn(entityManager); page.setUser(user); entityManager.persist(page); endTxn(startedTxn, entityManager); } finally { entityManager.close(); } return page; } @Override public Page getPage(long pageId) { EntityManager entityManager=entityManagerFactory.createEntityManager(); Page page = null; try { boolean startedTxn=startTxn(entityManager); page = entityManager.find(Page.class, pageId); // Force eager fetch of widgets and prefs if (page != null) { fetch(page); } endTxn(startedTxn, entityManager); } finally { entityManager.close(); } return page; } @Override public void removePage(long pageId) { EntityManager entityManager=entityManagerFactory.createEntityManager(); try { boolean startedTxn=startTxn(entityManager); Page page = entityManager.find(Page.class, pageId); entityManager.remove(page); endTxn(startedTxn, entityManager); } finally { entityManager.close(); } } @Override public void removeWidget(long widgetId) { EntityManager entityManager=entityManagerFactory.createEntityManager(); try { boolean startedTxn=startTxn(entityManager); Widget widget = entityManager.find(Widget.class, widgetId); widget.getPage().getWidgets().remove(widget); entityManager.remove(widget); endTxn(startedTxn, entityManager); } finally { entityManager.close(); } } @Override public Widget getWidgetById(long widgetId) { EntityManager entityManager=entityManagerFactory.createEntityManager(); Widget widget = null; try { boolean startedTxn=startTxn(entityManager); widget = entityManager.find(Widget.class, widgetId); // Access the preferences to eagarly load if (widget != null) { fetch(widget); } endTxn(startedTxn, entityManager); } finally { entityManager.close(); } return widget; } @Override public void updateWidgetPreference(long widgetId, List<WidgetPreference> prefs) { EntityManager entityManager=entityManagerFactory.createEntityManager(); try { boolean startedTxn=startTxn(entityManager); Query query = entityManager.createQuery("delete from WidgetPreference pref where pref.widget.id = :id"); query.setParameter("id", widgetId); query.executeUpdate(); Widget widget = entityManager.find(Widget.class, widgetId); for (WidgetPreference pref : prefs) { pref.setWidget(widget); } widget.setPrefs(prefs); endTxn(startedTxn, entityManager); } finally { entityManager.close(); } } @Override public Map<String, String> getWidgetPreference(long widgetId) { EntityManager entityManager=entityManagerFactory.createEntityManager(); Map<String, String> result = new HashMap<String, String>(); try { boolean startedTxn=startTxn(entityManager); Widget widget = entityManager.find(Widget.class, widgetId); if (widget.getPrefs() != null) { for (WidgetPreference pref : widget.getPrefs()) { result.put(pref.getName(), pref.getValue()); } } endTxn(startedTxn, entityManager); } finally { entityManager.close(); } return result; } }