/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.solr.client.solrj.util; import java.util.Locale; import java.util.regex.Pattern; import org.apache.solr.common.SolrException; /** * Ensures that provided identifiers align with Solr's recommendations/requirements for choosing * collection, core, etc identifiers. * * Identifiers are allowed to contain underscores, periods, hyphens, and alphanumeric characters. */ public class SolrIdentifierValidator { final static Pattern identifierPattern = Pattern.compile("^(?!\\-)[\\._A-Za-z0-9\\-]+$"); public enum IdentifierType { SHARD, COLLECTION, CORE, ALIAS } public static String validateName(IdentifierType type, String name) { if (!validateIdentifier(name)) throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, getIdentifierMessage(type, name)); return name; } public static String validateShardName(String shardName) { return validateName(IdentifierType.SHARD, shardName); } public static String validateCollectionName(String collectionName) { return validateName(IdentifierType.COLLECTION, collectionName); } public static String validateAliasName(String alias) { return validateName(IdentifierType.ALIAS, alias); } public static String validateCoreName(String coreName) { return validateName(IdentifierType.CORE, coreName); } private static boolean validateIdentifier(String identifier) { if (identifier == null || ! identifierPattern.matcher(identifier).matches()) { return false; } return true; } public static String getIdentifierMessage(IdentifierType identifierType, String name) { String typeStr = identifierType.toString().toLowerCase(Locale.ROOT); return "Invalid " + typeStr + ": [" + name + "]. " + typeStr + " names must consist entirely of periods, " + "underscores, hyphens, and alphanumerics as well not start with a hyphen"; } }