package org.groom.shell; import com.vaadin.data.Container; import com.vaadin.data.util.filter.Compare; import org.groom.review.model.FileDiff; import org.groom.model.Repository; import org.groom.review.model.ReviewStatus; import org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery; import org.vaadin.addons.lazyquerycontainer.QueryDefinition; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Created with IntelliJ IDEA. * User: tlaukkan * Date: 23.9.2013 * Time: 18:51 * To change this template use File | Settings | File Templates. */ public class FileDiffBeanQuery extends AbstractBeanQuery<FileDiff> { private String range = null; private String[] lines; private final Repository repository; public FileDiffBeanQuery(QueryDefinition definition, Map<String, Object> queryConfiguration, Object[] sortPropertyIds, boolean[] sortStates) { super(definition, queryConfiguration, sortPropertyIds, sortStates); repository = (Repository) queryConfiguration.get("repository"); for (final Container.Filter filter : definition.getFilters()) { if (filter instanceof Compare.Equal) { final Compare.Equal equal = (Compare.Equal) filter; if (equal.getPropertyId().equals("range")) { range = (String) equal.getValue(); } } } } @Override protected FileDiff constructBean() { throw new UnsupportedOperationException(); } @Override public int size() { if (repository == null) { return 0; } if (lines == null) { if (range == null) { return 0; } final String result = Shell.execute("git diff --raw -l --ignore-all-space " + range + " -- | more", repository.getPath()); if (result.length() == 0) { return 0; } lines = result.split("\n"); } return lines.length; } @Override protected List<FileDiff> loadBeans(int startIndex, int count) { final ArrayList<FileDiff> fileDiffs = new ArrayList<FileDiff>(); for (int i = startIndex; i < startIndex + count; i++) { final String line = lines[i]; if (line.length() < 38) { continue; } final char status = line.charAt(37); if (line.length() < 40) { continue; } final String path = line.substring(39).trim(); final ReviewStatus reviewStatus; if (getQueryConfiguration() != null) { reviewStatus = (ReviewStatus) getQueryConfiguration().get("status"); } else { reviewStatus = null; } final FileDiff fileDiff = new FileDiff(status, path, i, reviewStatus); fileDiffs.add(fileDiff); } return fileDiffs; } @Override protected void saveBeans(List<FileDiff> commits, List<FileDiff> commits2, List<FileDiff> commits3) { throw new UnsupportedOperationException(); } }