/******************************************************************************* * 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.interceptor; import org.eclipse.che.api.promises.client.Promise; import org.eclipse.che.api.promises.client.js.Promises; import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto; import org.eclipse.che.commons.annotation.Nullable; import org.eclipse.che.ide.api.project.node.Node; import org.eclipse.che.ide.api.project.node.interceptor.NodeInterceptor; import org.eclipse.che.ide.ext.java.client.project.node.JavaNodeManager; import org.eclipse.che.ide.ext.java.client.project.settings.JavaNodeSettings; import org.eclipse.che.ide.ext.java.shared.ContentRoot; import org.eclipse.che.ide.project.node.FolderReferenceNode; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * @author Vlad Zhukovskiy */ public abstract class AbstractJavaContentRootInterceptor implements NodeInterceptor { private JavaNodeManager nodeManager; public AbstractJavaContentRootInterceptor(JavaNodeManager nodeManager) { this.nodeManager = nodeManager; } @Override public Promise<List<Node>> intercept(Node parent, List<Node> children) { List<Node> nodes = new ArrayList<>(); for (Node child : children) { ContentRoot contentRoot = getSourceType(child); if (contentRoot == null) { nodes.add(child); continue; } FolderReferenceNode oldNode = (FolderReferenceNode)child; JavaNodeSettings settings = (JavaNodeSettings)nodeManager.getJavaSettingsProvider().getSettings(); nodes.add(nodeManager.getJavaNodeFactory().newSourceFolderNode(oldNode.getData(), oldNode.getProjectConfig(), settings, contentRoot)); } return Promises.resolve(nodes); } @Nullable private ContentRoot getSourceType(Node node) { if (!JavaNodeManager.isJavaProject(node)) { return null; } if (!(node instanceof FolderReferenceNode)) { return null; } final FolderReferenceNode folderNode = (FolderReferenceNode)node; final ProjectConfigDto projectConfig = folderNode.getProjectConfig(); String srcFolder = _getSourceFolder(projectConfig, getSrcFolderAttribute()); if (folderNode.getStorablePath().endsWith(srcFolder)) { return ContentRoot.SOURCE; } String testSrcFolder = _getSourceFolder(projectConfig, getTestSrcFolderAttribute()); if (folderNode.getStorablePath().endsWith(testSrcFolder)) { return ContentRoot.TEST_SOURCE; } return null; } private String _getSourceFolder(ProjectConfigDto projectConfig, String srcAttribute) { Map<String, List<String>> attributes = projectConfig.getAttributes(); if (!attributes.containsKey(srcAttribute)) { return ""; } List<String> values = attributes.get(srcAttribute); if (values.isEmpty()) { return ""; } String srcFolder = ""; if ("maven.resource.folder".equals(srcAttribute)) { for (String srcFolderValue : values) { if (srcFolderValue.endsWith("/resources")) { srcFolder = srcFolderValue; break; } } } else { srcFolder = values.get(0); } return projectConfig.getPath() + (srcFolder.startsWith("/") ? srcFolder : "/" + srcFolder); } public abstract String getSrcFolderAttribute(); public abstract String getTestSrcFolderAttribute(); @Override public int getPriority() { return MAX_PRIORITY; } }