/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.module.cam.batch; import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import org.apache.commons.io.filefilter.AndFileFilter; import org.apache.commons.io.filefilter.IOFileFilter; import org.apache.commons.io.filefilter.PrefixFileFilter; import org.apache.commons.io.filefilter.SuffixFileFilter; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.module.cam.CamsConstants; import org.kuali.kfs.module.cam.CamsKeyConstants; import org.kuali.kfs.module.cam.batch.service.AssetBarcodeInventoryLoadService; import org.kuali.kfs.module.cam.document.web.struts.AssetBarCodeInventoryInputFileForm; import org.kuali.kfs.sys.FileUtil; import org.kuali.kfs.sys.batch.BatchInputFileSetType; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.rice.core.api.datetime.DateTimeService; import org.kuali.rice.kim.api.identity.Person; /** * Batch input type for the barcode inventory document. */ public class AssetBarcodeInventoryInputFileType implements BatchInputFileSetType { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AssetBarcodeInventoryInputFileType.class); private String directoryPath; private static final String FILE_NAME_PREFIX = "barcode_inv"; private static final String FILE_NAME_PART_DELIMITER = "_"; /** * * @see org.kuali.kfs.sys.batch.BatchInputFileSetType#getDirectoryPath(java.lang.String) */ public String getDirectoryPath(String fileType) { return this.directoryPath; } /** * * Sets the path were the files will be saved * @param directoryPath */ public void setDirectoryPath(String directoryPath) { this.directoryPath = directoryPath; FileUtil.createDirectory(directoryPath); } /** * * @see org.kuali.kfs.sys.batch.BatchInputFileSetType#getFileTypes() */ public List<String> getFileTypes() { List<String> types = new ArrayList<String>(); types.add(CamsConstants.BarCodeInventory.DATA_FILE_TYPE); return types; } /** * Returns the file extension depending on the file type * * @param fileType the file type (returned in {@link #getFileTypes()}) * @return the file extension */ public String getFileExtension() { return CamsConstants.BarCodeInventory.DATA_FILE_EXTENSION; } /** * Returns a map with the enterprise feeder file type descriptions * * @return a map containing the following key/description pairs: DATA/Data Files, RECON/Reconciliation File * * @see org.kuali.kfs.sys.batch.BatchInputFileSetType#getFileTypeDescription() */ public Map<String, String> getFileTypeDescription() { Map<String, String> values = new HashMap<String, String>(); values.put(CamsConstants.BarCodeInventory.DATA_FILE_TYPE, "CSV File"); return values; } /** * Return the file name based on information from user and file user identifier * * @param user Person object representing user who uploaded file * @param fileUserIdentifer String representing user who uploaded file * @return String enterprise feeder formated file name string using information from user and file user identifier * * @see org.kuali.kfs.sys.batch.BatchInputFileSetType#getFileName(java.lang.String, org.kuali.rice.kim.api.identity.Person, java.lang.String) */ public String getFileName(String fileType, String principalName, String fileUserIdentifer, Date creationDate) { DateTimeService dateTimeService = SpringContext.getBean(DateTimeService.class); StringBuilder buf = new StringBuilder(); fileUserIdentifer = StringUtils.deleteWhitespace(fileUserIdentifer); fileUserIdentifer = StringUtils.remove(fileUserIdentifer, FILE_NAME_PART_DELIMITER); buf.append(FILE_NAME_PREFIX).append(FILE_NAME_PART_DELIMITER).append(principalName) .append(FILE_NAME_PART_DELIMITER).append(fileUserIdentifer) .append(FILE_NAME_PART_DELIMITER).append(dateTimeService.toDateTimeStringForFilename(creationDate)) .append(getFileExtension(fileType)); return buf.toString(); } public String getAuthorPrincipalName(File file) { String[] fileNameParts = StringUtils.split(file.getName(), "_"); if (fileNameParts.length > 2) { return fileNameParts[2]; } return null; } /** * @see org.kuali.kfs.sys.batch.BatchInputFileSetType#getFileSetTypeIdentifer() */ public String getFileSetTypeIdentifer() { return CamsConstants.BarCodeInventory.FILE_TYPE_INDENTIFIER; } /** * @see org.kuali.kfs.sys.batch.BatchInputType#getTitleKey() */ public String getTitleKey() { return CamsKeyConstants.BarcodeInventory.TITLE_BAR_CODE_INVENTORY; } /** * @see org.kuali.kfs.sys.batch.BatchInputFileSetType#isFileRequired(java.lang.String) */ public boolean isFileRequired(String fileType) { return true; // if (CamsConstants.BarCodeInventory.DATA_FILE_TYPE.equals(fileType)) { // return true; // } // throw new IllegalArgumentException("Unknown file type found: " + fileType); } /** * @see org.kuali.kfs.sys.batch.BatchInputFileSetType#getDoneFileDirectoryPath() */ public String getDoneFileDirectoryPath() { return this.directoryPath; } /** * @see org.kuali.kfs.sys.batch.BatchInputFileSetType#getDoneFileExtension() */ public String getDoneFileExtension() { return CamsConstants.BarCodeInventory.DONE_FILE_EXTENSION; } /** * Returns done file name for a specific user and file user identifier * * @param user the user who uploaded or will upload the file * @param fileUserIdentifier the file identifier * @return String done file name * * @see org.kuali.kfs.sys.batch.BatchInputFileSetType#getDoneFileName(org.kuali.rice.kim.api.identity.Person, java.lang.String) */ public String getDoneFileName(Person user, String fileUserIdentifer, Date creationDate) { DateTimeService dateTimeService = SpringContext.getBean(DateTimeService.class); StringBuilder buf = new StringBuilder(); fileUserIdentifer = StringUtils.deleteWhitespace(fileUserIdentifer); fileUserIdentifer = StringUtils.remove(fileUserIdentifer, FILE_NAME_PART_DELIMITER); buf.append(FILE_NAME_PREFIX).append(FILE_NAME_PART_DELIMITER).append(user.getPrincipalName()) .append(FILE_NAME_PART_DELIMITER).append(fileUserIdentifer) .append(FILE_NAME_PART_DELIMITER).append(dateTimeService.toDateTimeStringForFilename(creationDate)) .append(getDoneFileExtension()); return buf.toString(); } /** * Return set of file user identifiers from a list of files * * @param user user who uploaded or will upload file * @param files list of files objects * @return Set containing all user identifiers from list of files * * @see org.kuali.kfs.sys.batch.BatchInputFileSetType#extractFileUserIdentifiers(org.kuali.rice.kim.api.identity.Person, java.util.List) */ public Set<String> extractFileUserIdentifiers(Person user, List<File> files) { Set<String> extractedFileUserIdentifiers = new TreeSet<String>(); StringBuilder buf = new StringBuilder(); buf.append(FILE_NAME_PREFIX).append(FILE_NAME_PART_DELIMITER).append(user.getPrincipalName()).append(FILE_NAME_PART_DELIMITER); String prefixString = buf.toString(); IOFileFilter prefixFilter = new PrefixFileFilter(prefixString); IOFileFilter suffixFilter = new SuffixFileFilter(CamsConstants.BarCodeInventory.DATA_FILE_EXTENSION); IOFileFilter combinedFilter = new AndFileFilter(prefixFilter, suffixFilter); for (File file : files) { if (combinedFilter.accept(file)) { String fileName = file.getName(); if (fileName.endsWith(CamsConstants.BarCodeInventory.DATA_FILE_EXTENSION)) { extractedFileUserIdentifiers.add(StringUtils.substringBetween(fileName, prefixString, CamsConstants.BarCodeInventory.DATA_FILE_EXTENSION)); } else { LOG.error("Unable to determine file user identifier for file name: " + fileName); throw new RuntimeException("Unable to determine file user identifier for file name: " + fileName); } } } return extractedFileUserIdentifiers; } /** * * @see org.kuali.kfs.sys.batch.BatchInputFileSetType#process(java.util.Map) */ public void process(Map<String, File> typeToFiles) { } public void process(Map<String, File> typeToFiles, AssetBarCodeInventoryInputFileForm form) { SpringContext.getBean(AssetBarcodeInventoryLoadService.class).processFile(typeToFiles.get(CamsConstants.BarCodeInventory.DATA_FILE_TYPE),form); } /** * * @see org.kuali.kfs.sys.batch.BatchInputFileSetType#validate(java.util.Map) */ public boolean validate(Map<String, File> typeToFiles) { boolean isValid=true; //Validating file format. if (!SpringContext.getBean(AssetBarcodeInventoryLoadService.class).isFileFormatValid(typeToFiles.get(CamsConstants.BarCodeInventory.DATA_FILE_TYPE))) { isValid=false; } return isValid; } public String generageDoneFileWithDataFile(String fileUserIdentifer) { return null; } public String generateDoneFileName(Person user, String fileUserIdentifer) { return null; } public String generateFileName(String fileType, String principalName, String fileUserIdentifer) { return null; } public String getFileExtension(String fileType) { return "." + fileType; } }