You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ga...@apache.org on 2012/05/31 22:56:38 UTC

svn commit: r1344906 - in /geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal: GeronimoRuntimeWizardFragment.java Messages.java Messages.properties TargetPlatformHelper.java

Author: gawor
Date: Thu May 31 20:56:37 2012
New Revision: 1344906

URL: http://svn.apache.org/viewvc?rev=1344906&view=rev
Log:
GERONIMODEVTOOLS-794: Use reflection API to set target platform and make it work with older (3.6, 3.7) and newer (3.8, 4.2) Eclipse versions

Added:
    geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/TargetPlatformHelper.java   (with props)
Modified:
    geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/GeronimoRuntimeWizardFragment.java
    geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/Messages.java
    geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/Messages.properties

Modified: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/GeronimoRuntimeWizardFragment.java
URL: http://svn.apache.org/viewvc/geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/GeronimoRuntimeWizardFragment.java?rev=1344906&r1=1344905&r2=1344906&view=diff
==============================================================================
--- geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/GeronimoRuntimeWizardFragment.java (original)
+++ geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/GeronimoRuntimeWizardFragment.java Thu May 31 20:56:37 2012
@@ -17,34 +17,20 @@
 package org.apache.geronimo.st.v30.ui.internal;
 
 import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.Writer;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import org.apache.geronimo.st.v30.core.GeronimoRuntimeDelegate;
 import org.apache.geronimo.st.v30.ui.Activator;
-import org.apache.geronimo.st.v30.ui.CommonMessages;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
-import org.eclipse.core.variables.IStringVariableManager;
-import org.eclipse.core.variables.IValueVariable;
-import org.eclipse.core.variables.VariablesPlugin;
 import org.eclipse.jdt.launching.IVMInstall;
 import org.eclipse.jdt.launching.IVMInstall2;
 import org.eclipse.jdt.launching.IVMInstallType;
@@ -54,11 +40,6 @@ import org.eclipse.jface.preference.IPre
 import org.eclipse.jface.preference.PreferenceDialog;
 import org.eclipse.jface.preference.PreferenceManager;
 import org.eclipse.jface.window.Window;
-import org.eclipse.pde.internal.core.PDECore;
-import org.eclipse.pde.internal.core.target.provisional.ITargetDefinition;
-import org.eclipse.pde.internal.core.target.provisional.ITargetHandle;
-import org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService;
-import org.eclipse.pde.internal.core.target.provisional.LoadTargetDefinitionJob;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.BusyIndicator;
 import org.eclipse.swt.events.ModifyEvent;
@@ -91,32 +72,12 @@ import org.eclipse.wst.server.core.model
 import org.eclipse.wst.server.ui.internal.SWTUtil;
 import org.eclipse.wst.server.ui.wizard.IWizardHandle;
 import org.eclipse.wst.server.ui.wizard.WizardFragment;
-import org.osgi.framework.Bundle;
 
 /**
  * @version $Rev$ $Date$
  */
 public class GeronimoRuntimeWizardFragment extends WizardFragment {
 
-    // serverName-N.N or serverName-N.N.N
-    public static final Pattern SERVER_NAME_VERSION_PATTERN = Pattern.compile("(.*-)((\\d+\\.\\d+)(\\.(\\d+))?)");
-    
-    private static final String  LOCAL_TARGET_DIRECTORY = ".metadata/.plugins/org.eclipse.pde.core/.local_targets/";
-    
-    private static final String TARGET_FILE_EXTENSION = ".target";
-    
-    private static final String TARGET_FILE_LOCATIONS_PLACEHOLDER = "@locations_placeholder@";
-    
-    private static final String[] bundleDirectories = { "repository/org/apache/geronimo/specs",
-        "repository/org/apache/geronimo/javamail/geronimo-javamail_1.4_mail",
-        "repository/org/apache/geronimo/bundles/jaxb-impl", "repository/org/apache/geronimo/bundles/jstl",
-        "repository/org/apache/geronimo/bundles/myfaces-bundle",
-        "repository/org/apache/geronimo/framework/geronimo-jdbc",
-        "repository/org/eclipse/osgi",
-        "repository/org/osgi/org.osgi.compendium"};
-    
-    protected final String LOCATION_LINE_TEMPLATE = "<location path=\"${server_location}GERONIMO_BUNDLE_FOLDER_NAME\" type=\"Directory\"/>";
-
     private GeronimoRuntimeDelegate geronimoRuntime;
 
     protected Text installDir;
@@ -133,26 +94,7 @@ public class GeronimoRuntimeWizardFragme
         super();
     }
  
-    protected String getLocationLineTempalte() {
-    	return LOCATION_LINE_TEMPLATE.replaceAll("server_location", getServerLocationVariableName());
-    }
-    
-    protected String getTargetTemplateFileName() {
-    	return "targets/Geronimo30.target";
-    }
-    
-    protected String getServerLocationVariableName() {
-    	return "geronimo30_server_location";
-    }
-    
-    protected String getServerLocationVariableDescription(){
-    	return Messages.serverLocationVariableDescription;
-    }
-    
-    protected URL getTargetTempateFile() {
-        Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID);
-        return bundle.getEntry(getTargetTemplateFileName());
-    }
+
     /*
      * (non-Javadoc)
      * 
@@ -453,134 +395,35 @@ public class GeronimoRuntimeWizardFragme
     
     public void performFinish(IProgressMonitor monitor) throws CoreException {
 
-        ITargetPlatformService service = 
-            (ITargetPlatformService) PDECore.getDefault().acquireService(ITargetPlatformService.class.getName());
+        TargetPlatformHelper helper = null;
         
-        ITargetHandle geronimoTargetHandle = findGeronimoTargetDefinition(service);
+        try {
+            helper = TargetPlatformHelper.getTargetPlatformHelper();
+        } catch (Exception e) {
+            throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.targetPlatformError, e));
+        }
+        
+        Object geronimoTargetHandle = helper.findTargetHandle(getServerVersion());
         
         if (geronimoTargetHandle == null) {
             // target definition not found - generate one 
-            
             String geronimoServerLocation = getServerLocation();
             
-            // add or update string substitution variable named ${geronimo_30_server_location} 
-            IStringVariableManager varManager = VariablesPlugin.getDefault().getStringVariableManager();
-            IValueVariable v = varManager.getValueVariable(getServerLocationVariableName());
-            if (v == null) {
-                v = varManager.newValueVariable(getServerLocationVariableName(),
-                								getServerLocationVariableDescription(), 
-                                                false, 
-                                                geronimoServerLocation);
-                varManager.addVariables(new IValueVariable[] { v });
-            } else {
-                v.setValue(geronimoServerLocation);
-            }
-                        
-            // copy the target file for target platform into workspace
-            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-            IPath rootLocation = root.getLocation();
-            String timestamp = Long.toString(System.currentTimeMillis());           
-            String append = LOCAL_TARGET_DIRECTORY + timestamp + TARGET_FILE_EXTENSION;
-            IPath destination = rootLocation.append(append);            
-            
-            URL template = getTargetTempateFile();
+            helper.createTargetPlatform(geronimoServerLocation);
             
-            copyFile(template, destination, getLocationEntryLists(geronimoServerLocation));
-                        
-            geronimoTargetHandle = findGeronimoTargetDefinition(service);                    
+            geronimoTargetHandle = helper.findTargetHandle(getServerVersion());
         }
         
-        ITargetHandle activeTargetHandle = service.getWorkspaceTargetHandle();
-        
         if (geronimoTargetHandle != null) {
-            if (activeTargetHandle == null || !activeTargetHandle.equals(geronimoTargetHandle)) {
-                ITargetDefinition geronimoTarget = geronimoTargetHandle.getTargetDefinition();
-                LoadTargetDefinitionJob.load(geronimoTarget);
-            }            
+            helper.switchTargetPlatform(geronimoTargetHandle);        
         }
+        
     }
     
     protected String getServerVersion() {
     	return Messages.serverVersion;
     }
     
-    private ITargetHandle findGeronimoTargetDefinition(ITargetPlatformService service) throws CoreException {
-        ITargetHandle[] targetHandles = service.getTargets(null);
-        for (ITargetHandle cur : targetHandles) {
-            if (cur.getTargetDefinition().getName().equals(getServerVersion())) {
-                return cur;
-            }
-        }
-        return null;
-    }
-    
-    protected void copyFile(URL source, IPath dest, String replacement) throws CoreException {
-        Reader reader = null;
-        Writer writer = null;
-        
-        try {
-            try {
-                reader = new InputStreamReader(source.openStream());
-                
-                StringBuilder builder = new StringBuilder();
-                char [] buf = new char [2048];
-                int count = 0;
-                
-                while ( (count = reader.read(buf)) >= 0) {
-                    builder.append(buf, 0, count);
-                }
-                
-                String template = builder.toString();
-                String text = template.replace(TARGET_FILE_LOCATIONS_PLACEHOLDER, replacement);
-                
-                dest.toFile().getParentFile().mkdirs();
-                writer = new FileWriter(dest.toFile());
-                
-                writer.write(text);
-                
-            } finally {
-                if (reader != null) {
-                    reader.close();
-                }
-                if (writer != null) {
-                    writer.close();
-                }
-            }
-        } catch (IOException ex) {
-            throw new CoreException(new Status(IStatus.WARNING, Activator.PLUGIN_ID, Messages.copyTargetFileFailed, ex));
-        }
-    }
-    
-    
-    protected String getLocationEntryLists(String serverLocation) {
-
-        StringBuffer buf = new StringBuffer(1024);
-        buf.append(System.getProperty("line.separator"));
-        for (String bundleDir : bundleDirectories) {
-            File directory = new File(serverLocation, bundleDir);
-            listFile(directory, buf, serverLocation);
-        }
-        return buf.toString();
-    }
-
-    private void listFile(File file, StringBuffer buf, String serverLocation) {
-        if (file.isDirectory()) {
-            File[] files = file.listFiles();
-            for (File subfile : files) {
-                listFile(subfile, buf, serverLocation);
-            }
-        } else {
-            String filename = file.getAbsolutePath();
-            if (filename.endsWith(".jar")) {
-                String parentPath = file.getParent();
-                String bundleFolder = parentPath.substring(serverLocation.length());
-                buf.append(getLocationLineTempalte().replaceAll("GERONIMO_BUNDLE_FOLDER_NAME",
-                        Matcher.quoteReplacement(bundleFolder)));
-                buf.append(System.getProperty("line.separator"));
-            }
-        }
-    }
-    
     private GeronimoRuntimeDelegate getRuntimeDelegate() {
         IRuntimeWorkingCopy wc = (IRuntimeWorkingCopy) getTaskModel().getObject(TaskModel.TASK_RUNTIME);
         if (wc == null)
@@ -655,26 +498,4 @@ public class GeronimoRuntimeWizardFragme
         list.add(new GeronimoRuntimeSourceWizardFragment());
     }
 
-    /**
-     * Code for testing server name determination code in the
-     * updateInstallDir(IPath) method of addInstallableRuntimeSection.
-     * 
-     * @param args
-     */
-    public static void main(String[] args) {
-        Pattern SERVER_NAME_VERSION_PATTERN = Pattern.compile("(.*-)((\\d+\\.\\d+)(\\.(\\d+))?)");
-        for (String path : args) {
-            StringBuffer installPath = new StringBuffer();
-            Matcher matcher = SERVER_NAME_VERSION_PATTERN.matcher(path);
-            if (matcher.find()) {
-                String serverName = matcher.group(1);
-                String serverVersion = matcher.group(2);
-                installPath = installPath.append(serverName + serverVersion);
-                System.out.println("path = " + path + ", serverVersion = " + serverVersion + ", installPath = "
-                        + installPath);
-            } else {
-                System.out.println("No version found in path = " + path);
-            }
-        }
-    }
 }
\ No newline at end of file

Modified: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/Messages.java
URL: http://svn.apache.org/viewvc/geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/Messages.java?rev=1344906&r1=1344905&r2=1344906&view=diff
==============================================================================
--- geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/Messages.java (original)
+++ geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/Messages.java Thu May 31 20:56:37 2012
@@ -617,6 +617,7 @@ public class Messages extends NLS {
 	public static String tooltip;
 	
 	public static String serverVersion;
+	public static String targetPlatformError;
 	public static String copyTargetFileFailed;
 	public static String supportWebPage0;
 	public static String supportURL;

Modified: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/Messages.properties
URL: http://svn.apache.org/viewvc/geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/Messages.properties?rev=1344906&r1=1344905&r2=1344906&view=diff
==============================================================================
--- geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/Messages.properties (original)
+++ geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/Messages.properties Thu May 31 20:56:37 2012
@@ -454,6 +454,8 @@ tooltipInstall=Download the selected {0}
 tooltipJetty=Selects the Jetty distribution of Geronimo to install.
 tooltipTomcat=Selects the Tomcat distribution of Geronimo to install.
 tooltip=Tool tip
+
+targetPlatformError=Error setting up target platform.
 copyTargetFileFailed=Copy target file failed.
 
 hostName=Hostname:

Added: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/TargetPlatformHelper.java
URL: http://svn.apache.org/viewvc/geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/TargetPlatformHelper.java?rev=1344906&view=auto
==============================================================================
--- geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/TargetPlatformHelper.java (added)
+++ geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/TargetPlatformHelper.java Thu May 31 20:56:37 2012
@@ -0,0 +1,310 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.geronimo.st.v30.ui.internal;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.Writer;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.regex.Matcher;
+
+import org.apache.geronimo.st.v30.ui.Activator;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.variables.IStringVariableManager;
+import org.eclipse.core.variables.IValueVariable;
+import org.eclipse.core.variables.VariablesPlugin;
+import org.eclipse.pde.internal.core.PDECore;
+import org.osgi.framework.Bundle;
+
+/**
+ * The TargetPlatformHelper uses Eclipse Target Platform API to query and set the default target platform in Eclipse.
+ * 
+ * TargetPlatformHelper uses reflection API to interact with the Eclipse Target Platform API since the Eclipse API have
+ * into different packages starting in Eclipse 3.8. Using reflection allows us to have one version of the plugin that 
+ * works with multiple Eclipse versions and makes building the code a bit easier.
+ * 
+ * @version $Rev$ $Date$
+ */
+public class TargetPlatformHelper  {
+
+    private static final String LOCAL_TARGET_DIRECTORY = ".metadata/.plugins/org.eclipse.pde.core/.local_targets/";
+    
+    private static final String TARGET_FILE_EXTENSION = ".target";
+    
+    private static final String TARGET_FILE_LOCATIONS_PLACEHOLDER = "@locations_placeholder@";
+    
+    private static final String[] bundleDirectories = { "repository/org/apache/geronimo/specs",
+        "repository/org/apache/geronimo/javamail/geronimo-javamail_1.4_mail",
+        "repository/org/apache/geronimo/bundles/jaxb-impl", "repository/org/apache/geronimo/bundles/jstl",
+        "repository/org/apache/geronimo/bundles/myfaces-bundle",
+        "repository/org/apache/geronimo/framework/geronimo-jdbc",
+        "repository/org/eclipse/osgi",
+        "repository/org/osgi/org.osgi.compendium"};
+    
+    private final String LOCATION_LINE_TEMPLATE = "<location path=\"${server_location}GERONIMO_BUNDLE_FOLDER_NAME\" type=\"Directory\"/>";
+    
+    private final Method getNameMethod;
+    private final Method getTargetDefinitionMethod;
+    private final Method getWorkspaceTargetHandleMethod;
+    private final Method getTargetsMethod;
+    private final Method loadMethod;
+    
+    private Object targetPlatformService;
+
+    private TargetPlatformHelper(String basePackage) throws Exception {
+        Class<?> targetDefinitionClass = Class.forName(basePackage + ".ITargetDefinition");
+        getNameMethod = targetDefinitionClass.getMethod("getName");
+        
+        Class<?> targetHandleClass = Class.forName(basePackage + ".ITargetHandle");
+        getTargetDefinitionMethod = targetHandleClass.getMethod("getTargetDefinition");
+        
+        Class<?> targetPlatformServiceClass = Class.forName(basePackage + ".ITargetPlatformService");
+        getWorkspaceTargetHandleMethod = targetPlatformServiceClass.getMethod("getWorkspaceTargetHandle");
+        getTargetsMethod = targetPlatformServiceClass.getMethod("getTargets", IProgressMonitor.class);
+        
+        Class<?> loadTargetDefinitionClass =  Class.forName(basePackage + ".LoadTargetDefinitionJob");
+        loadMethod = loadTargetDefinitionClass.getMethod("load", targetDefinitionClass);
+        
+        targetPlatformService = PDECore.getDefault().acquireService(basePackage + ".ITargetPlatformService");
+        
+        if (targetPlatformService == null) {
+            throw new Exception("No TargetPlatformService");
+        }
+    }
+    
+    public static TargetPlatformHelper getTargetPlatformHelper() throws Exception {
+        try {
+            Class.forName("org.eclipse.pde.internal.core.target.provisional.ITargetDefinition");
+            return new TargetPlatformHelper("org.eclipse.pde.internal.core.target.provisional");
+        } catch (ClassNotFoundException e) {
+            try {
+                Class.forName("org.eclipse.pde.core.target.ITargetDefinition");
+                return new TargetPlatformHelper("org.eclipse.pde.core.target");
+            } catch (ClassNotFoundException ee) {
+                throw new RuntimeException("Target Platform API are not available");
+            }
+        }
+    }
+    
+    public Object findTargetHandle(String name) throws CoreException {
+        Object[] targetHandles = getTargetHandles(targetPlatformService);
+        if (targetHandles != null) {
+            for (Object targetHandle : targetHandles) {
+                Object targetDefinition = getTargetDefinition(targetHandle);
+                if (targetDefinition != null) {
+                    String targetName = getTargetDefinitionName(targetDefinition);
+                    if (name.equals(targetName)) {
+                        return targetHandle;
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    public void createTargetPlatform(String geronimoServerLocation) throws CoreException {
+        // add or update string substitution variable named ${geronimo_30_server_location} 
+        IStringVariableManager varManager = VariablesPlugin.getDefault().getStringVariableManager();
+        IValueVariable v = varManager.getValueVariable(getServerLocationVariableName());
+        if (v == null) {
+            v = varManager.newValueVariable(getServerLocationVariableName(),
+                                            getServerLocationVariableDescription(), 
+                                            false, 
+                                            geronimoServerLocation);
+            varManager.addVariables(new IValueVariable[] { v });
+        } else {
+            v.setValue(geronimoServerLocation);
+        }
+                    
+        // copy the target file for target platform into workspace
+        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+        IPath rootLocation = root.getLocation();
+        String timestamp = Long.toString(System.currentTimeMillis());           
+        String append = LOCAL_TARGET_DIRECTORY + timestamp + TARGET_FILE_EXTENSION;
+        IPath destination = rootLocation.append(append);            
+        
+        URL template = getTargetTempateFile();
+        
+        copyFile(template, destination, getLocationEntryLists(geronimoServerLocation));
+    }
+    
+    private void copyFile(URL source, IPath dest, String replacement) throws CoreException {
+        Reader reader = null;
+        Writer writer = null;
+        
+        try {
+            try {
+                reader = new InputStreamReader(source.openStream());
+                
+                StringBuilder builder = new StringBuilder();
+                char [] buf = new char [2048];
+                int count = 0;
+                
+                while ( (count = reader.read(buf)) >= 0) {
+                    builder.append(buf, 0, count);
+                }
+                
+                String template = builder.toString();
+                String text = template.replace(TARGET_FILE_LOCATIONS_PLACEHOLDER, replacement);
+                
+                dest.toFile().getParentFile().mkdirs();
+                writer = new FileWriter(dest.toFile());
+                
+                writer.write(text);
+                
+            } finally {
+                if (reader != null) {
+                    reader.close();
+                }
+                if (writer != null) {
+                    writer.close();
+                }
+            }
+        } catch (IOException ex) {
+            throw new CoreException(new Status(IStatus.WARNING, Activator.PLUGIN_ID, Messages.copyTargetFileFailed, ex));
+        }
+    }
+    
+    private String getLocationEntryLists(String serverLocation) {
+        StringBuffer buf = new StringBuffer(1024);
+        buf.append(System.getProperty("line.separator"));
+        for (String bundleDir : bundleDirectories) {
+            File directory = new File(serverLocation, bundleDir);
+            listFile(directory, buf, serverLocation);
+        }
+        return buf.toString();
+    }
+
+    private void listFile(File file, StringBuffer buf, String serverLocation) {
+        if (file.isDirectory()) {
+            File[] files = file.listFiles();
+            for (File subfile : files) {
+                listFile(subfile, buf, serverLocation);
+            }
+        } else {
+            String filename = file.getAbsolutePath();
+            if (filename.endsWith(".jar")) {
+                String parentPath = file.getParent();
+                String bundleFolder = parentPath.substring(serverLocation.length());
+                buf.append(getLocationLineTemplate().replaceAll("GERONIMO_BUNDLE_FOLDER_NAME", 
+                                                                Matcher.quoteReplacement(bundleFolder)));
+                buf.append(System.getProperty("line.separator"));
+            }
+        }
+    }
+    
+    private String getLocationLineTemplate() {
+        return LOCATION_LINE_TEMPLATE.replaceAll("server_location", getServerLocationVariableName());
+    }
+    
+    private String getTargetTemplateFileName() {
+        return "targets/Geronimo30.target";
+    }
+    
+    private String getServerLocationVariableName() {
+        return "geronimo30_server_location";
+    }
+    
+    private String getServerLocationVariableDescription(){
+        return Messages.serverLocationVariableDescription;
+    }
+    
+    private URL getTargetTempateFile() {
+        Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID);
+        return bundle.getEntry(getTargetTemplateFileName());
+    }
+    
+    public void switchTargetPlatform(Object targetHandle) throws CoreException {
+        Object activeTargetHandle = getWorkspaceTargetHandle();
+        if (activeTargetHandle == null || !activeTargetHandle.equals(targetHandle)) {
+            Object targetDefinition = getTargetDefinition(targetHandle);
+            if (targetDefinition != null) {
+                setTargetPlatform(targetDefinition);
+            }
+        }
+    }  
+    
+    // Key Target Platform reflection calls 
+
+    private String getTargetDefinitionName(Object targetDefinition) {
+        try {
+            return (String) getNameMethod.invoke(targetDefinition);           
+        } catch (Exception e) {
+            Trace.trace(Trace.ERROR, "Could not get target definition name", e, Activator.traceInternal);
+            return null;
+        } 
+    }
+    
+    private Object getTargetDefinition(Object targetHandle) throws CoreException {
+        try {
+            return getTargetDefinitionMethod.invoke(targetHandle);    
+        } catch (InvocationTargetException e) {
+            Throwable cause = e.getCause();
+            if (cause instanceof CoreException) {
+                throw (CoreException) cause;
+            }
+            throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, cause.getMessage(), cause));
+        } catch (Exception e) {
+            Trace.trace(Trace.ERROR, "Could not get target definition", e, Activator.traceInternal);
+            return null;
+        } 
+    }
+            
+    private Object[] getTargetHandles(Object targetPlatformService) {
+        try {
+            return (Object[]) getTargetsMethod.invoke(targetPlatformService, new Object[] { null });           
+        } catch (Exception e) {
+            Trace.trace(Trace.ERROR, "Could not get platform targets", e, Activator.traceInternal);
+            return null;
+        } 
+    }
+    
+    private Object getWorkspaceTargetHandle() throws CoreException {
+        try {
+            return getWorkspaceTargetHandleMethod.invoke(targetPlatformService);
+        } catch (InvocationTargetException e) {
+            Throwable cause = e.getCause();
+            if (cause instanceof CoreException) {
+                throw (CoreException) cause;
+            }
+            throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, cause.getMessage(), cause));        
+        } catch (Exception e) {
+            Trace.trace(Trace.ERROR, "Could not get workspace target handle", e, Activator.traceInternal);
+            return null;
+        } 
+    }
+    
+    private void setTargetPlatform(Object targetDefinition) {
+        try {
+            loadMethod.invoke(null, targetDefinition);
+        } catch (Exception e) {
+            Trace.trace(Trace.ERROR, "Could not set target platform", e, Activator.traceInternal);
+        }        
+    }
+}

Propchange: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/TargetPlatformHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/TargetPlatformHelper.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.ui/src/main/java/org/apache/geronimo/st/v30/ui/internal/TargetPlatformHelper.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain