it.anyplace.sync.bep.FolderBrowser Maven / Gradle / Ivy
/*
* Copyright (C) 2016 Davide Imbriaco
*
* This Java file is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/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 it.anyplace.sync.bep;
import com.google.common.base.Function;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.eventbus.Subscribe;
import it.anyplace.sync.core.beans.FolderInfo;
import it.anyplace.sync.core.beans.FolderStats;
import java.io.Closeable;
import java.util.List;
import org.apache.commons.lang3.tuple.Pair;
import static com.google.common.base.Preconditions.checkNotNull;
import it.anyplace.sync.core.interfaces.IndexRepository;
/**
*
* @author aleph
*/
public final class FolderBrowser implements Closeable {
private final IndexHandler indexHandler;
private final LoadingCache folderStatsCache = CacheBuilder.newBuilder()
.build(new CacheLoader() {
@Override
public FolderStats load(String folder) throws Exception {
return FolderStats.newBuilder()
.setFolder(folder)
.build();
}
});
private final Object indexRepositoryEventListener = new Object() {
@Subscribe
public void handleFolderStatsUpdatedEvent(IndexRepository.FolderStatsUpdatedEvent event) {
addFolderStats(event.getFolderStats());
}
};
protected FolderBrowser(IndexHandler indexHandler) {
checkNotNull(indexHandler);
this.indexHandler = indexHandler;
indexHandler.getIndexRepository().getEventBus().register(indexRepositoryEventListener);
addFolderStats(indexHandler.getIndexRepository().findAllFolderStats());
}
private void addFolderStats(List folderStatsList) {
for (FolderStats folderStats : folderStatsList) {
folderStatsCache.put(folderStats.getFolder(), folderStats);
}
}
public FolderStats getFolderStats(String folder) {
return folderStatsCache.getUnchecked(folder);
}
public FolderInfo getFolderInfo(String folder) {
return indexHandler.getFolderInfo(folder);
}
public List> getFolderInfoAndStatsList() {
return Lists.newArrayList(Iterables.transform(indexHandler.getFolderInfoList(), new Function>() {
@Override
public Pair apply(FolderInfo folderInfo) {
return Pair.of(folderInfo, getFolderStats(folderInfo.getFolder()));
}
}));
}
@Override
public void close() {
indexHandler.getIndexRepository().getEventBus().unregister(indexRepositoryEventListener);
}
}