001/* 002 * This library is part of OpenCms - 003 * the Open Source Content Management System 004 * 005 * Copyright (c) Alkacon Software GmbH & Co. KG (http://www.alkacon.com) 006 * 007 * This library is free software; you can redistribute it and/or 008 * modify it under the terms of the GNU Lesser General Public 009 * License as published by the Free Software Foundation; either 010 * version 2.1 of the License, or (at your option) any later version. 011 * 012 * This library is distributed in the hope that it will be useful, 013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 015 * Lesser General Public License for more details. 016 * 017 * For further information about Alkacon Software, please see the 018 * company website: http://www.alkacon.com 019 * 020 * For further information about OpenCms, please see the 021 * project website: http://www.opencms.org 022 * 023 * You should have received a copy of the GNU Lesser General Public 024 * License along with this library; if not, write to the Free Software 025 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 026 */ 027 028package org.opencms.ui.apps.filehistory; 029 030import org.opencms.configuration.CmsSystemConfiguration; 031import org.opencms.file.CmsObject; 032import org.opencms.main.CmsLog; 033import org.opencms.main.OpenCms; 034import org.opencms.report.A_CmsReportThread; 035import org.opencms.ui.A_CmsUI; 036import org.opencms.ui.CmsVaadinUtils; 037import org.opencms.ui.apps.Messages; 038import org.opencms.ui.components.CmsDateField; 039import org.opencms.ui.components.CmsErrorDialog; 040import org.opencms.ui.report.CmsReportDialog; 041import org.opencms.util.CmsStringUtil; 042import org.opencms.util.CmsUUID; 043 044import java.util.ArrayList; 045import java.util.List; 046 047import org.apache.commons.logging.Log; 048 049import com.vaadin.ui.Button; 050import com.vaadin.ui.Button.ClickEvent; 051import com.vaadin.ui.Button.ClickListener; 052import com.vaadin.ui.Notification; 053import com.vaadin.ui.Notification.Type; 054import com.vaadin.ui.Panel; 055import com.vaadin.v7.data.Property.ValueChangeEvent; 056import com.vaadin.v7.data.Property.ValueChangeListener; 057import com.vaadin.v7.data.util.BeanItemContainer; 058import com.vaadin.v7.shared.ui.label.ContentMode; 059import com.vaadin.v7.ui.AbstractSelect.NewItemHandler; 060import com.vaadin.v7.ui.ComboBox; 061import com.vaadin.v7.ui.Label; 062import com.vaadin.v7.ui.OptionGroup; 063import com.vaadin.v7.ui.VerticalLayout; 064 065/** 066 * Class for the clear file history dialog and execution.<p> 067 */ 068public class CmsFileHistoryPanel extends VerticalLayout { 069 070 /** 071 * Bean for the elements of the combo box for number of version option.<p> 072 */ 073 public class ComboBoxVersionsBean { 074 075 /**Value of item.*/ 076 private int m_val; 077 078 /** 079 * public constructor.<p> 080 * 081 * @param value of item 082 */ 083 public ComboBoxVersionsBean(int value) { 084 085 m_val = value; 086 } 087 088 /** 089 * @see java.lang.Object#equals(java.lang.Object) 090 */ 091 @Override 092 public boolean equals(Object o) { 093 094 if (o instanceof ComboBoxVersionsBean) { 095 return ((ComboBoxVersionsBean)o).getValue() == m_val; 096 } 097 return false; 098 } 099 100 /** 101 * Getter for display String to be displayed in combo box.<p> 102 * 103 * @return String to be displayed 104 */ 105 public String getDisplayValue() { 106 107 if (m_val == CmsFileHistoryApp.NUMBER_VERSIONS_DISABLED) { 108 return CmsVaadinUtils.getMessageText(Messages.GUI_FILEHISTORY_SETTINGS_VERSIONS_DISABLED_0); 109 } 110 if (m_val == CmsFileHistoryApp.NUMBER_VERSIONS_UNLIMITED) { 111 return CmsVaadinUtils.getMessageText(Messages.GUI_FILEHISTORY_SETTINGS_VERSIONS_UNLIMITED_0); 112 } 113 return String.valueOf(m_val); 114 } 115 116 /** 117 * Getter for (int) value of item.<p> 118 * 119 * @return int value 120 */ 121 public int getValue() { 122 123 return m_val; 124 } 125 126 /** 127 * @see java.lang.Object#hashCode() 128 */ 129 @Override 130 public int hashCode() { 131 132 return CmsUUID.getNullUUID().hashCode(); 133 } 134 } 135 136 /** Logger instance for this class. */ 137 private static final Log LOG = CmsLog.getLog(CmsFileHistoryPanel.class); 138 139 /**vaadin serial id.*/ 140 private static final long serialVersionUID = 1484327372474823882L; 141 142 /**Option for maximal count of versions.*/ 143 private static final int VERSIONS_MAX = 50; 144 145 /** Button for cleaning up publish history. */ 146 protected Button m_cleanupPublishHistory; 147 148 /**Vaadin component.*/ 149 ComboBox m_numberVersionsToKeep; 150 151 /**Vaadin component.*/ 152 private CmsDateField m_dateField; 153 154 /**Vaadin component.*/ 155 private OptionGroup m_deleteMode; 156 157 /**Vaadin component.*/ 158 private Button m_ok; 159 160 /**Vaadin component.*/ 161 private Panel m_optionPanel; 162 163 /**Vaadin component.*/ 164 private Label m_settedVersions; 165 166 /**Vaadin component.*/ 167 private Button m_edit; 168 169 /**Vaadin component.*/ 170 private OptionGroup m_mode; 171 172 /**Vaadin component.*/ 173 private ComboBox m_numberVersions; 174 175 /** * 176 177 * public constructor.<p> 178 * 179 * @param app instance of calling app 180 */ 181 public CmsFileHistoryPanel() { 182 183 CmsVaadinUtils.readAndLocalizeDesign(this, CmsVaadinUtils.getWpMessagesForCurrentLocale(), null); 184 185 //Setup ui components 186 setupVersionSettingsLabel(); 187 setupVersionsToKeepComboBox(); 188 setupDeleteModeOptions(); 189 190 m_ok.addClickListener(new ClickListener() { 191 192 private static final long serialVersionUID = -6314367378702836242L; 193 194 public void buttonClick(ClickEvent event) { 195 196 startCleanAndShowReport(); 197 } 198 }); 199 m_cleanupPublishHistory.addClickListener(evt -> runPublishHistoryCleanup()); 200 m_edit.setEnabled(false); 201 202 setupVersionComboBox(); 203 setupModeOptions(); 204 205 ValueChangeListener changeListener = new ValueChangeListener() { 206 207 /**vaadin serial id.*/ 208 private static final long serialVersionUID = -6003215873244541851L; 209 210 public void valueChange(ValueChangeEvent event) { 211 212 setButtonEnabled(true); 213 } 214 }; 215 216 m_numberVersions.addValueChangeListener(changeListener); 217 218 m_mode.addValueChangeListener(changeListener); 219 220 m_edit.addClickListener(new ClickListener() { 221 222 private static final long serialVersionUID = 161296255232053110L; 223 224 public void buttonClick(ClickEvent event) { 225 226 if (saveOptions()) { 227 setButtonEnabled(false); 228 } else { 229 String message = CmsVaadinUtils.getMessageText(Messages.GUI_FILEHISTORY_SETTINGS_INVALID_0); 230 Notification.show(message, Type.ERROR_MESSAGE); 231 } 232 } 233 }); 234 } 235 236 /** 237 * Sets the edit button enabled or disabled.<p> 238 * 239 * @param enable state of button 240 */ 241 protected void setButtonEnabled(boolean enable) { 242 243 m_edit.setEnabled(enable); 244 } 245 246 /** 247 * Saves the options.<p> 248 * 249 * @return Path to be called in app. 250 */ 251 boolean saveOptions() { 252 253 //Enable history? 254 boolean enabled = ((ComboBoxVersionsBean)m_numberVersions.getValue()).getValue() != CmsFileHistoryApp.NUMBER_VERSIONS_DISABLED; 255 256 //Maximal count of versions for current resources. 257 int versions = ((ComboBoxVersionsBean)m_numberVersions.getValue()).getValue(); 258 259 //Maximal count of versions for deleted resources. 260 int versionsDeleted = versions; 261 262 if (m_mode.getValue().equals(CmsFileHistoryApp.MODE_DISABLED)) { 263 versionsDeleted = 0; 264 } 265 if (m_mode.getValue().equals(CmsFileHistoryApp.MODE_WITHOUTVERSIONS)) { 266 versionsDeleted = 1; 267 } 268 269 if (m_mode.getValue().equals(CmsFileHistoryApp.MODE_WITHVERSIONS) 270 && (versions == CmsFileHistoryApp.NUMBER_VERSIONS_DISABLED)) { 271 return false; 272 } 273 OpenCms.getSystemInfo().setVersionHistorySettings(enabled, versions, versionsDeleted); 274 OpenCms.writeConfiguration(CmsSystemConfiguration.class); 275 276 return true; 277 } 278 279 /** 280 * Starts the clean thread and shows the report.<p> 281 */ 282 void startCleanAndShowReport() { 283 284 //Start clean process in thread 285 A_CmsReportThread thread = makeThread(); 286 String title = CmsVaadinUtils.getMessageText(Messages.GUI_FILEHISTORY_CLEAR_REPORT_TITLE_0); 287 CmsReportDialog.showReportDialog(title, thread); 288 } 289 290 /** 291 * Starts the thread for deleting versions.<p> 292 * 293 * @return started thread 294 */ 295 private A_CmsReportThread makeThread() { 296 297 //Maximal count of versions for current resources. 298 int versions = ((Integer)m_numberVersionsToKeep.getValue()).intValue(); 299 300 //Maximal count of versions for deleted resources. 301 int versionsDeleted = versions; 302 303 if (m_deleteMode.getValue().equals(CmsFileHistoryApp.MODE_DISABLED)) { 304 versionsDeleted = 0; 305 } 306 if (m_deleteMode.getValue().equals(CmsFileHistoryApp.MODE_WITHOUTVERSIONS)) { 307 versionsDeleted = 1; 308 } 309 310 long date = m_dateField.getValue() != null ? m_dateField.getDate().getTime() : 0; 311 312 CmsHistoryClearThread thread = new CmsHistoryClearThread( 313 A_CmsUI.getCmsObject(), 314 versions, 315 versionsDeleted, 316 date); 317 return thread; 318 } 319 320 /** 321 * Runs the publish history cleanup. 322 */ 323 private void runPublishHistoryCleanup() { 324 325 final CmsObject cms = A_CmsUI.getCmsObject(); 326 try { 327 int numRemoved = OpenCms.getPublishManager().cleanupPublishHistory(cms); 328 Notification notification = new Notification( 329 CmsVaadinUtils.getMessageText(Messages.GUI_FILEHISTORY_CLEANED_PUBLISH_HISTORY_1, numRemoved), 330 Notification.Type.HUMANIZED_MESSAGE); 331 notification.setDelayMsec(Notification.DELAY_FOREVER); 332 notification.show(A_CmsUI.get().getPage()); 333 } catch (Exception e) { 334 LOG.error(e.getLocalizedMessage(), e); 335 CmsErrorDialog.showErrorDialog(e); 336 } 337 338 } 339 340 /** 341 * Sets up the OptionGroup for the mode for deleted resources.<p> 342 */ 343 private void setupDeleteModeOptions() { 344 345 int versionsDeleted = OpenCms.getSystemInfo().getHistoryVersionsAfterDeletion(); 346 347 String mode; 348 349 if (versionsDeleted == 0) { 350 mode = CmsFileHistoryApp.MODE_DISABLED; 351 } else if (versionsDeleted == 1) { 352 mode = CmsFileHistoryApp.MODE_WITHOUTVERSIONS; 353 } else if ((versionsDeleted > 1) || (versionsDeleted == -1)) { 354 mode = CmsFileHistoryApp.MODE_WITHVERSIONS; 355 } else { 356 mode = CmsFileHistoryApp.MODE_DISABLED; 357 } 358 m_deleteMode.setValue(mode); 359 } 360 361 /** 362 * Sets up the OptionGroup for the mode.<p> 363 */ 364 private void setupModeOptions() { 365 366 int versionsDeleted = OpenCms.getSystemInfo().getHistoryVersionsAfterDeletion(); 367 368 String mode; 369 370 if (versionsDeleted == 0) { 371 mode = CmsFileHistoryApp.MODE_DISABLED; 372 } else if (versionsDeleted == 1) { 373 mode = CmsFileHistoryApp.MODE_WITHOUTVERSIONS; 374 } else if ((versionsDeleted > 1) || (versionsDeleted == -1)) { 375 mode = CmsFileHistoryApp.MODE_WITHVERSIONS; 376 } else { 377 mode = CmsFileHistoryApp.MODE_DISABLED; 378 } 379 m_mode.setValue(mode); 380 } 381 382 /** 383 * Fills the combo box to choose the number of versions which shouls be stored.<p> 384 */ 385 private void setupVersionComboBox() { 386 387 //Setup beans 388 List<ComboBoxVersionsBean> beans = new ArrayList<ComboBoxVersionsBean>(); 389 390 //Disabled 391 beans.add(new ComboBoxVersionsBean(CmsFileHistoryApp.NUMBER_VERSIONS_DISABLED)); 392 393 //1-10 394 for (int i = 1; i <= 10; i++) { 395 beans.add(new ComboBoxVersionsBean(i)); 396 } 397 398 //15-50 399 for (int i = 15; i <= 50; i += 5) { 400 beans.add(new ComboBoxVersionsBean(i)); 401 } 402 403 //Unlimited 404 beans.add(new ComboBoxVersionsBean(CmsFileHistoryApp.NUMBER_VERSIONS_UNLIMITED)); 405 406 BeanItemContainer<ComboBoxVersionsBean> objects = new BeanItemContainer<ComboBoxVersionsBean>( 407 ComboBoxVersionsBean.class, 408 beans); 409 m_numberVersions.setContainerDataSource(objects); 410 m_numberVersions.setItemCaptionPropertyId("displayValue"); 411 412 m_numberVersions.setNullSelectionAllowed(false); 413 m_numberVersions.setTextInputAllowed(false); 414 m_numberVersions.setPageLength(beans.size()); 415 416 int numberHistoryVersions = OpenCms.getSystemInfo().getHistoryVersions(); 417 418 m_numberVersions.setValue(beans.get(beans.indexOf(new ComboBoxVersionsBean(numberHistoryVersions)))); 419 } 420 421 /** 422 * Sets the label showing maximal version number from settings.<p> 423 */ 424 private void setupVersionSettingsLabel() { 425 426 int numberHistoryVersions = OpenCms.getSystemInfo().getHistoryVersions(); 427 428 //Convert int number to readable Text 429 String numberString = String.valueOf(numberHistoryVersions); 430 if (numberHistoryVersions == CmsFileHistoryApp.NUMBER_VERSIONS_DISABLED) { 431 numberString = CmsVaadinUtils.getMessageText(Messages.GUI_FILEHISTORY_SETTINGS_VERSIONS_DISABLED_0); 432 } 433 if (numberHistoryVersions == CmsFileHistoryApp.NUMBER_VERSIONS_UNLIMITED) { 434 numberString = CmsVaadinUtils.getMessageText(Messages.GUI_FILEHISTORY_SETTINGS_VERSIONS_UNLIMITED_0); 435 } 436 m_settedVersions.setContentMode(ContentMode.HTML); 437 m_settedVersions.setValue( 438 CmsVaadinUtils.getMessageText(Messages.GUI_FILEHISTORY_DELETE_VERSIONINFO_1, numberString)); 439 } 440 441 /** 442 * Sets up the combo box for the amount of versions to keep.<p> 443 */ 444 private void setupVersionsToKeepComboBox() { 445 446 final List<Integer> items = new ArrayList<Integer>(); 447 448 //Add default values to ComboBox 449 for (int i = 0; i < 10; i++) { 450 m_numberVersionsToKeep.addItem(Integer.valueOf(i)); 451 items.add(Integer.valueOf(i)); 452 } 453 for (int i = 10; i <= VERSIONS_MAX; i += 5) { 454 m_numberVersionsToKeep.addItem(Integer.valueOf(i)); 455 items.add(Integer.valueOf(i)); 456 } 457 m_numberVersionsToKeep.setPageLength(m_numberVersionsToKeep.size()); 458 m_numberVersionsToKeep.setNullSelectionAllowed(false); 459 m_numberVersionsToKeep.setTextInputAllowed(true); 460 461 //Alow user to enter other values 462 m_numberVersionsToKeep.setNewItemsAllowed(true); 463 m_numberVersionsToKeep.setNewItemHandler(new NewItemHandler() { 464 465 private static final long serialVersionUID = -1962380117946789444L; 466 467 public void addNewItem(String newItemCaption) { 468 469 int num = CmsStringUtil.getIntValue(newItemCaption, -1, "user entered version number is not a number"); 470 if ((num > 1) && !items.contains(Integer.valueOf(num))) { 471 m_numberVersionsToKeep.addItem(Integer.valueOf(num)); 472 m_numberVersionsToKeep.select(Integer.valueOf(num)); 473 } 474 } 475 }); 476 477 //Select the value which correspons to current history setting. 478 int numberHistoryVersions = OpenCms.getSystemInfo().getHistoryVersions(); 479 if (numberHistoryVersions == CmsFileHistoryApp.NUMBER_VERSIONS_DISABLED) { 480 numberHistoryVersions = 0; 481 } 482 if (numberHistoryVersions == CmsFileHistoryApp.NUMBER_VERSIONS_UNLIMITED) { 483 numberHistoryVersions = VERSIONS_MAX; 484 } 485 m_numberVersionsToKeep.select(Integer.valueOf(numberHistoryVersions)); 486 } 487 488}