| /*=============================================================================# |
| # 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 java.util.HashMap; |
| import java.util.Map; |
| |
| import org.eclipse.statet.jcommons.lang.NonNullByDefault; |
| import org.eclipse.statet.jcommons.lang.Nullable; |
| |
| |
| @NonNullByDefault |
| public class BasicToolCommandData implements ToolCommandData { |
| |
| |
| private final Map<String, ?> data; |
| |
| private final Map<String, @Nullable Object> returnData= new HashMap<>(); |
| |
| |
| public BasicToolCommandData(final Map<String, ?> data) { |
| this.data= data; |
| } |
| |
| public BasicToolCommandData() { |
| this.data= Map.of(); |
| } |
| |
| |
| @Override |
| public @Nullable Object getRawData(final String key) { |
| return this.data; |
| } |
| |
| protected @Nullable Object getData(final String key) { |
| Object data= this.returnData.get(key); |
| if (data == null) { |
| data= getRawData(key); |
| } |
| return data; |
| } |
| |
| @Override |
| @SuppressWarnings("unchecked") |
| public <TData> @Nullable TData get(final String key, final Class<TData> type) { |
| final Object rawData= getData(key); |
| if (rawData != null) { |
| if (type.isInstance(rawData)) { |
| return (TData)rawData; |
| } |
| else { |
| final TData typedData= convert(rawData, type); |
| if (typedData == null) { |
| throw new IllegalArgumentException(String.format("Data entry '%1$s' is incompatible (%2$s).", |
| key, rawData.getClass().getName() )); |
| } |
| return typedData; |
| } |
| } |
| return null; |
| } |
| |
| |
| protected Map<String, @Nullable Object> getReturnData() { |
| return this.returnData; |
| } |
| |
| public boolean hasReturnData() { |
| return !this.returnData.isEmpty(); |
| } |
| |
| @Override |
| public void setReturnData(final String key, final @Nullable Object value) { |
| this.returnData.put(key, value); |
| } |
| |
| @Override |
| public void removeReturnData(final String key) { |
| this.returnData.remove(key); |
| } |
| |
| |
| @SuppressWarnings("unchecked") |
| public <TData> @Nullable TData convert(@Nullable Object data, final Class<TData> type) { |
| if (data != null && data.getClass().isArray() |
| && data.getClass().getComponentType().isAssignableFrom(type) ) { |
| final Object[] array= (Object[])data; |
| if (array.length == 1) { |
| data= array[0]; |
| } |
| } |
| if (data == null || type.isInstance(data)) { |
| return (TData)data; |
| } |
| if (type == Integer.class) { |
| if (data instanceof Number) { |
| return (TData)Integer.valueOf(((Number)data).intValue()); |
| } |
| } |
| if (type == Double.class ) { |
| if (data instanceof Number) { |
| return (TData)Double.valueOf(((Number)data).doubleValue()); |
| } |
| } |
| return null; |
| } |
| |
| |
| } |