blob: 1485cab30d833903e06c694d7e9948cce9001630 [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2021 Stephan Wahlbrink and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
# which is available at https://www.apache.org/licenses/LICENSE-2.0.
#
# SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
#
# Contributors:
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.jcommons.ts.core;
import org.eclipse.statet.jcommons.lang.NonNull;
import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;
/**
* The data for execution of tool commands by a {@link ToolCommandHandler}.
*/
@NonNullByDefault
public interface ToolCommandData {
public static class IllegalDataException extends RuntimeException {
private static final long serialVersionUID= 1L;
public IllegalDataException(final String message) {
super(message);
}
}
/**
* Returns the raw data as provided by the tool, if available.
*
* @param key the key of the data entry.
* @return the data or {@code null} if not available.
*/
public @Nullable Object getRawData(final String key);
/**
* Returns the data, if available.
*
* <p>If the {@link #getRawData(String) raw data} of the data entry is not available, the method
* returns {@code null}.
* If the raw data is available and not an instance of the requested type, the raw data is
* converted to the requested type. If the conversion fails, the method throws an exception.</p>
*
* @param key the key of the data entry
* @param type the type of the data
* @return the data or {@code null}
* @throws IllegalDataException if the data is incompatible to the required type
*/
public <TData> @Nullable TData get(final String key, final Class<TData> type)
throws IllegalDataException;
/**
* Returns the data or the specified default data.
*
* <p>If the {@link #getRawData(String) raw data} of the data entry is not available, the method
* returns the specified default data.
* If the raw data is available and not an instance of the requested type, the raw data is
* converted to the requested type. If the conversion fails, the method throws an exception.</p>
*
* @param key the key of the data entry
* @param type the type of the data
* @param defaultData the data to return if the data entry is missing
* @return the data
* @throws IllegalDataException if the data is incompatible to the required type
*/
public default <TData> TData get(final String key, final Class<TData> type,
final @NonNull TData defaultData)
throws IllegalDataException {
final var data= get(key, type);
if (data == null) {
return defaultData;
}
return data;
}
/**
* Returns the data.
*
* <p>If the {@link #getRawData(String) raw data} of the data entry is not available, the method
* throws an exception.
* If the raw data is available and not an instance of the requested type, the raw data is
* converted to the requested type. If the conversion fails, the method throws an exception.</p>
*
* @param key the key of the data entry
* @param type the type of the data
* @return the data
* @throws IllegalDataException if the data is missing or incompatible to the required type
*/
public default <TData> TData getRequired(final String key, final Class<TData> type)
throws IllegalDataException {
final var data= get(key, type);
if (data == null) {
throw new IllegalDataException(String.format("Data entry '%1$s' is missing.",
key ));
}
return data;
}
public default @Nullable String getString(final String key)
throws IllegalDataException {
return get(key, String.class);
}
public default String getString(final String key, final String defaultData)
throws IllegalDataException {
return get(key, String.class, defaultData);
}
public default String getStringRequired(final String key)
throws IllegalDataException {
return getRequired(key, String.class);
}
public default boolean getBoolean(final String key, final boolean defaultData)
throws IllegalDataException {
return get(key, Boolean.class, defaultData);
}
public default boolean getBooleanRequired(final String key)
throws IllegalDataException {
return getRequired(key, Boolean.class);
}
public default int getInt(final String key, final int defaultData)
throws IllegalDataException {
return get(key, Integer.class, defaultData);
}
public default int getIntRequired(final String key)
throws IllegalDataException {
return getRequired(key, Integer.class);
}
public void setReturnData(final String key, @Nullable Object value);
public void removeReturnData(final String key);
}