/*******************************************************************************
* 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.extension.maven.client.projecttree;
import org.eclipse.che.api.project.gwt.client.ProjectServiceClient;
import org.eclipse.che.api.project.shared.dto.ItemReference;
import org.eclipse.che.api.project.shared.dto.ProjectDescriptor;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.api.app.CurrentProject;
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.rest.DtoUnmarshallerFactory;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.web.bindery.event.shared.EventBus;
import javax.annotation.Nonnull;
/**
* Tree structure for Maven project. It also respects multi-module projects.
*
* @author Artem Zatsarynnyy
*/
public class MavenProjectTreeStructure extends JavaTreeStructure {
protected MavenProjectTreeStructure(MavenNodeFactory nodeFactory, EventBus eventBus, AppContext appContext,
ProjectServiceClient projectServiceClient, IconRegistry iconRegistry,
DtoUnmarshallerFactory dtoUnmarshallerFactory, JavaNavigationService javaNavigationService) {
super(nodeFactory, eventBus, appContext, projectServiceClient, iconRegistry, dtoUnmarshallerFactory, javaNavigationService);
}
/** {@inheritDoc} */
@Override
public void getRootNodes(@Nonnull AsyncCallback<Array<TreeNode<?>>> callback) {
if (projectNode == null) {
final CurrentProject currentProject = appContext.getCurrentProject();
if (currentProject != null) {
projectNode = newMavenProjectNode(currentProject.getRootProject());
} else {
callback.onFailure(new IllegalStateException("No project is opened."));
return;
}
}
callback.onSuccess(Collections.<TreeNode<?>>createArray(projectNode));
}
@Override
public MavenNodeFactory getNodeFactory() {
return (MavenNodeFactory)nodeFactory;
}
private MavenProjectNode newMavenProjectNode(ProjectDescriptor data) {
return getNodeFactory().newMavenProjectNode(null, data, this);
}
@Override
public MavenFolderNode newJavaFolderNode(@Nonnull AbstractTreeNode parent, @Nonnull ItemReference data) {
if (!"folder".equals(data.getType()) && !"project".equals(data.getType())) {
throw new IllegalArgumentException("The associated ItemReference type must be - folder or project.");
}
return getNodeFactory().newMavenFolderNode(parent, data, this);
}
/**
* Creates a new {@link ModuleNode} owned by this tree
* with the specified {@code parent} and associated {@code data}.
*
* @param parent
* the parent node
* @param data
* the associated {@link ProjectDescriptor}
* @return a new {@link ModuleNode}
*/
public ModuleNode newModuleNode(@Nonnull AbstractTreeNode parent, @Nonnull ProjectDescriptor data) {
return getNodeFactory().newModuleNode(parent, data, this);
}
}