Java tutorial
/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.preference; import java.io.Serializable; import java.util.StringTokenizer; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.builder.HashCodeBuilder; import com.enonic.cms.core.InvalidKeyException; import com.enonic.cms.core.security.user.UserKey; public class PreferenceKey implements Serializable { private String rawKey = null; private PreferenceType type; private String typeKey; private String scopePart; private PreferenceScopeType scopeType; private PreferenceScopeKey scopeKey = null; private String baseKey; public PreferenceKey(UserKey userKey, PreferenceScope scope, String baseKey) { this(PreferenceType.USER, userKey.toString(), scope.getType(), scope.getKey(), baseKey); } public PreferenceKey(UserKey userKey, PreferenceScopeType scopeType, PreferenceScopeKey scopeKey, String baseKey) { this(PreferenceType.USER, userKey.toString(), scopeType, scopeKey, baseKey); } private PreferenceKey(PreferenceType type, String typeKey, PreferenceScopeType scopeType, PreferenceScopeKey scopeKey, String baseKey) { if (type == null) { throw new IllegalArgumentException("type cannot be null"); } if (typeKey == null) { throw new IllegalArgumentException("typeKey cannot be null"); } if (scopeType == null) { throw new IllegalArgumentException("scope cannot be null"); } if (scopeType != PreferenceScopeType.GLOBAL && scopeKey == null) { throw new IllegalArgumentException("scopeKey cannot be null"); } if (baseKey == null) { throw new IllegalArgumentException("baseKey cannot be null"); } this.type = type; this.typeKey = typeKey; this.scopeType = scopeType; this.scopeKey = scopeKey; this.baseKey = baseKey; if (PreferenceScopeType.GLOBAL == scopeType) { this.scopePart = scopeType.getName(); } else { this.scopePart = scopeType.getName() + ":" + scopeKey; } this.rawKey = type.getName() + ":" + typeKey + "." + this.scopePart + "." + baseKey; } public PreferenceKey(String key) { if (key == null || key.trim().length() == 0) { throw new InvalidKeyException(key, this.getClass(), "key cannot be null or empty"); } this.rawKey = key; init(key); } public String getRawKey() { return rawKey; } public static String getRawKeyWithWildCardScope(UserKey userKey, String wildCardBaseKey) { return PreferenceType.USER.getName() + ":" + userKey.toString() + ".*." + wildCardBaseKey; } private void init(String rawKey) { int start = 0; int end = rawKey.indexOf("."); int partCounter = 1; while (partCounter <= 3) { if (start == -1 || (end == -1 && partCounter < 3)) { throw new InvalidKeyException(this.rawKey, this.getClass()); } if (partCounter == 1) { String part = rawKey.substring(start, end); initType(part); start = end + 1; end = rawKey.indexOf(".", start); } else if (partCounter == 2) { String part = rawKey.substring(start, end); initScope(part); start = end + 1; end = Math.max(rawKey.indexOf(".", start), rawKey.length()); } else if (partCounter == 3) { String part = rawKey.substring(start, end); initBaseKey(part); break; } partCounter++; } } private void initType(String typePart) { StringTokenizer st = new StringTokenizer(typePart, ":"); if (st.hasMoreTokens()) { this.type = PreferenceType.parse(st.nextToken()); } if (st.hasMoreTokens()) { this.typeKey = st.nextToken(); } if (this.type == null) { throw new InvalidKeyException(rawKey, this.getClass(), "type missing"); } if (this.typeKey == null) { throw new InvalidKeyException(rawKey, this.getClass(), "type key missing"); } } private void initScope(String scopePart) { this.scopePart = scopePart; String scopeName; String scopeKeyStr = null; if (StringUtils.contains(scopePart, ':')) { scopeName = StringUtils.substringBefore(scopePart, ":"); scopeKeyStr = StringUtils.substringAfter(scopePart, ":"); } else { scopeName = scopePart; } this.scopeType = PreferenceScopeType.parse(scopeName); if (this.scopeType == null) { throw new InvalidKeyException(rawKey, this.getClass(), "invalid scope"); } if (scopeType != PreferenceScopeType.GLOBAL) { this.scopeKey = new PreferenceScopeKey(scopeKeyStr); } } private void initBaseKey(String part) { if (part == null || part.trim().length() == 0) { throw new InvalidKeyException(rawKey, this.getClass(), "base key empty"); } this.baseKey = part; } public String getKeyExcludingTypePart() { return scopePart + "." + baseKey; } public String getType() { return type.toString(); } public String getTypeKey() { return typeKey; } public PreferenceScopeType getScopeType() { return scopeType; } public PreferenceScopeKey getScopeKey() { return scopeKey; } public String getBaseKey() { return baseKey; } public UserKey getUserKey() { if (this.type == PreferenceType.USER) { return new UserKey(typeKey); } return null; } public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof PreferenceKey)) { return false; } PreferenceKey that = (PreferenceKey) o; return rawKey.equals(that.rawKey); } public int hashCode() { return new HashCodeBuilder(235, 549).append(rawKey).toHashCode(); } public String toString() { return rawKey; } private enum PreferenceType { USER("USER"); private String name; PreferenceType(String name) { this.name = name; } public String getName() { return name; } public static PreferenceType parse(String typeName) { for (PreferenceType x : values()) { if (x.getName().equalsIgnoreCase(typeName)) { return x; } } return null; } } }