/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.api.data.tree; import org.eclipse.che.api.promises.client.Function; import org.eclipse.che.api.promises.client.FunctionException; import org.eclipse.che.api.promises.client.Promise; import org.eclipse.che.api.promises.client.js.Promises; import org.eclipse.che.commons.annotation.Nullable; import javax.validation.constraints.NotNull; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Base implementation for all nodes that uses in the tree. * * @author Vlad Zhukovskiy */ public abstract class AbstractTreeNode implements Node, HasAttributes { private Node parent; protected List<Node> children; private Map<String, List<String>> attributes = new HashMap<>(); /** {@inheritDoc} */ @Override public Map<String, List<String>> getAttributes() { return attributes; } /** {@inheritDoc} */ @Override public void setAttributes(Map<String, List<String>> attributes) { if (attributes == null || attributes.isEmpty()) { return; } this.attributes = attributes; } /** {@inheritDoc} */ @Nullable @Override public Node getParent() { return parent; } /** {@inheritDoc} */ @Override public void setParent(@NotNull Node parent) { this.parent = parent; } /** {@inheritDoc} */ @NotNull @Override public final Promise<List<Node>> getChildren(boolean forceUpdate) { if (children == null || children.isEmpty() || forceUpdate) { return getChildrenImpl().then(setParentAndSaveState()); } return Promises.resolve(children); } /** {@inheritDoc} */ @NotNull protected abstract Promise<List<Node>> getChildrenImpl(); /** {@inheritDoc} */ @Override public void setChildren(List<Node> children) { this.children = children; } private Function<List<Node>, List<Node>> setParentAndSaveState() { return new Function<List<Node>, List<Node>>() { @Override public List<Node> apply(List<Node> children) throws FunctionException { if (children == null) { setChildren(Collections.<Node>emptyList()); return Collections.emptyList(); } for (Node node : children) { node.setParent(AbstractTreeNode.this); } setChildren(children); return children; } }; } @Override public boolean supportGoInto() { return false; } }