/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2013, Geomatys
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library 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
* Lesser General Public License for more details.
*/
package org.geotoolkit.coverage.postgresql;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import org.apache.sis.storage.DataStoreException;
import org.geotoolkit.storage.coverage.Pyramid;
import org.geotoolkit.storage.coverage.PyramidalCoverageReference;
import org.geotoolkit.temporal.object.ISODateParser;
import org.geotoolkit.version.AbstractVersionControl;
import org.geotoolkit.version.Version;
import org.geotoolkit.version.VersioningException;
import org.opengis.util.GenericName;
/**
* Postgresql version control.
*
* @author Johann Sorel (Geomatys)
*/
public class PGVersionControl extends AbstractVersionControl{
public static TimeZone GMT0 = TimeZone.getTimeZone("GMT+0");
/**
* Version label for pyramid without version informations.
*/
public static final String UNSET = "unset";
private final PGCoverageStore store;
private final GenericName name;
public PGVersionControl(PGCoverageStore store, GenericName name) {
this.store = store;
this.name = name;
}
@Override
public boolean isEditable() {
return true;
}
@Override
public boolean isAutomatic() {
return false;
}
@Override
public boolean isVersioned() throws VersioningException {
return true;
}
@Override
public Version createVersion(Date date) throws VersioningException {
final Timestamp ts = new Timestamp(date.getTime());
return new Version(this, ts.toString(), ts);
}
@Override
public void dropVersion(Version version) throws VersioningException {
try {
final PyramidalCoverageReference ref = (PyramidalCoverageReference) store.getCoverageReference(name, version);
final Collection<Pyramid> pyramids = ref.getPyramidSet().getPyramids();
for(Pyramid p : pyramids){
ref.deletePyramid(p.getId());
}
} catch (DataStoreException ex) {
throw new VersioningException(ex.getMessage(), ex);
}
}
@Override
public List<Version> list() throws VersioningException {
final StringBuilder sql = new StringBuilder();
sql.append("SELECT distinct(pp.value) FROM ");
sql.append(store.encodeTableName("Layer"));
sql.append(" AS l ");
sql.append("INNER JOIN ");
sql.append(store.encodeTableName("Pyramid"));
sql.append(" AS p ON p.\"layerId\" = l.id ");
sql.append("LEFT OUTER JOIN ");
sql.append(store.encodeTableName("PyramidProperty"));
sql.append(" AS pp ON pp.\"pyramidId\" = p.id AND pp.key = 'version' ");
sql.append("WHERE l.name = '");
sql.append(name.tip().toString()).append('\'');
final ISODateParser dateparser = new ISODateParser();
final List<Date> dates = new ArrayList<Date>();
Connection cnx = null;
Statement stmt = null;
ResultSet rs = null;
final Date unset = new Date();
try{
cnx = store.getDataSource().getConnection();
stmt = cnx.createStatement();
rs = stmt.executeQuery(sql.toString());
while(rs.next()){
final String dateiso = rs.getString(1);
if(dateiso == null || dateiso.isEmpty()){
dates.add(unset);
}else{
dates.add(dateparser.parseToDate(dateiso));
}
}
}catch(SQLException ex){
throw new VersioningException(ex.getMessage(), ex);
}finally{
store.closeSafe(cnx, stmt, rs);
}
Collections.sort(dates);
final List<Version> versions = new ArrayList<Version>(dates.size());
for(Date d : dates){
if(d == unset){
versions.add(new Version(this, UNSET, d));
}else{
versions.add(new Version(this, d.toString(), d));
}
}
return versions;
}
@Override
public void trim(Version version) throws VersioningException {
super.trim(version); //TODO
}
@Override
public void revert(Version version) throws VersioningException {
super.revert(version); //TODO
}
}