/******************************************************************************* * Copyright (c) 2012-2015 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.api.vfs.shared; import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.regex.Pattern; /** @author andrew00x */ public class PropertyFilter { /** Property filter for all properties. */ public static final String ALL = "*"; /** Property filter for skip all properties. */ public static final String NONE = "none"; /** Property filter for all properties. */ public static final PropertyFilter ALL_FILTER; /** Property filter for skip all properties. */ public static final PropertyFilter NONE_FILTER; static { ALL_FILTER = new PropertyFilter(); ALL_FILTER.retrievalAllProperties = true; NONE_FILTER = new PropertyFilter(); NONE_FILTER.propertyNames = Collections.emptySet(); } /** * Construct new Property Filter. * * @param filterString * the string that contains either '*' or comma-separated list of properties names. An arbitrary number of space allowed before * and after each comma. If filterString is 'none' it minds all properties should be rejected by filter. * @return PropertyFilter instance * @throws IllegalArgumentException * if {@code filterString} is invalid */ public static PropertyFilter valueOf(String filterString) { if (filterString == null || filterString.length() == 0 || ALL.equals(filterString = filterString.trim())) { return ALL_FILTER; } else if (filterString.equalsIgnoreCase(NONE)) { return NONE_FILTER; } return new PropertyFilter(filterString); } /** Characters that split. */ private static final Pattern SPLITTER = Pattern.compile("\\s*,\\s*"); /** Characters that not allowed in property name. */ private static final String ILLEGAL_CHARACTERS = ",\"'\\.()"; /** Property names. */ private Set<String> propertyNames; /** Is all properties requested. */ private boolean retrievalAllProperties = false; /** * Construct new Property Filter. * * @param filterString * the string that contains either '*' or comma-separated list of properties names. An arbitrary number of space allowed before * and after each comma. * @throws IllegalArgumentException * if {@code filterString} is invalid */ private PropertyFilter(String filterString) { this.propertyNames = new HashSet<>(); for (String token : SPLITTER.split(filterString)) { if (token.length() > 0 && !token.equals(ALL)) { for (char ch : token.toCharArray()) { if (Character.isWhitespace(ch) || ILLEGAL_CHARACTERS.indexOf(ch) != -1) { throw new IllegalArgumentException(String.format("Invalid filter '%s' contains illegal characters.", filterString)); } } this.propertyNames.add(token); } else { throw new IllegalArgumentException( String.format("Invalid filter '%s'. Filter must contains either '*' OR comma-separated list of properties.", filterString)); } } } private PropertyFilter() { } public boolean accept(String name) { return retrievalAllProperties || propertyNames.contains(name); } }