/*
* The MIT License
*
* Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Yahoo! Inc.
*
* 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.model;
import org.kohsuke.stapler.StaplerRequest;
import java.io.IOException;
import java.util.Collection;
import hudson.search.SearchableModelObject;
import hudson.security.Permission;
import hudson.security.PermissionGroup;
import hudson.security.AccessControlled;
/**
* Basic configuration unit in Hudson.
*
* <p>
* Every {@link Item} is hosted in an {@link ItemGroup} called "parent",
* and some {@link Item}s are {@link ItemGroup}s. This form a tree
* structure, which is rooted at {@link Hudson}.
*
* <p>
* Unlike file systems, where a file can be moved from one directory
* to another, {@link Item} inherently belongs to a single {@link ItemGroup}
* and that relationship will not change.
* Think of
* <a href="http://images.google.com/images?q=Windows%20device%20manager">Windows device manager</a>
* — an HDD always show up under 'Disk drives' and it can never be moved to another parent.
*
* Similarly, {@link ItemGroup} is not a generic container. Each subclass
* of {@link ItemGroup} can usually only host a certain limited kinds of
* {@link Item}s.
*
* <p>
* {@link Item}s have unique {@link #getName() name}s that distinguish themselves
* among their siblings uniquely. The names can be combined by '/' to form an
* item full name, which uniquely identifies an {@link Item} inside the whole {@link Hudson}.
*
* @author Kohsuke Kawaguchi
* @see Items
*/
public interface Item extends PersistenceRoot, SearchableModelObject, AccessControlled {
/**
* Gets the parent that contains this item.
*/
ItemGroup<? extends Item> getParent();
/**
* Gets all the jobs that this {@link Item} contains as descendants.
*/
abstract Collection<? extends Job> getAllJobs();
/**
* Gets the name of the item.
*
* <p>
* The name must be unique among other {@link Item}s that belong
* to the same parent.
*
* <p>
* This name is also used for directory name, so it cannot contain
* any character that's not allowed on the file system.
*
* @see #getFullName()
*/
String getName();
/**
* Gets the full name of this item, like "abc/def/ghi".
*
* <p>
* Full name consists of {@link #getName() name}s of {@link Item}s
* that lead from the root {@link Hudson} to this {@link Item},
* separated by '/'. This is the unique name that identifies this
* {@link Item} inside the whole {@link Hudson}.
*
* @see Hudson#getItemByFullName(String,Class)
*/
String getFullName();
/**
* Gets the human readable short name of this item.
*
* <p>
* This method should try to return a short concise human
* readable string that describes this item.
* The string need not be unique.
*
* <p>
* The returned string should not include the display names
* of {@link #getParent() ancestor items}.
*/
String getDisplayName();
/**
* Works like {@link #getDisplayName()} but return
* the full path that includes all the display names
* of the ancestors.
*/
String getFullDisplayName();
/**
* Returns the URL of this item relative to the context root of the application.
*
* @see AbstractItem#getUrl() for how to implement this.
*
* @return
* URL that ends with '/'.
*/
String getUrl();
/**
* Returns the URL of this item relative to the parent {@link ItemGroup}.
* @see AbstractItem#getShortUrl() for how to implement this.
*
* @return
* URL that ends with '/'.
*/
String getShortUrl();
/**
* Returns the absolute URL of this item. This relies on the current
* {@link StaplerRequest} to figure out what the host name is,
* so can be used only during processing client requests.
*
* @return
* absolute URL.
* @throws IllegalStateException
* if the method is invoked outside the HTTP request processing.
*
* @deprecated
* This method shall <b>NEVER</b> be used during HTML page rendering, as it won't work with
* network set up like Apache reverse proxy.
* This method is only intended for the remote API clients who cannot resolve relative references
* (even this won't work for the same reason, which should be fixed.)
*/
String getAbsoluteUrl();
/**
* Called right after when a {@link Item} is loaded from disk.
* This is an opporunity to do a post load processing.
*
* @param name
* Name of the directory (not a path --- just the name portion) from
* which the configuration was loaded. This usually becomes the
* {@link #getName() name} of this item.
*/
void onLoad(ItemGroup<? extends Item> parent, String name) throws IOException;
/**
* When a {@link Item} is copied from existing one,
* the files are first copied on the file system,
* then it will be loaded, then this method will be invoked
* to perform any implementation-specific work.
*/
void onCopiedFrom(Item src);
/**
* When an item is created from scratch (instead of copied),
* this method will be invoked. Used as the post-construction initialization.
*/
void onCreatedFromScratch();
/**
* Save the settings to a file.
*
* Use {@link Items#getConfigFile(Item)}
* or {@link AbstractItem#getConfigFile()} to obtain the file
* to save the data.
*/
public void save() throws IOException;
/**
* Deletes this item.
*/
public void delete() throws IOException, InterruptedException;
public static final PermissionGroup PERMISSIONS = new PermissionGroup(Item.class,Messages._Item_Permissions_Title());
public static final Permission CREATE = new Permission(PERMISSIONS, "Create", null, Permission.CREATE);
public static final Permission DELETE = new Permission(PERMISSIONS, "Delete", null, Permission.DELETE);
public static final Permission CONFIGURE = new Permission(PERMISSIONS, "Configure", null, Permission.CONFIGURE);
public static final Permission READ = new Permission(PERMISSIONS, "Read", null, Permission.READ);
public static final Permission EXTENDED_READ = new Permission(PERMISSIONS,"ExtendedRead", Messages._AbstractProject_ExtendedReadPermission_Description(), CONFIGURE, Boolean.getBoolean("hudson.security.ExtendedReadPermission"));
public static final Permission BUILD = new Permission(PERMISSIONS, "Build", Messages._AbstractProject_BuildPermission_Description(), Permission.UPDATE);
public static final Permission WORKSPACE = new Permission(PERMISSIONS, "Workspace", Messages._AbstractProject_WorkspacePermission_Description(), Permission.READ);
}