From 5f0925c4be4a1fb24f834b065aa0999345a64ea4 Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Wed, 3 Aug 2022 21:01:01 -0700 Subject: [PATCH] Avoid unnecessary use of reflection --- .../envinject/EnvInjectComputerListener.java | 15 +++--- .../service/EnvInjectMasterEnvVarsSetter.java | 52 ++----------------- 2 files changed, 13 insertions(+), 54 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/envinject/EnvInjectComputerListener.java b/src/main/java/org/jenkinsci/plugins/envinject/EnvInjectComputerListener.java index 61f86b3a..ab44367c 100644 --- a/src/main/java/org/jenkinsci/plugins/envinject/EnvInjectComputerListener.java +++ b/src/main/java/org/jenkinsci/plugins/envinject/EnvInjectComputerListener.java @@ -1,6 +1,5 @@ package org.jenkinsci.plugins.envinject; -import hudson.EnvVars; import hudson.Extension; import hudson.FilePath; import hudson.model.Computer; @@ -21,6 +20,8 @@ import java.io.Serializable; import java.util.HashMap; import java.util.Map; +import java.util.NavigableMap; +import java.util.TreeMap; import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.NonNull; import jenkins.model.Jenkins; @@ -31,7 +32,7 @@ @Extension public class EnvInjectComputerListener extends ComputerListener implements Serializable { - private EnvVars getNewMasterEnvironmentVariables(@NonNull Computer c, + private NavigableMap getNewMasterEnvironmentVariables(@NonNull Computer c, @NonNull FilePath nodePath, @NonNull TaskListener listener) throws EnvInjectException, IOException, InterruptedException { //Get env vars for the current node @@ -67,7 +68,7 @@ private EnvVars getNewMasterEnvironmentVariables(@NonNull Computer c, //Resolve against node env vars envInjectEnvVarsService.resolveVars(globalPropertiesEnvVars, nodeEnvVars); - EnvVars envVars2Set = new EnvVars(); + NavigableMap envVars2Set = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); if (!unsetSystemVariables) { envVars2Set.putAll(nodeEnvVars); } @@ -76,7 +77,7 @@ private EnvVars getNewMasterEnvironmentVariables(@NonNull Computer c, return envVars2Set; } - private EnvVars getNewSlaveEnvironmentVariables(@NonNull Computer c, + private NavigableMap getNewSlaveEnvironmentVariables(@NonNull Computer c, @NonNull FilePath nodePath, @NonNull TaskListener listener) throws EnvInjectException, IOException, InterruptedException { Map currentEnvVars = new HashMap<>(); @@ -114,7 +115,7 @@ private EnvVars getNewSlaveEnvironmentVariables(@NonNull Computer c, //Resolve against node env vars envInjectEnvVarsService.resolveVars(currentEnvVars, nodeEnvVars); - EnvVars envVars2Set = new EnvVars(); + NavigableMap envVars2Set = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); if (!unsetSystemVariables) { envVars2Set.putAll(nodeEnvVars); } @@ -140,7 +141,7 @@ public void onOnline(Computer c, TaskListener listener) throws IOException, Inte if (isActiveSlave(c)) { try { - EnvVars envVars2Set = getNewSlaveEnvironmentVariables(c, nodePath, listener); + NavigableMap envVars2Set = getNewSlaveEnvironmentVariables(c, nodePath, listener); nodePath.act(new EnvInjectMasterEnvVarsSetter(envVars2Set)); } catch (EnvInjectException e) { throw new IOException(e); @@ -151,7 +152,7 @@ public void onOnline(Computer c, TaskListener listener) throws IOException, Inte //use case : it is only on master else if (isGlobalEnvInjectActivatedOnMaster()) { try { - EnvVars envVars2Set = getNewMasterEnvironmentVariables(c, nodePath, listener); + NavigableMap envVars2Set = getNewMasterEnvironmentVariables(c, nodePath, listener); nodePath.act(new EnvInjectMasterEnvVarsSetter(envVars2Set)); } catch (EnvInjectException e) { throw new IOException(e); diff --git a/src/main/java/org/jenkinsci/plugins/envinject/service/EnvInjectMasterEnvVarsSetter.java b/src/main/java/org/jenkinsci/plugins/envinject/service/EnvInjectMasterEnvVarsSetter.java index 6e883640..eb962f12 100644 --- a/src/main/java/org/jenkinsci/plugins/envinject/service/EnvInjectMasterEnvVarsSetter.java +++ b/src/main/java/org/jenkinsci/plugins/envinject/service/EnvInjectMasterEnvVarsSetter.java @@ -1,16 +1,10 @@ package org.jenkinsci.plugins.envinject.service; import hudson.EnvVars; -import hudson.Main; -import hudson.Platform; +import java.util.NavigableMap; import jenkins.security.MasterToSlaveCallable; import org.jenkinsci.lib.envinject.EnvInjectException; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; - import edu.umd.cs.findbugs.annotations.NonNull; /** @@ -18,51 +12,15 @@ */ public class EnvInjectMasterEnvVarsSetter extends MasterToSlaveCallable { - private @NonNull EnvVars enVars; + private @NonNull NavigableMap enVars; - public EnvInjectMasterEnvVarsSetter(@NonNull EnvVars enVars) { + public EnvInjectMasterEnvVarsSetter(@NonNull NavigableMap enVars) { this.enVars = enVars; } - private Field getModifiers() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, NoSuchFieldException { - Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class); - getDeclaredFields0.setAccessible(true); - Field[] fields = (Field[]) getDeclaredFields0.invoke(Field.class, false); - Field modifiers = null; - for (Field each : fields) { - if ("modifiers".equals(each.getName())) { - modifiers = each; - break; - } - } - if (modifiers == null) { - throw new NoSuchFieldException(); - } - return modifiers; - } - @Override - public Void call() throws EnvInjectException { - try { - Field platformField = EnvVars.class.getDeclaredField("platform"); - platformField.setAccessible(true); - platformField.set(enVars, Platform.current()); - if (Main.isUnitTest || Main.isDevelopmentMode) { - enVars.remove("MAVEN_OPTS"); - } - Field masterEnvVarsFiled = EnvVars.class.getDeclaredField("masterEnvVars"); - masterEnvVarsFiled.setAccessible(true); - Field modifiersField = getModifiers(); - modifiersField.setAccessible(true); - modifiersField.setInt(masterEnvVarsFiled, masterEnvVarsFiled.getModifiers() & ~Modifier.FINAL); - masterEnvVarsFiled.set(null, enVars); - } catch (IllegalAccessException | NoSuchFieldException iae) { - throw new EnvInjectException(iae); - } catch (InvocationTargetException | NoSuchMethodException e) { - throw new RuntimeException(e); - } - + public Void call() { + EnvVars.masterEnvVars.putAll(enVars); return null; } - }