/* * Copyright 2015 JBoss, by Red Hat, Inc * * 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. */ package org.uberfire.ext.editor.commons.backend.version; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import javax.inject.Inject; import javax.inject.Named; import org.uberfire.ext.editor.commons.version.impl.PortableVersionRecord; import org.uberfire.io.IOService; import org.uberfire.java.nio.base.version.VersionAttributeView; import org.uberfire.java.nio.base.version.VersionRecord; import org.uberfire.java.nio.file.Path; public class VersionRecordServiceImpl implements VersionRecordService { private IOService ioService; private VersionUtil util; public VersionRecordServiceImpl() { } @Inject public VersionRecordServiceImpl(@Named("ioStrategy") IOService ioService, VersionUtil util) { this.ioService = ioService; this.util = util; } @Override public List<VersionRecord> load(Path path) { final List<VersionRecord> records = loadVersionRecords(path); final List<VersionRecord> result = loadVersionRecords(util.getDotFilePath(path)); for (final VersionRecord record : records) { if (doesNotContainID(record.id(), result)) { result.add(record); } } Collections.sort( result, new VersionRecordComparator()); return result; } @Override public List<VersionRecord> loadVersionRecords(Path path) { if (ioService.exists(path)) { ArrayList<VersionRecord> portableRecords = new ArrayList<VersionRecord>(); for (VersionRecord versionRecord : ioService.getFileAttributeView(path, VersionAttributeView.class).readAttributes().history().records()) { portableRecords.add(makePortable(versionRecord)); } return portableRecords; } else { return new ArrayList<VersionRecord>(); } } private PortableVersionRecord makePortable(VersionRecord record) { return new PortableVersionRecord(record.id(), record.author(), record.email(), record.comment(), record.date(), record.uri()); } private boolean doesNotContainID(String id, List<VersionRecord> records) { for (VersionRecord record : records) { if (record.id().equals(id)) { return false; } } return true; } @Override public VersionRecord loadRecord(Path path) throws URISyntaxException { for (VersionRecord record : loadVersionRecords(util.getPath(path, "master"))) { String version = util.getVersion(path); if ("master".equals(version)) { // Return first record when looking for master return record; } else if (record.id().equals(version)) { return record; } } return null; } private class VersionRecordComparator implements Comparator<VersionRecord> { @Override public int compare(VersionRecord left, VersionRecord right) { int compareTo = left.date().compareTo(right.date()); if (compareTo == 0) { return compareUri(right.uri(), left.uri()); } else { return compareTo; } } private int compareUri(String rightUri, String leftUri) { Iterator<Character> right = getReversedIterator(rightUri); Iterator<Character> left = getReversedIterator(leftUri); while (left.hasNext() && right.hasNext()) { Character l = left.next(); Character r = right.next(); if (l.equals('.') && !r.equals('.')) { return 1; } else if (!l.equals('.') && r.equals('.')) { return -1; } } return 0; } private Iterator<Character> getReversedIterator(String uri) { List<Character> chars = new ArrayList<Character>(); for (char c : uri.toCharArray()) { chars.add(c); } Collections.reverse(chars); return chars.iterator(); } } }