001/*
002 * Syncany, www.syncany.org
003 * Copyright (C) 2011-2016 Philipp C. Heckel <philipp.heckel@gmail.com>
004 *
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU General Public License as published by
007 * the Free Software Foundation, either version 3 of the License, or
008 * (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
013 * GNU General Public License for more details.
014 *
015 * You should have received a copy of the GNU General Public License
016 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
017 */
018package org.syncany.operations.log;
019
020import java.util.ArrayList;
021import java.util.Iterator;
022import java.util.logging.Level;
023import java.util.logging.Logger;
024
025import org.syncany.config.Config;
026import org.syncany.database.DatabaseVersion;
027import org.syncany.database.FileVersion;
028import org.syncany.database.PartialFileHistory;
029import org.syncany.database.SqlDatabase;
030import org.syncany.operations.ChangeSet;
031import org.syncany.operations.Operation;
032
033public class LogOperation extends Operation {
034        private static final Logger logger = Logger.getLogger(LogOperation.class.getSimpleName());
035        
036        private LogOperationOptions options;
037        private SqlDatabase localDatabase;
038
039        public LogOperation(Config config, LogOperationOptions options) {
040                super(config);
041
042                this.options = options;
043                this.localDatabase = new SqlDatabase(config);
044        }
045
046        @Override
047        public LogOperationResult execute() throws Exception {
048                logger.log(Level.INFO, "");
049                logger.log(Level.INFO, "Running 'Log' at client " + config.getMachineName() + " ...");
050                logger.log(Level.INFO, "--------------------------------------------");
051
052                ArrayList<LightweightDatabaseVersion> databaseVersions = new ArrayList<>();
053                Iterator<DatabaseVersion> databaseVersionsIterator = localDatabase.getLastDatabaseVersions(options.getMaxDatabaseVersionCount(),
054                                options.getStartDatabaseVersionIndex(), options.getMaxFileHistoryCount());
055                                
056                while (databaseVersionsIterator.hasNext()) {
057                        DatabaseVersion databaseVersion = databaseVersionsIterator.next();
058                        LightweightDatabaseVersion lightweightDatabaseVersion = createLightweightDatabaseVersion(databaseVersion);                      
059                        
060                        databaseVersions.add(lightweightDatabaseVersion);
061                }
062                
063                return new LogOperationResult(databaseVersions);
064        }
065
066        private LightweightDatabaseVersion createLightweightDatabaseVersion(DatabaseVersion databaseVersion) {
067                // Create changeset
068                ChangeSet changedFiles = new ChangeSet();
069
070                for (PartialFileHistory fileHistory : databaseVersion.getFileHistories()) {
071                        FileVersion fileVersion = fileHistory.getLastVersion();
072                        
073                        switch (fileVersion.getStatus()) {
074                        case NEW:
075                                changedFiles.getNewFiles().add(fileVersion.getPath());
076                                break;
077                                
078                        case CHANGED:
079                        case RENAMED:
080                                changedFiles.getChangedFiles().add(fileVersion.getPath());
081                                break;
082
083                        case DELETED:
084                                changedFiles.getDeletedFiles().add(fileVersion.getPath());
085                                break;
086                        }
087                }
088                
089                // Create lightweight database version
090                LightweightDatabaseVersion lightweightDatabaseVersion = new LightweightDatabaseVersion();
091
092                lightweightDatabaseVersion.setClient(databaseVersion.getHeader().getClient());
093                lightweightDatabaseVersion.setDate(databaseVersion.getHeader().getDate());
094                lightweightDatabaseVersion.setChangeSet(changedFiles);
095                
096                return lightweightDatabaseVersion;
097        }
098}