1 31 32 package org.opencms.widgets; 33 34 import org.opencms.main.CmsLog; 35 import org.opencms.util.CmsStringUtil; 36 37 import java.util.ArrayList ; 38 import java.util.Collections ; 39 import java.util.List ; 40 41 import org.apache.commons.logging.Log; 42 43 97 public class CmsSelectWidgetOption { 98 99 100 private static final char DEFAULT_MARKER = '*'; 101 102 103 private static final char INPUT_DELIMITER = '|'; 104 105 106 private static final String KEY_DEFAULT = "default='"; 107 108 109 private static final String KEY_HELP = "help='"; 110 111 112 private static final String KEY_OPTION = "option='"; 113 114 115 private static final String KEY_VALUE = "value='"; 116 117 118 private static final Log LOG = CmsLog.getLog(CmsSelectWidgetOption.class); 119 120 121 private static final char OPTION_DELIMITER = ':'; 122 123 124 private boolean m_default; 125 126 127 private int m_hashcode; 128 129 130 private String m_help; 131 132 133 private String m_option; 134 135 136 private String m_value; 137 138 143 public CmsSelectWidgetOption(String value) { 144 145 this(value, false, null, null); 146 } 147 148 154 public CmsSelectWidgetOption(String value, boolean isDefault) { 155 156 this(value, isDefault, null, null); 157 } 158 159 166 public CmsSelectWidgetOption(String value, boolean isDefault, String optionText) { 167 168 this(value, isDefault, optionText, null); 169 } 170 171 179 public CmsSelectWidgetOption(String value, boolean isDefault, String optionText, String helpText) { 180 181 m_default = isDefault; 182 m_value = value; 183 m_option = optionText; 184 m_help = helpText; 185 } 186 187 197 public static String createConfigurationString(List options) { 198 199 if ((options == null) || (options.size() == 0)) { 200 return ""; 201 } 202 StringBuffer result = new StringBuffer (256); 203 boolean first = true; 204 for (int i = 0; i < options.size(); i++) { 205 Object o = options.get(i); 206 if (o instanceof CmsSelectWidgetOption) { 207 if (!first) { 208 result.append(CmsSelectWidgetOption.INPUT_DELIMITER); 209 } else { 210 first = false; 211 } 212 result.append(o.toString()); 213 } 214 } 215 return result.toString(); 216 } 217 218 229 public static CmsSelectWidgetOption getDefaultOption(List options) { 230 231 if ((options == null) || (options.size() == 0)) { 232 return null; 233 } 234 for (int i = 0; i < options.size(); i++) { 235 Object o = options.get(i); 236 if (o instanceof CmsSelectWidgetOption) { 237 CmsSelectWidgetOption option = (CmsSelectWidgetOption)o; 238 if (option.isDefault()) { 239 return option; 240 } 241 } 242 } 243 return null; 244 } 245 246 256 public static List getDefaultOptions(List options) { 257 258 List defaults = new ArrayList (); 259 if ((options == null) || (options.size() == 0)) { 260 return defaults; 261 } 262 for (int i = 0; i < options.size(); i++) { 263 Object o = options.get(i); 264 if (o instanceof CmsSelectWidgetOption) { 265 CmsSelectWidgetOption option = (CmsSelectWidgetOption)o; 266 if (option.isDefault()) { 267 defaults.add(option); 268 } 269 } 270 } 271 return defaults; 272 } 273 274 286 public static List parseOptions(String input) { 287 288 if (CmsStringUtil.isEmptyOrWhitespaceOnly(input)) { 289 return Collections.EMPTY_LIST; 291 } 292 293 String [] parts = CmsStringUtil.splitAsArray(input, INPUT_DELIMITER); 295 List result = new ArrayList (); 296 297 boolean foundDefault = false; 299 300 for (int i = 0; i < parts.length; i++) { 301 302 String part = parts[i].trim(); 303 if (part.length() == 0) { 304 continue; 306 } 307 308 try { 309 310 String value = null; 311 String option = null; 312 String help = null; 313 boolean isDefault = false; 314 315 int posValue = part.indexOf(KEY_VALUE); 316 int posDefault = part.indexOf(KEY_DEFAULT); 317 int posOption = part.indexOf(KEY_OPTION); 318 int posHelp = part.indexOf(KEY_HELP); 319 320 boolean shortValue = false; 321 if (posValue < 0) { 322 if ((posDefault == 0) || (posOption == 0) || (posHelp == 0)) { 324 throw new CmsWidgetException(Messages.get().container( 326 Messages.ERR_MALFORMED_SELECT_OPTIONS_1, 327 input)); 328 } 329 posValue = 0; 330 shortValue = true; 331 } 332 333 int end = part.length(); 335 if (posHelp > posValue) { 337 end = posHelp; 338 } 339 if ((posDefault > posValue) && (posDefault < end)) { 340 end = posDefault; 341 } 342 if ((posOption > posValue) && (posOption < end)) { 343 end = posOption; 344 } 345 if (shortValue) { 346 value = part.substring(0, end).trim(); 348 } else { 349 value = part.substring(posValue + KEY_VALUE.length(), end).trim(); 350 value = value.substring(0, value.length() - 1); 352 } 353 354 boolean shortOption = false; 355 if ((shortValue) && (posOption < 0)) { 357 int pos = value.indexOf(OPTION_DELIMITER); 358 if (pos >= 0) { 359 posOption = pos; 361 shortOption = true; 362 value = value.substring(0, pos); 363 } 364 } 365 366 if (posDefault >= 0) { 367 end = part.length(); 369 if (posHelp > posDefault) { 370 end = posHelp; 371 } 372 if ((posOption > posDefault) && (posOption < end)) { 373 end = posOption; 374 } 375 if ((posValue > posDefault) && (posValue < end)) { 376 end = posValue; 377 } 378 String sub = part.substring(posDefault + KEY_DEFAULT.length(), end).trim(); 379 sub = sub.substring(0, sub.length() - 1); 381 isDefault = Boolean.valueOf(sub).booleanValue(); 382 } else { 383 if (value.charAt(value.length() - 1) == DEFAULT_MARKER) { 385 isDefault = true; 386 value = value.substring(0, value.length() - 1); 387 } 388 } 389 390 if (posOption >= 0) { 391 end = part.length(); 393 if (posHelp > posOption) { 394 end = posHelp; 395 } 396 if ((posDefault > posOption) && (posDefault < end)) { 397 end = posDefault; 398 } 399 if ((posValue > posOption) && (posValue < end)) { 400 end = posValue; 401 } 402 if (shortOption) { 403 option = part.substring(posOption + 1, end).trim(); 405 } else { 406 option = part.substring(posOption + KEY_OPTION.length(), end).trim(); 407 option = option.substring(0, option.length() - 1); 409 } 410 } 411 412 if (posHelp >= 0) { 413 end = part.length(); 415 if (posOption > posHelp) { 416 end = posOption; 417 } 418 if ((posDefault > posHelp) && (posDefault < end)) { 419 end = posDefault; 420 } 421 if ((posValue > posHelp) && (posValue < end)) { 422 end = posValue; 423 } 424 help = part.substring(posHelp + KEY_HELP.length(), end).trim(); 425 help = help.substring(0, help.length() - 1); 427 } 428 429 if (foundDefault) { 431 isDefault = false; 432 } else if (isDefault) { 433 foundDefault = true; 434 } 435 436 result.add(new CmsSelectWidgetOption(value, isDefault, option, help)); 437 438 } catch (Exception e) { 439 if (LOG.isInfoEnabled()) { 440 LOG.info(Messages.get().getBundle().key(Messages.ERR_MALFORMED_SELECT_OPTIONS_1, input)); 441 } 442 } 443 } 444 445 return result; 446 } 447 448 451 public boolean equals(Object obj) { 452 453 if (!(obj instanceof CmsSelectWidgetOption)) { 454 return false; 455 } 456 CmsSelectWidgetOption other = (CmsSelectWidgetOption)obj; 457 if (m_default != other.m_default) { 458 return false; 459 } 460 if (m_value == null) { 461 if (other.m_value != null) { 462 return false; 463 } 464 } else if (!m_value.equals(other.m_value)) { 465 return false; 466 } 467 if (m_option == null) { 468 if (other.m_option != null) { 469 return false; 470 } 471 } else if (!m_option.equals(other.m_option)) { 472 return false; 473 } 474 if (m_help == null) { 475 if (other.m_help != null) { 476 return false; 477 } 478 } else if (!m_help.equals(other.m_help)) { 479 return false; 480 } 481 return true; 482 } 483 484 489 public String getHelp() { 490 491 return m_help; 492 } 493 494 502 public String getOption() { 503 504 if (m_option == null) { 505 return getValue(); 506 } 507 return m_option; 508 } 509 510 515 public String getValue() { 516 517 return m_value; 518 } 519 520 523 public int hashCode() { 524 525 if (m_hashcode == 0) { 526 StringBuffer hash = new StringBuffer (128); 527 hash.append(m_value); 528 hash.append('|'); 529 hash.append(m_default); 530 hash.append('|'); 531 hash.append(m_option); 532 hash.append('|'); 533 hash.append(m_help); 534 m_hashcode = hash.toString().hashCode(); 535 } 536 return m_hashcode; 537 } 538 539 544 public boolean isDefault() { 545 546 return m_default; 547 } 548 549 552 public String toString() { 553 554 StringBuffer result = new StringBuffer (128); 555 556 result.append(KEY_VALUE); 557 result.append(m_value); 558 result.append('\''); 559 if (m_default) { 560 result.append(' '); 561 result.append(KEY_DEFAULT); 562 result.append(m_default); 563 result.append('\''); 564 } 565 if (m_option != null) { 566 result.append(' '); 567 result.append(KEY_OPTION); 568 result.append(m_option); 569 result.append('\''); 570 } 571 if (m_help != null) { 572 result.append(' '); 573 result.append(KEY_HELP); 574 result.append(m_help); 575 result.append('\''); 576 } 577 return result.toString(); 578 } 579 } | Popular Tags |