/* * Copyright © 2014-2016 Cask Data, Inc. * * Licensed 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 co.cask.cdap.data2.datafabric; import co.cask.cdap.common.conf.CConfiguration; import co.cask.cdap.common.conf.Constants; import co.cask.cdap.data2.dataset2.DatasetNamespace; import co.cask.cdap.proto.Id; import com.google.common.base.Preconditions; import javax.annotation.Nullable; /** * Default dataset namespace, which namespaces by configuration setting * {@link co.cask.cdap.common.conf.Constants.Dataset#TABLE_PREFIX} and * the {@link Id.Namespace} in which the dataset instance was created. */ public class DefaultDatasetNamespace implements DatasetNamespace { private final String rootPrefix; public DefaultDatasetNamespace(CConfiguration conf) { String root = conf.get(Constants.Dataset.TABLE_PREFIX); this.rootPrefix = root + "."; } @Override public Id.DatasetInstance namespace(String datasetInstanceName) { return namespace(Id.DatasetInstance.from(Id.Namespace.SYSTEM, datasetInstanceName)); } @Override public Id.DatasetInstance namespace(Id.DatasetInstance datasetInstanceId) { String namespaced = namespace(datasetInstanceId.getNamespace(), datasetInstanceId.getId()); return Id.DatasetInstance.from(datasetInstanceId.getNamespace(), namespaced); } @Override public String namespace(Id.Namespace namespaceId, String suffix) { return rootPrefix + namespaceId.getId() + "." + suffix; } @Override public Id.DatasetInstance fromNamespaced(String namespaced) { Preconditions.checkArgument(namespaced != null, "Dataset name should not be null"); // Dataset name is of the format <table-prefix>.<namespace>.<dataset-name> Preconditions.checkArgument(namespaced.startsWith(rootPrefix), "Dataset name should start with " + rootPrefix); // rootIndex is the index of the first character after the root prefix int rootIndex = rootPrefix.length(); // namespaceIndex is the index of the first dot after the rootIndex int namespaceIndex = namespaced.indexOf(".", rootIndex); // This check implies also that namespace is non-empty // Also, '.' is not permitted in namespace name. So this should return the full namespace. Preconditions.checkArgument(namespaceIndex > rootIndex, "Dataset name is expected to be in the format %s<namespace>.<dataset-name>. Found - %s", rootPrefix, namespaced); String namespace = namespaced.substring(rootIndex, namespaceIndex); String datasetName = namespaced.substring(namespaceIndex + 1); Preconditions.checkArgument(!datasetName.isEmpty(), "Dataset name is expected to be in the format %s<namespace>.<dataset-name>. Found - %s", rootPrefix, namespaced); return Id.DatasetInstance.from(Id.Namespace.from(namespace), datasetName); } @Override @Nullable public Id.DatasetInstance fromNamespaced(Id.DatasetInstance datasetInstanceId) { String namespacedDatasetName = datasetInstanceId.getId(); if (!contains(namespacedDatasetName, datasetInstanceId.getNamespaceId())) { return null; } String prefix = rootPrefix + datasetInstanceId.getNamespaceId() + "."; String nonNamespaced = namespacedDatasetName.substring(prefix.length()); return Id.DatasetInstance.from(datasetInstanceId.getNamespace(), nonNamespaced); } @Override public boolean contains(String name, String namespaceId) { String prefix = rootPrefix + namespaceId + "."; return name.startsWith(prefix); } }