/** * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at the * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Initial code contributed and copyrighted by<br> * frentix GmbH, http://www.frentix.com * <p> */ package org.olat.admin.version; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.ArrayList; import java.util.BitSet; import java.util.Collections; import java.util.List; import java.util.Locale; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.table.DefaultColumnDescriptor; import org.olat.core.gui.components.table.StaticColumnDescriptor; import org.olat.core.gui.components.table.Table; import org.olat.core.gui.components.table.TableController; import org.olat.core.gui.components.table.TableDataModel; import org.olat.core.gui.components.table.TableEvent; import org.olat.core.gui.components.table.TableGuiConfiguration; import org.olat.core.gui.components.table.TableMultiSelectEvent; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.util.vfs.version.OrphanVersion; import org.olat.core.util.vfs.version.VFSRevision; import org.olat.core.util.vfs.version.VersionsManager; /** * * Description:<br> * List all orphans * * <P> * Initial Date: 5 mai 2011 <br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ //fxdiff FXOLAT-127: file versions maintenance tool public class OrphanVersionsController extends BasicController { private static final String CMD_DELETE = "delete"; private final static DecimalFormat sizeFormat = new DecimalFormat("#0.#", new DecimalFormatSymbols(Locale.ENGLISH)); private TableController tableCtr; private final List<OrphanVersion> orphans; public OrphanVersionsController(UserRequest ureq, WindowControl wControl, List<OrphanVersion> orphans) { super(ureq, wControl); TableGuiConfiguration tableConfig = new TableGuiConfiguration(); tableConfig.setTableEmptyMessage(translate("table.empty")); tableConfig.setDownloadOffered(true); tableConfig.setMultiSelect(true); this.orphans = orphans; tableCtr = new TableController(tableConfig, ureq, getWindowControl(), getTranslator()); tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.file", 0, null, getLocale())); tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.versions", 1, null, getLocale())); tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.size", 2, null, getLocale())); tableCtr.addColumnDescriptor(new StaticColumnDescriptor(CMD_DELETE, "delete", translate("delete"))); tableCtr.setTableDataModel(new OrphanTableModel(orphans)); tableCtr.addMultiSelectAction("delete", CMD_DELETE); listenTo(tableCtr); putInitialPanel(tableCtr.getInitialComponent()); } @Override protected void doDispose() { // } @Override protected void event(UserRequest ureq, Component source, Event event) { // } @Override protected void event(UserRequest ureq, Controller source, Event event) { if(source == tableCtr) { if (event.getCommand().equals(Table.COMMANDLINK_ROWACTION_CLICKED)) { TableEvent te = (TableEvent) event; String actionid = te.getActionId(); int rowid = te.getRowId(); OrphanVersion orphan = (OrphanVersion) tableCtr.getTableDataModel().getObject(rowid); if (actionid.equals(CMD_DELETE)) { VersionsManager.getInstance().delete(orphan); orphans.remove(orphan); tableCtr.modelChanged(); } } else if (event.getCommand().equals(Table.COMMAND_MULTISELECT)) { // Multiselect events TableMultiSelectEvent tmse = (TableMultiSelectEvent) event; BitSet selectedOrphans = tmse.getSelection(); String actionid = tmse.getAction(); if (CMD_DELETE.equals(actionid)) { List<OrphanVersion> toRemove = new ArrayList<OrphanVersion>(); for (int i=selectedOrphans.nextSetBit(0); i >= 0; i=selectedOrphans.nextSetBit(i+1)) { int rowCount = tableCtr.getTableDataModel().getRowCount(); if(i >= 0 && i < rowCount) { OrphanVersion orphan = (OrphanVersion)tableCtr.getTableDataModel().getObject(i); VersionsManager.getInstance().delete(orphan); toRemove.add(orphan); } } for(OrphanVersion orphan:toRemove) { orphans.remove(orphan); } tableCtr.setTableDataModel(new OrphanTableModel(orphans)); tableCtr.modelChanged(); } } } } private class OrphanTableModel implements TableDataModel<OrphanVersion> { private List<OrphanVersion> orphanList; public OrphanTableModel(List<OrphanVersion> orphans) { this.orphanList = orphans; } @Override public int getColumnCount() { return 3; } @Override public int getRowCount() { return orphanList.size(); } @Override public Object getValueAt(int row, int col) { OrphanVersion orphan = getObject(row); switch(col) { case 0: return orphan.getOriginalFilePath(); case 1: { return orphan.getVersions().getRevisions().size(); } case 2: { List<VFSRevision> versions = orphan.getVersions().getRevisions(); long size = 0l; for(VFSRevision revision:versions) { size += revision.getSize(); } String unit = "KB"; double humanSize = size / 1024.0d; if(humanSize > 1024) { humanSize /= 1024; unit = "MB"; } return sizeFormat.format(humanSize) + " " + unit; } default: return "ERROR"; } } @Override public OrphanVersion getObject(int row) { return orphanList.get(row); } @Override public void setObjects(List<OrphanVersion> objects) { orphanList = objects; } @Override public Object createCopyWithEmptyList() { return new OrphanTableModel(Collections.<OrphanVersion>emptyList()); } } }