/*
 * 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.cauldron.bld.core.repository;

import java.io.File;
import java.util.Properties;

import org.cauldron.sigil.repository.IBundleRepository;
import org.cauldron.sigil.repository.IRepositoryProvider;
import org.cauldron.sigil.repository.RepositoryException;
import org.eclipse.core.runtime.Path;

public class FileSystemRepositoryProvider implements IRepositoryProvider {

	public IBundleRepository createRepository(String id, Properties preferences)
			throws RepositoryException {
		String dir = preferences.getProperty("dir");
		if (!new File(dir).isDirectory()) {
			throw new RepositoryException("directory '" + dir +"' does not exist.");
		}
		boolean recurse = Boolean.valueOf(preferences.getProperty("recurse"));
		return new FileSystemRepository(id, new Path(dir), recurse);		
	}

}
