package com.intuit.tank.project;
/*
* #%L
* JSF Support Beans
* %%
* Copyright (C) 2011 - 2015 Intuit Inc.
* %%
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* #L%
*/
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.enterprise.event.Event;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.intuit.tank.util.Messages;
import com.intuit.tank.ModifiedDatafileMessage;
import com.intuit.tank.PreferencesBean;
import com.intuit.tank.auth.Security;
import com.intuit.tank.dao.DataFileDao;
import com.intuit.tank.datafile.util.DataFileServiceUtil;
import com.intuit.tank.prefs.TablePreferences;
import com.intuit.tank.qualifier.Modified;
import com.intuit.tank.storage.FileData;
import com.intuit.tank.storage.FileStorage;
import com.intuit.tank.storage.FileStorageFactory;
import com.intuit.tank.util.DataFileUtil;
import com.intuit.tank.util.Multiselectable;
import com.intuit.tank.view.filter.ViewFilterType;
import com.intuit.tank.vm.settings.AccessRight;
import com.intuit.tank.vm.settings.TankConfig;
import com.intuit.tank.wrapper.SelectableBean;
import com.intuit.tank.wrapper.SelectableWrapper;
import com.intuit.tank.wrapper.VersionContainer;
@Named
@SessionScoped
public class DataFileBrowser extends SelectableBean<DataFile> implements Serializable, Multiselectable<DataFile> {
private static final Logger LOG = LogManager.getLogger(DataFileBrowser.class);
private static final long serialVersionUID = 1L;
@Inject
private DataFileLoader dataFileLoader;
private SelectableWrapper<DataFile> selectedFile;
@Inject
@Modified
private Event<ModifiedDatafileMessage> dataFileEvent;
@Inject
private Messages messages;
@Inject
private Security security;
private DataFile viewDatafile;
private int currentPage;
private int inputPage = 1;
private int numEntriesToShow = 50;
private List<String> currentEntries;
private int lastVersion;
@Inject
private PreferencesBean userPrefs;
@PostConstruct
public void init() {
tablePrefs = new TablePreferences(userPrefs.getPreferences().getDatafilesTableColumns());
tablePrefs.registerListener(userPrefs);
}
/**
*
* @{inheritDoc
*/
public void delete(DataFile dataFile) {
if (!security.hasRight(AccessRight.DELETE_DATAFILE) && !security.isOwner(dataFile)) {
messages.warn("You don't have permission to delete this data file.");
} else {
try {
new DataFileDao().delete(dataFile);
messages.info("Datafile " + dataFile.getPath() + " has been deleted.");
dataFileEvent.fire(new ModifiedDatafileMessage(dataFile, this));
} catch (Exception e) {
}
}
}
/**
* @return the creatorList
*/
public SelectItem[] getCreatorList() {
return dataFileLoader.getCreatorList();
}
/**
* @return the viewDatafile
*/
public DataFile getViewDatafile() {
return viewDatafile;
}
/**
* @param viewDatafile
* the viewDatafile to set
*/
public void setViewDatafile(DataFile viewDatafile) {
this.currentPage = 0;
currentEntries = null;
this.viewDatafile = viewDatafile;
}
public void selectDataFile() {
Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
setViewDatafileId(Integer.parseInt(params.get("dataFileId")));
}
/**
* @param viewDatafile
* the viewDatafile to set
*/
public void setViewDatafileId(int viewDatafileId) {
setViewDatafile(new DataFileDao().findById(viewDatafileId));
}
/**
* @return the numEntriesToShow
*/
public int getNumEntriesToShow() {
return numEntriesToShow;
}
/**
* @param numEntriesToShow
* the numEntriesToShow to set
*/
public void setNumEntriesToShow(int numEntriesToShow) {
this.numEntriesToShow = numEntriesToShow;
}
public void nextSetOfEntries() {
currentPage++;
}
public void prevSetOfEntries() {
currentPage--;
}
public String getEntries() {
List<String> currentEntries = getCurrentEntries();
int start = Math.max(0, Math.min(currentPage * numEntriesToShow, getTotalLines() - numEntriesToShow));
int end = Math.max(0, Math.min(start + numEntriesToShow, getTotalLines()));
return StringUtils.join(currentEntries.subList(start, end), '\n');
}
/**
*
* @return
*/
public int getStartIndex() {
return Math.max(0, Math.min(currentPage * numEntriesToShow, getTotalLines() - numEntriesToShow)) + 1;
}
public boolean enablePrev() {
return currentPage > 0;
}
public boolean enableNext() {
return getEndIndex() < getTotalLines();
}
/**
*
* @return
*/
public int getEndIndex() {
return Math.max(
0,
Math.min(Math.max(0, Math.min(currentPage * numEntriesToShow, getTotalLines() - numEntriesToShow))
+ numEntriesToShow, getTotalLines()));
}
public int getTotalLines() {
return getCurrentEntries().size();
}
/**
* @return
*/
private List<String> getCurrentEntries() {
if (currentEntries == null) {
currentEntries = new ArrayList<String>();
if (viewDatafile != null) {
FileData fd = DataFileUtil.getFileData(viewDatafile);
try {
FileStorage fileStorage = FileStorageFactory.getFileStorage(new TankConfig().getDataFileStorageDir(), false);
currentEntries = IOUtils.readLines(fileStorage.readFileData(fd));
} catch (IOException e) {
LOG.error("Error reading file " + fd.toString()+ ": " + e, e);
currentEntries.add("Error reading dataFile: " + e.toString());
}
} else {
currentEntries.add("current Data File Not set.");
}
}
return currentEntries;
}
/**
* @return the selectedFile
*/
public SelectableWrapper<DataFile> getSelectedFile() {
return selectedFile;
}
/**
* @param selectedFile
* the selectedFile to set
*/
public void setSelectedFile(SelectableWrapper<DataFile> selectedFile) {
this.selectedFile = selectedFile;
}
public int getNumPages() {
int numCurrentEntries = getCurrentEntries().size();
return numCurrentEntries / numEntriesToShow;
}
public void goToFirstPage() {
currentPage = 0;
}
public void goToLastPage() {
currentPage = getNumPages();
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getInputPage() {
return inputPage;
}
public void setInputPage(int inputPage) {
this.inputPage = inputPage;
}
public void jumpToInputPage() {
int pageNum = inputPage - 1;
if (!(pageNum < 0 || pageNum > getNumPages())) {
currentPage = pageNum;
}
}
public String getDataFileDownloadLink(DataFile dataFile) {
if (dataFile != null) {
return DataFileServiceUtil.getDownloadUrl(dataFile.getId());
} else {
return "";
}
}
/**
* @{inheritDoc
*/
@Override
public List<DataFile> getEntityList(ViewFilterType viewFilter) {
VersionContainer<DataFile> container = dataFileLoader.getVersionContainer(viewFilter);
this.lastVersion = container.getVersion();
return container.getEntities();
}
/**
* @{inheritDoc
*/
@Override
public boolean isCurrent() {
return dataFileLoader.isCurrent(lastVersion);
}
public boolean canCreateDatafile() {
return security.hasRight(AccessRight.CREATE_DATAFILE);
}
}