/******************************************************************************* * Copyright (c) 2005-2011 Vlad Dumitrescu and others. All rights reserved. This program * and the accompanying materials are made available under the terms of the Eclipse Public * License v1.0 which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: Vlad Dumitrescu *******************************************************************************/ package org.erlide.backend.internal; import java.io.File; import org.eclipse.jdt.annotation.NonNull; import org.erlide.backend.BackendCore; import org.erlide.backend.BackendUtils; import org.erlide.backend.api.BackendData; import org.erlide.backend.api.IBackend; import org.erlide.backend.api.IBackendFactory; import org.erlide.backend.api.IBackendManager; import org.erlide.backend.api.ICodeBundle.CodeContext; import org.erlide.runtime.OtpNodeProxyProvider; import org.erlide.runtime.api.IOtpNodeProxy; import org.erlide.runtime.runtimeinfo.IRuntimeInfoCatalog; import org.erlide.runtime.runtimeinfo.RuntimeInfo; import org.erlide.util.ErlLogger; import org.erlide.util.HostnameChecker; import org.erlide.util.SystemConfiguration; public class BackendFactory implements IBackendFactory { final IRuntimeInfoCatalog runtimeInfoCatalog; public BackendFactory(final IRuntimeInfoCatalog runtimeInfoManager) { runtimeInfoCatalog = runtimeInfoManager; } @Override public IBackend createIdeBackend() { final BackendData data = getIdeBackendData(); ErlLogger.debug("Create ide backend " + data.getRuntimeInfo().getVersion()); final IBackend backend = createBackend(data); return backend; } @Override public synchronized IBackend createBuildBackend(final RuntimeInfo info) { ErlLogger.debug("Create build backend " + info.getVersion().asMajor().toString()); final IBackend backend = createBackend(getBuildBackendData(info)); return backend; } @Override public synchronized IBackend createBackend(final BackendData data) { ErlLogger.debug("Create backend " + data.getNodeName()); final IBackend b; final IOtpNodeProxy runtime = createNodeProxy(data); final IBackendManager backendManager = BackendCore.getBackendManager(); b = data.isInternal() ? new Backend(data, runtime, backendManager) : new ExternalBackend(data, runtime, backendManager); b.initialize(data.getContext(), backendManager.getCodeBundles()); runtime.ensureRunning(); return b; } @Override @NonNull public IOtpNodeProxy createNodeProxy(final BackendData data) { final IOtpNodeProxy result = OtpNodeProxyProvider.get(data); return result; } private BackendData getIdeBackendData() { final RuntimeInfo info = getIdeRuntimeInfo(); final BackendData result = new BackendData(info); result.setNodeName(getIdeNodeName()); result.setDebug(false); result.setConsole(SystemConfiguration.getInstance().isDeveloper()); result.setManaged(true); result.setRestartable(true); result.setLongName(SystemConfiguration.hasFeatureEnabled("erlide.shortname") ? false : HostnameChecker.getInstance().canUseLongNames()); result.setInternal(true); result.setReportErrors(true); result.setContext(CodeContext.IDE); return result; } private BackendData getBuildBackendData(final @NonNull RuntimeInfo info) { final RuntimeInfo myinfo = new RuntimeInfo(info); final BackendData result = new BackendData(myinfo); result.setNodeName(info.getVersion().asMajor().toString() + "_" + BackendUtils.getErlideNodeNameTag()); result.setCookie("erlide"); result.setRestartable(true); result.setDebug(false); result.setManaged(true); result.setConsole(false); result.setLongName(HostnameChecker.getInstance().canUseLongNames()); result.setInternal(true); result.setReportErrors(true); result.setContext(CodeContext.IDE); return result; } private RuntimeInfo getIdeRuntimeInfo() { final RuntimeInfo runtime = runtimeInfoCatalog.getErlideRuntime(); if (runtime != null && runtimeHomeDirExists(runtime)) { return new RuntimeInfo(runtime); } for (final RuntimeInfo aruntime : runtimeInfoCatalog.getRuntimes()) { if (aruntime != null && runtimeHomeDirExists(aruntime)) { return new RuntimeInfo(aruntime); } } return null; } private boolean runtimeHomeDirExists(final RuntimeInfo runtime) { if (runtime == null) { return false; } final String otpHome = runtime.getOtpHome(); return otpHome != null && new File(otpHome).exists(); } private String getIdeNodeName() { final String dflt = BackendUtils.getErlideNodeNameTag() + "_erlide"; return getLabelProperty(dflt); } private static String getLabelProperty(final String dflt) { return System.getProperty("erlide.label", dflt); } }