/******************************************************************************* * Copyright (c) 2012-2015 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.ext.java.client.projecttree.nodes; import org.eclipse.che.ide.api.icon.IconRegistry; import org.eclipse.che.ide.api.project.tree.AbstractTreeNode; import org.eclipse.che.ide.api.project.tree.TreeNode; import org.eclipse.che.ide.collections.Array; import org.eclipse.che.ide.collections.Collections; import org.eclipse.che.ide.ext.java.client.navigation.JavaNavigationService; import org.eclipse.che.ide.ext.java.client.projecttree.JavaTreeStructure; import org.eclipse.che.ide.ext.java.shared.Jar; import org.eclipse.che.ide.ext.java.shared.JarEntry; import org.eclipse.che.ide.rest.AsyncRequestCallback; import org.eclipse.che.ide.rest.DtoUnmarshallerFactory; import org.eclipse.che.ide.rest.Unmarshallable; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; import com.google.web.bindery.event.shared.EventBus; import javax.annotation.Nonnull; /** * @author Evgen Vidolob */ public class JarNode extends AbstractTreeNode<Jar> { private JavaTreeStructure treeStructure; private JavaNavigationService service; private DtoUnmarshallerFactory factory; /** * Creates new node with the specified parent, associated data and display name. * @param parent * parent node * @param data * an object this node encapsulates * @param javaTreeStructure * {@link JavaTreeStructure} which this node belongs * @param eventBus */ @Inject public JarNode(@Assisted ExternalLibrariesNode parent, @Assisted Jar data, @Assisted JavaTreeStructure javaTreeStructure, EventBus eventBus, JavaNavigationService service, DtoUnmarshallerFactory factory, IconRegistry registry) { super(parent, data, javaTreeStructure, eventBus); treeStructure = javaTreeStructure; this.service = service; this.factory = factory; setDisplayIcon(registry.getIcon("java.jar").getSVGImage()); } @Nonnull @Override public String getId() { return String.valueOf(getData().getId()); } @Nonnull @Override public String getDisplayName() { return getData().getName(); } @Override public boolean isLeaf() { return false; } @Override public void refreshChildren(final AsyncCallback<TreeNode<?>> callback) { Unmarshallable<Array<JarEntry>> unmarshaller = factory.newArrayUnmarshaller(JarEntry.class); service.getLibraryChildren(getParent().getProject().getPath(), getData().getId(), new AsyncRequestCallback<Array<JarEntry>>(unmarshaller) { @Override protected void onSuccess(Array<JarEntry> result) { Array<TreeNode<?>> nodes = Collections.createArray(); for (JarEntry jarNode : result.asIterable()) { nodes.add(createNode(jarNode)); } setChildren(nodes); callback.onSuccess(JarNode.this); } @Override protected void onFailure(Throwable exception) { callback.onFailure(exception); } }); } private TreeNode<?> createNode(JarEntry entry) { switch (entry.getType()){ case FOLDER: case PACKAGE: return treeStructure.newJarContainerNode(this, entry, getData().getId()); case FILE: return treeStructure.newJarFileNode(this, entry, getData().getId()); case CLASS_FILE: return treeStructure.newJarClassNode(this, entry, getData().getId()); } return null; } }