blob: 12eec9386fbb7dd9974caf33c52b8320a806e9f8 [file] [log] [blame]
/*
* 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.sis.storage;
import java.util.Locale;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Files;
import java.nio.file.OpenOption;
import org.apache.sis.util.Classes;
import org.apache.sis.util.Workaround;
import org.apache.sis.storage.internal.Resources;
import org.apache.sis.io.stream.IOUtilities;
/**
* Thrown when no {@link DataStoreProvider} is found for a given storage object.
* May also be thrown if a {@code DataStore} is instantiated directly but the data store
* cannot handle the given input or output object.
*
* @author Martin Desruisseaux (Geomatys)
* @version 1.0
* @since 0.4
*/
public class UnsupportedStorageException extends IllegalOpenParameterException {
/**
* For cross-version compatibility.
*/
private static final long serialVersionUID = -8754573140979570187L;
/**
* Creates an exception with no cause and no details message.
*/
public UnsupportedStorageException() {
}
/**
* Creates an exception with the specified details message.
*
* @param message the detail message.
*/
public UnsupportedStorageException(final String message) {
super(message);
}
/**
* Creates an exception with the specified cause and no details message.
*
* @param cause the cause for this exception.
*/
public UnsupportedStorageException(final Throwable cause) {
super(cause);
}
/**
* Creates an exception with the specified details message and cause.
*
* @param message the detail message.
* @param cause the cause for this exception.
*/
public UnsupportedStorageException(final String message, final Throwable cause) {
super(message, cause);
}
/**
* Creates a new exception which will format a localized message in the given locale.
*
* @param locale the locale for the message to be returned by {@link #getLocalizedMessage()}.
* @param key one of {@link Resources.Keys} constants.
* @param parameters parameters to use for formatting the messages.
*/
UnsupportedStorageException(final Locale locale, final short key, final Object... parameters) {
super(locale, key, parameters);
}
/**
* Creates a localized exception for an invalid input or output object given to a data store.
* Arguments given to this constructor are hints for building an error message.
*
* @param locale the locale of the message to be returned by {@link #getLocalizedMessage()}, or {@code null}.
* @param format short name or abbreviation of the data format (e.g. "CSV", "GML", "WKT", <i>etc</i>).
* @param storage the invalid input or output object. This is typically {@link StorageConnector#getStorage()}.
* @param options the option used for opening the file, or {@code null} or empty if unknown.
* This method looks in particular for {@link java.nio.file.StandardOpenOption#READ} and
* {@code WRITE} options for inferring if the data store was to be used as a reader or as a writer.
* Those options can be obtained by {@code StorageConnector.getOption(OptionKey.OPEN_OPTIONS)}.
*
* @since 0.8
*/
public UnsupportedStorageException(final Locale locale, final String format, final Object storage, final OpenOption... options) {
super(locale, IOUtilities.isWrite(options) ? Resources.Keys.IllegalOutputTypeForWriter_2
: Resources.Keys.IllegalInputTypeForReader_2, format, type(storage));
}
/**
* Returns the type of the given storage, with a special case for files or paths to directories.
* This is a work around for RFE #4093999 in Sun's bug database
* ("Relax constraint on placement of this()/super() call in constructors").
*/
@Workaround(library="JDK", version="10")
private static Object type(final Object storage) {
if ((storage instanceof File && ((File) storage).isDirectory()) ||
(storage instanceof Path && Files.isDirectory((Path) storage)))
{
return "Directory";
} else {
return Classes.getClass(storage);
}
}
}