/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package hudson.plugins.disk_usage; import com.google.common.collect.Lists; import hudson.model.AbstractProject; import hudson.model.Action; import hudson.model.Item; import hudson.model.ItemGroup; import hudson.plugins.disk_usage.unused.DiskUsageItemGroup; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.ServletException; import jenkins.model.Jenkins; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; /** * * @author Lucie Votypkova */ public class DiskUsageItemGroupAction implements Action, DiskUsageItemAction{ private ItemGroup group; private DiskUsageItemGroup diskUsage; public DiskUsageItemGroupAction(DiskUsageItemGroup diskUsage){ this.group = diskUsage.getItemGroup(); this.diskUsage = diskUsage; } public Collection<Item> getItems(){ return group.getItems(); } public DiskUsageItemGroup getDiskUsageItemGroup(){ return diskUsage; } public Collection<String> getUnloadedJobs(){ DiskUsageItemGroup usage = getDiskUsageItemGroup(); return usage.getNotLoadedJobs().keySet(); } public String getDiskUsageOfUnloadedJobeInString(String path){ return DiskUsageUtil.getSizeString(getDiskUsageOfUnloadedJob(path)); } public Long getDiskUsageOfUnloadedJob(String path){ DiskUsageItemGroup usage = getDiskUsageItemGroup(); return usage.getDiskUsageOfNotLoadedJob(path); } public Long getDiskUsageOfUnloadedJobs(){ Long size = 0L; for(Long value : getDiskUsageItemGroup().getNotLoadedJobs().values()){ size += value; } return size; } public String getDiskUsageOfUnloadedJobsInString(){ return DiskUsageUtil.getSizeString(getDiskUsageOfUnloadedJobs()); } public Long getAllDiskUsage(Item item, boolean cashed){ DiskUsageItemAction action = DiskUsageUtil.getDiskUsageItemAction(item); if(action != null){ return action.getAllDiskUsage(cashed); } return 0L; } @Override public Long getAllDiskUsage(boolean cashed) { Long size = getAllDiskUsageNotLoadedJobs(cashed) + this.getAllDiskUsageWithoutBuilds(cashed) + this.getBuildsDiskUsage(null, null, cashed).get("all"); //loaded for(Item item : getItems()){ DiskUsageItemAction action = DiskUsageUtil.getDiskUsageItemAction(item); if(action!=null){ size += action.getAllDiskUsage(cashed); } } return size; } @Override public String getIconFileName() { return "/plugin/disk-usage/icons/diskusage48.png"; } @Override public String getDisplayName() { return "Disk usage overview"; } @Override public String getUrlName() { return "disk-usage"; } public String getSizeInString(Long size){ return DiskUsageUtil.getSizeString(size); } public String getAllDiskUsageInString(boolean cashed) { return DiskUsageUtil.getSizeString(getAllDiskUsage(cashed)); } public Collection<Item> getSubItems() { return group.getItems(); } public Long getDiskUsageLockedBuilds(Item item) throws IOException{ return getDiskUsageBuilds(item, "locked"); } public Long getDiskUsageLockedBuilds() throws IOException { return getDiskUsageBuilds("locked"); } private Long getDiskUsageBuilds(Item item, String type) throws IOException{ DiskUsageItemAction action = DiskUsageUtil.getDiskUsageItemAction(item); if(action!=null){ return DiskUsageUtil.getItemGroupAction((ItemGroup)item).getDiskUsageBuilds(type); } return 0L; } private Long getDiskUsageBuilds(String type) throws IOException{ Long sizeLocked = 0L; for(Item item : getSubItems()){ DiskUsageItemAction action = DiskUsageUtil.getDiskUsageItemAction(item); if(action!=null){ sizeLocked += DiskUsageUtil.getItemGroupAction(group).getDiskUsageBuilds(type); } } return sizeLocked; } public Long getDiskUsageAllBuilds() throws IOException { return getDiskUsageBuilds("all"); } public Long getDiskUsageAllBuilds(Item item) throws IOException{ return getDiskUsageBuilds(item, "all"); } public Long getDiskUsageNotLoadedBuilds() throws IOException{ return getDiskUsageBuilds("notLoaded"); } public Long getDiskUsageNotLoadedBuilds(Item item) throws IOException{ return getDiskUsageBuilds(item, "notLoaded"); } public String getDiskUsageLockedBuildsInString() throws IOException { return DiskUsageUtil.getSizeString(getDiskUsageNotLoadedBuilds()); } public String getDiskUsageAllBuildsInString() throws IOException { return DiskUsageUtil.getSizeString(getDiskUsageAllBuilds()); } public String getDiskUsageNotLoadedInString() throws IOException { return DiskUsageUtil.getSizeString(getDiskUsageNotLoadedBuilds()); } public String getDiskUsageLockedBuildsInString(Item item) throws IOException { return DiskUsageUtil.getSizeString(getDiskUsageNotLoadedBuilds(item)); } public String getDiskUsageAllBuildsInString(Item item) throws IOException { return DiskUsageUtil.getSizeString(getDiskUsageAllBuilds(item)); } public String getDiskUsageNotLoadedInString(Item item) throws IOException { return DiskUsageUtil.getSizeString(getDiskUsageNotLoadedBuilds(item)); } @Override public Map<String,Long> getBuildsDiskUsage(Date older, Date younger, boolean cashed) { if(cashed && older == null && younger ==null){ //it is necessary to grab all information in case of filter, cashed data are without filter return diskUsage.getCaschedDiskUsageBuilds(); } Map<String,Long> usage = new HashMap<String,Long>(); addAllBuildsDiskUsage(usage, older, younger, cashed); diskUsage.setCaschedDiskUsageBuilds(usage); return usage; } public void addAllBuildsDiskUsage(Map<String,Long> usage, Date older, Date younger, boolean cashed) { for(Item item : getItems() ){ DiskUsageItemAction action = DiskUsageUtil.getDiskUsageItemAction(item); if(action!=null){ Map<String,Long> projectUsage = action.getBuildsDiskUsage(older, younger, cashed); for(String type: projectUsage.keySet()){ Long size = projectUsage.get(type); Long sizeCounted = usage.get(type); if(sizeCounted!=null){ size += sizeCounted; } usage.put(type, size); continue; } } } } public Map<String, Long> getBuildsDiskUsage(Item item, Date older, Date younger, boolean cashed) throws IOException { DiskUsageItemAction action = DiskUsageUtil.getDiskUsageItemAction(item); if(action!=null){ return DiskUsageUtil.getDiskUsageItemAction(item).getBuildsDiskUsage(older, younger, cashed); } return Collections.EMPTY_MAP; } @Override public Long getAllDiskUsageWorkspace(boolean cashed){ if(cashed){ return diskUsage.getCashedDiskUsageWorkspaces(); } Long size = 0L; for(Item item : getItems()){ DiskUsageItemAction action = DiskUsageUtil.getDiskUsageItemAction(item); if(action!=null){ size += action.getAllDiskUsageWorkspace(cashed); } } diskUsage.setCashedDiskUsageWorkspaces(size); return size; } public Long getDiskUsageWithoutBuilds(Item item, boolean cashed){ DiskUsageItemAction action = DiskUsageUtil.getDiskUsageItemAction(item); if(action!=null){ return action.getAllDiskUsageWithoutBuilds(cashed); } return 0L; } public Long getAllDiskUsageWorkspace(Item item, boolean cashed){ DiskUsageItemAction action = DiskUsageUtil.getDiskUsageItemAction(item); if(action!=null){ return action.getAllDiskUsageWorkspace(cashed); } return 0L; } public Long getAllCustomOrNonSlaveWorkspaces(Item item, boolean cashed){ DiskUsageItemAction action = DiskUsageUtil.getDiskUsageItemAction(item); if(action!=null){ return action.getAllCustomOrNonSlaveWorkspaces(cashed); } return 0L; } public void doFilter(StaplerRequest req, StaplerResponse rsp) throws ServletException, IOException{ Date older = DiskUsageUtil.getDate(req.getParameter("older"), req.getParameter("olderUnit")); Date younger = DiskUsageUtil.getDate(req.getParameter("younger"), req.getParameter("youngerUnit")); req.setAttribute("filter", "filter"); req.setAttribute("older", older); req.setAttribute("younger", younger); req.getView(this, "index.jelly").forward(req, rsp); } @Override public Long getAllCustomOrNonSlaveWorkspaces(boolean cashed){ if(cashed){ return diskUsage.getCashedDiskUsageCustomWorkspaces(); } Long size = 0L; for(Item item : getItems()){ DiskUsageItemAction action = DiskUsageUtil.getDiskUsageItemAction(item); if(action!=null){ size += action.getAllCustomOrNonSlaveWorkspaces(cashed); } } diskUsage.setCashedDiskUsageCustomWorkspaces(size); return size; } public Long getAllDiskUsageNotLoadedJobs(boolean cashed){ if(cashed){ return diskUsage.getCashedDiskUsageNotLoadedJobs(); } Long size = diskUsage.getDiskUsageOfNotLoadedJobs(cashed); for(Item item : getItems()){ if(item instanceof ItemGroup){ DiskUsageItemGroupAction action = DiskUsageUtil.getItemGroupAction((ItemGroup)item); size += action.getAllDiskUsageNotLoadedJobs(cashed); } } diskUsage.setCashedDiskUsageNotLoadedJobs(size); return size; } @Override public void actualizeCashedData() { actualizeCashedData(true); } private void actualizeCashedData(boolean parent) { diskUsage.setCaschedDiskUsageBuilds(getBuildsDiskUsage(null, null, false)); diskUsage.setCashedDiskUsageCustomWorkspaces(getAllCustomOrNonSlaveWorkspaces(false)); diskUsage.setCashedDiskUsageNotLoadedJobs(getAllDiskUsageNotLoadedJobs(false)); diskUsage.setCashedDiskUsageWithoutBuilds(getAllDiskUsageWithoutBuilds(false)); diskUsage.setCashedDiskUsageWorkspaces(getAllDiskUsageWorkspace(false)); if(group instanceof Item){ Item item = (Item) group; if(item.getParent() != null && parent){ DiskUsageUtil.getItemGroupAction(item.getParent()).actualizeCashedData(); } } } @Override public Long getAllDiskUsageWithoutBuilds(boolean cashed) { if(cashed){ return diskUsage.getCashedDiskUsageWithoutBuilds(); } Long size = 0L; if(group instanceof AbstractProject){ AbstractProject project = (AbstractProject) group; size += project.getAction(ProjectDiskUsageAction.class).getDiskUsage().getDiskUsageWithoutBuilds(); } for(Item item : getItems()){ DiskUsageItemAction action = DiskUsageUtil.getDiskUsageItemAction(item); size += action.getAllDiskUsageWithoutBuilds(cashed); } diskUsage.setCashedDiskUsageWithoutBuilds(size); return size; } public boolean hasAdministrativePermission(){ return Jenkins.getInstance().hasPermission(Jenkins.ADMINISTER); } @Override public void actualizeCashedBuildsData() { diskUsage.setCaschedDiskUsageBuilds(getBuildsDiskUsage(null, null, false)); if(group instanceof Item){ Item item = (Item) group; if(item.getParent() != null){ DiskUsageUtil.getItemGroupAction(item.getParent()).actualizeCashedBuildsData(); } } } @Override public void actualizeCashedWorkspaceData() { diskUsage.setCashedDiskUsageWorkspaces(getAllDiskUsageWorkspace(false)); if(group instanceof Item){ Item item = (Item) group; if(item.getParent() != null){ DiskUsageUtil.getItemGroupAction(item.getParent()).actualizeCashedWorkspaceData(); } } } @Override public void actualizeCashedNotCustomWorkspaceData() { diskUsage.setCashedDiskUsageCustomWorkspaces(getAllCustomOrNonSlaveWorkspaces(false)); if(group instanceof Item){ Item item = (Item) group; if(item.getParent() != null){ DiskUsageUtil.getItemGroupAction(item.getParent()).actualizeCashedNotCustomWorkspaceData(); } } } @Override public void actualizeCashedJobWithoutBuildsData() { diskUsage.setCashedDiskUsageWithoutBuilds(getAllDiskUsageWithoutBuilds(false)); if(group instanceof Item){ Item item = (Item) group; if(item.getParent() != null){ DiskUsageUtil.getItemGroupAction(item.getParent()).actualizeCashedJobWithoutBuildsData(); } } } public void actualizeCashedNotLoadedJobsData() { diskUsage.setCashedDiskUsageNotLoadedJobs(getAllDiskUsageNotLoadedJobs(false)); if(group instanceof Item){ Item item = (Item) group; if(item.getParent() != null){ DiskUsageUtil.getItemGroupAction(item.getParent()).actualizeCashedNotLoadedJobsData(); } } } @Override public void actualizeAllCashedDate() { actualizeCashedNotLoadedJobsData(); actualizeCashedJobWithoutBuildsData(); actualizeCashedNotCustomWorkspaceData(); actualizeCashedWorkspaceData(); actualizeCashedBuildsData(); } }