All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.intarsys.tools.file.AttachmentTools Maven / Gradle / Ivy

There is a newer version: 4.11
Show newest version
package de.intarsys.tools.file;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import de.intarsys.tools.locator.FileLocator;
import de.intarsys.tools.locator.ILocator;
import de.intarsys.tools.locator.ILocatorSupport;
import de.intarsys.tools.logging.LogTools;
import de.intarsys.tools.stream.StreamTools;
import de.intarsys.tools.string.StringTools;

/**
 * Utility methods to handle attachment relationships between files.
 * 
 */
public class AttachmentTools {

	private final static Logger Log = LogTools.getLogger(FileTools.class);

	protected static String createAttachmentName(String masterName,
			String movedName, String attachName) {
		String prefix = StringTools.getCommonPrefix(masterName, attachName,
				true);
		int masterSuffixLength = masterName.length() - prefix.length();
		int attachSuffixLength = attachName.length() - prefix.length();
		// set newName to movedName
		String newName = movedName;
		// remove master suffix from newName
		newName = newName.substring(0, newName.length() - masterSuffixLength);
		// add attachment suffix to newName
		newName = newName
				+ attachName
						.substring(attachName.length() - attachSuffixLength);
		return newName;
	}

	/**
	 * Create a list of {@link File} instances selected from the array of
	 * candidates that are recognized as attachments to file.
	 * 

* The attachments are selected using a ";" separated list of suffixes * (including the "."). *

* A file is accepted as an attachment if it has an attachment suffix and * the file base name is either the same as the target filename or target * file base name.
* * foo.bar * foo.bar.suffix (accepted) * foo.suffix (accepted) * foo.txt (rejected) * *

* All checks are case insensitive. * * @param master * @param files * @param extensions * @return a list of {@link File} instances selected from the array of * candidates that are recognized as attachments to * file. */ public static List createAttachments(File master, File[] files, String extensions) { if (StringTools.isEmpty(extensions)) { return Collections.EMPTY_LIST; } String targetName = null; String targetBaseName = null; if (master != null) { targetName = master.getName().toLowerCase(); targetBaseName = FileTools.getBaseName(targetName); } List result = new ArrayList(); String[] tempExtensions = extensions.toLowerCase().split(";"); for (int j = 0; j < files.length; j++) { File checkFile = files[j]; String tempName = checkFile.getName().toLowerCase(); if (tempName.equals(targetName)) { // this is target itself... continue; } String tempBaseName = FileTools.getBaseName(tempName); if (master == null || tempBaseName.equals(targetName) || tempBaseName.equals(targetBaseName)) { for (int i = 0; i < tempExtensions.length; i++) { if (tempName.endsWith(tempExtensions[i])) { result.add(checkFile); break; } } } } return result; } /** * Find all attachments to master. Attachments are defined to * be all files in the same directory as master that satisfy * one of the extensions. * * @param master * @param extensions * @return all attachments to master */ public static List createAttachments(File master, String extensions) { File tempDir; File tempFile; if (master.isDirectory()) { tempDir = master; tempFile = null; } else { tempDir = master.getParentFile(); tempFile = master; } if (tempDir == null) { return null; } File[] files = tempDir.listFiles(); return createAttachments(tempFile, files, extensions); } public static void deleteAttachments(List attachments) { for (Iterator it = attachments.iterator(); it.hasNext();) { Object attachment = it.next(); if (attachment instanceof File) { if (((File) attachment).exists() && !((File) attachment).delete()) { Log.log(Level.WARNING, "deleting '" //$NON-NLS-1$ + attachment + "' failed"); //$NON-NLS-1$ } } else if (attachment instanceof ILocator) { if (((ILocator) attachment).exists()) { try { ((ILocator) attachment).delete(); } catch (IOException e) { Log.log(Level.WARNING, "deleting '" //$NON-NLS-1$ + attachment + "' failed"); //$NON-NLS-1$ } } } else if (attachment instanceof ILocatorSupport) { ILocator tempLocator = ((ILocatorSupport) attachment) .getLocator(); if (tempLocator.exists()) { try { tempLocator.delete(); } catch (IOException e) { Log.log(Level.WARNING, "deleting '" //$NON-NLS-1$ + tempLocator + "' failed"); //$NON-NLS-1$ } } } else { // todo } } } static public File moveAttachment(File master, File attachment, File movedFile, boolean delete) { if (movedFile == null || attachment == null) { return null; } String masterName = master.getName(); String movedName = movedFile.getName(); File movedDir; if (movedFile.isDirectory()) { movedDir = movedFile; } else { movedDir = movedFile.getParentFile(); } try { File movedAttachment = moveAttachment(masterName, attachment, movedName, movedDir, delete); return movedAttachment; } catch (Exception e) { Log.log(Level.WARNING, "failed to move attachment '" + attachment + "' attached to '" + master + "'"); return attachment; } } static protected File moveAttachment(String masterName, Object attachment, String movedName, File dir, boolean delete) throws IOException { if (attachment instanceof FileLocator) { // avoid streaming attachment = ((FileLocator) attachment).getFile(); } if (attachment instanceof File) { File tempFile = (File) attachment; String tempName = tempFile.getName(); String newName = createAttachmentName(masterName, movedName, tempName); File newAttachment = new File(dir, newName); if (delete) { if (Log.isLoggable(Level.FINE)) { Log.log(Level.FINE, "move '" + tempFile.getAbsolutePath() + "' to '" + newAttachment.getAbsolutePath() + "'"); } FileTools.renameFile(tempFile, newAttachment); } else { if (Log.isLoggable(Level.FINE)) { Log.log(Level.FINE, "copy '" + tempFile.getAbsolutePath() + "' to '" + newAttachment.getAbsolutePath() + "'"); } FileTools.copyFile(tempFile, newAttachment); } return newAttachment; } else if (attachment instanceof ILocator) { ILocator tempLocator = (ILocator) attachment; String tempName = tempLocator.getTypedName(); String newName = createAttachmentName(masterName, movedName, tempName); File newAttachment = new File(dir, newName); if (Log.isLoggable(Level.FINE)) { Log.log(Level.FINE, "create file '" + newAttachment.getAbsolutePath() + "'"); } InputStream source = null; OutputStream destination = null; try { source = tempLocator.getInputStream(); destination = new FileOutputStream(newAttachment); StreamTools.copyStream(source, destination); } finally { StreamTools.close(source); StreamTools.close(destination); } if (delete) { if (Log.isLoggable(Level.FINE)) { Log.log(Level.FINE, "delete locator '" + tempLocator.getFullName() + "'"); } tempLocator.delete(); } return newAttachment; } else { // todo log warning return null; } } static public List moveAttachments(File master, List attachments, File movedFile, boolean delete) { if (master == null || movedFile == null || attachments == null || attachments.isEmpty()) { return attachments; } List result = new ArrayList(); String masterName = master.getName(); String movedName = movedFile.getName(); File movedDir; if (movedFile.isDirectory()) { movedDir = movedFile; } else { movedDir = movedFile.getParentFile(); } for (Iterator it = attachments.iterator(); it.hasNext();) { Object tempAttachment = it.next(); try { File movedAttachment = moveAttachment(masterName, tempAttachment, movedName, movedDir, delete); result.add(movedAttachment); } catch (Exception e) { result.add(tempAttachment); Log.log(Level.WARNING, "failed to move attachment '" + tempAttachment + "' attached to '" + master + "'"); } } return result; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy