/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-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 org.apache.ivy.plugins.repository.file; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.ivy.plugins.repository.AbstractRepository; import org.apache.ivy.plugins.repository.RepositoryCopyProgressListener; import org.apache.ivy.plugins.repository.Resource; import org.apache.ivy.plugins.repository.TransferEvent; import org.apache.ivy.util.Checks; import org.apache.ivy.util.FileUtil; public class FileRepository extends AbstractRepository { private RepositoryCopyProgressListener progress = new RepositoryCopyProgressListener(this); private File baseDir; private boolean local = true; public FileRepository() { baseDir = null; } public FileRepository(File basedir) { setBaseDir(basedir); } public Resource getResource(String source) throws IOException { return new FileResource(this, getFile(source)); } public void get(String source, File destination) throws IOException { fireTransferInitiated(getResource(source), TransferEvent.REQUEST_GET); copy(getFile(source), destination, true); } public void put(File source, String destination, boolean overwrite) throws IOException { fireTransferInitiated(getResource(destination), TransferEvent.REQUEST_PUT); copy(source, getFile(destination), overwrite); } public void move(File src, File dest) throws IOException { if (!src.renameTo(dest)) { throw new IOException("impossible to move '" + src + "' to '" + dest + "'"); } } public void delete(File f) throws IOException { if (!FileUtil.forceDelete(f)) { throw new IOException("impossible to delete '" + f + "'"); } } private void copy(File src, File destination, boolean overwrite) throws IOException { try { getProgressListener().setTotalLength(new Long(src.length())); if (!FileUtil.copy(src, destination, getProgressListener(), overwrite)) { if (!overwrite && destination.exists()) { throw new IOException("file copy not done from " + src + " to " + destination + ": destination already exists and overwrite is false"); } else { throw new IOException("file copy not done from " + src + " to " + destination); } } } catch (IOException ex) { fireTransferError(ex); throw ex; } catch (RuntimeException ex) { fireTransferError(ex); throw ex; } finally { getProgressListener().setTotalLength(null); } } protected RepositoryCopyProgressListener getProgressListener() { return progress; } public List list(String parent) throws IOException { File dir = getFile(parent); if (dir.exists() && dir.isDirectory()) { String[] names = dir.list(); if (names != null) { List ret = new ArrayList(names.length); for (int i = 0; i < names.length; i++) { ret.add(parent + getFileSeparator() + names[i]); } return ret; } } return null; } File getFile(String source) { if (baseDir != null) { return FileUtil.resolveFile(baseDir, source); } else { return Checks.checkAbsolute(source, "source"); } } public boolean isLocal() { return local; } public void setLocal(boolean local) { this.local = local; } public File getBaseDir() { return baseDir; } public final void setBaseDir(File baseDir) { Checks.checkAbsolute(baseDir, "basedir"); this.baseDir = baseDir; } public String standardize(String source) { if (baseDir != null) { return FileUtil.resolveFile(baseDir, source).getPath(); } else { return FileUtil.normalize(source).getPath(); } } public String getFileSeparator() { return File.separator; } }