blob: 40179134c921c827f1cd860ea13f7aa898afddab [file] [log] [blame]
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jps.model.java.impl;
import com.intellij.openapi.util.io.FileUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.java.impl.runConfiguration.JpsApplicationRunConfigurationPropertiesImpl;
import org.jetbrains.jps.model.java.runConfiguration.JpsApplicationRunConfigurationProperties;
import org.jetbrains.jps.model.java.runConfiguration.JpsApplicationRunConfigurationState;
import org.jetbrains.jps.util.JpsPathUtil;
import org.jetbrains.jps.model.JpsDummyElement;
import org.jetbrains.jps.model.JpsGlobal;
import org.jetbrains.jps.model.JpsProject;
import org.jetbrains.jps.model.java.*;
import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerConfiguration;
import org.jetbrains.jps.model.java.impl.compiler.JpsJavaCompilerConfigurationImpl;
import org.jetbrains.jps.model.library.JpsOrderRootType;
import org.jetbrains.jps.model.library.JpsTypedLibrary;
import org.jetbrains.jps.model.library.sdk.JpsSdk;
import org.jetbrains.jps.model.library.sdk.JpsSdkReference;
import org.jetbrains.jps.model.module.*;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* @author nik
*/
public class JpsJavaExtensionServiceImpl extends JpsJavaExtensionService {
@NotNull
@Override
public JpsJavaProjectExtension getOrCreateProjectExtension(@NotNull JpsProject project) {
return project.getContainer().getOrSetChild(JavaProjectExtensionRole.INSTANCE);
}
@Nullable
@Override
public JpsJavaProjectExtension getProjectExtension(@NotNull JpsProject project) {
return project.getContainer().getChild(JavaProjectExtensionRole.INSTANCE);
}
@NotNull
@Override
public JpsJavaModuleExtension getOrCreateModuleExtension(@NotNull JpsModule module) {
return module.getContainer().getOrSetChild(JavaModuleExtensionRole.INSTANCE);
}
@NotNull
@Override
public JpsJavaDependencyExtension getOrCreateDependencyExtension(@NotNull JpsDependencyElement dependency) {
return dependency.getContainer().getOrSetChild(JpsJavaDependencyExtensionRole.INSTANCE);
}
@Override
public JpsJavaDependencyExtension getDependencyExtension(@NotNull JpsDependencyElement dependency) {
return dependency.getContainer().getChild(JpsJavaDependencyExtensionRole.INSTANCE);
}
@Override
@Nullable
public JpsJavaModuleExtension getModuleExtension(@NotNull JpsModule module) {
return module.getContainer().getChild(JavaModuleExtensionRole.INSTANCE);
}
@Override
@NotNull
public ExplodedDirectoryModuleExtension getOrCreateExplodedDirectoryExtension(@NotNull JpsModule module) {
return module.getContainer().getOrSetChild(ExplodedDirectoryModuleExtensionImpl.ExplodedDirectoryModuleExtensionRole.INSTANCE);
}
@Override
@Nullable
public ExplodedDirectoryModuleExtension getExplodedDirectoryExtension(@NotNull JpsModule module) {
return module.getContainer().getChild(ExplodedDirectoryModuleExtensionImpl.ExplodedDirectoryModuleExtensionRole.INSTANCE);
}
@NotNull
@Override
public List<JpsDependencyElement> getDependencies(JpsModule module, JpsJavaClasspathKind classpathKind, boolean exportedOnly) {
final List<JpsDependencyElement> result = new ArrayList<JpsDependencyElement>();
for (JpsDependencyElement dependencyElement : module.getDependenciesList().getDependencies()) {
final JpsJavaDependencyExtension extension = getDependencyExtension(dependencyElement);
if (extension == null || extension.getScope().isIncludedIn(classpathKind) && (!exportedOnly || extension.isExported())) {
result.add(dependencyElement);
}
}
return result;
}
@Override
public LanguageLevel getLanguageLevel(JpsModule module) {
final JpsJavaModuleExtension moduleExtension = getModuleExtension(module);
if (moduleExtension == null) return null;
final LanguageLevel languageLevel = moduleExtension.getLanguageLevel();
if (languageLevel != null) return languageLevel;
final JpsJavaProjectExtension projectExtension = getProjectExtension(module.getProject());
return projectExtension != null ? projectExtension.getLanguageLevel() : null;
}
@Override
public String getOutputUrl(JpsModule module, boolean forTests) {
final JpsJavaModuleExtension extension = getModuleExtension(module);
if (extension == null) return null;
if (extension.isInheritOutput()) {
JpsJavaProjectExtension projectExtension = getProjectExtension(module.getProject());
if (projectExtension == null) return null;
final String url = projectExtension.getOutputUrl();
if (url == null) return null;
return url + "/" + (forTests ? "test" : "production") + "/" + module.getName();
}
return forTests ? extension.getTestOutputUrl() : extension.getOutputUrl();
}
@Nullable
@Override
public File getOutputDirectory(JpsModule module, boolean forTests) {
String url = getOutputUrl(module, forTests);
return url != null ? JpsPathUtil.urlToFile(url) : null;
}
@Override
public JpsTypedLibrary<JpsSdk<JpsDummyElement>> addJavaSdk(@NotNull JpsGlobal global, @NotNull String name, @NotNull String homePath) {
String version = JdkVersionDetector.getInstance().detectJdkVersion(homePath);
JpsTypedLibrary<JpsSdk<JpsDummyElement>> sdk = global.addSdk(name, homePath, version, JpsJavaSdkType.INSTANCE);
File homeDir = new File(FileUtil.toSystemDependentName(homePath));
List<File> roots = JavaSdkUtil.getJdkClassesRoots(homeDir, false);
for (File root : roots) {
sdk.addRoot(root, JpsOrderRootType.COMPILED);
}
return sdk;
}
@Nullable
@Override
public JpsJavaCompilerConfiguration getCompilerConfiguration(@NotNull JpsProject project) {
return project.getContainer().getChild(JpsJavaCompilerConfigurationImpl.ROLE);
}
@NotNull
@Override
public JpsJavaCompilerConfiguration getOrCreateCompilerConfiguration(@NotNull JpsProject project) {
JpsJavaCompilerConfiguration configuration = getCompilerConfiguration(project);
if (configuration == null) {
configuration = project.getContainer().setChild(JpsJavaCompilerConfigurationImpl.ROLE, new JpsJavaCompilerConfigurationImpl());
}
return configuration;
}
@NotNull
@Override
public JpsSdkReference<JpsDummyElement> createWrappedJavaSdkReference(@NotNull JpsJavaSdkTypeWrapper sdkType,
@NotNull JpsSdkReference<?> wrapperReference) {
return new JpsWrappedJavaSdkReferenceImpl(sdkType, wrapperReference);
}
@NotNull
@Override
public JpsApplicationRunConfigurationProperties createRunConfigurationProperties(JpsApplicationRunConfigurationState state) {
return new JpsApplicationRunConfigurationPropertiesImpl(state);
}
@NotNull
@Override
public JavaSourceRootProperties createSourceRootProperties(@NotNull String packagePrefix, boolean isGenerated) {
return new JavaSourceRootProperties(packagePrefix, isGenerated);
}
@NotNull
@Override
public JavaSourceRootProperties createSourceRootProperties(@NotNull String packagePrefix) {
return createSourceRootProperties(packagePrefix, false);
}
@Override
@NotNull
public JpsProductionModuleOutputPackagingElement createProductionModuleOutput(@NotNull JpsModuleReference moduleReference) {
return new JpsProductionModuleOutputPackagingElementImpl(moduleReference);
}
@Override
@NotNull
public JpsTestModuleOutputPackagingElement createTestModuleOutput(@NotNull JpsModuleReference moduleReference) {
return new JpsTestModuleOutputPackagingElementImpl(moduleReference);
}
@Override
public JpsJavaDependenciesEnumerator enumerateDependencies(Collection<JpsModule> modules) {
return new JpsJavaDependenciesEnumeratorImpl(modules);
}
@Override
protected JpsJavaDependenciesEnumerator enumerateDependencies(JpsProject project) {
return new JpsJavaDependenciesEnumeratorImpl(project.getModules());
}
@Override
protected JpsJavaDependenciesEnumerator enumerateDependencies(JpsModule module) {
return new JpsJavaDependenciesEnumeratorImpl(Collections.singletonList(module));
}
}