/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* 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 net.java.sip.communicator.launcher;
import java.io.*;
import java.lang.reflect.*;
import java.net.*;
import java.util.*;
import java.util.jar.*;
import java.util.logging.*;
import net.java.sip.communicator.util.FileHandler;
import net.java.sip.communicator.util.*;
public class SIPCommunicatorJWS
{
public static void main(String[] args) throws Exception
{
// allow access to everything
System.setSecurityManager(null);
// optional: the name of another class with a main method
// that should be started in the same JVM:
String chainMain = System.getProperty("chain.main.class");
if(chainMain != null)
{
// optional: a space-separated list of arguments to be passed
// to the chained main() method:
String chainArgs = System.getProperty("chain.main.args");
if(chainArgs == null)
{
chainArgs = "";
}
final String[] _chainArgs = chainArgs.split("\\s");
try
{
Class c = Class.forName(chainMain);
final Method m = c.getMethod("main",
new Class[] {_chainArgs.getClass()});
new Thread()
{
public void run()
{
try
{
m.invoke(null, new Object[]{_chainArgs});
}
catch (Exception ex)
{
ex.printStackTrace();
System.err.println("Exception running the " +
"chained main class, will continue anyway.");
}
}
}.start();
}
catch (Exception ex)
{
ex.printStackTrace();
System.err.println("Exception finding the chained main " +
"class, will continue anyway.");
}
}
// prepare the logger
// needed by the FileHandler-Logger
SIPCommunicator.setScHomeDir(System.getProperty("os.name"));
LogManager.getLogManager()
.readConfiguration(
SIPCommunicatorJWS.class
.getResourceAsStream("/logging.properties"));
Handler[] hs = LogManager.getLogManager().getLogger("").getHandlers();
for (int i = 0; i < hs.length; i++)
LogManager.getLogManager().getLogger("").removeHandler(hs[i]);
LogManager.getLogManager().getLogger("").addHandler(new FileHandler());
LogManager.getLogManager().getLogger("")
.addHandler(new ConsoleHandler());
Handler[] h = LogManager.getLogManager().getLogger("").getHandlers();
for (int i = 0; i < h.length; i++)
h[i].setFormatter(new ScLogFormatter());
// be evil :-)
// find the path of the nativelibs under webstart (findLibrary is
// protected and therefore at least documented api)
Method findLibrary =
SIPCommunicatorJWS.class.getClassLoader().getClass()
.getDeclaredMethod("findLibrary", new Class[] {String.class});
findLibrary.setAccessible(true);
File path =
new File((String) findLibrary.invoke(
SIPCommunicatorJWS.class.getClassLoader(),
new Object[] {"hid"})).getParentFile();
System.setProperty(
"java.library.path",
System.getProperty("java.library.path") + File.pathSeparator
+ path.getAbsolutePath());
// reset sys_paths to re-read usr_paths (runtime-dependent and therefore
// very very ugly :()
Field sys_paths = ClassLoader.class.getDeclaredField("sys_paths");
sys_paths.setAccessible(true);
sys_paths.set(null, null);
// prepare the felix-config with the absolute paths
Properties pIn = new Properties();
Properties pOut = new Properties();
pIn.load(SIPCommunicatorJWS.class.getResourceAsStream(System
.getProperty("felix.config.properties")));
String baseServerUrl =
System.getProperty("net.java.sip.communicator.SC_JWS_BASEDIR");
ClassLoader cl = SIPCommunicatorJWS.class.getClassLoader();
Method getJarFile =
cl.getClass().getDeclaredMethod("getJarFile",
new Class[] {URL.class});
getJarFile.setAccessible(true);
Iterator propIt = pIn.entrySet().iterator();
while (propIt.hasNext())
{
Map.Entry e = (Map.Entry) propIt.next();
if (((String) e.getKey()).startsWith("felix.auto.start."))
{
String[] refs = ((String) e.getValue()).split("\\s");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < refs.length; i++)
{
String ref = refs[i];
JarFile localFile =
(JarFile) getJarFile.invoke(cl, new Object[] {
new URL(baseServerUrl + ref.replace("@URL@", ""))});
if (localFile != null)
{
String localFileName =
new File(localFile.getName()).toURI().toString();
sb.append("reference:");
sb.append(localFileName);
sb.append(" ");
}
else
{
throw new Exception("ref <" + ref
+ "> not found in cache");
}
}
pOut.put(e.getKey(), sb.toString());
}
else
{
pOut.put(e.getKey(), e.getValue());
}
}
File jwsFelixConfig = File.createTempFile("jws", ".properties");
jwsFelixConfig.deleteOnExit();
pOut.store(new FileOutputStream(jwsFelixConfig),
"--- autogenerated, do not edit! ---");
System.setProperty("felix.config.properties", jwsFelixConfig.toURI()
.toString());
// Workaround broken desktop shortcut in ubuntu linux:
// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6957030
try
{
if (System.getProperty("os.name").equals("Linux"))
{
File desktop =
new File(System.getProperty("user.home") + "/Desktop");
File[] files = desktop.listFiles();
for (int i = 0; i < files.length; i++)
{
File file = files[i];
if (file.getName().contains("jws_app_shortcut_"))
{
file.setExecutable(true, false);
}
}
}
}
catch (Exception e)
{
}
// Handle the "-open" argument from the javaws command line
Vector _args = new Vector();
for(int i = 0; i < args.length ; i++)
{
String arg = args[i];
if(arg.equalsIgnoreCase("-open"))
{
// are we at the last argument or is the next value
// some other option flag?
if(i == (args.length - 1) ||
(args[i+1].length() > 0 &&
"-/".indexOf(args[i+1].charAt(0))>=0))
{
// invalid, can't use "-open" as final argument
System.err.println("Command line argument '-open'"
+ " requires a parameter, usually a URI");
System.exit(1);
}
}
else
{
_args.add(arg);
}
}
// launch the original app
SIPCommunicator.main((String[])_args.toArray(new String[_args.size()]));
}
}