/* JSmooth: a VM wrapper toolkit for Windows Copyright (C) 2003-2007 Rodrigo Reyes This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "SunJVMExe.h" #include #include #include "Process.h" #include "FileUtils.h" SunJVMExe::SunJVMExe(const std::string& jrehome) { m_jrehome = jrehome; } SunJVMExe::SunJVMExe(const std::string& jrehome, const Version& v) { m_jrehome = jrehome; m_version = v; } bool SunJVMExe::run(const std::string& mainclass, bool useconsole) { if (!m_version.isValid()) { m_version = guessVersion(); } if (!m_version.isValid()) return false; std::vector execv; execv.push_back(StringUtils::requoteForCommandLine(lookUpExecutable(useconsole))); if (m_vmParameter != "") { std::vector vmParameter = StringUtils::split(m_vmParameter, " ", " ", false); for (std::vector::iterator i=vmParameter.begin(); i != vmParameter.end(); i++) { execv.push_back(*i); } } if (m_maxHeap > 0) { if ((m_version.getMajor()==1)&&(m_version.getMinor()==1)) execv.push_back("-mx" + StringUtils::toString(m_maxHeap)); else execv.push_back("-Xmx" + StringUtils::toString(m_maxHeap)); } if (m_initialHeap > 0) { if ((m_version.getMajor()==1)&&(m_version.getMinor()==1)) execv.push_back("-ms" + StringUtils::toString(m_initialHeap)); else execv.push_back("-Xms" + StringUtils::toString(m_initialHeap)); } for (int i=0; i"); Process proc(execmd, useconsole); if (proc.run()) { DEBUG("Started successfully"); proc.join(); m_exitCode = proc.getExitCode(); return true; } else { DEBUG("Failed running " + execmd); } return false; } std::string SunJVMExe::lookUpExecutable(bool useconsole) { std::string java; if (m_jrehome.size() == 0) { return useconsole?"java.exe":"javaw.exe"; } if (useconsole) { if (FileUtils::fileExists(m_jrehome, "bin\\java.exe")) java = FileUtils::concFile(m_jrehome, "bin\\java.exe"); else if (FileUtils::fileExists(m_jrehome, "bin\\jre.exe")) java = FileUtils::concFile(m_jrehome, "bin\\jre.exe"); else { std::vector javas = FileUtils::recursiveSearch(m_jrehome, "java.exe"); DEBUG("REC: " + StringUtils::toString(javas)); if (javas.size() == 0) javas = FileUtils::recursiveSearch(m_jrehome, "jre.exe"); if (javas.size() > 0) java = javas[0]; } } else { if (FileUtils::fileExists(m_jrehome, "bin\\javaw.exe")) java = FileUtils::concFile(m_jrehome, "bin\\javaw.exe"); else if (FileUtils::fileExists(m_jrehome, "bin\\jrew.exe")) java = FileUtils::concFile(m_jrehome, "bin\\jrew.exe"); else { std::vector javas = FileUtils::recursiveSearch(m_jrehome, "javaw.exe"); DEBUG("REC: " + StringUtils::toString(javas)); if (javas.size() == 0) javas = FileUtils::recursiveSearch(m_jrehome, "jrew.exe"); if (javas.size() > 0) java = javas[0]; } } return java; } Version SunJVMExe::guessVersion() { std::string exepath = lookUpExecutable(true); string exeline = exepath + " -version"; Version result; // Return immediatly if the exe does not exist if (!FileUtils::fileExists(exepath)) return result; string tmpfilename = FileUtils::createTempFileName(".tmp"); Process proc(exeline, true); proc.setRedirect(tmpfilename); proc.run(); proc.join(); std::string voutput = FileUtils::readFile(tmpfilename); vector split = StringUtils::split(voutput, " \t\n\r", "\""); for (vector::iterator i=split.begin(); i != split.end(); i++) { Version v(*i); if (v.isValid()) { result = v; break; } } FileUtils::deleteOnReboot(tmpfilename); return result; } std::string SunJVMExe::getClassPath(bool full) { std::vector cp; for (std::vector::const_iterator i=m_pathElements.begin(); i!=m_pathElements.end(); i++) cp.push_back(*i); if (full) { std::string javaexe = lookUpExecutable(true); std::string home = FileUtils::getParent( FileUtils::getParent( javaexe )); if (FileUtils::fileExists(home)) { vector cpzips = FileUtils::recursiveSearch(home, "*.zip"); cp.insert(cp.end(), cpzips.begin(), cpzips.end()); vector cpjars = FileUtils::recursiveSearch(home, "*.jar"); cp.insert(cp.end(), cpjars.begin(), cpjars.end()); } } return StringUtils::join(cp, ";"); } int SunJVMExe::getExitCode() { return m_exitCode; }