Java tutorial
/** * This file is part of Javit. * * Javit is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Javit is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Javit. If not, see <http://www.gnu.org/licenses/>. * * Copyright 2005-2016 Richard Stride <fury@nexxus.net> */ package net.nexxus.db; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import net.nexxus.event.EventListenerImpl; import net.nexxus.nntp.NntpArticleHeader; import net.nexxus.nntp.NntpGroup; import net.nexxus.nntp.NntpServer; public class DBManagerImpl extends EventListenerImpl implements DBManager { private static Logger log = LogManager.getLogger(DBManagerImpl.class); private String ormConfig = "mybatis-config.xml"; private SqlSessionFactory sqlFactory; private String groupsTable = "groups_subscribed"; private String serverTable = "servers"; private String groupsListTable = "groups"; public DBManagerImpl(Properties p) { // get setup here try { InputStream is = Resources.getResourceAsStream(ormConfig); sqlFactory = new SqlSessionFactoryBuilder().build(is, p); } catch (Exception e) { log.error("could not load myBatis config: " + e.getMessage()); } } // ArticleHeader methods //// /** * return a List of headers using an optional cutoff which * can be null */ public List<NntpArticleHeader> getHeaders(NntpGroup group, Integer cutoff) { List resultSet = null; try { String cutoffPoint; HashMap map = new HashMap(); String table = DBUtils.convertGroup(group.getName()); map.put("table", table); SqlSession session = sqlFactory.openSession(); if (cutoff == null || cutoff.equals(Integer.valueOf(0))) { log.debug("not using cutoff selecting headers"); resultSet = session.selectList("getHeadersLite", map); } else { cutoffPoint = this.calculateCutoff(cutoff); log.debug("using " + cutoffPoint + " as cutoff for selecting headers"); map.put("cutoff", cutoffPoint); resultSet = session.selectList("getHeadersRangeLite", map); } session.close(); } catch (Exception e) { log.error("failed loading headers from DB: " + e.getMessage()); e.printStackTrace(); } return resultSet; } /** * retrieve a header from the DB */ public NntpArticleHeader getHeader(NntpGroup group, NntpArticleHeader header) throws Exception { try { String table = DBUtils.convertGroup(group.getName()); HashMap map = new HashMap(); map.put("table", table); map.put("id", header.getID()); SqlSession session = sqlFactory.openSession(); header = session.selectOne("getHeader", map); session.close(); } catch (Exception e) { log.error("failed retrieving header from DB: " + e.getMessage()); e.printStackTrace(); throw e; } return header; } public void addHeader(NntpArticleHeader header) throws Exception { try { SqlSession session = sqlFactory.openSession(true); HashMap map = DBUtils.mapHeader(header); session.insert("insertHeader", map); session.close(); } catch (Exception e) { log.error("could not add header to database: " + e.getMessage()); //e.printStackTrace(); throw e; } } public void updateHeader(NntpArticleHeader header) { try { SqlSession session = sqlFactory.openSession(); HashMap map = DBUtils.mapHeaderForUpdate(header); session.update("updateStatus", map); session.commit(); session.close(); } catch (Exception e) { log.error("could not update header in database: " + e.getMessage()); } } public void removeHeader(NntpArticleHeader header) { } // NntpGroup methods //// /** * Methods that handle the internal Groups table * of subscribed groups */ /** * create the NntpGroup List table to keep track of groups * that are being used */ public void createServerGroups() throws Exception { SqlSession session = sqlFactory.openSession(); session.insert("createGroupsTable", groupsTable); session.commit(); session.close(); } /** * update the given NntpGroup to have its min and max article id's * set */ public NntpGroup getGroupMinMax(NntpGroup group) throws Exception { SqlSession session = sqlFactory.openSession(); HashMap<Long, Long> map = session.selectOne("getMinMax", DBUtils.convertGroup(group.getName())); if (map == null || map.isEmpty()) { group.setLowID(0L); group.setHighID(0L); } else { Long min = map.get("min"); Long max = map.get("max"); group.setLowID(min.longValue()); group.setHighID(max.longValue()); } return group; } /** * add an NntpGroup to our groups list */ public void addGroup(NntpGroup group) throws Exception { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("table", groupsTable); map.put("server", group.getServer()); map.put("name", group.getName()); map.put("hi", group.getHighID()); map.put("low", group.getLowID()); SqlSession session = sqlFactory.openSession(); session.insert("addGroup", map); // now ensure there is an ArticleHeader table for it session.insert("createHeaderTable", DBUtils.convertGroup(group.getName())); session.commit(); session.close(); } /** * update an NntpGroup in our groups list */ public void updateGroup(NntpGroup group) throws Exception { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("table", groupsTable); map.put("name", group.getName()); map.put("auto_update", group.isAutoUpdate()); map.put("hi", group.getHighID()); map.put("low", group.getLowID()); SqlSession session = sqlFactory.openSession(); session.update("updateGroup", map); session.commit(); session.close(); } /** * remove an NntpGroup from our groups list */ public void removeGroup(NntpGroup group) throws Exception { HashMap<String, String> map = new HashMap<String, String>(); map.put("table", groupsTable); map.put("name", group.getName()); SqlSession session = sqlFactory.openSession(); session.insert("removeGroup", map); session.commit(); session.close(); } /** * return a List of NntpGroups we are subscribed to */ public List<NntpGroup> getGroups() throws Exception { SqlSession session = sqlFactory.openSession(); List resultSet = session.selectList("getGroups", this.groupsTable); session.close(); return resultSet; } // Methods that handle NntpServer group lists /** * create Server group list table * @throws Exception */ public void createServerGroupList() throws Exception { SqlSession session = sqlFactory.openSession(); session.insert("createGroupListTable"); session.commit(); session.close(); } /** * add an NntpGroup to an NntpServers group listing * @param group * @throws Exception */ public void addServerGroup(NntpGroup group) throws Exception { HashMap map = new HashMap(); map.put("name", group.getName()); map.put("hi", group.getHighID()); map.put("low", group.getLowID()); SqlSession session = sqlFactory.openSession(); session.insert("addGroupToGroupList", map); session.commit(); session.close(); } public void addServerGroups(List<NntpGroup> groups) throws Exception { HashMap map = new HashMap(); SqlSession session = sqlFactory.openSession(); Iterator<NntpGroup> iter = groups.iterator(); while (iter.hasNext()) { NntpGroup group = iter.next(); map.put("name", group.getName()); map.put("hi", group.getHighID()); map.put("low", group.getLowID()); session.insert("addGroupToGroupList", map); } session.commit(); session.close(); } /** * return a List of NntpGroups belonging to an NntpServer * @return * @throws Exception */ public List<NntpGroup> getServerGroups() throws Exception { SqlSession session = sqlFactory.openSession(); List resultSet = session.selectList("getGroupList"); session.close(); return resultSet; } // NntpServer methods //// /** * create the needed DB table to hold our * NntpServer entities */ public void createServerTable() throws Exception { SqlSession session = sqlFactory.openSession(); session.insert("createServerTable", serverTable); session.commit(); session.close(); } /** * add an NntpGroup to our groups list */ public void addServer(NntpServer server) throws Exception { HashMap map = new HashMap(); map.put("table", serverTable); map.put("server", server.getServer()); map.put("port", server.getPort()); map.put("username", server.getUsername()); map.put("password", server.getPassword()); SqlSession session = sqlFactory.openSession(); session.insert("addServer", map); session.commit(); session.close(); } public NntpServer getServer() throws Exception { SqlSession session = sqlFactory.openSession(); NntpServer server = (NntpServer) session.selectOne("getServer", this.serverTable); session.close(); return server; } /** * remove an NntpServer from our groups list */ public void removeServer(NntpServer server) throws Exception { HashMap<String, String> map = new HashMap<String, String>(); map.put("table", serverTable); map.put("server", server.getServer()); SqlSession session = sqlFactory.openSession(); session.insert("removeServer", map); session.commit(); session.close(); } /** * perform a sanity check to ensure needed tables exist in the * DB * @throws Exception */ public void sanityCheck() throws Exception { createServerTable(); createServerGroups(); createServerGroupList(); } // Utility methods follow //// private String calculateCutoff(Integer cutoff) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, -(cutoff.intValue() * 24)); Date cutoffPoint = cal.getTime(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); String formatted = dateFormat.format(cutoffPoint); return formatted; } private ArrayList<NntpArticleHeader> parseResultSet(List resultSet) { ArrayList<NntpArticleHeader> headers = new ArrayList<NntpArticleHeader>(); try { Iterator iter = resultSet.iterator(); while (iter.hasNext()) { Map entry = (Map) iter.next(); NntpArticleHeader header = new NntpArticleHeader(); header.setID((long) entry.get("id")); } } catch (Exception e) { log.error("failed parsing resultSet from DB: " + e.getMessage()); } return headers; } }