package com.github.masahirosuzuka.PhoneGapIntelliJPlugin.util;
import com.intellij.execution.configurations.PathEnvironmentVariableUtil;
import com.intellij.openapi.components.*;
import com.intellij.openapi.externalSystem.model.ProjectSystemId;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
/**
* PhoneGapSettings.java
* <p/>
* Created by Masahiro Suzuka on 2014/04/12.
*/
@SuppressWarnings("UnusedDeclaration")
@State(
name = "PhoneGapSettings",
storages = {@Storage(
file = StoragePathMacros.APP_CONFIG + "/phonegap.xml")})
public final class PhoneGapSettings implements PersistentStateComponent<PhoneGapSettings.State> {
// System ID
public static final ProjectSystemId PHONEGAP_SYSTEM_ID = new ProjectSystemId("PHONEGAP");
public static final ProjectSystemId CORDOVA_SYSTEM_ID = new ProjectSystemId("CORDOVA");
// External tools PATH
public static String NODEJS_PATH = "/usr/local/bin/node";
public static String ANDROID_SDK = "android";
public static String IOS_SIM = "ios-sim";
// PhoneGap PATH
public static String PHONEGAP_PATH = "/opt/local/bin/phonegap";
public static String CORDOVA_PATH = "/opt/local/bin/cordova";
// PhoneGap commands
public static String PHONEGAP_TASK = "run";
public static String PHONEGAP_PLATFORM_ANDROID = "android";
public static String PHONEGAP_PLATFORM_IOS = "ios";
public static String PHONEGAP_PLATFORM_WP = "windowsphone";
public static String PHONEGAP_PLATFORM_RIPPLE = "ripple";
public static String PHONEGAP_RELEASEBUILD = "--release";
public static String PHONEGAP_FOLDERS_CORDOVA = ".cordova";
public static String PHONEGAP_FOLDERS_HOOKS = "hooks";
public static String PHONEGAP_FOLDERS_MERGES = "merges";
public static String PHONEGAP_FOLDERS_NODE_MODULES = "node_modules";
public static String PHONEGAP_FOLDERS_PLATFORMS = "platforms";
public static String PHONEGAP_FOLDERS_PLUGINS = "plugins";
public static String PHONEGAP_FOLDERS_WWW = "www";
public static boolean isPhoneGapInstallded = false;
private static final PhoneGapSettings INSTANCE = new PhoneGapSettings();
public static class State {
public String phoneGapExecutablePath;
public String cordovaExecutablePath;
@SuppressWarnings("RedundantIfStatement")
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
State state = (State) o;
if (cordovaExecutablePath != null
? !cordovaExecutablePath.equals(state.cordovaExecutablePath)
: state.cordovaExecutablePath != null)
return false;
if (phoneGapExecutablePath != null
? !phoneGapExecutablePath.equals(state.phoneGapExecutablePath)
: state.phoneGapExecutablePath != null)
return false;
return true;
}
@Override
public int hashCode() {
int result = phoneGapExecutablePath != null ? phoneGapExecutablePath.hashCode() : 0;
result = 31 * result + (cordovaExecutablePath != null ? cordovaExecutablePath.hashCode() : 0);
return result;
}
}
public static PhoneGapSettings getInstance() {
return ServiceManager.getService(PhoneGapSettings.class);
}
private State myState = new State();
private volatile boolean isDetected = false;
@NotNull
@Override
public State getState() {
detectDefaultPaths();
return myState;
}
@Override
public void loadState(State state) {
myState = state;
}
public boolean isCordovaAvailable() {
return !StringUtil.isEmpty(getCordovaExecutablePath());
}
public boolean isPhoneGapAvailable() {
return !StringUtil.isEmpty(getPhoneGapExecutablePath());
}
@Nullable
public String getCordovaExecutablePath() {
detectDefaultPaths();
return myState.cordovaExecutablePath;
}
@Nullable
public String getPhoneGapExecutablePath() {
detectDefaultPaths();
return myState.phoneGapExecutablePath;
}
private void detectDefaultPaths() {
if (isDetected) {
return;
}
if (!StringUtil.isEmpty(myState.cordovaExecutablePath) || !StringUtil.isEmpty(myState.phoneGapExecutablePath)) {
isDetected = true;
return;
}
File cordova = PathEnvironmentVariableUtil.findInPath(SystemInfo.isWindows ? "cordova.cmd" : "cordova");
File phoneGap = PathEnvironmentVariableUtil.findInPath(SystemInfo.isWindows ? "phonegap.cmd" : "phonegap");
State state = new State();
if (cordova != null && cordova.exists()) {
state.cordovaExecutablePath = cordova.getAbsolutePath();
}
if (phoneGap != null && phoneGap.exists()) {
state.phoneGapExecutablePath = phoneGap.getAbsolutePath();
}
myState = state;
isDetected = true;
}
}