jenkins/core/src/main/java/hudson/Functions.java

2202 lines
79 KiB
Java
Raw Normal View History

/*
* The MIT License
*
* Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi,
* Yahoo! Inc., Stephen Connolly, Tom Huybrechts, Alan Harder, Manufacture
* Francaise des Pneumatiques Michelin, Romain Seguy
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package hudson;
import hudson.model.Slave;
[JENKINS-27027] Notify the SecurityListener on authentication (#3074) * [JENKINS-27026] Notify the SecurityListener in case of Token based authentication success - due the current version of the method, the UserDetails required for the event was not accessible. In order to stay with the same API in SecurityListener, two "protected" methods were created to split the job and let the UserDetails accessible * - add test to ensure the SecurityListener is called for REST Token but also for regular basic auth * - remove the comment about the split, will be put in GitHub comment instead * - add check for anonymous call instead of just putting a comment - remove the constructor in the dummy - add link to PR from Daniel to simplify a call * - separate the before/after to save one clear and be more explicit - put more meaning in the assertLastEventIs method by explicitly say we will remove the last event * - add comment about why we do not fire the "failedToAuthenticated" in the case of an invalid token (tips: it's because it could be a valid password) * - also add the authenticated trigger on legacy filter as pointed by Ivan * - add support of event on CLI remoting authentication - adjust tests by moving the helper class used to spy on events * - as mentioned Yvan, the code had some problems with null checking, so the approach is changed in order to encapsulate all that internal mechanism * - add javadoc - open the getUserDetailsForImpersonation from the User (will let the SSHD module to retrieve UserDetails from that) * - remove single quote in log messages * - basic corrections requested by Jesse * - just another typo * - adjust the javadoc for SecurityListener events * - add the link to Jenkins#Anonymous * - add link (not using see) * - update comment on the isAnonymous as we (me + Oleg) do not find a best place at the moment * - put the new method isAnonymous in ACL instead of Functions * - little typo - add requirement about the SecurityContext authentication
2017-12-15 03:44:54 +08:00
import hudson.security.*;
import java.util.function.Predicate;
import jenkins.telemetry.impl.AutoRefresh;
import jenkins.util.SystemProperties;
import hudson.cli.CLICommand;
[FIXED HUDSON-2137] Merged revisions 27137,27564,27566-27567,27578,27586,27599,27603,27606-27609,27611,27616,27626-27632,27640,27654-27656,27687,27701,27801,27816,27819,27843-27845,28087,28158-28161 via svnmerge from https://www.dev.java.net/svn/hudson/branches/HUDSON-2137 ........ r27137 | kohsuke | 2010-02-08 08:46:16 -0800 (Mon, 08 Feb 2010) | 1 line experimenting with abstractions ........ r27564 | kohsuke | 2010-02-16 07:58:26 -0800 (Tue, 16 Feb 2010) | 1 line bundling makes it easier for caller to handle ConsoleAnnotator ........ r27566 | kohsuke | 2010-02-16 08:49:48 -0800 (Tue, 16 Feb 2010) | 1 line this should work with Runs, not AbstractBuilds ........ r27567 | kohsuke | 2010-02-16 08:54:06 -0800 (Tue, 16 Feb 2010) | 1 line simplified ........ r27578 | kohsuke | 2010-02-16 12:26:11 -0800 (Tue, 16 Feb 2010) | 1 line still a work in progress, but committing once to pull in trunk changes ........ r27586 | kohsuke | 2010-02-16 14:35:37 -0800 (Tue, 16 Feb 2010) | 1 line making more progress ........ r27599 | kohsuke | 2010-02-16 19:22:01 -0800 (Tue, 16 Feb 2010) | 2 lines hooking up the side that writes annotations. still a work in progress. ........ r27603 | kohsuke | 2010-02-16 23:43:35 -0800 (Tue, 16 Feb 2010) | 3 lines what appears to me as the first cut of hooking up the reader side of the annotations. I haven't even run it yet --- this just passed the compilation, and I'm calling it a day. ........ r27606 | kohsuke | 2010-02-17 09:15:16 -0800 (Wed, 17 Feb 2010) | 1 line demo instance hook up ........ r27607 | kohsuke | 2010-02-17 11:27:02 -0800 (Wed, 17 Feb 2010) | 3 lines one more utility method. I never understood what the point of letting the skip method skip less. ........ r27608 | kohsuke | 2010-02-17 11:56:23 -0800 (Wed, 17 Feb 2010) | 3 lines - moved LargeText subtype to its own class - skipping log output was done incorrectly --- it had to skip N bytes where it was skipping N chars. - hooked up console annotations for completed builds. ........ r27609 | kohsuke | 2010-02-17 12:01:46 -0800 (Wed, 17 Feb 2010) | 1 line copyright header ........ r27611 | kohsuke | 2010-02-17 13:18:10 -0800 (Wed, 17 Feb 2010) | 1 line introduced a mechanism to register extension during an unit test. ........ r27616 | kohsuke | 2010-02-17 13:38:12 -0800 (Wed, 17 Feb 2010) | 1 line test case for console annotations ........ r27626 | kohsuke | 2010-02-17 15:23:06 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotator as I write tests as tests ........ r27627 | kohsuke | 2010-02-17 16:06:13 -0800 (Wed, 17 Feb 2010) | 1 line added a multi-phase cooperative locking mechanism useful during the debugging ........ r27628 | kohsuke | 2010-02-17 16:06:41 -0800 (Wed, 17 Feb 2010) | 1 line testing progressive log annotation ........ r27629 | kohsuke | 2010-02-17 16:20:32 -0800 (Wed, 17 Feb 2010) | 1 line adding a test for ConsoleAnnotation that's explicitly placed. ........ r27630 | kohsuke | 2010-02-17 16:23:02 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotation as I write tests as tests ........ r27631 | kohsuke | 2010-02-17 16:28:50 -0800 (Wed, 17 Feb 2010) | 1 line tweaking the abstraction a bit. ........ r27632 | kohsuke | 2010-02-17 16:44:21 -0800 (Wed, 17 Feb 2010) | 1 line parameterized the context type so that this can be used in places other than the build console output, such as polling logs, slave logs, and so on. ........ r27640 | kohsuke | 2010-02-17 17:27:52 -0800 (Wed, 17 Feb 2010) | 1 line bug fix ........ r27654 | kohsuke | 2010-02-17 22:53:04 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27655 | kohsuke | 2010-02-17 22:53:59 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27656 | kohsuke | 2010-02-17 23:10:42 -0800 (Wed, 17 Feb 2010) | 1 line test case for adjacent tags ........ r27687 | kohsuke | 2010-02-19 14:39:21 -0800 (Fri, 19 Feb 2010) | 1 line introduced a facotry and descriptor. This allows them to define configuration pages, allow users to disable/enable them, plus define custom behaviors. ........ r27701 | kohsuke | 2010-02-19 18:23:52 -0800 (Fri, 19 Feb 2010) | 1 line defining a mechanism for ConsoleAnnotatorFactory and ConsoleAnnotationDescriptor to define script.js and have them imported into the console output page ........ r27801 | kohsuke | 2010-02-22 11:59:16 -0800 (Mon, 22 Feb 2010) | 1 line now embedding annotations inside the console output log file. ........ r27816 | kohsuke | 2010-02-22 15:45:04 -0800 (Mon, 22 Feb 2010) | 1 line introduced a convenience method for unit tests ........ r27819 | kohsuke | 2010-02-22 17:37:05 -0800 (Mon, 22 Feb 2010) | 5 lines As an example of using embedded console annotations, implementing Ant target invocation outlines. It might be better to make the concept of outline more generally reusable, so that different kinds of outlines can be placed into the same container element for a single hierarchical representation. Still a work in progress. ........ r27843 | kohsuke | 2010-02-23 16:12:13 -0800 (Tue, 23 Feb 2010) | 1 line for now, disable this for production usage, until I work out a better UI. ........ r27844 | kohsuke | 2010-02-23 19:08:00 -0800 (Tue, 23 Feb 2010) | 1 line started working on annotating exception. ........ r27845 | kohsuke | 2010-02-23 19:08:33 -0800 (Tue, 23 Feb 2010) | 1 line more TODOs for myself ........ r28087 | kohsuke | 2010-03-01 10:03:55 -0800 (Mon, 01 Mar 2010) | 1 line formatting changes ........ r28158 | kohsuke | 2010-03-02 17:00:00 -0800 (Tue, 02 Mar 2010) | 1 line ConsoleAnnotation and ConsoleAnnotator are too confusing. ........ r28159 | kohsuke | 2010-03-02 17:02:02 -0800 (Tue, 02 Mar 2010) | 1 line doc improvement ........ r28160 | kohsuke | 2010-03-02 17:05:14 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvements. ........ r28161 | kohsuke | 2010-03-02 17:11:59 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvement ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@28173 71c3de6d-444a-0410-be80-ed276b4c234a
2010-03-03 23:37:55 +08:00
import hudson.console.ConsoleAnnotationDescriptor;
import hudson.console.ConsoleAnnotatorFactory;
import hudson.init.InitMilestone;
import hudson.model.AbstractProject;
import hudson.model.Action;
import hudson.model.Describable;
import hudson.model.Descriptor;
import hudson.model.DescriptorVisibilityFilter;
import hudson.model.Hudson;
import hudson.model.Item;
import hudson.model.ItemGroup;
import hudson.model.Items;
import hudson.model.JDK;
import hudson.model.Job;
import hudson.model.JobPropertyDescriptor;
import hudson.model.ModelObject;
import hudson.model.Node;
import hudson.model.PageDecorator;
[JENKINS-50447] New design and slim down of login page (#3380) * [JENKINS-50447] New design and slim down of login page The change will provide a new designed login page that is using no external deps to prevent any possible malvious javascript. We still allow the user to use the legacy login page, which has not changed the behaviour. [JENKINS-50447] Implement error case and use final svg jenkins logo [JENKINS-50447] remove mock up logo [JENKINS-50447] Fix feet back from jlong [JENKINS-50447_squash] Use theme css which only contains values to be overriden. Drop ie js since with the theme css it is not needed anymore * [JENKINS-50447_squash] Fix expression to evaluate when to show an error and when to simply redirect * eslint - formating changes and fix offences * [JENKINS-50447_squash] Use system property to controll whether or not to use the legacy login * [JENKINS-50447_squash] prevent that the jsessionId appears in the url which should fix most tests * [JENKINS-50447_squash] Fix cli test by adding pageDecorators magic from layout.jelly * [JENKINS-50447_squash] remove pageDecorators because they assume existence of js that we do not have * [JENKINS-50447] New design and slim down of login page The change will provide a new designed login page that is using no external deps to prevent any possible malvious javascript. We still allow the user to use the legacy login page, which has not changed the behaviour. [JENKINS-50447] Implement error case and use final svg jenkins logo [JENKINS-50447] remove mock up logo [JENKINS-50447] Fix feet back from jlong [JENKINS-50447_squash] Use theme css which only contains values to be overriden. Drop ie js since with the theme css it is not needed anymore [JENKINS-50447_squash] Fix expression to evaluate when to show an error and when to simply redirect eslint - formating changes and fix offences [JENKINS-50447_squash] Use system property to controll whether or not to use the legacy login [JENKINS-50447_squash] prevent that the jsessionId appears in the url which should fix most tests [JENKINS-50447_squash] Fix cli test by adding pageDecorators magic from layout.jelly [JENKINS-50447_squash] remove pageDecorators because they assume existence of js that we do not have [JENKINS-50447_squash] make login page extensible with pagedecorators [JENKINS-50447_squash] drop legacy support * Make theme customisable by using a magic package for css and header. Limiting the implemetation of those to one. * [JENKINS-50447_squash] Creating a specific decorator for login which only returns one instance * [JENKINS-50447_squash] using rounded corner * JENKINS-50447 remove legacy code * [JENKINS-50447_squash] Fix comments from @amuniz about javadoc and uniqueness of css for login * [JENKINS-50447_squash] Fix click on label span to toggle the select of the checkbox * [JENKINS-50447_squash] fix comments from @daniel-beck * [JENKINS-50447_squash] Fix license headers * [JENKINS-50447_squash] Implement loading/restarting and signup with same design * [JENKINS-50447_squash] Implement the loading/restarting view and signup with same design as the login page * [JENKINS-50447_squash] Remove limitation that only one validation error can be shown at a time * [JENKINS-50447_squash] implement password strength checker * [JENKINS-50447_squash] Fix different comments from @daniel-beck regarding titles. Further enhanced spacing of label and input * [JENKINS-50447_squash] Fix restart screen css. Fix comments regarding signup page. * [JENKINS-50447_squash] fix tabindex flow * harmonize design - of checkboxes using jdl styles. - distance of headers * [JENKINS-50447] Fix comments from @daniel-beck - fix some accessibility issues -- html has now a lang tag -- define main region - fix missplaced } - fix when server down for real that we still show the loading page * [JENKINS-50447_squash] should never ended up here
2018-06-18 00:02:37 +08:00
import jenkins.model.SimplePageDecorator;
import hudson.model.PaneStatusProperties;
import hudson.model.ParameterDefinition;
import hudson.model.ParameterDefinition.ParameterDescriptor;
import hudson.model.Run;
import hudson.model.TimeZoneProperty;
import hudson.model.TopLevelItem;
import hudson.model.User;
import hudson.model.View;
import hudson.scm.SCM;
import hudson.scm.SCMDescriptor;
import hudson.search.SearchableModelObject;
import hudson.security.captcha.CaptchaSupport;
import hudson.security.csrf.CrumbIssuer;
import hudson.slaves.Cloud;
Merged revisions 8523-8525,8545-8556,8793,8803-8806,8858,9027-9028 via svnmerge from https://www.dev.java.net/svn/hudson/branches/tom ........ r8523 | huybrechts | 2008-04-11 13:41:11 -0700 (Fri, 11 Apr 2008) | 1 line profile to build against current snapshot of hudson-core ........ r8524 | huybrechts | 2008-04-11 14:42:58 -0700 (Fri, 11 Apr 2008) | 1 line [#710] project option to automatically delete the svn wc if it is locked ........ r8525 | huybrechts | 2008-04-11 14:53:59 -0700 (Fri, 11 Apr 2008) | 1 line [#710] project option to automatically delete the svn wc if it is locked ........ r8545 | huybrechts | 2008-04-12 04:17:46 -0700 (Sat, 12 Apr 2008) | 1 line profile to build against current snapshot of hudson-core ........ r8546 | huybrechts | 2008-04-12 04:19:26 -0700 (Sat, 12 Apr 2008) | 1 line deleting IDE-specific files ........ r8547 | huybrechts | 2008-04-12 06:31:32 -0700 (Sat, 12 Apr 2008) | 1 line added ignores ........ r8548 | huybrechts | 2008-04-12 06:42:49 -0700 (Sat, 12 Apr 2008) | 4 lines Issue 1158 - extended AuthorizationStrategy to provide ACLs for different types of objects - changed several object types to use these methods - changed jelly to check permissions (instead of using isAdmin check) ........ r8549 | huybrechts | 2008-04-12 06:44:26 -0700 (Sat, 12 Apr 2008) | 1 line Issue 1110: use svn revision number in project-changes.jelly ........ r8550 | huybrechts | 2008-04-12 06:46:18 -0700 (Sat, 12 Apr 2008) | 1 line Adding a 'My Projects' view which shows only projects the user has permission for ........ r8551 | huybrechts | 2008-04-12 06:47:57 -0700 (Sat, 12 Apr 2008) | 1 line adding a user name resolver, like the MailAddressResolver ........ r8552 | huybrechts | 2008-04-12 06:49:27 -0700 (Sat, 12 Apr 2008) | 1 line Adding jdom and cglib to the war, as a workaround for classloading issues ........ r8553 | huybrechts | 2008-04-12 08:01:58 -0700 (Sat, 12 Apr 2008) | 1 line SFEE integration improvements, including links to project based security ........ r8554 | huybrechts | 2008-04-12 08:27:17 -0700 (Sat, 12 Apr 2008) | 1 line wsdl for SFEE webservices ........ r8555 | huybrechts | 2008-04-12 08:31:18 -0700 (Sat, 12 Apr 2008) | 1 line forgot some files... ........ r8556 | huybrechts | 2008-04-12 08:34:31 -0700 (Sat, 12 Apr 2008) | 1 line an authorization strategy that provides project-based access control (not usable on its own) ........ r8793 | huybrechts | 2008-04-22 14:39:57 -0700 (Tue, 22 Apr 2008) | 1 line [issue #1573] allow plugins to contribute ServletFilters ........ r8803 | huybrechts | 2008-04-23 10:46:09 -0700 (Wed, 23 Apr 2008) | 1 line added ignores ........ r8804 | huybrechts | 2008-04-23 10:52:11 -0700 (Wed, 23 Apr 2008) | 1 line added ignores ........ r8805 | huybrechts | 2008-04-23 10:54:12 -0700 (Wed, 23 Apr 2008) | 1 line added ignores ........ r8806 | huybrechts | 2008-04-23 10:59:13 -0700 (Wed, 23 Apr 2008) | 1 line Issue 1158 ........ r8858 | huybrechts | 2008-04-25 08:17:41 -0700 (Fri, 25 Apr 2008) | 1 line bugfixes ........ r9027 | huybrechts | 2008-05-04 12:20:34 -0700 (Sun, 04 May 2008) | 1 line Issue 1158 - fixing permission checks in jelly ........ r9028 | huybrechts | 2008-05-04 12:22:36 -0700 (Sun, 04 May 2008) | 1 line creating SFEE releases from Hudson ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@9699 71c3de6d-444a-0410-be80-ed276b4c234a
2008-05-30 11:25:15 +08:00
import hudson.slaves.ComputerLauncher;
import hudson.slaves.NodeProperty;
import hudson.slaves.NodePropertyDescriptor;
Merged revisions 8523-8525,8545-8556,8793,8803-8806,8858,9027-9028 via svnmerge from https://www.dev.java.net/svn/hudson/branches/tom ........ r8523 | huybrechts | 2008-04-11 13:41:11 -0700 (Fri, 11 Apr 2008) | 1 line profile to build against current snapshot of hudson-core ........ r8524 | huybrechts | 2008-04-11 14:42:58 -0700 (Fri, 11 Apr 2008) | 1 line [#710] project option to automatically delete the svn wc if it is locked ........ r8525 | huybrechts | 2008-04-11 14:53:59 -0700 (Fri, 11 Apr 2008) | 1 line [#710] project option to automatically delete the svn wc if it is locked ........ r8545 | huybrechts | 2008-04-12 04:17:46 -0700 (Sat, 12 Apr 2008) | 1 line profile to build against current snapshot of hudson-core ........ r8546 | huybrechts | 2008-04-12 04:19:26 -0700 (Sat, 12 Apr 2008) | 1 line deleting IDE-specific files ........ r8547 | huybrechts | 2008-04-12 06:31:32 -0700 (Sat, 12 Apr 2008) | 1 line added ignores ........ r8548 | huybrechts | 2008-04-12 06:42:49 -0700 (Sat, 12 Apr 2008) | 4 lines Issue 1158 - extended AuthorizationStrategy to provide ACLs for different types of objects - changed several object types to use these methods - changed jelly to check permissions (instead of using isAdmin check) ........ r8549 | huybrechts | 2008-04-12 06:44:26 -0700 (Sat, 12 Apr 2008) | 1 line Issue 1110: use svn revision number in project-changes.jelly ........ r8550 | huybrechts | 2008-04-12 06:46:18 -0700 (Sat, 12 Apr 2008) | 1 line Adding a 'My Projects' view which shows only projects the user has permission for ........ r8551 | huybrechts | 2008-04-12 06:47:57 -0700 (Sat, 12 Apr 2008) | 1 line adding a user name resolver, like the MailAddressResolver ........ r8552 | huybrechts | 2008-04-12 06:49:27 -0700 (Sat, 12 Apr 2008) | 1 line Adding jdom and cglib to the war, as a workaround for classloading issues ........ r8553 | huybrechts | 2008-04-12 08:01:58 -0700 (Sat, 12 Apr 2008) | 1 line SFEE integration improvements, including links to project based security ........ r8554 | huybrechts | 2008-04-12 08:27:17 -0700 (Sat, 12 Apr 2008) | 1 line wsdl for SFEE webservices ........ r8555 | huybrechts | 2008-04-12 08:31:18 -0700 (Sat, 12 Apr 2008) | 1 line forgot some files... ........ r8556 | huybrechts | 2008-04-12 08:34:31 -0700 (Sat, 12 Apr 2008) | 1 line an authorization strategy that provides project-based access control (not usable on its own) ........ r8793 | huybrechts | 2008-04-22 14:39:57 -0700 (Tue, 22 Apr 2008) | 1 line [issue #1573] allow plugins to contribute ServletFilters ........ r8803 | huybrechts | 2008-04-23 10:46:09 -0700 (Wed, 23 Apr 2008) | 1 line added ignores ........ r8804 | huybrechts | 2008-04-23 10:52:11 -0700 (Wed, 23 Apr 2008) | 1 line added ignores ........ r8805 | huybrechts | 2008-04-23 10:54:12 -0700 (Wed, 23 Apr 2008) | 1 line added ignores ........ r8806 | huybrechts | 2008-04-23 10:59:13 -0700 (Wed, 23 Apr 2008) | 1 line Issue 1158 ........ r8858 | huybrechts | 2008-04-25 08:17:41 -0700 (Fri, 25 Apr 2008) | 1 line bugfixes ........ r9027 | huybrechts | 2008-05-04 12:20:34 -0700 (Sun, 04 May 2008) | 1 line Issue 1158 - fixing permission checks in jelly ........ r9028 | huybrechts | 2008-05-04 12:22:36 -0700 (Sun, 04 May 2008) | 1 line creating SFEE releases from Hudson ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@9699 71c3de6d-444a-0410-be80-ed276b4c234a
2008-05-30 11:25:15 +08:00
import hudson.slaves.RetentionStrategy;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.BuildWrapper;
import hudson.tasks.BuildWrappers;
import hudson.tasks.Builder;
import hudson.tasks.Publisher;
import hudson.tasks.UserAvatarResolver;
import hudson.util.Area;
import hudson.util.FormValidation.CheckMethod;
import hudson.util.HudsonIsLoading;
import hudson.util.HudsonIsRestarting;
import hudson.util.Iterators;
import hudson.util.jna.GNUCLibrary;
import hudson.util.Secret;
import hudson.views.MyViewsTabBar;
import hudson.views.ViewsTabBar;
import hudson.widgets.RenderOnDemandClosure;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.Serializable;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.lang.management.LockInfo;
import java.lang.management.ManagementFactory;
import java.lang.management.MonitorInfo;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
Merged revisions 17324-17325,17428,17430,17473-17475,17481-17482,17555-17563,17571,17593-17595,17619-17620,17637-17644,17656-17657,17663-17665,17667-17670,17730,17753,17755-17758,17763-17768,17770-17771,17901,17906,17911-17912,17958,17961-17962,17970-17977 via svnmerge from https://www.dev.java.net/svn/hudson/branches/tool-autoinstallation ........ r17324 | jglick | 2009-04-20 18:24:32 -0700 (Mon, 20 Apr 2009) | 2 lines Defensive cloning and Javadoc corrections. (Though it seems no one is using the default impls of these methods yet anyway.) ........ r17325 | jglick | 2009-04-20 18:29:06 -0700 (Mon, 20 Apr 2009) | 1 line Deprecation of delegate method is intentional. ........ r17428 | jglick | 2009-04-23 08:07:14 -0700 (Thu, 23 Apr 2009) | 1 line Noting ToolLocationTranslator more prominently. ........ r17430 | jglick | 2009-04-23 09:16:40 -0700 (Thu, 23 Apr 2009) | 1 line Unused imports. ........ r17473 | jglick | 2009-04-23 19:21:11 -0700 (Thu, 23 Apr 2009) | 1 line Allow Plugin.configure to see the StaplerRequest, needed for some kinds of calls. ........ r17474 | jglick | 2009-04-23 19:25:54 -0700 (Thu, 23 Apr 2009) | 3 lines Initial sketch of plugin to manage tool installations across slaves. (Should really be under ../plugins/ but that was not branched, so putting here for the moment.) ........ r17475 | jglick | 2009-04-23 20:29:36 -0700 (Thu, 23 Apr 2009) | 1 line Typo in Javadoc. ........ r17481 | jglick | 2009-04-23 22:46:26 -0700 (Thu, 23 Apr 2009) | 1 line Unzip of an unbuffered stream is painfully slow. ........ r17482 | jglick | 2009-04-23 22:48:01 -0700 (Thu, 23 Apr 2009) | 1 line ZIP-based tool installer now functional. ........ r17555 | jglick | 2009-04-27 17:50:38 -0700 (Mon, 27 Apr 2009) | 1 line Build against newest trunk. ........ r17556 | jglick | 2009-04-27 18:38:28 -0700 (Mon, 27 Apr 2009) | 1 line Adding help. ........ r17557 | jglick | 2009-04-27 18:57:46 -0700 (Mon, 27 Apr 2009) | 1 line Moving toolName & label config GUI into generic files. ........ r17558 | jglick | 2009-04-27 19:37:30 -0700 (Mon, 27 Apr 2009) | 1 line Typo. ........ r17559 | jglick | 2009-04-27 20:07:47 -0700 (Mon, 27 Apr 2009) | 1 line Second tool installer type based on a freeform command. ........ r17560 | jglick | 2009-04-27 20:24:36 -0700 (Mon, 27 Apr 2009) | 1 line installIfNecessaryFrom will now just return false in case the target dir exists but the URL cannot be opened. ........ r17561 | jglick | 2009-04-27 20:25:22 -0700 (Mon, 27 Apr 2009) | 2 lines chmod only if something was actually installed. Use a+x, not o+x. ........ r17562 | jglick | 2009-04-27 20:26:46 -0700 (Mon, 27 Apr 2009) | 1 line Comment only. ........ r17563 | jglick | 2009-04-27 20:41:12 -0700 (Mon, 27 Apr 2009) | 1 line I18N. ........ r17571 | jglick | 2009-04-28 08:15:31 -0700 (Tue, 28 Apr 2009) | 2 lines Wiki link. ........ r17593 | jglick | 2009-04-28 15:38:33 -0700 (Tue, 28 Apr 2009) | 1 line Turn off echo mode, it's just noise. ........ r17594 | jglick | 2009-04-28 15:39:29 -0700 (Tue, 28 Apr 2009) | 2 lines Synchronizing access to installers for a given node/tool combo. Sending log messages to Hudson log in real time. ........ r17595 | jglick | 2009-04-28 15:46:29 -0700 (Tue, 28 Apr 2009) | 1 line Copyrights. ........ r17619 | jglick | 2009-04-29 06:25:23 -0700 (Wed, 29 Apr 2009) | 1 line Improved Javadoc. ........ r17620 | jglick | 2009-04-29 06:51:11 -0700 (Wed, 29 Apr 2009) | 1 line Demonstraing how to use DLJ to mechanically install official JDK releases on supported operating systems. ........ r17637 | kohsuke | 2009-04-30 16:15:24 -0700 (Thu, 30 Apr 2009) | 1 line fixed what appears to be a C&P mistake ........ r17638 | kohsuke | 2009-04-30 16:16:21 -0700 (Thu, 30 Apr 2009) | 1 line show YUI logger if YUI debugging mode is set. ........ r17639 | kohsuke | 2009-04-30 16:52:28 -0700 (Thu, 30 Apr 2009) | 7 lines Fixed a UI script problem when <hetero-list> nests inside <repeatable>. The cause of the problem was that the behavior for inner <hetero-list> kicks in first, altering HTML (by removing "prototypes"), before behavior for outer <repetable> kicks in and removes the master copy from DOM tree. So <repeatable> ends up computing a master copy after some elements are removed, and hence when we try to reinsert them later by clicking "Add", it'll get incorrect copy, and re-execution of the <hetero-list> behavior bombs out. I fixed this by skipping those HTML-altering behaviors if they show up in the part of DOM tree that's supposed to be snapshotted and removed. ........ r17640 | kohsuke | 2009-04-30 16:57:58 -0700 (Thu, 30 Apr 2009) | 7 lines Added ToolProperty to ToolInstallation (which acts like NodeProperty to Node --- basically decorates the base object with additional properties.) The original motivation is to implement ToolInstaller this way, if Jesse is OK. But decorating tools seem to have some other interesting use, such as a plugin for configuring $M2_HOME/conf/settings.xml, or a plugin to insert unlimited cryptography extension to JDK, or a plugin to add a few more jars into $ANT_HOME/lib. For this to work, ToolInstallations that want properties needs to be modified to use a new constructor. For a starter, I modified the JDK class to do this. I also took the opportunity to modernize JDK/config.jelly. ........ r17641 | kohsuke | 2009-04-30 17:02:04 -0700 (Thu, 30 Apr 2009) | 1 line this appears to be a left-over from early days when we didn't have a means to do form validation ........ r17642 | kohsuke | 2009-04-30 17:02:35 -0700 (Thu, 30 Apr 2009) | 1 line we don't need no.such.JDK but we need name. rebranching ........ r17643 | kohsuke | 2009-04-30 17:03:22 -0700 (Thu, 30 Apr 2009) | 1 line rebranched from Hudson's configure.properties ........ r17644 | kohsuke | 2009-04-30 17:05:31 -0700 (Thu, 30 Apr 2009) | 1 line removed unnecessary translations ........ r17656 | kohsuke | 2009-05-01 11:27:36 -0700 (Fri, 01 May 2009) | 1 line Less hack for improved type safety. Asking people to write more code is not necessarily bad as long as what they need to do is obvious to them. ........ r17657 | kohsuke | 2009-05-01 12:07:20 -0700 (Fri, 01 May 2009) | 5 lines The toolautoinst part of the change that corresponds to rev.17640. ToolInstallers are now hooked under ToolInstallation through InstallSourceProperty as a ToolProperty. This allows the relevant UIs to be shown in one place. Still pending Jesse's feedback. Making it a single commit to simplify a revert if necessary ........ r17663 | kohsuke | 2009-05-01 13:23:51 -0700 (Fri, 01 May 2009) | 1 line doc improvement ........ r17664 | kohsuke | 2009-05-01 13:24:10 -0700 (Fri, 01 May 2009) | 1 line needs this to allow Stapler to databind hetero-list automatically ........ r17665 | jglick | 2009-05-01 13:31:27 -0700 (Fri, 01 May 2009) | 1 line Warnings. ........ r17667 | kohsuke | 2009-05-01 14:20:53 -0700 (Fri, 01 May 2009) | 1 line added a method to do chmod ........ r17668 | kohsuke | 2009-05-01 14:30:35 -0700 (Fri, 01 May 2009) | 1 line prefer JDK6 version to avoid unnecessary JNA loading ........ r17669 | kohsuke | 2009-05-01 14:33:09 -0700 (Fri, 01 May 2009) | 1 line no, I must have confused this. ........ r17670 | kohsuke | 2009-05-01 15:57:11 -0700 (Fri, 01 May 2009) | 2 lines - Automated JDK installer and its test. - Minor update to the signature of ToolInstaller for supplying the expected default location. ........ r17730 | kohsuke | 2009-05-04 11:27:34 -0700 (Mon, 04 May 2009) | 1 line avoid NPE as reported in HUDSON-3608 ........ r17753 | jglick | 2009-05-04 19:34:08 -0700 (Mon, 04 May 2009) | 2 lines Moved toolautoinst functionality into core. ........ r17755 | jglick | 2009-05-04 20:28:34 -0700 (Mon, 04 May 2009) | 8 lines Added TaskListener parameter and IOException and InterruptedException to several methods: Run.getEnvironment NodeSpecific.forNode ToolLocationTranslator.getToolHome ToolLocationNodeProperty.getToolHome ToolInstallation.translateFor ProcessCache.Factory.getMavenInstallation ProcessCache.Factory.getJava ........ r17756 | jglick | 2009-05-04 20:36:56 -0700 (Mon, 04 May 2009) | 1 line expectedLocation was never strictly necessary, and will soon no longer be used even by JDKInstaller. ........ r17757 | jglick | 2009-05-04 20:40:41 -0700 (Mon, 04 May 2009) | 1 line Not sure yet what @since should be. ........ r17758 | jglick | 2009-05-04 20:41:51 -0700 (Mon, 04 May 2009) | 1 line getDefaultInstallers method added. Not yet in use. ........ r17763 | kohsuke | 2009-05-05 10:50:36 -0700 (Tue, 05 May 2009) | 1 line deprecated redundant getJavaHome method ........ r17764 | kohsuke | 2009-05-05 12:10:45 -0700 (Tue, 05 May 2009) | 1 line added general-purpose property defaulting mechanism, and added default tool installer for JDK ........ r17765 | jglick | 2009-05-05 12:35:56 -0700 (Tue, 05 May 2009) | 1 line capitalize("") -> "" ........ r17766 | jglick | 2009-05-05 12:49:52 -0700 (Tue, 05 May 2009) | 1 line Missing @since. ........ r17767 | jglick | 2009-05-05 13:01:41 -0700 (Tue, 05 May 2009) | 1 line Unchecked warning. ........ r17768 | jglick | 2009-05-05 13:19:49 -0700 (Tue, 05 May 2009) | 2 lines Two unsuccessful attempts at form validation. ........ r17770 | jglick | 2009-05-05 13:48:37 -0700 (Tue, 05 May 2009) | 1 line Better class names. ........ r17771 | kohsuke | 2009-05-05 14:12:21 -0700 (Tue, 05 May 2009) | 5 lines brought the form validation check back. The trick is to use the 'value' parameter. In the end we'd expect this check to go away anyway, as we change input field to drop-down list, but in the mean time, this is why it didn't work. Maybe we probably need more static code checkers? Like FindBugs rules? ........ r17901 | kohsuke | 2009-05-09 19:15:40 -0700 (Sat, 09 May 2009) | 1 line having two toolHome is odd. ........ r17906 | kohsuke | 2009-05-10 11:09:13 -0700 (Sun, 10 May 2009) | 1 line adding the generalization of UpdateCenter, but for compatibility reasons, we are leaving UpdateCenter as-is. ........ r17911 | kohsuke | 2009-05-10 17:02:53 -0700 (Sun, 10 May 2009) | 1 line integrated json-lib with a bit of bug fix ........ r17912 | kohsuke | 2009-05-10 17:13:05 -0700 (Sun, 10 May 2009) | 1 line JDK list is now fetched from hudson.dev.java.net ........ r17958 | kohsuke | 2009-05-11 13:44:25 -0700 (Mon, 11 May 2009) | 48 lines Handle AbortException better to avoid error like this: [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] Failed to delete directory: C:\files\hudson\workspace\hudson\hudson\main\remoting\target. Reason: Unable to delete file C:\files\hudson\workspace\hudson\hudson\main\remoting\target\remoting-1.304-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] For more information, run Maven with the -e switch [INFO] ------------------------------------------------------------------------ [INFO] Total time: 31 seconds [INFO] Finished at: Sun May 10 18:15:33 PDT 2009 [INFO] Final Memory: 25M/48M [INFO] ------------------------------------------------------------------------ Recording fingerprints Archiving artifacts Recording test results ERROR: Failed to archive JUnit reports hudson.util.IOException2: remote file operation failed at hudson.FilePath.act(FilePath.java:596) at hudson.tasks.junit.JUnitResultArchiver.perform(JUnitResultArchiver.java:82) at hudson.model.AbstractBuild$AbstractRunner.performAllBuildStep(AbstractBuild.java:372) at hudson.model.AbstractBuild$AbstractRunner.performAllBuildStep(AbstractBuild.java:360) at hudson.model.Build$RunnerImpl.post2(Build.java:183) at hudson.model.AbstractBuild$AbstractRunner.post(AbstractBuild.java:345) at hudson.model.Run.run(Run.java:943) at hudson.model.Build.run(Build.java:112) at hudson.model.ResourceController.execute(ResourceController.java:93) at hudson.model.Executor.run(Executor.java:119) Caused by: hudson.AbortException: Test reports were found but none of them are new. Did tests run? For example, \files\hudson\workspace\hudson\hudson\main\core\target\surefire-reports\TEST-hudson.BulkChangeTest.xml is 2 days 23 hr old at hudson.tasks.junit.TestResult.parse(TestResult.java:134) at hudson.tasks.junit.TestResult.<init>(TestResult.java:95) at hudson.tasks.junit.JUnitResultArchiver$1.invoke(JUnitResultArchiver.java:95) at hudson.tasks.junit.JUnitResultArchiver$1.invoke(JUnitResultArchiver.java:82) at hudson.FilePath$FileCallableWrapper.call(FilePath.java:1583) at hudson.remoting.UserRequest.perform(UserRequest.java:92) at hudson.remoting.UserRequest.perform(UserRequest.java:46) at hudson.remoting.Request$2.run(Request.java:236) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) ........ r17961 | kohsuke | 2009-05-11 15:16:39 -0700 (Mon, 11 May 2009) | 1 line adding Windows JDK silent installation ........ r17962 | kohsuke | 2009-05-11 16:08:13 -0700 (Mon, 11 May 2009) | 1 line Fixing JDK offline installatino for Windows ........ r17970 | kohsuke | 2009-05-11 19:37:59 -0700 (Mon, 11 May 2009) | 1 line Fixing a problem that prevents the usage of this tag in <repeatable> block, which reinserts the same fragment over and over. So statically assigning IDs won't work ........ r17971 | kohsuke | 2009-05-11 22:17:09 -0700 (Mon, 11 May 2009) | 1 line continuing to remove static ID generation, which breaks the tag when used inside <repetable> tag. ........ r17972 | kohsuke | 2009-05-11 22:19:11 -0700 (Mon, 11 May 2009) | 1 line I don't know when this started, but even in the hudson-dev:run mode, the versionis no longer '?', so we need a different way to force reload ........ r17973 | kohsuke | 2009-05-11 22:26:34 -0700 (Mon, 11 May 2009) | 1 line adjusted the text a bit since multiple "add" and "delete"s were rather confusing ........ r17974 | kohsuke | 2009-05-11 22:31:58 -0700 (Mon, 11 May 2009) | 1 line added help screen ........ r17975 | kohsuke | 2009-05-11 22:41:39 -0700 (Mon, 11 May 2009) | 1 line form validation now works against the checkbox, too ........ r17976 | kohsuke | 2009-05-11 22:43:00 -0700 (Mon, 11 May 2009) | 1 line with auto installation, we expect users to specify a directory that doesn't exist yet, so don't report it as an error ........ r17977 | kohsuke | 2009-05-11 22:43:24 -0700 (Mon, 11 May 2009) | 1 line improving the text ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@17985 71c3de6d-444a-0410-be80-ed276b4c234a
2009-05-12 21:59:10 +08:00
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
2012-05-31 18:40:58 +08:00
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.ConcurrentModificationException;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
2011-03-01 16:15:15 +08:00
import java.util.Locale;
import java.util.Map;
import java.util.SortedMap;
import java.util.TimeZone;
import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import java.util.regex.Pattern;
import javax.annotation.Nullable;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jenkins.model.GlobalConfiguration;
import jenkins.model.GlobalConfigurationCategory;
import jenkins.model.Jenkins;
import jenkins.model.ModelObjectWithChildren;
import jenkins.model.ModelObjectWithContextMenu;
import org.acegisecurity.AccessDeniedException;
import org.apache.commons.jelly.JellyContext;
import org.apache.commons.jelly.JellyTagException;
import org.apache.commons.jelly.Script;
import org.apache.commons.jelly.XMLOutput;
import org.apache.commons.jexl.parser.ASTSizeFunction;
import org.apache.commons.jexl.util.Introspector;
import org.apache.commons.lang.StringUtils;
2014-06-24 23:09:42 +08:00
import org.jenkins.ui.icon.IconSet;
import org.jvnet.tiger_types.Types;
import org.kohsuke.stapler.Ancestor;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.jelly.InternationalizedStringExpression.RawHtmlArgument;
import hudson.model.PasswordParameterDefinition;
import hudson.util.RunList;
2016-12-13 05:14:48 +08:00
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.atomic.AtomicLong;
2015-05-29 20:02:59 +08:00
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
2015-05-29 19:54:36 +08:00
import org.apache.commons.io.IOUtils;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.accmod.restrictions.DoNotUse;
/**
* Utility functions used in views.
*
* <p>
* An instance of this class is created for each request and made accessible
* from view pages via the variable 'h' (h stands for Hudson.)
*
* @author Kohsuke Kawaguchi
*/
2013-07-14 17:38:58 +08:00
@SuppressWarnings("rawtypes")
public class Functions {
private static final AtomicLong iota = new AtomicLong();
2019-03-02 09:58:29 +08:00
private static Logger LOGGER = Logger.getLogger(Functions.class.getName());
[JENKINS 60920] header breadcrumbs CSS update (#4463) * New styles for breadcrumbs and warnings monitor * Adds the svgxuse polyfill for svg sprites on IE 11 * Created new styles for the page header - Used the material icons svg sprites to deliver the icons - Icons are rendered using a <svg> tag * Create new base styles file and undo changes to the layout-common and style css files * Fixes and refactor for the new UI CSS code * Make the new header color and logo section opt-in - The new UI can be toggled with the -Dui.enableNewUi=true flag * Rename and refactor the page-header css - Rename the css class namespace from .main-header to .page-header - Page header CSS moved into a modules folder and now included on the new-base-styles.css. This is done to avoid loading a separate file everytime. - Extracted color variables to their own file * Updated localization for header and admin monitor - The pageHeader template receives localization strings as props - Missing translation for the admin monitor on the it, bg and pl locales * Update core/src/main/resources/lib/layout/layout.jelly Co-Authored-By: Tim Jacomb <t.jacomb@kainos.com> * Most measurements migrated to REMs * Code cleanup and apply new-ui toggle to the html.jelly file * Breadcrumb fixes - Reverts breadcrumb link styling to use nested selectors instead of the .breadcrumbs__link class. The reason is that several plugins would break. - Shifted margins so that breadcrumbs can be fullwidth in the absence of the auto refresh link * Implemented some fixes from the feedback received - Removed box shadow webkit prefix - Fixed formatting on the breadcrumbs.css and layout-commons.less files - Renamed the new UI toggle class from _new-ui_ to _ui-refresh_ - Renamed references to the _new ui_ to _v2_ * Created jelly helper to use svg icons * Fix: restore proper icon for the user on the header * Fixes for Edge, IE 11 and IE 10 * Improvements on the header and breadcrumbs - Logo v2 changed and optimized using the svgo frontend https://jakearchibald.github.io/svgomg/ - Refactored the ammonitor insertion code - Breadcrumbs are no longer capitalized - Classic logo link no longer stretches past the images - Fixed classic logo link on IE11 - Updated color of the footer - Menu items background is also changed when hovering over the menu selector - Removed copyright notice on top of some files * Bumped JTH version with the SVG download fix * Update test/pom.xml Co-Authored-By: Tim Jacomb <t.jacomb@kainos.com> * Added a function to check boolean system properties from jelly * Fix header links and add svg styles for legacy layout * Some bug fixing for the new header - The ui-refresh changes were not properly being enabled with the boolean system property. Added explicit true check on the jelly templates. - Added an explicit width for the ui-refresh logo because it would mess with the layout * Update core/src/main/java/hudson/Functions.java Co-Authored-By: Adrien Lecharpentier <adrien.lecharpentier@gmail.com> * Do not check the system property on every page render Co-authored-by: Tim Jacomb <t.jacomb@kainos.com> Co-authored-by: Adrien Lecharpentier <adrien.lecharpentier@gmail.com> Co-authored-by: Daniel Beck <1831569+daniel-beck@users.noreply.github.com>
2020-02-21 00:57:47 +08:00
@Restricted(NoExternalUse.class)
public static /* non-final */ boolean UI_REFRESH = SystemProperties.getBoolean("jenkins.ui.refresh");
public Functions() {
}
/**
* Generates an unique ID.
*/
public String generateId() {
return "id" + iota.getAndIncrement();
}
public static boolean isModel(Object o) {
return o instanceof ModelObject;
}
public static boolean isModelWithContextMenu(Object o) {
return o instanceof ModelObjectWithContextMenu;
}
public static boolean isModelWithChildren(Object o) {
return o instanceof ModelObjectWithChildren;
}
@Deprecated
public static boolean isMatrixProject(Object o) {
return o != null && o.getClass().getName().equals("hudson.matrix.MatrixProject");
}
public static String xsDate(Calendar cal) {
return Util.XS_DATETIME_FORMATTER.format(cal.getTime());
}
public static String rfc822Date(Calendar cal) {
return Util.RFC822_DATETIME_FORMATTER.format(cal.getTime());
}
/**
* During Jenkins start-up, before {@link InitMilestone#PLUGINS_STARTED} the extensions lists will be empty
* and they are not guaranteed to be fully populated until after {@link InitMilestone#EXTENSIONS_AUGMENTED},
* similarly, during termination after {@link Jenkins#isTerminating()} is set, it is no longer safe to access
* the extensions lists.
* If you attempt to access the extensions list from a UI thread while the extensions are being loaded you will
* hit a big honking great monitor lock that will block until the effective extension list has been determined
* (as if a plugin fails to start, all of the failed plugin's extensions and any dependent plugins' extensions
* will have to be evicted from the list of extensions. In practical terms this only affects the
* "Jenkins is loading" screen, but as that screen uses the generic layouts we provide this utility method
* so that the generic layouts can avoid iterating extension lists while Jenkins is starting up.
* If you attempt to access the extensions list from a UI thread while Jenkins is being shut down, the extensions
* themselves may no longer be in a valid state and could attempt to revive themselves and block termination.
* In actual terms the termination only affects those views required to render {@link HudsonIsRestarting}'s
* {@code index.jelly} which is the same set as the {@link HudsonIsLoading} pages so it makes sense to
* use both checks here.
*
* @return {@code true} if the extensions lists have been populated.
2015-03-26 23:22:33 +08:00
* @since 1.607
*/
public static boolean isExtensionsAvailable() {
final Jenkins jenkins = Jenkins.getInstanceOrNull();
return jenkins != null && jenkins.getInitLevel().compareTo(InitMilestone.EXTENSIONS_AUGMENTED) >= 0
&& !jenkins.isTerminating();
}
public static void initPageVariables(JellyContext context) {
StaplerRequest currentRequest = Stapler.getCurrentRequest();
2019-07-03 02:20:41 +08:00
currentRequest.getWebApp().getDispatchValidator().allowDispatch(currentRequest, Stapler.getCurrentResponse());
String rootURL = currentRequest.getContextPath();
2012-09-13 05:04:19 +08:00
Functions h = new Functions();
2012-09-13 05:04:19 +08:00
context.setVariable("h", h);
2012-09-13 05:04:19 +08:00
// The path starts with a "/" character but does not end with a "/" character.
context.setVariable("rootURL", rootURL);
2012-09-13 05:04:19 +08:00
/*
load static resources from the path dedicated to a specific version.
This "/static/VERSION/abc/def.ghi" path is interpreted by stapler to be
the same thing as "/abc/def.ghi", but this avoids the stale cache
problem when the user upgrades to new Jenkins. Stapler also sets a long
future expiration dates for such static resources.
see https://wiki.jenkins-ci.org/display/JENKINS/Hyperlinks+in+HTML
2012-09-13 05:04:19 +08:00
*/
context.setVariable("resURL",rootURL+getResourcePath());
context.setVariable("imagesURL",rootURL+getResourcePath()+"/images");
context.setVariable("userAgent", currentRequest.getHeader("User-Agent"));
2014-06-24 23:09:42 +08:00
IconSet.initPageVariables(context);
}
Merged revisions 17324-17325,17428,17430,17473-17475,17481-17482,17555-17563,17571,17593-17595,17619-17620,17637-17644,17656-17657,17663-17665,17667-17670,17730,17753,17755-17758,17763-17768,17770-17771,17901,17906,17911-17912,17958,17961-17962,17970-17977 via svnmerge from https://www.dev.java.net/svn/hudson/branches/tool-autoinstallation ........ r17324 | jglick | 2009-04-20 18:24:32 -0700 (Mon, 20 Apr 2009) | 2 lines Defensive cloning and Javadoc corrections. (Though it seems no one is using the default impls of these methods yet anyway.) ........ r17325 | jglick | 2009-04-20 18:29:06 -0700 (Mon, 20 Apr 2009) | 1 line Deprecation of delegate method is intentional. ........ r17428 | jglick | 2009-04-23 08:07:14 -0700 (Thu, 23 Apr 2009) | 1 line Noting ToolLocationTranslator more prominently. ........ r17430 | jglick | 2009-04-23 09:16:40 -0700 (Thu, 23 Apr 2009) | 1 line Unused imports. ........ r17473 | jglick | 2009-04-23 19:21:11 -0700 (Thu, 23 Apr 2009) | 1 line Allow Plugin.configure to see the StaplerRequest, needed for some kinds of calls. ........ r17474 | jglick | 2009-04-23 19:25:54 -0700 (Thu, 23 Apr 2009) | 3 lines Initial sketch of plugin to manage tool installations across slaves. (Should really be under ../plugins/ but that was not branched, so putting here for the moment.) ........ r17475 | jglick | 2009-04-23 20:29:36 -0700 (Thu, 23 Apr 2009) | 1 line Typo in Javadoc. ........ r17481 | jglick | 2009-04-23 22:46:26 -0700 (Thu, 23 Apr 2009) | 1 line Unzip of an unbuffered stream is painfully slow. ........ r17482 | jglick | 2009-04-23 22:48:01 -0700 (Thu, 23 Apr 2009) | 1 line ZIP-based tool installer now functional. ........ r17555 | jglick | 2009-04-27 17:50:38 -0700 (Mon, 27 Apr 2009) | 1 line Build against newest trunk. ........ r17556 | jglick | 2009-04-27 18:38:28 -0700 (Mon, 27 Apr 2009) | 1 line Adding help. ........ r17557 | jglick | 2009-04-27 18:57:46 -0700 (Mon, 27 Apr 2009) | 1 line Moving toolName & label config GUI into generic files. ........ r17558 | jglick | 2009-04-27 19:37:30 -0700 (Mon, 27 Apr 2009) | 1 line Typo. ........ r17559 | jglick | 2009-04-27 20:07:47 -0700 (Mon, 27 Apr 2009) | 1 line Second tool installer type based on a freeform command. ........ r17560 | jglick | 2009-04-27 20:24:36 -0700 (Mon, 27 Apr 2009) | 1 line installIfNecessaryFrom will now just return false in case the target dir exists but the URL cannot be opened. ........ r17561 | jglick | 2009-04-27 20:25:22 -0700 (Mon, 27 Apr 2009) | 2 lines chmod only if something was actually installed. Use a+x, not o+x. ........ r17562 | jglick | 2009-04-27 20:26:46 -0700 (Mon, 27 Apr 2009) | 1 line Comment only. ........ r17563 | jglick | 2009-04-27 20:41:12 -0700 (Mon, 27 Apr 2009) | 1 line I18N. ........ r17571 | jglick | 2009-04-28 08:15:31 -0700 (Tue, 28 Apr 2009) | 2 lines Wiki link. ........ r17593 | jglick | 2009-04-28 15:38:33 -0700 (Tue, 28 Apr 2009) | 1 line Turn off echo mode, it's just noise. ........ r17594 | jglick | 2009-04-28 15:39:29 -0700 (Tue, 28 Apr 2009) | 2 lines Synchronizing access to installers for a given node/tool combo. Sending log messages to Hudson log in real time. ........ r17595 | jglick | 2009-04-28 15:46:29 -0700 (Tue, 28 Apr 2009) | 1 line Copyrights. ........ r17619 | jglick | 2009-04-29 06:25:23 -0700 (Wed, 29 Apr 2009) | 1 line Improved Javadoc. ........ r17620 | jglick | 2009-04-29 06:51:11 -0700 (Wed, 29 Apr 2009) | 1 line Demonstraing how to use DLJ to mechanically install official JDK releases on supported operating systems. ........ r17637 | kohsuke | 2009-04-30 16:15:24 -0700 (Thu, 30 Apr 2009) | 1 line fixed what appears to be a C&P mistake ........ r17638 | kohsuke | 2009-04-30 16:16:21 -0700 (Thu, 30 Apr 2009) | 1 line show YUI logger if YUI debugging mode is set. ........ r17639 | kohsuke | 2009-04-30 16:52:28 -0700 (Thu, 30 Apr 2009) | 7 lines Fixed a UI script problem when <hetero-list> nests inside <repeatable>. The cause of the problem was that the behavior for inner <hetero-list> kicks in first, altering HTML (by removing "prototypes"), before behavior for outer <repetable> kicks in and removes the master copy from DOM tree. So <repeatable> ends up computing a master copy after some elements are removed, and hence when we try to reinsert them later by clicking "Add", it'll get incorrect copy, and re-execution of the <hetero-list> behavior bombs out. I fixed this by skipping those HTML-altering behaviors if they show up in the part of DOM tree that's supposed to be snapshotted and removed. ........ r17640 | kohsuke | 2009-04-30 16:57:58 -0700 (Thu, 30 Apr 2009) | 7 lines Added ToolProperty to ToolInstallation (which acts like NodeProperty to Node --- basically decorates the base object with additional properties.) The original motivation is to implement ToolInstaller this way, if Jesse is OK. But decorating tools seem to have some other interesting use, such as a plugin for configuring $M2_HOME/conf/settings.xml, or a plugin to insert unlimited cryptography extension to JDK, or a plugin to add a few more jars into $ANT_HOME/lib. For this to work, ToolInstallations that want properties needs to be modified to use a new constructor. For a starter, I modified the JDK class to do this. I also took the opportunity to modernize JDK/config.jelly. ........ r17641 | kohsuke | 2009-04-30 17:02:04 -0700 (Thu, 30 Apr 2009) | 1 line this appears to be a left-over from early days when we didn't have a means to do form validation ........ r17642 | kohsuke | 2009-04-30 17:02:35 -0700 (Thu, 30 Apr 2009) | 1 line we don't need no.such.JDK but we need name. rebranching ........ r17643 | kohsuke | 2009-04-30 17:03:22 -0700 (Thu, 30 Apr 2009) | 1 line rebranched from Hudson's configure.properties ........ r17644 | kohsuke | 2009-04-30 17:05:31 -0700 (Thu, 30 Apr 2009) | 1 line removed unnecessary translations ........ r17656 | kohsuke | 2009-05-01 11:27:36 -0700 (Fri, 01 May 2009) | 1 line Less hack for improved type safety. Asking people to write more code is not necessarily bad as long as what they need to do is obvious to them. ........ r17657 | kohsuke | 2009-05-01 12:07:20 -0700 (Fri, 01 May 2009) | 5 lines The toolautoinst part of the change that corresponds to rev.17640. ToolInstallers are now hooked under ToolInstallation through InstallSourceProperty as a ToolProperty. This allows the relevant UIs to be shown in one place. Still pending Jesse's feedback. Making it a single commit to simplify a revert if necessary ........ r17663 | kohsuke | 2009-05-01 13:23:51 -0700 (Fri, 01 May 2009) | 1 line doc improvement ........ r17664 | kohsuke | 2009-05-01 13:24:10 -0700 (Fri, 01 May 2009) | 1 line needs this to allow Stapler to databind hetero-list automatically ........ r17665 | jglick | 2009-05-01 13:31:27 -0700 (Fri, 01 May 2009) | 1 line Warnings. ........ r17667 | kohsuke | 2009-05-01 14:20:53 -0700 (Fri, 01 May 2009) | 1 line added a method to do chmod ........ r17668 | kohsuke | 2009-05-01 14:30:35 -0700 (Fri, 01 May 2009) | 1 line prefer JDK6 version to avoid unnecessary JNA loading ........ r17669 | kohsuke | 2009-05-01 14:33:09 -0700 (Fri, 01 May 2009) | 1 line no, I must have confused this. ........ r17670 | kohsuke | 2009-05-01 15:57:11 -0700 (Fri, 01 May 2009) | 2 lines - Automated JDK installer and its test. - Minor update to the signature of ToolInstaller for supplying the expected default location. ........ r17730 | kohsuke | 2009-05-04 11:27:34 -0700 (Mon, 04 May 2009) | 1 line avoid NPE as reported in HUDSON-3608 ........ r17753 | jglick | 2009-05-04 19:34:08 -0700 (Mon, 04 May 2009) | 2 lines Moved toolautoinst functionality into core. ........ r17755 | jglick | 2009-05-04 20:28:34 -0700 (Mon, 04 May 2009) | 8 lines Added TaskListener parameter and IOException and InterruptedException to several methods: Run.getEnvironment NodeSpecific.forNode ToolLocationTranslator.getToolHome ToolLocationNodeProperty.getToolHome ToolInstallation.translateFor ProcessCache.Factory.getMavenInstallation ProcessCache.Factory.getJava ........ r17756 | jglick | 2009-05-04 20:36:56 -0700 (Mon, 04 May 2009) | 1 line expectedLocation was never strictly necessary, and will soon no longer be used even by JDKInstaller. ........ r17757 | jglick | 2009-05-04 20:40:41 -0700 (Mon, 04 May 2009) | 1 line Not sure yet what @since should be. ........ r17758 | jglick | 2009-05-04 20:41:51 -0700 (Mon, 04 May 2009) | 1 line getDefaultInstallers method added. Not yet in use. ........ r17763 | kohsuke | 2009-05-05 10:50:36 -0700 (Tue, 05 May 2009) | 1 line deprecated redundant getJavaHome method ........ r17764 | kohsuke | 2009-05-05 12:10:45 -0700 (Tue, 05 May 2009) | 1 line added general-purpose property defaulting mechanism, and added default tool installer for JDK ........ r17765 | jglick | 2009-05-05 12:35:56 -0700 (Tue, 05 May 2009) | 1 line capitalize("") -> "" ........ r17766 | jglick | 2009-05-05 12:49:52 -0700 (Tue, 05 May 2009) | 1 line Missing @since. ........ r17767 | jglick | 2009-05-05 13:01:41 -0700 (Tue, 05 May 2009) | 1 line Unchecked warning. ........ r17768 | jglick | 2009-05-05 13:19:49 -0700 (Tue, 05 May 2009) | 2 lines Two unsuccessful attempts at form validation. ........ r17770 | jglick | 2009-05-05 13:48:37 -0700 (Tue, 05 May 2009) | 1 line Better class names. ........ r17771 | kohsuke | 2009-05-05 14:12:21 -0700 (Tue, 05 May 2009) | 5 lines brought the form validation check back. The trick is to use the 'value' parameter. In the end we'd expect this check to go away anyway, as we change input field to drop-down list, but in the mean time, this is why it didn't work. Maybe we probably need more static code checkers? Like FindBugs rules? ........ r17901 | kohsuke | 2009-05-09 19:15:40 -0700 (Sat, 09 May 2009) | 1 line having two toolHome is odd. ........ r17906 | kohsuke | 2009-05-10 11:09:13 -0700 (Sun, 10 May 2009) | 1 line adding the generalization of UpdateCenter, but for compatibility reasons, we are leaving UpdateCenter as-is. ........ r17911 | kohsuke | 2009-05-10 17:02:53 -0700 (Sun, 10 May 2009) | 1 line integrated json-lib with a bit of bug fix ........ r17912 | kohsuke | 2009-05-10 17:13:05 -0700 (Sun, 10 May 2009) | 1 line JDK list is now fetched from hudson.dev.java.net ........ r17958 | kohsuke | 2009-05-11 13:44:25 -0700 (Mon, 11 May 2009) | 48 lines Handle AbortException better to avoid error like this: [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] Failed to delete directory: C:\files\hudson\workspace\hudson\hudson\main\remoting\target. Reason: Unable to delete file C:\files\hudson\workspace\hudson\hudson\main\remoting\target\remoting-1.304-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] For more information, run Maven with the -e switch [INFO] ------------------------------------------------------------------------ [INFO] Total time: 31 seconds [INFO] Finished at: Sun May 10 18:15:33 PDT 2009 [INFO] Final Memory: 25M/48M [INFO] ------------------------------------------------------------------------ Recording fingerprints Archiving artifacts Recording test results ERROR: Failed to archive JUnit reports hudson.util.IOException2: remote file operation failed at hudson.FilePath.act(FilePath.java:596) at hudson.tasks.junit.JUnitResultArchiver.perform(JUnitResultArchiver.java:82) at hudson.model.AbstractBuild$AbstractRunner.performAllBuildStep(AbstractBuild.java:372) at hudson.model.AbstractBuild$AbstractRunner.performAllBuildStep(AbstractBuild.java:360) at hudson.model.Build$RunnerImpl.post2(Build.java:183) at hudson.model.AbstractBuild$AbstractRunner.post(AbstractBuild.java:345) at hudson.model.Run.run(Run.java:943) at hudson.model.Build.run(Build.java:112) at hudson.model.ResourceController.execute(ResourceController.java:93) at hudson.model.Executor.run(Executor.java:119) Caused by: hudson.AbortException: Test reports were found but none of them are new. Did tests run? For example, \files\hudson\workspace\hudson\hudson\main\core\target\surefire-reports\TEST-hudson.BulkChangeTest.xml is 2 days 23 hr old at hudson.tasks.junit.TestResult.parse(TestResult.java:134) at hudson.tasks.junit.TestResult.<init>(TestResult.java:95) at hudson.tasks.junit.JUnitResultArchiver$1.invoke(JUnitResultArchiver.java:95) at hudson.tasks.junit.JUnitResultArchiver$1.invoke(JUnitResultArchiver.java:82) at hudson.FilePath$FileCallableWrapper.call(FilePath.java:1583) at hudson.remoting.UserRequest.perform(UserRequest.java:92) at hudson.remoting.UserRequest.perform(UserRequest.java:46) at hudson.remoting.Request$2.run(Request.java:236) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) ........ r17961 | kohsuke | 2009-05-11 15:16:39 -0700 (Mon, 11 May 2009) | 1 line adding Windows JDK silent installation ........ r17962 | kohsuke | 2009-05-11 16:08:13 -0700 (Mon, 11 May 2009) | 1 line Fixing JDK offline installatino for Windows ........ r17970 | kohsuke | 2009-05-11 19:37:59 -0700 (Mon, 11 May 2009) | 1 line Fixing a problem that prevents the usage of this tag in <repeatable> block, which reinserts the same fragment over and over. So statically assigning IDs won't work ........ r17971 | kohsuke | 2009-05-11 22:17:09 -0700 (Mon, 11 May 2009) | 1 line continuing to remove static ID generation, which breaks the tag when used inside <repetable> tag. ........ r17972 | kohsuke | 2009-05-11 22:19:11 -0700 (Mon, 11 May 2009) | 1 line I don't know when this started, but even in the hudson-dev:run mode, the versionis no longer '?', so we need a different way to force reload ........ r17973 | kohsuke | 2009-05-11 22:26:34 -0700 (Mon, 11 May 2009) | 1 line adjusted the text a bit since multiple "add" and "delete"s were rather confusing ........ r17974 | kohsuke | 2009-05-11 22:31:58 -0700 (Mon, 11 May 2009) | 1 line added help screen ........ r17975 | kohsuke | 2009-05-11 22:41:39 -0700 (Mon, 11 May 2009) | 1 line form validation now works against the checkbox, too ........ r17976 | kohsuke | 2009-05-11 22:43:00 -0700 (Mon, 11 May 2009) | 1 line with auto installation, we expect users to specify a directory that doesn't exist yet, so don't report it as an error ........ r17977 | kohsuke | 2009-05-11 22:43:24 -0700 (Mon, 11 May 2009) | 1 line improving the text ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@17985 71c3de6d-444a-0410-be80-ed276b4c234a
2009-05-12 21:59:10 +08:00
/**
* Given {@code c=MyList (extends ArrayList<Foo>), base=List}, compute the parameterization of 'base'
* that's assignable from 'c' (in this case {@code List<Foo>}), and return its n-th type parameter
* (n=0 would return {@code Foo}).
*
* <p>
* This method is useful for doing type arithmetic.
*
* @throws AssertionError
* if c' is not parameterized.
*/
public static <B> Class getTypeParameter(Class<? extends B> c, Class<B> base, int n) {
Type parameterization = Types.getBaseClass(c,base);
if (parameterization instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) parameterization;
return Types.erasure(Types.getTypeArgument(pt,n));
} else {
throw new AssertionError(c+" doesn't properly parameterize "+base);
}
}
public JDK.DescriptorImpl getJDKDescriptor() {
return Jenkins.get().getDescriptorByType(JDK.DescriptorImpl.class);
Merged revisions 17324-17325,17428,17430,17473-17475,17481-17482,17555-17563,17571,17593-17595,17619-17620,17637-17644,17656-17657,17663-17665,17667-17670,17730,17753,17755-17758,17763-17768,17770-17771,17901,17906,17911-17912,17958,17961-17962,17970-17977 via svnmerge from https://www.dev.java.net/svn/hudson/branches/tool-autoinstallation ........ r17324 | jglick | 2009-04-20 18:24:32 -0700 (Mon, 20 Apr 2009) | 2 lines Defensive cloning and Javadoc corrections. (Though it seems no one is using the default impls of these methods yet anyway.) ........ r17325 | jglick | 2009-04-20 18:29:06 -0700 (Mon, 20 Apr 2009) | 1 line Deprecation of delegate method is intentional. ........ r17428 | jglick | 2009-04-23 08:07:14 -0700 (Thu, 23 Apr 2009) | 1 line Noting ToolLocationTranslator more prominently. ........ r17430 | jglick | 2009-04-23 09:16:40 -0700 (Thu, 23 Apr 2009) | 1 line Unused imports. ........ r17473 | jglick | 2009-04-23 19:21:11 -0700 (Thu, 23 Apr 2009) | 1 line Allow Plugin.configure to see the StaplerRequest, needed for some kinds of calls. ........ r17474 | jglick | 2009-04-23 19:25:54 -0700 (Thu, 23 Apr 2009) | 3 lines Initial sketch of plugin to manage tool installations across slaves. (Should really be under ../plugins/ but that was not branched, so putting here for the moment.) ........ r17475 | jglick | 2009-04-23 20:29:36 -0700 (Thu, 23 Apr 2009) | 1 line Typo in Javadoc. ........ r17481 | jglick | 2009-04-23 22:46:26 -0700 (Thu, 23 Apr 2009) | 1 line Unzip of an unbuffered stream is painfully slow. ........ r17482 | jglick | 2009-04-23 22:48:01 -0700 (Thu, 23 Apr 2009) | 1 line ZIP-based tool installer now functional. ........ r17555 | jglick | 2009-04-27 17:50:38 -0700 (Mon, 27 Apr 2009) | 1 line Build against newest trunk. ........ r17556 | jglick | 2009-04-27 18:38:28 -0700 (Mon, 27 Apr 2009) | 1 line Adding help. ........ r17557 | jglick | 2009-04-27 18:57:46 -0700 (Mon, 27 Apr 2009) | 1 line Moving toolName & label config GUI into generic files. ........ r17558 | jglick | 2009-04-27 19:37:30 -0700 (Mon, 27 Apr 2009) | 1 line Typo. ........ r17559 | jglick | 2009-04-27 20:07:47 -0700 (Mon, 27 Apr 2009) | 1 line Second tool installer type based on a freeform command. ........ r17560 | jglick | 2009-04-27 20:24:36 -0700 (Mon, 27 Apr 2009) | 1 line installIfNecessaryFrom will now just return false in case the target dir exists but the URL cannot be opened. ........ r17561 | jglick | 2009-04-27 20:25:22 -0700 (Mon, 27 Apr 2009) | 2 lines chmod only if something was actually installed. Use a+x, not o+x. ........ r17562 | jglick | 2009-04-27 20:26:46 -0700 (Mon, 27 Apr 2009) | 1 line Comment only. ........ r17563 | jglick | 2009-04-27 20:41:12 -0700 (Mon, 27 Apr 2009) | 1 line I18N. ........ r17571 | jglick | 2009-04-28 08:15:31 -0700 (Tue, 28 Apr 2009) | 2 lines Wiki link. ........ r17593 | jglick | 2009-04-28 15:38:33 -0700 (Tue, 28 Apr 2009) | 1 line Turn off echo mode, it's just noise. ........ r17594 | jglick | 2009-04-28 15:39:29 -0700 (Tue, 28 Apr 2009) | 2 lines Synchronizing access to installers for a given node/tool combo. Sending log messages to Hudson log in real time. ........ r17595 | jglick | 2009-04-28 15:46:29 -0700 (Tue, 28 Apr 2009) | 1 line Copyrights. ........ r17619 | jglick | 2009-04-29 06:25:23 -0700 (Wed, 29 Apr 2009) | 1 line Improved Javadoc. ........ r17620 | jglick | 2009-04-29 06:51:11 -0700 (Wed, 29 Apr 2009) | 1 line Demonstraing how to use DLJ to mechanically install official JDK releases on supported operating systems. ........ r17637 | kohsuke | 2009-04-30 16:15:24 -0700 (Thu, 30 Apr 2009) | 1 line fixed what appears to be a C&P mistake ........ r17638 | kohsuke | 2009-04-30 16:16:21 -0700 (Thu, 30 Apr 2009) | 1 line show YUI logger if YUI debugging mode is set. ........ r17639 | kohsuke | 2009-04-30 16:52:28 -0700 (Thu, 30 Apr 2009) | 7 lines Fixed a UI script problem when <hetero-list> nests inside <repeatable>. The cause of the problem was that the behavior for inner <hetero-list> kicks in first, altering HTML (by removing "prototypes"), before behavior for outer <repetable> kicks in and removes the master copy from DOM tree. So <repeatable> ends up computing a master copy after some elements are removed, and hence when we try to reinsert them later by clicking "Add", it'll get incorrect copy, and re-execution of the <hetero-list> behavior bombs out. I fixed this by skipping those HTML-altering behaviors if they show up in the part of DOM tree that's supposed to be snapshotted and removed. ........ r17640 | kohsuke | 2009-04-30 16:57:58 -0700 (Thu, 30 Apr 2009) | 7 lines Added ToolProperty to ToolInstallation (which acts like NodeProperty to Node --- basically decorates the base object with additional properties.) The original motivation is to implement ToolInstaller this way, if Jesse is OK. But decorating tools seem to have some other interesting use, such as a plugin for configuring $M2_HOME/conf/settings.xml, or a plugin to insert unlimited cryptography extension to JDK, or a plugin to add a few more jars into $ANT_HOME/lib. For this to work, ToolInstallations that want properties needs to be modified to use a new constructor. For a starter, I modified the JDK class to do this. I also took the opportunity to modernize JDK/config.jelly. ........ r17641 | kohsuke | 2009-04-30 17:02:04 -0700 (Thu, 30 Apr 2009) | 1 line this appears to be a left-over from early days when we didn't have a means to do form validation ........ r17642 | kohsuke | 2009-04-30 17:02:35 -0700 (Thu, 30 Apr 2009) | 1 line we don't need no.such.JDK but we need name. rebranching ........ r17643 | kohsuke | 2009-04-30 17:03:22 -0700 (Thu, 30 Apr 2009) | 1 line rebranched from Hudson's configure.properties ........ r17644 | kohsuke | 2009-04-30 17:05:31 -0700 (Thu, 30 Apr 2009) | 1 line removed unnecessary translations ........ r17656 | kohsuke | 2009-05-01 11:27:36 -0700 (Fri, 01 May 2009) | 1 line Less hack for improved type safety. Asking people to write more code is not necessarily bad as long as what they need to do is obvious to them. ........ r17657 | kohsuke | 2009-05-01 12:07:20 -0700 (Fri, 01 May 2009) | 5 lines The toolautoinst part of the change that corresponds to rev.17640. ToolInstallers are now hooked under ToolInstallation through InstallSourceProperty as a ToolProperty. This allows the relevant UIs to be shown in one place. Still pending Jesse's feedback. Making it a single commit to simplify a revert if necessary ........ r17663 | kohsuke | 2009-05-01 13:23:51 -0700 (Fri, 01 May 2009) | 1 line doc improvement ........ r17664 | kohsuke | 2009-05-01 13:24:10 -0700 (Fri, 01 May 2009) | 1 line needs this to allow Stapler to databind hetero-list automatically ........ r17665 | jglick | 2009-05-01 13:31:27 -0700 (Fri, 01 May 2009) | 1 line Warnings. ........ r17667 | kohsuke | 2009-05-01 14:20:53 -0700 (Fri, 01 May 2009) | 1 line added a method to do chmod ........ r17668 | kohsuke | 2009-05-01 14:30:35 -0700 (Fri, 01 May 2009) | 1 line prefer JDK6 version to avoid unnecessary JNA loading ........ r17669 | kohsuke | 2009-05-01 14:33:09 -0700 (Fri, 01 May 2009) | 1 line no, I must have confused this. ........ r17670 | kohsuke | 2009-05-01 15:57:11 -0700 (Fri, 01 May 2009) | 2 lines - Automated JDK installer and its test. - Minor update to the signature of ToolInstaller for supplying the expected default location. ........ r17730 | kohsuke | 2009-05-04 11:27:34 -0700 (Mon, 04 May 2009) | 1 line avoid NPE as reported in HUDSON-3608 ........ r17753 | jglick | 2009-05-04 19:34:08 -0700 (Mon, 04 May 2009) | 2 lines Moved toolautoinst functionality into core. ........ r17755 | jglick | 2009-05-04 20:28:34 -0700 (Mon, 04 May 2009) | 8 lines Added TaskListener parameter and IOException and InterruptedException to several methods: Run.getEnvironment NodeSpecific.forNode ToolLocationTranslator.getToolHome ToolLocationNodeProperty.getToolHome ToolInstallation.translateFor ProcessCache.Factory.getMavenInstallation ProcessCache.Factory.getJava ........ r17756 | jglick | 2009-05-04 20:36:56 -0700 (Mon, 04 May 2009) | 1 line expectedLocation was never strictly necessary, and will soon no longer be used even by JDKInstaller. ........ r17757 | jglick | 2009-05-04 20:40:41 -0700 (Mon, 04 May 2009) | 1 line Not sure yet what @since should be. ........ r17758 | jglick | 2009-05-04 20:41:51 -0700 (Mon, 04 May 2009) | 1 line getDefaultInstallers method added. Not yet in use. ........ r17763 | kohsuke | 2009-05-05 10:50:36 -0700 (Tue, 05 May 2009) | 1 line deprecated redundant getJavaHome method ........ r17764 | kohsuke | 2009-05-05 12:10:45 -0700 (Tue, 05 May 2009) | 1 line added general-purpose property defaulting mechanism, and added default tool installer for JDK ........ r17765 | jglick | 2009-05-05 12:35:56 -0700 (Tue, 05 May 2009) | 1 line capitalize("") -> "" ........ r17766 | jglick | 2009-05-05 12:49:52 -0700 (Tue, 05 May 2009) | 1 line Missing @since. ........ r17767 | jglick | 2009-05-05 13:01:41 -0700 (Tue, 05 May 2009) | 1 line Unchecked warning. ........ r17768 | jglick | 2009-05-05 13:19:49 -0700 (Tue, 05 May 2009) | 2 lines Two unsuccessful attempts at form validation. ........ r17770 | jglick | 2009-05-05 13:48:37 -0700 (Tue, 05 May 2009) | 1 line Better class names. ........ r17771 | kohsuke | 2009-05-05 14:12:21 -0700 (Tue, 05 May 2009) | 5 lines brought the form validation check back. The trick is to use the 'value' parameter. In the end we'd expect this check to go away anyway, as we change input field to drop-down list, but in the mean time, this is why it didn't work. Maybe we probably need more static code checkers? Like FindBugs rules? ........ r17901 | kohsuke | 2009-05-09 19:15:40 -0700 (Sat, 09 May 2009) | 1 line having two toolHome is odd. ........ r17906 | kohsuke | 2009-05-10 11:09:13 -0700 (Sun, 10 May 2009) | 1 line adding the generalization of UpdateCenter, but for compatibility reasons, we are leaving UpdateCenter as-is. ........ r17911 | kohsuke | 2009-05-10 17:02:53 -0700 (Sun, 10 May 2009) | 1 line integrated json-lib with a bit of bug fix ........ r17912 | kohsuke | 2009-05-10 17:13:05 -0700 (Sun, 10 May 2009) | 1 line JDK list is now fetched from hudson.dev.java.net ........ r17958 | kohsuke | 2009-05-11 13:44:25 -0700 (Mon, 11 May 2009) | 48 lines Handle AbortException better to avoid error like this: [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] Failed to delete directory: C:\files\hudson\workspace\hudson\hudson\main\remoting\target. Reason: Unable to delete file C:\files\hudson\workspace\hudson\hudson\main\remoting\target\remoting-1.304-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] For more information, run Maven with the -e switch [INFO] ------------------------------------------------------------------------ [INFO] Total time: 31 seconds [INFO] Finished at: Sun May 10 18:15:33 PDT 2009 [INFO] Final Memory: 25M/48M [INFO] ------------------------------------------------------------------------ Recording fingerprints Archiving artifacts Recording test results ERROR: Failed to archive JUnit reports hudson.util.IOException2: remote file operation failed at hudson.FilePath.act(FilePath.java:596) at hudson.tasks.junit.JUnitResultArchiver.perform(JUnitResultArchiver.java:82) at hudson.model.AbstractBuild$AbstractRunner.performAllBuildStep(AbstractBuild.java:372) at hudson.model.AbstractBuild$AbstractRunner.performAllBuildStep(AbstractBuild.java:360) at hudson.model.Build$RunnerImpl.post2(Build.java:183) at hudson.model.AbstractBuild$AbstractRunner.post(AbstractBuild.java:345) at hudson.model.Run.run(Run.java:943) at hudson.model.Build.run(Build.java:112) at hudson.model.ResourceController.execute(ResourceController.java:93) at hudson.model.Executor.run(Executor.java:119) Caused by: hudson.AbortException: Test reports were found but none of them are new. Did tests run? For example, \files\hudson\workspace\hudson\hudson\main\core\target\surefire-reports\TEST-hudson.BulkChangeTest.xml is 2 days 23 hr old at hudson.tasks.junit.TestResult.parse(TestResult.java:134) at hudson.tasks.junit.TestResult.<init>(TestResult.java:95) at hudson.tasks.junit.JUnitResultArchiver$1.invoke(JUnitResultArchiver.java:95) at hudson.tasks.junit.JUnitResultArchiver$1.invoke(JUnitResultArchiver.java:82) at hudson.FilePath$FileCallableWrapper.call(FilePath.java:1583) at hudson.remoting.UserRequest.perform(UserRequest.java:92) at hudson.remoting.UserRequest.perform(UserRequest.java:46) at hudson.remoting.Request$2.run(Request.java:236) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) ........ r17961 | kohsuke | 2009-05-11 15:16:39 -0700 (Mon, 11 May 2009) | 1 line adding Windows JDK silent installation ........ r17962 | kohsuke | 2009-05-11 16:08:13 -0700 (Mon, 11 May 2009) | 1 line Fixing JDK offline installatino for Windows ........ r17970 | kohsuke | 2009-05-11 19:37:59 -0700 (Mon, 11 May 2009) | 1 line Fixing a problem that prevents the usage of this tag in <repeatable> block, which reinserts the same fragment over and over. So statically assigning IDs won't work ........ r17971 | kohsuke | 2009-05-11 22:17:09 -0700 (Mon, 11 May 2009) | 1 line continuing to remove static ID generation, which breaks the tag when used inside <repetable> tag. ........ r17972 | kohsuke | 2009-05-11 22:19:11 -0700 (Mon, 11 May 2009) | 1 line I don't know when this started, but even in the hudson-dev:run mode, the versionis no longer '?', so we need a different way to force reload ........ r17973 | kohsuke | 2009-05-11 22:26:34 -0700 (Mon, 11 May 2009) | 1 line adjusted the text a bit since multiple "add" and "delete"s were rather confusing ........ r17974 | kohsuke | 2009-05-11 22:31:58 -0700 (Mon, 11 May 2009) | 1 line added help screen ........ r17975 | kohsuke | 2009-05-11 22:41:39 -0700 (Mon, 11 May 2009) | 1 line form validation now works against the checkbox, too ........ r17976 | kohsuke | 2009-05-11 22:43:00 -0700 (Mon, 11 May 2009) | 1 line with auto installation, we expect users to specify a directory that doesn't exist yet, so don't report it as an error ........ r17977 | kohsuke | 2009-05-11 22:43:24 -0700 (Mon, 11 May 2009) | 1 line improving the text ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@17985 71c3de6d-444a-0410-be80-ed276b4c234a
2009-05-12 21:59:10 +08:00
}
/**
* Prints the integer as a string that represents difference,
* like "-5", "+/-0", "+3".
*/
public static String getDiffString(int i) {
if(i==0) return "±0";
String s = Integer.toString(i);
if(i>0) return "+"+s;
else return s;
}
/**
* {@link #getDiffString(int)} that doesn't show anything for +/-0
*/
public static String getDiffString2(int i) {
if(i==0) return "";
String s = Integer.toString(i);
if(i>0) return "+"+s;
else return s;
}
/**
* {@link #getDiffString2(int)} that puts the result into prefix and suffix
* if there's something to print
*/
public static String getDiffString2(String prefix, int i, String suffix) {
if(i==0) return "";
String s = Integer.toString(i);
if(i>0) return prefix+"+"+s+suffix;
else return prefix+s+suffix;
}
/**
* Adds the proper suffix.
*/
public static String addSuffix(int n, String singular, String plural) {
StringBuilder buf = new StringBuilder();
buf.append(n).append(' ');
if(n==1)
buf.append(singular);
else
buf.append(plural);
return buf.toString();
}
public static RunUrl decompose(StaplerRequest req) {
List<Ancestor> ancestors = req.getAncestors();
// find the first and last Run instances
Ancestor f=null,l=null;
for (Ancestor anc : ancestors) {
if(anc.getObject() instanceof Run) {
if(f==null) f=anc;
l=anc;
}
}
if(l==null) return null; // there was no Run object
String head = f.getPrev().getUrl()+'/';
String base = l.getUrl();
String reqUri = req.getOriginalRequestURI();
// Find "rest" or URI by removing N path components.
// Not using reqUri.substring(f.getUrl().length()) to avoid mismatches due to
// url-encoding or extra slashes. Former may occur in Tomcat (despite the spec saying
// this string is not decoded, Tomcat apparently decodes this string. You see ' '
// instead of '%20', which is what the browser has sent), latter may occur in some
// proxy or URL-rewriting setups where extra slashes are inadvertently added.
String furl = f.getUrl();
int slashCount = 0;
// Count components in ancestor URL
for (int i = furl.indexOf('/'); i >= 0; i = furl.indexOf('/', i + 1)) slashCount++;
// Remove that many from request URL, ignoring extra slashes
String rest = reqUri.replaceFirst("(?:/+[^/]*){" + slashCount + "}", "");
return new RunUrl( (Run) f.getObject(), head, base, rest);
}
/**
* If we know the user's screen resolution, return it. Otherwise null.
* @since 1.213
*/
public static Area getScreenResolution() {
Cookie res = Functions.getCookie(Stapler.getCurrentRequest(),"screenResolution");
if(res!=null)
return Area.parse(res.getValue());
return null;
}
@Restricted(NoExternalUse.class)
public static boolean useHidingPasswordFields() {
return SystemProperties.getBoolean(Functions.class.getName() + ".hidingPasswordFields", true);
}
/**
* URL decomposed for easier computation of relevant URLs.
*
* <p>
* The decomposed URL will be of the form:
* <pre>
* aaaaaa/524/bbbbb/cccc
* -head-| N |---rest---
* ----- base -----|
* </pre>
*
* <p>
* The head portion is the part of the URL from the {@link Jenkins}
* object to the first {@link Run} subtype. When "next/prev build"
* is chosen, this part remains intact.
*
* <p>
* The {@code 524} is the path from {@link Job} to {@link Run}.
*
* <p>
* The {@code bbb} portion is the path after that till the last
* {@link Run} subtype. The {@code ccc} portion is the part
* after that.
*/
public static final class RunUrl {
private final String head, base, rest;
private final Run run;
public RunUrl(Run run, String head, String base, String rest) {
this.run = run;
this.head = head;
this.base = base;
this.rest = rest;
}
public String getBaseUrl() {
return base;
}
/**
* Returns the same page in the next build.
*/
public String getNextBuildUrl() {
return getUrl(run.getNextBuild());
}
/**
* Returns the same page in the previous build.
*/
public String getPreviousBuildUrl() {
return getUrl(run.getPreviousBuild());
}
private String getUrl(Run n) {
if(n ==null)
return null;
else {
return head+n.getNumber()+rest;
}
}
}
public static Node.Mode[] getNodeModes() {
return Node.Mode.values();
}
public static String getProjectListString(List<AbstractProject> projects) {
return Items.toNameList(projects);
}
/**
* @deprecated as of 1.294
* JEXL now supports the real ternary operator "x?y:z", so this work around
* is no longer necessary.
*/
@Deprecated
public static Object ifThenElse(boolean cond, Object thenValue, Object elseValue) {
return cond ? thenValue : elseValue;
}
public static String appendIfNotNull(String text, String suffix, String nullText) {
return text == null ? nullText : text + suffix;
}
public static Map getSystemProperties() {
return new TreeMap<>(System.getProperties());
}
/**
* Gets the system property indicated by the specified key.
*
* Delegates to {@link SystemProperties#getString(String)}.
*/
@Restricted(DoNotUse.class)
public static String getSystemProperty(String key) {
return SystemProperties.getString(key);
}
[JENKINS 60920] header breadcrumbs CSS update (#4463) * New styles for breadcrumbs and warnings monitor * Adds the svgxuse polyfill for svg sprites on IE 11 * Created new styles for the page header - Used the material icons svg sprites to deliver the icons - Icons are rendered using a <svg> tag * Create new base styles file and undo changes to the layout-common and style css files * Fixes and refactor for the new UI CSS code * Make the new header color and logo section opt-in - The new UI can be toggled with the -Dui.enableNewUi=true flag * Rename and refactor the page-header css - Rename the css class namespace from .main-header to .page-header - Page header CSS moved into a modules folder and now included on the new-base-styles.css. This is done to avoid loading a separate file everytime. - Extracted color variables to their own file * Updated localization for header and admin monitor - The pageHeader template receives localization strings as props - Missing translation for the admin monitor on the it, bg and pl locales * Update core/src/main/resources/lib/layout/layout.jelly Co-Authored-By: Tim Jacomb <t.jacomb@kainos.com> * Most measurements migrated to REMs * Code cleanup and apply new-ui toggle to the html.jelly file * Breadcrumb fixes - Reverts breadcrumb link styling to use nested selectors instead of the .breadcrumbs__link class. The reason is that several plugins would break. - Shifted margins so that breadcrumbs can be fullwidth in the absence of the auto refresh link * Implemented some fixes from the feedback received - Removed box shadow webkit prefix - Fixed formatting on the breadcrumbs.css and layout-commons.less files - Renamed the new UI toggle class from _new-ui_ to _ui-refresh_ - Renamed references to the _new ui_ to _v2_ * Created jelly helper to use svg icons * Fix: restore proper icon for the user on the header * Fixes for Edge, IE 11 and IE 10 * Improvements on the header and breadcrumbs - Logo v2 changed and optimized using the svgo frontend https://jakearchibald.github.io/svgomg/ - Refactored the ammonitor insertion code - Breadcrumbs are no longer capitalized - Classic logo link no longer stretches past the images - Fixed classic logo link on IE11 - Updated color of the footer - Menu items background is also changed when hovering over the menu selector - Removed copyright notice on top of some files * Bumped JTH version with the SVG download fix * Update test/pom.xml Co-Authored-By: Tim Jacomb <t.jacomb@kainos.com> * Added a function to check boolean system properties from jelly * Fix header links and add svg styles for legacy layout * Some bug fixing for the new header - The ui-refresh changes were not properly being enabled with the boolean system property. Added explicit true check on the jelly templates. - Added an explicit width for the ui-refresh logo because it would mess with the layout * Update core/src/main/java/hudson/Functions.java Co-Authored-By: Adrien Lecharpentier <adrien.lecharpentier@gmail.com> * Do not check the system property on every page render Co-authored-by: Tim Jacomb <t.jacomb@kainos.com> Co-authored-by: Adrien Lecharpentier <adrien.lecharpentier@gmail.com> Co-authored-by: Daniel Beck <1831569+daniel-beck@users.noreply.github.com>
2020-02-21 00:57:47 +08:00
/**
* Returns true if and only if the UI refresh is enabled.
*
* @since TODO
*/
@Restricted(DoNotUse.class)
public static boolean isUiRefreshEnabled() {
return UI_REFRESH;
}
public static Map getEnvVars() {
return new TreeMap<>(EnvVars.masterEnvVars);
}
public static boolean isWindows() {
return File.pathSeparatorChar==';';
}
public static boolean isGlibcSupported() {
try {
GNUCLibrary.LIBC.getpid();
return true;
} catch(Throwable t) {
return false;
}
}
public static List<LogRecord> getLogRecords() {
return Jenkins.logRecords;
}
public static String printLogRecord(LogRecord r) {
return formatter.format(r);
}
@Restricted(NoExternalUse.class)
public static String[] printLogRecordHtml(LogRecord r, LogRecord prior) {
String[] oldParts = prior == null ? new String[4] : logRecordPreformat(prior);
String[] newParts = logRecordPreformat(r);
for (int i = 0; i < /* not 4 */3; i++) {
newParts[i] = "<span class='" + (newParts[i].equals(oldParts[i]) ? "logrecord-metadata-old" : "logrecord-metadata-new") + "'>" + newParts[i] + "</span>";
}
newParts[3] = Util.xmlEscape(newParts[3]);
return newParts;
}
/**
* Partially formats a log record.
* @return date, source, level, message+thrown
* @see SimpleFormatter#format(LogRecord)
*/
private static String[] logRecordPreformat(LogRecord r) {
String source;
if (r.getSourceClassName() == null) {
source = r.getLoggerName();
} else {
if (r.getSourceMethodName() == null) {
source = r.getSourceClassName();
} else {
source = r.getSourceClassName() + " " + r.getSourceMethodName();
}
}
String message = new SimpleFormatter().formatMessage(r) + "\n";
Throwable x = r.getThrown();
return new String[] {
String.format("%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS %1$Tp", new Date(r.getMillis())),
source,
r.getLevel().getLocalizedName(),
x == null ? message : message + printThrowable(x) + "\n"
};
}
/**
* Reverses a collection so that it can be easily walked in reverse order.
* @since 1.525
*/
public static <T> Iterable<T> reverse(Collection<T> collection) {
List<T> list = new ArrayList<>(collection);
Collections.reverse(list);
return list;
}
public static Cookie getCookie(HttpServletRequest req,String name) {
Cookie[] cookies = req.getCookies();
if(cookies!=null) {
for (Cookie cookie : cookies) {
if(cookie.getName().equals(name)) {
return cookie;
}
}
}
return null;
}
public static String getCookie(HttpServletRequest req,String name, String defaultValue) {
Cookie c = getCookie(req, name);
if(c==null || c.getValue()==null) return defaultValue;
return c.getValue();
}
private static final Pattern ICON_SIZE = Pattern.compile("\\d+x\\d+");
@Restricted(NoExternalUse.class)
public static String validateIconSize(String iconSize) throws SecurityException {
if (!ICON_SIZE.matcher(iconSize).matches()) {
throw new SecurityException("invalid iconSize");
}
return iconSize;
}
/**
* Gets the suffix to use for YUI JavaScript.
*/
public static String getYuiSuffix() {
return DEBUG_YUI ? "debug" : "min";
}
/**
* Set to true if you need to use the debug version of YUI.
*/
public static boolean DEBUG_YUI = SystemProperties.getBoolean("debug.YUI");
/**
* Creates a sub map by using the given range (both ends inclusive).
*/
public static <V> SortedMap<Integer,V> filter(SortedMap<Integer,V> map, String from, String to) {
if(from==null && to==null) return map;
if(to==null)
return map.headMap(Integer.parseInt(from)-1);
if(from==null)
return map.tailMap(Integer.parseInt(to));
return map.subMap(Integer.parseInt(to),Integer.parseInt(from)-1);
}
/**
* Creates a sub map by using the given range (upper end inclusive).
*/
@Restricted(NoExternalUse.class)
public static <V> SortedMap<Integer,V> filterExcludingFrom(SortedMap<Integer,V> map, String from, String to) {
if(from==null && to==null) return map;
if(to==null)
return map.headMap(Integer.parseInt(from));
if(from==null)
return map.tailMap(Integer.parseInt(to));
return map.subMap(Integer.parseInt(to),Integer.parseInt(from));
}
private static final SimpleFormatter formatter = new SimpleFormatter();
/**
* Used by {@code layout.jelly} to control the auto refresh behavior.
*
* @param noAutoRefresh
* On certain pages, like a page with forms, will have annoying interference
* with auto refresh. On those pages, disable auto-refresh.
*/
public static void configureAutoRefresh(HttpServletRequest request, HttpServletResponse response, boolean noAutoRefresh) {
if(noAutoRefresh)
return;
String param = request.getParameter("auto_refresh");
boolean refresh = isAutoRefresh(request);
if (param != null) {
refresh = Boolean.parseBoolean(param);
Cookie c = new Cookie("hudson_auto_refresh", Boolean.toString(refresh));
// Need to set path or it will not stick from e.g. a project page to the dashboard.
// Using request.getContextPath() might work but it seems simpler to just use the hudson_ prefix
// to avoid conflicts with any other web apps that might be on the same machine.
c.setPath("/");
c.setMaxAge(60*60*24*30); // persist it roughly for a month
c.setHttpOnly(true);
response.addCookie(c);
}
if (refresh) {
response.addHeader("Refresh", SystemProperties.getString("hudson.Functions.autoRefreshSeconds", "10"));
}
try {
ExtensionList.lookupSingleton(AutoRefresh.class).recordRequest(request, refresh);
} catch (Exception e) {
2019-10-13 07:41:16 +08:00
LOGGER.log(Level.WARNING, "Failed to record auto refresh status in telemetry", e);
}
}
public static boolean isAutoRefresh(HttpServletRequest request) {
String param = request.getParameter("auto_refresh");
if (param != null) {
return Boolean.parseBoolean(param);
}
Cookie[] cookies = request.getCookies();
if(cookies==null)
return false; // when API design messes it up, we all suffer
for (Cookie c : cookies) {
if (c.getName().equals("hudson_auto_refresh")) {
return Boolean.parseBoolean(c.getValue());
}
}
return false;
}
public static boolean isCollapsed(String paneId) {
return PaneStatusProperties.forCurrentUser().isCollapsed(paneId);
}
@Restricted(NoExternalUse.class)
public static boolean isUserTimeZoneOverride() {
return TimeZoneProperty.forCurrentUser() != null;
}
@CheckForNull
@Restricted(NoExternalUse.class)
public static String getUserTimeZone() {
return TimeZoneProperty.forCurrentUser();
}
@Restricted(NoExternalUse.class)
public static String getUserTimeZonePostfix() {
if (!isUserTimeZoneOverride()) {
return "";
}
TimeZone tz = TimeZone.getTimeZone(getUserTimeZone());
return tz.getDisplayName(tz.observesDaylightTime(), TimeZone.SHORT);
}
/**
* Finds the given object in the ancestor list and returns its URL.
* This is used to determine the "current" URL assigned to the given object,
* so that one can compute relative URLs from it.
*/
public static String getNearestAncestorUrl(StaplerRequest req,Object it) {
List list = req.getAncestors();
for( int i=list.size()-1; i>=0; i-- ) {
Ancestor anc = (Ancestor) list.get(i);
if(anc.getObject()==it)
return anc.getUrl();
}
return null;
}
fixed an NPE from Jelly below: java.lang.NullPointerException at org.apache.commons.jexl.parser.ASTAddNode.value(ASTAddNode.java:116) at org.apache.commons.jexl.parser.ASTExpression.value(ASTExpression.java:53) at org.apache.commons.jexl.parser.ASTMethod.execute(ASTMethod.java:81) at org.apache.commons.jexl.parser.ASTReference.execute(ASTReference.java:82) at org.apache.commons.jexl.parser.ASTReference.value(ASTReference.java:56) at org.apache.commons.jexl.parser.ASTReferenceExpression.value(ASTReferenceExpression.java:50) at org.apache.commons.jexl.ExpressionImpl.evaluate(ExpressionImpl.java:79) at org.apache.commons.jelly.expression.jexl.JexlExpression.evaluate(JexlExpression.java:69) at org.apache.commons.jelly.tags.core.SetTag.doTag(SetTag.java:84) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.JellyTag.doTag(JellyTag.java:45) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.DynamicTag.doTag(DynamicTag.java:80) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.WhenTag.doTag(WhenTag.java:46) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.ChooseTag.doTag(ChooseTag.java:38) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.ForEachTag.doTag(ForEachTag.java:150) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.JellyTag.doTag(JellyTag.java:45) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.DynamicTag.doTag(DynamicTag.java:80) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.OtherwiseTag.doTag(OtherwiseTag.java:41) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.ChooseTag.doTag(ChooseTag.java:38) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.impl.StaticTag.doTag(StaticTag.java:65) at org.apache.commons.jelly.impl.StaticTagScript.run(StaticTagScript.java:112) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.ForEachTag.doTag(ForEachTag.java:150) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.impl.StaticTag.doTag(StaticTag.java:65) at org.apache.commons.jelly.impl.StaticTagScript.run(StaticTagScript.java:112) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.IfTag.doTag(IfTag.java:42) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.tags.define.InvokeBodyTag.doTag(InvokeBodyTag.java:91) git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@1801 71c3de6d-444a-0410-be80-ed276b4c234a
2007-01-18 23:07:20 +08:00
/**
* Finds the inner-most {@link SearchableModelObject} in scope.
*/
public static String getSearchURL() {
List list = Stapler.getCurrentRequest().getAncestors();
for( int i=list.size()-1; i>=0; i-- ) {
Ancestor anc = (Ancestor) list.get(i);
if(anc.getObject() instanceof SearchableModelObject)
return anc.getUrl()+"/search/";
}
return null;
}
fixed an NPE from Jelly below: java.lang.NullPointerException at org.apache.commons.jexl.parser.ASTAddNode.value(ASTAddNode.java:116) at org.apache.commons.jexl.parser.ASTExpression.value(ASTExpression.java:53) at org.apache.commons.jexl.parser.ASTMethod.execute(ASTMethod.java:81) at org.apache.commons.jexl.parser.ASTReference.execute(ASTReference.java:82) at org.apache.commons.jexl.parser.ASTReference.value(ASTReference.java:56) at org.apache.commons.jexl.parser.ASTReferenceExpression.value(ASTReferenceExpression.java:50) at org.apache.commons.jexl.ExpressionImpl.evaluate(ExpressionImpl.java:79) at org.apache.commons.jelly.expression.jexl.JexlExpression.evaluate(JexlExpression.java:69) at org.apache.commons.jelly.tags.core.SetTag.doTag(SetTag.java:84) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.JellyTag.doTag(JellyTag.java:45) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.DynamicTag.doTag(DynamicTag.java:80) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.WhenTag.doTag(WhenTag.java:46) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.ChooseTag.doTag(ChooseTag.java:38) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.ForEachTag.doTag(ForEachTag.java:150) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.JellyTag.doTag(JellyTag.java:45) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.DynamicTag.doTag(DynamicTag.java:80) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.OtherwiseTag.doTag(OtherwiseTag.java:41) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.ChooseTag.doTag(ChooseTag.java:38) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.impl.StaticTag.doTag(StaticTag.java:65) at org.apache.commons.jelly.impl.StaticTagScript.run(StaticTagScript.java:112) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.ForEachTag.doTag(ForEachTag.java:150) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.impl.StaticTag.doTag(StaticTag.java:65) at org.apache.commons.jelly.impl.StaticTagScript.run(StaticTagScript.java:112) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:186) at org.apache.commons.jelly.tags.core.IfTag.doTag(IfTag.java:42) at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262) at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95) at org.apache.commons.jelly.tags.define.InvokeBodyTag.doTag(InvokeBodyTag.java:91) git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@1801 71c3de6d-444a-0410-be80-ed276b4c234a
2007-01-18 23:07:20 +08:00
public static String appendSpaceIfNotNull(String n) {
if(n==null) return null;
else return n+' ';
}
/**
* One nbsp per 10 pixels in given size, which may be a plain number or "NxN"
* (like an iconSize). Useful in a sortable table heading.
*/
public static String nbspIndent(String size) {
int i = size.indexOf('x');
i = Integer.parseInt(i > 0 ? size.substring(0, i) : size) / 10;
StringBuilder buf = new StringBuilder(30);
for (int j = 0; j < i; j++)
buf.append("&nbsp;");
return buf.toString();
}
public static String getWin32ErrorMessage(IOException e) {
return Util.getWin32ErrorMessage(e);
}
public static boolean isMultiline(String s) {
if(s==null) return false;
return s.indexOf('\r')>=0 || s.indexOf('\n')>=0;
}
public static String encode(String s) {
return Util.encode(s);
}
/**
* Shortcut function for calling {@link URLEncoder#encode(String,String)} (with UTF-8 encoding).<br>
* Useful for encoding URL query parameters in jelly code (as in {@code "...?param=${h.urlEncode(something)}"}).<br>
* For convenience in jelly code, it also accepts null parameter, and then returns an empty string.
*
2019-10-16 18:22:25 +08:00
* @since 2.200
*/
public static String urlEncode(String s) {
if (s == null) {
return "";
}
try {
return URLEncoder.encode(s, StandardCharsets.UTF_8.name());
} catch (UnsupportedEncodingException e) {
throw new Error(e); // impossible
}
}
public static String escape(String s) {
return Util.escape(s);
}
public static String xmlEscape(String s) {
return Util.xmlEscape(s);
}
2011-04-13 07:52:52 +08:00
public static String xmlUnescape(String s) {
return s.replace("&lt;","<").replace("&gt;",">").replace("&amp;","&");
}
public static String htmlAttributeEscape(String text) {
StringBuilder buf = new StringBuilder(text.length()+64);
for( int i=0; i<text.length(); i++ ) {
char ch = text.charAt(i);
if(ch=='<')
buf.append("&lt;");
else
if(ch=='>')
buf.append("&gt;");
else
if(ch=='&')
buf.append("&amp;");
else
if(ch=='"')
buf.append("&quot;");
else
if(ch=='\'')
buf.append("&#39;");
else
buf.append(ch);
}
return buf.toString();
}
public static void checkPermission(Permission permission) throws IOException, ServletException {
checkPermission(Jenkins.get(),permission);
Merged revisions 8523-8525,8545-8556,8793,8803-8806,8858,9027-9028 via svnmerge from https://www.dev.java.net/svn/hudson/branches/tom ........ r8523 | huybrechts | 2008-04-11 13:41:11 -0700 (Fri, 11 Apr 2008) | 1 line profile to build against current snapshot of hudson-core ........ r8524 | huybrechts | 2008-04-11 14:42:58 -0700 (Fri, 11 Apr 2008) | 1 line [#710] project option to automatically delete the svn wc if it is locked ........ r8525 | huybrechts | 2008-04-11 14:53:59 -0700 (Fri, 11 Apr 2008) | 1 line [#710] project option to automatically delete the svn wc if it is locked ........ r8545 | huybrechts | 2008-04-12 04:17:46 -0700 (Sat, 12 Apr 2008) | 1 line profile to build against current snapshot of hudson-core ........ r8546 | huybrechts | 2008-04-12 04:19:26 -0700 (Sat, 12 Apr 2008) | 1 line deleting IDE-specific files ........ r8547 | huybrechts | 2008-04-12 06:31:32 -0700 (Sat, 12 Apr 2008) | 1 line added ignores ........ r8548 | huybrechts | 2008-04-12 06:42:49 -0700 (Sat, 12 Apr 2008) | 4 lines Issue 1158 - extended AuthorizationStrategy to provide ACLs for different types of objects - changed several object types to use these methods - changed jelly to check permissions (instead of using isAdmin check) ........ r8549 | huybrechts | 2008-04-12 06:44:26 -0700 (Sat, 12 Apr 2008) | 1 line Issue 1110: use svn revision number in project-changes.jelly ........ r8550 | huybrechts | 2008-04-12 06:46:18 -0700 (Sat, 12 Apr 2008) | 1 line Adding a 'My Projects' view which shows only projects the user has permission for ........ r8551 | huybrechts | 2008-04-12 06:47:57 -0700 (Sat, 12 Apr 2008) | 1 line adding a user name resolver, like the MailAddressResolver ........ r8552 | huybrechts | 2008-04-12 06:49:27 -0700 (Sat, 12 Apr 2008) | 1 line Adding jdom and cglib to the war, as a workaround for classloading issues ........ r8553 | huybrechts | 2008-04-12 08:01:58 -0700 (Sat, 12 Apr 2008) | 1 line SFEE integration improvements, including links to project based security ........ r8554 | huybrechts | 2008-04-12 08:27:17 -0700 (Sat, 12 Apr 2008) | 1 line wsdl for SFEE webservices ........ r8555 | huybrechts | 2008-04-12 08:31:18 -0700 (Sat, 12 Apr 2008) | 1 line forgot some files... ........ r8556 | huybrechts | 2008-04-12 08:34:31 -0700 (Sat, 12 Apr 2008) | 1 line an authorization strategy that provides project-based access control (not usable on its own) ........ r8793 | huybrechts | 2008-04-22 14:39:57 -0700 (Tue, 22 Apr 2008) | 1 line [issue #1573] allow plugins to contribute ServletFilters ........ r8803 | huybrechts | 2008-04-23 10:46:09 -0700 (Wed, 23 Apr 2008) | 1 line added ignores ........ r8804 | huybrechts | 2008-04-23 10:52:11 -0700 (Wed, 23 Apr 2008) | 1 line added ignores ........ r8805 | huybrechts | 2008-04-23 10:54:12 -0700 (Wed, 23 Apr 2008) | 1 line added ignores ........ r8806 | huybrechts | 2008-04-23 10:59:13 -0700 (Wed, 23 Apr 2008) | 1 line Issue 1158 ........ r8858 | huybrechts | 2008-04-25 08:17:41 -0700 (Fri, 25 Apr 2008) | 1 line bugfixes ........ r9027 | huybrechts | 2008-05-04 12:20:34 -0700 (Sun, 04 May 2008) | 1 line Issue 1158 - fixing permission checks in jelly ........ r9028 | huybrechts | 2008-05-04 12:22:36 -0700 (Sun, 04 May 2008) | 1 line creating SFEE releases from Hudson ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@9699 71c3de6d-444a-0410-be80-ed276b4c234a
2008-05-30 11:25:15 +08:00
}
public static void checkPermission(AccessControlled object, Permission permission) throws IOException, ServletException {
if (permission != null) {
object.checkPermission(permission);
Merged revisions 8523-8525,8545-8556,8793,8803-8806,8858,9027-9028 via svnmerge from https://www.dev.java.net/svn/hudson/branches/tom ........ r8523 | huybrechts | 2008-04-11 13:41:11 -0700 (Fri, 11 Apr 2008) | 1 line profile to build against current snapshot of hudson-core ........ r8524 | huybrechts | 2008-04-11 14:42:58 -0700 (Fri, 11 Apr 2008) | 1 line [#710] project option to automatically delete the svn wc if it is locked ........ r8525 | huybrechts | 2008-04-11 14:53:59 -0700 (Fri, 11 Apr 2008) | 1 line [#710] project option to automatically delete the svn wc if it is locked ........ r8545 | huybrechts | 2008-04-12 04:17:46 -0700 (Sat, 12 Apr 2008) | 1 line profile to build against current snapshot of hudson-core ........ r8546 | huybrechts | 2008-04-12 04:19:26 -0700 (Sat, 12 Apr 2008) | 1 line deleting IDE-specific files ........ r8547 | huybrechts | 2008-04-12 06:31:32 -0700 (Sat, 12 Apr 2008) | 1 line added ignores ........ r8548 | huybrechts | 2008-04-12 06:42:49 -0700 (Sat, 12 Apr 2008) | 4 lines Issue 1158 - extended AuthorizationStrategy to provide ACLs for different types of objects - changed several object types to use these methods - changed jelly to check permissions (instead of using isAdmin check) ........ r8549 | huybrechts | 2008-04-12 06:44:26 -0700 (Sat, 12 Apr 2008) | 1 line Issue 1110: use svn revision number in project-changes.jelly ........ r8550 | huybrechts | 2008-04-12 06:46:18 -0700 (Sat, 12 Apr 2008) | 1 line Adding a 'My Projects' view which shows only projects the user has permission for ........ r8551 | huybrechts | 2008-04-12 06:47:57 -0700 (Sat, 12 Apr 2008) | 1 line adding a user name resolver, like the MailAddressResolver ........ r8552 | huybrechts | 2008-04-12 06:49:27 -0700 (Sat, 12 Apr 2008) | 1 line Adding jdom and cglib to the war, as a workaround for classloading issues ........ r8553 | huybrechts | 2008-04-12 08:01:58 -0700 (Sat, 12 Apr 2008) | 1 line SFEE integration improvements, including links to project based security ........ r8554 | huybrechts | 2008-04-12 08:27:17 -0700 (Sat, 12 Apr 2008) | 1 line wsdl for SFEE webservices ........ r8555 | huybrechts | 2008-04-12 08:31:18 -0700 (Sat, 12 Apr 2008) | 1 line forgot some files... ........ r8556 | huybrechts | 2008-04-12 08:34:31 -0700 (Sat, 12 Apr 2008) | 1 line an authorization strategy that provides project-based access control (not usable on its own) ........ r8793 | huybrechts | 2008-04-22 14:39:57 -0700 (Tue, 22 Apr 2008) | 1 line [issue #1573] allow plugins to contribute ServletFilters ........ r8803 | huybrechts | 2008-04-23 10:46:09 -0700 (Wed, 23 Apr 2008) | 1 line added ignores ........ r8804 | huybrechts | 2008-04-23 10:52:11 -0700 (Wed, 23 Apr 2008) | 1 line added ignores ........ r8805 | huybrechts | 2008-04-23 10:54:12 -0700 (Wed, 23 Apr 2008) | 1 line added ignores ........ r8806 | huybrechts | 2008-04-23 10:59:13 -0700 (Wed, 23 Apr 2008) | 1 line Issue 1158 ........ r8858 | huybrechts | 2008-04-25 08:17:41 -0700 (Fri, 25 Apr 2008) | 1 line bugfixes ........ r9027 | huybrechts | 2008-05-04 12:20:34 -0700 (Sun, 04 May 2008) | 1 line Issue 1158 - fixing permission checks in jelly ........ r9028 | huybrechts | 2008-05-04 12:22:36 -0700 (Sun, 04 May 2008) | 1 line creating SFEE releases from Hudson ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@9699 71c3de6d-444a-0410-be80-ed276b4c234a
2008-05-30 11:25:15 +08:00
}
}
/**
* This version is so that the 'checkPermission' on {@code layout.jelly}
* degrades gracefully if "it" is not an {@link AccessControlled} object.
* Otherwise it will perform no check and that problem is hard to notice.
*/
public static void checkPermission(Object object, Permission permission) throws IOException, ServletException {
if (permission == null)
return;
if (object instanceof AccessControlled)
checkPermission((AccessControlled) object,permission);
else {
List<Ancestor> ancs = Stapler.getCurrentRequest().getAncestors();
for(Ancestor anc : Iterators.reverse(ancs)) {
Object o = anc.getObject();
if (o instanceof AccessControlled) {
checkPermission((AccessControlled) o,permission);
return;
}
}
checkPermission(Jenkins.get(),permission);
}
}
/**
* Returns true if the current user has the given permission.
*
* @param permission
* If null, returns true. This defaulting is convenient in making the use of this method terse.
*/
public static boolean hasPermission(Permission permission) throws IOException, ServletException {
return hasPermission(Jenkins.get(),permission);
}
/**
* This version is so that the 'hasPermission' can degrade gracefully
* if "it" is not an {@link AccessControlled} object.
*/
public static boolean hasPermission(Object object, Permission permission) throws IOException, ServletException {
if (permission == null)
return true;
if (object instanceof AccessControlled)
return ((AccessControlled)object).hasPermission(permission);
else {
List<Ancestor> ancs = Stapler.getCurrentRequest().getAncestors();
for(Ancestor anc : Iterators.reverse(ancs)) {
Object o = anc.getObject();
if (o instanceof AccessControlled) {
return ((AccessControlled)o).hasPermission(permission);
}
}
return Jenkins.get().hasPermission(permission);
}
Merged revisions 8523-8525,8545-8556,8793,8803-8806,8858,9027-9028 via svnmerge from https://www.dev.java.net/svn/hudson/branches/tom ........ r8523 | huybrechts | 2008-04-11 13:41:11 -0700 (Fri, 11 Apr 2008) | 1 line profile to build against current snapshot of hudson-core ........ r8524 | huybrechts | 2008-04-11 14:42:58 -0700 (Fri, 11 Apr 2008) | 1 line [#710] project option to automatically delete the svn wc if it is locked ........ r8525 | huybrechts | 2008-04-11 14:53:59 -0700 (Fri, 11 Apr 2008) | 1 line [#710] project option to automatically delete the svn wc if it is locked ........ r8545 | huybrechts | 2008-04-12 04:17:46 -0700 (Sat, 12 Apr 2008) | 1 line profile to build against current snapshot of hudson-core ........ r8546 | huybrechts | 2008-04-12 04:19:26 -0700 (Sat, 12 Apr 2008) | 1 line deleting IDE-specific files ........ r8547 | huybrechts | 2008-04-12 06:31:32 -0700 (Sat, 12 Apr 2008) | 1 line added ignores ........ r8548 | huybrechts | 2008-04-12 06:42:49 -0700 (Sat, 12 Apr 2008) | 4 lines Issue 1158 - extended AuthorizationStrategy to provide ACLs for different types of objects - changed several object types to use these methods - changed jelly to check permissions (instead of using isAdmin check) ........ r8549 | huybrechts | 2008-04-12 06:44:26 -0700 (Sat, 12 Apr 2008) | 1 line Issue 1110: use svn revision number in project-changes.jelly ........ r8550 | huybrechts | 2008-04-12 06:46:18 -0700 (Sat, 12 Apr 2008) | 1 line Adding a 'My Projects' view which shows only projects the user has permission for ........ r8551 | huybrechts | 2008-04-12 06:47:57 -0700 (Sat, 12 Apr 2008) | 1 line adding a user name resolver, like the MailAddressResolver ........ r8552 | huybrechts | 2008-04-12 06:49:27 -0700 (Sat, 12 Apr 2008) | 1 line Adding jdom and cglib to the war, as a workaround for classloading issues ........ r8553 | huybrechts | 2008-04-12 08:01:58 -0700 (Sat, 12 Apr 2008) | 1 line SFEE integration improvements, including links to project based security ........ r8554 | huybrechts | 2008-04-12 08:27:17 -0700 (Sat, 12 Apr 2008) | 1 line wsdl for SFEE webservices ........ r8555 | huybrechts | 2008-04-12 08:31:18 -0700 (Sat, 12 Apr 2008) | 1 line forgot some files... ........ r8556 | huybrechts | 2008-04-12 08:34:31 -0700 (Sat, 12 Apr 2008) | 1 line an authorization strategy that provides project-based access control (not usable on its own) ........ r8793 | huybrechts | 2008-04-22 14:39:57 -0700 (Tue, 22 Apr 2008) | 1 line [issue #1573] allow plugins to contribute ServletFilters ........ r8803 | huybrechts | 2008-04-23 10:46:09 -0700 (Wed, 23 Apr 2008) | 1 line added ignores ........ r8804 | huybrechts | 2008-04-23 10:52:11 -0700 (Wed, 23 Apr 2008) | 1 line added ignores ........ r8805 | huybrechts | 2008-04-23 10:54:12 -0700 (Wed, 23 Apr 2008) | 1 line added ignores ........ r8806 | huybrechts | 2008-04-23 10:59:13 -0700 (Wed, 23 Apr 2008) | 1 line Issue 1158 ........ r8858 | huybrechts | 2008-04-25 08:17:41 -0700 (Fri, 25 Apr 2008) | 1 line bugfixes ........ r9027 | huybrechts | 2008-05-04 12:20:34 -0700 (Sun, 04 May 2008) | 1 line Issue 1158 - fixing permission checks in jelly ........ r9028 | huybrechts | 2008-05-04 12:22:36 -0700 (Sun, 04 May 2008) | 1 line creating SFEE releases from Hudson ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@9699 71c3de6d-444a-0410-be80-ed276b4c234a
2008-05-30 11:25:15 +08:00
}
public static void adminCheck(StaplerRequest req, StaplerResponse rsp, Object required, Permission permission) throws IOException, ServletException {
// this is legacy --- all views should be eventually converted to
// the permission based model.
if(required!=null && !Hudson.adminCheck(req, rsp)) {
// check failed. commit the FORBIDDEN response, then abort.
rsp.setStatus(HttpServletResponse.SC_FORBIDDEN);
rsp.getOutputStream().close();
throw new ServletException("Unauthorized access");
}
// make sure the user owns the necessary permission to access this page.
if(permission!=null)
checkPermission(permission);
}
/**
* Infers the hudson installation URL from the given request.
*/
public static String inferHudsonURL(StaplerRequest req) {
String rootUrl = Jenkins.get().getRootUrl();
if(rootUrl !=null)
// prefer the one explicitly configured, to work with load-balancer, frontend, etc.
return rootUrl;
StringBuilder buf = new StringBuilder();
buf.append(req.getScheme()).append("://");
buf.append(req.getServerName());
if(! (req.getScheme().equals("http") && req.getLocalPort()==80 || req.getScheme().equals("https") && req.getLocalPort()==443))
buf.append(':').append(req.getLocalPort());
buf.append(req.getContextPath()).append('/');
return buf.toString();
}
/**
* Returns the link to be displayed in the footer of the UI.
*/
public static String getFooterURL() {
if(footerURL == null) {
footerURL = SystemProperties.getString("hudson.footerURL");
if(StringUtils.isBlank(footerURL)) {
footerURL = "https://jenkins.io/";
}
}
return footerURL;
}
private static String footerURL = null;
public static List<JobPropertyDescriptor> getJobPropertyDescriptors(Class<? extends Job> clazz) {
return JobPropertyDescriptor.getPropertyDescriptors(clazz);
}
public static List<JobPropertyDescriptor> getJobPropertyDescriptors(Job job) {
return DescriptorVisibilityFilter.apply(job, JobPropertyDescriptor.getPropertyDescriptors(job.getClass()));
}
public static List<Descriptor<BuildWrapper>> getBuildWrapperDescriptors(AbstractProject<?,?> project) {
return BuildWrappers.getFor(project);
}
public static List<Descriptor<SecurityRealm>> getSecurityRealmDescriptors() {
return SecurityRealm.all();
}
public static List<Descriptor<AuthorizationStrategy>> getAuthorizationStrategyDescriptors() {
return AuthorizationStrategy.all();
}
public static List<Descriptor<Builder>> getBuilderDescriptors(AbstractProject<?,?> project) {
return BuildStepDescriptor.filter(Builder.all(), project.getClass());
}
public static List<Descriptor<Publisher>> getPublisherDescriptors(AbstractProject<?,?> project) {
return BuildStepDescriptor.filter(Publisher.all(), project.getClass());
}
public static List<SCMDescriptor<?>> getSCMDescriptors(AbstractProject<?,?> project) {
return SCM._for(project);
}
/**
* @since 2.12
* @deprecated replaced by {@link Slave.SlaveDescriptor#computerLauncherDescriptors(Slave)}
*/
@Deprecated
@Restricted(DoNotUse.class)
@RestrictedSince("2.12")
public static List<Descriptor<ComputerLauncher>> getComputerLauncherDescriptors() {
return Jenkins.get().<ComputerLauncher,Descriptor<ComputerLauncher>>getDescriptorList(ComputerLauncher.class);
}
/**
* @since 2.12
* @deprecated replaced by {@link Slave.SlaveDescriptor#retentionStrategyDescriptors(Slave)}
*/
@Deprecated
@Restricted(DoNotUse.class)
@RestrictedSince("2.12")
public static List<Descriptor<RetentionStrategy<?>>> getRetentionStrategyDescriptors() {
return RetentionStrategy.all();
}
public static List<ParameterDescriptor> getParameterDescriptors() {
return ParameterDefinition.all();
Merged revisions 9727,9739,9765-9766,9927,10332,10334-10338,10340,10416,10421,10553,10839-10845,10876 via svnmerge from https://www.dev.java.net/svn/hudson/branches/tom ........ r9727 | huybrechts | 2008-05-31 12:49:18 -0700 (Sat, 31 May 2008) | 3 lines Issue 1659 - cleaning up static Trigger, Hudson instances - resetting commons-logging ........ r9739 | huybrechts | 2008-06-01 12:05:51 -0700 (Sun, 01 Jun 2008) | 1 line #1770 catching and logging InstantiationError ........ r9765 | huybrechts | 2008-06-02 11:34:45 -0700 (Mon, 02 Jun 2008) | 1 line project-based security: fixed a new isAdmin call ........ r9766 | huybrechts | 2008-06-02 11:35:27 -0700 (Mon, 02 Jun 2008) | 1 line "theInstance = null" caused some reloading problems ........ r9927 | huybrechts | 2008-06-07 15:31:20 -0700 (Sat, 07 Jun 2008) | 8 lines Initial commit of parameterized builds. Provided functionality: - users can define parameters per project (only string paramters for now) - if a project has parameters, the 'build' button will redirect to an input page - parameter values can be used as ${variable} in Ant, Maven and CommandInterpreter builders - after the build, parameter values can be viewed in a separate page - tasks for parameterized builds are persisted in the queue over restarts - queue persistence is now in XML (with backwards compatibility for text format) ........ r10332 | huybrechts | 2008-06-23 05:32:45 -0700 (Mon, 23 Jun 2008) | 1 line made EmbedderLoggerImpl public for use in plugins ........ r10334 | huybrechts | 2008-06-23 05:48:10 -0700 (Mon, 23 Jun 2008) | 1 line [HUDSON-1914] additional parameter types (job, run), bugfixes ........ r10335 | huybrechts | 2008-06-23 05:49:10 -0700 (Mon, 23 Jun 2008) | 1 line [HUDSON-1573] initialize servlet filters ........ r10336 | huybrechts | 2008-06-23 05:52:14 -0700 (Mon, 23 Jun 2008) | 1 line [HUDSON-1915] onStarted onevent ........ r10337 | huybrechts | 2008-06-23 06:07:32 -0700 (Mon, 23 Jun 2008) | 4 lines [HUDSON-1504] basic ui for job-based access control This allows assigning permissions per user and per job. It is still possible to provide defaults using a global matrix. ........ r10338 | huybrechts | 2008-06-23 06:18:13 -0700 (Mon, 23 Jun 2008) | 3 lines [HUDSON-1504] basic ui for job-based access control adding it to the list... ........ r10340 | huybrechts | 2008-06-23 07:23:12 -0700 (Mon, 23 Jun 2008) | 1 line [HUDSON-1504] fix compile error ........ r10416 | huybrechts | 2008-06-25 01:13:11 -0700 (Wed, 25 Jun 2008) | 1 line initial commit staging plugin: supports doing a maven release to a staging repository, serving that repository for Hudson, and uploading it on demand ........ r10421 | huybrechts | 2008-06-25 12:32:06 -0700 (Wed, 25 Jun 2008) | 1 line [HUDSON-1954] initial commit jbpm plugin and staging workflow example ........ r10553 | huybrechts | 2008-07-01 14:13:57 -0700 (Tue, 01 Jul 2008) | 1 line moving registration for parameter definition out of registered class ........ r10839 | kohsuke | 2008-07-15 13:48:05 -0700 (Tue, 15 Jul 2008) | 6 lines Making a few adjustments in preparation of merging back to the trunk. - doc updates - added QueueTaskFilter as a plain delegation implementation to simplify ParameterizedProjectTask. - renamed ParameterDefinition.newInstance(...) to createValue, to avoid having two newInstance methods in this part of the system that does different things ........ r10840 | kohsuke | 2008-07-15 13:51:16 -0700 (Tue, 15 Jul 2008) | 1 line Hudson's coding convention is to use WS and no TAB. ........ r10841 | kohsuke | 2008-07-15 14:34:37 -0700 (Tue, 15 Jul 2008) | 2 lines - making ParameterValue an abstract class to allow evolution without breaking plugins in the future - tweaked the UI a bit so that parameterization don't get too much visibility. ........ r10842 | kohsuke | 2008-07-15 14:49:35 -0700 (Tue, 15 Jul 2008) | 2 lines improving the UI a bit. Added an icon ........ r10843 | kohsuke | 2008-07-15 15:08:28 -0700 (Tue, 15 Jul 2008) | 1 line adding help ........ r10844 | kohsuke | 2008-07-15 15:10:42 -0700 (Tue, 15 Jul 2008) | 1 line TAB->WS ........ r10845 | kohsuke | 2008-07-15 15:44:47 -0700 (Tue, 15 Jul 2008) | 2 lines - Use HTTP status code to notify the automated clients that the build triggering failed. - Overload the "/build" URL to render the parameter entry form. ........ r10876 | kohsuke | 2008-07-18 13:52:51 -0700 (Fri, 18 Jul 2008) | 10 lines Giving more hooks to ParameterValue to affect a build - abstracting the variable substitution process so that the actual syntax for marking variables (e.g., %VAR% vs ${var} vs #{xyz}) and the actual resolution process are orthogonal. - parameter values can now contribute BuildWrapper to a build. - parameter values can now contribute environment variables to a build. ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@10950 71c3de6d-444a-0410-be80-ed276b4c234a
2008-07-22 08:48:13 +08:00
}
public static List<Descriptor<CaptchaSupport>> getCaptchaSupportDescriptors() {
return CaptchaSupport.all();
}
public static List<Descriptor<ViewsTabBar>> getViewsTabBarDescriptors() {
return ViewsTabBar.all();
}
public static List<Descriptor<MyViewsTabBar>> getMyViewsTabBarDescriptors() {
return MyViewsTabBar.all();
}
/**
* @deprecated replaced by {@link Slave.SlaveDescriptor#nodePropertyDescriptors(Slave)}
* @since 2.12
*/
@Deprecated
@Restricted(DoNotUse.class)
@RestrictedSince("2.12")
public static List<NodePropertyDescriptor> getNodePropertyDescriptors(Class<? extends Node> clazz) {
List<NodePropertyDescriptor> result = new ArrayList<>();
Collection<NodePropertyDescriptor> list = (Collection) Jenkins.get().getDescriptorList(NodeProperty.class);
for (NodePropertyDescriptor npd : list) {
if (npd.isApplicable(clazz)) {
result.add(npd);
}
}
return result;
}
/**
* Returns those node properties which can be configured as global node properties.
*
* @since 1.520
*/
public static List<NodePropertyDescriptor> getGlobalNodePropertyDescriptors() {
List<NodePropertyDescriptor> result = new ArrayList<>();
Collection<NodePropertyDescriptor> list = (Collection) Jenkins.get().getDescriptorList(NodeProperty.class);
for (NodePropertyDescriptor npd : list) {
if (npd.isApplicableAsGlobal()) {
result.add(npd);
}
}
return result;
}
/**
* Gets all the descriptors sorted by their inheritance tree of {@link Describable}
* so that descriptors of similar types come nearby.
*
* <p>
* We sort them by {@link Extension#ordinal()} but only for {@link GlobalConfiguration}s,
* as the value is normally used to compare similar kinds of extensions, and we needed
* {@link GlobalConfiguration}s to be able to position themselves in a layer above.
* This however creates some asymmetry between regular {@link Descriptor}s and {@link GlobalConfiguration}s.
* Perhaps it is better to introduce another annotation element? But then,
* extensions shouldn't normally concern themselves about ordering too much, and the only reason
* we needed this for {@link GlobalConfiguration}s are for backward compatibility.
*
* @param predicate
* Filter the descriptors based on this predicate
* @since 1.494
* @deprecated use {@link #getSortedDescriptorsForGlobalConfigByDescriptor(Predicate)}
*/
@Deprecated
@Restricted(NoExternalUse.class)
public static Collection<Descriptor> getSortedDescriptorsForGlobalConfig(com.google.common.base.Predicate<GlobalConfigurationCategory> predicate) {
ExtensionList<Descriptor> exts = ExtensionList.lookup(Descriptor.class);
List<Tag> r = new ArrayList<>(exts.size());
for (ExtensionComponent<Descriptor> c : exts.getComponents()) {
Descriptor d = c.getInstance();
if (d.getGlobalConfigPage()==null) continue;
if (!Jenkins.get().hasPermission(d.getRequiredGlobalConfigPagePermission())) {
continue;
}
if (predicate.apply(d.getCategory())) {
r.add(new Tag(c.ordinal(), d));
}
}
Collections.sort(r);
List<Descriptor> answer = new ArrayList<>(r.size());
for (Tag d : r) answer.add(d.d);
return DescriptorVisibilityFilter.apply(Jenkins.get(),answer);
}
/**
* Gets all the descriptors sorted by their inheritance tree of {@link Describable}
* so that descriptors of similar types come nearby.
*
* <p>
* We sort them by {@link Extension#ordinal()} but only for {@link GlobalConfiguration}s,
* as the value is normally used to compare similar kinds of extensions, and we needed
* {@link GlobalConfiguration}s to be able to position themselves in a layer above.
* This however creates some asymmetry between regular {@link Descriptor}s and {@link GlobalConfiguration}s.
* Perhaps it is better to introduce another annotation element? But then,
* extensions shouldn't normally concern themselves about ordering too much, and the only reason
* we needed this for {@link GlobalConfiguration}s are for backward compatibility.
*
* @param predicate
* Filter the descriptors based on this predicate
* @since TODO
*/
public static Collection<Descriptor> getSortedDescriptorsForGlobalConfigByDescriptor(Predicate<Descriptor> predicate) {
ExtensionList<Descriptor> exts = ExtensionList.lookup(Descriptor.class);
List<Tag> r = new ArrayList<>(exts.size());
for (ExtensionComponent<Descriptor> c : exts.getComponents()) {
Descriptor d = c.getInstance();
if (d.getGlobalConfigPage()==null) continue;
if (predicate.test(d)) {
r.add(new Tag(c.ordinal(), d));
}
}
Collections.sort(r);
List<Descriptor> answer = new ArrayList<>(r.size());
for (Tag d : r) answer.add(d.d);
return DescriptorVisibilityFilter.apply(Jenkins.get(),answer);
}
/**
* Like {@link #getSortedDescriptorsForGlobalConfigByDescriptor(Predicate)} but with a constant truth predicate, to include all descriptors.
*/
public static Collection<Descriptor> getSortedDescriptorsForGlobalConfigByDescriptor() {
return getSortedDescriptorsForGlobalConfigByDescriptor(descriptor -> true);
}
/**
* @deprecated This is rather meaningless.
*/
@Deprecated
public static Collection<Descriptor> getSortedDescriptorsForGlobalConfigNoSecurity() {
return getSortedDescriptorsForGlobalConfigByDescriptor(d -> GlobalSecurityConfiguration.FILTER.negate().test(d));
}
/**
* Descriptors in the global configuration form that users with {@link Jenkins#MANAGE} permission can configure.
*
* @since 1.506
*/
public static Collection<Descriptor> getSortedDescriptorsForGlobalConfigUnclassified() {
return getSortedDescriptorsForGlobalConfigByDescriptor(d -> d.getCategory() instanceof GlobalConfigurationCategory.Unclassified && Jenkins.get().hasPermission(d.getRequiredGlobalConfigPagePermission()));
}
/**
* Descriptors shown in the global configuration form to users with {@link Jenkins#SYSTEM_READ} permission.
*
* @since TODO
*/
@Restricted(NoExternalUse.class)
public static Collection<Descriptor> getSortedDescriptorsForGlobalConfigUnclassifiedReadable() {
return getSortedDescriptorsForGlobalConfigByDescriptor(d -> d.getCategory() instanceof GlobalConfigurationCategory.Unclassified && (
Jenkins.get().hasPermission(d.getRequiredGlobalConfigPagePermission()) || Jenkins.get().hasPermission(Jenkins.SYSTEM_READ)));
}
/**
* Checks if the current security principal has one of the supplied permissions.
*
* @throws AccessDeniedException
* if the user doesn't have the permission.
*
* @since TODO
*/
public static void checkAnyPermission(AccessControlled ac, Permission[] permissions) {
if (permissions == null || permissions.length == 0) {
return;
}
ac.checkAnyPermission(permissions);
}
private static class Tag implements Comparable<Tag> {
double ordinal;
String hierarchy;
Descriptor d;
Tag(double ordinal, Descriptor d) {
this.ordinal = ordinal;
this.d = d;
this.hierarchy = buildSuperclassHierarchy(d.clazz, new StringBuilder()).toString();
}
private StringBuilder buildSuperclassHierarchy(Class c, StringBuilder buf) {
Class sc = c.getSuperclass();
if (sc!=null) buildSuperclassHierarchy(sc,buf).append(':');
return buf.append(c.getName());
}
public int compareTo(Tag that) {
int r = Double.compare(that.ordinal, this.ordinal);
if (r!=0) return r; // descending for ordinal by reversing the order for compare
return this.hierarchy.compareTo(that.hierarchy);
}
}
/**
* Computes the path to the icon of the given action
* from the context path.
*/
public static String getIconFilePath(Action a) {
String name = a.getIconFileName();
if (name==null) return null;
if (name.startsWith("/"))
return name.substring(1);
else
return "images/24x24/"+name;
}
/**
* Works like JSTL build-in size(x) function,
* but handle null gracefully.
*/
public static int size2(Object o) throws Exception {
if(o==null) return 0;
return ASTSizeFunction.sizeOf(o,Introspector.getUberspect());
}
/**
* Computes the relative path from the current page to the given item.
*/
public static String getRelativeLinkTo(Item p) {
Map<Object,String> ancestors = new HashMap<>();
View view=null;
StaplerRequest request = Stapler.getCurrentRequest();
for( Ancestor a : request.getAncestors() ) {
ancestors.put(a.getObject(),a.getRelativePath());
if(a.getObject() instanceof View)
view = (View) a.getObject();
}
String path = ancestors.get(p);
if(path!=null) {
return normalizeURI(path + '/');
}
Item i=p;
String url = "";
while(true) {
ItemGroup ig = i.getParent();
url = i.getShortUrl()+url;
if(ig== Jenkins.get() || (view != null && ig == view.getOwner().getItemGroup())) {
assert i instanceof TopLevelItem;
if (view != null) {
// assume p and the current page belong to the same view, so return a relative path
// (even if they did not, View.getItem does not by default verify ownership)
return normalizeURI(ancestors.get(view)+'/'+url);
} else {
// otherwise return a path from the root Hudson
return normalizeURI(request.getContextPath()+'/'+p.getUrl());
}
}
path = ancestors.get(ig);
if(path!=null) {
return normalizeURI(path+'/'+url);
}
assert ig instanceof Item; // if not, ig must have been the Hudson instance
i = (Item) ig;
}
}
private static String normalizeURI(String uri) {
return URI.create(uri).normalize().toString();
}
/**
* Gets all the {@link TopLevelItem}s recursively in the {@link ItemGroup} tree.
*
2013-04-13 02:09:12 +08:00
* @since 1.512
*/
public static List<TopLevelItem> getAllTopLevelItems(ItemGroup root) {
return root.getAllItems(TopLevelItem.class);
}
/**
* Gets the relative name or display name to the given item from the specified group.
*
* @since 1.515
* @param p the Item we want the relative display name.
* If {@code null}, a {@code null} will be returned by the method
* @param g the ItemGroup used as point of reference for the item.
* If the group is not specified, item's path will be used.
* @param useDisplayName if true, returns a display name, otherwise returns a name
* @return
* String like "foo » bar".
* {@code null} if item is null or if one of its parents is not an {@link Item}.
*/
@Nullable
public static String getRelativeNameFrom(@CheckForNull Item p, @CheckForNull ItemGroup g, boolean useDisplayName) {
if (p == null) return null;
if (g == null) return useDisplayName ? p.getFullDisplayName() : p.getFullName();
String separationString = useDisplayName ? " » " : "/";
// first list up all the parents
Map<ItemGroup,Integer> parents = new HashMap<>();
int depth=0;
while (g!=null) {
parents.put(g, depth++);
if (g instanceof Item)
g = ((Item)g).getParent();
else
g = null;
}
StringBuilder buf = new StringBuilder();
Item i=p;
while (true) {
if (buf.length()>0) buf.insert(0,separationString);
buf.insert(0,useDisplayName ? i.getDisplayName() : i.getName());
ItemGroup gr = i.getParent();
Integer d = parents.get(gr);
if (d!=null) {
for (int j=d; j>0; j--) {
buf.insert(0,separationString);
buf.insert(0,"..");
}
return buf.toString();
}
if (gr instanceof Item)
i = (Item)gr;
else // Parent is a group, but not an item
return null;
}
}
/**
* Gets the name to the given item relative to given group.
*
* @since 1.515
* @param p the Item we want the relative display name
* If {@code null}, the method will immediately return {@code null}.
* @param g the ItemGroup used as point of reference for the item
* @return
* String like "foo/bar".
* {@code null} if the item is {@code null} or if one of its parents is not an {@link Item}.
*/
@Nullable
public static String getRelativeNameFrom(@CheckForNull Item p, @CheckForNull ItemGroup g) {
return getRelativeNameFrom(p, g, false);
}
/**
* Gets the relative display name to the given item from the specified group.
*
2013-04-13 02:09:12 +08:00
* @since 1.512
* @param p the Item we want the relative display name.
* If {@code null}, the method will immediately return {@code null}.
* @param g the ItemGroup used as point of reference for the item
* @return
* String like "Foo » Bar".
* {@code null} if the item is {@code null} or if one of its parents is not an {@link Item}.
*/
@Nullable
public static String getRelativeDisplayNameFrom(@CheckForNull Item p, @CheckForNull ItemGroup g) {
return getRelativeNameFrom(p, g, true);
}
public static Map<Thread,StackTraceElement[]> dumpAllThreads() {
Map<Thread,StackTraceElement[]> sorted = new TreeMap<>(new ThreadSorter());
sorted.putAll(Thread.getAllStackTraces());
return sorted;
}
public static ThreadInfo[] getThreadInfos() {
ThreadMXBean mbean = ManagementFactory.getThreadMXBean();
return mbean.dumpAllThreads(mbean.isObjectMonitorUsageSupported(),mbean.isSynchronizerUsageSupported());
}
public static ThreadGroupMap sortThreadsAndGetGroupMap(ThreadInfo[] list) {
ThreadGroupMap sorter = new ThreadGroupMap();
Arrays.sort(list, sorter);
return sorter;
}
// Common code for sorting Threads/ThreadInfos by ThreadGroup
private static class ThreadSorterBase {
protected Map<Long,String> map = new HashMap<>();
public ThreadSorterBase() {
ThreadGroup tg = Thread.currentThread().getThreadGroup();
while (tg.getParent() != null) tg = tg.getParent();
Thread[] threads = new Thread[tg.activeCount()*2];
int threadsLen = tg.enumerate(threads, true);
for (int i = 0; i < threadsLen; i++) {
ThreadGroup group = threads[i].getThreadGroup();
map.put(threads[i].getId(), group != null ? group.getName() : null);
}
}
protected int compare(long idA, long idB) {
String tga = map.get(idA), tgb = map.get(idB);
int result = (tga!=null?-1:0) + (tgb!=null?1:0); // Will be non-zero if only one is null
if (result==0 && tga!=null)
result = tga.compareToIgnoreCase(tgb);
return result;
}
}
public static class ThreadGroupMap extends ThreadSorterBase implements Comparator<ThreadInfo>, Serializable {
private static final long serialVersionUID = 7803975728695308444L;
/**
* @return ThreadGroup name or null if unknown
*/
public String getThreadGroup(ThreadInfo ti) {
return map.get(ti.getThreadId());
}
public int compare(ThreadInfo a, ThreadInfo b) {
int result = compare(a.getThreadId(), b.getThreadId());
if (result == 0)
result = a.getThreadName().compareToIgnoreCase(b.getThreadName());
return result;
}
}
private static class ThreadSorter extends ThreadSorterBase implements Comparator<Thread>, Serializable {
private static final long serialVersionUID = 5053631350439192685L;
public int compare(Thread a, Thread b) {
int result = compare(a.getId(), b.getId());
if (result == 0)
result = a.getName().compareToIgnoreCase(b.getName());
return result;
}
}
/**
* @deprecated Now always true.
*/
@Deprecated
public static boolean isMustangOrAbove() {
return true;
}
// ThreadInfo.toString() truncates the stack trace by first 8, so needed my own version
public static String dumpThreadInfo(ThreadInfo ti, ThreadGroupMap map) {
String grp = map.getThreadGroup(ti);
StringBuilder sb = new StringBuilder("\"" + ti.getThreadName() + "\"" +
" Id=" + ti.getThreadId() + " Group=" +
(grp != null ? grp : "?") + " " +
ti.getThreadState());
if (ti.getLockName() != null) {
sb.append(" on " + ti.getLockName());
}
if (ti.getLockOwnerName() != null) {
sb.append(" owned by \"" + ti.getLockOwnerName() +
"\" Id=" + ti.getLockOwnerId());
}
if (ti.isSuspended()) {
sb.append(" (suspended)");
}
if (ti.isInNative()) {
sb.append(" (in native)");
}
sb.append('\n');
StackTraceElement[] stackTrace = ti.getStackTrace();
for (int i=0; i < stackTrace.length; i++) {
StackTraceElement ste = stackTrace[i];
sb.append("\tat ").append(ste);
sb.append('\n');
if (i == 0 && ti.getLockInfo() != null) {
Thread.State ts = ti.getThreadState();
switch (ts) {
case BLOCKED:
sb.append("\t- blocked on ").append(ti.getLockInfo());
sb.append('\n');
break;
case WAITING:
sb.append("\t- waiting on ").append(ti.getLockInfo());
sb.append('\n');
break;
case TIMED_WAITING:
sb.append("\t- waiting on ").append(ti.getLockInfo());
sb.append('\n');
break;
default:
}
}
for (MonitorInfo mi : ti.getLockedMonitors()) {
if (mi.getLockedStackDepth() == i) {
sb.append("\t- locked ").append(mi);
sb.append('\n');
}
}
}
LockInfo[] locks = ti.getLockedSynchronizers();
if (locks.length > 0) {
sb.append("\n\tNumber of locked synchronizers = " + locks.length);
sb.append('\n');
for (LockInfo li : locks) {
sb.append("\t- ").append(li);
sb.append('\n');
}
}
sb.append('\n');
return sb.toString();
}
public static <T> Collection<T> emptyList() {
return Collections.emptyList();
}
public static String jsStringEscape(String s) {
if (s == null) return null;
StringBuilder buf = new StringBuilder();
for( int i=0; i<s.length(); i++ ) {
char ch = s.charAt(i);
switch(ch) {
case '\'':
buf.append("\\'");
break;
case '\\':
buf.append("\\\\");
break;
case '"':
buf.append("\\\"");
break;
default:
buf.append(ch);
}
}
return buf.toString();
}
Merged revisions 17324-17325,17428,17430,17473-17475,17481-17482,17555-17563,17571,17593-17595,17619-17620,17637-17644,17656-17657,17663-17665,17667-17670,17730,17753,17755-17758,17763-17768,17770-17771,17901,17906,17911-17912,17958,17961-17962,17970-17977 via svnmerge from https://www.dev.java.net/svn/hudson/branches/tool-autoinstallation ........ r17324 | jglick | 2009-04-20 18:24:32 -0700 (Mon, 20 Apr 2009) | 2 lines Defensive cloning and Javadoc corrections. (Though it seems no one is using the default impls of these methods yet anyway.) ........ r17325 | jglick | 2009-04-20 18:29:06 -0700 (Mon, 20 Apr 2009) | 1 line Deprecation of delegate method is intentional. ........ r17428 | jglick | 2009-04-23 08:07:14 -0700 (Thu, 23 Apr 2009) | 1 line Noting ToolLocationTranslator more prominently. ........ r17430 | jglick | 2009-04-23 09:16:40 -0700 (Thu, 23 Apr 2009) | 1 line Unused imports. ........ r17473 | jglick | 2009-04-23 19:21:11 -0700 (Thu, 23 Apr 2009) | 1 line Allow Plugin.configure to see the StaplerRequest, needed for some kinds of calls. ........ r17474 | jglick | 2009-04-23 19:25:54 -0700 (Thu, 23 Apr 2009) | 3 lines Initial sketch of plugin to manage tool installations across slaves. (Should really be under ../plugins/ but that was not branched, so putting here for the moment.) ........ r17475 | jglick | 2009-04-23 20:29:36 -0700 (Thu, 23 Apr 2009) | 1 line Typo in Javadoc. ........ r17481 | jglick | 2009-04-23 22:46:26 -0700 (Thu, 23 Apr 2009) | 1 line Unzip of an unbuffered stream is painfully slow. ........ r17482 | jglick | 2009-04-23 22:48:01 -0700 (Thu, 23 Apr 2009) | 1 line ZIP-based tool installer now functional. ........ r17555 | jglick | 2009-04-27 17:50:38 -0700 (Mon, 27 Apr 2009) | 1 line Build against newest trunk. ........ r17556 | jglick | 2009-04-27 18:38:28 -0700 (Mon, 27 Apr 2009) | 1 line Adding help. ........ r17557 | jglick | 2009-04-27 18:57:46 -0700 (Mon, 27 Apr 2009) | 1 line Moving toolName & label config GUI into generic files. ........ r17558 | jglick | 2009-04-27 19:37:30 -0700 (Mon, 27 Apr 2009) | 1 line Typo. ........ r17559 | jglick | 2009-04-27 20:07:47 -0700 (Mon, 27 Apr 2009) | 1 line Second tool installer type based on a freeform command. ........ r17560 | jglick | 2009-04-27 20:24:36 -0700 (Mon, 27 Apr 2009) | 1 line installIfNecessaryFrom will now just return false in case the target dir exists but the URL cannot be opened. ........ r17561 | jglick | 2009-04-27 20:25:22 -0700 (Mon, 27 Apr 2009) | 2 lines chmod only if something was actually installed. Use a+x, not o+x. ........ r17562 | jglick | 2009-04-27 20:26:46 -0700 (Mon, 27 Apr 2009) | 1 line Comment only. ........ r17563 | jglick | 2009-04-27 20:41:12 -0700 (Mon, 27 Apr 2009) | 1 line I18N. ........ r17571 | jglick | 2009-04-28 08:15:31 -0700 (Tue, 28 Apr 2009) | 2 lines Wiki link. ........ r17593 | jglick | 2009-04-28 15:38:33 -0700 (Tue, 28 Apr 2009) | 1 line Turn off echo mode, it's just noise. ........ r17594 | jglick | 2009-04-28 15:39:29 -0700 (Tue, 28 Apr 2009) | 2 lines Synchronizing access to installers for a given node/tool combo. Sending log messages to Hudson log in real time. ........ r17595 | jglick | 2009-04-28 15:46:29 -0700 (Tue, 28 Apr 2009) | 1 line Copyrights. ........ r17619 | jglick | 2009-04-29 06:25:23 -0700 (Wed, 29 Apr 2009) | 1 line Improved Javadoc. ........ r17620 | jglick | 2009-04-29 06:51:11 -0700 (Wed, 29 Apr 2009) | 1 line Demonstraing how to use DLJ to mechanically install official JDK releases on supported operating systems. ........ r17637 | kohsuke | 2009-04-30 16:15:24 -0700 (Thu, 30 Apr 2009) | 1 line fixed what appears to be a C&P mistake ........ r17638 | kohsuke | 2009-04-30 16:16:21 -0700 (Thu, 30 Apr 2009) | 1 line show YUI logger if YUI debugging mode is set. ........ r17639 | kohsuke | 2009-04-30 16:52:28 -0700 (Thu, 30 Apr 2009) | 7 lines Fixed a UI script problem when <hetero-list> nests inside <repeatable>. The cause of the problem was that the behavior for inner <hetero-list> kicks in first, altering HTML (by removing "prototypes"), before behavior for outer <repetable> kicks in and removes the master copy from DOM tree. So <repeatable> ends up computing a master copy after some elements are removed, and hence when we try to reinsert them later by clicking "Add", it'll get incorrect copy, and re-execution of the <hetero-list> behavior bombs out. I fixed this by skipping those HTML-altering behaviors if they show up in the part of DOM tree that's supposed to be snapshotted and removed. ........ r17640 | kohsuke | 2009-04-30 16:57:58 -0700 (Thu, 30 Apr 2009) | 7 lines Added ToolProperty to ToolInstallation (which acts like NodeProperty to Node --- basically decorates the base object with additional properties.) The original motivation is to implement ToolInstaller this way, if Jesse is OK. But decorating tools seem to have some other interesting use, such as a plugin for configuring $M2_HOME/conf/settings.xml, or a plugin to insert unlimited cryptography extension to JDK, or a plugin to add a few more jars into $ANT_HOME/lib. For this to work, ToolInstallations that want properties needs to be modified to use a new constructor. For a starter, I modified the JDK class to do this. I also took the opportunity to modernize JDK/config.jelly. ........ r17641 | kohsuke | 2009-04-30 17:02:04 -0700 (Thu, 30 Apr 2009) | 1 line this appears to be a left-over from early days when we didn't have a means to do form validation ........ r17642 | kohsuke | 2009-04-30 17:02:35 -0700 (Thu, 30 Apr 2009) | 1 line we don't need no.such.JDK but we need name. rebranching ........ r17643 | kohsuke | 2009-04-30 17:03:22 -0700 (Thu, 30 Apr 2009) | 1 line rebranched from Hudson's configure.properties ........ r17644 | kohsuke | 2009-04-30 17:05:31 -0700 (Thu, 30 Apr 2009) | 1 line removed unnecessary translations ........ r17656 | kohsuke | 2009-05-01 11:27:36 -0700 (Fri, 01 May 2009) | 1 line Less hack for improved type safety. Asking people to write more code is not necessarily bad as long as what they need to do is obvious to them. ........ r17657 | kohsuke | 2009-05-01 12:07:20 -0700 (Fri, 01 May 2009) | 5 lines The toolautoinst part of the change that corresponds to rev.17640. ToolInstallers are now hooked under ToolInstallation through InstallSourceProperty as a ToolProperty. This allows the relevant UIs to be shown in one place. Still pending Jesse's feedback. Making it a single commit to simplify a revert if necessary ........ r17663 | kohsuke | 2009-05-01 13:23:51 -0700 (Fri, 01 May 2009) | 1 line doc improvement ........ r17664 | kohsuke | 2009-05-01 13:24:10 -0700 (Fri, 01 May 2009) | 1 line needs this to allow Stapler to databind hetero-list automatically ........ r17665 | jglick | 2009-05-01 13:31:27 -0700 (Fri, 01 May 2009) | 1 line Warnings. ........ r17667 | kohsuke | 2009-05-01 14:20:53 -0700 (Fri, 01 May 2009) | 1 line added a method to do chmod ........ r17668 | kohsuke | 2009-05-01 14:30:35 -0700 (Fri, 01 May 2009) | 1 line prefer JDK6 version to avoid unnecessary JNA loading ........ r17669 | kohsuke | 2009-05-01 14:33:09 -0700 (Fri, 01 May 2009) | 1 line no, I must have confused this. ........ r17670 | kohsuke | 2009-05-01 15:57:11 -0700 (Fri, 01 May 2009) | 2 lines - Automated JDK installer and its test. - Minor update to the signature of ToolInstaller for supplying the expected default location. ........ r17730 | kohsuke | 2009-05-04 11:27:34 -0700 (Mon, 04 May 2009) | 1 line avoid NPE as reported in HUDSON-3608 ........ r17753 | jglick | 2009-05-04 19:34:08 -0700 (Mon, 04 May 2009) | 2 lines Moved toolautoinst functionality into core. ........ r17755 | jglick | 2009-05-04 20:28:34 -0700 (Mon, 04 May 2009) | 8 lines Added TaskListener parameter and IOException and InterruptedException to several methods: Run.getEnvironment NodeSpecific.forNode ToolLocationTranslator.getToolHome ToolLocationNodeProperty.getToolHome ToolInstallation.translateFor ProcessCache.Factory.getMavenInstallation ProcessCache.Factory.getJava ........ r17756 | jglick | 2009-05-04 20:36:56 -0700 (Mon, 04 May 2009) | 1 line expectedLocation was never strictly necessary, and will soon no longer be used even by JDKInstaller. ........ r17757 | jglick | 2009-05-04 20:40:41 -0700 (Mon, 04 May 2009) | 1 line Not sure yet what @since should be. ........ r17758 | jglick | 2009-05-04 20:41:51 -0700 (Mon, 04 May 2009) | 1 line getDefaultInstallers method added. Not yet in use. ........ r17763 | kohsuke | 2009-05-05 10:50:36 -0700 (Tue, 05 May 2009) | 1 line deprecated redundant getJavaHome method ........ r17764 | kohsuke | 2009-05-05 12:10:45 -0700 (Tue, 05 May 2009) | 1 line added general-purpose property defaulting mechanism, and added default tool installer for JDK ........ r17765 | jglick | 2009-05-05 12:35:56 -0700 (Tue, 05 May 2009) | 1 line capitalize("") -> "" ........ r17766 | jglick | 2009-05-05 12:49:52 -0700 (Tue, 05 May 2009) | 1 line Missing @since. ........ r17767 | jglick | 2009-05-05 13:01:41 -0700 (Tue, 05 May 2009) | 1 line Unchecked warning. ........ r17768 | jglick | 2009-05-05 13:19:49 -0700 (Tue, 05 May 2009) | 2 lines Two unsuccessful attempts at form validation. ........ r17770 | jglick | 2009-05-05 13:48:37 -0700 (Tue, 05 May 2009) | 1 line Better class names. ........ r17771 | kohsuke | 2009-05-05 14:12:21 -0700 (Tue, 05 May 2009) | 5 lines brought the form validation check back. The trick is to use the 'value' parameter. In the end we'd expect this check to go away anyway, as we change input field to drop-down list, but in the mean time, this is why it didn't work. Maybe we probably need more static code checkers? Like FindBugs rules? ........ r17901 | kohsuke | 2009-05-09 19:15:40 -0700 (Sat, 09 May 2009) | 1 line having two toolHome is odd. ........ r17906 | kohsuke | 2009-05-10 11:09:13 -0700 (Sun, 10 May 2009) | 1 line adding the generalization of UpdateCenter, but for compatibility reasons, we are leaving UpdateCenter as-is. ........ r17911 | kohsuke | 2009-05-10 17:02:53 -0700 (Sun, 10 May 2009) | 1 line integrated json-lib with a bit of bug fix ........ r17912 | kohsuke | 2009-05-10 17:13:05 -0700 (Sun, 10 May 2009) | 1 line JDK list is now fetched from hudson.dev.java.net ........ r17958 | kohsuke | 2009-05-11 13:44:25 -0700 (Mon, 11 May 2009) | 48 lines Handle AbortException better to avoid error like this: [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] Failed to delete directory: C:\files\hudson\workspace\hudson\hudson\main\remoting\target. Reason: Unable to delete file C:\files\hudson\workspace\hudson\hudson\main\remoting\target\remoting-1.304-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] For more information, run Maven with the -e switch [INFO] ------------------------------------------------------------------------ [INFO] Total time: 31 seconds [INFO] Finished at: Sun May 10 18:15:33 PDT 2009 [INFO] Final Memory: 25M/48M [INFO] ------------------------------------------------------------------------ Recording fingerprints Archiving artifacts Recording test results ERROR: Failed to archive JUnit reports hudson.util.IOException2: remote file operation failed at hudson.FilePath.act(FilePath.java:596) at hudson.tasks.junit.JUnitResultArchiver.perform(JUnitResultArchiver.java:82) at hudson.model.AbstractBuild$AbstractRunner.performAllBuildStep(AbstractBuild.java:372) at hudson.model.AbstractBuild$AbstractRunner.performAllBuildStep(AbstractBuild.java:360) at hudson.model.Build$RunnerImpl.post2(Build.java:183) at hudson.model.AbstractBuild$AbstractRunner.post(AbstractBuild.java:345) at hudson.model.Run.run(Run.java:943) at hudson.model.Build.run(Build.java:112) at hudson.model.ResourceController.execute(ResourceController.java:93) at hudson.model.Executor.run(Executor.java:119) Caused by: hudson.AbortException: Test reports were found but none of them are new. Did tests run? For example, \files\hudson\workspace\hudson\hudson\main\core\target\surefire-reports\TEST-hudson.BulkChangeTest.xml is 2 days 23 hr old at hudson.tasks.junit.TestResult.parse(TestResult.java:134) at hudson.tasks.junit.TestResult.<init>(TestResult.java:95) at hudson.tasks.junit.JUnitResultArchiver$1.invoke(JUnitResultArchiver.java:95) at hudson.tasks.junit.JUnitResultArchiver$1.invoke(JUnitResultArchiver.java:82) at hudson.FilePath$FileCallableWrapper.call(FilePath.java:1583) at hudson.remoting.UserRequest.perform(UserRequest.java:92) at hudson.remoting.UserRequest.perform(UserRequest.java:46) at hudson.remoting.Request$2.run(Request.java:236) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) ........ r17961 | kohsuke | 2009-05-11 15:16:39 -0700 (Mon, 11 May 2009) | 1 line adding Windows JDK silent installation ........ r17962 | kohsuke | 2009-05-11 16:08:13 -0700 (Mon, 11 May 2009) | 1 line Fixing JDK offline installatino for Windows ........ r17970 | kohsuke | 2009-05-11 19:37:59 -0700 (Mon, 11 May 2009) | 1 line Fixing a problem that prevents the usage of this tag in <repeatable> block, which reinserts the same fragment over and over. So statically assigning IDs won't work ........ r17971 | kohsuke | 2009-05-11 22:17:09 -0700 (Mon, 11 May 2009) | 1 line continuing to remove static ID generation, which breaks the tag when used inside <repetable> tag. ........ r17972 | kohsuke | 2009-05-11 22:19:11 -0700 (Mon, 11 May 2009) | 1 line I don't know when this started, but even in the hudson-dev:run mode, the versionis no longer '?', so we need a different way to force reload ........ r17973 | kohsuke | 2009-05-11 22:26:34 -0700 (Mon, 11 May 2009) | 1 line adjusted the text a bit since multiple "add" and "delete"s were rather confusing ........ r17974 | kohsuke | 2009-05-11 22:31:58 -0700 (Mon, 11 May 2009) | 1 line added help screen ........ r17975 | kohsuke | 2009-05-11 22:41:39 -0700 (Mon, 11 May 2009) | 1 line form validation now works against the checkbox, too ........ r17976 | kohsuke | 2009-05-11 22:43:00 -0700 (Mon, 11 May 2009) | 1 line with auto installation, we expect users to specify a directory that doesn't exist yet, so don't report it as an error ........ r17977 | kohsuke | 2009-05-11 22:43:24 -0700 (Mon, 11 May 2009) | 1 line improving the text ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@17985 71c3de6d-444a-0410-be80-ed276b4c234a
2009-05-12 21:59:10 +08:00
/**
* Converts "abc" to "Abc".
*/
public static String capitalize(String s) {
if(s==null || s.length()==0) return s;
return Character.toUpperCase(s.charAt(0))+s.substring(1);
}
public static String getVersion() {
return Jenkins.VERSION;
}
/**
Spelling fixes in changelogs, Javadoc, logs and UI (#2718) * spelling: abstract * spelling: about * spelling: absolute * spelling: across * spelling: activity * spelling: actually * spelling: addition * spelling: allocating * spelling: ambiguous * spelling: analyzes * spelling: analysis * spelling: another * spelling: appear * spelling: arbitrary * spelling: artifact * spelling: assignment * spelling: associated * spelling: augment * spelling: authentication * spelling: automatically * spelling: available * spelling: availability * spelling: because * spelling: background * spelling: beginning * spelling: boolean * spelling: browsers * spelling: building * spelling: calculation * spelling: channel * spelling: column * spelling: concatenation * spelling: connect * spelling: contribute * spelling: convert * spelling: copied * spelling: couldn't * spelling: scrambled * spelling: creates-a * spelling: curr-entry * spelling: customize * spelling: diagnostic * spelling: contain * spelling: default * spelling: delimiter * spelling: descriptor * spelling: disambiguates * spelling: different * spelling: diligently * spelling: disabled * spelling: discovered * spelling: display * spelling: doesn't * spelling: dollar * spelling: downstream * spelling: dynamically * spelling: preemptively * spelling: encrypt * spelling: erroneous * spelling: examine * spelling: existence * spelling: value * spelling: february * spelling: handling * spelling: hostname * spelling: convenient * spelling: identify * spelling: implementation * spelling: incorrect * spelling: individual * spelling: initialization * spelling: initialized * spelling: inputstream * spelling: instantiated * spelling: instantiation * spelling: intended * spelling: interpreted * spelling: interrupted * spelling: invocations * spelling: kern * spelling: localization * spelling: logger * spelling: malfunctioning * spelling: methods * spelling: monitor * spelling: mutator * spelling: multiple * spelling: object * spelling: configured * spelling: optionally * spelling: option * spelling: overridden * spelling: parameterized * spelling: parent * spelling: permissions * spelling: plugin * spelling: potentially * spelling: preferable * spelling: problems like * spelling: programmatically * spelling: property * spelling: reallocate * spelling: recommended * spelling: redirected * spelling: registered * spelling: reliable * spelling: remember * spelling: recurrence * spelling: repeatable * spelling: repeated * spelling: resource * spelling: retrieve * spelling: returned * spelling: revision * spelling: sandwich * spelling: separator * spelling: serialization * spelling: settings * spelling: shadow * spelling: should * spelling: someone * spelling: source * spelling: specified * spelling: style * spelling: subversion * spelling: sufficient * spelling: supplementary * spelling: suppressing * spelling: synchronization * spelling: synchronized * spelling: this * spelling: transitioning * spelling: termination * spelling: trying * spelling: truncatable * spelling: unknown * spelling: undeployed * spelling: unnecessary * spelling: unparseable * spelling: update * spelling: upper * spelling: verify * spelling: visible * spelling: warning * spelling: we're * spelling: whitespace * spelling: wide * spelling: with * spelling: workspace * spelling: yielding * spelling: to * spelling: by * spelling: the * spelling: hours
2017-02-12 18:38:30 +08:00
* Resource path prefix.
*/
public static String getResourcePath() {
return Jenkins.RESOURCE_PATH;
}
public static String getViewResource(Object it, String path) {
Class clazz = it.getClass();
if(it instanceof Class)
clazz = (Class)it;
if(it instanceof Descriptor)
clazz = ((Descriptor)it).clazz;
String buf = Stapler.getCurrentRequest().getContextPath() + Jenkins.VIEW_RESOURCE_PATH + '/' +
clazz.getName().replace('.', '/').replace('$', '/') +
'/' + path;
return buf;
}
public static boolean hasView(Object it, String path) throws IOException {
if(it==null) return false;
return Stapler.getCurrentRequest().getView(it,path)!=null;
}
/**
* Can be used to check a checkbox by default.
* Used from views like {@code h.defaultToTrue(scm.useUpdate)}.
* The expression will evaluate to true if scm is null.
*/
public static boolean defaultToTrue(Boolean b) {
if(b==null) return true;
return b;
}
/**
* If the value exists, return that value. Otherwise return the default value.
* <p>
* Starting 1.294, JEXL supports the elvis operator "x?:y" that supersedes this.
*
* @since 1.150
*/
public static <T> T defaulted(T value, T defaultValue) {
return value!=null ? value : defaultValue;
}
2015-05-29 20:02:59 +08:00
/**
* Prints a stack trace from an exception into a readable form.
* Unlike {@link Throwable#printStackTrace(PrintWriter)}, this implementation follows the suggestion of JDK-6507809
* to produce a linear trace even when {@link Throwable#getCause} is used.
* @param t Input {@link Throwable}
* @return If {@code t} is not null, generally a multiline string ending in a (platform-specific) newline;
* otherwise, the method returns a default
* &quot;No exception details&quot; string.
2015-05-29 20:02:59 +08:00
*/
public static @Nonnull String printThrowable(@CheckForNull Throwable t) {
if (t == null) {
return Messages.Functions_NoExceptionDetails();
}
StringBuilder s = new StringBuilder();
doPrintStackTrace(s, t, null, "", new HashSet<>());
return s.toString();
}
2016-12-13 05:14:48 +08:00
private static void doPrintStackTrace(@Nonnull StringBuilder s, @Nonnull Throwable t, @CheckForNull Throwable higher, @Nonnull String prefix, @Nonnull Set<Throwable> encountered) {
if (!encountered.add(t)) {
s.append("<cycle to ").append(t).append(">\n");
return;
}
2016-12-13 05:06:57 +08:00
if (Util.isOverridden(Throwable.class, t.getClass(), "printStackTrace", PrintWriter.class)) {
StringWriter sw = new StringWriter();
t.printStackTrace(new PrintWriter(sw));
s.append(sw.toString());
return;
}
Throwable lower = t.getCause();
if (lower != null) {
2016-12-13 05:14:48 +08:00
doPrintStackTrace(s, lower, t, prefix, encountered);
2016-12-13 05:00:30 +08:00
}
for (Throwable suppressed : t.getSuppressed()) {
s.append(prefix).append("Also: ");
2016-12-13 05:14:48 +08:00
doPrintStackTrace(s, suppressed, t, prefix + "\t", encountered);
2016-12-13 05:00:30 +08:00
}
if (lower != null) {
s.append(prefix).append("Caused: ");
}
String summary = t.toString();
if (lower != null) {
String suffix = ": " + lower;
if (summary.endsWith(suffix)) {
summary = summary.substring(0, summary.length() - suffix.length());
}
}
2015-05-29 19:54:36 +08:00
s.append(summary).append(IOUtils.LINE_SEPARATOR);
StackTraceElement[] trace = t.getStackTrace();
int end = trace.length;
if (higher != null) {
StackTraceElement[] higherTrace = higher.getStackTrace();
while (end > 0) {
int higherEnd = end + higherTrace.length - trace.length;
if (higherEnd <= 0 || !higherTrace[higherEnd - 1].equals(trace[end - 1])) {
break;
}
end--;
}
}
for (int i = 0; i < end; i++) {
2016-12-13 05:00:30 +08:00
s.append(prefix).append("\tat ").append(trace[i]).append(IOUtils.LINE_SEPARATOR);
}
}
/**
* Like {@link Throwable#printStackTrace(PrintWriter)} but using {@link #printThrowable} format.
* @param t an exception to print
* @param pw the log
* @since 2.43
*/
public static void printStackTrace(@CheckForNull Throwable t, @Nonnull PrintWriter pw) {
pw.println(printThrowable(t).trim());
}
/**
* Like {@link Throwable#printStackTrace(PrintStream)} but using {@link #printThrowable} format.
* @param t an exception to print
* @param ps the log
* @since 2.43
*/
public static void printStackTrace(@CheckForNull Throwable t, @Nonnull PrintStream ps) {
ps.println(printThrowable(t).trim());
}
/**
* Counts the number of rows needed for textarea to fit the content.
* Minimum 5 rows.
*/
public static int determineRows(String s) {
if(s==null) return 5;
return Math.max(5,LINE_END.split(s).length);
}
/**
* Converts the Hudson build status to CruiseControl build status,
* which is either Success, Failure, Exception, or Unknown.
*
* @deprecated This functionality has been moved to ccxml plugin.
*/
@Deprecated
@Restricted(DoNotUse.class)
@RestrictedSince("since TODO")
public static String toCCStatus(Item i) {
return "Unknown";
}
private static final Pattern LINE_END = Pattern.compile("\r?\n");
/**
* Checks if the current user is anonymous.
*/
public static boolean isAnonymous() {
[JENKINS-27027] Notify the SecurityListener on authentication (#3074) * [JENKINS-27026] Notify the SecurityListener in case of Token based authentication success - due the current version of the method, the UserDetails required for the event was not accessible. In order to stay with the same API in SecurityListener, two "protected" methods were created to split the job and let the UserDetails accessible * - add test to ensure the SecurityListener is called for REST Token but also for regular basic auth * - remove the comment about the split, will be put in GitHub comment instead * - add check for anonymous call instead of just putting a comment - remove the constructor in the dummy - add link to PR from Daniel to simplify a call * - separate the before/after to save one clear and be more explicit - put more meaning in the assertLastEventIs method by explicitly say we will remove the last event * - add comment about why we do not fire the "failedToAuthenticated" in the case of an invalid token (tips: it's because it could be a valid password) * - also add the authenticated trigger on legacy filter as pointed by Ivan * - add support of event on CLI remoting authentication - adjust tests by moving the helper class used to spy on events * - as mentioned Yvan, the code had some problems with null checking, so the approach is changed in order to encapsulate all that internal mechanism * - add javadoc - open the getUserDetailsForImpersonation from the User (will let the SSHD module to retrieve UserDetails from that) * - remove single quote in log messages * - basic corrections requested by Jesse * - just another typo * - adjust the javadoc for SecurityListener events * - add the link to Jenkins#Anonymous * - add link (not using see) * - update comment on the isAnonymous as we (me + Oleg) do not find a best place at the moment * - put the new method isAnonymous in ACL instead of Functions * - little typo - add requirement about the SecurityContext authentication
2017-12-15 03:44:54 +08:00
return ACL.isAnonymous(Jenkins.getAuthentication());
}
/**
* When called from within JEXL expression evaluation,
* this method returns the current {@link JellyContext} used
* to evaluate the script.
*
* @since 1.164
*/
public static JellyContext getCurrentJellyContext() {
JellyContext context = ExpressionFactory2.CURRENT_CONTEXT.get();
assert context!=null;
return context;
}
/**
* Evaluate a Jelly script and return output as a String.
*
* @since 1.267
*/
public static String runScript(Script script) throws JellyTagException {
StringWriter out = new StringWriter();
script.run(getCurrentJellyContext(), XMLOutput.createXMLOutput(out));
return out.toString();
}
/**
* Returns a sub-list if the given list is bigger than the specified {@code maxSize}.
* <strong>Warning:</strong> do not call this with a {@link RunList}, or you will break lazy loading!
*/
public static <T> List<T> subList(List<T> base, int maxSize) {
if(maxSize<base.size())
return base.subList(0,maxSize);
else
return base;
}
2012-02-29 09:21:43 +08:00
/**
* Combine path components via '/' while handling leading/trailing '/' to avoid duplicates.
*/
public static String joinPath(String... components) {
StringBuilder buf = new StringBuilder();
for (String s : components) {
if (s.length()==0) continue;
if (buf.length()>0) {
if (buf.charAt(buf.length()-1)!='/')
buf.append('/');
if (s.charAt(0)=='/') s=s.substring(1);
}
buf.append(s);
}
return buf.toString();
}
/**
* Computes the hyperlink to actions, to handle the situation when the {@link Action#getUrlName()}
* returns absolute URL.
*
* @return null in case the action should not be presented to the user.
*/
public static @CheckForNull String getActionUrl(String itUrl,Action action) {
String urlName = action.getUrlName();
if(urlName==null) return null; // Should not be displayed
try {
if (new URI(urlName).isAbsolute()) {
return urlName;
}
} catch (URISyntaxException x) {
Logger.getLogger(Functions.class.getName()).log(Level.WARNING, "Failed to parse URL for {0}: {1}", new Object[] {action, x});
return null;
}
if(urlName.startsWith("/"))
2012-02-29 09:21:43 +08:00
return joinPath(Stapler.getCurrentRequest().getContextPath(),urlName);
else
// relative URL name
return joinPath(Stapler.getCurrentRequest().getContextPath()+'/'+itUrl,urlName);
}
/**
* Escapes the character unsafe for e-mail address.
* See http://en.wikipedia.org/wiki/E-mail_address for the details,
* but here the vocabulary is even more restricted.
*/
public static String toEmailSafeString(String projectName) {
// TODO: escape non-ASCII characters
StringBuilder buf = new StringBuilder(projectName.length());
for( int i=0; i<projectName.length(); i++ ) {
char ch = projectName.charAt(i);
if(('a'<=ch && ch<='z')
2019-08-21 12:52:39 +08:00
|| ('A'<=ch && ch<='Z')
|| ('0'<=ch && ch<='9')
|| "-_.".indexOf(ch)>=0)
buf.append(ch);
else
buf.append('_'); // escape
}
return String.valueOf(buf);
}
/**
* Obtains the host name of the Hudson server that clients can use to talk back to.
* <p>
* This is primarily used in {@code slave-agent.jnlp.jelly} to specify the destination
* that the agents talk to.
*/
public String getServerName() {
// Try to infer this from the configured root URL.
// This makes it work correctly when Hudson runs behind a reverse proxy.
String url = Jenkins.get().getRootUrl();
try {
if(url!=null) {
String host = new URL(url).getHost();
if(host!=null)
return host;
}
} catch (MalformedURLException e) {
// fall back to HTTP request
}
return Stapler.getCurrentRequest().getServerName();
}
/**
* Determines the form validation check URL. See textbox.jelly
*
* @deprecated
* Use {@link #calcCheckUrl}
*/
@Deprecated
public String getCheckUrl(String userDefined, Object descriptor, String field) {
if(userDefined!=null || field==null) return userDefined;
if (descriptor instanceof Descriptor) {
Descriptor d = (Descriptor) descriptor;
return d.getCheckUrl(field);
}
return null;
}
/**
* Determines the parameters that client-side needs for a form validation check. See prepareDatabinding.jelly
* @since 1.528
*/
public void calcCheckUrl(Map attributes, String userDefined, Object descriptor, String field) {
if(userDefined!=null || field==null) return;
if (descriptor instanceof Descriptor) {
Descriptor d = (Descriptor) descriptor;
CheckMethod m = d.getCheckMethod(field);
attributes.put("checkUrl",m.toStemUrl());
attributes.put("checkDependsOn",m.getDependsOn());
}
}
/**
* If the given href link is matching the current page, return true.
*
* Used in {@code task.jelly} to decide if the page should be highlighted.
*/
public boolean hyperlinkMatchesCurrentPage(String href) throws UnsupportedEncodingException {
String url = Stapler.getCurrentRequest().getRequestURL().toString();
if (href == null || href.length() <= 1) return ".".equals(href) && url.endsWith("/");
url = URLDecoder.decode(url,"UTF-8");
href = URLDecoder.decode(href,"UTF-8");
if (url.endsWith("/")) url = url.substring(0, url.length() - 1);
if (href.endsWith("/")) href = href.substring(0, href.length() - 1);
return url.endsWith(href);
}
public <T> List<T> singletonList(T t) {
return Collections.singletonList(t);
}
/**
* Gets all the {@link PageDecorator}s.
*/
public static List<PageDecorator> getPageDecorators() {
Merged revisions 17324-17325,17428,17430,17473-17475,17481-17482,17555-17563,17571,17593-17595,17619-17620,17637-17644,17656-17657,17663-17665,17667-17670,17730,17753,17755-17758,17763-17768,17770-17771,17901,17906,17911-17912,17958,17961-17962,17970-17977 via svnmerge from https://www.dev.java.net/svn/hudson/branches/tool-autoinstallation ........ r17324 | jglick | 2009-04-20 18:24:32 -0700 (Mon, 20 Apr 2009) | 2 lines Defensive cloning and Javadoc corrections. (Though it seems no one is using the default impls of these methods yet anyway.) ........ r17325 | jglick | 2009-04-20 18:29:06 -0700 (Mon, 20 Apr 2009) | 1 line Deprecation of delegate method is intentional. ........ r17428 | jglick | 2009-04-23 08:07:14 -0700 (Thu, 23 Apr 2009) | 1 line Noting ToolLocationTranslator more prominently. ........ r17430 | jglick | 2009-04-23 09:16:40 -0700 (Thu, 23 Apr 2009) | 1 line Unused imports. ........ r17473 | jglick | 2009-04-23 19:21:11 -0700 (Thu, 23 Apr 2009) | 1 line Allow Plugin.configure to see the StaplerRequest, needed for some kinds of calls. ........ r17474 | jglick | 2009-04-23 19:25:54 -0700 (Thu, 23 Apr 2009) | 3 lines Initial sketch of plugin to manage tool installations across slaves. (Should really be under ../plugins/ but that was not branched, so putting here for the moment.) ........ r17475 | jglick | 2009-04-23 20:29:36 -0700 (Thu, 23 Apr 2009) | 1 line Typo in Javadoc. ........ r17481 | jglick | 2009-04-23 22:46:26 -0700 (Thu, 23 Apr 2009) | 1 line Unzip of an unbuffered stream is painfully slow. ........ r17482 | jglick | 2009-04-23 22:48:01 -0700 (Thu, 23 Apr 2009) | 1 line ZIP-based tool installer now functional. ........ r17555 | jglick | 2009-04-27 17:50:38 -0700 (Mon, 27 Apr 2009) | 1 line Build against newest trunk. ........ r17556 | jglick | 2009-04-27 18:38:28 -0700 (Mon, 27 Apr 2009) | 1 line Adding help. ........ r17557 | jglick | 2009-04-27 18:57:46 -0700 (Mon, 27 Apr 2009) | 1 line Moving toolName & label config GUI into generic files. ........ r17558 | jglick | 2009-04-27 19:37:30 -0700 (Mon, 27 Apr 2009) | 1 line Typo. ........ r17559 | jglick | 2009-04-27 20:07:47 -0700 (Mon, 27 Apr 2009) | 1 line Second tool installer type based on a freeform command. ........ r17560 | jglick | 2009-04-27 20:24:36 -0700 (Mon, 27 Apr 2009) | 1 line installIfNecessaryFrom will now just return false in case the target dir exists but the URL cannot be opened. ........ r17561 | jglick | 2009-04-27 20:25:22 -0700 (Mon, 27 Apr 2009) | 2 lines chmod only if something was actually installed. Use a+x, not o+x. ........ r17562 | jglick | 2009-04-27 20:26:46 -0700 (Mon, 27 Apr 2009) | 1 line Comment only. ........ r17563 | jglick | 2009-04-27 20:41:12 -0700 (Mon, 27 Apr 2009) | 1 line I18N. ........ r17571 | jglick | 2009-04-28 08:15:31 -0700 (Tue, 28 Apr 2009) | 2 lines Wiki link. ........ r17593 | jglick | 2009-04-28 15:38:33 -0700 (Tue, 28 Apr 2009) | 1 line Turn off echo mode, it's just noise. ........ r17594 | jglick | 2009-04-28 15:39:29 -0700 (Tue, 28 Apr 2009) | 2 lines Synchronizing access to installers for a given node/tool combo. Sending log messages to Hudson log in real time. ........ r17595 | jglick | 2009-04-28 15:46:29 -0700 (Tue, 28 Apr 2009) | 1 line Copyrights. ........ r17619 | jglick | 2009-04-29 06:25:23 -0700 (Wed, 29 Apr 2009) | 1 line Improved Javadoc. ........ r17620 | jglick | 2009-04-29 06:51:11 -0700 (Wed, 29 Apr 2009) | 1 line Demonstraing how to use DLJ to mechanically install official JDK releases on supported operating systems. ........ r17637 | kohsuke | 2009-04-30 16:15:24 -0700 (Thu, 30 Apr 2009) | 1 line fixed what appears to be a C&P mistake ........ r17638 | kohsuke | 2009-04-30 16:16:21 -0700 (Thu, 30 Apr 2009) | 1 line show YUI logger if YUI debugging mode is set. ........ r17639 | kohsuke | 2009-04-30 16:52:28 -0700 (Thu, 30 Apr 2009) | 7 lines Fixed a UI script problem when <hetero-list> nests inside <repeatable>. The cause of the problem was that the behavior for inner <hetero-list> kicks in first, altering HTML (by removing "prototypes"), before behavior for outer <repetable> kicks in and removes the master copy from DOM tree. So <repeatable> ends up computing a master copy after some elements are removed, and hence when we try to reinsert them later by clicking "Add", it'll get incorrect copy, and re-execution of the <hetero-list> behavior bombs out. I fixed this by skipping those HTML-altering behaviors if they show up in the part of DOM tree that's supposed to be snapshotted and removed. ........ r17640 | kohsuke | 2009-04-30 16:57:58 -0700 (Thu, 30 Apr 2009) | 7 lines Added ToolProperty to ToolInstallation (which acts like NodeProperty to Node --- basically decorates the base object with additional properties.) The original motivation is to implement ToolInstaller this way, if Jesse is OK. But decorating tools seem to have some other interesting use, such as a plugin for configuring $M2_HOME/conf/settings.xml, or a plugin to insert unlimited cryptography extension to JDK, or a plugin to add a few more jars into $ANT_HOME/lib. For this to work, ToolInstallations that want properties needs to be modified to use a new constructor. For a starter, I modified the JDK class to do this. I also took the opportunity to modernize JDK/config.jelly. ........ r17641 | kohsuke | 2009-04-30 17:02:04 -0700 (Thu, 30 Apr 2009) | 1 line this appears to be a left-over from early days when we didn't have a means to do form validation ........ r17642 | kohsuke | 2009-04-30 17:02:35 -0700 (Thu, 30 Apr 2009) | 1 line we don't need no.such.JDK but we need name. rebranching ........ r17643 | kohsuke | 2009-04-30 17:03:22 -0700 (Thu, 30 Apr 2009) | 1 line rebranched from Hudson's configure.properties ........ r17644 | kohsuke | 2009-04-30 17:05:31 -0700 (Thu, 30 Apr 2009) | 1 line removed unnecessary translations ........ r17656 | kohsuke | 2009-05-01 11:27:36 -0700 (Fri, 01 May 2009) | 1 line Less hack for improved type safety. Asking people to write more code is not necessarily bad as long as what they need to do is obvious to them. ........ r17657 | kohsuke | 2009-05-01 12:07:20 -0700 (Fri, 01 May 2009) | 5 lines The toolautoinst part of the change that corresponds to rev.17640. ToolInstallers are now hooked under ToolInstallation through InstallSourceProperty as a ToolProperty. This allows the relevant UIs to be shown in one place. Still pending Jesse's feedback. Making it a single commit to simplify a revert if necessary ........ r17663 | kohsuke | 2009-05-01 13:23:51 -0700 (Fri, 01 May 2009) | 1 line doc improvement ........ r17664 | kohsuke | 2009-05-01 13:24:10 -0700 (Fri, 01 May 2009) | 1 line needs this to allow Stapler to databind hetero-list automatically ........ r17665 | jglick | 2009-05-01 13:31:27 -0700 (Fri, 01 May 2009) | 1 line Warnings. ........ r17667 | kohsuke | 2009-05-01 14:20:53 -0700 (Fri, 01 May 2009) | 1 line added a method to do chmod ........ r17668 | kohsuke | 2009-05-01 14:30:35 -0700 (Fri, 01 May 2009) | 1 line prefer JDK6 version to avoid unnecessary JNA loading ........ r17669 | kohsuke | 2009-05-01 14:33:09 -0700 (Fri, 01 May 2009) | 1 line no, I must have confused this. ........ r17670 | kohsuke | 2009-05-01 15:57:11 -0700 (Fri, 01 May 2009) | 2 lines - Automated JDK installer and its test. - Minor update to the signature of ToolInstaller for supplying the expected default location. ........ r17730 | kohsuke | 2009-05-04 11:27:34 -0700 (Mon, 04 May 2009) | 1 line avoid NPE as reported in HUDSON-3608 ........ r17753 | jglick | 2009-05-04 19:34:08 -0700 (Mon, 04 May 2009) | 2 lines Moved toolautoinst functionality into core. ........ r17755 | jglick | 2009-05-04 20:28:34 -0700 (Mon, 04 May 2009) | 8 lines Added TaskListener parameter and IOException and InterruptedException to several methods: Run.getEnvironment NodeSpecific.forNode ToolLocationTranslator.getToolHome ToolLocationNodeProperty.getToolHome ToolInstallation.translateFor ProcessCache.Factory.getMavenInstallation ProcessCache.Factory.getJava ........ r17756 | jglick | 2009-05-04 20:36:56 -0700 (Mon, 04 May 2009) | 1 line expectedLocation was never strictly necessary, and will soon no longer be used even by JDKInstaller. ........ r17757 | jglick | 2009-05-04 20:40:41 -0700 (Mon, 04 May 2009) | 1 line Not sure yet what @since should be. ........ r17758 | jglick | 2009-05-04 20:41:51 -0700 (Mon, 04 May 2009) | 1 line getDefaultInstallers method added. Not yet in use. ........ r17763 | kohsuke | 2009-05-05 10:50:36 -0700 (Tue, 05 May 2009) | 1 line deprecated redundant getJavaHome method ........ r17764 | kohsuke | 2009-05-05 12:10:45 -0700 (Tue, 05 May 2009) | 1 line added general-purpose property defaulting mechanism, and added default tool installer for JDK ........ r17765 | jglick | 2009-05-05 12:35:56 -0700 (Tue, 05 May 2009) | 1 line capitalize("") -> "" ........ r17766 | jglick | 2009-05-05 12:49:52 -0700 (Tue, 05 May 2009) | 1 line Missing @since. ........ r17767 | jglick | 2009-05-05 13:01:41 -0700 (Tue, 05 May 2009) | 1 line Unchecked warning. ........ r17768 | jglick | 2009-05-05 13:19:49 -0700 (Tue, 05 May 2009) | 2 lines Two unsuccessful attempts at form validation. ........ r17770 | jglick | 2009-05-05 13:48:37 -0700 (Tue, 05 May 2009) | 1 line Better class names. ........ r17771 | kohsuke | 2009-05-05 14:12:21 -0700 (Tue, 05 May 2009) | 5 lines brought the form validation check back. The trick is to use the 'value' parameter. In the end we'd expect this check to go away anyway, as we change input field to drop-down list, but in the mean time, this is why it didn't work. Maybe we probably need more static code checkers? Like FindBugs rules? ........ r17901 | kohsuke | 2009-05-09 19:15:40 -0700 (Sat, 09 May 2009) | 1 line having two toolHome is odd. ........ r17906 | kohsuke | 2009-05-10 11:09:13 -0700 (Sun, 10 May 2009) | 1 line adding the generalization of UpdateCenter, but for compatibility reasons, we are leaving UpdateCenter as-is. ........ r17911 | kohsuke | 2009-05-10 17:02:53 -0700 (Sun, 10 May 2009) | 1 line integrated json-lib with a bit of bug fix ........ r17912 | kohsuke | 2009-05-10 17:13:05 -0700 (Sun, 10 May 2009) | 1 line JDK list is now fetched from hudson.dev.java.net ........ r17958 | kohsuke | 2009-05-11 13:44:25 -0700 (Mon, 11 May 2009) | 48 lines Handle AbortException better to avoid error like this: [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] Failed to delete directory: C:\files\hudson\workspace\hudson\hudson\main\remoting\target. Reason: Unable to delete file C:\files\hudson\workspace\hudson\hudson\main\remoting\target\remoting-1.304-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] For more information, run Maven with the -e switch [INFO] ------------------------------------------------------------------------ [INFO] Total time: 31 seconds [INFO] Finished at: Sun May 10 18:15:33 PDT 2009 [INFO] Final Memory: 25M/48M [INFO] ------------------------------------------------------------------------ Recording fingerprints Archiving artifacts Recording test results ERROR: Failed to archive JUnit reports hudson.util.IOException2: remote file operation failed at hudson.FilePath.act(FilePath.java:596) at hudson.tasks.junit.JUnitResultArchiver.perform(JUnitResultArchiver.java:82) at hudson.model.AbstractBuild$AbstractRunner.performAllBuildStep(AbstractBuild.java:372) at hudson.model.AbstractBuild$AbstractRunner.performAllBuildStep(AbstractBuild.java:360) at hudson.model.Build$RunnerImpl.post2(Build.java:183) at hudson.model.AbstractBuild$AbstractRunner.post(AbstractBuild.java:345) at hudson.model.Run.run(Run.java:943) at hudson.model.Build.run(Build.java:112) at hudson.model.ResourceController.execute(ResourceController.java:93) at hudson.model.Executor.run(Executor.java:119) Caused by: hudson.AbortException: Test reports were found but none of them are new. Did tests run? For example, \files\hudson\workspace\hudson\hudson\main\core\target\surefire-reports\TEST-hudson.BulkChangeTest.xml is 2 days 23 hr old at hudson.tasks.junit.TestResult.parse(TestResult.java:134) at hudson.tasks.junit.TestResult.<init>(TestResult.java:95) at hudson.tasks.junit.JUnitResultArchiver$1.invoke(JUnitResultArchiver.java:95) at hudson.tasks.junit.JUnitResultArchiver$1.invoke(JUnitResultArchiver.java:82) at hudson.FilePath$FileCallableWrapper.call(FilePath.java:1583) at hudson.remoting.UserRequest.perform(UserRequest.java:92) at hudson.remoting.UserRequest.perform(UserRequest.java:46) at hudson.remoting.Request$2.run(Request.java:236) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) ........ r17961 | kohsuke | 2009-05-11 15:16:39 -0700 (Mon, 11 May 2009) | 1 line adding Windows JDK silent installation ........ r17962 | kohsuke | 2009-05-11 16:08:13 -0700 (Mon, 11 May 2009) | 1 line Fixing JDK offline installatino for Windows ........ r17970 | kohsuke | 2009-05-11 19:37:59 -0700 (Mon, 11 May 2009) | 1 line Fixing a problem that prevents the usage of this tag in <repeatable> block, which reinserts the same fragment over and over. So statically assigning IDs won't work ........ r17971 | kohsuke | 2009-05-11 22:17:09 -0700 (Mon, 11 May 2009) | 1 line continuing to remove static ID generation, which breaks the tag when used inside <repetable> tag. ........ r17972 | kohsuke | 2009-05-11 22:19:11 -0700 (Mon, 11 May 2009) | 1 line I don't know when this started, but even in the hudson-dev:run mode, the versionis no longer '?', so we need a different way to force reload ........ r17973 | kohsuke | 2009-05-11 22:26:34 -0700 (Mon, 11 May 2009) | 1 line adjusted the text a bit since multiple "add" and "delete"s were rather confusing ........ r17974 | kohsuke | 2009-05-11 22:31:58 -0700 (Mon, 11 May 2009) | 1 line added help screen ........ r17975 | kohsuke | 2009-05-11 22:41:39 -0700 (Mon, 11 May 2009) | 1 line form validation now works against the checkbox, too ........ r17976 | kohsuke | 2009-05-11 22:43:00 -0700 (Mon, 11 May 2009) | 1 line with auto installation, we expect users to specify a directory that doesn't exist yet, so don't report it as an error ........ r17977 | kohsuke | 2009-05-11 22:43:24 -0700 (Mon, 11 May 2009) | 1 line improving the text ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@17985 71c3de6d-444a-0410-be80-ed276b4c234a
2009-05-12 21:59:10 +08:00
// this method may be called to render start up errors, at which point Hudson doesn't exist yet. see HUDSON-3608
if(Jenkins.getInstanceOrNull()==null) return Collections.emptyList();
return PageDecorator.all();
}
[JENKINS-50447] New design and slim down of login page (#3380) * [JENKINS-50447] New design and slim down of login page The change will provide a new designed login page that is using no external deps to prevent any possible malvious javascript. We still allow the user to use the legacy login page, which has not changed the behaviour. [JENKINS-50447] Implement error case and use final svg jenkins logo [JENKINS-50447] remove mock up logo [JENKINS-50447] Fix feet back from jlong [JENKINS-50447_squash] Use theme css which only contains values to be overriden. Drop ie js since with the theme css it is not needed anymore * [JENKINS-50447_squash] Fix expression to evaluate when to show an error and when to simply redirect * eslint - formating changes and fix offences * [JENKINS-50447_squash] Use system property to controll whether or not to use the legacy login * [JENKINS-50447_squash] prevent that the jsessionId appears in the url which should fix most tests * [JENKINS-50447_squash] Fix cli test by adding pageDecorators magic from layout.jelly * [JENKINS-50447_squash] remove pageDecorators because they assume existence of js that we do not have * [JENKINS-50447] New design and slim down of login page The change will provide a new designed login page that is using no external deps to prevent any possible malvious javascript. We still allow the user to use the legacy login page, which has not changed the behaviour. [JENKINS-50447] Implement error case and use final svg jenkins logo [JENKINS-50447] remove mock up logo [JENKINS-50447] Fix feet back from jlong [JENKINS-50447_squash] Use theme css which only contains values to be overriden. Drop ie js since with the theme css it is not needed anymore [JENKINS-50447_squash] Fix expression to evaluate when to show an error and when to simply redirect eslint - formating changes and fix offences [JENKINS-50447_squash] Use system property to controll whether or not to use the legacy login [JENKINS-50447_squash] prevent that the jsessionId appears in the url which should fix most tests [JENKINS-50447_squash] Fix cli test by adding pageDecorators magic from layout.jelly [JENKINS-50447_squash] remove pageDecorators because they assume existence of js that we do not have [JENKINS-50447_squash] make login page extensible with pagedecorators [JENKINS-50447_squash] drop legacy support * Make theme customisable by using a magic package for css and header. Limiting the implemetation of those to one. * [JENKINS-50447_squash] Creating a specific decorator for login which only returns one instance * [JENKINS-50447_squash] using rounded corner * JENKINS-50447 remove legacy code * [JENKINS-50447_squash] Fix comments from @amuniz about javadoc and uniqueness of css for login * [JENKINS-50447_squash] Fix click on label span to toggle the select of the checkbox * [JENKINS-50447_squash] fix comments from @daniel-beck * [JENKINS-50447_squash] Fix license headers * [JENKINS-50447_squash] Implement loading/restarting and signup with same design * [JENKINS-50447_squash] Implement the loading/restarting view and signup with same design as the login page * [JENKINS-50447_squash] Remove limitation that only one validation error can be shown at a time * [JENKINS-50447_squash] implement password strength checker * [JENKINS-50447_squash] Fix different comments from @daniel-beck regarding titles. Further enhanced spacing of label and input * [JENKINS-50447_squash] Fix restart screen css. Fix comments regarding signup page. * [JENKINS-50447_squash] fix tabindex flow * harmonize design - of checkboxes using jdl styles. - distance of headers * [JENKINS-50447] Fix comments from @daniel-beck - fix some accessibility issues -- html has now a lang tag -- define main region - fix missplaced } - fix when server down for real that we still show the loading page * [JENKINS-50447_squash] should never ended up here
2018-06-18 00:02:37 +08:00
/**
* Gets only one {@link SimplePageDecorator}.
2018-08-13 19:16:34 +08:00
* @since 2.128
[JENKINS-50447] New design and slim down of login page (#3380) * [JENKINS-50447] New design and slim down of login page The change will provide a new designed login page that is using no external deps to prevent any possible malvious javascript. We still allow the user to use the legacy login page, which has not changed the behaviour. [JENKINS-50447] Implement error case and use final svg jenkins logo [JENKINS-50447] remove mock up logo [JENKINS-50447] Fix feet back from jlong [JENKINS-50447_squash] Use theme css which only contains values to be overriden. Drop ie js since with the theme css it is not needed anymore * [JENKINS-50447_squash] Fix expression to evaluate when to show an error and when to simply redirect * eslint - formating changes and fix offences * [JENKINS-50447_squash] Use system property to controll whether or not to use the legacy login * [JENKINS-50447_squash] prevent that the jsessionId appears in the url which should fix most tests * [JENKINS-50447_squash] Fix cli test by adding pageDecorators magic from layout.jelly * [JENKINS-50447_squash] remove pageDecorators because they assume existence of js that we do not have * [JENKINS-50447] New design and slim down of login page The change will provide a new designed login page that is using no external deps to prevent any possible malvious javascript. We still allow the user to use the legacy login page, which has not changed the behaviour. [JENKINS-50447] Implement error case and use final svg jenkins logo [JENKINS-50447] remove mock up logo [JENKINS-50447] Fix feet back from jlong [JENKINS-50447_squash] Use theme css which only contains values to be overriden. Drop ie js since with the theme css it is not needed anymore [JENKINS-50447_squash] Fix expression to evaluate when to show an error and when to simply redirect eslint - formating changes and fix offences [JENKINS-50447_squash] Use system property to controll whether or not to use the legacy login [JENKINS-50447_squash] prevent that the jsessionId appears in the url which should fix most tests [JENKINS-50447_squash] Fix cli test by adding pageDecorators magic from layout.jelly [JENKINS-50447_squash] remove pageDecorators because they assume existence of js that we do not have [JENKINS-50447_squash] make login page extensible with pagedecorators [JENKINS-50447_squash] drop legacy support * Make theme customisable by using a magic package for css and header. Limiting the implemetation of those to one. * [JENKINS-50447_squash] Creating a specific decorator for login which only returns one instance * [JENKINS-50447_squash] using rounded corner * JENKINS-50447 remove legacy code * [JENKINS-50447_squash] Fix comments from @amuniz about javadoc and uniqueness of css for login * [JENKINS-50447_squash] Fix click on label span to toggle the select of the checkbox * [JENKINS-50447_squash] fix comments from @daniel-beck * [JENKINS-50447_squash] Fix license headers * [JENKINS-50447_squash] Implement loading/restarting and signup with same design * [JENKINS-50447_squash] Implement the loading/restarting view and signup with same design as the login page * [JENKINS-50447_squash] Remove limitation that only one validation error can be shown at a time * [JENKINS-50447_squash] implement password strength checker * [JENKINS-50447_squash] Fix different comments from @daniel-beck regarding titles. Further enhanced spacing of label and input * [JENKINS-50447_squash] Fix restart screen css. Fix comments regarding signup page. * [JENKINS-50447_squash] fix tabindex flow * harmonize design - of checkboxes using jdl styles. - distance of headers * [JENKINS-50447] Fix comments from @daniel-beck - fix some accessibility issues -- html has now a lang tag -- define main region - fix missplaced } - fix when server down for real that we still show the loading page * [JENKINS-50447_squash] should never ended up here
2018-06-18 00:02:37 +08:00
*/
public static SimplePageDecorator getSimplePageDecorator() {
return SimplePageDecorator.first();
}
public static List<SimplePageDecorator> getSimplePageDecorators() {
return SimplePageDecorator.all();
}
public static List<Descriptor<Cloud>> getCloudDescriptors() {
return Cloud.all();
Merged revisions 11754-11755,11763-11766,11770,11773-11777,11791-11797,11828-11829,11831-11839,11841-11843,11850,11854,11994,12774,12778-12793,12820-12822,12831-12841,12854-12855,12860-12882,12896-12905,12914-12920,12938-12941,12950,13045-13046,13048,13063-13064,13066,13072-13076,13111,13122-13147,13150,13153-13158,13487-13488,13851-13852,13854-13856,13859,13866-13867,13869,13872-13876,13878-13879,13883-13885,13887-13890,13896-13919 via svnmerge from https://www.dev.java.net/svn/hudson/branches/multiple-computer-per-node ................ r11754 | kohsuke | 2008-08-25 17:59:14 -0700 (Mon, 25 Aug 2008) | 3 lines Adding EphemeralNode for non-persisted dynamically-allocated expandable/shrinkable slave pool. Tweaked the serialization of Hudson.slaves accordingly. ................ r11755 | kohsuke | 2008-08-25 18:10:42 -0700 (Mon, 25 Aug 2008) | 1 line making a small improvements ................ r11763 | kohsuke | 2008-08-26 13:57:25 -0700 (Tue, 26 Aug 2008) | 1 line adding more convenience methods ................ r11764 | kohsuke | 2008-08-26 14:24:20 -0700 (Tue, 26 Aug 2008) | 1 line ported mask capability from the TFS plugin to the core. ................ r11765 | kohsuke | 2008-08-26 14:26:25 -0700 (Tue, 26 Aug 2008) | 1 line making it non-final to allow for subclassing ................ r11766 | kohsuke | 2008-08-26 14:35:20 -0700 (Tue, 26 Aug 2008) | 1 line test case for NodeList ................ r11770 | kohsuke | 2008-08-26 15:15:21 -0700 (Tue, 26 Aug 2008) | 3 lines Wrote a simple tool that monitors a file system change (in a poor way) and triggers a build. ................ r11773 | kohsuke | 2008-08-26 17:20:30 -0700 (Tue, 26 Aug 2008) | 1 line made more structured ................ r11774 | kohsuke | 2008-08-26 17:47:41 -0700 (Tue, 26 Aug 2008) | 1 line indentation fix ................ r11775 | kohsuke | 2008-08-26 17:48:22 -0700 (Tue, 26 Aug 2008) | 1 line remove the use of a deprecated feature. ................ r11776 | kohsuke | 2008-08-26 17:51:54 -0700 (Tue, 26 Aug 2008) | 1 line renamed to 'ALL' to be consistent with recent use of DescriptorList ................ r11777 | kohsuke | 2008-08-26 18:04:17 -0700 (Tue, 26 Aug 2008) | 1 line adding NodeFactory list and its configuration mechanism ................ r11791 | kohsuke | 2008-08-27 09:43:38 -0700 (Wed, 27 Aug 2008) | 1 line picked up the latest jelly with Iterable support in <j:forEach> ................ r11792 | kohsuke | 2008-08-27 09:44:08 -0700 (Wed, 27 Aug 2008) | 1 line Iterable support added in commons-jelly 1.1-hudson-20080826 ................ r11793 | kohsuke | 2008-08-27 10:15:14 -0700 (Wed, 27 Aug 2008) | 2 lines - added name to NodeFactory for binding NodeFactory to URL tree. - NodeFactory should be access controlled ................ r11794 | kohsuke | 2008-08-27 10:41:11 -0700 (Wed, 27 Aug 2008) | 1 line added a method to add one Node at a time ................ r11795 | kohsuke | 2008-08-27 10:41:37 -0700 (Wed, 27 Aug 2008) | 1 line added permission constatnt ................ r11796 | kohsuke | 2008-08-27 10:42:13 -0700 (Wed, 27 Aug 2008) | 1 line allowing the launch method to throw an exception. ................ r11797 | kohsuke | 2008-08-27 10:44:13 -0700 (Wed, 27 Aug 2008) | 1 line improving the handling ................ r11828 | kohsuke | 2008-08-29 11:07:16 -0700 (Fri, 29 Aug 2008) | 1 line added executor config to the sidebar. ................ r11829 | kohsuke | 2008-08-29 11:16:11 -0700 (Fri, 29 Aug 2008) | 1 line "it" should be assigned to NodeFactory ................ r11831 | kohsuke | 2008-08-29 11:44:41 -0700 (Fri, 29 Aug 2008) | 1 line formatting changes ................ r11832 | kohsuke | 2008-08-29 11:59:21 -0700 (Fri, 29 Aug 2008) | 1 line added a script to create a flashing image from any picture ................ r11833 | kohsuke | 2008-08-29 12:07:56 -0700 (Fri, 29 Aug 2008) | 1 line doc improvement. ................ r11834 | kohsuke | 2008-08-29 13:37:59 -0700 (Fri, 29 Aug 2008) | 1 line added new images to indicate that a slave is launching ................ r11835 | kohsuke | 2008-08-29 13:43:41 -0700 (Fri, 29 Aug 2008) | 1 line indicate a launching slave accordingly. ................ r11836 | kohsuke | 2008-08-29 14:02:28 -0700 (Fri, 29 Aug 2008) | 1 line added a method to remove a Node. ................ r11837 | kohsuke | 2008-08-29 14:02:38 -0700 (Fri, 29 Aug 2008) | 1 line disconnect ................ r11838 | kohsuke | 2008-08-29 14:03:22 -0700 (Fri, 29 Aug 2008) | 1 line formatting changes ................ r11839 | kohsuke | 2008-08-29 14:14:04 -0700 (Fri, 29 Aug 2008) | 1 line allowing subclasses. ................ r11841 | kohsuke | 2008-08-29 14:28:29 -0700 (Fri, 29 Aug 2008) | 1 line constructor should be the first in the definition. ................ r11842 | kohsuke | 2008-08-29 14:31:01 -0700 (Fri, 29 Aug 2008) | 1 line doc improvement. ................ r11843 | kohsuke | 2008-08-29 14:32:48 -0700 (Fri, 29 Aug 2008) | 1 line fixed a problem of using partially constructed object during launch(), because the setNode() method is called from the Computer constructor. ................ r11850 | kohsuke | 2008-08-29 14:50:36 -0700 (Fri, 29 Aug 2008) | 1 line serialize NodeFactory first so that references to them from NodeList will become references in XML. ................ r11854 | kohsuke | 2008-08-29 14:56:56 -0700 (Fri, 29 Aug 2008) | 1 line cleaning up a bit. ................ r11994 | kohsuke | 2008-09-03 14:42:11 -0700 (Wed, 03 Sep 2008) | 21 lines Fixed ArrayIndexOutOfBoundsException during replace(), when the title contains a '$' literal. The typical stack trace looks like: Caused by: java.lang.ArrayIndexOutOfBoundsException: 32 at hudson.MarkupText$SubText.start(MarkupText.java:95) at hudson.MarkupText$SubText.group(MarkupText.java:131) at hudson.MarkupText$SubText.replace(MarkupText.java:154) at hudson.MarkupText$SubText.surroundWith(MarkupText.java:83) at hudson.plugins.jira.JiraChangeLogAnnotator.annotate(JiraChangeLogAnnotator.java:37) at hudson.scm.ChangeLogSet$Entry.getMsgAnnotated(ChangeLogSet.java:117) ... 148 more Vijayan Jayaraman and I found this problem while we were looking at the server log of Hudson for OpenJFX. Adding a unit test to verify this behavior, too. ................ r12774 | kohsuke | 2008-10-27 15:03:36 -0700 (Mon, 27 Oct 2008) | 3 lines preparing for heterogenousness in Node, so that different Node can be configured with different UIs, much like how different Jobs can be configured. Creating a slave works also like creating a new job. ................ r12778 | kohsuke | 2008-10-27 15:06:51 -0700 (Mon, 27 Oct 2008) | 1 line We need to be able to create an emtpy Slave initially, so we have to do with the check in the form field validation. ................ r12779 | kohsuke | 2008-10-27 15:48:04 -0700 (Mon, 27 Oct 2008) | 1 line making the new slave page a two-step process ................ r12780 | kohsuke | 2008-10-27 15:48:24 -0700 (Mon, 27 Oct 2008) | 1 line fixed a compilation problem ................ r12781 | kohsuke | 2008-10-27 15:53:30 -0700 (Mon, 27 Oct 2008) | 1 line bug fixes ................ r12782 | kohsuke | 2008-10-27 15:58:20 -0700 (Mon, 27 Oct 2008) | 1 line bug fixes ................ r12783 | kohsuke | 2008-10-27 16:08:56 -0700 (Mon, 27 Oct 2008) | 1 line making the configuration page work for slaves ................ r12784 | kohsuke | 2008-10-27 16:35:17 -0700 (Mon, 27 Oct 2008) | 1 line added new-computer.svg ................ r12785 | kohsuke | 2008-10-27 16:37:26 -0700 (Mon, 27 Oct 2008) | 1 line hooking up the config/create pages to the UI ................ r12786 | kohsuke | 2008-10-27 16:44:40 -0700 (Mon, 27 Oct 2008) | 1 line fixed a copy method. ................ r12787 | kohsuke | 2008-10-27 16:47:33 -0700 (Mon, 27 Oct 2008) | 1 line code was broken when a slave was renamed ................ r12788 | kohsuke | 2008-10-27 16:58:04 -0700 (Mon, 27 Oct 2008) | 1 line moving out the commonality into a new tag ................ r12789 | kohsuke | 2008-10-27 17:01:21 -0700 (Mon, 27 Oct 2008) | 1 line consistent term usage ................ r12790 | kohsuke | 2008-10-27 17:03:19 -0700 (Mon, 27 Oct 2008) | 1 line retiring the configureExecutors. Slave configuration is now moved to individual slave page ................ r12791 | kohsuke | 2008-10-27 17:10:32 -0700 (Mon, 27 Oct 2008) | 1 line retired configureExecutors.jelly and completed moved its contents to somewhere else ................ r12792 | kohsuke | 2008-10-27 17:21:53 -0700 (Mon, 27 Oct 2008) | 1 line bug fix. request handling of "/descriptor/FQCN/..." was broken. ................ r12793 | kohsuke | 2008-10-27 17:27:08 -0700 (Mon, 27 Oct 2008) | 1 line NodeFactory -> Cloud to encourage consistent term usage between the code and the UI. ................ r12820 | kohsuke | 2008-10-29 10:58:20 -0700 (Wed, 29 Oct 2008) | 1 line formatting fix ................ r12821 | kohsuke | 2008-10-29 11:17:49 -0700 (Wed, 29 Oct 2008) | 1 line added classes for handling a secret and prevent accidental exposure of a secret in the persisted form ................ r12822 | kohsuke | 2008-10-29 11:32:39 -0700 (Wed, 29 Oct 2008) | 1 line added a base64 validator ................ r12831 | kohsuke | 2008-10-29 15:58:45 -0700 (Wed, 29 Oct 2008) | 1 line secret key needs to be persisted outside config.xml (and it is, already!) ................ r12832 | kohsuke | 2008-10-29 16:06:28 -0700 (Wed, 29 Oct 2008) | 1 line started working on Amazon EC2 plugin ................ r12833 | kohsuke | 2008-10-29 16:09:20 -0700 (Wed, 29 Oct 2008) | 1 line brought the same enhancement as in <textbox /> ................ r12834 | kohsuke | 2008-10-29 16:15:05 -0700 (Wed, 29 Oct 2008) | 1 line copy over the onclick handler from the original button element ................ r12835 | kohsuke | 2008-10-29 17:01:04 -0700 (Wed, 29 Oct 2008) | 1 line allow OK messages to be sent with some mark up. ................ r12836 | kohsuke | 2008-10-29 17:06:52 -0700 (Wed, 29 Oct 2008) | 1 line added connection testing. This pattern needs to be generalized since it happens often ................ r12837 | kohsuke | 2008-10-29 17:13:11 -0700 (Wed, 29 Oct 2008) | 1 line this is little better ................ r12838 | kohsuke | 2008-10-29 17:17:44 -0700 (Wed, 29 Oct 2008) | 1 line added spinner ................ r12839 | kohsuke | 2008-10-29 17:31:54 -0700 (Wed, 29 Oct 2008) | 1 line restructuring the validation button support in a form that can be readily moved to the core. ................ r12840 | kohsuke | 2008-10-29 18:01:41 -0700 (Wed, 29 Oct 2008) | 1 line added <f:validateButton/> for multi-field server-side validation ................ r12841 | kohsuke | 2008-10-29 18:03:12 -0700 (Wed, 29 Oct 2008) | 1 line logic moved to <f:validateButton/> in the core. ................ r12854 | kohsuke | 2008-10-30 13:32:58 -0700 (Thu, 30 Oct 2008) | 1 line @QueryParameter.value won't be necessary any more ................ r12855 | kohsuke | 2008-10-30 13:42:58 -0700 (Thu, 30 Oct 2008) | 1 line need a strongly-typed constructor. ................ r12860 | kohsuke | 2008-10-30 15:24:18 -0700 (Thu, 30 Oct 2008) | 1 line adding more reflection support, which in turn we use in taglibs to raise the level of abstraction. ................ r12861 | kohsuke | 2008-10-30 15:33:22 -0700 (Thu, 30 Oct 2008) | 1 line added a tag to create databinding to a<select> element from an enum property ................ r12862 | kohsuke | 2008-10-30 15:37:44 -0700 (Thu, 30 Oct 2008) | 1 line adding a smarter bi-directional binding through <f:repeatable field="..."/> ................ r12863 | kohsuke | 2008-10-30 15:47:48 -0700 (Thu, 30 Oct 2008) | 1 line making progress with the EC2 support ................ r12864 | kohsuke | 2008-10-30 16:12:34 -0700 (Thu, 30 Oct 2008) | 1 line added form field validation for AMI ID ................ r12865 | kohsuke | 2008-10-30 16:15:44 -0700 (Thu, 30 Oct 2008) | 1 line added simpler version ................ r12866 | kohsuke | 2008-10-30 16:17:15 -0700 (Thu, 30 Oct 2008) | 1 line doc improvement ................ r12867 | kohsuke | 2008-10-30 16:17:19 -0700 (Thu, 30 Oct 2008) | 1 line simplified a bit ................ r12868 | kohsuke | 2008-10-30 16:40:25 -0700 (Thu, 30 Oct 2008) | 1 line doc improvement ................ r12869 | kohsuke | 2008-10-30 17:00:57 -0700 (Thu, 30 Oct 2008) | 1 line adding the provisioning of the new slave ................ r12870 | kohsuke | 2008-10-30 17:07:27 -0700 (Thu, 30 Oct 2008) | 1 line /** {@inheritDoc} */ is the default behavior for javadoc, so there's no point in making that explicit. ................ r12871 | kohsuke | 2008-10-30 17:11:04 -0700 (Thu, 30 Oct 2008) | 1 line doc bug fix ................ r12872 | kohsuke | 2008-10-30 17:17:20 -0700 (Thu, 30 Oct 2008) | 1 line simplified a bit ................ r12873 | kohsuke | 2008-10-30 17:19:06 -0700 (Thu, 30 Oct 2008) | 1 line added RetentionStrategy for EC2 instances ................ r12874 | kohsuke | 2008-10-30 17:21:17 -0700 (Thu, 30 Oct 2008) | 1 line allowing subclasses to override the disconnect behavior. ................ r12875 | kohsuke | 2008-10-30 18:02:35 -0700 (Thu, 30 Oct 2008) | 1 line added termination ................ r12876 | kohsuke | 2008-10-30 18:05:30 -0700 (Thu, 30 Oct 2008) | 1 line forgot to rename when NodeFactory was renamed to Cloud ................ r12877 | kohsuke | 2008-10-30 18:06:08 -0700 (Thu, 30 Oct 2008) | 1 line using the console icon ................ r12878 | kohsuke | 2008-10-30 18:17:20 -0700 (Thu, 30 Oct 2008) | 1 line adding UI to remove a slave. ................ r12879 | kohsuke | 2008-10-30 18:48:57 -0700 (Thu, 30 Oct 2008) | 1 line commons-discovery now needed in stapler ................ r12880 | kohsuke | 2008-10-30 18:50:27 -0700 (Thu, 30 Oct 2008) | 1 line needs to use a newer version of stapler ................ r12881 | kohsuke | 2008-10-30 18:51:02 -0700 (Thu, 30 Oct 2008) | 1 line Bye bye CVS ................ r12882 | kohsuke | 2008-10-30 18:51:43 -0700 (Thu, 30 Oct 2008) | 1 line Bye bye CVS ................ r12896 | kohsuke | 2008-10-31 14:52:07 -0700 (Fri, 31 Oct 2008) | 1 line fixed the ordering between field and the mighty get(String) method. ................ r12897 | kohsuke | 2008-10-31 15:08:41 -0700 (Fri, 31 Oct 2008) | 1 line fixed test compilation problems ................ r12898 | kohsuke | 2008-10-31 15:11:25 -0700 (Fri, 31 Oct 2008) | 1 line marking this as a model object since it's always bound to URL. ................ r12899 | kohsuke | 2008-10-31 15:13:42 -0700 (Fri, 31 Oct 2008) | 1 line adding UI hook up to manually provision a new node ................ r12900 | kohsuke | 2008-10-31 15:14:00 -0700 (Fri, 31 Oct 2008) | 1 line after merging the trunk the version number is different ................ r12901 | kohsuke | 2008-10-31 15:21:54 -0700 (Fri, 31 Oct 2008) | 1 line adding UI hook up for provisioning a new slave ................ r12902 | kohsuke | 2008-10-31 15:45:10 -0700 (Fri, 31 Oct 2008) | 1 line adding a hook to decorate ComputerLauncher. ................ r12903 | kohsuke | 2008-10-31 15:48:21 -0700 (Fri, 31 Oct 2008) | 1 line added filtering support ................ r12904 | kohsuke | 2008-10-31 15:52:45 -0700 (Fri, 31 Oct 2008) | 1 line added view ................ r12905 | kohsuke | 2008-10-31 15:53:49 -0700 (Fri, 31 Oct 2008) | 1 line doc improvement ................ r12914 | kohsuke | 2008-11-01 17:45:57 -0700 (Sat, 01 Nov 2008) | 1 line adding code for connecting with SSH ................ r12915 | kohsuke | 2008-11-01 17:49:28 -0700 (Sat, 01 Nov 2008) | 1 line working on launchers ................ r12916 | kohsuke | 2008-11-01 18:33:12 -0700 (Sat, 01 Nov 2008) | 1 line added a method to fully read a stream ................ r12917 | kohsuke | 2008-11-01 18:33:45 -0700 (Sat, 01 Nov 2008) | 1 line bumped up stapler ................ r12918 | kohsuke | 2008-11-01 18:39:41 -0700 (Sat, 01 Nov 2008) | 1 line doc improvement. ................ r12919 | kohsuke | 2008-11-01 18:45:24 -0700 (Sat, 01 Nov 2008) | 1 line added a launcher ................ r12920 | kohsuke | 2008-11-01 18:55:02 -0700 (Sat, 01 Nov 2008) | 1 line implementing the actual ComputerLauncher ................ r12938 | kohsuke | 2008-11-02 08:56:05 -0800 (Sun, 02 Nov 2008) | 1 line support the field notation ................ r12939 | kohsuke | 2008-11-02 09:20:21 -0800 (Sun, 02 Nov 2008) | 1 line added the mechanism to execute the init script ................ r12940 | kohsuke | 2008-11-02 09:21:38 -0800 (Sun, 02 Nov 2008) | 1 line simplification ................ r12941 | kohsuke | 2008-11-02 09:36:21 -0800 (Sun, 02 Nov 2008) | 1 line adding key handling ................ r12950 | kohsuke | 2008-11-03 11:00:58 -0800 (Mon, 03 Nov 2008) | 1 line formatting changes ................ r13045 | kohsuke | 2008-11-06 15:24:32 -0800 (Thu, 06 Nov 2008) | 1 line adding time series datatype for retaining load average statistics in memory ................ r13046 | kohsuke | 2008-11-06 15:59:02 -0800 (Thu, 06 Nov 2008) | 1 line added a convenience method. ................ r13048 | kohsuke | 2008-11-06 16:21:54 -0800 (Thu, 06 Nov 2008) | 2 lines - started monitoring # of executor statistics. - exposed label to the remote API ................ r13063 | kohsuke | 2008-11-07 13:05:15 -0800 (Fri, 07 Nov 2008) | 1 line added a convenience method. ................ r13064 | kohsuke | 2008-11-07 13:11:08 -0800 (Fri, 07 Nov 2008) | 1 line monitor the length of the queue too ................ r13066 | kohsuke | 2008-11-07 14:15:56 -0800 (Fri, 07 Nov 2008) | 1 line moved the stats to its own class. ................ r13072 | kohsuke | 2008-11-07 15:40:29 -0800 (Fri, 07 Nov 2008) | 1 line adding provisioning logic based on load statistics ................ r13073 | kohsuke | 2008-11-07 15:46:00 -0800 (Fri, 07 Nov 2008) | 1 line for effective testing, we need sub-sec precision ................ r13074 | kohsuke | 2008-11-07 16:24:44 -0800 (Fri, 07 Nov 2008) | 1 line fixed a lie. ................ r13075 | kohsuke | 2008-11-07 16:25:12 -0800 (Fri, 07 Nov 2008) | 1 line bug fix ................ r13076 | kohsuke | 2008-11-07 16:30:55 -0800 (Fri, 07 Nov 2008) | 1 line avoid using deprecated methods ................ r13111 | kohsuke | 2008-11-09 11:54:23 -0800 (Sun, 09 Nov 2008) | 1 line added the Future<?> return parameter to Computer.launch(). To do this w/o breaking compatibility, renamed launch to connect. ................ r13122 | kohsuke | 2008-11-10 14:38:03 -0800 (Mon, 10 Nov 2008) | 1 line allow programmatic update of the assigned label ................ r13123 | kohsuke | 2008-11-10 14:38:40 -0800 (Mon, 10 Nov 2008) | 1 line Iterator not needed because CopyOnWriteArrayList doesn't support removal via iterator. ................ r13124 | kohsuke | 2008-11-10 14:39:24 -0800 (Mon, 10 Nov 2008) | 1 line added another Builder for tests ................ r13125 | kohsuke | 2008-11-10 14:39:48 -0800 (Mon, 10 Nov 2008) | 1 line simplified a bit. This TestEnvironment stuff needs some clearer story. ................ r13126 | kohsuke | 2008-11-10 14:46:40 -0800 (Mon, 10 Nov 2008) | 1 line IDEA complains about this. ................ r13127 | kohsuke | 2008-11-10 14:51:53 -0800 (Mon, 10 Nov 2008) | 1 line improved the error diagnostics by displaying why a provisioned node failed to launch ................ r13128 | kohsuke | 2008-11-10 14:52:12 -0800 (Mon, 10 Nov 2008) | 1 line Started a test case for NodeProvisioner ................ r13129 | kohsuke | 2008-11-10 14:52:27 -0800 (Mon, 10 Nov 2008) | 1 line formatting changes ................ r13130 | kohsuke | 2008-11-10 15:16:02 -0800 (Mon, 10 Nov 2008) | 1 line report the failure as a failure. ................ r13131 | kohsuke | 2008-11-10 16:34:23 -0800 (Mon, 10 Nov 2008) | 1 line adding a parameter to the connect method to support joining to the pending launch activity. ................ r13132 | kohsuke | 2008-11-10 16:38:31 -0800 (Mon, 10 Nov 2008) | 1 line making members public so that it can be accessed from other classes (DummyCloudImpl was the first to do this) ................ r13133 | kohsuke | 2008-11-10 16:38:58 -0800 (Mon, 10 Nov 2008) | 1 line split the cloud implementation to a separate class to allow reuse. ................ r13134 | kohsuke | 2008-11-10 16:56:27 -0800 (Mon, 10 Nov 2008) | 1 line assign unique names to support multiple jobs ................ r13135 | kohsuke | 2008-11-10 17:11:31 -0800 (Mon, 10 Nov 2008) | 1 line avoid unnecessary interruption ................ r13136 | kohsuke | 2008-11-10 17:11:41 -0800 (Mon, 10 Nov 2008) | 1 line adding another test case ................ r13137 | kohsuke | 2008-11-10 17:16:28 -0800 (Mon, 10 Nov 2008) | 1 line cleaned up a test case ................ r13138 | kohsuke | 2008-11-10 17:36:52 -0800 (Mon, 10 Nov 2008) | 1 line since the setNode method is called on every Computer just by adding a new node, don't force a new launch attempt. ................ r13139 | kohsuke | 2008-11-10 17:37:38 -0800 (Mon, 10 Nov 2008) | 1 line perform orderly shutdown by giving computers enough time to disconnect. ................ r13140 | kohsuke | 2008-11-10 17:38:08 -0800 (Mon, 10 Nov 2008) | 3 lines return Future for synchronization. This breaks binary compatibility, but I checked none of the plugins in Hudson SVN uses this, so I hope this is OK. ................ r13141 | kohsuke | 2008-11-10 17:38:46 -0800 (Mon, 10 Nov 2008) | 1 line improved diagnostics ................ r13142 | kohsuke | 2008-11-10 17:39:55 -0800 (Mon, 10 Nov 2008) | 1 line removed compiler warning ................ r13143 | kohsuke | 2008-11-10 18:02:56 -0800 (Mon, 10 Nov 2008) | 1 line hide the rounding related problem from Cloud by passing int instead of float. ................ r13144 | kohsuke | 2008-11-10 18:10:10 -0800 (Mon, 10 Nov 2008) | 1 line bug fix ................ r13145 | kohsuke | 2008-11-10 18:11:51 -0800 (Mon, 10 Nov 2008) | 1 line formatting changes ................ r13146 | kohsuke | 2008-11-10 18:15:08 -0800 (Mon, 10 Nov 2008) | 1 line moved the slave launch code to HudsonTestCase for reuse ................ r13147 | kohsuke | 2008-11-10 18:20:19 -0800 (Mon, 10 Nov 2008) | 1 line adding another test case ................ r13150 | kohsuke | 2008-11-11 07:28:53 -0800 (Tue, 11 Nov 2008) | 1 line bug fix ................ r13153 | kohsuke | 2008-11-11 14:04:21 -0800 (Tue, 11 Nov 2008) | 1 line cutting down the test size to 5 to increase the test speed ................ r13154 | kohsuke | 2008-11-11 14:04:37 -0800 (Tue, 11 Nov 2008) | 1 line improved debuggability ................ r13155 | kohsuke | 2008-11-11 14:10:04 -0800 (Tue, 11 Nov 2008) | 1 line added another convenience method ................ r13156 | kohsuke | 2008-11-11 14:10:21 -0800 (Tue, 11 Nov 2008) | 1 line further reduce the test turn around time ................ r13157 | kohsuke | 2008-11-11 14:22:03 -0800 (Tue, 11 Nov 2008) | 1 line doc improvement and clean up ................ r13158 | kohsuke | 2008-11-11 14:22:28 -0800 (Tue, 11 Nov 2008) | 1 line added a new metho ................ r13487 | kohsuke | 2008-12-09 17:17:30 -0800 (Tue, 09 Dec 2008) | 1 line SlaveTemplate needs to be able to computer # of executors. ................ r13488 | kohsuke | 2008-12-09 17:18:05 -0800 (Tue, 09 Dec 2008) | 1 line fixed a compilation problem with the latest head of the branch ................ r13851 | kohsuke | 2008-12-24 13:40:43 -0800 (Wed, 24 Dec 2008) | 82 lines fixed a dead lock reported by Jesse. Found one Java-level deadlock: ============================= "Executor #0 for master": waiting to lock monitor 0x09409bac (object 0x87474ca0, a hudson.util.CopyOnWriteMap$Hash), which is held by "main" "main": waiting to lock monitor 0x09409b48 (object 0x87474d48, a hudson.model.Hudson$MasterComputer), which is held by "Executor #0 for master" Java stack information for the threads listed above: =================================================== "Executor #0 for master": at hudson.util.CopyOnWriteMap.remove(CopyOnWriteMap.java:78) - waiting to lock <0x87474ca0> (a hudson.util.CopyOnWriteMap$Hash) at hudson.model.Hudson.removeComputer(Hudson.java:717) at hudson.model.Computer.removeExecutor(Computer.java:433) - locked <0x87474d48> (a hudson.model.Hudson$MasterComputer) at hudson.model.Executor.run(Executor.java:65) - locked <0x87474d48> (a hudson.model.Hudson$MasterComputer) "main": at hudson.model.Computer.setNumExecutors(Computer.java:338) - waiting to lock <0x87474d48> (a hudson.model.Hudson$MasterComputer) at hudson.model.Computer.setNode(Computer.java:327) at hudson.model.Hudson.updateComputer(Hudson.java:704) at hudson.model.Hudson.updateComputerList(Hudson.java:685) - locked <0x87474ca0> (a hudson.util.CopyOnWriteMap$Hash) at hudson.model.Hudson.setNodes(Hudson.java:1076) at hudson.model.Hudson.addNode(Hudson.java:1060) - locked <0x87474cb0> (a hudson.model.Hudson) at org.jvnet.hudson.test.HudsonTestCase.createSlave(HudsonTestCase.java:247) at hudson.slaves.NodeProvisionerTest.testBaselineSlaveUsage(NodeProvisionerTest.java:86) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at junit.framework.TestCase.runTest(TestCase.java:154) at org.jvnet.hudson.test.HudsonTestCase.runTest(HudsonTestCase.java:151) at junit.framework.TestCase.runBare(TestCase.java:127) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at junit.framework.TestSuite.runTest(TestSuite.java:208) at junit.framework.TestSuite.run(TestSuite.java:203) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.maven.surefire.junit.JUnitTestSet.execute(JUnitTestSet.java:213) at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140) at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127) at org.apache.maven.surefire.Surefire.run(Surefire.java:177) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345) at org.apache.maven.surefire.booter.SurefireBooter.run(SurefireBooter.java:241) at org.apache.maven.plugin.surefire.SurefirePlugin.execute(SurefirePlugin.java:537) at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:447) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:539) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:480) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:459) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:311) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:278) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:143) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:333) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:126) at org.apache.maven.cli.MavenCli.main(MavenCli.java:282) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315) at org.codehaus.classworlds.Launcher.launch(Launcher.java:255) at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430) at org.codehaus.classworlds.Launcher.main(Launcher.java:375) Found 1 deadlock. ................ r13852 | kohsuke | 2008-12-24 14:32:29 -0800 (Wed, 24 Dec 2008) | 1 line bug fix in the test case. ................ r13854 | kohsuke | 2008-12-24 15:20:22 -0800 (Wed, 24 Dec 2008) | 2 lines Using a new version of Rhino to get a proper exception chaining. ................ r13855 | kohsuke | 2008-12-24 15:22:13 -0800 (Wed, 24 Dec 2008) | 1 line typo ................ r13856 | kohsuke | 2008-12-24 15:37:56 -0800 (Wed, 24 Dec 2008) | 1 line CR shouldn't be in the repository ................ r13859 | kohsuke | 2008-12-24 15:50:32 -0800 (Wed, 24 Dec 2008) | 3 lines Fixed svn:eol-style. ................ r13866 | kohsuke | 2008-12-24 21:26:43 -0800 (Wed, 24 Dec 2008) | 3 lines Copying rev.13860 to retry a merge that now looks suspicious. ................ r13869 | kohsuke | 2008-12-24 22:03:46 -0800 (Wed, 24 Dec 2008) | 2 lines The 2nd merge was successful, so adopting the successful merge as the multiple-computer-per-node branch. ................ r13872 | kohsuke | 2008-12-25 07:28:37 -0800 (Thu, 25 Dec 2008) | 1 line fixed a test failure ................ r13873 | kohsuke | 2008-12-25 08:16:49 -0800 (Thu, 25 Dec 2008) | 1 line expanded NodeProvisioner to work on per-label basis ................ r13874 | kohsuke | 2008-12-25 08:27:32 -0800 (Thu, 25 Dec 2008) | 1 line bug fix ................ r13875 | kohsuke | 2008-12-25 08:33:17 -0800 (Thu, 25 Dec 2008) | 1 line bug fix ................ r13876 | kohsuke | 2008-12-25 08:45:03 -0800 (Thu, 25 Dec 2008) | 3 lines [HUDSON-2605] Strangely, I discovered that on some File, which is new File("./target/hudson-for-test"), file.exists()==false but file.getAbsoluteFile().exists()==true. It looks like this happens when $PWD of the process at the OS level is different from System.getProperty("user.dir") ................ r13878 | kohsuke | 2008-12-25 15:52:45 -0800 (Thu, 25 Dec 2008) | 1 line added a marker file ................ r13879 | kohsuke | 2008-12-25 15:53:13 -0800 (Thu, 25 Dec 2008) | 1 line use marker file to find the hudson main workspace. ................ r13883 | kohsuke | 2008-12-26 07:50:44 -0800 (Fri, 26 Dec 2008) | 1 line avoid using a deprecated method. ................ r13884 | kohsuke | 2008-12-26 07:50:59 -0800 (Fri, 26 Dec 2008) | 1 line adding more probes ................ r13885 | kohsuke | 2008-12-26 08:15:42 -0800 (Fri, 26 Dec 2008) | 1 line for analyzing test failures, capturing the output is crucial. ................ r13887 | kohsuke | 2008-12-26 11:25:12 -0800 (Fri, 26 Dec 2008) | 1 line allow sub-types to intercept mutation ................ r13888 | kohsuke | 2008-12-26 11:26:01 -0800 (Fri, 26 Dec 2008) | 1 line clouds need to be taken into account before marking a label as pointless. ................ r13889 | kohsuke | 2008-12-26 11:26:40 -0800 (Fri, 26 Dec 2008) | 3 lines fixing bugs in NodeProvisioner. Conservative estimate on idle executors have to be max, not min. ................ r13890 | kohsuke | 2008-12-26 11:42:53 -0800 (Fri, 26 Dec 2008) | 1 line turns out the problem was that we were adding multiple slaves under the same name, which confused Hudson to no end. ................ r13896 | kohsuke | 2008-12-27 07:44:20 -0800 (Sat, 27 Dec 2008) | 1 line formatting changes ................ r13897 | kohsuke | 2008-12-27 07:45:00 -0800 (Sat, 27 Dec 2008) | 1 line reprot the test name to stdout so that one can easily distinguish different tests in target/surefire-reports/xyz-output.txt ................ r13898 | kohsuke | 2008-12-27 07:54:53 -0800 (Sat, 27 Dec 2008) | 1 line doc improvement ................ r13899 | kohsuke | 2008-12-27 09:59:07 -0800 (Sat, 27 Dec 2008) | 1 line split the functionality into two classes ................ r13900 | kohsuke | 2008-12-27 10:00:29 -0800 (Sat, 27 Dec 2008) | 1 line doc improvement ................ r13901 | kohsuke | 2008-12-27 10:06:24 -0800 (Sat, 27 Dec 2008) | 1 line added 'tick' ................ r13902 | kohsuke | 2008-12-27 10:08:04 -0800 (Sat, 27 Dec 2008) | 1 line adding graph rendering of the load statistics ................ r13903 | kohsuke | 2008-12-27 10:19:41 -0800 (Sat, 27 Dec 2008) | 1 line improved graph layout ................ r13904 | kohsuke | 2008-12-27 10:21:05 -0800 (Sat, 27 Dec 2008) | 1 line Picker -> TimeScale to better reflect what it is. ................ r13905 | kohsuke | 2008-12-27 10:40:27 -0800 (Sat, 27 Dec 2008) | 1 line duplicate ................ r13906 | kohsuke | 2008-12-27 14:39:36 -0800 (Sat, 27 Dec 2008) | 1 line renamed to a shorter name ................ r13907 | kohsuke | 2008-12-27 15:03:25 -0800 (Sat, 27 Dec 2008) | 1 line added icons ................ r13908 | kohsuke | 2008-12-27 16:20:37 -0800 (Sat, 27 Dec 2008) | 1 line renamed to make 'loadStatistics' the URL binding. ................ r13909 | kohsuke | 2008-12-27 16:21:01 -0800 (Sat, 27 Dec 2008) | 1 line exposing loadStatistics for Computer for better URL binding ................ r13910 | kohsuke | 2008-12-27 16:21:16 -0800 (Sat, 27 Dec 2008) | 1 line adding UI support ................ r13911 | kohsuke | 2008-12-27 19:31:43 -0800 (Sat, 27 Dec 2008) | 1 line added some basic visualization ................ r13912 | kohsuke | 2008-12-27 19:35:10 -0800 (Sat, 27 Dec 2008) | 1 line if there's no description, don't even show it. ................ r13913 | kohsuke | 2008-12-27 19:39:26 -0800 (Sat, 27 Dec 2008) | 1 line added load statistics page for the label as well. ................ r13914 | kohsuke | 2008-12-27 19:48:55 -0800 (Sat, 27 Dec 2008) | 1 line added one more convenience method. ................ r13915 | kohsuke | 2008-12-27 19:54:29 -0800 (Sat, 27 Dec 2008) | 1 line refactored so that a different Dataset can be fed. ................ r13916 | kohsuke | 2008-12-27 19:59:20 -0800 (Sat, 27 Dec 2008) | 1 line added global load statistics lnk to the management screen. ................ r13917 | kohsuke | 2008-12-27 20:31:01 -0800 (Sat, 27 Dec 2008) | 1 line <dt>s should use the bold font to distinguish them from <dd>s ................ r13918 | kohsuke | 2008-12-27 20:35:10 -0800 (Sat, 27 Dec 2008) | 1 line added description of what the graph means. ................ r13919 | kohsuke | 2008-12-27 20:35:39 -0800 (Sat, 27 Dec 2008) | 1 line added description of what the graph means. ................ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@14215 71c3de6d-444a-0410-be80-ed276b4c234a
2009-01-07 09:02:56 +08:00
}
/**
* Prepend a prefix only when there's the specified body.
*/
public String prepend(String prefix, String body) {
if(body!=null && body.length()>0)
return prefix+body;
return body;
}
public static List<Descriptor<CrumbIssuer>> getCrumbIssuerDescriptors() {
return CrumbIssuer.all();
}
public static String getCrumb(StaplerRequest req) {
Jenkins h = Jenkins.getInstanceOrNull();
CrumbIssuer issuer = h != null ? h.getCrumbIssuer() : null;
return issuer != null ? issuer.getCrumb(req) : "";
}
public static String getCrumbRequestField() {
Jenkins h = Jenkins.getInstanceOrNull();
CrumbIssuer issuer = h != null ? h.getCrumbIssuer() : null;
return issuer != null ? issuer.getDescriptor().getCrumbRequestField() : "";
}
public static Date getCurrentTime() {
return new Date();
}
[FIXED HUDSON-2137] Merged revisions 27137,27564,27566-27567,27578,27586,27599,27603,27606-27609,27611,27616,27626-27632,27640,27654-27656,27687,27701,27801,27816,27819,27843-27845,28087,28158-28161 via svnmerge from https://www.dev.java.net/svn/hudson/branches/HUDSON-2137 ........ r27137 | kohsuke | 2010-02-08 08:46:16 -0800 (Mon, 08 Feb 2010) | 1 line experimenting with abstractions ........ r27564 | kohsuke | 2010-02-16 07:58:26 -0800 (Tue, 16 Feb 2010) | 1 line bundling makes it easier for caller to handle ConsoleAnnotator ........ r27566 | kohsuke | 2010-02-16 08:49:48 -0800 (Tue, 16 Feb 2010) | 1 line this should work with Runs, not AbstractBuilds ........ r27567 | kohsuke | 2010-02-16 08:54:06 -0800 (Tue, 16 Feb 2010) | 1 line simplified ........ r27578 | kohsuke | 2010-02-16 12:26:11 -0800 (Tue, 16 Feb 2010) | 1 line still a work in progress, but committing once to pull in trunk changes ........ r27586 | kohsuke | 2010-02-16 14:35:37 -0800 (Tue, 16 Feb 2010) | 1 line making more progress ........ r27599 | kohsuke | 2010-02-16 19:22:01 -0800 (Tue, 16 Feb 2010) | 2 lines hooking up the side that writes annotations. still a work in progress. ........ r27603 | kohsuke | 2010-02-16 23:43:35 -0800 (Tue, 16 Feb 2010) | 3 lines what appears to me as the first cut of hooking up the reader side of the annotations. I haven't even run it yet --- this just passed the compilation, and I'm calling it a day. ........ r27606 | kohsuke | 2010-02-17 09:15:16 -0800 (Wed, 17 Feb 2010) | 1 line demo instance hook up ........ r27607 | kohsuke | 2010-02-17 11:27:02 -0800 (Wed, 17 Feb 2010) | 3 lines one more utility method. I never understood what the point of letting the skip method skip less. ........ r27608 | kohsuke | 2010-02-17 11:56:23 -0800 (Wed, 17 Feb 2010) | 3 lines - moved LargeText subtype to its own class - skipping log output was done incorrectly --- it had to skip N bytes where it was skipping N chars. - hooked up console annotations for completed builds. ........ r27609 | kohsuke | 2010-02-17 12:01:46 -0800 (Wed, 17 Feb 2010) | 1 line copyright header ........ r27611 | kohsuke | 2010-02-17 13:18:10 -0800 (Wed, 17 Feb 2010) | 1 line introduced a mechanism to register extension during an unit test. ........ r27616 | kohsuke | 2010-02-17 13:38:12 -0800 (Wed, 17 Feb 2010) | 1 line test case for console annotations ........ r27626 | kohsuke | 2010-02-17 15:23:06 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotator as I write tests as tests ........ r27627 | kohsuke | 2010-02-17 16:06:13 -0800 (Wed, 17 Feb 2010) | 1 line added a multi-phase cooperative locking mechanism useful during the debugging ........ r27628 | kohsuke | 2010-02-17 16:06:41 -0800 (Wed, 17 Feb 2010) | 1 line testing progressive log annotation ........ r27629 | kohsuke | 2010-02-17 16:20:32 -0800 (Wed, 17 Feb 2010) | 1 line adding a test for ConsoleAnnotation that's explicitly placed. ........ r27630 | kohsuke | 2010-02-17 16:23:02 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotation as I write tests as tests ........ r27631 | kohsuke | 2010-02-17 16:28:50 -0800 (Wed, 17 Feb 2010) | 1 line tweaking the abstraction a bit. ........ r27632 | kohsuke | 2010-02-17 16:44:21 -0800 (Wed, 17 Feb 2010) | 1 line parameterized the context type so that this can be used in places other than the build console output, such as polling logs, slave logs, and so on. ........ r27640 | kohsuke | 2010-02-17 17:27:52 -0800 (Wed, 17 Feb 2010) | 1 line bug fix ........ r27654 | kohsuke | 2010-02-17 22:53:04 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27655 | kohsuke | 2010-02-17 22:53:59 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27656 | kohsuke | 2010-02-17 23:10:42 -0800 (Wed, 17 Feb 2010) | 1 line test case for adjacent tags ........ r27687 | kohsuke | 2010-02-19 14:39:21 -0800 (Fri, 19 Feb 2010) | 1 line introduced a facotry and descriptor. This allows them to define configuration pages, allow users to disable/enable them, plus define custom behaviors. ........ r27701 | kohsuke | 2010-02-19 18:23:52 -0800 (Fri, 19 Feb 2010) | 1 line defining a mechanism for ConsoleAnnotatorFactory and ConsoleAnnotationDescriptor to define script.js and have them imported into the console output page ........ r27801 | kohsuke | 2010-02-22 11:59:16 -0800 (Mon, 22 Feb 2010) | 1 line now embedding annotations inside the console output log file. ........ r27816 | kohsuke | 2010-02-22 15:45:04 -0800 (Mon, 22 Feb 2010) | 1 line introduced a convenience method for unit tests ........ r27819 | kohsuke | 2010-02-22 17:37:05 -0800 (Mon, 22 Feb 2010) | 5 lines As an example of using embedded console annotations, implementing Ant target invocation outlines. It might be better to make the concept of outline more generally reusable, so that different kinds of outlines can be placed into the same container element for a single hierarchical representation. Still a work in progress. ........ r27843 | kohsuke | 2010-02-23 16:12:13 -0800 (Tue, 23 Feb 2010) | 1 line for now, disable this for production usage, until I work out a better UI. ........ r27844 | kohsuke | 2010-02-23 19:08:00 -0800 (Tue, 23 Feb 2010) | 1 line started working on annotating exception. ........ r27845 | kohsuke | 2010-02-23 19:08:33 -0800 (Tue, 23 Feb 2010) | 1 line more TODOs for myself ........ r28087 | kohsuke | 2010-03-01 10:03:55 -0800 (Mon, 01 Mar 2010) | 1 line formatting changes ........ r28158 | kohsuke | 2010-03-02 17:00:00 -0800 (Tue, 02 Mar 2010) | 1 line ConsoleAnnotation and ConsoleAnnotator are too confusing. ........ r28159 | kohsuke | 2010-03-02 17:02:02 -0800 (Tue, 02 Mar 2010) | 1 line doc improvement ........ r28160 | kohsuke | 2010-03-02 17:05:14 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvements. ........ r28161 | kohsuke | 2010-03-02 17:11:59 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvement ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@28173 71c3de6d-444a-0410-be80-ed276b4c234a
2010-03-03 23:37:55 +08:00
2011-03-01 16:15:15 +08:00
public static Locale getCurrentLocale() {
Locale locale=null;
StaplerRequest req = Stapler.getCurrentRequest();
if(req!=null)
locale = req.getLocale();
if(locale==null)
locale = Locale.getDefault();
return locale;
}
[FIXED HUDSON-2137] Merged revisions 27137,27564,27566-27567,27578,27586,27599,27603,27606-27609,27611,27616,27626-27632,27640,27654-27656,27687,27701,27801,27816,27819,27843-27845,28087,28158-28161 via svnmerge from https://www.dev.java.net/svn/hudson/branches/HUDSON-2137 ........ r27137 | kohsuke | 2010-02-08 08:46:16 -0800 (Mon, 08 Feb 2010) | 1 line experimenting with abstractions ........ r27564 | kohsuke | 2010-02-16 07:58:26 -0800 (Tue, 16 Feb 2010) | 1 line bundling makes it easier for caller to handle ConsoleAnnotator ........ r27566 | kohsuke | 2010-02-16 08:49:48 -0800 (Tue, 16 Feb 2010) | 1 line this should work with Runs, not AbstractBuilds ........ r27567 | kohsuke | 2010-02-16 08:54:06 -0800 (Tue, 16 Feb 2010) | 1 line simplified ........ r27578 | kohsuke | 2010-02-16 12:26:11 -0800 (Tue, 16 Feb 2010) | 1 line still a work in progress, but committing once to pull in trunk changes ........ r27586 | kohsuke | 2010-02-16 14:35:37 -0800 (Tue, 16 Feb 2010) | 1 line making more progress ........ r27599 | kohsuke | 2010-02-16 19:22:01 -0800 (Tue, 16 Feb 2010) | 2 lines hooking up the side that writes annotations. still a work in progress. ........ r27603 | kohsuke | 2010-02-16 23:43:35 -0800 (Tue, 16 Feb 2010) | 3 lines what appears to me as the first cut of hooking up the reader side of the annotations. I haven't even run it yet --- this just passed the compilation, and I'm calling it a day. ........ r27606 | kohsuke | 2010-02-17 09:15:16 -0800 (Wed, 17 Feb 2010) | 1 line demo instance hook up ........ r27607 | kohsuke | 2010-02-17 11:27:02 -0800 (Wed, 17 Feb 2010) | 3 lines one more utility method. I never understood what the point of letting the skip method skip less. ........ r27608 | kohsuke | 2010-02-17 11:56:23 -0800 (Wed, 17 Feb 2010) | 3 lines - moved LargeText subtype to its own class - skipping log output was done incorrectly --- it had to skip N bytes where it was skipping N chars. - hooked up console annotations for completed builds. ........ r27609 | kohsuke | 2010-02-17 12:01:46 -0800 (Wed, 17 Feb 2010) | 1 line copyright header ........ r27611 | kohsuke | 2010-02-17 13:18:10 -0800 (Wed, 17 Feb 2010) | 1 line introduced a mechanism to register extension during an unit test. ........ r27616 | kohsuke | 2010-02-17 13:38:12 -0800 (Wed, 17 Feb 2010) | 1 line test case for console annotations ........ r27626 | kohsuke | 2010-02-17 15:23:06 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotator as I write tests as tests ........ r27627 | kohsuke | 2010-02-17 16:06:13 -0800 (Wed, 17 Feb 2010) | 1 line added a multi-phase cooperative locking mechanism useful during the debugging ........ r27628 | kohsuke | 2010-02-17 16:06:41 -0800 (Wed, 17 Feb 2010) | 1 line testing progressive log annotation ........ r27629 | kohsuke | 2010-02-17 16:20:32 -0800 (Wed, 17 Feb 2010) | 1 line adding a test for ConsoleAnnotation that's explicitly placed. ........ r27630 | kohsuke | 2010-02-17 16:23:02 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotation as I write tests as tests ........ r27631 | kohsuke | 2010-02-17 16:28:50 -0800 (Wed, 17 Feb 2010) | 1 line tweaking the abstraction a bit. ........ r27632 | kohsuke | 2010-02-17 16:44:21 -0800 (Wed, 17 Feb 2010) | 1 line parameterized the context type so that this can be used in places other than the build console output, such as polling logs, slave logs, and so on. ........ r27640 | kohsuke | 2010-02-17 17:27:52 -0800 (Wed, 17 Feb 2010) | 1 line bug fix ........ r27654 | kohsuke | 2010-02-17 22:53:04 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27655 | kohsuke | 2010-02-17 22:53:59 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27656 | kohsuke | 2010-02-17 23:10:42 -0800 (Wed, 17 Feb 2010) | 1 line test case for adjacent tags ........ r27687 | kohsuke | 2010-02-19 14:39:21 -0800 (Fri, 19 Feb 2010) | 1 line introduced a facotry and descriptor. This allows them to define configuration pages, allow users to disable/enable them, plus define custom behaviors. ........ r27701 | kohsuke | 2010-02-19 18:23:52 -0800 (Fri, 19 Feb 2010) | 1 line defining a mechanism for ConsoleAnnotatorFactory and ConsoleAnnotationDescriptor to define script.js and have them imported into the console output page ........ r27801 | kohsuke | 2010-02-22 11:59:16 -0800 (Mon, 22 Feb 2010) | 1 line now embedding annotations inside the console output log file. ........ r27816 | kohsuke | 2010-02-22 15:45:04 -0800 (Mon, 22 Feb 2010) | 1 line introduced a convenience method for unit tests ........ r27819 | kohsuke | 2010-02-22 17:37:05 -0800 (Mon, 22 Feb 2010) | 5 lines As an example of using embedded console annotations, implementing Ant target invocation outlines. It might be better to make the concept of outline more generally reusable, so that different kinds of outlines can be placed into the same container element for a single hierarchical representation. Still a work in progress. ........ r27843 | kohsuke | 2010-02-23 16:12:13 -0800 (Tue, 23 Feb 2010) | 1 line for now, disable this for production usage, until I work out a better UI. ........ r27844 | kohsuke | 2010-02-23 19:08:00 -0800 (Tue, 23 Feb 2010) | 1 line started working on annotating exception. ........ r27845 | kohsuke | 2010-02-23 19:08:33 -0800 (Tue, 23 Feb 2010) | 1 line more TODOs for myself ........ r28087 | kohsuke | 2010-03-01 10:03:55 -0800 (Mon, 01 Mar 2010) | 1 line formatting changes ........ r28158 | kohsuke | 2010-03-02 17:00:00 -0800 (Tue, 02 Mar 2010) | 1 line ConsoleAnnotation and ConsoleAnnotator are too confusing. ........ r28159 | kohsuke | 2010-03-02 17:02:02 -0800 (Tue, 02 Mar 2010) | 1 line doc improvement ........ r28160 | kohsuke | 2010-03-02 17:05:14 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvements. ........ r28161 | kohsuke | 2010-03-02 17:11:59 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvement ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@28173 71c3de6d-444a-0410-be80-ed276b4c234a
2010-03-03 23:37:55 +08:00
/**
2017-04-11 21:26:45 +08:00
* Generate a series of {@code <script>} tags to include {@code script.js}
[FIXED HUDSON-2137] Merged revisions 27137,27564,27566-27567,27578,27586,27599,27603,27606-27609,27611,27616,27626-27632,27640,27654-27656,27687,27701,27801,27816,27819,27843-27845,28087,28158-28161 via svnmerge from https://www.dev.java.net/svn/hudson/branches/HUDSON-2137 ........ r27137 | kohsuke | 2010-02-08 08:46:16 -0800 (Mon, 08 Feb 2010) | 1 line experimenting with abstractions ........ r27564 | kohsuke | 2010-02-16 07:58:26 -0800 (Tue, 16 Feb 2010) | 1 line bundling makes it easier for caller to handle ConsoleAnnotator ........ r27566 | kohsuke | 2010-02-16 08:49:48 -0800 (Tue, 16 Feb 2010) | 1 line this should work with Runs, not AbstractBuilds ........ r27567 | kohsuke | 2010-02-16 08:54:06 -0800 (Tue, 16 Feb 2010) | 1 line simplified ........ r27578 | kohsuke | 2010-02-16 12:26:11 -0800 (Tue, 16 Feb 2010) | 1 line still a work in progress, but committing once to pull in trunk changes ........ r27586 | kohsuke | 2010-02-16 14:35:37 -0800 (Tue, 16 Feb 2010) | 1 line making more progress ........ r27599 | kohsuke | 2010-02-16 19:22:01 -0800 (Tue, 16 Feb 2010) | 2 lines hooking up the side that writes annotations. still a work in progress. ........ r27603 | kohsuke | 2010-02-16 23:43:35 -0800 (Tue, 16 Feb 2010) | 3 lines what appears to me as the first cut of hooking up the reader side of the annotations. I haven't even run it yet --- this just passed the compilation, and I'm calling it a day. ........ r27606 | kohsuke | 2010-02-17 09:15:16 -0800 (Wed, 17 Feb 2010) | 1 line demo instance hook up ........ r27607 | kohsuke | 2010-02-17 11:27:02 -0800 (Wed, 17 Feb 2010) | 3 lines one more utility method. I never understood what the point of letting the skip method skip less. ........ r27608 | kohsuke | 2010-02-17 11:56:23 -0800 (Wed, 17 Feb 2010) | 3 lines - moved LargeText subtype to its own class - skipping log output was done incorrectly --- it had to skip N bytes where it was skipping N chars. - hooked up console annotations for completed builds. ........ r27609 | kohsuke | 2010-02-17 12:01:46 -0800 (Wed, 17 Feb 2010) | 1 line copyright header ........ r27611 | kohsuke | 2010-02-17 13:18:10 -0800 (Wed, 17 Feb 2010) | 1 line introduced a mechanism to register extension during an unit test. ........ r27616 | kohsuke | 2010-02-17 13:38:12 -0800 (Wed, 17 Feb 2010) | 1 line test case for console annotations ........ r27626 | kohsuke | 2010-02-17 15:23:06 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotator as I write tests as tests ........ r27627 | kohsuke | 2010-02-17 16:06:13 -0800 (Wed, 17 Feb 2010) | 1 line added a multi-phase cooperative locking mechanism useful during the debugging ........ r27628 | kohsuke | 2010-02-17 16:06:41 -0800 (Wed, 17 Feb 2010) | 1 line testing progressive log annotation ........ r27629 | kohsuke | 2010-02-17 16:20:32 -0800 (Wed, 17 Feb 2010) | 1 line adding a test for ConsoleAnnotation that's explicitly placed. ........ r27630 | kohsuke | 2010-02-17 16:23:02 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotation as I write tests as tests ........ r27631 | kohsuke | 2010-02-17 16:28:50 -0800 (Wed, 17 Feb 2010) | 1 line tweaking the abstraction a bit. ........ r27632 | kohsuke | 2010-02-17 16:44:21 -0800 (Wed, 17 Feb 2010) | 1 line parameterized the context type so that this can be used in places other than the build console output, such as polling logs, slave logs, and so on. ........ r27640 | kohsuke | 2010-02-17 17:27:52 -0800 (Wed, 17 Feb 2010) | 1 line bug fix ........ r27654 | kohsuke | 2010-02-17 22:53:04 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27655 | kohsuke | 2010-02-17 22:53:59 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27656 | kohsuke | 2010-02-17 23:10:42 -0800 (Wed, 17 Feb 2010) | 1 line test case for adjacent tags ........ r27687 | kohsuke | 2010-02-19 14:39:21 -0800 (Fri, 19 Feb 2010) | 1 line introduced a facotry and descriptor. This allows them to define configuration pages, allow users to disable/enable them, plus define custom behaviors. ........ r27701 | kohsuke | 2010-02-19 18:23:52 -0800 (Fri, 19 Feb 2010) | 1 line defining a mechanism for ConsoleAnnotatorFactory and ConsoleAnnotationDescriptor to define script.js and have them imported into the console output page ........ r27801 | kohsuke | 2010-02-22 11:59:16 -0800 (Mon, 22 Feb 2010) | 1 line now embedding annotations inside the console output log file. ........ r27816 | kohsuke | 2010-02-22 15:45:04 -0800 (Mon, 22 Feb 2010) | 1 line introduced a convenience method for unit tests ........ r27819 | kohsuke | 2010-02-22 17:37:05 -0800 (Mon, 22 Feb 2010) | 5 lines As an example of using embedded console annotations, implementing Ant target invocation outlines. It might be better to make the concept of outline more generally reusable, so that different kinds of outlines can be placed into the same container element for a single hierarchical representation. Still a work in progress. ........ r27843 | kohsuke | 2010-02-23 16:12:13 -0800 (Tue, 23 Feb 2010) | 1 line for now, disable this for production usage, until I work out a better UI. ........ r27844 | kohsuke | 2010-02-23 19:08:00 -0800 (Tue, 23 Feb 2010) | 1 line started working on annotating exception. ........ r27845 | kohsuke | 2010-02-23 19:08:33 -0800 (Tue, 23 Feb 2010) | 1 line more TODOs for myself ........ r28087 | kohsuke | 2010-03-01 10:03:55 -0800 (Mon, 01 Mar 2010) | 1 line formatting changes ........ r28158 | kohsuke | 2010-03-02 17:00:00 -0800 (Tue, 02 Mar 2010) | 1 line ConsoleAnnotation and ConsoleAnnotator are too confusing. ........ r28159 | kohsuke | 2010-03-02 17:02:02 -0800 (Tue, 02 Mar 2010) | 1 line doc improvement ........ r28160 | kohsuke | 2010-03-02 17:05:14 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvements. ........ r28161 | kohsuke | 2010-03-02 17:11:59 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvement ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@28173 71c3de6d-444a-0410-be80-ed276b4c234a
2010-03-03 23:37:55 +08:00
* from {@link ConsoleAnnotatorFactory}s and {@link ConsoleAnnotationDescriptor}s.
*/
public static String generateConsoleAnnotationScriptAndStylesheet() {
String cp = Stapler.getCurrentRequest().getContextPath() + Jenkins.RESOURCE_PATH;
[FIXED HUDSON-2137] Merged revisions 27137,27564,27566-27567,27578,27586,27599,27603,27606-27609,27611,27616,27626-27632,27640,27654-27656,27687,27701,27801,27816,27819,27843-27845,28087,28158-28161 via svnmerge from https://www.dev.java.net/svn/hudson/branches/HUDSON-2137 ........ r27137 | kohsuke | 2010-02-08 08:46:16 -0800 (Mon, 08 Feb 2010) | 1 line experimenting with abstractions ........ r27564 | kohsuke | 2010-02-16 07:58:26 -0800 (Tue, 16 Feb 2010) | 1 line bundling makes it easier for caller to handle ConsoleAnnotator ........ r27566 | kohsuke | 2010-02-16 08:49:48 -0800 (Tue, 16 Feb 2010) | 1 line this should work with Runs, not AbstractBuilds ........ r27567 | kohsuke | 2010-02-16 08:54:06 -0800 (Tue, 16 Feb 2010) | 1 line simplified ........ r27578 | kohsuke | 2010-02-16 12:26:11 -0800 (Tue, 16 Feb 2010) | 1 line still a work in progress, but committing once to pull in trunk changes ........ r27586 | kohsuke | 2010-02-16 14:35:37 -0800 (Tue, 16 Feb 2010) | 1 line making more progress ........ r27599 | kohsuke | 2010-02-16 19:22:01 -0800 (Tue, 16 Feb 2010) | 2 lines hooking up the side that writes annotations. still a work in progress. ........ r27603 | kohsuke | 2010-02-16 23:43:35 -0800 (Tue, 16 Feb 2010) | 3 lines what appears to me as the first cut of hooking up the reader side of the annotations. I haven't even run it yet --- this just passed the compilation, and I'm calling it a day. ........ r27606 | kohsuke | 2010-02-17 09:15:16 -0800 (Wed, 17 Feb 2010) | 1 line demo instance hook up ........ r27607 | kohsuke | 2010-02-17 11:27:02 -0800 (Wed, 17 Feb 2010) | 3 lines one more utility method. I never understood what the point of letting the skip method skip less. ........ r27608 | kohsuke | 2010-02-17 11:56:23 -0800 (Wed, 17 Feb 2010) | 3 lines - moved LargeText subtype to its own class - skipping log output was done incorrectly --- it had to skip N bytes where it was skipping N chars. - hooked up console annotations for completed builds. ........ r27609 | kohsuke | 2010-02-17 12:01:46 -0800 (Wed, 17 Feb 2010) | 1 line copyright header ........ r27611 | kohsuke | 2010-02-17 13:18:10 -0800 (Wed, 17 Feb 2010) | 1 line introduced a mechanism to register extension during an unit test. ........ r27616 | kohsuke | 2010-02-17 13:38:12 -0800 (Wed, 17 Feb 2010) | 1 line test case for console annotations ........ r27626 | kohsuke | 2010-02-17 15:23:06 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotator as I write tests as tests ........ r27627 | kohsuke | 2010-02-17 16:06:13 -0800 (Wed, 17 Feb 2010) | 1 line added a multi-phase cooperative locking mechanism useful during the debugging ........ r27628 | kohsuke | 2010-02-17 16:06:41 -0800 (Wed, 17 Feb 2010) | 1 line testing progressive log annotation ........ r27629 | kohsuke | 2010-02-17 16:20:32 -0800 (Wed, 17 Feb 2010) | 1 line adding a test for ConsoleAnnotation that's explicitly placed. ........ r27630 | kohsuke | 2010-02-17 16:23:02 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotation as I write tests as tests ........ r27631 | kohsuke | 2010-02-17 16:28:50 -0800 (Wed, 17 Feb 2010) | 1 line tweaking the abstraction a bit. ........ r27632 | kohsuke | 2010-02-17 16:44:21 -0800 (Wed, 17 Feb 2010) | 1 line parameterized the context type so that this can be used in places other than the build console output, such as polling logs, slave logs, and so on. ........ r27640 | kohsuke | 2010-02-17 17:27:52 -0800 (Wed, 17 Feb 2010) | 1 line bug fix ........ r27654 | kohsuke | 2010-02-17 22:53:04 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27655 | kohsuke | 2010-02-17 22:53:59 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27656 | kohsuke | 2010-02-17 23:10:42 -0800 (Wed, 17 Feb 2010) | 1 line test case for adjacent tags ........ r27687 | kohsuke | 2010-02-19 14:39:21 -0800 (Fri, 19 Feb 2010) | 1 line introduced a facotry and descriptor. This allows them to define configuration pages, allow users to disable/enable them, plus define custom behaviors. ........ r27701 | kohsuke | 2010-02-19 18:23:52 -0800 (Fri, 19 Feb 2010) | 1 line defining a mechanism for ConsoleAnnotatorFactory and ConsoleAnnotationDescriptor to define script.js and have them imported into the console output page ........ r27801 | kohsuke | 2010-02-22 11:59:16 -0800 (Mon, 22 Feb 2010) | 1 line now embedding annotations inside the console output log file. ........ r27816 | kohsuke | 2010-02-22 15:45:04 -0800 (Mon, 22 Feb 2010) | 1 line introduced a convenience method for unit tests ........ r27819 | kohsuke | 2010-02-22 17:37:05 -0800 (Mon, 22 Feb 2010) | 5 lines As an example of using embedded console annotations, implementing Ant target invocation outlines. It might be better to make the concept of outline more generally reusable, so that different kinds of outlines can be placed into the same container element for a single hierarchical representation. Still a work in progress. ........ r27843 | kohsuke | 2010-02-23 16:12:13 -0800 (Tue, 23 Feb 2010) | 1 line for now, disable this for production usage, until I work out a better UI. ........ r27844 | kohsuke | 2010-02-23 19:08:00 -0800 (Tue, 23 Feb 2010) | 1 line started working on annotating exception. ........ r27845 | kohsuke | 2010-02-23 19:08:33 -0800 (Tue, 23 Feb 2010) | 1 line more TODOs for myself ........ r28087 | kohsuke | 2010-03-01 10:03:55 -0800 (Mon, 01 Mar 2010) | 1 line formatting changes ........ r28158 | kohsuke | 2010-03-02 17:00:00 -0800 (Tue, 02 Mar 2010) | 1 line ConsoleAnnotation and ConsoleAnnotator are too confusing. ........ r28159 | kohsuke | 2010-03-02 17:02:02 -0800 (Tue, 02 Mar 2010) | 1 line doc improvement ........ r28160 | kohsuke | 2010-03-02 17:05:14 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvements. ........ r28161 | kohsuke | 2010-03-02 17:11:59 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvement ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@28173 71c3de6d-444a-0410-be80-ed276b4c234a
2010-03-03 23:37:55 +08:00
StringBuilder buf = new StringBuilder();
for (ConsoleAnnotatorFactory f : ConsoleAnnotatorFactory.all()) {
String path = cp + "/extensionList/" + ConsoleAnnotatorFactory.class.getName() + "/" + f.getClass().getName();
[FIXED HUDSON-2137] Merged revisions 27137,27564,27566-27567,27578,27586,27599,27603,27606-27609,27611,27616,27626-27632,27640,27654-27656,27687,27701,27801,27816,27819,27843-27845,28087,28158-28161 via svnmerge from https://www.dev.java.net/svn/hudson/branches/HUDSON-2137 ........ r27137 | kohsuke | 2010-02-08 08:46:16 -0800 (Mon, 08 Feb 2010) | 1 line experimenting with abstractions ........ r27564 | kohsuke | 2010-02-16 07:58:26 -0800 (Tue, 16 Feb 2010) | 1 line bundling makes it easier for caller to handle ConsoleAnnotator ........ r27566 | kohsuke | 2010-02-16 08:49:48 -0800 (Tue, 16 Feb 2010) | 1 line this should work with Runs, not AbstractBuilds ........ r27567 | kohsuke | 2010-02-16 08:54:06 -0800 (Tue, 16 Feb 2010) | 1 line simplified ........ r27578 | kohsuke | 2010-02-16 12:26:11 -0800 (Tue, 16 Feb 2010) | 1 line still a work in progress, but committing once to pull in trunk changes ........ r27586 | kohsuke | 2010-02-16 14:35:37 -0800 (Tue, 16 Feb 2010) | 1 line making more progress ........ r27599 | kohsuke | 2010-02-16 19:22:01 -0800 (Tue, 16 Feb 2010) | 2 lines hooking up the side that writes annotations. still a work in progress. ........ r27603 | kohsuke | 2010-02-16 23:43:35 -0800 (Tue, 16 Feb 2010) | 3 lines what appears to me as the first cut of hooking up the reader side of the annotations. I haven't even run it yet --- this just passed the compilation, and I'm calling it a day. ........ r27606 | kohsuke | 2010-02-17 09:15:16 -0800 (Wed, 17 Feb 2010) | 1 line demo instance hook up ........ r27607 | kohsuke | 2010-02-17 11:27:02 -0800 (Wed, 17 Feb 2010) | 3 lines one more utility method. I never understood what the point of letting the skip method skip less. ........ r27608 | kohsuke | 2010-02-17 11:56:23 -0800 (Wed, 17 Feb 2010) | 3 lines - moved LargeText subtype to its own class - skipping log output was done incorrectly --- it had to skip N bytes where it was skipping N chars. - hooked up console annotations for completed builds. ........ r27609 | kohsuke | 2010-02-17 12:01:46 -0800 (Wed, 17 Feb 2010) | 1 line copyright header ........ r27611 | kohsuke | 2010-02-17 13:18:10 -0800 (Wed, 17 Feb 2010) | 1 line introduced a mechanism to register extension during an unit test. ........ r27616 | kohsuke | 2010-02-17 13:38:12 -0800 (Wed, 17 Feb 2010) | 1 line test case for console annotations ........ r27626 | kohsuke | 2010-02-17 15:23:06 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotator as I write tests as tests ........ r27627 | kohsuke | 2010-02-17 16:06:13 -0800 (Wed, 17 Feb 2010) | 1 line added a multi-phase cooperative locking mechanism useful during the debugging ........ r27628 | kohsuke | 2010-02-17 16:06:41 -0800 (Wed, 17 Feb 2010) | 1 line testing progressive log annotation ........ r27629 | kohsuke | 2010-02-17 16:20:32 -0800 (Wed, 17 Feb 2010) | 1 line adding a test for ConsoleAnnotation that's explicitly placed. ........ r27630 | kohsuke | 2010-02-17 16:23:02 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotation as I write tests as tests ........ r27631 | kohsuke | 2010-02-17 16:28:50 -0800 (Wed, 17 Feb 2010) | 1 line tweaking the abstraction a bit. ........ r27632 | kohsuke | 2010-02-17 16:44:21 -0800 (Wed, 17 Feb 2010) | 1 line parameterized the context type so that this can be used in places other than the build console output, such as polling logs, slave logs, and so on. ........ r27640 | kohsuke | 2010-02-17 17:27:52 -0800 (Wed, 17 Feb 2010) | 1 line bug fix ........ r27654 | kohsuke | 2010-02-17 22:53:04 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27655 | kohsuke | 2010-02-17 22:53:59 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27656 | kohsuke | 2010-02-17 23:10:42 -0800 (Wed, 17 Feb 2010) | 1 line test case for adjacent tags ........ r27687 | kohsuke | 2010-02-19 14:39:21 -0800 (Fri, 19 Feb 2010) | 1 line introduced a facotry and descriptor. This allows them to define configuration pages, allow users to disable/enable them, plus define custom behaviors. ........ r27701 | kohsuke | 2010-02-19 18:23:52 -0800 (Fri, 19 Feb 2010) | 1 line defining a mechanism for ConsoleAnnotatorFactory and ConsoleAnnotationDescriptor to define script.js and have them imported into the console output page ........ r27801 | kohsuke | 2010-02-22 11:59:16 -0800 (Mon, 22 Feb 2010) | 1 line now embedding annotations inside the console output log file. ........ r27816 | kohsuke | 2010-02-22 15:45:04 -0800 (Mon, 22 Feb 2010) | 1 line introduced a convenience method for unit tests ........ r27819 | kohsuke | 2010-02-22 17:37:05 -0800 (Mon, 22 Feb 2010) | 5 lines As an example of using embedded console annotations, implementing Ant target invocation outlines. It might be better to make the concept of outline more generally reusable, so that different kinds of outlines can be placed into the same container element for a single hierarchical representation. Still a work in progress. ........ r27843 | kohsuke | 2010-02-23 16:12:13 -0800 (Tue, 23 Feb 2010) | 1 line for now, disable this for production usage, until I work out a better UI. ........ r27844 | kohsuke | 2010-02-23 19:08:00 -0800 (Tue, 23 Feb 2010) | 1 line started working on annotating exception. ........ r27845 | kohsuke | 2010-02-23 19:08:33 -0800 (Tue, 23 Feb 2010) | 1 line more TODOs for myself ........ r28087 | kohsuke | 2010-03-01 10:03:55 -0800 (Mon, 01 Mar 2010) | 1 line formatting changes ........ r28158 | kohsuke | 2010-03-02 17:00:00 -0800 (Tue, 02 Mar 2010) | 1 line ConsoleAnnotation and ConsoleAnnotator are too confusing. ........ r28159 | kohsuke | 2010-03-02 17:02:02 -0800 (Tue, 02 Mar 2010) | 1 line doc improvement ........ r28160 | kohsuke | 2010-03-02 17:05:14 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvements. ........ r28161 | kohsuke | 2010-03-02 17:11:59 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvement ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@28173 71c3de6d-444a-0410-be80-ed276b4c234a
2010-03-03 23:37:55 +08:00
if (f.hasScript())
buf.append("<script src='").append(path).append("/script.js'></script>");
if (f.hasStylesheet())
buf.append("<link rel='stylesheet' type='text/css' href='").append(path).append("/style.css' />");
[FIXED HUDSON-2137] Merged revisions 27137,27564,27566-27567,27578,27586,27599,27603,27606-27609,27611,27616,27626-27632,27640,27654-27656,27687,27701,27801,27816,27819,27843-27845,28087,28158-28161 via svnmerge from https://www.dev.java.net/svn/hudson/branches/HUDSON-2137 ........ r27137 | kohsuke | 2010-02-08 08:46:16 -0800 (Mon, 08 Feb 2010) | 1 line experimenting with abstractions ........ r27564 | kohsuke | 2010-02-16 07:58:26 -0800 (Tue, 16 Feb 2010) | 1 line bundling makes it easier for caller to handle ConsoleAnnotator ........ r27566 | kohsuke | 2010-02-16 08:49:48 -0800 (Tue, 16 Feb 2010) | 1 line this should work with Runs, not AbstractBuilds ........ r27567 | kohsuke | 2010-02-16 08:54:06 -0800 (Tue, 16 Feb 2010) | 1 line simplified ........ r27578 | kohsuke | 2010-02-16 12:26:11 -0800 (Tue, 16 Feb 2010) | 1 line still a work in progress, but committing once to pull in trunk changes ........ r27586 | kohsuke | 2010-02-16 14:35:37 -0800 (Tue, 16 Feb 2010) | 1 line making more progress ........ r27599 | kohsuke | 2010-02-16 19:22:01 -0800 (Tue, 16 Feb 2010) | 2 lines hooking up the side that writes annotations. still a work in progress. ........ r27603 | kohsuke | 2010-02-16 23:43:35 -0800 (Tue, 16 Feb 2010) | 3 lines what appears to me as the first cut of hooking up the reader side of the annotations. I haven't even run it yet --- this just passed the compilation, and I'm calling it a day. ........ r27606 | kohsuke | 2010-02-17 09:15:16 -0800 (Wed, 17 Feb 2010) | 1 line demo instance hook up ........ r27607 | kohsuke | 2010-02-17 11:27:02 -0800 (Wed, 17 Feb 2010) | 3 lines one more utility method. I never understood what the point of letting the skip method skip less. ........ r27608 | kohsuke | 2010-02-17 11:56:23 -0800 (Wed, 17 Feb 2010) | 3 lines - moved LargeText subtype to its own class - skipping log output was done incorrectly --- it had to skip N bytes where it was skipping N chars. - hooked up console annotations for completed builds. ........ r27609 | kohsuke | 2010-02-17 12:01:46 -0800 (Wed, 17 Feb 2010) | 1 line copyright header ........ r27611 | kohsuke | 2010-02-17 13:18:10 -0800 (Wed, 17 Feb 2010) | 1 line introduced a mechanism to register extension during an unit test. ........ r27616 | kohsuke | 2010-02-17 13:38:12 -0800 (Wed, 17 Feb 2010) | 1 line test case for console annotations ........ r27626 | kohsuke | 2010-02-17 15:23:06 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotator as I write tests as tests ........ r27627 | kohsuke | 2010-02-17 16:06:13 -0800 (Wed, 17 Feb 2010) | 1 line added a multi-phase cooperative locking mechanism useful during the debugging ........ r27628 | kohsuke | 2010-02-17 16:06:41 -0800 (Wed, 17 Feb 2010) | 1 line testing progressive log annotation ........ r27629 | kohsuke | 2010-02-17 16:20:32 -0800 (Wed, 17 Feb 2010) | 1 line adding a test for ConsoleAnnotation that's explicitly placed. ........ r27630 | kohsuke | 2010-02-17 16:23:02 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotation as I write tests as tests ........ r27631 | kohsuke | 2010-02-17 16:28:50 -0800 (Wed, 17 Feb 2010) | 1 line tweaking the abstraction a bit. ........ r27632 | kohsuke | 2010-02-17 16:44:21 -0800 (Wed, 17 Feb 2010) | 1 line parameterized the context type so that this can be used in places other than the build console output, such as polling logs, slave logs, and so on. ........ r27640 | kohsuke | 2010-02-17 17:27:52 -0800 (Wed, 17 Feb 2010) | 1 line bug fix ........ r27654 | kohsuke | 2010-02-17 22:53:04 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27655 | kohsuke | 2010-02-17 22:53:59 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27656 | kohsuke | 2010-02-17 23:10:42 -0800 (Wed, 17 Feb 2010) | 1 line test case for adjacent tags ........ r27687 | kohsuke | 2010-02-19 14:39:21 -0800 (Fri, 19 Feb 2010) | 1 line introduced a facotry and descriptor. This allows them to define configuration pages, allow users to disable/enable them, plus define custom behaviors. ........ r27701 | kohsuke | 2010-02-19 18:23:52 -0800 (Fri, 19 Feb 2010) | 1 line defining a mechanism for ConsoleAnnotatorFactory and ConsoleAnnotationDescriptor to define script.js and have them imported into the console output page ........ r27801 | kohsuke | 2010-02-22 11:59:16 -0800 (Mon, 22 Feb 2010) | 1 line now embedding annotations inside the console output log file. ........ r27816 | kohsuke | 2010-02-22 15:45:04 -0800 (Mon, 22 Feb 2010) | 1 line introduced a convenience method for unit tests ........ r27819 | kohsuke | 2010-02-22 17:37:05 -0800 (Mon, 22 Feb 2010) | 5 lines As an example of using embedded console annotations, implementing Ant target invocation outlines. It might be better to make the concept of outline more generally reusable, so that different kinds of outlines can be placed into the same container element for a single hierarchical representation. Still a work in progress. ........ r27843 | kohsuke | 2010-02-23 16:12:13 -0800 (Tue, 23 Feb 2010) | 1 line for now, disable this for production usage, until I work out a better UI. ........ r27844 | kohsuke | 2010-02-23 19:08:00 -0800 (Tue, 23 Feb 2010) | 1 line started working on annotating exception. ........ r27845 | kohsuke | 2010-02-23 19:08:33 -0800 (Tue, 23 Feb 2010) | 1 line more TODOs for myself ........ r28087 | kohsuke | 2010-03-01 10:03:55 -0800 (Mon, 01 Mar 2010) | 1 line formatting changes ........ r28158 | kohsuke | 2010-03-02 17:00:00 -0800 (Tue, 02 Mar 2010) | 1 line ConsoleAnnotation and ConsoleAnnotator are too confusing. ........ r28159 | kohsuke | 2010-03-02 17:02:02 -0800 (Tue, 02 Mar 2010) | 1 line doc improvement ........ r28160 | kohsuke | 2010-03-02 17:05:14 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvements. ........ r28161 | kohsuke | 2010-03-02 17:11:59 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvement ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@28173 71c3de6d-444a-0410-be80-ed276b4c234a
2010-03-03 23:37:55 +08:00
}
for (ConsoleAnnotationDescriptor d : ConsoleAnnotationDescriptor.all()) {
String path = cp+"/descriptor/"+d.clazz.getName();
[FIXED HUDSON-2137] Merged revisions 27137,27564,27566-27567,27578,27586,27599,27603,27606-27609,27611,27616,27626-27632,27640,27654-27656,27687,27701,27801,27816,27819,27843-27845,28087,28158-28161 via svnmerge from https://www.dev.java.net/svn/hudson/branches/HUDSON-2137 ........ r27137 | kohsuke | 2010-02-08 08:46:16 -0800 (Mon, 08 Feb 2010) | 1 line experimenting with abstractions ........ r27564 | kohsuke | 2010-02-16 07:58:26 -0800 (Tue, 16 Feb 2010) | 1 line bundling makes it easier for caller to handle ConsoleAnnotator ........ r27566 | kohsuke | 2010-02-16 08:49:48 -0800 (Tue, 16 Feb 2010) | 1 line this should work with Runs, not AbstractBuilds ........ r27567 | kohsuke | 2010-02-16 08:54:06 -0800 (Tue, 16 Feb 2010) | 1 line simplified ........ r27578 | kohsuke | 2010-02-16 12:26:11 -0800 (Tue, 16 Feb 2010) | 1 line still a work in progress, but committing once to pull in trunk changes ........ r27586 | kohsuke | 2010-02-16 14:35:37 -0800 (Tue, 16 Feb 2010) | 1 line making more progress ........ r27599 | kohsuke | 2010-02-16 19:22:01 -0800 (Tue, 16 Feb 2010) | 2 lines hooking up the side that writes annotations. still a work in progress. ........ r27603 | kohsuke | 2010-02-16 23:43:35 -0800 (Tue, 16 Feb 2010) | 3 lines what appears to me as the first cut of hooking up the reader side of the annotations. I haven't even run it yet --- this just passed the compilation, and I'm calling it a day. ........ r27606 | kohsuke | 2010-02-17 09:15:16 -0800 (Wed, 17 Feb 2010) | 1 line demo instance hook up ........ r27607 | kohsuke | 2010-02-17 11:27:02 -0800 (Wed, 17 Feb 2010) | 3 lines one more utility method. I never understood what the point of letting the skip method skip less. ........ r27608 | kohsuke | 2010-02-17 11:56:23 -0800 (Wed, 17 Feb 2010) | 3 lines - moved LargeText subtype to its own class - skipping log output was done incorrectly --- it had to skip N bytes where it was skipping N chars. - hooked up console annotations for completed builds. ........ r27609 | kohsuke | 2010-02-17 12:01:46 -0800 (Wed, 17 Feb 2010) | 1 line copyright header ........ r27611 | kohsuke | 2010-02-17 13:18:10 -0800 (Wed, 17 Feb 2010) | 1 line introduced a mechanism to register extension during an unit test. ........ r27616 | kohsuke | 2010-02-17 13:38:12 -0800 (Wed, 17 Feb 2010) | 1 line test case for console annotations ........ r27626 | kohsuke | 2010-02-17 15:23:06 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotator as I write tests as tests ........ r27627 | kohsuke | 2010-02-17 16:06:13 -0800 (Wed, 17 Feb 2010) | 1 line added a multi-phase cooperative locking mechanism useful during the debugging ........ r27628 | kohsuke | 2010-02-17 16:06:41 -0800 (Wed, 17 Feb 2010) | 1 line testing progressive log annotation ........ r27629 | kohsuke | 2010-02-17 16:20:32 -0800 (Wed, 17 Feb 2010) | 1 line adding a test for ConsoleAnnotation that's explicitly placed. ........ r27630 | kohsuke | 2010-02-17 16:23:02 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotation as I write tests as tests ........ r27631 | kohsuke | 2010-02-17 16:28:50 -0800 (Wed, 17 Feb 2010) | 1 line tweaking the abstraction a bit. ........ r27632 | kohsuke | 2010-02-17 16:44:21 -0800 (Wed, 17 Feb 2010) | 1 line parameterized the context type so that this can be used in places other than the build console output, such as polling logs, slave logs, and so on. ........ r27640 | kohsuke | 2010-02-17 17:27:52 -0800 (Wed, 17 Feb 2010) | 1 line bug fix ........ r27654 | kohsuke | 2010-02-17 22:53:04 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27655 | kohsuke | 2010-02-17 22:53:59 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27656 | kohsuke | 2010-02-17 23:10:42 -0800 (Wed, 17 Feb 2010) | 1 line test case for adjacent tags ........ r27687 | kohsuke | 2010-02-19 14:39:21 -0800 (Fri, 19 Feb 2010) | 1 line introduced a facotry and descriptor. This allows them to define configuration pages, allow users to disable/enable them, plus define custom behaviors. ........ r27701 | kohsuke | 2010-02-19 18:23:52 -0800 (Fri, 19 Feb 2010) | 1 line defining a mechanism for ConsoleAnnotatorFactory and ConsoleAnnotationDescriptor to define script.js and have them imported into the console output page ........ r27801 | kohsuke | 2010-02-22 11:59:16 -0800 (Mon, 22 Feb 2010) | 1 line now embedding annotations inside the console output log file. ........ r27816 | kohsuke | 2010-02-22 15:45:04 -0800 (Mon, 22 Feb 2010) | 1 line introduced a convenience method for unit tests ........ r27819 | kohsuke | 2010-02-22 17:37:05 -0800 (Mon, 22 Feb 2010) | 5 lines As an example of using embedded console annotations, implementing Ant target invocation outlines. It might be better to make the concept of outline more generally reusable, so that different kinds of outlines can be placed into the same container element for a single hierarchical representation. Still a work in progress. ........ r27843 | kohsuke | 2010-02-23 16:12:13 -0800 (Tue, 23 Feb 2010) | 1 line for now, disable this for production usage, until I work out a better UI. ........ r27844 | kohsuke | 2010-02-23 19:08:00 -0800 (Tue, 23 Feb 2010) | 1 line started working on annotating exception. ........ r27845 | kohsuke | 2010-02-23 19:08:33 -0800 (Tue, 23 Feb 2010) | 1 line more TODOs for myself ........ r28087 | kohsuke | 2010-03-01 10:03:55 -0800 (Mon, 01 Mar 2010) | 1 line formatting changes ........ r28158 | kohsuke | 2010-03-02 17:00:00 -0800 (Tue, 02 Mar 2010) | 1 line ConsoleAnnotation and ConsoleAnnotator are too confusing. ........ r28159 | kohsuke | 2010-03-02 17:02:02 -0800 (Tue, 02 Mar 2010) | 1 line doc improvement ........ r28160 | kohsuke | 2010-03-02 17:05:14 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvements. ........ r28161 | kohsuke | 2010-03-02 17:11:59 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvement ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@28173 71c3de6d-444a-0410-be80-ed276b4c234a
2010-03-03 23:37:55 +08:00
if (d.hasScript())
buf.append("<script src='").append(path).append("/script.js'></script>");
if (d.hasStylesheet())
buf.append("<link rel='stylesheet' type='text/css' href='").append(path).append("/style.css' />");
[FIXED HUDSON-2137] Merged revisions 27137,27564,27566-27567,27578,27586,27599,27603,27606-27609,27611,27616,27626-27632,27640,27654-27656,27687,27701,27801,27816,27819,27843-27845,28087,28158-28161 via svnmerge from https://www.dev.java.net/svn/hudson/branches/HUDSON-2137 ........ r27137 | kohsuke | 2010-02-08 08:46:16 -0800 (Mon, 08 Feb 2010) | 1 line experimenting with abstractions ........ r27564 | kohsuke | 2010-02-16 07:58:26 -0800 (Tue, 16 Feb 2010) | 1 line bundling makes it easier for caller to handle ConsoleAnnotator ........ r27566 | kohsuke | 2010-02-16 08:49:48 -0800 (Tue, 16 Feb 2010) | 1 line this should work with Runs, not AbstractBuilds ........ r27567 | kohsuke | 2010-02-16 08:54:06 -0800 (Tue, 16 Feb 2010) | 1 line simplified ........ r27578 | kohsuke | 2010-02-16 12:26:11 -0800 (Tue, 16 Feb 2010) | 1 line still a work in progress, but committing once to pull in trunk changes ........ r27586 | kohsuke | 2010-02-16 14:35:37 -0800 (Tue, 16 Feb 2010) | 1 line making more progress ........ r27599 | kohsuke | 2010-02-16 19:22:01 -0800 (Tue, 16 Feb 2010) | 2 lines hooking up the side that writes annotations. still a work in progress. ........ r27603 | kohsuke | 2010-02-16 23:43:35 -0800 (Tue, 16 Feb 2010) | 3 lines what appears to me as the first cut of hooking up the reader side of the annotations. I haven't even run it yet --- this just passed the compilation, and I'm calling it a day. ........ r27606 | kohsuke | 2010-02-17 09:15:16 -0800 (Wed, 17 Feb 2010) | 1 line demo instance hook up ........ r27607 | kohsuke | 2010-02-17 11:27:02 -0800 (Wed, 17 Feb 2010) | 3 lines one more utility method. I never understood what the point of letting the skip method skip less. ........ r27608 | kohsuke | 2010-02-17 11:56:23 -0800 (Wed, 17 Feb 2010) | 3 lines - moved LargeText subtype to its own class - skipping log output was done incorrectly --- it had to skip N bytes where it was skipping N chars. - hooked up console annotations for completed builds. ........ r27609 | kohsuke | 2010-02-17 12:01:46 -0800 (Wed, 17 Feb 2010) | 1 line copyright header ........ r27611 | kohsuke | 2010-02-17 13:18:10 -0800 (Wed, 17 Feb 2010) | 1 line introduced a mechanism to register extension during an unit test. ........ r27616 | kohsuke | 2010-02-17 13:38:12 -0800 (Wed, 17 Feb 2010) | 1 line test case for console annotations ........ r27626 | kohsuke | 2010-02-17 15:23:06 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotator as I write tests as tests ........ r27627 | kohsuke | 2010-02-17 16:06:13 -0800 (Wed, 17 Feb 2010) | 1 line added a multi-phase cooperative locking mechanism useful during the debugging ........ r27628 | kohsuke | 2010-02-17 16:06:41 -0800 (Wed, 17 Feb 2010) | 1 line testing progressive log annotation ........ r27629 | kohsuke | 2010-02-17 16:20:32 -0800 (Wed, 17 Feb 2010) | 1 line adding a test for ConsoleAnnotation that's explicitly placed. ........ r27630 | kohsuke | 2010-02-17 16:23:02 -0800 (Wed, 17 Feb 2010) | 1 line removing test ConsoleAnnotation as I write tests as tests ........ r27631 | kohsuke | 2010-02-17 16:28:50 -0800 (Wed, 17 Feb 2010) | 1 line tweaking the abstraction a bit. ........ r27632 | kohsuke | 2010-02-17 16:44:21 -0800 (Wed, 17 Feb 2010) | 1 line parameterized the context type so that this can be used in places other than the build console output, such as polling logs, slave logs, and so on. ........ r27640 | kohsuke | 2010-02-17 17:27:52 -0800 (Wed, 17 Feb 2010) | 1 line bug fix ........ r27654 | kohsuke | 2010-02-17 22:53:04 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27655 | kohsuke | 2010-02-17 22:53:59 -0800 (Wed, 17 Feb 2010) | 1 line doc improvement ........ r27656 | kohsuke | 2010-02-17 23:10:42 -0800 (Wed, 17 Feb 2010) | 1 line test case for adjacent tags ........ r27687 | kohsuke | 2010-02-19 14:39:21 -0800 (Fri, 19 Feb 2010) | 1 line introduced a facotry and descriptor. This allows them to define configuration pages, allow users to disable/enable them, plus define custom behaviors. ........ r27701 | kohsuke | 2010-02-19 18:23:52 -0800 (Fri, 19 Feb 2010) | 1 line defining a mechanism for ConsoleAnnotatorFactory and ConsoleAnnotationDescriptor to define script.js and have them imported into the console output page ........ r27801 | kohsuke | 2010-02-22 11:59:16 -0800 (Mon, 22 Feb 2010) | 1 line now embedding annotations inside the console output log file. ........ r27816 | kohsuke | 2010-02-22 15:45:04 -0800 (Mon, 22 Feb 2010) | 1 line introduced a convenience method for unit tests ........ r27819 | kohsuke | 2010-02-22 17:37:05 -0800 (Mon, 22 Feb 2010) | 5 lines As an example of using embedded console annotations, implementing Ant target invocation outlines. It might be better to make the concept of outline more generally reusable, so that different kinds of outlines can be placed into the same container element for a single hierarchical representation. Still a work in progress. ........ r27843 | kohsuke | 2010-02-23 16:12:13 -0800 (Tue, 23 Feb 2010) | 1 line for now, disable this for production usage, until I work out a better UI. ........ r27844 | kohsuke | 2010-02-23 19:08:00 -0800 (Tue, 23 Feb 2010) | 1 line started working on annotating exception. ........ r27845 | kohsuke | 2010-02-23 19:08:33 -0800 (Tue, 23 Feb 2010) | 1 line more TODOs for myself ........ r28087 | kohsuke | 2010-03-01 10:03:55 -0800 (Mon, 01 Mar 2010) | 1 line formatting changes ........ r28158 | kohsuke | 2010-03-02 17:00:00 -0800 (Tue, 02 Mar 2010) | 1 line ConsoleAnnotation and ConsoleAnnotator are too confusing. ........ r28159 | kohsuke | 2010-03-02 17:02:02 -0800 (Tue, 02 Mar 2010) | 1 line doc improvement ........ r28160 | kohsuke | 2010-03-02 17:05:14 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvements. ........ r28161 | kohsuke | 2010-03-02 17:11:59 -0800 (Tue, 02 Mar 2010) | 1 line more doc improvement ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@28173 71c3de6d-444a-0410-be80-ed276b4c234a
2010-03-03 23:37:55 +08:00
}
return buf.toString();
}
/**
* Work around for bug 6935026.
*/
public List<String> getLoggerNames() {
while (true) {
try {
List<String> r = new ArrayList<>();
Enumeration<String> e = LogManager.getLogManager().getLoggerNames();
while (e.hasMoreElements())
r.add(e.nextElement());
return r;
} catch (ConcurrentModificationException e) {
// retry
}
}
}
/**
2017-04-11 21:26:45 +08:00
* Used by {@code <f:password/>} so that we send an encrypted value to the client.
*/
public String getPasswordValue(Object o) {
if (o==null) return null;
if (o instanceof Secret) {
StaplerRequest req = Stapler.getCurrentRequest();
if (req != null) {
Item item = req.findAncestorObject(Item.class);
if (item != null && !item.hasPermission(Item.CONFIGURE)) {
return "********";
}
}
return ((Secret) o).getEncryptedValue();
}
if (getIsUnitTest() && !o.equals(PasswordParameterDefinition.DEFAULT_VALUE)) {
throw new SecurityException("attempted to render plaintext " + o + " in password field; use a getter of type Secret instead");
}
return o.toString();
}
public List filterDescriptors(Object context, Iterable descriptors) {
return DescriptorVisibilityFilter.apply(context,descriptors);
}
/**
* Returns true if we are running unit tests.
*/
public static boolean getIsUnitTest() {
return Main.isUnitTest;
}
/**
* Returns {@code true} if the {@link Run#ARTIFACTS} permission is enabled,
* {@code false} otherwise.
*
* <p>When the {@link Run#ARTIFACTS} permission is not turned on using the
* {@code hudson.security.ArtifactsPermission} system property, this
* permission must not be considered to be set to {@code false} for every
* user. It must rather be like if the permission doesn't exist at all
* (which means that every user has to have an access to the artifacts but
* the permission can't be configured in the security screen). Got it?</p>
*/
public static boolean isArtifactsPermissionEnabled() {
return SystemProperties.getBoolean("hudson.security.ArtifactsPermission");
}
/**
* Returns {@code true} if the {@link Item#WIPEOUT} permission is enabled,
* {@code false} otherwise.
*
* <p>The "Wipe Out Workspace" action available on jobs is controlled by the
* {@link Item#BUILD} permission. For some specific projects, however, it is
* not acceptable to let users have this possibility, even it they can
* trigger builds. As such, when enabling the {@code hudson.security.WipeOutPermission}
* system property, a new "WipeOut" permission will allow to have greater
* control on the "Wipe Out Workspace" action.</p>
*/
public static boolean isWipeOutPermissionEnabled() {
return SystemProperties.getBoolean("hudson.security.WipeOutPermission");
}
public static String createRenderOnDemandProxy(JellyContext context, String attributesToCapture) {
return Stapler.getCurrentRequest().createJavaScriptProxy(new RenderOnDemandClosure(context,attributesToCapture));
}
public static String getCurrentDescriptorByNameUrl() {
return Descriptor.getCurrentDescriptorByNameUrl();
}
public static String setCurrentDescriptorByNameUrl(String value) {
String o = getCurrentDescriptorByNameUrl();
Stapler.getCurrentRequest().setAttribute("currentDescriptorByNameUrl", value);
return o;
}
public static void restoreCurrentDescriptorByNameUrl(String old) {
Stapler.getCurrentRequest().setAttribute("currentDescriptorByNameUrl", old);
}
2011-03-27 12:25:32 +08:00
public static List<String> getRequestHeaders(String name) {
List<String> r = new ArrayList<>();
2011-03-27 12:25:32 +08:00
Enumeration e = Stapler.getCurrentRequest().getHeaders(name);
while (e.hasMoreElements()) {
r.add(e.nextElement().toString());
}
return r;
}
/**
* Used for arguments to internationalized expressions to avoid escape
*/
public static Object rawHtml(Object o) {
return o==null ? null : new RawHtmlArgument(o);
}
public static ArrayList<CLICommand> getCLICommands() {
ArrayList<CLICommand> all = new ArrayList<>(CLICommand.all());
Collections.sort(all, new Comparator<CLICommand>() {
public int compare(CLICommand cliCommand, CLICommand cliCommand1) {
return cliCommand.getName().compareTo(cliCommand1.getName());
}
});
return all;
}
/**
* Returns an avatar image URL for the specified user and preferred image size
* @param user the user
* @param avatarSize the preferred size of the avatar image
* @return a URL string
* @since 1.433
*/
public static String getAvatar(User user, String avatarSize) {
return UserAvatarResolver.resolve(user, avatarSize);
}
/**
* @deprecated as of 1.451
* Use {@link #getAvatar}
*/
@Deprecated
public String getUserAvatar(User user, String avatarSize) {
return getAvatar(user,avatarSize);
}
2012-05-31 18:40:58 +08:00
/**
* Returns human readable information about file size
*
* @param size file size in bytes
2012-05-31 18:40:58 +08:00
* @return file size in appropriate unit
*/
public static String humanReadableByteSize(long size){
String measure = "B";
if(size < 1024){
return size + " " + measure;
}
2019-02-21 10:44:55 +08:00
double number = size;
2012-05-31 18:40:58 +08:00
if(number>=1024){
number = number/1024;
measure = "KB";
if(number>=1024){
number = number/1024;
measure = "MB";
if(number>=1024){
number=number/1024;
measure = "GB";
}
}
}
DecimalFormat format = new DecimalFormat("#0.00");
2012-05-31 18:40:58 +08:00
return format.format(number) + " " + measure;
}
/**
* Get a string that can be safely broken to several lines when necessary.
*
2017-04-11 21:26:45 +08:00
* This implementation inserts {@code <wbr>} tags into string. It allows browsers
* to wrap line before any sequence of punctuation characters or anywhere
* in the middle of prolonged sequences of word characters.
*
* @since 1.517
*/
public static String breakableString(final String plain) {
if (plain == null) {
return null;
}
return plain.replaceAll("([\\p{Punct}&&[^;]]+\\w)", "<wbr>$1")
.replaceAll("([^\\p{Punct}\\s-]{20})(?=[^\\p{Punct}\\s-]{10})", "$1<wbr>")
;
}
2013-07-17 12:40:27 +08:00
/**
* Advertises the minimum set of HTTP headers that assist programmatic
* discovery of Jenkins.
*/
public static void advertiseHeaders(HttpServletResponse rsp) {
Jenkins j = Jenkins.getInstanceOrNull();
if (j!=null) {
rsp.setHeader("X-Hudson","1.395");
rsp.setHeader("X-Jenkins", Jenkins.VERSION);
rsp.setHeader("X-Jenkins-Session", Jenkins.SESSION_HASH);
TcpSlaveAgentListener tal = j.tcpSlaveAgentListener;
if (tal != null) { // headers used only by deprecated Remoting-based CLI
int p = tal.getAdvertisedPort();
rsp.setIntHeader("X-Hudson-CLI-Port", p);
rsp.setIntHeader("X-Jenkins-CLI-Port", p);
rsp.setIntHeader("X-Jenkins-CLI2-Port", p);
rsp.setHeader("X-Jenkins-CLI-Host", TcpSlaveAgentListener.CLI_HOST_NAME);
}
2013-07-17 12:40:27 +08:00
}
}
@Restricted(NoExternalUse.class) // for actions.jelly and ContextMenu.add
public static boolean isContextMenuVisible(Action a) {
if (a instanceof ModelObjectWithContextMenu.ContextMenuVisibility) {
return ((ModelObjectWithContextMenu.ContextMenuVisibility) a).isVisible();
} else {
return true;
}
}
}