Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 91CF1200B8E for ; Mon, 12 Sep 2016 03:40:37 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 90343160AD4; Mon, 12 Sep 2016 01:40:37 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 66CA4160AC7 for ; Mon, 12 Sep 2016 03:40:35 +0200 (CEST) Received: (qmail 75988 invoked by uid 500); 12 Sep 2016 01:40:34 -0000 Mailing-List: contact commits-help@zest.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@zest.apache.org Delivered-To: mailing list commits@zest.apache.org Received: (qmail 75975 invoked by uid 99); 12 Sep 2016 01:40:34 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 12 Sep 2016 01:40:34 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 63626E056F; Mon, 12 Sep 2016 01:40:34 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: paulmerlin@apache.org To: commits@zest.apache.org Date: Mon, 12 Sep 2016 01:40:34 -0000 Message-Id: <9bc141af0bb14850abe35aa13d32670b@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [1/2] zest-java git commit: ZEST-176 Rework Riak EntityStore for Riak 2 archived-at: Mon, 12 Sep 2016 01:40:37 -0000 Repository: zest-java Updated Branches: refs/heads/develop ea3f3a6f2 -> e6133864e ZEST-176 Rework Riak EntityStore for Riak 2 Riak 2 Java Client only supports protocol buffer based communication, no more HTTP. This commit replace the previous two Riak EntitStores (protobuf & http) with a single one. See https://github.com/basho/riak-java-client/wiki/Riak-Java-Client-2.0-Upgrade-Guide Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/efe76702 Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/efe76702 Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/efe76702 Branch: refs/heads/develop Commit: efe76702320fc4fb7fa56b3f33bf4824e5614fc4 Parents: ea3f3a6 Author: Paul Merlin Authored: Sun Sep 11 18:24:12 2016 -0700 Committer: Paul Merlin Committed: Sun Sep 11 18:36:17 2016 -0700 ---------------------------------------------------------------------- .../entitystore-riak/src/docs/es-riak.txt | 30 +- .../riak/AbstractRiakMapEntityStore.java | 235 -------------- .../zest/entitystore/riak/RiakAccessors.java | 4 +- .../riak/RiakEntityStoreConfiguration.java | 104 ++++++ .../riak/RiakHttpEntityStoreConfiguration.java | 69 ---- .../riak/RiakHttpMapEntityStoreMixin.java | 70 ----- .../riak/RiakMapEntityStoreMixin.java | 313 +++++++++++++++++++ .../RiakProtobufEntityStoreConfiguration.java | 104 ------ .../riak/RiakProtobufMapEntityStoreMixin.java | 90 ------ .../riak/assembly/RiakEntityStoreAssembler.java | 36 +++ .../assembly/RiakHttpEntityStoreAssembler.java | 56 ---- .../RiakProtobufEntityStoreAssembler.java | 56 ---- .../riak/RiakHttpMapEntityStoreTest.java | 83 ----- .../riak/RiakMapEntityStoreTest.java | 70 +++++ .../riak/RiakMapEntityStoreWithCacheTest.java | 26 +- .../riak/RiakProtobufMapEntityStoreTest.java | 83 ----- libraries.gradle | 2 +- tools/generator-zest/app/index.js | 3 +- 18 files changed, 550 insertions(+), 884 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/extensions/entitystore-riak/src/docs/es-riak.txt ---------------------------------------------------------------------- diff --git a/extensions/entitystore-riak/src/docs/es-riak.txt b/extensions/entitystore-riak/src/docs/es-riak.txt index 6ea2dc9..cc067b5 100644 --- a/extensions/entitystore-riak/src/docs/es-riak.txt +++ b/extensions/entitystore-riak/src/docs/es-riak.txt @@ -27,44 +27,28 @@ source=extensions/entitystore-riak/dev-status.xml EntityStore service backed by a http://basho.com/[Riak] bucket. -The EntityStore comes in two flavours: HTTP or ProtocolBuffer based. See the Riak documentation. +The EntityStore only supports accessing Riak using protocol buffers. +HTTP is not supported since the 2.x serie of the Riak Java client. +See the Riak documentation. include::../../build/docs/buildinfo/artifact.txt[] == Assembly == -Assembly is done using the provided Assemblers. - -For HTTP based Riak client: - -[snippet,java] ----- -source=extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakHttpMapEntityStoreTest.java -tag=assembly ----- - -For ProtocolBuffer based Riak client: +Assembly is done using the provided Assembler: [snippet,java] ---- -source=extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakProtobufMapEntityStoreTest.java +source=extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakMapEntityStoreTest.java tag=assembly ---- == Configuration == -Here are the configuration properties for the HTTP based Riak client: - -[snippet,java] ----- -source=extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakHttpEntityStoreConfiguration.java -tag=config ----- - -Here are the configuration properties for the ProtocolBuffer based Riak client: +Here are the available configuration properties: [snippet,java] ---- -source=extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakProtobufEntityStoreConfiguration.java +source=extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakEntityStoreConfiguration.java tag=config ---- http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/AbstractRiakMapEntityStore.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/AbstractRiakMapEntityStore.java b/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/AbstractRiakMapEntityStore.java deleted file mode 100644 index 800be55..0000000 --- a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/AbstractRiakMapEntityStore.java +++ /dev/null @@ -1,235 +0,0 @@ -/* - * 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.zest.entitystore.riak; - -import com.basho.riak.client.IRiakClient; -import com.basho.riak.client.IRiakObject; -import com.basho.riak.client.RiakException; -import com.basho.riak.client.RiakRetryFailedException; -import com.basho.riak.client.bucket.Bucket; -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; -import java.io.StringWriter; -import java.io.Writer; -import org.apache.zest.api.entity.EntityDescriptor; -import org.apache.zest.api.entity.EntityReference; -import org.apache.zest.api.service.ServiceActivation; -import org.apache.zest.io.Input; -import org.apache.zest.io.Output; -import org.apache.zest.io.Receiver; -import org.apache.zest.io.Sender; -import org.apache.zest.spi.entitystore.EntityNotFoundException; -import org.apache.zest.spi.entitystore.EntityStoreException; -import org.apache.zest.spi.entitystore.helpers.MapEntityStore; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Base Riak implementation of MapEntityStore. - */ -/* package */ abstract class AbstractRiakMapEntityStore - implements ServiceActivation, MapEntityStore, RiakAccessors -{ - - protected static final Logger LOGGER = LoggerFactory.getLogger( "org.apache.zest.entitystore.riak" ); - protected static final int DEFAULT_MAX_CONNECTIONS = 50; - - /* package */ static final String DEFAULT_BUCKET_KEY = "zest:entities"; - protected IRiakClient riakClient; - protected String bucketKey; - - @Override - public void passivateService() - throws Exception - { - riakClient.shutdown(); - riakClient = null; - bucketKey = null; - } - - @Override - public IRiakClient riakClient() - { - return riakClient; - } - - @Override - public String bucket() - { - return bucketKey; - } - - @Override - public Reader get( EntityReference entityReference ) - throws EntityStoreException - { - try - { - - Bucket bucket = riakClient.fetchBucket( bucketKey ).execute(); - IRiakObject entity = bucket.fetch( entityReference.identity() ).execute(); - if( entity == null ) - { - throw new EntityNotFoundException( entityReference ); - } - String jsonState = entity.getValueAsString(); - return new StringReader( jsonState ); - - } - catch( RiakRetryFailedException ex ) - { - throw new EntityStoreException( "Unable to get Entity " + entityReference.identity(), ex ); - } - } - - @Override - public void applyChanges( MapChanges changes ) - throws IOException - { - try - { - final Bucket bucket = riakClient.fetchBucket( bucketKey ).execute(); - - changes.visitMap( new MapChanger() - { - - @Override - public Writer newEntity( final EntityReference ref, EntityDescriptor entityDescriptor ) - throws IOException - { - return new StringWriter( 1000 ) - { - - @Override - public void close() - throws IOException - { - try - { - super.close(); - bucket.store( ref.identity(), toString() ).execute(); - } - catch( RiakException ex ) - { - throw new EntityStoreException( "Unable to apply entity change: newEntity", ex ); - } - } - - }; - } - - @Override - public Writer updateEntity( final EntityReference ref, EntityDescriptor entityDescriptor ) - throws IOException - { - return new StringWriter( 1000 ) - { - - @Override - public void close() - throws IOException - { - try - { - super.close(); - IRiakObject entity = bucket.fetch( ref.identity() ).execute(); - if( entity == null ) - { - throw new EntityNotFoundException( ref ); - } - bucket.store( ref.identity(), toString() ).execute(); - } - catch( RiakException ex ) - { - throw new EntityStoreException( "Unable to apply entity change: updateEntity", ex ); - } - } - - }; - } - - @Override - public void removeEntity( EntityReference ref, EntityDescriptor entityDescriptor ) - throws EntityNotFoundException - { - try - { - IRiakObject entity = bucket.fetch( ref.identity() ).execute(); - if( entity == null ) - { - throw new EntityNotFoundException( ref ); - } - bucket.delete( ref.identity() ).execute(); - } - catch( RiakException ex ) - { - throw new EntityStoreException( "Unable to apply entity change: removeEntity", ex ); - } - } - - } ); - - } - catch( RiakRetryFailedException ex ) - { - throw new EntityStoreException( "Unable to apply entity changes.", ex ); - } - } - - @Override - public Input entityStates() - { - return new Input() - { - - @Override - public void transferTo( Output output ) - throws IOException, ReceiverThrowableType - { - output.receiveFrom( new Sender() - { - - @Override - public void sendTo( Receiver receiver ) - throws ReceiverThrowableType, IOException - { - try - { - final Bucket bucket = riakClient.fetchBucket( bucketKey ).execute(); - for( String key : bucket.keys() ) - { - String jsonState = bucket.fetch( key ).execute().getValueAsString(); - receiver.receive( new StringReader( jsonState ) ); - } - } - catch( RiakException ex ) - { - throw new EntityStoreException( "Unable to apply entity changes.", ex ); - } - } - - } ); - } - - }; - } - -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakAccessors.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakAccessors.java b/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakAccessors.java index cf5e62a..47e5af3 100644 --- a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakAccessors.java +++ b/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakAccessors.java @@ -19,12 +19,12 @@ */ package org.apache.zest.entitystore.riak; -import com.basho.riak.client.IRiakClient; +import com.basho.riak.client.api.RiakClient; public interface RiakAccessors { - IRiakClient riakClient(); + RiakClient riakClient(); String bucket(); http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakEntityStoreConfiguration.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakEntityStoreConfiguration.java b/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakEntityStoreConfiguration.java new file mode 100644 index 0000000..febd329 --- /dev/null +++ b/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakEntityStoreConfiguration.java @@ -0,0 +1,104 @@ +/* + * 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.zest.entitystore.riak; + +import org.apache.zest.api.common.Optional; +import org.apache.zest.api.common.UseDefaults; +import org.apache.zest.api.configuration.ConfigurationComposite; +import org.apache.zest.api.property.Property; + +import java.util.List; + +/** + * Configuration for RiakEntityStoreService. + */ +// START SNIPPET: config +public interface RiakEntityStoreConfiguration extends ConfigurationComposite +{ + /** + * List of Riak Protocol Buffer hosts. + * + * Each entry can contain either an IP address / hostname + * or an IP address / hostname followed by a column and the host's port. + * + * Defaulted to 127.0.0.1 if empty. + * + * @return List of Riak nodes + */ + @UseDefaults + Property> hosts(); + + /** + * Riak Bucket where Entities state will be stored. + * + * Defaulted to "zest:entities". + * + * @return Riak bucket name + */ + @UseDefaults( "zest:entities" ) + Property bucket(); + + /** + * Cluster execution attempts. + * + * @return Cluster execution attempts + */ + @Optional + Property clusterExecutionAttempts(); + + /** + * Minimum connections per node. + * + * @return Minimum connections per node + */ + @Optional + Property minConnections(); + + /** + * Maximum connections per node. + * + * @return Maximum connections per node + */ + @Optional + Property maxConnections(); + + /** + * Block on maximum connections. + * + * @return Block on maximum connections + */ + @UseDefaults + Property blockOnMaxConnections(); + + /** + * Connection timeout. + * + * @return Connection timeout + */ + @Optional + Property connectionTimeout(); + + /** + * Idle timeout. + * + * @return idle timeout + */ + @Optional + Property idleTimeout(); +} +// END SNIPPET: config http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakHttpEntityStoreConfiguration.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakHttpEntityStoreConfiguration.java b/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakHttpEntityStoreConfiguration.java deleted file mode 100644 index e2d3699..0000000 --- a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakHttpEntityStoreConfiguration.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.zest.entitystore.riak; - -import java.util.List; -import org.apache.zest.api.common.Optional; -import org.apache.zest.api.common.UseDefaults; -import org.apache.zest.api.configuration.ConfigurationComposite; -import org.apache.zest.api.property.Property; - -/** - * Configuration for RiakHttpEntityStoreService. - */ -// START SNIPPET: config -public interface RiakHttpEntityStoreConfiguration - extends ConfigurationComposite -{ - - /** - * List of Riak URLs. - * - * Defaulted to http://127.0.0.1:8098/riak if empty. - */ - @UseDefaults - Property> urls(); - - /** - * Riak Bucket where Entities state will be stored. - * - * Defaulted to "zest:entities". - */ - @Optional - Property bucket(); - - /** - * Maximum total connections. - * - * Defaulted to 50. Use 0 for infinite number of connections. - */ - @Optional - Property maxConnections(); - - /** - * The connection, socket read and pooled connection acquisition timeout in milliseconds. - * - * Defaulted to 0 (infinite). - */ - @UseDefaults - Property timeout(); - -} -// END SNIPPET: config \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakHttpMapEntityStoreMixin.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakHttpMapEntityStoreMixin.java b/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakHttpMapEntityStoreMixin.java deleted file mode 100644 index 041d8bb..0000000 --- a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakHttpMapEntityStoreMixin.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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.zest.entitystore.riak; - -import com.basho.riak.client.RiakFactory; -import com.basho.riak.client.raw.http.HTTPClientConfig; -import com.basho.riak.client.raw.http.HTTPClusterConfig; -import java.util.List; -import org.apache.zest.api.configuration.Configuration; -import org.apache.zest.api.injection.scope.This; - -/** - * Riak Http implementation of MapEntityStore. - */ -public class RiakHttpMapEntityStoreMixin - extends AbstractRiakMapEntityStore -{ - - private static final String DEFAULT_URL = "http://127.0.0.1:8098/riak"; - @This - private Configuration configuration; - - @Override - public void activateService() - throws Exception - { - configuration.refresh(); - RiakHttpEntityStoreConfiguration config = configuration.get(); - - int maxConnections = config.maxConnections().get() == null ? DEFAULT_MAX_CONNECTIONS : config.maxConnections().get(); - int timeoutMillis = config.timeout().get(); - List urls = config.urls().get(); - if( urls.isEmpty() ) - { - urls.add( DEFAULT_URL ); - } - bucketKey = config.bucket().get() == null ? DEFAULT_BUCKET_KEY : config.bucket().get(); - - HTTPClusterConfig httpClusterConfig = new HTTPClusterConfig( maxConnections ); - for( String url : urls ) - { - HTTPClientConfig clientConfig = new HTTPClientConfig.Builder().withTimeout( timeoutMillis ).withUrl( url ).build(); - httpClusterConfig.addClient( clientConfig ); - } - riakClient = RiakFactory.newClient( httpClusterConfig ); - - if( !riakClient.listBuckets().contains( bucketKey ) ) - { - riakClient.createBucket( bucketKey ).execute(); - } - } - -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakMapEntityStoreMixin.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakMapEntityStoreMixin.java b/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakMapEntityStoreMixin.java new file mode 100644 index 0000000..5b14890 --- /dev/null +++ b/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakMapEntityStoreMixin.java @@ -0,0 +1,313 @@ +/* + * 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.zest.entitystore.riak; + +import com.basho.riak.client.api.RiakClient; +import com.basho.riak.client.api.commands.buckets.StoreBucketProperties; +import com.basho.riak.client.api.commands.kv.DeleteValue; +import com.basho.riak.client.api.commands.kv.FetchValue; +import com.basho.riak.client.api.commands.kv.ListKeys; +import com.basho.riak.client.api.commands.kv.StoreValue; +import com.basho.riak.client.core.RiakCluster; +import com.basho.riak.client.core.RiakNode; +import com.basho.riak.client.core.query.Location; +import com.basho.riak.client.core.query.Namespace; +import com.basho.riak.client.core.util.HostAndPort; +import org.apache.zest.api.configuration.Configuration; +import org.apache.zest.api.entity.EntityDescriptor; +import org.apache.zest.api.entity.EntityReference; +import org.apache.zest.api.injection.scope.This; +import org.apache.zest.api.service.ServiceActivation; +import org.apache.zest.io.Input; +import org.apache.zest.io.Output; +import org.apache.zest.io.Receiver; +import org.apache.zest.io.Sender; +import org.apache.zest.spi.entitystore.EntityNotFoundException; +import org.apache.zest.spi.entitystore.EntityStoreException; +import org.apache.zest.spi.entitystore.helpers.MapEntityStore; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +/** + * Riak Protobuf implementation of MapEntityStore. + */ +public class RiakMapEntityStoreMixin implements ServiceActivation, MapEntityStore, RiakAccessors +{ + private static final String DEFAULT_HOST = "127.0.0.1"; + private static final int DEFAULT_PORT = 8087; + + @This + private Configuration configuration; + + private RiakClient riakClient; + private Namespace namespace; + + @Override + public void activateService() throws Exception { + // Load configuration + configuration.refresh(); + RiakEntityStoreConfiguration config = configuration.get(); + String bucketName = config.bucket().get(); + List hosts = config.hosts().get(); + Integer clusterExecutionAttempts = config.clusterExecutionAttempts().get(); + Integer minConnections = config.minConnections().get(); + Integer maxConnections = config.maxConnections().get(); + Boolean blockOnMaxConnections = config.blockOnMaxConnections().get(); + Integer connectionTimeout = config.connectionTimeout().get(); + Integer idleTimeout = config.idleTimeout().get(); + + // Setup Riak Cluster Client + List hostsAndPorts = parseHosts( hosts ); + RiakNode.Builder nodeBuilder = new RiakNode.Builder(); + if( minConnections != null ) + { + nodeBuilder = nodeBuilder.withMinConnections( minConnections ); + } + if( maxConnections != null ) + { + nodeBuilder = nodeBuilder.withMaxConnections( maxConnections ); + } + nodeBuilder = nodeBuilder.withBlockOnMaxConnections( blockOnMaxConnections ); + if( connectionTimeout != null ) + { + nodeBuilder = nodeBuilder.withConnectionTimeout( connectionTimeout ); + } + if( idleTimeout != null ) + { + nodeBuilder = nodeBuilder.withIdleTimeout( idleTimeout ); + } + List nodes = new ArrayList<>(); + for( HostAndPort host : hostsAndPorts ) + { + nodes.add( nodeBuilder.withRemoteAddress( host ).build() ); + } + RiakCluster.Builder clusterBuilder = RiakCluster.builder( nodes ); + if( clusterExecutionAttempts != null ) + { + clusterBuilder = clusterBuilder.withExecutionAttempts( clusterExecutionAttempts ); + } + + // Start Riak Cluster + RiakCluster cluster = clusterBuilder.build(); + cluster.start(); + namespace = new Namespace( bucketName ); + riakClient = new RiakClient( cluster ); + + // Initialize Bucket + riakClient.execute( new StoreBucketProperties.Builder( namespace ).build() ); + } + + @Override + public void passivateService() + throws Exception + { + riakClient.shutdown(); + riakClient = null; + namespace = null; + } + + @Override + public RiakClient riakClient() + { + return riakClient; + } + + @Override + public String bucket() + { + return namespace.getBucketNameAsString(); + } + + @Override + public Reader get(EntityReference entityReference ) + throws EntityStoreException + { + try + { + Location location = new Location( namespace, entityReference.identity() ); + FetchValue fetch = new FetchValue.Builder( location ).build(); + FetchValue.Response response = riakClient.execute( fetch ); + if( response.isNotFound() ) + { + throw new EntityNotFoundException( entityReference ); + } + String jsonState = response.getValue( String.class ); + return new StringReader( jsonState ); + } + catch( InterruptedException | ExecutionException ex ) + { + throw new EntityStoreException( "Unable to get Entity " + entityReference.identity(), ex ); + } + } + + @Override + public void applyChanges( MapChanges changes ) + throws IOException + { + try + { + changes.visitMap( new MapChanger() + { + @Override + public Writer newEntity(final EntityReference ref, EntityDescriptor entityDescriptor ) + throws IOException + { + return new StringWriter( 1000 ) + { + @Override + public void close() + throws IOException + { + try + { + super.close(); + StoreValue store = new StoreValue.Builder( toString() ) + .withLocation( new Location( namespace, ref.identity() ) ) + .build(); + riakClient.execute( store ); + } + catch( InterruptedException | ExecutionException ex ) + { + throw new EntityStoreException( "Unable to apply entity change: newEntity", ex ); + } + } + }; + } + + @Override + public Writer updateEntity( final EntityReference ref, EntityDescriptor entityDescriptor ) + throws IOException + { + return new StringWriter( 1000 ) + { + @Override + public void close() + throws IOException + { + try + { + super.close(); + Location location = new Location( namespace, ref.identity() ); + FetchValue fetch = new FetchValue.Builder( location ).build(); + FetchValue.Response response = riakClient.execute( fetch ); + if( response.isNotFound() ) + { + throw new EntityNotFoundException( ref ); + } + StoreValue store = new StoreValue.Builder( toString() ).withLocation( location ).build(); + riakClient.execute( store ); + } + catch( InterruptedException | ExecutionException ex ) + { + throw new EntityStoreException( "Unable to apply entity change: updateEntity", ex ); + } + } + }; + } + + @Override + public void removeEntity( EntityReference ref, EntityDescriptor entityDescriptor ) + throws EntityNotFoundException + { + try + { + Location location = new Location( namespace, ref.identity() ); + FetchValue fetch = new FetchValue.Builder( location ).build(); + FetchValue.Response response = riakClient.execute( fetch ); + if( response.isNotFound() ) + { + throw new EntityNotFoundException( ref ); + } + DeleteValue delete = new DeleteValue.Builder( location ).build(); + riakClient.execute( delete ); + } + catch( InterruptedException | ExecutionException ex ) + { + throw new EntityStoreException( "Unable to apply entity change: removeEntity", ex ); + } + } + } ); + } + catch( Exception ex ) + { + throw new EntityStoreException( "Unable to apply entity changes.", ex ); + } + } + + @Override + public Input entityStates() + { + return new Input() + { + @Override + public void transferTo( Output output ) + throws IOException, ReceiverThrowableType + { + output.receiveFrom( new Sender() + { + @Override + public void sendTo( Receiver receiver ) + throws ReceiverThrowableType, IOException + { + try + { + ListKeys listKeys = new ListKeys.Builder( namespace ).build(); + ListKeys.Response listKeysResponse = riakClient.execute( listKeys ); + for( Location location : listKeysResponse ) + { + FetchValue fetch = new FetchValue.Builder( location ).build(); + FetchValue.Response response = riakClient.execute( fetch ); + String jsonState = response.getValue( String.class ); + receiver.receive( new StringReader( jsonState ) ); + } + } + catch( InterruptedException | ExecutionException ex ) + { + throw new EntityStoreException( "Unable to apply entity changes.", ex ); + } + } + } ); + } + }; + } + + + private List parseHosts( List hosts ) + { + if( hosts.isEmpty() ) + { + hosts.add( DEFAULT_HOST ); + } + List addresses = new ArrayList<>( hosts.size() ); + for( String host : hosts ) + { + String[] splitted = host.split( ":" ); + int port = DEFAULT_PORT; + if( splitted.length > 1 ) + { + host = splitted[0]; + port = Integer.valueOf( splitted[1] ); + } + addresses.add( HostAndPort.fromParts( host, port ) ); + } + return addresses; + } +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakProtobufEntityStoreConfiguration.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakProtobufEntityStoreConfiguration.java b/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakProtobufEntityStoreConfiguration.java deleted file mode 100644 index e4f1d14..0000000 --- a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakProtobufEntityStoreConfiguration.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * 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.zest.entitystore.riak; - -import java.util.List; -import org.apache.zest.api.common.Optional; -import org.apache.zest.api.common.UseDefaults; -import org.apache.zest.api.configuration.ConfigurationComposite; -import org.apache.zest.api.property.Property; - -/** - * Configuration for RiakProtobufEntityStore service. - */ -// START SNIPPET: config -public interface RiakProtobufEntityStoreConfiguration - extends ConfigurationComposite -{ - - /** - * List of Riak Protocol Buffer hosts. - * - * Each entry can contain either an IP address / hostname - * or an IP address / hostname followed by a column and the host's port. - * - * Defaulted to 127.0.0.1 if empty. - */ - @UseDefaults - Property> hosts(); - - /** - * Riak Bucket where Entities state will be stored. - * - * Defaulted to "zest:entities". - */ - @Optional - Property bucket(); - - /** - * Maximum total connections. - * - * Defaulted to 50. Use 0 for infinite number of connections. - */ - @Optional - Property maxConnections(); - - /** - * The connection timeout in milliseconds. - * - * Defaulted to 1000. - */ - @Optional - Property connectionTimeout(); - - /** - * Idle connection time to live in milliseconds. - * - * Defaulted to 1000. - */ - @Optional - Property idleConnectionTTL(); - - /** - * Max pool size. - * - * Defaulted to 0 (unlimited). - */ - @UseDefaults - Property maxPoolSize(); - - /** - * Initial pool size. - * - * Defaulted to 0. - */ - @UseDefaults - Property initialPoolSize(); - - /** - * Socket buffer size in KB. - * - * Defaulted to 16. - */ - @Optional - Property socketBufferSizeKb(); - -} -// END SNIPPET: config \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakProtobufMapEntityStoreMixin.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakProtobufMapEntityStoreMixin.java b/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakProtobufMapEntityStoreMixin.java deleted file mode 100644 index ec15eba..0000000 --- a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/RiakProtobufMapEntityStoreMixin.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * 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.zest.entitystore.riak; - -import com.basho.riak.client.RiakFactory; -import com.basho.riak.client.raw.pbc.PBClientConfig; -import com.basho.riak.client.raw.pbc.PBClusterConfig; -import java.util.List; -import org.apache.zest.api.configuration.Configuration; -import org.apache.zest.api.injection.scope.This; - -/** - * Riak Protobuf implementation of MapEntityStore. - */ -public class RiakProtobufMapEntityStoreMixin - extends AbstractRiakMapEntityStore -{ - - private static final int DEFAULT_CONNECTION_TIMEOUT = 1000; - private static final int DEFAULT_IDLE_CONNECTION_TTL = 1000; - private static final int DEFAULT_SOCKET_BUFFER_SIZE_KB = 16; - private static final String DEFAULT_HOST = "127.0.0.1"; - private static final int DEFAULT_PORT = 8087; - @This - private Configuration configuration; - - @Override - public void activateService() - throws Exception - { - configuration.refresh(); - RiakProtobufEntityStoreConfiguration config = configuration.get(); - - int maxConnections = config.maxConnections().get() == null ? DEFAULT_MAX_CONNECTIONS : config.maxConnections().get(); - int connectionTimeout = config.connectionTimeout().get() == null ? DEFAULT_CONNECTION_TIMEOUT : config.connectionTimeout().get(); - int idleConnectionTTL = config.idleConnectionTTL().get() == null ? DEFAULT_IDLE_CONNECTION_TTL : config.idleConnectionTTL().get(); - int maxPoolSize = config.maxPoolSize().get(); - int initialPoolSize = config.initialPoolSize().get(); - int socketBufferSize = config.socketBufferSizeKb().get() == null ? DEFAULT_SOCKET_BUFFER_SIZE_KB : config.socketBufferSizeKb().get(); - List hosts = config.hosts().get(); - if( hosts.isEmpty() ) - { - hosts.add( DEFAULT_HOST ); - } - bucketKey = config.bucket().get() == null ? DEFAULT_BUCKET_KEY : config.bucket().get(); - - PBClusterConfig pbClusterConfig = new PBClusterConfig( maxConnections ); - for( String host : hosts ) - { - String[] splitted = host.split( ":" ); - int port = DEFAULT_PORT; - if( splitted.length > 1 ) - { - host = splitted[0]; - port = Integer.valueOf( splitted[1] ); - } - PBClientConfig clientConfig = new PBClientConfig.Builder().withConnectionTimeoutMillis( connectionTimeout ). - withIdleConnectionTTLMillis( idleConnectionTTL ). - withPoolSize( maxPoolSize ). - withInitialPoolSize( initialPoolSize ). - withSocketBufferSizeKb( socketBufferSize ). - withHost( host ).withPort( port ).build(); - pbClusterConfig.addClient( clientConfig ); - } - riakClient = RiakFactory.newClient( pbClusterConfig ); - - if( !riakClient.listBuckets().contains( bucketKey ) ) - { - riakClient.createBucket( bucketKey ).execute(); - } - } - -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/assembly/RiakEntityStoreAssembler.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/assembly/RiakEntityStoreAssembler.java b/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/assembly/RiakEntityStoreAssembler.java new file mode 100644 index 0000000..10c2dd1 --- /dev/null +++ b/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/assembly/RiakEntityStoreAssembler.java @@ -0,0 +1,36 @@ +package org.apache.zest.entitystore.riak.assembly; + +import org.apache.zest.bootstrap.Assemblers; +import org.apache.zest.bootstrap.AssemblyException; +import org.apache.zest.bootstrap.ModuleAssembly; +import org.apache.zest.bootstrap.ServiceDeclaration; +import org.apache.zest.entitystore.riak.RiakEntityStoreConfiguration; +import org.apache.zest.entitystore.riak.RiakMapEntityStoreMixin; +import org.apache.zest.entitystore.riak.RiakMapEntityStoreService; +import org.apache.zest.spi.uuid.UuidIdentityGeneratorService; + +/** + * Riak EntityStore assembly. + */ +public class RiakEntityStoreAssembler + extends Assemblers.VisibilityIdentityConfig +{ + @Override + public void assemble(ModuleAssembly module) throws AssemblyException + { + module.services( UuidIdentityGeneratorService.class ). + visibleIn( visibility() ); + ServiceDeclaration service = module.services( RiakMapEntityStoreService.class ). + withMixins( RiakMapEntityStoreMixin.class ). + visibleIn( visibility() ); + if( hasIdentity() ) + { + service.identifiedBy( identity() ); + } + if( hasConfig() ) + { + configModule().entities( RiakEntityStoreConfiguration.class ). + visibleIn( configVisibility() ); + } + } +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/assembly/RiakHttpEntityStoreAssembler.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/assembly/RiakHttpEntityStoreAssembler.java b/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/assembly/RiakHttpEntityStoreAssembler.java deleted file mode 100644 index 2a97e88..0000000 --- a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/assembly/RiakHttpEntityStoreAssembler.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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.zest.entitystore.riak.assembly; - -import org.apache.zest.bootstrap.Assemblers; -import org.apache.zest.bootstrap.AssemblyException; -import org.apache.zest.bootstrap.ModuleAssembly; -import org.apache.zest.bootstrap.ServiceDeclaration; -import org.apache.zest.entitystore.riak.RiakHttpEntityStoreConfiguration; -import org.apache.zest.entitystore.riak.RiakHttpMapEntityStoreMixin; -import org.apache.zest.entitystore.riak.RiakMapEntityStoreService; -import org.apache.zest.spi.uuid.UuidIdentityGeneratorService; - -/** - * Riak Http EntityStore assembly. - */ -public class RiakHttpEntityStoreAssembler - extends Assemblers.VisibilityIdentityConfig -{ - @Override - public void assemble( ModuleAssembly module ) - throws AssemblyException - { - module.services( UuidIdentityGeneratorService.class ). - visibleIn( visibility() ); - ServiceDeclaration service = module.services( RiakMapEntityStoreService.class ). - withMixins( RiakHttpMapEntityStoreMixin.class ). - visibleIn( visibility() ); - if( hasIdentity() ) - { - service.identifiedBy( identity() ); - } - if( hasConfig() ) - { - configModule().entities( RiakHttpEntityStoreConfiguration.class ). - visibleIn( configVisibility() ); - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/assembly/RiakProtobufEntityStoreAssembler.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/assembly/RiakProtobufEntityStoreAssembler.java b/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/assembly/RiakProtobufEntityStoreAssembler.java deleted file mode 100644 index 8ddd6c2..0000000 --- a/extensions/entitystore-riak/src/main/java/org/apache/zest/entitystore/riak/assembly/RiakProtobufEntityStoreAssembler.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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.zest.entitystore.riak.assembly; - -import org.apache.zest.bootstrap.Assemblers; -import org.apache.zest.bootstrap.AssemblyException; -import org.apache.zest.bootstrap.ModuleAssembly; -import org.apache.zest.bootstrap.ServiceDeclaration; -import org.apache.zest.entitystore.riak.RiakMapEntityStoreService; -import org.apache.zest.entitystore.riak.RiakProtobufEntityStoreConfiguration; -import org.apache.zest.entitystore.riak.RiakProtobufMapEntityStoreMixin; -import org.apache.zest.spi.uuid.UuidIdentityGeneratorService; - -/** - * Riak Protobuf EntityStore assembly. - */ -public class RiakProtobufEntityStoreAssembler - extends Assemblers.VisibilityIdentityConfig -{ - @Override - public void assemble( ModuleAssembly module ) - throws AssemblyException - { - module.services( UuidIdentityGeneratorService.class ). - visibleIn( visibility() ); - ServiceDeclaration service = module.services( RiakMapEntityStoreService.class ). - withMixins( RiakProtobufMapEntityStoreMixin.class ). - visibleIn( visibility() ); - if( hasIdentity() ) - { - service.identifiedBy( identity() ); - } - if( hasConfig() ) - { - configModule().entities( RiakProtobufEntityStoreConfiguration.class ). - visibleIn( configVisibility() ); - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakHttpMapEntityStoreTest.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakHttpMapEntityStoreTest.java b/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakHttpMapEntityStoreTest.java deleted file mode 100644 index 9117173..0000000 --- a/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakHttpMapEntityStoreTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * 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.zest.entitystore.riak; - -import com.basho.riak.client.IRiakClient; -import com.basho.riak.client.bucket.Bucket; -import org.apache.zest.entitystore.riak.assembly.RiakHttpEntityStoreAssembler; -import org.junit.BeforeClass; -import org.apache.zest.api.common.Visibility; -import org.apache.zest.bootstrap.AssemblyException; -import org.apache.zest.bootstrap.ModuleAssembly; -import org.apache.zest.test.EntityTestAssembler; -import org.apache.zest.test.entity.AbstractEntityStoreTest; -import org.apache.zest.valueserialization.orgjson.OrgJsonValueSerializationAssembler; - -import static org.apache.zest.test.util.Assume.assumeConnectivity; - -public class RiakHttpMapEntityStoreTest - extends AbstractEntityStoreTest -{ - @BeforeClass - public static void beforeRiakHttpMapEntityStoreTests() - { - assumeConnectivity( "localhost", 8087 ); - } - - @Override - // START SNIPPET: assembly - public void assemble( ModuleAssembly module ) - throws AssemblyException - { - // END SNIPPET: assembly - super.assemble( module ); - ModuleAssembly config = module.layer().module( "config" ); - new EntityTestAssembler().assemble( config ); - new OrgJsonValueSerializationAssembler().assemble( module ); - // START SNIPPET: assembly - new RiakHttpEntityStoreAssembler().withConfig( config, Visibility.layer ).assemble( module ); - } - // END SNIPPET: assembly - private IRiakClient riakClient; - private String bucketKey; - - @Override - public void setUp() - throws Exception - { - super.setUp(); - RiakMapEntityStoreService es = serviceFinder.findService( RiakMapEntityStoreService.class ).get(); - riakClient = es.riakClient(); - bucketKey = es.bucket(); - } - - @Override - public void tearDown() - throws Exception - { - // Riak don't expose bucket deletion in its API so we empty the Zest Entities bucket. - Bucket bucket = riakClient.fetchBucket( bucketKey ).execute(); - for( String key : bucket.keys() ) - { - bucket.delete( key ).execute(); - } - super.tearDown(); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakMapEntityStoreTest.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakMapEntityStoreTest.java b/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakMapEntityStoreTest.java new file mode 100644 index 0000000..078bf9e --- /dev/null +++ b/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakMapEntityStoreTest.java @@ -0,0 +1,70 @@ +package org.apache.zest.entitystore.riak; + +import com.basho.riak.client.api.RiakClient; +import com.basho.riak.client.api.commands.kv.DeleteValue; +import com.basho.riak.client.api.commands.kv.ListKeys; +import com.basho.riak.client.core.query.Location; +import com.basho.riak.client.core.query.Namespace; +import org.apache.zest.api.common.Visibility; +import org.apache.zest.bootstrap.AssemblyException; +import org.apache.zest.bootstrap.ModuleAssembly; +import org.apache.zest.entitystore.riak.assembly.RiakEntityStoreAssembler; +import org.apache.zest.test.EntityTestAssembler; +import org.apache.zest.test.entity.AbstractEntityStoreTest; +import org.apache.zest.valueserialization.orgjson.OrgJsonValueSerializationAssembler; +import org.junit.BeforeClass; + +import static org.apache.zest.test.util.Assume.assumeConnectivity; + +public class RiakMapEntityStoreTest + extends AbstractEntityStoreTest +{ + @BeforeClass + public static void beforeRiakProtobufMapEntityStoreTests() + { + assumeConnectivity( "localhost", 8087 ); + } + @Override + // START SNIPPET: assembly + public void assemble( ModuleAssembly module ) + throws AssemblyException + { + // END SNIPPET: assembly + super.assemble( module ); + ModuleAssembly config = module.layer().module( "config" ); + new EntityTestAssembler().assemble( config ); + new OrgJsonValueSerializationAssembler().assemble( module ); + // START SNIPPET: assembly + new RiakEntityStoreAssembler().withConfig( config, Visibility.layer ).assemble( module ); + } + // END SNIPPET: assembly + + private RiakClient riakClient; + private String bucketKey; + + @Override + public void setUp() + throws Exception + { + super.setUp(); + RiakMapEntityStoreService es = serviceFinder.findService( RiakMapEntityStoreService.class ).get(); + riakClient = es.riakClient(); + bucketKey = es.bucket(); + } + + @Override + public void tearDown() + throws Exception + { + // Riak don't expose bucket deletion in its API so we empty the Zest Entities bucket. + Namespace namespace = new Namespace( bucketKey ); + ListKeys listKeys = new ListKeys.Builder( namespace ).build(); + ListKeys.Response listKeysResponse = riakClient.execute( listKeys ); + for( Location location : listKeysResponse ) + { + DeleteValue delete = new DeleteValue.Builder( location ).build(); + riakClient.execute( delete ); + } + super.tearDown(); + } +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakMapEntityStoreWithCacheTest.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakMapEntityStoreWithCacheTest.java b/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakMapEntityStoreWithCacheTest.java index c6d3069..1ec53d8 100644 --- a/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakMapEntityStoreWithCacheTest.java +++ b/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakMapEntityStoreWithCacheTest.java @@ -19,16 +19,19 @@ */ package org.apache.zest.entitystore.riak; -import com.basho.riak.client.IRiakClient; -import com.basho.riak.client.bucket.Bucket; -import org.apache.zest.entitystore.riak.assembly.RiakProtobufEntityStoreAssembler; -import org.junit.BeforeClass; +import com.basho.riak.client.api.RiakClient; +import com.basho.riak.client.api.commands.kv.DeleteValue; +import com.basho.riak.client.api.commands.kv.ListKeys; +import com.basho.riak.client.core.query.Location; +import com.basho.riak.client.core.query.Namespace; import org.apache.zest.api.common.Visibility; import org.apache.zest.bootstrap.AssemblyException; import org.apache.zest.bootstrap.ModuleAssembly; +import org.apache.zest.entitystore.riak.assembly.RiakEntityStoreAssembler; import org.apache.zest.test.EntityTestAssembler; import org.apache.zest.test.cache.AbstractEntityStoreWithCacheTest; import org.apache.zest.valueserialization.orgjson.OrgJsonValueSerializationAssembler; +import org.junit.BeforeClass; import static org.apache.zest.test.util.Assume.assumeConnectivity; @@ -36,7 +39,7 @@ public class RiakMapEntityStoreWithCacheTest extends AbstractEntityStoreWithCacheTest { @BeforeClass - public static void beforeRiakProtobufMapEntityStoreTests() + public static void beforeRiakMapEntityStoreTests() { assumeConnectivity( "localhost", 8087 ); } @@ -49,10 +52,10 @@ public class RiakMapEntityStoreWithCacheTest ModuleAssembly config = module.layer().module( "config" ); new EntityTestAssembler().assemble( config ); new OrgJsonValueSerializationAssembler().assemble( module ); - new RiakProtobufEntityStoreAssembler().withConfig( config, Visibility.layer ).assemble( module ); + new RiakEntityStoreAssembler().withConfig( config, Visibility.layer ).assemble( module ); } - private IRiakClient riakClient; + private RiakClient riakClient; private String bucketKey; @Override @@ -70,10 +73,13 @@ public class RiakMapEntityStoreWithCacheTest throws Exception { // Riak don't expose bucket deletion in its API so we empty the Zest Entities bucket. - Bucket bucket = riakClient.fetchBucket( bucketKey ).execute(); - for( String key : bucket.keys() ) + Namespace namespace = new Namespace( bucketKey ); + ListKeys listKeys = new ListKeys.Builder( namespace ).build(); + ListKeys.Response listKeysResponse = riakClient.execute( listKeys ); + for( Location location : listKeysResponse ) { - bucket.delete( key ).execute(); + DeleteValue delete = new DeleteValue.Builder( location ).build(); + riakClient.execute( delete ); } super.tearDown(); } http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakProtobufMapEntityStoreTest.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakProtobufMapEntityStoreTest.java b/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakProtobufMapEntityStoreTest.java deleted file mode 100644 index af88322..0000000 --- a/extensions/entitystore-riak/src/test/java/org/apache/zest/entitystore/riak/RiakProtobufMapEntityStoreTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * 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.zest.entitystore.riak; - -import com.basho.riak.client.IRiakClient; -import com.basho.riak.client.bucket.Bucket; -import org.apache.zest.entitystore.riak.assembly.RiakProtobufEntityStoreAssembler; -import org.junit.BeforeClass; -import org.apache.zest.api.common.Visibility; -import org.apache.zest.bootstrap.AssemblyException; -import org.apache.zest.bootstrap.ModuleAssembly; -import org.apache.zest.test.EntityTestAssembler; -import org.apache.zest.test.entity.AbstractEntityStoreTest; -import org.apache.zest.valueserialization.orgjson.OrgJsonValueSerializationAssembler; - -import static org.apache.zest.test.util.Assume.assumeConnectivity; - -public class RiakProtobufMapEntityStoreTest - extends AbstractEntityStoreTest -{ - @BeforeClass - public static void beforeRiakProtobufMapEntityStoreTests() - { - assumeConnectivity( "localhost", 8087 ); - } - - @Override - // START SNIPPET: assembly - public void assemble( ModuleAssembly module ) - throws AssemblyException - { - // END SNIPPET: assembly - super.assemble( module ); - ModuleAssembly config = module.layer().module( "config" ); - new EntityTestAssembler().assemble( config ); - new OrgJsonValueSerializationAssembler().assemble( module ); - // START SNIPPET: assembly - new RiakProtobufEntityStoreAssembler().withConfig( config, Visibility.layer ).assemble( module ); - } - // END SNIPPET: assembly - private IRiakClient riakClient; - private String bucketKey; - - @Override - public void setUp() - throws Exception - { - super.setUp(); - RiakMapEntityStoreService es = serviceFinder.findService( RiakMapEntityStoreService.class ).get(); - riakClient = es.riakClient(); - bucketKey = es.bucket(); - } - - @Override - public void tearDown() - throws Exception - { - // Riak don't expose bucket deletion in its API so we empty the Zest Entities bucket. - Bucket bucket = riakClient.fetchBucket( bucketKey ).execute(); - for( String key : bucket.keys() ) - { - bucket.delete( key ).execute(); - } - super.tearDown(); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/libraries.gradle ---------------------------------------------------------------------- diff --git a/libraries.gradle b/libraries.gradle index 757236e..3f6dda7 100644 --- a/libraries.gradle +++ b/libraries.gradle @@ -57,7 +57,7 @@ def postgresqlVersion = '9.4.1210' def prefuseVersion = '1.0.1' def restletVersion = '2.3.7' def rdfVersion = '2.7.16' // 2.8.x change query results!! 4.x exists -def riakVersion = '1.4.4' // 2.0.x Fails to compile! +def riakVersion = '2.0.8' def scalaVersion = '2.11.8' def servletVersion = '3.1.0' def shiroVersion = '1.3.1' http://git-wip-us.apache.org/repos/asf/zest-java/blob/efe76702/tools/generator-zest/app/index.js ---------------------------------------------------------------------- diff --git a/tools/generator-zest/app/index.js b/tools/generator-zest/app/index.js index 10de705..01026bc 100644 --- a/tools/generator-zest/app/index.js +++ b/tools/generator-zest/app/index.js @@ -71,8 +71,7 @@ module.exports = generators.Base.extend( 'MongoDB', 'Preferences', 'Redis', - 'RiakHttp', - 'RiakProtobuf', + 'Riak', 'MySQL', 'PostgresSQL', 'SQLite',