/******************************************************************************* * Copyright (c) 2000, 2012 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.internal.ui.macbundler; import java.io.*; import java.util.*; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.util.*; import org.eclipse.core.runtime.ListenerList; import org.eclipse.debug.core.*; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate; class BundleDescription implements BundleAttributes { private static final String STUB= "/System/Library/Frameworks/JavaVM.framework/Versions/A/Resources/MacOS/JavaApplicationStub"; //$NON-NLS-1$ private static final String ICON= "/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Resources/GenericApp.icns"; //$NON-NLS-1$ private static Set<String> RUN_MODE; { RUN_MODE = new HashSet<String>(); RUN_MODE.add(ILaunchManager.RUN_MODE); } private ListenerList<IPropertyChangeListener> fListeners= new ListenerList<>(); private Properties fProperties= new Properties(); private List<ResourceInfo> fClassPath= new ArrayList<ResourceInfo>(); private List<ResourceInfo> fResources= new ArrayList<ResourceInfo>(); Properties fProperties2= new Properties(); BundleDescription() { clear(); } void clear() { fProperties.clear(); fClassPath.clear(); fResources.clear(); fProperties2.clear(); fProperties.put(SIGNATURE, "????"); //$NON-NLS-1$ fProperties.put(ICONFILE, ICON); } void addResource(ResourceInfo ri, boolean onClasspath) { if (onClasspath) fClassPath.add(ri); else fResources.add(ri); } boolean removeResource(ResourceInfo ri, boolean onClasspath) { if (onClasspath) return fClassPath.remove(ri); return fResources.remove(ri); } ResourceInfo[] getResources(boolean onClasspath) { if (onClasspath) return fClassPath.toArray(new ResourceInfo[fClassPath.size()]); return fResources.toArray(new ResourceInfo[fResources.size()]); } void addListener(IPropertyChangeListener listener) { fListeners.add(listener); } void removeListener(IPropertyChangeListener listener) { fListeners.remove(listener); } String get(String key) { return fProperties.getProperty(key); } public String get(String key, String dflt) { return fProperties.getProperty(key, dflt); } public boolean get(String key, boolean dflt) { Boolean v= (Boolean) fProperties.get(key); if (v == null) return dflt; return v.booleanValue(); } void setValue(String key, Object value) { fProperties.put(key, value); } private static AbstractJavaLaunchConfigurationDelegate getDelegate(ILaunchConfiguration lc) throws CoreException { ILaunchDelegate[] delegates = lc.getType().getDelegates(RUN_MODE); for (int i = 0; i < delegates.length; i++) { if (delegates[i].getDelegate() instanceof AbstractJavaLaunchConfigurationDelegate) { return (AbstractJavaLaunchConfigurationDelegate) delegates[i].getDelegate(); } } throw new CoreException(new Status(IStatus.ERROR, MacOSXUILaunchingPlugin.getUniqueIdentifier(), "Internal Error: missing Java launcher")); //$NON-NLS-1$ } void inititialize(ILaunchConfiguration lc) { AbstractJavaLaunchConfigurationDelegate lcd; try { lcd= getDelegate(lc); } catch (CoreException e) { return; } String appName= lc.getName(); fProperties.put(APPNAME, appName); fProperties.put(GETINFO, appName + Util.getString("BundleDescription.copyright.format")); //$NON-NLS-1$ try { fProperties.put(MAINCLASS, lcd.getMainTypeName(lc)); } catch (CoreException e) { fProperties.put(MAINCLASS, ""); //$NON-NLS-1$ } try { fProperties.put(ARGUMENTS, lcd.getProgramArguments(lc)); } catch (CoreException e) { fProperties.put(ARGUMENTS, ""); //$NON-NLS-1$ } String wd= null; try { wd= lcd.getWorkingDirectory(lc).getAbsolutePath(); // fProperties.put(WORKINGDIR, wd); //$NON-NLS-1$ } catch (CoreException e) { // fProperties.put(WORKINGDIR, ""); //$NON-NLS-1$ } try { fProperties.put(MAINCLASS, lcd.getMainTypeName(lc)); } catch (CoreException e) { fProperties.put(MAINCLASS, ""); //$NON-NLS-1$ } try { String[] classpath= lcd.getClasspath(lc); for (int i= 0; i < classpath.length; i++) addResource(new ResourceInfo(classpath[i]), true); } catch (CoreException e) { // } String vmOptions2= ""; //$NON-NLS-1$ String vmOptions= null; try { vmOptions= lcd.getVMArguments(lc); } catch (CoreException e) { // } if (vmOptions != null) { StringTokenizer st= new StringTokenizer(vmOptions); while (st.hasMoreTokens()) { String token= st.nextToken(); int pos= token.indexOf('='); if (pos > 2 && token.startsWith("-D")) { //$NON-NLS-1$ String key= token.substring(2, pos).trim(); String value= token.substring(pos+1).trim(); int l= value.length(); if (l >= 2 && value.charAt(0) == '"' && value.charAt(l-1) == '"') value= value.substring(1, l-1); if ("java.library.path".equals(key)) { //$NON-NLS-1$ addDllDir(wd, value); } else { fProperties2.put(key, value); } } else { vmOptions2= vmOptions2 + token + ' '; } } } fProperties.put(VMOPTIONS, vmOptions2); boolean isSWT= false; Iterator<ResourceInfo> iter= fResources.iterator(); while (iter.hasNext()) { ResourceInfo ri= iter.next(); if (ri.fPath.indexOf("libswt-carbon") >= 0) { //$NON-NLS-1$ isSWT= true; break; } } fProperties.put(USES_SWT, Boolean.valueOf(isSWT)); String launcher= null; if (isSWT) launcher= System.getProperty("org.eclipse.swtlauncher"); //$NON-NLS-1$ if (launcher == null) { setValue(JVMVERSION, "1.4*"); //$NON-NLS-1$ launcher= STUB; } setValue(LAUNCHER, launcher); IJavaProject p= null; try { p= lcd.getJavaProject(lc); } catch (CoreException e) { // ignore } if (p != null) fProperties.put(IDENTIFIER, p.getElementName()); else fProperties.put(IDENTIFIER, ""); //$NON-NLS-1$ fireChange(); } void fireChange() { PropertyChangeEvent e= new PropertyChangeEvent(this, ALL, null, null); for (IPropertyChangeListener listener : fListeners) { listener.propertyChange(e); } } private void addDllDir(String wd, String path) { File lib_dir; if (path.startsWith("../")) { //$NON-NLS-1$ lib_dir= new File(wd, path); } else { lib_dir= new File(path); } if (lib_dir.isDirectory()) { File[] dlls= lib_dir.listFiles(); for (int j= 0; j < dlls.length; j++) { try { String name= dlls[j].getCanonicalPath(); if (name.endsWith(".jnilib")) //$NON-NLS-1$ addResource(new ResourceInfo(name), false); } catch (IOException e) { // NeedWork Auto-generated catch block e.printStackTrace(); } } } } static boolean verify(ILaunchConfiguration lc) { String name= lc.getName(); if (name.indexOf("jpage") >= 0) //$NON-NLS-1$ return false; AbstractJavaLaunchConfigurationDelegate lcd; try { lcd= getDelegate(lc); if (lcd.getMainTypeName(lc) == null) return false; return true; } catch (CoreException e) { return false; } } static boolean matches(ILaunchConfiguration lc, IJavaProject project) { AbstractJavaLaunchConfigurationDelegate lcd; try { lcd= getDelegate(lc); } catch (CoreException e) { return false; } IJavaProject p= null; try { p= lcd.getJavaProject(lc); } catch (CoreException e) { return false; } return project != null && project.equals(p); } }