Updates REST api calls. POST is used to create a re-index job, PUT is used to resume.
Also fixes transitive dependency issue with clouds Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/5a7f9c09 Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/5a7f9c09 Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/5a7f9c09 Branch: refs/heads/USERGRID-608 Commit: 5a7f9c096b5d79950b5df658070ae0bd9bdc77da Parents: 48be894 Author: Todd Nine <tn...@apigee.com> Authored: Fri May 15 19:24:17 2015 -0600 Committer: Todd Nine <tn...@apigee.com> Committed: Fri May 15 19:24:17 2015 -0600 ---------------------------------------------------------------------- .../index/IndexServiceRequestBuilder.java | 88 ----- .../index/IndexServiceRequestBuilderImpl.java | 122 ------- .../index/ReIndexRequestBuilder.java | 86 +++++ .../index/ReIndexRequestBuilderImpl.java | 122 +++++++ .../corepersistence/index/ReIndexService.java | 6 +- .../index/ReIndexServiceImpl.java | 14 +- .../PerformanceEntityRebuildIndexTest.java | 6 +- .../persistence/index/impl/IndexingUtils.java | 2 + stack/pom.xml | 13 + .../org/apache/usergrid/rest/IndexResource.java | 342 +++++++++---------- .../main/resources/usergrid-rest-context.xml | 3 - .../resources/usergrid-rest-deploy-context.xml | 1 - 12 files changed, 401 insertions(+), 404 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5a7f9c09/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceRequestBuilder.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceRequestBuilder.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceRequestBuilder.java deleted file mode 100644 index 07160d8..0000000 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceRequestBuilder.java +++ /dev/null @@ -1,88 +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.usergrid.corepersistence.index; - - -import java.util.UUID; - -import org.elasticsearch.action.index.IndexRequestBuilder; - -import org.apache.usergrid.persistence.core.scope.ApplicationScope; - -import com.google.common.base.Optional; - - -/** - * A builder interface to build our re-index request - */ -public interface IndexServiceRequestBuilder { - - /** - * Set the application id - */ - IndexServiceRequestBuilder withApplicationId( final UUID applicationId ); - - /** - * Set the collection name. If not set, every collection will be reindexed - * @param collectionName - * @return - */ - IndexServiceRequestBuilder withCollection( final String collectionName ); - - /** - * Set our cursor to resume processing - * @param cursor - * @return - */ - IndexServiceRequestBuilder withCursor(final String cursor); - - - /** - * Set the timestamp to re-index entities updated >= this timestamp - * @param timestamp - * @return - */ - IndexServiceRequestBuilder withStartTimestamp(final Long timestamp); - - - /** - * Get the application scope - * @return - */ - Optional<ApplicationScope> getApplicationScope(); - - /** - * Get the collection name - * @return - */ - Optional<String> getCollectionName(); - - /** - * Get the cursor - * @return - */ - Optional<String> getCursor(); - - /** - * Get the updated since timestamp - * @return - */ - Optional<Long> getUpdateTimestamp(); -} http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5a7f9c09/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceRequestBuilderImpl.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceRequestBuilderImpl.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceRequestBuilderImpl.java deleted file mode 100644 index 4017b6e..0000000 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceRequestBuilderImpl.java +++ /dev/null @@ -1,122 +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.usergrid.corepersistence.index; - - -import java.util.UUID; - -import org.apache.usergrid.corepersistence.util.CpNamingUtils; -import org.apache.usergrid.persistence.core.scope.ApplicationScope; - -import com.google.common.base.Optional; - - -/** - * Index service request builder - */ -public class IndexServiceRequestBuilderImpl implements IndexServiceRequestBuilder { - - private Optional<UUID> withApplicationId = Optional.absent(); - private Optional<String> withCollectionName = Optional.absent(); - private Optional<String> cursor = Optional.absent(); - private Optional<Long> updateTimestamp = Optional.absent(); - - - /*** - * - * @param applicationId The application id - * @return - */ - @Override - public IndexServiceRequestBuilder withApplicationId( final UUID applicationId ) { - this.withApplicationId = Optional.fromNullable( applicationId ); - return this; - } - - - /** - * the colleciton name - * @param collectionName - * @return - */ - @Override - public IndexServiceRequestBuilder withCollection( final String collectionName ) { - if(collectionName == null){ - this.withCollectionName = Optional.absent(); - } - else { - this.withCollectionName = Optional.fromNullable( CpNamingUtils.getEdgeTypeFromCollectionName( collectionName ) ); - } - return this; - } - - - /** - * The cursor - * @param cursor - * @return - */ - @Override - public IndexServiceRequestBuilder withCursor( final String cursor ) { - this.cursor = Optional.fromNullable( cursor ); - return this; - } - - - /** - * Set start timestamp in epoch time. Only entities updated since this time will be processed for indexing - * @param timestamp - * @return - */ - @Override - public IndexServiceRequestBuilder withStartTimestamp( final Long timestamp ) { - this.updateTimestamp = Optional.fromNullable( timestamp ); - return this; - } - - - @Override - public Optional<ApplicationScope> getApplicationScope() { - - if ( this.withApplicationId.isPresent() ) { - return Optional.of( CpNamingUtils.getApplicationScope( withApplicationId.get() ) ); - } - - return Optional.absent(); - } - - - @Override - public Optional<String> getCollectionName() { - return withCollectionName; - } - - - @Override - public Optional<String> getCursor() { - return cursor; - } - - - @Override - public Optional<Long> getUpdateTimestamp() { - return updateTimestamp; - } -} http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5a7f9c09/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexRequestBuilder.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexRequestBuilder.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexRequestBuilder.java new file mode 100644 index 0000000..0863a63 --- /dev/null +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexRequestBuilder.java @@ -0,0 +1,86 @@ +/* + * 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.usergrid.corepersistence.index; + + +import java.util.UUID; + +import org.apache.usergrid.persistence.core.scope.ApplicationScope; + +import com.google.common.base.Optional; + + +/** + * A builder interface to build our re-index request + */ +public interface ReIndexRequestBuilder { + + /** + * Set the application id + */ + ReIndexRequestBuilder withApplicationId( final UUID applicationId ); + + /** + * Set the collection name. If not set, every collection will be reindexed + * @param collectionName + * @return + */ + ReIndexRequestBuilder withCollection( final String collectionName ); + + /** + * Set our cursor to resume processing + * @param cursor + * @return + */ + ReIndexRequestBuilder withCursor(final String cursor); + + + /** + * Set the timestamp to re-index entities updated >= this timestamp + * @param timestamp + * @return + */ + ReIndexRequestBuilder withStartTimestamp(final Long timestamp); + + + /** + * Get the application scope + * @return + */ + Optional<ApplicationScope> getApplicationScope(); + + /** + * Get the collection name + * @return + */ + Optional<String> getCollectionName(); + + /** + * Get the cursor + * @return + */ + Optional<String> getCursor(); + + /** + * Get the updated since timestamp + * @return + */ + Optional<Long> getUpdateTimestamp(); +} http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5a7f9c09/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexRequestBuilderImpl.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexRequestBuilderImpl.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexRequestBuilderImpl.java new file mode 100644 index 0000000..25e71e6 --- /dev/null +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexRequestBuilderImpl.java @@ -0,0 +1,122 @@ +/* + * 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.usergrid.corepersistence.index; + + +import java.util.UUID; + +import org.apache.usergrid.corepersistence.util.CpNamingUtils; +import org.apache.usergrid.persistence.core.scope.ApplicationScope; + +import com.google.common.base.Optional; + + +/** + * Index service request builder + */ +public class ReIndexRequestBuilderImpl implements ReIndexRequestBuilder { + + private Optional<UUID> withApplicationId = Optional.absent(); + private Optional<String> withCollectionName = Optional.absent(); + private Optional<String> cursor = Optional.absent(); + private Optional<Long> updateTimestamp = Optional.absent(); + + + /*** + * + * @param applicationId The application id + * @return + */ + @Override + public ReIndexRequestBuilder withApplicationId( final UUID applicationId ) { + this.withApplicationId = Optional.fromNullable( applicationId ); + return this; + } + + + /** + * the colleciton name + * @param collectionName + * @return + */ + @Override + public ReIndexRequestBuilder withCollection( final String collectionName ) { + if(collectionName == null){ + this.withCollectionName = Optional.absent(); + } + else { + this.withCollectionName = Optional.fromNullable( CpNamingUtils.getEdgeTypeFromCollectionName( collectionName ) ); + } + return this; + } + + + /** + * The cursor + * @param cursor + * @return + */ + @Override + public ReIndexRequestBuilder withCursor( final String cursor ) { + this.cursor = Optional.fromNullable( cursor ); + return this; + } + + + /** + * Set start timestamp in epoch time. Only entities updated since this time will be processed for indexing + * @param timestamp + * @return + */ + @Override + public ReIndexRequestBuilder withStartTimestamp( final Long timestamp ) { + this.updateTimestamp = Optional.fromNullable( timestamp ); + return this; + } + + + @Override + public Optional<ApplicationScope> getApplicationScope() { + + if ( this.withApplicationId.isPresent() ) { + return Optional.of( CpNamingUtils.getApplicationScope( withApplicationId.get() ) ); + } + + return Optional.absent(); + } + + + @Override + public Optional<String> getCollectionName() { + return withCollectionName; + } + + + @Override + public Optional<String> getCursor() { + return cursor; + } + + + @Override + public Optional<Long> getUpdateTimestamp() { + return updateTimestamp; + } +} http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5a7f9c09/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexService.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexService.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexService.java index af3615e..bae8d1f 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexService.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexService.java @@ -29,15 +29,15 @@ public interface ReIndexService { /** * Perform an index rebuild * - * @param indexServiceRequestBuilder The builder to build the request + * @param reIndexRequestBuilder The builder to build the request */ - ReIndexStatus rebuildIndex( final IndexServiceRequestBuilder indexServiceRequestBuilder ); + ReIndexStatus rebuildIndex( final ReIndexRequestBuilder reIndexRequestBuilder ); /** * Generate a build for the index */ - IndexServiceRequestBuilder getBuilder(); + ReIndexRequestBuilder getBuilder(); /** http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5a7f9c09/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java index f44113b..ef03866 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java @@ -91,16 +91,16 @@ public class ReIndexServiceImpl implements ReIndexService { @Override - public ReIndexStatus rebuildIndex( final IndexServiceRequestBuilder indexServiceRequestBuilder ) { + public ReIndexStatus rebuildIndex( final ReIndexRequestBuilder reIndexRequestBuilder ) { //load our last emitted Scope if a cursor is present - final Optional<EdgeScope> cursor = parseCursor( indexServiceRequestBuilder.getCursor() ); + final Optional<EdgeScope> cursor = parseCursor( reIndexRequestBuilder.getCursor() ); final CursorSeek<Edge> cursorSeek = getResumeEdge( cursor ); - final Optional<ApplicationScope> appId = indexServiceRequestBuilder.getApplicationScope(); + final Optional<ApplicationScope> appId = reIndexRequestBuilder.getApplicationScope(); Preconditions.checkArgument( !(cursor.isPresent() && appId.isPresent()), @@ -111,11 +111,11 @@ public class ReIndexServiceImpl implements ReIndexService { final String jobId = StringUtils.sanitizeUUID( UUIDGenerator.newTimeUUID() ); - final long modifiedSince = indexServiceRequestBuilder.getUpdateTimestamp().or( Long.MIN_VALUE ); + final long modifiedSince = reIndexRequestBuilder.getUpdateTimestamp().or( Long.MIN_VALUE ); //create an observable that loads each entity and indexes it, start it running with publish final Observable<EdgeScope> runningReIndex = allEntityIdsObservable.getEdgesToEntities( applicationScopes, - indexServiceRequestBuilder.getCollectionName(), cursorSeek.getSeekValue() ) + reIndexRequestBuilder.getCollectionName(), cursorSeek.getSeekValue() ) //for each edge, create our scope and index on it .doOnNext( edge -> { @@ -143,8 +143,8 @@ public class ReIndexServiceImpl implements ReIndexService { @Override - public IndexServiceRequestBuilder getBuilder() { - return new IndexServiceRequestBuilderImpl(); + public ReIndexRequestBuilder getBuilder() { + return new ReIndexRequestBuilderImpl(); } http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5a7f9c09/stack/core/src/test/java/org/apache/usergrid/persistence/PerformanceEntityRebuildIndexTest.java ---------------------------------------------------------------------- diff --git a/stack/core/src/test/java/org/apache/usergrid/persistence/PerformanceEntityRebuildIndexTest.java b/stack/core/src/test/java/org/apache/usergrid/persistence/PerformanceEntityRebuildIndexTest.java index 8d54043..06eb060 100644 --- a/stack/core/src/test/java/org/apache/usergrid/persistence/PerformanceEntityRebuildIndexTest.java +++ b/stack/core/src/test/java/org/apache/usergrid/persistence/PerformanceEntityRebuildIndexTest.java @@ -33,7 +33,7 @@ import org.apache.commons.lang.RandomStringUtils; import org.apache.usergrid.AbstractCoreIT; import org.apache.usergrid.cassandra.SpringResource; -import org.apache.usergrid.corepersistence.index.IndexServiceRequestBuilder; +import org.apache.usergrid.corepersistence.index.ReIndexRequestBuilder; import org.apache.usergrid.corepersistence.index.ReIndexService; import org.apache.usergrid.persistence.core.scope.ApplicationScope; import org.apache.usergrid.persistence.core.scope.ApplicationScopeImpl; @@ -153,7 +153,7 @@ public class PerformanceEntityRebuildIndexTest extends AbstractCoreIT { logger.debug( "Preparing to rebuild all indexes" ); - final IndexServiceRequestBuilder builder = + final ReIndexRequestBuilder builder = reIndexService.getBuilder().withApplicationId( em.getApplicationId() ).withCollection( "catherders" ); ReIndexService.ReIndexStatus status = reIndexService.rebuildIndex( builder ); @@ -270,7 +270,7 @@ public class PerformanceEntityRebuildIndexTest extends AbstractCoreIT { try { - final IndexServiceRequestBuilder builder = + final ReIndexRequestBuilder builder = reIndexService.getBuilder().withApplicationId( em.getApplicationId() ); ReIndexService.ReIndexStatus status = reIndexService.rebuildIndex( builder ); http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5a7f9c09/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/IndexingUtils.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/IndexingUtils.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/IndexingUtils.java index 8b248aa..bc15149 100644 --- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/IndexingUtils.java +++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/IndexingUtils.java @@ -99,6 +99,8 @@ public class IndexingUtils { /** * Create our sub scope. This is the ownerUUID + type + * + * TODO make this format more readable and parsable */ public static String createContextName( final ApplicationScope applicationScope, final SearchEdge scope ) { StringBuilder sb = new StringBuilder(); http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5a7f9c09/stack/pom.xml ---------------------------------------------------------------------- diff --git a/stack/pom.xml b/stack/pom.xml index 762607d..4559db2 100644 --- a/stack/pom.xml +++ b/stack/pom.xml @@ -1241,6 +1241,13 @@ <groupId>org.apache.jclouds</groupId> <artifactId>jclouds-blobstore</artifactId> <version>${jclouds.version}</version> + <exclusions> + <!-- blows up our version of guice--> + <exclusion> + <groupId>com.google.inject.extensions</groupId> + <artifactId>guice-assistedinject</artifactId> + </exclusion> + </exclusions> </dependency> <dependency> @@ -1262,6 +1269,12 @@ <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> </exclusion> + + <!-- blows up our version of guice--> + <exclusion> + <groupId>com.google.inject.extensions</groupId> + <artifactId>guice-assistedinject</artifactId> + </exclusion> </exclusions> </dependency> http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5a7f9c09/stack/rest/src/main/java/org/apache/usergrid/rest/IndexResource.java ---------------------------------------------------------------------- diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/IndexResource.java b/stack/rest/src/main/java/org/apache/usergrid/rest/IndexResource.java index 668c05c..ffb9700 100644 --- a/stack/rest/src/main/java/org/apache/usergrid/rest/IndexResource.java +++ b/stack/rest/src/main/java/org/apache/usergrid/rest/IndexResource.java @@ -20,25 +20,34 @@ package org.apache.usergrid.rest; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import com.sun.jersey.api.json.JSONWithPadding; -import org.apache.usergrid.persistence.EntityManagerFactory; -import org.apache.usergrid.persistence.EntityRef; -import org.apache.usergrid.persistence.index.utils.UUIDUtils; -import org.apache.usergrid.rest.security.annotations.RequireSystemAccess; + +import java.util.Map; +import java.util.UUID; + +import javax.ws.rs.DefaultValue; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.UriInfo; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; -import javax.ws.rs.*; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.UriInfo; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import org.apache.usergrid.corepersistence.index.ReIndexRequestBuilder; +import org.apache.usergrid.corepersistence.index.ReIndexService; +import org.apache.usergrid.persistence.index.utils.UUIDUtils; +import org.apache.usergrid.rest.security.annotations.RequireSystemAccess; + +import com.google.common.base.Preconditions; +import com.sun.jersey.api.json.JSONWithPadding; + /** * Classy class class. @@ -46,260 +55,239 @@ import java.util.UUID; @Component @Scope( "singleton" ) @Produces( { - MediaType.APPLICATION_JSON, "application/javascript", "application/x-javascript", "text/ecmascript", - "application/ecmascript", "text/jscript" + MediaType.APPLICATION_JSON, "application/javascript", "application/x-javascript", "text/ecmascript", + "application/ecmascript", "text/jscript" } ) public class IndexResource extends AbstractContextResource { - private static final Logger logger = LoggerFactory.getLogger(IndexResource.class); + private static final Logger logger = LoggerFactory.getLogger( IndexResource.class ); + private static final String UPDATED_FIELD = "updated"; - public IndexResource(){ + + public IndexResource() { super(); } + @RequireSystemAccess - @PUT + @POST @Path( "rebuild" ) - public JSONWithPadding rebuildIndexes( @Context UriInfo ui, - @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback ) - throws Exception { + public JSONWithPadding rebuildIndexesPost( @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback ) + throws Exception { - ApiResponse response = createApiResponse(); - response.setAction( "rebuild indexes" ); + logger.info( "Rebuilding all applications" ); - final EntityManagerFactory.ProgressObserver po = new EntityManagerFactory.ProgressObserver() { + final ReIndexRequestBuilder request = createRequest(); + return executeAndCreateResponse( request, callback ); + } - @Override - public void onProgress( final EntityRef entity ) { - logger.info( "Indexing entity {}:{} ", entity.getType(), entity.getUuid() ); - } - }; + @RequireSystemAccess + @PUT + @Path( "rebuild" ) + public JSONWithPadding rebuildIndexesPut( final Map<String, Object> payload, + @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback ) + throws Exception { - final Thread rebuild = new Thread() { + logger.info( "Resuming rebuilding all applications" ); + final ReIndexRequestBuilder request = createRequest(); - @Override - public void run() { - logger.info( "Rebuilding all indexes" ); + return executeResumeAndCreateResponse( payload, request, callback ); + } - try { - emf.rebuildAllIndexes( po ); - } - catch ( Exception e ) { - logger.error( "Unable to rebuild indexes", e ); - } - logger.info( "Completed all indexes" ); - } - }; + @RequireSystemAccess + @POST + @Path( "rebuild/" + RootResource.APPLICATION_ID_PATH ) + public JSONWithPadding rebuildIndexesPut( @PathParam( "applicationId" ) String applicationIdStr, + @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback, + @QueryParam( "delay" ) @DefaultValue( "10" ) final long delay ) - rebuild.setName( "Index rebuild all usergrid" ); - rebuild.setDaemon( true ); - rebuild.start(); + throws Exception { - response.setSuccess(); + logger.info( "Rebuilding application {}", applicationIdStr ); - return new JSONWithPadding( response, callback ); + + final UUID appId = UUIDUtils.tryExtractUUID( applicationIdStr ); + + final ReIndexRequestBuilder request = createRequest().withApplicationId( appId ); + + return executeAndCreateResponse( request, callback ); } @RequireSystemAccess @PUT @Path( "rebuild/" + RootResource.APPLICATION_ID_PATH ) - public JSONWithPadding rebuildIndexes( @Context UriInfo ui, @PathParam( "applicationId" ) String applicationIdStr, - @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback, - @QueryParam( "delay" ) @DefaultValue( "10" ) final long delay ) - - throws Exception { - - final UUID appId = UUIDUtils.tryExtractUUID(applicationIdStr); - ApiResponse response = createApiResponse(); - response.setAction( "rebuild indexes started" ); + public JSONWithPadding rebuildIndexesPut( final Map<String, Object> payload, + @PathParam( "applicationId" ) String applicationIdStr, + @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback, + @QueryParam( "delay" ) @DefaultValue( "10" ) final long delay ) - final EntityManagerFactory.ProgressObserver po = new EntityManagerFactory.ProgressObserver() { + throws Exception { - @Override - public void onProgress( final EntityRef entity ) { - logger.info( "Indexing entity {}:{}", entity.getType(), entity.getUuid() ); - } + logger.info( "Resuming rebuilding application {}", applicationIdStr ); + final UUID appId = UUIDUtils.tryExtractUUID( applicationIdStr ); - }; - - - final Thread rebuild = new Thread() { - - @Override - public void run() { - + final ReIndexRequestBuilder request = createRequest().withApplicationId( appId ); - logger.info( "Started rebuilding application {} in collection ", appId ); + return executeResumeAndCreateResponse( payload, request, callback ); + } - try { - emf.rebuildApplicationIndexes( appId, po ); - } - catch ( Exception e ) { - logger.error( "Unable to re-index application", e ); - } + @RequireSystemAccess + @POST + @Path( "rebuild/" + RootResource.APPLICATION_ID_PATH + "/{collectionName}" ) + public JSONWithPadding rebuildIndexesPost( @PathParam( "applicationId" ) final String applicationIdStr, + @PathParam( "collectionName" ) final String collectionName, + @QueryParam( "reverse" ) @DefaultValue( "false" ) final Boolean reverse, + @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback ) + throws Exception { - logger.info( "Completed rebuilding application {} in collection ", appId ); - } - }; + logger.info( "Rebuilding collection {} in application {}", collectionName, applicationIdStr ); - rebuild.setName( String.format( "Index rebuild for app %s", appId ) ); - rebuild.setDaemon( true ); - rebuild.start(); + final UUID appId = UUIDUtils.tryExtractUUID( applicationIdStr ); - response.setSuccess(); + final ReIndexRequestBuilder request = + createRequest().withApplicationId( appId ).withCollection( collectionName ); - return new JSONWithPadding( response, callback ); + return executeAndCreateResponse( request, callback ); } @RequireSystemAccess @PUT @Path( "rebuild/" + RootResource.APPLICATION_ID_PATH + "/{collectionName}" ) - public JSONWithPadding rebuildIndexes( - @Context UriInfo ui, - @PathParam( "applicationId" ) final String applicationIdStr, - @PathParam( "collectionName" ) final String collectionName, - @QueryParam( "reverse" ) @DefaultValue( "false" ) final Boolean reverse, - @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback) throws Exception { + public JSONWithPadding rebuildIndexesPut( final Map<String, Object> payload, + @PathParam( "applicationId" ) final String applicationIdStr, + @PathParam( "collectionName" ) final String collectionName, + @QueryParam( "reverse" ) @DefaultValue( "false" ) final Boolean reverse, + @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback ) + throws Exception { - final UUID appId = UUIDUtils.tryExtractUUID( applicationIdStr ); - ApiResponse response = createApiResponse(); - response.setAction( "rebuild indexes" ); + logger.info( "Resuming rebuilding collection {} in application {}", collectionName, applicationIdStr ); - final Thread rebuild = new Thread() { + final UUID appId = UUIDUtils.tryExtractUUID( applicationIdStr ); - public void run() { + final ReIndexRequestBuilder request = + createRequest().withApplicationId( appId ).withCollection( collectionName ); - logger.info( "Started rebuilding application {} in collection {}", appId, collectionName ); + return executeResumeAndCreateResponse( payload, request, callback ); + } - try { - rebuildCollection( appId, collectionName, reverse ); - } catch (Exception e) { - // TODO: handle this in rebuildCollection() instead - throw new RuntimeException("Error rebuilding collection"); - } + @RequireSystemAccess + @POST + @Path( "rebuild/management" ) + public JSONWithPadding rebuildInternalIndexesPost( + @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback ) throws Exception { - logger.info( "Completed rebuilding application {} in collection {}", appId, collectionName ); - } - }; - rebuild.setName( String.format( "Index rebuild for app %s and collection %s", appId, collectionName ) ); - rebuild.setDaemon( true ); - rebuild.start(); + final UUID managementAppId = emf.getManagementAppId(); - response.setSuccess(); + logger.info( "Rebuilding management application with id {} ", managementAppId ); + final ReIndexRequestBuilder request = createRequest().withApplicationId( managementAppId ); - return new JSONWithPadding( response, callback ); + return executeAndCreateResponse( request, callback ); } + @RequireSystemAccess - @PUT - @Path( "rebuildinternal" ) - public JSONWithPadding rebuildInternalIndexes( - @Context UriInfo ui, - @PathParam( "applicationId" ) String applicationIdStr, - @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback, - @QueryParam( "delay" ) @DefaultValue( "10" ) final long delay ) throws Exception { + @POST + @Path( "rebuild/management" ) + public JSONWithPadding rebuildInternalIndexesPut( final Map<String, Object> payload, + @QueryParam( "callback" ) @DefaultValue( "callback" ) + String callback ) throws Exception { - final UUID appId = UUIDUtils.tryExtractUUID(applicationIdStr); - ApiResponse response = createApiResponse(); - response.setAction( "rebuild indexes started" ); + final UUID managementAppId = emf.getManagementAppId(); - final EntityManagerFactory.ProgressObserver po = new EntityManagerFactory.ProgressObserver() { + logger.info( "Resuming rebuilding management application with id {} ", managementAppId ); + final ReIndexRequestBuilder request = createRequest().withApplicationId( managementAppId ); - @Override - public void onProgress( final EntityRef entity ) { - logger.info( "Indexing entity {}:{}", entity.getType(), entity.getUuid() ); - } + return executeResumeAndCreateResponse( payload, request, callback ); + } - }; - final Thread rebuild = new Thread() { + @RequireSystemAccess + @POST + public JSONWithPadding addIndex( @Context UriInfo ui, Map<String, Object> config, + @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback ) + throws Exception { - @Override - public void run() { + Preconditions + .checkNotNull( config, "Payload for config is null, please pass {replicas:int, shards:int} in body" ); - logger.info( "Started rebuilding internal indexes", appId ); + ApiResponse response = createApiResponse(); - try { - emf.rebuildInternalIndexes( po ); - } - catch ( Exception e ) { - logger.error( "Unable to re-index internals", e ); - } + if ( !config.containsKey( "replicas" ) || !config.containsKey( "shards" ) || + !( config.get( "replicas" ) instanceof Integer ) || !( config.get( "shards" ) instanceof Integer ) ) { + throw new IllegalArgumentException( "body must contains 'replicas' of type int and 'shards' of type int" ); + } - logger.info( "Completed rebuilding internal indexes" ); - } - }; + if ( !config.containsKey( "indexSuffix" ) ) { + throw new IllegalArgumentException( "Please add an indexSuffix to your post" ); + } - rebuild.setName( String.format( "Index rebuild for app %s", appId ) ); - rebuild.setDaemon( true ); - rebuild.start(); - response.setSuccess(); + emf.addIndex( config.get( "indexSuffix" ).toString(), ( int ) config.get( "shards" ), + ( int ) config.get( "replicas" ), ( String ) config.get( "writeConsistency" ) ); + response.setAction( "Add index to alias" ); return new JSONWithPadding( response, callback ); } - @RequireSystemAccess - @POST - @Path( RootResource.APPLICATION_ID_PATH ) - public JSONWithPadding addIndex(@Context UriInfo ui, - Map<String, Object> config, - @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback) throws Exception{ - Preconditions.checkNotNull(config,"Payload for config is null, please pass {replicas:int, shards:int} in body"); + private ReIndexService getReIndexService() { + return injector.getInstance( ReIndexService.class ); + } - ApiResponse response = createApiResponse(); - if (!config.containsKey("replicas") || !config.containsKey("shards") || - !(config.get("replicas") instanceof Integer) || !(config.get("shards") instanceof Integer)){ - throw new IllegalArgumentException("body must contains 'replicas' of type int and 'shards' of type int"); - } + private ReIndexRequestBuilder createRequest() { + return createRequest(); + } - if(!config.containsKey("indexSuffix")) { - throw new IllegalArgumentException("Please add an indexSuffix to your post"); - } + private JSONWithPadding executeResumeAndCreateResponse( final Map<String, Object> payload, + final ReIndexRequestBuilder request, + final String callback ) { - emf.addIndex( config.get("indexSuffix").toString(), - (int) config.get("shards"),(int) config.get("replicas"),(String)config.get("writeConsistency")); - response.setAction("Add index to alias"); + Preconditions.checkArgument( payload.containsKey( UPDATED_FIELD ), + "You must specified the field \"updated\" in the payload" ); - return new JSONWithPadding(response, callback); + //add our updated timestamp to the request + if ( !payload.containsKey( UPDATED_FIELD ) ) { + final long timestamp = ( long ) payload.get( UPDATED_FIELD ); + request.withStartTimestamp( timestamp ); + } + return executeAndCreateResponse( request, callback ); } - private void rebuildCollection( - final UUID applicationId, - final String collectionName, - final boolean reverse) throws Exception { - EntityManagerFactory.ProgressObserver po = new EntityManagerFactory.ProgressObserver() { + /** + * Execute the request and return the response. + */ + private JSONWithPadding executeAndCreateResponse( final ReIndexRequestBuilder request, final String callback ) { - @Override - public void onProgress( final EntityRef entity ) { - logger.info( "Indexing entity {}:{}", entity.getType(), entity.getUuid() ); - } - }; + final ReIndexService.ReIndexStatus status = getReIndexService().rebuildIndex( request ); - logger.info( "Reindexing for app id: {} and collection {}", applicationId, collectionName ); + final ApiResponse response = createApiResponse(); - emf.rebuildCollectionIndex(Optional.of(applicationId),Optional.of(collectionName)); - getEntityIndex().refreshAsync().toBlocking().first(); - } + response.setAction( "rebuild indexes" ); + response.setProperty( "jobId", status.getJobId() ); + response.setProperty( "status", status.getStatus() ); + response.setProperty( "lastUpdatedEpoch", status.getLastUpdated() ); + response.setProperty( "numberQueued", status.getNumberProcessed() ); + response.setSuccess(); + return new JSONWithPadding( response, callback ); + } } http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5a7f9c09/stack/rest/src/main/resources/usergrid-rest-context.xml ---------------------------------------------------------------------- diff --git a/stack/rest/src/main/resources/usergrid-rest-context.xml b/stack/rest/src/main/resources/usergrid-rest-context.xml index 5c63e72..16f4541 100644 --- a/stack/rest/src/main/resources/usergrid-rest-context.xml +++ b/stack/rest/src/main/resources/usergrid-rest-context.xml @@ -47,9 +47,6 @@ <property name="securityManager" ref="securityManager" /> </bean> - <bean id="mongoServer" class="org.apache.usergrid.mongo.MongoServer" - init-method="startServer" destroy-method="stopServer" /> - <!-- override the security manager --> <bean id="securityManager" class="org.apache.usergrid.rest.security.shiro.RestSecurityManager"> <property name="cacheManager" ref="cacheManager" /> http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5a7f9c09/stack/rest/src/main/resources/usergrid-rest-deploy-context.xml ---------------------------------------------------------------------- diff --git a/stack/rest/src/main/resources/usergrid-rest-deploy-context.xml b/stack/rest/src/main/resources/usergrid-rest-deploy-context.xml index 9965dbc..e9b7ccd 100644 --- a/stack/rest/src/main/resources/usergrid-rest-deploy-context.xml +++ b/stack/rest/src/main/resources/usergrid-rest-deploy-context.xml @@ -33,7 +33,6 @@ <property name="locations"> <list> <value>classpath:/usergrid-default.properties</value> - <value>${usergrid-custom-spring-properties}</value> </list> </property> </bean>