blob: e0c31eca08d331a9abf2e0d6d9f58a338465b70a [file] [log] [blame]
package org.eclipse.capra.core.helpers;
import static java.util.stream.Collectors.toList;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import org.eclipse.capra.core.handlers.IArtifactHandler;
import org.eclipse.capra.core.handlers.PriorityHandler;
import org.eclipse.emf.ecore.EObject;
public class ArtifactHelper {
private EObject artifactModel;
// Switch to Optional here to express potential absence in the type
private static Optional<PriorityHandler> priorityHandler = ExtensionPointHelper.getPriorityHandler();
// This is a tricky type... It is not really necessary here, but let's take
// it as a generics tutorial example!
//
// I used it during development because this type can contain collections
// both of type IArtifactHandler<?>
// AND of IArtifactHandler<Object>. The simpler type
// Collection<IArtifactHandler<?>> can only hold
// IArtifactHandler<?>.
private static Collection<? extends IArtifactHandler<?>> handlers = ExtensionPointHelper.getArtifactHandlers();
/**
* @param artifactModel
*/
public ArtifactHelper(EObject artifactModel) {
this.artifactModel = artifactModel;
}
/**
* Creates wrappers for artifacts
*
* @param artifacts
* @return List of wrappers
*/
@SuppressWarnings("unchecked")
public List<EObject> createWrappers(List<?> artifacts) {
return (List<EObject>) (Object) artifacts.stream()
.map(vagueArtifact -> getHandler(vagueArtifact).map(h -> h.withCastedHandlerUnchecked(vagueArtifact,
(handler, artifact) -> handler.createWrapper(artifact, artifactModel))))
.filter(Optional::isPresent).map(Optional::get).collect(toList());
}
/**
* Creates wrapper for artifact
*
* @param vagueArtifact
* @return wrapper of null if no handler exists
*/
public EObject createWrapper(Object vagueArtifact) {
Optional<EObject> wrapped = getHandler(vagueArtifact)
.map(vagueHandler -> vagueHandler.withCastedHandlerUnchecked(vagueArtifact,
(handler, artifact) -> handler.createWrapper(artifact, artifactModel)));
return wrapped.orElse(null);
}
// Returns handler for same type as the argument
public <T> Optional<IArtifactHandler<?>> getHandler(Object artifact) {
List<IArtifactHandler<?>> availableHandlers = handlers.stream().filter(h -> h.canHandleArtifact(artifact))
.collect(toList());
if (availableHandlers.isEmpty()) {
return Optional.empty();
} else if (availableHandlers.size() == 1) {
return Optional.of(availableHandlers.get(0));
} else {
return priorityHandler.map(h -> h.getSelectedHandler(availableHandlers, artifact));
}
}
}