/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2013, MPL CodeInside http://codeinside.ru */ package ru.codeinside.gses.beans; import com.google.common.collect.Maps; import commons.Streams; import org.eclipse.persistence.queries.ScrollableCursor; import ru.codeinside.adm.database.Directory; import javax.ejb.Lock; import javax.ejb.LockType; import javax.ejb.Singleton; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionManagement; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.List; import java.util.Map; @TransactionManagement @Singleton @Lock(LockType.READ) @TransactionAttribute public class DirectoryBean { @PersistenceContext(unitName = "myPU") EntityManager em; public Directory create(String name) { Directory directory = em.find(Directory.class, name.trim()); if (directory == null) { directory = new Directory(name); em.merge(directory); } return directory; } public void add(String name, String key, String value) { em.createNativeQuery("insert into directory_values (directory_name,\"values\", values_key) values (?,?,?)") .setParameter(1, name) .setParameter(2, value) .setParameter(3, key) .executeUpdate(); } public void remove(String name, String key) { em.createNativeQuery("delete from directory_values d where directory_name = ? and values_key = ?") .setParameter(1, name) .setParameter(2, key) .executeUpdate(); } public void delete(String name) { Directory directory = em.find(Directory.class, name.trim()); if (directory != null) { em.remove(directory); } } public String value(String name, String key) { if (key == null) { return null; } return getValues(name).get(key); } public Map<String, String> getValues(String name) { Directory directory = em.find(Directory.class, name.trim()); if (directory == null) { return Maps.newHashMap(); } return directory.getValues(); } public List<Object[]> getValues(String name, int start, int count, String[] order, boolean[] asc) { StringBuilder q = new StringBuilder("select values_key, values from directory_values d where directory_name = ?"); if (order == null || order.length == 0) { q.append(" order by values_key").append(" asc"); } else { for (int i = 0; i < order.length; i++) { if (i == 0) { q.append(" order by "); } else { q.append(", "); } String orderItem = order[i]; // map property to columns: if ("key".equals(orderItem)) { orderItem = "values_key"; } else if ("value".equals(orderItem)) { orderItem = "values"; } q.append(orderItem).append(asc[i] ? " asc" : " desc"); } } return em.createNativeQuery(q.toString()) .setParameter(1, name) .setFirstResult(start) .setMaxResults(count) .getResultList(); } public int getCountValues(String name) { Object singleResult = em.createNativeQuery("select count (*) from directory_values d where directory_name = ?") .setParameter(1, name) .getSingleResult(); return ((Long) singleResult).intValue(); } public String getValue(String name, String key) { List<Object> resultList = em.createNativeQuery("select values from directory_values d where directory_name = ? and values_key = ?") .setParameter(1, name) .setParameter(2, key) .getResultList(); if (resultList == null || resultList.isEmpty()) { return null; } return (String) resultList.get(0); } public String getKey(String name, String value) { List<Object> resultList = em.createNativeQuery("select values_key from directory_values d where directory_name = ? and \"values\" = ?") .setParameter(1, name) .setParameter(2, value) .getResultList(); if (resultList == null || resultList.isEmpty()) { return null; } return (String) resultList.get(0); } public File createTmpFile(String name) { ScrollableCursor cursor = (ScrollableCursor) em.createNativeQuery( "select directory_name, values_key, \"values\" from directory_values where directory_name = ?") .setParameter(1, name) .setHint("eclipselink.cursor.scrollable", true) .getSingleResult(); File file = null; Writer writer = null; try { file = Streams.createTempFile("dictionary-" + name, ".csv"); writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"); while (cursor.hasNext()) { Object[] message = (Object[]) cursor.next(); writer.write("\"" + message[0] + "\",\"" + message[1] + "\",\"" + message[2] + "\"\n"); // НЕ копить кеш! em.clear(); } return file; } catch (IOException e) { if (file != null) { file.delete(); } throw new RuntimeException(e); } finally { Streams.close(writer); cursor.close(); } } }