/* * Copyright (C) Scott Cranton, Jakub Korab, and Christian Posta * https://github.com/CamelCookbook * * Licensed 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.camelcookbook.transactions.utils; import java.io.File; import java.io.IOException; import java.util.LinkedList; import java.util.List; import org.apache.commons.lang.Validate; /** * Utility builder used to locate a file given a number of options as to where it might be. * Usage: <code>new FileLocator().with(location1).with(location2).find()</code> * If #find() returns null, #getErrorMessage() will format a nice human-readable error message * with the locations that were looked up. */ public class FileLocator { private List<String> locations = new LinkedList<String>(); private boolean used = false; private StringBuilder errorMessage = new StringBuilder(); public FileLocator() { } public FileLocator with(String location) { Validate.isTrue(!used); locations.add(location); return this; } public File find() { used = true; // this builder can't be used again File foundFile = null; for (String location : locations) { File file = new File(location); String path; try { path = file.getCanonicalPath(); } catch (IOException e) { throw new RuntimeException(e); } if (file.exists()) { foundFile = file; break; } else { if (errorMessage.length() == 0) { errorMessage.append("File not found in "); } else { errorMessage.append(" or in "); } errorMessage.append("'").append(path).append("'"); } } return foundFile; } public String getErrorMessage() { Validate.isTrue(used, "The find() method hasn't been called on this builder"); return errorMessage.toString(); } }