blob: 8c023c3ca99725ca6ced8f1bce50402c665afb82 [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.artifact.impl.elements;
import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.artifact.JpsArtifactReference;
import org.jetbrains.jps.model.artifact.elements.*;
import org.jetbrains.jps.model.library.JpsLibraryReference;
/**
* @author nik
*/
public class JpsPackagingElementFactoryImpl extends JpsPackagingElementFactory {
@Override
@NotNull
public JpsDirectoryCopyPackagingElement createDirectoryCopy(@NotNull String directoryPath) {
return new JpsDirectoryCopyPackagingElementImpl(directoryPath);
}
@Override
public JpsPackagingElement createParentDirectories(String relativeOutputPath, JpsPackagingElement element) {
relativeOutputPath = StringUtil.trimStart(relativeOutputPath, "/");
if (relativeOutputPath.length() == 0) {
return element;
}
int slash = relativeOutputPath.indexOf('/');
if (slash == -1) slash = relativeOutputPath.length();
String rootName = relativeOutputPath.substring(0, slash);
String pathTail = relativeOutputPath.substring(slash);
final JpsDirectoryPackagingElement root = createDirectory(rootName);
final JpsCompositePackagingElement last = getOrCreateDirectoryOrArchive(root, pathTail, true);
last.addChild(element);
return root;
}
@Override
public JpsCompositePackagingElement getOrCreateDirectory(@NotNull JpsCompositePackagingElement root, @NotNull String path) {
return getOrCreateDirectoryOrArchive(root, path, true);
}
@Override
public JpsCompositePackagingElement getOrCreateArchive(@NotNull JpsCompositePackagingElement root, @NotNull String path) {
return getOrCreateDirectoryOrArchive(root, path, false);
}
@NotNull
private JpsCompositePackagingElement getOrCreateDirectoryOrArchive(@NotNull JpsCompositePackagingElement root,
@NotNull @NonNls String path, final boolean directory) {
path = StringUtil.trimStart(StringUtil.trimEnd(path, "/"), "/");
if (path.length() == 0) {
return root;
}
int index = path.lastIndexOf('/');
String lastName = path.substring(index + 1);
String parentPath = index != -1 ? path.substring(0, index) : "";
final JpsCompositePackagingElement parent = getOrCreateDirectoryOrArchive(root, parentPath, true);
final JpsCompositePackagingElement last = directory ? createDirectory(lastName) : createArchive(lastName);
return parent.addChild(last);
}
@Override
@NotNull
public JpsFileCopyPackagingElement createFileCopy(@NotNull String filePath, @Nullable String outputFileName) {
return new JpsFileCopyPackagingElementImpl(filePath, outputFileName);
}
@Override
@NotNull
public JpsExtractedDirectoryPackagingElement createExtractedDirectory(@NotNull String jarPath, @NotNull String pathInJar) {
return new JpsExtractedDirectoryPackagingElementImpl(jarPath, pathInJar);
}
@Override
@NotNull
public JpsDirectoryPackagingElement createDirectory(@NotNull String directoryName) {
return new JpsDirectoryPackagingElementImpl(directoryName);
}
@Override
@NotNull
public JpsArchivePackagingElement createArchive(@NotNull String archiveName) {
return new JpsArchivePackagingElementImpl(archiveName);
}
@Override
@NotNull
public JpsArtifactRootElement createArtifactRoot() {
return new JpsArtifactRootElementImpl();
}
@Override
@NotNull
public JpsLibraryFilesPackagingElement createLibraryElement(@NotNull JpsLibraryReference reference) {
return new JpsLibraryFilesPackagingElementImpl(reference);
}
@Override
@NotNull
public JpsArtifactOutputPackagingElement createArtifactOutput(@NotNull JpsArtifactReference reference) {
return new JpsArtifactOutputPackagingElementImpl(reference);
}
}