/* * Copyright (C) 2012-2015 DataStax 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 com.datastax.driver.core.schemabuilder; import com.google.common.base.Optional; import java.util.Map; /** * The keyspace options used in CREATE KEYSPACE or ALTER KEYSPACE statements. */ public class KeyspaceOptions extends SchemaStatement { private Optional<Map<String, Object>> replication = Optional.absent(); private Optional<Boolean> durableWrites = Optional.absent(); private final String command; private final String keyspaceName; public KeyspaceOptions(String command, String keyspaceName) { validateNotEmpty(keyspaceName, "Keyspace name"); validateNotKeyWord(keyspaceName, String.format("The keyspace name '%s' is not allowed because it is a reserved keyword", keyspaceName)); this.command = command; this.keyspaceName = keyspaceName; } /** * Define the replication options for the statement. * * @param replication replication properties map * @return this {@code KeyspaceOptions} object */ public KeyspaceOptions replication(Map<String, Object> replication) { validateReplicationOptions(replication); this.replication = Optional.fromNullable(replication); return this; } /** * Define the durable writes option for the statement. If set to false, * data written to the keyspace will bypass the commit log. * * @param durableWrites durable write option * @return this {@code KeyspaceOptions} object */ public KeyspaceOptions durableWrites(Boolean durableWrites) { this.durableWrites = Optional.fromNullable(durableWrites); return this; } @Override String buildInternal() { StringBuilder builtStatement = new StringBuilder(STATEMENT_START); builtStatement.append(command); builtStatement.append(" "); builtStatement.append(keyspaceName); builtStatement.append("\n\tWITH\n\t\t"); boolean putSeparator = false; if (replication.isPresent()) { builtStatement.append("REPLICATION = {"); int l = replication.get().entrySet().size(); for (Map.Entry<String, Object> e : replication.get().entrySet()) { builtStatement.append("'") .append(e.getKey()) .append("'") .append(": "); if (e.getValue() instanceof String) { builtStatement.append("'") .append(e.getValue()) .append("'"); } else { builtStatement.append(e.getValue()); } if (--l > 0) { builtStatement.append(", "); } } builtStatement.append('}'); builtStatement.append("\n\t\t"); putSeparator = true; } if (durableWrites.isPresent()) { if (putSeparator) { builtStatement.append("AND "); } builtStatement.append("DURABLE_WRITES = " + durableWrites.get().toString()); } return builtStatement.toString(); } static void validateReplicationOptions(Map<String, Object> replicationOptions) { if (replicationOptions != null && !replicationOptions.containsKey("class")) { throw new IllegalArgumentException("Replication Strategy 'class' should be provided"); } if (replicationOptions != null && !(replicationOptions.get("class") instanceof String)) { throw new IllegalArgumentException("Replication Strategy should be of type String"); } } }