/** * Copyright 1999-2009 The Pegadi Team * * 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. */ /** * A server for publications. * * @author Jørgen Binningsbø <jb@underdusken.no> * @author Håvard Wigtil <havardw at pvv.org> */ package org.pegadi.server.publication; import org.pegadi.model.Publication; import org.pegadi.server.PublicationServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cache.annotation.Cacheable; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.core.simple.ParameterizedRowMapper; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.List; public class PublicationServerImpl implements PublicationServer { private JdbcTemplate template; private PublicationRowMapper mapper; private final Logger log = LoggerFactory.getLogger(getClass()); public PublicationServerImpl() { mapper = new PublicationRowMapper(); } public void setDataSource(DataSource dataSource) { template = new JdbcTemplate(dataSource); } /** * returns one publication */ @Cacheable("Publication") public Publication getPublicationByID(int ID) { return template.query("SELECT * FROM Publication WHERE ID=?", mapper, ID).get(0); } /** * Returns all years which have publications. * * @return an array of <code>int</code>'s */ public List<Integer> getYearsWithPublications() { // never used? List<Publication> pubs = template.query("SELECT DISTINCT year(releasedate) FROM Publication", mapper); List<Integer> res = new ArrayList<Integer>(); Calendar cal = new GregorianCalendar(); for(Publication pub : pubs) { cal.setTime(pub.getReleaseDate()); res.add(cal.get(Calendar.YEAR)); } return res; } /** * returns all the publications scheduled for releasing a given year */ public List<Publication> getPublicationsByYear(int year) { return template.query("SELECT * FROM Publication WHERE year(releasedate)=? ORDER BY releasedate DESC", mapper, year); } /** * this method returns an array of Publications. * Active publications are defined as having a release-date higher * than the current date. */ public List<Publication> getActivePublications() { return template.query("SELECT * FROM Publication WHERE releasedate > CURRENT_DATE ORDER BY releasedate ASC", mapper); } /** * Saves or updates a publication in persistent storage. If the ID is less than or equals to zero, * it is created, else it is updated. * * @return ID of created publication */ public int saveOrUpdatePublication(final Publication pub) { if(pub.getId() > 0) { template.update("UPDATE Publication SET name=?, releasedate=?, printdate=?, deadlineText=?, description=?, number=? WHERE ID=?", pub.getName(), new java.sql.Date(pub.getReleaseDate() != null ? pub.getReleaseDate().getTime() : new java.util.Date().getTime()), new java.sql.Date(pub.getPrintDate() != null ? pub.getPrintDate().getTime() : new java.util.Date().getTime()), new java.sql.Date(pub.getDeadlineText() != null ? pub.getDeadlineText().getTime() : new java.util.Date().getTime()), pub.getDescription(), pub.getNumber(), pub.getId()); } else { final String insertSql = "INSERT INTO Publication (name, releasedate, printdate, deadlineText, description, number) VALUES (?, ?, ?, ?, ?, ?)"; KeyHolder keyHolder = new GeneratedKeyHolder(); template.update( new PreparedStatementCreator() { public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { PreparedStatement stmt = connection.prepareStatement(insertSql, new String[] {"ID"}); stmt.setString(1, pub.getName()); stmt.setDate(2, new java.sql.Date(pub.getReleaseDate() != null ? pub.getReleaseDate().getTime() : new java.util.Date().getTime())); stmt.setDate(3, new java.sql.Date(pub.getPrintDate() != null ? pub.getPrintDate().getTime() : new java.util.Date().getTime())); stmt.setDate(4, new java.sql.Date(pub.getDeadlineText() != null ? pub.getDeadlineText().getTime() : new java.util.Date().getTime())); stmt.setString(5, pub.getDescription() != null ? pub.getDescription() : ""); Calendar cal = Calendar.getInstance(); cal.setTime(pub.getReleaseDate() != null ? pub.getReleaseDate() : new java.util.Date()); stmt.setInt(6, getPublicationsByYear(cal.get(Calendar.YEAR)).size()+1); return stmt; } }, keyHolder ); pub.setId(keyHolder.getKey().intValue()); } return pub.getId(); } private class PublicationRowMapper implements ParameterizedRowMapper<Publication> { public Publication mapRow(ResultSet rs, int i) throws SQLException { Publication pub = new Publication(rs.getInt("ID")); pub.setName(rs.getString("name")); pub.setDescription(rs.getString("description")); pub.setReleaseDate(rs.getDate("releasedate")); pub.setPrintDate(rs.getDate("printdate")); pub.setDeadlineText(rs.getDate("deadlineText")); pub.setNumber(rs.getInt("number")); return pub; } } }