/*
* Copyright 2010 Jon S Akhtar (Sylvanaar)
*
* 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.sylvanaar.idea.Lua.sdk;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ApplicationComponent;
import com.intellij.openapi.projectRoots.*;
import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.RootProvider;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
/**
* Created by IntelliJ IDEA.
* User: Jon S Akhtar
* Date: Aug 28, 2010
* Time: 11:43:09 AM
*/
public class KahluaSdk implements Sdk, ApplicationComponent {
public static final String NAME = "Kahlua";
private Sdk mySdk = null;
public static KahluaSdk getInstance() {
return ApplicationManager.getApplication().getComponent(KahluaSdk.class);
}
@Override
public SdkType getSdkType() {
return LuaSdkType.getInstance();
}
@Override
public String getName() {
return "Kahlua";
}
@Override
public String getVersionString() {
return "2";
}
@Override
public String getHomePath() {
return "";
}
@Override
public RootProvider getRootProvider() {
return mySdk.getRootProvider();
}
@Override
public SdkAdditionalData getSdkAdditionalData() {
return null;
}
@Override
public SdkModificator getSdkModificator() {
return mySdk.getSdkModificator();
}
@Override
public VirtualFile getHomeDirectory() {
return mySdk.getHomeDirectory();
}
@Override
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
@NotNull
@Override
public String getComponentName() {
return "Kahlua Virtual SDK";
}
@Override
public void initComponent() {
ProjectJdkTable pjt = ProjectJdkTable.getInstance();
mySdk = pjt.findJdk(KahluaSdk.NAME);
// try {
// if (Integer.parseInt(mySdk.getVersionString()) < 2) {
// pjt.removeJdk(mySdk);
// mySdk = null;
// }
// } catch (NumberFormatException e) {
// pjt.removeJdk(mySdk);
// mySdk = null;
// }
if (mySdk == null) {
mySdk = createMockSdk("", KahluaSdk.NAME);
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
ProjectJdkTable.getInstance().addJdk(mySdk);
}
});
} else {
final VirtualFile[] files = mySdk.getRootProvider().getFiles(OrderRootType.CLASSES);
final VirtualFile stdRoot = StdLibrary.getStdFileLocation();
final SdkModificator sdkModificator = mySdk.getSdkModificator();
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
boolean found = false;
for(VirtualFile file : files)
if (file.equals(stdRoot)) {
found = true;
}
if (!found)
sdkModificator.addRoot(stdRoot, OrderRootType.CLASSES);
}
});
sdkModificator.commitChanges();
}
}
@Override
public void disposeComponent() {
}
private static Sdk createMockSdk(String jdkHome, final String versionName) {
File jdkHomeFile = new File(jdkHome);
// if (!jdkHomeFile.exists()) return null;
final Sdk jdk = new ProjectJdkImpl(versionName, LuaSdkType.getInstance());
final SdkModificator sdkModificator = jdk.getSdkModificator();
String path = jdkHome.replace(File.separatorChar, '/');
sdkModificator.setHomePath(path);
sdkModificator.setVersionString(versionName); // must be set after home path, otherwise setting home path clears the version string
sdkModificator.addRoot(StdLibrary.getStdFileLocation(), OrderRootType.CLASSES);
sdkModificator.commitChanges();
return jdk;
}
//@Override
public <T> T getUserData(@NotNull Key<T> key) {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
// @Override
public <T> void putUserData(@NotNull Key<T> key, @Nullable T value) {
//To change body of implemented methods use File | Settings | File Templates.
}
}