/******************************************************************************* * 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.ext.java.client.util; import com.google.common.annotations.Beta; import com.google.common.base.Optional; import org.eclipse.che.ide.api.resources.Container; import org.eclipse.che.ide.api.resources.File; import org.eclipse.che.ide.api.resources.Project; import org.eclipse.che.ide.api.resources.Resource; import org.eclipse.che.ide.api.resources.VirtualFile; import org.eclipse.che.ide.ext.java.client.resource.SourceFolderMarker; import org.eclipse.che.ide.ext.java.shared.Constants; import org.eclipse.che.ide.resource.Path; import java.util.List; import java.util.Map; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Strings.isNullOrEmpty; import static org.eclipse.che.ide.api.resources.Resource.FILE; import static org.eclipse.che.ide.ext.java.shared.Constants.LANGUAGE; /** * @author Vlad Zhukovskiy */ @Beta public class JavaUtil { private JavaUtil() { } /** * Returns the {@code true} if given {@code resource} is Java based file. * <p/> * Java based file should has {@code .java} or {@code .class} extension. * * @param resource * the resource to check * @return {@code true} if resource is java file, otherwise {@code false} * @throws IllegalArgumentException * in case if given {@code resource} is null. Reason includes: * <ul> * <li>Null resource occurred</li> * </ul> * @since 4.4.0 */ public static boolean isJavaFile(Resource resource) { checkArgument(resource != null, "Null resource occurred"); if (resource.getResourceType() == FILE) { final String ext = ((File)resource).getExtension(); return !isNullOrEmpty(ext) && "java".equals(ext) || "class".equals(ext); } return false; } /** * Returns the {@code true} if given {@code project} is Java based project. * <p/> * Java based project should has {@code java} string value in {@link Constants#LANGUAGE} attribute. * * @param project * the project to check * @return {@code true} if project is java based, otherwise {@code false} * @throws IllegalArgumentException * in case if given {@code project} is null. Reason includes: * <ul> * <li>Null project occurred</li> * </ul> * @since 4.4.0 */ public static boolean isJavaProject(Project project) { checkArgument(project != null, "Null project occurred"); final Map<String, List<String>> attributes = project.getAttributes(); if (attributes == null || attributes.isEmpty()) { return false; } final List<String> languages = attributes.get(LANGUAGE); return languages != null && languages.contains("java"); } /** * Resolves fully qualified name based on base on start point container and end point resource. * <p/> * Usually as start point there is a source directory and as end point there is a package fragment or java file. * * @param startPoint * the start point container from which fqn should be resolved * @param endPoint * the end point resource to which fqn should be resolved * @return the resolved fully qualified name * @throws IllegalArgumentException * in case if given arguments are invalid. Reason includes: * <ul> * <li>Null source folder occurred</li> * <li>Null resource occurred</li> * <li>Given base folder is not prefix of checked resource</li> * </ul> * @since 4.4.0 */ public static String resolveFQN(Container startPoint, Resource endPoint) { checkArgument(startPoint != null, "Null source folder occurred"); checkArgument(endPoint != null, "Null resource occurred"); checkArgument(startPoint.getLocation().isPrefixOf(endPoint.getLocation()), "Given base folder is not prefix of checked resource"); Path path = endPoint.getLocation().removeFirstSegments(startPoint.getLocation().segmentCount()); if (isJavaFile(endPoint)) { final String ext = ((File)endPoint).getExtension(); if (!isNullOrEmpty(ext)) { final String name = endPoint.getName(); path = path.removeLastSegments(1).append(name.substring(0, name.length() - ext.length() - 1)); } } return path.toString().replace('/', '.'); } public static String resolveFQN(Resource resource) { final Optional<Resource> srcFolder = resource.getParentWithMarker(SourceFolderMarker.ID); if (!srcFolder.isPresent()) { throw new IllegalStateException("Fully qualified name can not be resolved for '" + resource.getLocation() + "'"); } return resolveFQN((Container)srcFolder.get(), resource); } public static String resolveFQN(VirtualFile file) { checkArgument(file instanceof File, "Given file is not resource based"); return resolveFQN((Resource)file); } }