blob: 6c8a69c655b31fcb82029b989fe1d1c567a4a9b3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019, 2020 ArSysOp 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/.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Alexander Fedorov <alexander.fedorov@arsysop.ru> - initial API and implementation
*******************************************************************************/
package org.eclipse.e4.ui.internal.workspace.markers;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.Platform;
import org.osgi.framework.FrameworkUtil;
/**
* Translates attribute values from a marker instance to UI-friendly form.
*
* As the class is intended to directly serve UI, it cannot afford fail-fast
* strategy. On the other hand, retrieving an attribute from an arbitrary marker
* implementation can be anyhow sophisticated and the interface itself is
* designed to fail easily.
*
* Thus, {@linkplain #message(IMarker)} does not fail in the case of
* {@linkplain IMarker#getAttribute} invocation misbehavior, but instead return
* not-filled {@linkplain Optional} and delegates error processing to the
* configured {@code reporter}.
*
* @see IMarker
*/
public final class Translation {
private final Consumer<CoreException> reporter;
private final NameAttribute nameAttribute;
/**
* Use {@link ILog} of enclosing bundle as {@link CoreException} consumer
*/
public Translation() {
this(e -> Platform.getLog(FrameworkUtil.getBundle(Translation.class)).log(e.getStatus()));
}
/**
*
* @param reporter for a {@link CoreException} if any of them will be thrown
*/
public Translation(Consumer<CoreException> reporter) {
Objects.requireNonNull(reporter);
this.reporter = reporter;
this.nameAttribute = new NameAttribute();
}
/**
* Retrieves the value of the {@link IMarker#MESSAGE} attribute of the marker.
*
* @param marker
* @return the optional result
*/
public Optional<String> message(IMarker marker) {
try {
Object attribute = marker.getAttribute(IMarker.MESSAGE);
if (attribute instanceof String) {
String value = (String) attribute;
return Optional.of(value);
}
} catch (CoreException e) {
reporter.accept(e);
}
return Optional.empty();
}
/**
* Retrieves the value of Translation#NAME_ATTRIBUTE if the marker has it.
* Otherwise use the name of the resource.
*
* @param marker
* @return the optional result
*/
public Optional<String> name(IMarker marker) {
if (!marker.exists()) {
return Optional.empty();
}
try {
Object name = marker.getAttribute(nameAttribute.key());
if (name != null) {
return Optional.of(name.toString());
}
} catch (CoreException e) {
reporter.accept(e);
}
return Optional.of(marker.getResource().getName());
}
}