package com.intellij.lang.javascript.flex.run;
import com.intellij.execution.configurations.RuntimeConfigurationError;
import com.intellij.flex.FlexCommonBundle;
import com.intellij.lang.javascript.flex.FlexBundle;
import com.intellij.lang.javascript.flex.FlexModuleType;
import com.intellij.lang.javascript.flex.actions.airpackage.DeviceInfo;
import com.intellij.lang.javascript.flex.projectStructure.model.FlexBuildConfiguration;
import com.intellij.lang.javascript.flex.projectStructure.model.FlexBuildConfigurationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.util.Pair;
import com.intellij.util.Function;
import com.intellij.util.xmlb.annotations.Transient;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.Map;
public class BCBasedRunnerParameters implements Cloneable {
@NotNull private String myModuleName = "";
@NotNull private String myBCName = "";
@Nullable private DeviceInfo myDeviceInfo;
@NotNull
public String getModuleName() {
return myModuleName;
}
public void setModuleName(@NotNull final String moduleName) {
myModuleName = moduleName;
}
@NotNull
public String getBCName() {
return myBCName;
}
public void setBCName(@NotNull final String BCName) {
myBCName = BCName;
}
@Transient
@Nullable
public DeviceInfo getDeviceInfo() {
return myDeviceInfo;
}
public void setDeviceInfo(@Nullable final DeviceInfo deviceInfo) {
myDeviceInfo = deviceInfo;
}
public Pair<Module, FlexBuildConfiguration> checkAndGetModuleAndBC(final Project project) throws RuntimeConfigurationError {
if (myModuleName.isEmpty() || myBCName.isEmpty()) {
throw new RuntimeConfigurationError(FlexBundle.message("bc.not.specified"));
}
final Module module = ModuleManager.getInstance(project).findModuleByName(myModuleName);
if (module == null || !(ModuleType.get(module) instanceof FlexModuleType)) {
throw new RuntimeConfigurationError(FlexBundle.message("bc.not.specified"));
}
final FlexBuildConfiguration bc = FlexBuildConfigurationManager.getInstance(module).findConfigurationByName(myBCName);
if (bc == null) {
throw new RuntimeConfigurationError(FlexBundle.message("module.does.not.contain.bc", myModuleName, myBCName));
}
final Sdk sdk = bc.getSdk();
if (sdk == null) {
throw new RuntimeConfigurationError(FlexCommonBundle.message("sdk.not.set.for.bc.0.of.module.1", bc.getName(), module.getName()));
}
return Pair.create(module, bc);
}
protected BCBasedRunnerParameters clone() {
try {
return (BCBasedRunnerParameters)super.clone();
}
catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
final BCBasedRunnerParameters that = (BCBasedRunnerParameters)o;
if (!myBCName.equals(that.myBCName)) return false;
if (!myModuleName.equals(that.myModuleName)) return false;
return true;
}
public int hashCode() {
assert false;
return super.hashCode();
}
public void handleBuildConfigurationsRename(final Map<Pair<String, String>, String> renamedConfigs) {
for (Pair<String, String> oldModuleAndBc : renamedConfigs.keySet()) {
if (oldModuleAndBc.first.equals(myModuleName) && oldModuleAndBc.second.equals(myBCName)) {
myBCName = renamedConfigs.get(oldModuleAndBc);
break;
}
}
}
public void handleModulesRename(List<Module> modules, Function<Module, String> oldNameProvider) {
for (Module module : modules) {
String oldName = oldNameProvider.fun(module);
if (oldName.equals(myModuleName)) {
myModuleName = module.getName();
break;
}
}
}
}