blob: 0c76723f89d78b6e6021dd51715af93af5149e17 [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.module.impl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.*;
import org.jetbrains.jps.model.ex.JpsElementChildRoleBase;
import org.jetbrains.jps.model.ex.JpsNamedCompositeElementBase;
import org.jetbrains.jps.model.impl.JpsUrlListRole;
import org.jetbrains.jps.model.library.JpsLibrary;
import org.jetbrains.jps.model.library.JpsLibraryCollection;
import org.jetbrains.jps.model.library.JpsLibraryType;
import org.jetbrains.jps.model.library.JpsTypedLibrary;
import org.jetbrains.jps.model.library.impl.JpsLibraryCollectionImpl;
import org.jetbrains.jps.model.library.impl.JpsLibraryRole;
import org.jetbrains.jps.model.library.sdk.JpsSdk;
import org.jetbrains.jps.model.library.sdk.JpsSdkType;
import org.jetbrains.jps.model.library.sdk.JpsSdkReference;
import org.jetbrains.jps.model.module.*;
import java.util.List;
/**
* @author nik
*/
public class JpsModuleImpl<P extends JpsElement> extends JpsNamedCompositeElementBase<JpsModuleImpl<P>> implements JpsTypedModule<P> {
private static final JpsUrlListRole CONTENT_ROOTS_ROLE = new JpsUrlListRole("content roots");
private static final JpsUrlListRole EXCLUDED_ROOTS_ROLE = new JpsUrlListRole("excluded roots");
private static final JpsElementChildRole<JpsDependenciesListImpl> DEPENDENCIES_LIST_CHILD_ROLE = JpsElementChildRoleBase.create("dependencies");
private final JpsModuleType<P> myModuleType;
private final JpsLibraryCollection myLibraryCollection;
public JpsModuleImpl(JpsModuleType<P> type, @NotNull String name, @NotNull P properties) {
super(name);
myModuleType = type;
myContainer.setChild(myModuleType.getPropertiesRole(), properties);
myContainer.setChild(CONTENT_ROOTS_ROLE);
myContainer.setChild(EXCLUDED_ROOTS_ROLE);
myContainer.setChild(DEPENDENCIES_LIST_CHILD_ROLE, new JpsDependenciesListImpl());
getDependenciesList().addModuleSourceDependency();
myLibraryCollection = new JpsLibraryCollectionImpl(myContainer.setChild(JpsLibraryRole.LIBRARIES_COLLECTION_ROLE));
myContainer.setChild(JpsModuleSourceRootRole.ROOT_COLLECTION_ROLE);
myContainer.setChild(JpsSdkReferencesTableImpl.ROLE);
}
private JpsModuleImpl(JpsModuleImpl<P> original) {
super(original);
myModuleType = original.myModuleType;
myLibraryCollection = new JpsLibraryCollectionImpl(myContainer.getChild(JpsLibraryRole.LIBRARIES_COLLECTION_ROLE));
}
@NotNull
@Override
public JpsModuleImpl<P> createCopy() {
return new JpsModuleImpl<P>(this);
}
@Override
public JpsElementType<P> getType() {
return myModuleType;
}
@Override
@NotNull
public P getProperties() {
return myContainer.getChild(myModuleType.getPropertiesRole());
}
@Override
public <P extends JpsElement> JpsTypedModule<P> asTyped(@NotNull JpsModuleType<P> type) {
//noinspection unchecked
return myModuleType.equals(type) ? (JpsTypedModule<P>)this : null;
}
@NotNull
@Override
public JpsUrlList getContentRootsList() {
return myContainer.getChild(CONTENT_ROOTS_ROLE);
}
@NotNull
public JpsUrlList getExcludeRootsList() {
return myContainer.getChild(EXCLUDED_ROOTS_ROLE);
}
@NotNull
@Override
public List<JpsModuleSourceRoot> getSourceRoots() {
return myContainer.getChild(JpsModuleSourceRootRole.ROOT_COLLECTION_ROLE).getElements();
}
@NotNull
@Override
public <P extends JpsElement> Iterable<JpsTypedModuleSourceRoot<P>> getSourceRoots(@NotNull JpsModuleSourceRootType<P> type) {
return myContainer.getChild(JpsModuleSourceRootRole.ROOT_COLLECTION_ROLE).getElementsOfType(type);
}
@NotNull
@Override
public <P extends JpsElement> JpsModuleSourceRoot addSourceRoot(@NotNull String url, @NotNull JpsModuleSourceRootType<P> rootType) {
return addSourceRoot(url, rootType, rootType.createDefaultProperties());
}
@NotNull
@Override
public <P extends JpsElement> JpsModuleSourceRoot addSourceRoot(@NotNull String url, @NotNull JpsModuleSourceRootType<P> rootType,
@NotNull P properties) {
final JpsModuleSourceRootImpl root = new JpsModuleSourceRootImpl<P>(url, rootType, properties);
addSourceRoot(root);
return root;
}
@Override
public void addSourceRoot(@NotNull JpsModuleSourceRoot root) {
myContainer.getChild(JpsModuleSourceRootRole.ROOT_COLLECTION_ROLE).addChild(root);
}
@Override
public void removeSourceRoot(@NotNull String url, @NotNull JpsModuleSourceRootType rootType) {
final JpsElementCollection<JpsModuleSourceRoot> roots = myContainer.getChild(JpsModuleSourceRootRole.ROOT_COLLECTION_ROLE);
for (JpsModuleSourceRoot root : roots.getElements()) {
if (root.getRootType().equals(rootType) && root.getUrl().equals(url)) {
roots.removeChild(root);
break;
}
}
}
@NotNull
@Override
public JpsDependenciesList getDependenciesList() {
return myContainer.getChild(DEPENDENCIES_LIST_CHILD_ROLE);
}
@Override
@NotNull
public JpsSdkReferencesTable getSdkReferencesTable() {
return myContainer.getChild(JpsSdkReferencesTableImpl.ROLE);
}
@Override
public <P extends JpsElement> JpsSdkReference<P> getSdkReference(@NotNull JpsSdkType<P> type) {
JpsSdkReference<P> sdkReference = getSdkReferencesTable().getSdkReference(type);
if (sdkReference != null) {
return sdkReference;
}
JpsProject project = getProject();
if (project != null) {
return project.getSdkReferencesTable().getSdkReference(type);
}
return null;
}
@Override
public <P extends JpsElement> JpsSdk<P> getSdk(@NotNull JpsSdkType<P> type) {
final JpsSdkReference<P> reference = getSdkReference(type);
if (reference == null) return null;
JpsTypedLibrary<JpsSdk<P>> library = reference.resolve();
return library != null ? library.getProperties() : null;
}
@Override
public void delete() {
//noinspection unchecked
((JpsElementCollection<JpsModule>)myParent).removeChild(this);
}
@NotNull
@Override
public JpsModuleReference createReference() {
return new JpsModuleReferenceImpl(getName());
}
@NotNull
@Override
public <P extends JpsElement, Type extends JpsLibraryType<P> & JpsElementTypeWithDefaultProperties<P>>
JpsLibrary addModuleLibrary(@NotNull String name, @NotNull Type type) {
return myLibraryCollection.addLibrary(name, type);
}
@Override
public void addModuleLibrary(final @NotNull JpsLibrary library) {
myLibraryCollection.addLibrary(library);
}
@NotNull
@Override
public JpsLibraryCollection getLibraryCollection() {
return myLibraryCollection;
}
@Nullable
public JpsProject getProject() {
JpsModel model = getModel();
return model != null ? model.getProject() : null;
}
@NotNull
@Override
public JpsModuleType<P> getModuleType() {
return myModuleType;
}
}