/* * Copyright (C) 2015 RoboVM AB * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/gpl-2.0.html>. */ package org.robovm.idea.interfacebuilder; import com.intellij.openapi.compiler.CompilerPaths; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.OrderEnumerator; import org.robovm.idea.RoboVmPlugin; import java.io.File; import java.util.*; /** * Created by badlogic on 07/04/15. */ public class IBIntegratorManager { private static boolean hasIBIntegrator; private static IBIntegratorManager instance; private Map<String, IBIntegratorProxy> daemons = new HashMap<String, IBIntegratorProxy>(); static { try { IBIntegratorProxy.getIBIntegratorClass(); hasIBIntegrator = true; } catch (Throwable t) { hasIBIntegrator = false; RoboVmPlugin.logWarn(null, t.getMessage()); } } public static IBIntegratorManager getInstance() { if (instance == null) { instance = new IBIntegratorManager(); } return instance; } public void moduleChanged(Module module) { if (!hasIBIntegrator || !System.getProperty("os.name").toLowerCase().contains("mac os x")) { return; } String moduleId = getModuleId(module); IBIntegratorProxy proxy = daemons.get(moduleId); if(proxy == null) { try { File buildDir = RoboVmPlugin.getModuleXcodeDir(module); RoboVmPlugin.logInfo(module.getProject(), "Starting Interface Builder integrator daemon for module %s", moduleId); proxy = new IBIntegratorProxy(RoboVmPlugin.getRoboVmHome(), RoboVmPlugin.getLogger(module.getProject()), moduleId, buildDir); proxy.start(); daemons.put(moduleId, proxy); } catch (Throwable e) { RoboVmPlugin.logWarn(module.getProject(), "Failed to start Interface Builder integrator for module " + module.getName() + ": " + e.getMessage()); } } if(proxy != null) { // set the classpath, excluding module output paths OrderEnumerator classes = ModuleRootManager.getInstance(module).orderEntries().recursively().withoutSdk().compileOnly().productionOnly(); List<File> classPaths = new ArrayList<File>(); for(String path: classes.getPathsList().getPathList()) { classPaths.add(new File(path)); } proxy.setClasspath(classPaths); // set the source paths Set<File> moduleOutputPaths = new HashSet<File>(); for(Module dep: ModuleRootManager.getInstance(module).getDependencies(false)) { moduleOutputPaths.add(new File(CompilerPaths.getModuleOutputPath(dep, false))); } moduleOutputPaths.add(new File(CompilerPaths.getModuleOutputPath(module, false))); // we need to create the dirs here as they // may not have been generated by IDEA yet for(File file: moduleOutputPaths) { file.mkdirs(); } proxy.setSourceFolders(moduleOutputPaths); // set the resource paths proxy.setResourceFolders(RoboVmPlugin.getModuleResourcePaths(module)); // set the plist file location File infoPlist = RoboVmPlugin.getModuleInfoPlist(module); if(infoPlist != null) { proxy.setInfoPlist(infoPlist); } } } public void removeAllDaemons() { if (!hasIBIntegrator || !System.getProperty("os.name").toLowerCase().contains("mac os x")) { return; } for(IBIntegratorProxy daemon: daemons.values()) { daemon.shutDown(); } daemons.clear(); RoboVmPlugin.logInfo(null, "Stopping all Interface Builder integrator daemons"); } public IBIntegratorProxy getProxy(Module module) { return daemons.get(getModuleId(module)); } public static String getModuleId(Module module) { if(module.getProject().getName().equals(module.getName())) { return module.getName(); } else { return module.getProject().getName() + "." + module.getName(); } } }