/*******************************************************************************
* Copyright (c) 2012-2016 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.project.node;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import com.google.web.bindery.event.shared.EventBus;
import org.eclipse.che.api.project.shared.dto.ItemReference;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto;
import org.eclipse.che.ide.api.project.node.HasStorablePath;
import org.eclipse.che.ide.api.project.node.Node;
import org.eclipse.che.ide.api.project.node.resource.RenameProcessor;
import org.eclipse.che.ide.ext.java.client.project.settings.JavaNodeSettings;
import org.eclipse.che.ide.project.node.FolderReferenceNode;
import org.eclipse.che.ide.project.node.resource.ItemReferenceProcessor;
import org.eclipse.che.ide.ui.smartTree.presentation.NodePresentation;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* @author Vlad Zhukovskiy
*/
public class PackageNode extends FolderReferenceNode {
private final JavaNodeManager nodeManager;
@Inject
public PackageNode(@Assisted ItemReference itemReference,
@Assisted ProjectConfigDto projectConfig,
@Assisted JavaNodeSettings nodeSettings,
@NotNull EventBus eventBus,
@NotNull JavaNodeManager nodeManager,
@NotNull ItemReferenceProcessor resourceProcessor) {
super(itemReference, projectConfig, nodeSettings, eventBus, nodeManager, resourceProcessor);
this.nodeManager = nodeManager;
}
/** {@inheritDoc} */
@NotNull
@Override
protected Promise<List<Node>> getChildrenImpl() {
return nodeManager.getChildren(getStorablePath(),
getProjectConfig(),
getSettings());
}
/** {@inheritDoc} */
@Override
public void updatePresentation(@NotNull NodePresentation presentation) {
presentation.setPresentableText(getDisplayPackage());
presentation.setPresentableIcon(nodeManager.getJavaNodesResources().packageItem());
}
/** {@inheritDoc} */
@Override
public String getName() {
return getPackage();
}
/**
* Return full FQN name for the package. E.g. a.b.c.d
*
* @return FQN name for the package
*/
public String getPackage() {
final SourceFolderNode sourceFolder = getSourceFolder();
final String sourcePath = sourceFolder.getStorablePath();
String path = "";
if (getData().getPath().startsWith(sourcePath + "/")) {
path = getData().getPath().substring(sourcePath.length() + 1);
}
return path.replace('/', '.');
}
/**
* Return display FQN for the package according to the parent. E.g. from package a.b.c.d will displayed only c.d
*
* @return partially displayed FQN name.
*/
public String getDisplayPackage() {
if (getParent() == null || !(getParent() instanceof PackageNode)) {
return getPackage();
}
PackageNode parent = (PackageNode)getParent();
return getPackage().startsWith(parent.getPackage()) ? getPackage().substring(parent.getPackage().length() + 1) : getPackage();
}
/** {@inheritDoc} */
@Override
public RenameProcessor<ItemReference> getRenameProcessor() {
return null;
}
/** {@inheritDoc} */
@Override
public String getStorablePath() {
if (getParent() == null || !(getParent() instanceof HasStorablePath)) {
return getData().getPath();
}
return ((HasStorablePath)getParent()).getStorablePath() + "/" + getDisplayPackage().replace(".", "/");
}
/**
* Return source folder node in which package node exists.
*
* @return parent source folder node
*/
public SourceFolderNode getSourceFolder() {
Node parent = getParent();
while (parent != null) {
if (parent instanceof SourceFolderNode) {
return (SourceFolderNode)parent;
}
parent = parent.getParent();
}
throw new IllegalStateException("Source directory wasn't bind to package.");
}
}