package com.intellij.flex.model.bc.impl;
import com.intellij.flex.FlexCommonUtils;
import com.intellij.flex.model.bc.*;
import com.intellij.flex.model.sdk.JpsFlexmojosSdkType;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.ex.JpsElementChildRoleBase;
import org.jetbrains.jps.model.ex.JpsElementCollectionRole;
import org.jetbrains.jps.model.ex.JpsNamedCompositeElementBase;
import org.jetbrains.jps.model.library.sdk.JpsSdk;
import org.jetbrains.jps.model.module.JpsTypedModule;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
class JpsFlexBuildConfigurationImpl extends JpsNamedCompositeElementBase<JpsFlexBuildConfigurationImpl>
implements JpsFlexBuildConfiguration {
private static final JpsElementChildRoleBase<JpsFlexBuildConfiguration> ROLE = JpsElementChildRoleBase.create("flex build configuration");
static final JpsElementCollectionRole<JpsFlexBuildConfiguration> COLLECTION_ROLE = JpsElementCollectionRole.create(ROLE);
//private @NotNull String myName = UNNAMED;
private @NotNull TargetPlatform myTargetPlatform = BuildConfigurationNature.DEFAULT.targetPlatform;
private boolean myPureAs = BuildConfigurationNature.DEFAULT.pureAS;
private @NotNull OutputType myOutputType = BuildConfigurationNature.DEFAULT.outputType;
private @NotNull String myOptimizeFor = "";
private @NotNull String myMainClass = "";
private @NotNull String myOutputFileName = "";
private @NotNull String myOutputFolder = "";
private boolean myUseHtmlWrapper = false;
private @NotNull String myWrapperTemplatePath = "";
private @NotNull String myRLMs = "";
private @NotNull String myCssFilesToCompile = "";
private boolean mySkipCompile = false;
private boolean myTempBCForCompilation = false;
JpsFlexBuildConfigurationImpl(@NotNull final String name) {
super(name);
myContainer.setChild(JpsFlexDependenciesImpl.ROLE);
myContainer.setChild(JpsFlexCompilerOptionsRole.INSTANCE);
myContainer.setChild(JpsAirDesktopPackagingOptionsImpl.ROLE);
myContainer.setChild(JpsAndroidPackagingOptionsImpl.ROLE);
myContainer.setChild(JpsIosPackagingOptionsImpl.ROLE);
}
private JpsFlexBuildConfigurationImpl(final JpsFlexBuildConfigurationImpl original) {
super(original);
myTargetPlatform = original.myTargetPlatform;
myPureAs = original.myPureAs;
myOutputType = original.myOutputType;
myOptimizeFor = original.myOptimizeFor;
myMainClass = original.myMainClass;
myOutputFileName = original.myOutputFileName;
myOutputFolder = original.myOutputFolder;
myUseHtmlWrapper = original.myUseHtmlWrapper;
myWrapperTemplatePath = original.myWrapperTemplatePath;
myRLMs = original.myRLMs;
myCssFilesToCompile = original.myCssFilesToCompile;
mySkipCompile = original.mySkipCompile;
myTempBCForCompilation = original.myTempBCForCompilation;
}
@NotNull
public JpsFlexBuildConfigurationImpl createCopy() {
return new JpsFlexBuildConfigurationImpl(this);
}
public void applyChanges(@NotNull final JpsFlexBuildConfigurationImpl modified) {
super.applyChanges(modified);
// todo use setters & dispatch events
myTargetPlatform = modified.myTargetPlatform;
myPureAs = modified.myPureAs;
myOutputType = modified.myOutputType;
myOptimizeFor = modified.myOptimizeFor;
myMainClass = modified.myMainClass;
myOutputFileName = modified.myOutputFileName;
myOutputFolder = modified.myOutputFolder;
myUseHtmlWrapper = modified.myUseHtmlWrapper;
myWrapperTemplatePath = modified.myWrapperTemplatePath;
myRLMs = modified.myRLMs;
myCssFilesToCompile = modified.myCssFilesToCompile;
mySkipCompile = modified.mySkipCompile;
myTempBCForCompilation = modified.myTempBCForCompilation;
}
// -----------------------------------------
public JpsTypedModule<JpsFlexBuildConfigurationManager> getModule() {
return (JpsTypedModule<JpsFlexBuildConfigurationManager>)myParent.getParent().getParent();
}
@NotNull
public JpsFlexBCReference createReference() {
return new JpsFlexBCReferenceImpl(getName(), getModule().createReference());
}
@Override
@NotNull
public TargetPlatform getTargetPlatform() {
return myTargetPlatform;
}
@Override
public boolean isPureAs() {
return myPureAs;
}
@Override
@NotNull
public OutputType getOutputType() {
return myOutputType;
}
public void setOutputType(@NotNull final OutputType outputType) {
myOutputType = outputType;
}
@Override
@NotNull
public String getOptimizeFor() {
return myOptimizeFor;
}
public void setOptimizeFor(@NotNull final String optimizeFor) {
myOptimizeFor = optimizeFor;
}
@Override
@NotNull
public String getMainClass() {
return myMainClass;
}
public void setMainClass(@NotNull final String mainClass) {
myMainClass = mainClass;
}
@Override
@NotNull
public String getOutputFileName() {
return myOutputFileName;
}
public void setOutputFileName(@NotNull final String outputFileName) {
myOutputFileName = outputFileName;
}
@Override
@NotNull
public String getOutputFolder() {
return myOutputFolder;
}
public void setOutputFolder(@NotNull final String outputFolder) {
myOutputFolder = outputFolder;
}
@Override
public boolean isUseHtmlWrapper() {
return myUseHtmlWrapper;
}
public void setUseHtmlWrapper(final boolean useHtmlWrapper) {
myUseHtmlWrapper = useHtmlWrapper;
}
@Override
@NotNull
public String getWrapperTemplatePath() {
return myWrapperTemplatePath;
}
@Override
@NotNull
public Collection<RLMInfo> getRLMs() {
if (myRLMs.isEmpty()) return Collections.emptyList();
final List<String> entries = StringUtil.split(myRLMs, CompilerOptionInfo.LIST_ENTRIES_SEPARATOR);
final ArrayList<RLMInfo> result = new ArrayList<>(entries.size());
for (String entry : entries) {
final List<String> parts = StringUtil.split(entry, CompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR, true, false);
assert parts.size() == 3 : entry;
result.add(new RLMInfo(parts.get(0), parts.get(1), Boolean.valueOf(parts.get(2))));
}
return result;
}
public void setRLMs(@NotNull Collection<RLMInfo> rlms) {
if (rlms.isEmpty()) myRLMs = "";
myRLMs = StringUtil.join(rlms, info -> info.MAIN_CLASS +
CompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR +
info.OUTPUT_FILE +
CompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR +
info.OPTIMIZE, CompilerOptionInfo.LIST_ENTRIES_SEPARATOR);
}
@Override
@NotNull
public Collection<String> getCssFilesToCompile() {
if (myCssFilesToCompile.isEmpty()) return Collections.emptyList();
return StringUtil.split(myCssFilesToCompile, CompilerOptionInfo.LIST_ENTRIES_SEPARATOR);
}
public void setCssFilesToCompile(@NotNull Collection<String> cssFilesToCompile) {
myCssFilesToCompile = cssFilesToCompile.isEmpty() ? "" : StringUtil.join(cssFilesToCompile, CompilerOptionInfo.LIST_ENTRIES_SEPARATOR);
}
@Override
public boolean isSkipCompile() {
return mySkipCompile;
}
public void setSkipCompile(final boolean skipCompile) {
mySkipCompile = skipCompile;
}
@NotNull
public JpsFlexDependencies getDependencies() {
return myContainer.getChild(JpsFlexDependenciesImpl.ROLE);
}
@NotNull
public JpsFlexCompilerOptions getCompilerOptions() {
return myContainer.getChild(JpsFlexCompilerOptionsRole.INSTANCE);
}
@NotNull
@Override
public JpsAirDesktopPackagingOptions getAirDesktopPackagingOptions() {
return myContainer.getChild(JpsAirDesktopPackagingOptionsImpl.ROLE);
}
@NotNull
@Override
public JpsAndroidPackagingOptions getAndroidPackagingOptions() {
return myContainer.getChild(JpsAndroidPackagingOptionsImpl.ROLE);
}
@NotNull
@Override
public JpsIosPackagingOptions getIosPackagingOptions() {
return myContainer.getChild(JpsIosPackagingOptionsImpl.ROLE);
}
@Override
public Icon getIcon() {
return getNature().getIcon();
}
@Override
public String getShortText() {
return getName();
}
@Override
public String getDescription() {
return myOutputType.getShortText();
}
@Override
public String getActualOutputFilePath() {
final InfoFromConfigFile info = InfoFromConfigFile.getInfoFromConfigFile(getCompilerOptions().getAdditionalConfigFilePath());
final String outputFolderPath = FlexCommonUtils.isFlexUnitBC(this) ? myOutputFolder
: StringUtil.notNullize(info.getOutputFolderPath(), myOutputFolder);
final String outputFileName = myTempBCForCompilation ? myOutputFileName
: StringUtil.notNullize(info.getOutputFileName(), myOutputFileName);
return outputFolderPath + (outputFolderPath.isEmpty() ? "" : "/") + outputFileName;
}
/*
public boolean isEqual(FlexIdeBuildConfiguration bc) {
final FlexIdeBuildConfigurationImpl other = (FlexIdeBuildConfigurationImpl)bc;
if (!myAirDesktopPackagingOptions.isEqual(other.myAirDesktopPackagingOptions)) return false;
if (!myAndroidPackagingOptions.isEqual(other.myAndroidPackagingOptions)) return false;
if (!myCompilerOptions.isEqual(other.myCompilerOptions)) return false;
if (!myDependencies.isEqual(other.myDependencies)) return false;
if (!myIosPackagingOptions.isEqual(other.myIosPackagingOptions)) return false;
if (!other.myCssFilesToCompile.equals(myCssFilesToCompile)) return false;
if (!other.myMainClass.equals(myMainClass)) return false;
if (!other.myName.equals(myName)) return false;
if (!other.myOptimizeFor.equals(myOptimizeFor)) return false;
if (!other.myOutputFileName.equals(myOutputFileName)) return false;
if (!other.myOutputFolder.equals(myOutputFolder)) return false;
if (other.myOutputType != myOutputType) return false;
if (other.myPureAs != myPureAs) return false;
if (!other.myRLMs.equals(myRLMs)) return false;
if (other.mySkipCompile != mySkipCompile) return false;
if (other.myTargetPlatform != myTargetPlatform) return false;
if (other.myUseHtmlWrapper != myUseHtmlWrapper) return false;
if (!other.myWrapperTemplatePath.equals(myWrapperTemplatePath)) return false;
return true;
}
*/
@Override
public BuildConfigurationNature getNature() {
return new BuildConfigurationNature(myTargetPlatform, myPureAs, myOutputType);
}
@Nullable
public JpsSdk<?> getSdk() {
return getDependencies().getSdk();
}
public boolean isTempBCForCompilation() {
return myTempBCForCompilation;
}
void setTempBCForCompilation(final boolean tempBCForCompilation) {
myTempBCForCompilation = tempBCForCompilation;
}
/*
@Override
public void setNature(BuildConfigurationNature nature) {
myTargetPlatform = nature.targetPlatform;
myPureAs = nature.pureAS;
myOutputType = nature.outputType;
}
@Override
public void setTargetPlatform(@NotNull TargetPlatform targetPlatform) {
myTargetPlatform = targetPlatform;
}
@Override
public void setPureAs(boolean pureAs) {
myPureAs = pureAs;
}
@Override
public void setOutputType(@NotNull OutputType outputType) {
myOutputType = outputType;
}
@Override
public void setOptimizeFor(@NotNull String optimizeFor) {
myOptimizeFor = optimizeFor;
}
@Override
public void setMainClass(@NotNull String mainClass) {
myMainClass = mainClass;
}
@Override
public void setOutputFileName(@NotNull String outputFileName) {
myOutputFileName = outputFileName;
}
@Override
public void setOutputFolder(@NotNull String outputFolder) {
myOutputFolder = outputFolder;
}
@Override
public void setUseHtmlWrapper(boolean useHtmlWrapper) {
myUseHtmlWrapper = useHtmlWrapper;
}
@Override
public void setWrapperTemplatePath(@NotNull String wrapperTemplatePath) {
myWrapperTemplatePath = wrapperTemplatePath;
}
@Override
public void setRLMs(@NotNull Collection<RLMInfo> rlms) {
if (rlms.isEmpty()) myRLMs = "";
myRLMs = StringUtil.join(rlms, new Function<RLMInfo, String>() {
public String fun(final RLMInfo info) {
return info.MAIN_CLASS +
JpsCompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR +
info.OUTPUT_FILE +
JpsCompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR +
info.OPTIMIZE;
}
}, JpsCompilerOptionInfo.LIST_ENTRIES_SEPARATOR);
}
@Override
public void setCssFilesToCompile(@NotNull Collection<String> cssFilesToCompile) {
myCssFilesToCompile = cssFilesToCompile.isEmpty() ? "" : StringUtil.join(cssFilesToCompile, JpsCompilerOptionInfo.LIST_ENTRIES_SEPARATOR);
}
@Override
public void setSkipCompile(boolean skipCompile) {
mySkipCompile = skipCompile;
}
*/
@Override
public String toString() {
return getName() + ": " + getNature().toString();
}
@Override
public String getStatisticsEntry() {
StringBuilder s = new StringBuilder();
switch (myTargetPlatform) {
case Web:
s.append("Web");
break;
case Desktop:
s.append("Desktop");
break;
case Mobile:
s.append("Mobile");
if (getAndroidPackagingOptions().isEnabled() && getIosPackagingOptions().isEnabled()) {
s.append("(a+i)");
}
else if (getAndroidPackagingOptions().isEnabled()) {
s.append("(a)");
}
else if (getIosPackagingOptions().isEnabled()) {
s.append("(i)");
}
break;
default:
assert false : myTargetPlatform;
}
s.append(" ");
s.append(myPureAs ? "AS" : "Flex");
s.append(" ");
switch (myOutputType) {
case Application:
s.append("app");
break;
case Library:
s.append("lib");
break;
case RuntimeLoadedModule:
s.append("rlm");
break;
default:
assert false : myOutputType;
}
final JpsSdk<?> sdk = getSdk();
if (sdk != null && sdk.getSdkType() == JpsFlexmojosSdkType.INSTANCE) {
s.append(" (mvn)");
}
return s.toString();
}
JpsFlexBCState getState() {
final JpsFlexBCState state = new JpsFlexBCState();
state.DEPENDENCIES = ((JpsFlexDependenciesImpl)getContainer().getChild(JpsFlexDependenciesImpl.ROLE)).getState();
state.COMPILER_OPTIONS = ((JpsFlexCompilerOptionsImpl)getContainer().getChild(JpsFlexCompilerOptionsRole.INSTANCE)).getState();
state.AIR_DESKTOP_PACKAGING_OPTIONS =
((JpsAirDesktopPackagingOptionsImpl)getContainer().getChild(JpsAirDesktopPackagingOptionsImpl.ROLE)).getState();
state.ANDROID_PACKAGING_OPTIONS =
((JpsAndroidPackagingOptionsImpl)getContainer().getChild(JpsAndroidPackagingOptionsImpl.ROLE)).getState();
state.IOS_PACKAGING_OPTIONS = ((JpsIosPackagingOptionsImpl)getContainer().getChild(JpsIosPackagingOptionsImpl.ROLE)).getState();
state.NAME = getName();
state.TARGET_PLATFORM = myTargetPlatform;
state.PURE_ACTION_SCRIPT = myPureAs;
state.OUTPUT_TYPE = myOutputType;
//state.OPTIMIZE_FOR = myOptimizeFor;
state.MAIN_CLASS = myMainClass;
state.OUTPUT_FILE_NAME = myOutputFileName;
state.OUTPUT_FOLDER = myOutputFolder;
state.USE_HTML_WRAPPER = myUseHtmlWrapper;
state.WRAPPER_TEMPLATE_PATH = myWrapperTemplatePath;
state.RLMS = myRLMs;
state.CSS_FILES_TO_COMPILE = myCssFilesToCompile; //collapsePaths(componentManager, myCssFilesToCompile);
state.SKIP_COMPILE = mySkipCompile;
return state;
}
void loadState(final JpsFlexBCState state) {
((JpsFlexDependenciesImpl)getContainer().getChild(JpsFlexDependenciesImpl.ROLE)).loadState(state.DEPENDENCIES);
((JpsFlexCompilerOptionsImpl)getContainer().getChild(JpsFlexCompilerOptionsRole.INSTANCE)).loadState(state.COMPILER_OPTIONS);
((JpsAirDesktopPackagingOptionsImpl)getContainer().getChild(JpsAirDesktopPackagingOptionsImpl.ROLE))
.loadState(state.AIR_DESKTOP_PACKAGING_OPTIONS);
((JpsAndroidPackagingOptionsImpl)getContainer().getChild(JpsAndroidPackagingOptionsImpl.ROLE))
.loadState(state.ANDROID_PACKAGING_OPTIONS);
((JpsIosPackagingOptionsImpl)getContainer().getChild(JpsIosPackagingOptionsImpl.ROLE)).loadState(state.IOS_PACKAGING_OPTIONS);
//setName(state.NAME); already set via constructor
myTargetPlatform = state.TARGET_PLATFORM;
myPureAs = state.PURE_ACTION_SCRIPT;
myOutputType = state.OUTPUT_TYPE;
//myOptimizeFor = state.OPTIMIZE_FOR;
myMainClass = state.MAIN_CLASS;
myOutputFileName = state.OUTPUT_FILE_NAME;
myOutputFolder = state.OUTPUT_FOLDER;
myUseHtmlWrapper = state.USE_HTML_WRAPPER;
myWrapperTemplatePath = state.WRAPPER_TEMPLATE_PATH;
myRLMs = state.RLMS;
// no need in expanding paths, it is done automatically even if macros is not in the beginning of the string
myCssFilesToCompile = state.CSS_FILES_TO_COMPILE;
mySkipCompile = state.SKIP_COMPILE;
}
/*
static String collapsePaths(final @Nullable ComponentManager componentManager, final String value) {
if (componentManager == null) return value;
if (!value.contains(JpsCompilerOptionInfo.LIST_ENTRIES_SEPARATOR) && !value.contains(JpsCompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR)) {
return value;
}
final StringBuilder result = new StringBuilder();
final PathMacroManager pathMacroManager = PathMacroManager.getInstance(componentManager);
final String delimiters = JpsCompilerOptionInfo.LIST_ENTRIES_SEPARATOR + JpsCompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR;
for (StringTokenizer tokenizer = new StringTokenizer(value, delimiters, true); tokenizer.hasMoreTokens(); ) {
String token = tokenizer.nextToken();
if (token.length() > 1) {
token = pathMacroManager.collapsePath(token);
}
result.append(token);
}
return result.toString();
}
*/
}