blob: 9f172a9881ff83b0886e8476bc362320593dbb14 [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 org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.java.*;
import org.jetbrains.jps.model.library.JpsOrderRootType;
import org.jetbrains.jps.model.module.JpsDependencyElement;
import org.jetbrains.jps.model.module.JpsModule;
import org.jetbrains.jps.model.module.JpsSdkDependency;
import org.jetbrains.jps.model.module.impl.JpsDependenciesEnumeratorBase;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* @author nik
*/
public class JpsJavaDependenciesEnumeratorImpl extends JpsDependenciesEnumeratorBase<JpsJavaDependenciesEnumeratorImpl> implements JpsJavaDependenciesEnumerator {
private boolean myProductionOnly;
private boolean myRuntimeOnly;
private boolean myCompileOnly;
private boolean myExportedOnly;
private boolean myRecursivelyExportedOnly;
private JpsJavaClasspathKind myClasspathKind;
private final List<JpsJavaDependenciesEnumerationHandler> myHandlers;
public JpsJavaDependenciesEnumeratorImpl(Collection<JpsModule> rootModules) {
super(rootModules);
List<JpsJavaDependenciesEnumerationHandler> handlers = JpsJavaDependenciesEnumerationHandler.createHandlers(rootModules);
myHandlers = handlers != null ? handlers : Collections.<JpsJavaDependenciesEnumerationHandler>emptyList();
}
@NotNull
@Override
public JpsJavaDependenciesEnumerator productionOnly() {
myProductionOnly = true;
return this;
}
@NotNull
@Override
public JpsJavaDependenciesEnumerator compileOnly() {
myCompileOnly = true;
return this;
}
@NotNull
@Override
public JpsJavaDependenciesEnumerator runtimeOnly() {
myRuntimeOnly = true;
return this;
}
@NotNull
@Override
public JpsJavaDependenciesEnumerator exportedOnly() {
if (myRecursively) {
myRecursivelyExportedOnly = true;
}
else {
myExportedOnly = true;
}
return this;
}
@NotNull
@Override
public JpsJavaDependenciesEnumerator recursivelyExportedOnly() {
return recursively().exportedOnly();
}
@NotNull
@Override
public JpsJavaDependenciesEnumerator includedIn(@NotNull JpsJavaClasspathKind classpathKind) {
myClasspathKind = classpathKind;
return this;
}
@NotNull
@Override
public JpsJavaDependenciesRootsEnumerator classes() {
return new JpsJavaDependenciesRootsEnumeratorImpl(this, JpsOrderRootType.COMPILED);
}
@NotNull
@Override
public JpsJavaDependenciesRootsEnumerator sources() {
return new JpsJavaDependenciesRootsEnumeratorImpl(this, JpsOrderRootType.SOURCES);
}
@NotNull
@Override
public JpsJavaDependenciesRootsEnumerator annotations() {
return new JpsJavaDependenciesRootsEnumeratorImpl(this, JpsAnnotationRootType.INSTANCE);
}
@Override
protected JpsJavaDependenciesEnumeratorImpl self() {
return this;
}
@Override
protected boolean shouldProcessDependenciesRecursively() {
return JpsJavaDependenciesEnumerationHandler.shouldProcessDependenciesRecursively(myHandlers);
}
@Override
protected boolean shouldProcess(JpsModule module, JpsDependencyElement element) {
boolean exported = !(element instanceof JpsSdkDependency);
JpsJavaDependencyExtension extension = JpsJavaExtensionService.getInstance().getDependencyExtension(element);
if (extension != null) {
exported = extension.isExported();
JpsJavaDependencyScope scope = extension.getScope();
boolean forTestCompile = scope.isIncludedIn(JpsJavaClasspathKind.TEST_COMPILE) || scope == JpsJavaDependencyScope.RUNTIME &&
shouldAddRuntimeDependenciesToTestCompilationClasspath();
if (myCompileOnly && !scope.isIncludedIn(JpsJavaClasspathKind.PRODUCTION_COMPILE) && !forTestCompile
|| myRuntimeOnly && !scope.isIncludedIn(JpsJavaClasspathKind.PRODUCTION_RUNTIME) && !scope.isIncludedIn(JpsJavaClasspathKind.TEST_RUNTIME)
|| myClasspathKind != null && !scope.isIncludedIn(myClasspathKind) && !(myClasspathKind == JpsJavaClasspathKind.TEST_COMPILE && forTestCompile)) {
return false;
}
if (myProductionOnly) {
if (!scope.isIncludedIn(JpsJavaClasspathKind.PRODUCTION_COMPILE) && !scope.isIncludedIn(JpsJavaClasspathKind.PRODUCTION_RUNTIME)
|| myCompileOnly && !scope.isIncludedIn(JpsJavaClasspathKind.PRODUCTION_COMPILE)
|| myRuntimeOnly && !scope.isIncludedIn(JpsJavaClasspathKind.PRODUCTION_RUNTIME)) {
return false;
}
}
}
if (!exported) {
if (myExportedOnly) return false;
if (myRecursivelyExportedOnly && !isEnumerationRootModule(module)) return false;
}
return true;
}
public boolean isProductionOnly() {
return myProductionOnly || myClasspathKind == JpsJavaClasspathKind.PRODUCTION_RUNTIME || myClasspathKind == JpsJavaClasspathKind.PRODUCTION_COMPILE;
}
public boolean isProductionOnTests(JpsDependencyElement element) {
for (JpsJavaDependenciesEnumerationHandler handler : myHandlers) {
if (handler.isProductionOnTestsDependency(element)) {
return true;
}
}
return false;
}
public boolean shouldIncludeTestsFromDependentModulesToTestClasspath() {
for (JpsJavaDependenciesEnumerationHandler handler : myHandlers) {
if (!handler.shouldIncludeTestsFromDependentModulesToTestClasspath()) {
return false;
}
}
return true;
}
public boolean shouldAddRuntimeDependenciesToTestCompilationClasspath() {
for (JpsJavaDependenciesEnumerationHandler handler : myHandlers) {
if (handler.shouldAddRuntimeDependenciesToTestCompilationClasspath()) {
return true;
}
}
return false;
}
}