blob: 5430b863fcd81aaa797d6ebd778069c00e360d36 [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.conversion.impl;
import com.intellij.conversion.*;
import com.intellij.openapi.components.StorageScheme;
import java.io.File;
import java.util.*;
/**
* @author nik
*/
public class ConversionRunner {
private final ConverterProvider myProvider;
private final ConversionContextImpl myContext;
private final ConversionProcessor<ModuleSettings> myModuleFileConverter;
private final ConversionProcessor<ProjectSettings> myProjectFileConverter;
private final ConversionProcessor<WorkspaceSettings> myWorkspaceConverter;
private boolean myProcessProjectFile;
private boolean myProcessWorkspaceFile;
private boolean myProcessRunConfigurations;
private boolean myProcessProjectLibraries;
private boolean myArtifacts;
private final List<File> myModulesFilesToProcess = new ArrayList<File>();
private final ProjectConverter myConverter;
private final ConversionProcessor<RunManagerSettings> myRunConfigurationsConverter;
private final ConversionProcessor<ProjectLibrariesSettings> myProjectLibrariesConverter;
private final ConversionProcessor<ArtifactsSettings> myArtifactsConverter;
public ConversionRunner(ConverterProvider provider, ConversionContextImpl context) {
myProvider = provider;
myContext = context;
myConverter = provider.createConverter(context);
myModuleFileConverter = myConverter.createModuleFileConverter();
myProjectFileConverter = myConverter.createProjectFileConverter();
myWorkspaceConverter = myConverter.createWorkspaceFileConverter();
myRunConfigurationsConverter = myConverter.createRunConfigurationsConverter();
myProjectLibrariesConverter = myConverter.createProjectLibrariesConverter();
myArtifactsConverter = myConverter.createArtifactsConverter();
}
public boolean isConversionNeeded() throws CannotConvertException {
if (myContext.isConversionAlreadyPerformed(myProvider)) return false;
myProcessProjectFile = myContext.getStorageScheme() == StorageScheme.DEFAULT && myProjectFileConverter != null
&& myProjectFileConverter.isConversionNeeded(myContext.getProjectSettings());
myProcessWorkspaceFile = myWorkspaceConverter != null && myContext.getWorkspaceFile().exists()
&& myWorkspaceConverter.isConversionNeeded(myContext.getWorkspaceSettings());
myModulesFilesToProcess.clear();
if (myModuleFileConverter != null) {
for (File moduleFile : myContext.getModuleFiles()) {
if (moduleFile.exists() && myModuleFileConverter.isConversionNeeded(myContext.getModuleSettings(moduleFile))) {
myModulesFilesToProcess.add(moduleFile);
}
}
}
myProcessRunConfigurations = myRunConfigurationsConverter != null
&& myRunConfigurationsConverter.isConversionNeeded(myContext.getRunManagerSettings());
myProcessProjectLibraries = myProjectLibrariesConverter != null
&& myProjectLibrariesConverter.isConversionNeeded(myContext.getProjectLibrariesSettings());
myArtifacts = myArtifactsConverter != null
&& myArtifactsConverter.isConversionNeeded(myContext.getArtifactsSettings());
return myProcessProjectFile ||
myProcessWorkspaceFile ||
myProcessRunConfigurations ||
myProcessProjectLibraries ||
!myModulesFilesToProcess.isEmpty() ||
myConverter.isConversionNeeded();
}
public boolean isModuleConversionNeeded(File moduleFile) throws CannotConvertException {
return myModuleFileConverter != null && myModuleFileConverter.isConversionNeeded(myContext.getModuleSettings(moduleFile));
}
public Collection<File> getCreatedFiles() {
return myConverter.getCreatedFiles();
}
public Set<File> getAffectedFiles() {
Set<File> affectedFiles = new HashSet<File>();
if (myProcessProjectFile) {
affectedFiles.add(myContext.getProjectFile());
}
if (myProcessWorkspaceFile) {
affectedFiles.add(myContext.getWorkspaceFile());
}
affectedFiles.addAll(myModulesFilesToProcess);
try {
if (myProcessRunConfigurations) {
affectedFiles.addAll(myContext.getRunManagerSettings().getAffectedFiles());
}
if (myProcessProjectLibraries) {
affectedFiles.addAll(myContext.getProjectLibrariesSettings().getAffectedFiles());
}
if (myArtifacts) {
affectedFiles.addAll(myContext.getArtifactsSettings().getAffectedFiles());
}
}
catch (CannotConvertException ignored) {
}
if (!myProvider.canDetermineIfConversionAlreadyPerformedByProjectFiles()) {
final ComponentManagerSettings settings = myContext.getProjectFileVersionSettings();
if (settings != null) {
affectedFiles.add(settings.getFile());
}
}
affectedFiles.addAll(myConverter.getAdditionalAffectedFiles());
return affectedFiles;
}
public void preProcess() throws CannotConvertException {
if (myProcessProjectFile) {
myProjectFileConverter.preProcess(myContext.getProjectSettings());
}
if (myProcessWorkspaceFile) {
myWorkspaceConverter.preProcess(myContext.getWorkspaceSettings());
}
for (File moduleFile : myModulesFilesToProcess) {
myModuleFileConverter.preProcess(myContext.getModuleSettings(moduleFile));
}
if (myProcessRunConfigurations) {
myRunConfigurationsConverter.preProcess(myContext.getRunManagerSettings());
}
if (myProcessProjectLibraries) {
myProjectLibrariesConverter.preProcess(myContext.getProjectLibrariesSettings());
}
if (myArtifacts) {
myArtifactsConverter.preProcess(myContext.getArtifactsSettings());
}
myConverter.preProcessingFinished();
}
public void process() throws CannotConvertException {
if (myProcessProjectFile) {
myProjectFileConverter.process(myContext.getProjectSettings());
}
if (myProcessWorkspaceFile) {
myWorkspaceConverter.process(myContext.getWorkspaceSettings());
}
for (File moduleFile : myModulesFilesToProcess) {
myModuleFileConverter.process(myContext.getModuleSettings(moduleFile));
}
if (myProcessRunConfigurations) {
myRunConfigurationsConverter.process(myContext.getRunManagerSettings());
}
if (myProcessProjectLibraries) {
myProjectLibrariesConverter.process(myContext.getProjectLibrariesSettings());
}
if (myArtifacts) {
myArtifactsConverter.process(myContext.getArtifactsSettings());
}
myConverter.processingFinished();
}
public void postProcess() throws CannotConvertException {
if (myProcessProjectFile) {
myProjectFileConverter.postProcess(myContext.getProjectSettings());
}
if (myProcessWorkspaceFile) {
myWorkspaceConverter.postProcess(myContext.getWorkspaceSettings());
}
for (File moduleFile : myModulesFilesToProcess) {
myModuleFileConverter.postProcess(myContext.getModuleSettings(moduleFile));
}
if (myProcessRunConfigurations) {
myRunConfigurationsConverter.postProcess(myContext.getRunManagerSettings());
}
if (myProcessProjectLibraries) {
myProjectLibrariesConverter.postProcess(myContext.getProjectLibrariesSettings());
}
if (myArtifacts) {
myArtifactsConverter.postProcess(myContext.getArtifactsSettings());
}
myConverter.postProcessingFinished();
}
public ConverterProvider getProvider() {
return myProvider;
}
public static List<File> getReadOnlyFiles(final Collection<File> affectedFiles) {
List<File> result = new ArrayList<File>();
for (File file : affectedFiles) {
if (!file.canWrite()) {
result.add(file);
}
}
return result;
}
public void convertModule(File moduleFile) throws CannotConvertException {
final ModuleSettings settings = myContext.getModuleSettings(moduleFile);
myModuleFileConverter.preProcess(settings);
myModuleFileConverter.process(settings);
myModuleFileConverter.postProcess(settings);
}
}