/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.pieShare.pieShareApp.service.fileService;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.io.FileUtils;
import org.pieShare.pieShareApp.model.PieShareAppBeanNames;
import org.pieShare.pieShareApp.model.PieUser;
import org.pieShare.pieShareApp.model.message.FileListRequestMessage;
import org.pieShare.pieShareApp.model.pieFile.PieFile;
import org.pieShare.pieShareApp.service.configurationService.api.IPieShareConfiguration;
import org.pieShare.pieShareApp.service.fileService.api.IFileService;
import org.pieShare.pieShareApp.service.fileService.fileListenerService.api.IFileWatcherService;
import org.pieShare.pieTools.piePlate.service.cluster.api.IClusterManagementService;
import org.pieShare.pieTools.piePlate.service.cluster.event.ClusterAddedEvent;
import org.pieShare.pieTools.piePlate.service.cluster.event.IClusterAddedListener;
import org.pieShare.pieTools.piePlate.service.cluster.exception.ClusterManagmentServiceException;
import org.pieShare.pieTools.pieUtilities.service.beanService.IBeanService;
import org.pieShare.pieTools.pieUtilities.service.pieExecutorService.api.IExecutorService;
import org.pieShare.pieTools.pieUtilities.service.pieLogger.PieLogger;
import sun.nio.ch.FileChannelImpl;
/**
*
* @author Svetoslav
*/
public abstract class FileServiceBase implements IFileService {
protected IBeanService beanService;
protected IPieShareConfiguration configuration;
protected IFileWatcherService fileWatcherService;
public void setBeanService(IBeanService beanService) {
this.beanService = beanService;
}
public void setFileWatcherService(IFileWatcherService fileWatcherService) {
this.fileWatcherService = fileWatcherService;
}
public void init() {
PieUser user = beanService.getBean(PieShareAppBeanNames.getPieUser());
this.configuration = user.getPieShareConfiguration();
}
@Override
public void waitUntilCopyFinished(File file) {
FileInputStream st;
boolean isCopying = true;
while (isCopying) {
try {
Thread.sleep(2000);
st = new FileInputStream(file);
st.close();
isCopying = false;
} catch (FileNotFoundException ex) {
isCopying = false;
} catch (Exception ex) {
//nothing needed to do here
}
}
}
@Override
public void deleteRecursive(PieFile file) {
File localFile = this.getAbsolutePath(file).toFile();
try {
if (localFile.isDirectory()) {
FileUtils.deleteDirectory(localFile);
} else {
localFile.delete();
}
} catch (IOException ex) {
PieLogger.error(this.getClass(), "Deleting failed!", ex);
}
}
@Override
public void setCorrectModificationDate(PieFile file) {
File targetFile = this.getAbsolutePath(file).toFile();
this.fileWatcherService.addPieFileToModifiedList(file);
if (setCorrectModificationDate(file, targetFile)) {
this.fileWatcherService.removePieFileFromModifiedList(file);
}
}
@Override
public void setCorrectModificationDateOnTmpFile(PieFile file) {
File tmpFile = this.getAbsoluteTmpPath(file).toFile();
setCorrectModificationDate(file, tmpFile);
}
private boolean setCorrectModificationDate(PieFile pieFile, File file) {
PieLogger.trace(this.getClass(), "Date modified {} of {}", pieFile.getLastModified(), pieFile.getRelativeFilePath());
if (!file.setLastModified(pieFile.getLastModified())) {
PieLogger.warn(this.getClass(), "Could not set LastModificationDate: {}", file.getAbsolutePath());
return false;
}
return true;
}
@Override
public Path relitivizeFilePath(File file) {
try {
Path pathBase = configuration.getWorkingDir().getCanonicalFile().toPath();
Path pathAbsolute = file.getCanonicalFile().toPath();
return pathBase.relativize(pathAbsolute);
} catch (IOException ex) {
PieLogger.error(this.getClass(), "Error in creating relativ file path!", ex);
}
return null;
}
@Override
public Path getAbsolutePath(PieFile file) {
File localFile = new File(configuration.getWorkingDir(), file.getRelativeFilePath());
return localFile.toPath();
}
@Override
public Path getAbsoluteTmpPath(PieFile file) {
File localFile = new File(configuration.getTmpDir(), file.getRelativeFilePath());
return localFile.toPath();
}
@Override
public PieFile getPieFile(String relativeFilePath) throws IOException {
PieUser user = beanService.getBean(PieShareAppBeanNames.getPieUser());
File localFile = new File(user.getPieShareConfiguration().getWorkingDir(), relativeFilePath);
return this.getPieFile(localFile);
}
@Override
public PieFile getTmpPieFile(PieFile file) throws IOException {
File tmpFile = new File(this.configuration.getTmpDir(), file.getRelativeFilePath());
return this.getPieFile(tmpFile);
}
@Override
public PieFile getWorkingPieFile(PieFile file) throws IOException {
return this.getPieFile(file.getRelativeFilePath());
}
}