blob: 4f153d396405168b0f814362ef06c6be867bf484 [file] [log] [blame]
/*
* Copyright 2000-2009 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 com.intellij.openapi.roots.impl;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.ContentFolder;
import com.intellij.openapi.roots.SourceFolder;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.vfs.VirtualFile;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.JpsElement;
import org.jetbrains.jps.model.JpsElementFactory;
import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
import org.jetbrains.jps.model.java.JavaResourceRootType;
import org.jetbrains.jps.model.java.JavaSourceRootProperties;
import org.jetbrains.jps.model.java.JavaSourceRootType;
import org.jetbrains.jps.model.module.JpsModuleSourceRoot;
import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
import org.jetbrains.jps.model.module.JpsTypedModuleSourceRoot;
import org.jetbrains.jps.model.serialization.module.JpsModuleRootModelSerializer;
/**
* @author dsl
*/
public class SourceFolderImpl extends ContentFolderBaseImpl implements SourceFolder, ClonableContentFolder {
private JpsModuleSourceRoot myJpsElement;
@NonNls public static final String ELEMENT_NAME = JpsModuleRootModelSerializer.SOURCE_FOLDER_TAG;
@NonNls public static final String TEST_SOURCE_ATTR = JpsModuleRootModelSerializer.IS_TEST_SOURCE_ATTRIBUTE;
static final String DEFAULT_PACKAGE_PREFIX = "";
SourceFolderImpl(@NotNull VirtualFile file, @NotNull JpsModuleSourceRoot jpsElement, @NotNull ContentEntryImpl contentEntry) {
super(file, contentEntry);
myJpsElement = jpsElement;
}
public SourceFolderImpl(@NotNull JpsModuleSourceRoot jpsElement, @NotNull ContentEntryImpl contentEntry) {
super(jpsElement.getUrl(), contentEntry);
myJpsElement = jpsElement;
}
SourceFolderImpl(Element element, ContentEntryImpl contentEntry) throws InvalidDataException {
super(element, contentEntry);
myJpsElement = JpsModuleRootModelSerializer.loadSourceRoot(element);
}
private SourceFolderImpl(SourceFolderImpl that, ContentEntryImpl contentEntry) {
super(that, contentEntry);
myJpsElement = createCopy(that, that.myJpsElement.asTyped());
}
private static <P extends JpsElement> JpsModuleSourceRoot createCopy(SourceFolderImpl that, final JpsTypedModuleSourceRoot<P> jpsElement) {
return JpsElementFactory.getInstance().createModuleSourceRoot(that.getUrl(), jpsElement.getRootType(), (P)jpsElement.getProperties().getBulkModificationSupport().createCopy());
}
@Override
public boolean isTestSource() {
return getRootType().equals(JavaSourceRootType.TEST_SOURCE) || getRootType().equals(JavaResourceRootType.TEST_RESOURCE);
}
@NotNull
@Override
public String getPackagePrefix() {
JavaSourceRootProperties properties = getJavaProperties();
return properties != null ? properties.getPackagePrefix() : DEFAULT_PACKAGE_PREFIX;
}
@Nullable
private JavaSourceRootProperties getJavaProperties() {
return myJpsElement.getProperties(JavaModuleSourceRootTypes.SOURCES);
}
@Override
public void setPackagePrefix(@NotNull String packagePrefix) {
JavaSourceRootProperties properties = getJavaProperties();
if (properties != null) {
properties.setPackagePrefix(packagePrefix);
}
}
@NotNull
@Override
public JpsModuleSourceRootType<?> getRootType() {
return myJpsElement.getRootType();
}
@Override
public ContentFolder cloneFolder(ContentEntry contentEntry) {
assert !((ContentEntryImpl)contentEntry).isDisposed() : "target entry already disposed: " + contentEntry;
assert !isDisposed() : "Already disposed: " + this;
return new SourceFolderImpl(this, (ContentEntryImpl)contentEntry);
}
@NotNull
public JpsModuleSourceRoot getJpsElement() {
return myJpsElement;
}
@Override
public int compareTo(ContentFolderBaseImpl folder) {
if (!(folder instanceof SourceFolderImpl)) return -1;
int i = super.compareTo(folder);
if (i!= 0) return i;
SourceFolderImpl sourceFolder = (SourceFolderImpl)folder;
i = getPackagePrefix().compareTo(sourceFolder.getPackagePrefix());
if (i!= 0) return i;
i = Boolean.valueOf(isTestSource()).compareTo(sourceFolder.isTestSource());
if (i != 0) return i;
JavaSourceRootProperties properties1 = getJavaProperties();
JavaSourceRootProperties properties2 = sourceFolder.getJavaProperties();
if (properties1 != null && properties2 != null) {
i = Boolean.valueOf(properties1.isForGeneratedSources()).compareTo(properties2.isForGeneratedSources());
if (i != 0) return i;
}
//todo[nik] perhaps we should use LinkedSet instead of SortedSet and get rid of this method
return myJpsElement.getRootType().getClass().getName().compareTo(sourceFolder.getRootType().getClass().getName());
}
}