Repository: zest-java Updated Branches: refs/heads/develop 6b7650a91 -> 7d1eccbfd
library/restlet: minor enhancements - allow usage without an authenticated user - add utility method to create ZestEntityRestlet instances - add ZestServerServlet for easy deployment using the http library - minor assembly fixes - remove unused imports - some typo fixes Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/7d1eccbf Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/7d1eccbf Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/7d1eccbf Branch: refs/heads/develop Commit: 7d1eccbfd5d2c11de94daf155a9ce2fde76d8aec Parents: 6b7650a Author: Paul Merlin <[email protected]> Authored: Tue Sep 29 17:30:26 2015 +0200 Committer: Paul Merlin <[email protected]> Committed: Tue Sep 29 17:30:26 2015 +0200 ---------------------------------------------------------------------- .../apache/zest/library/restlet/RestLink.java | 1 - .../zest/library/restlet/ZestEntityRestlet.java | 52 ++++++++++++++------ .../zest/library/restlet/ZestServerServlet.java | 50 +++++++++++++++++++ .../restlet/assembly/CrudServiceAssembler.java | 4 +- .../RestletCrudConnectivityAssembler.java | 30 ++++++----- .../assembly/connectivity/RestModule.java | 4 +- .../restlet/assembly/domain/CrudModule.java | 4 +- .../restlet/assembly/domain/DomainLayer.java | 3 +- .../restlet/resource/CreationResource.java | 4 +- .../resource/DefaultResourceFactoryImpl.java | 2 +- .../restlet/resource/EntryPointResource.java | 2 +- ...org.restlet.engine.converter.ConverterHelper | 2 +- 12 files changed, 119 insertions(+), 39 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zest-java/blob/7d1eccbf/libraries/restlet/src/main/java/org/apache/zest/library/restlet/RestLink.java ---------------------------------------------------------------------- diff --git a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/RestLink.java b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/RestLink.java index 4dc03ce..5d9a632 100644 --- a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/RestLink.java +++ b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/RestLink.java @@ -20,7 +20,6 @@ package org.apache.zest.library.restlet; -import org.apache.zest.api.common.Optional; import org.apache.zest.api.property.Property; public interface RestLink extends HasDescription http://git-wip-us.apache.org/repos/asf/zest-java/blob/7d1eccbf/libraries/restlet/src/main/java/org/apache/zest/library/restlet/ZestEntityRestlet.java ---------------------------------------------------------------------- diff --git a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/ZestEntityRestlet.java b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/ZestEntityRestlet.java index 94efac3..f96e736 100644 --- a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/ZestEntityRestlet.java +++ b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/ZestEntityRestlet.java @@ -15,30 +15,30 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * */ - package org.apache.zest.library.restlet; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; + import org.apache.zest.api.common.Optional; import org.apache.zest.api.entity.EntityComposite; import org.apache.zest.api.entity.Identity; import org.apache.zest.api.injection.scope.Service; import org.apache.zest.api.injection.scope.Structure; import org.apache.zest.api.injection.scope.Uses; +import org.apache.zest.api.structure.Module; import org.apache.zest.api.unitofwork.NoSuchEntityException; import org.apache.zest.api.unitofwork.UnitOfWork; import org.apache.zest.api.unitofwork.UnitOfWorkFactory; -import org.apache.zest.api.usecase.Usecase; import org.apache.zest.api.usecase.UsecaseBuilder; import org.apache.zest.api.value.ValueBuilder; import org.apache.zest.api.value.ValueBuilderFactory; import org.apache.zest.library.restlet.metainfo.UserIdentity; import org.apache.zest.library.restlet.repository.RepositoryLocator; +import org.apache.zest.library.restlet.resource.DefaultResourceFactoryImpl; import org.apache.zest.library.restlet.resource.NotPresentException; import org.apache.zest.library.restlet.resource.ResourceFactory; import org.apache.zest.library.restlet.resource.ServerResource; @@ -59,6 +59,29 @@ import org.restlet.security.User; public class ZestEntityRestlet<T extends Identity> extends Restlet { + /** + * Creates a new ZestEntityRestlet instance for the given resource and entity classes. + * <p> + * This utility method should be used in your org.restlet.Application to create routes. + * + * @param <K> Parameterized type of the resource + * @param <T> Parameterized type of the entity + * @param module Module to use for object instanciation + * @param router Restlet Router + * @param resourceClass Resource class + * @param entityClass Entity class + * + * @return The ZestEntityRestlet instance + */ + public static <K extends Identity, T extends ServerResource<K>> Restlet newInstance( + Module module, Router router, Class<T> resourceClass, Class<K> entityClass + ) + { + @SuppressWarnings( "unchecked" ) + ResourceFactory<K, T> factory = module.newObject( DefaultResourceFactoryImpl.class, resourceClass, router ); + return module.newObject( ZestEntityRestlet.class, factory, router, entityClass, new ZestConverter( module ) ); + } + @Structure private ValueBuilderFactory vbf; @@ -253,18 +276,19 @@ public class ZestEntityRestlet<T extends Identity> extends Restlet private UnitOfWork createUnitOfWork( Request request ) { + UsecaseBuilder usecaseBuilder = UsecaseBuilder.buildUsecase( request.getResourceRef().getIdentifier( true ) ); User user = request.getClientInfo().getUser(); - UserIdentity userIdentity = new UserIdentity( user.getIdentifier(), - user.getName(), - user.getEmail(), - user.getFirstName(), - user.getLastName() - ); - Usecase usecase = UsecaseBuilder - .buildUsecase( request.getResourceRef().getIdentifier( true ) ) - .withMetaInfo( userIdentity ) - .newUsecase(); - return uowf.newUnitOfWork( usecase ); + if( user != null ) + { + UserIdentity userIdentity = new UserIdentity( user.getIdentifier(), + user.getName(), + user.getEmail(), + user.getFirstName(), + user.getLastName() + ); + usecaseBuilder.withMetaInfo( userIdentity ); + } + return uowf.newUnitOfWork( usecaseBuilder.newUsecase() ); } private <K> K convertToObject( Class<K> type, Request request ) http://git-wip-us.apache.org/repos/asf/zest-java/blob/7d1eccbf/libraries/restlet/src/main/java/org/apache/zest/library/restlet/ZestServerServlet.java ---------------------------------------------------------------------- diff --git a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/ZestServerServlet.java b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/ZestServerServlet.java new file mode 100644 index 0000000..2fb77c0 --- /dev/null +++ b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/ZestServerServlet.java @@ -0,0 +1,50 @@ +/* + * 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.library.restlet; + +import javax.servlet.Servlet; + +import org.apache.zest.api.injection.scope.Structure; +import org.apache.zest.api.mixin.Mixins; +import org.apache.zest.api.structure.Module; +import org.restlet.Context; +import org.restlet.ext.servlet.ServerServlet; + +/** + * Restlet ServerServlet backed by a org.restlet.Application object. + */ +@Mixins( ZestServerServlet.Mixin.class ) +public interface ZestServerServlet + extends Servlet +{ + class Mixin + extends ServerServlet + { + private static final long serialVersionUID = 1L; + + @Structure + private Module module; + + @Override + protected org.restlet.Application createApplication( Context parentContext ) + { + return module.newObject( org.restlet.Application.class, parentContext.createChildContext() ); + } + } +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/7d1eccbf/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/CrudServiceAssembler.java ---------------------------------------------------------------------- diff --git a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/CrudServiceAssembler.java b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/CrudServiceAssembler.java index 1cfe412..8e88ef8 100644 --- a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/CrudServiceAssembler.java +++ b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/CrudServiceAssembler.java @@ -26,6 +26,7 @@ import org.apache.zest.bootstrap.ModuleAssembly; import org.apache.zest.library.restlet.identity.IdentityManager; import org.apache.zest.library.restlet.identity.IdentityMappingConfiguration; import org.apache.zest.library.restlet.repository.RepositoryLocator; +import org.apache.zest.spi.uuid.UuidIdentityGeneratorService; public class CrudServiceAssembler implements Assembler @@ -34,7 +35,8 @@ public class CrudServiceAssembler public void assemble( ModuleAssembly module ) throws AssemblyException { - module.entities( IdentityMappingConfiguration.class ).visibleIn( Visibility.module ); + module.services( UuidIdentityGeneratorService.class ); + module.entities( IdentityMappingConfiguration.class ); module.services( IdentityManager.class ).visibleIn( Visibility.application ).instantiateOnStartup(); module.services( RepositoryLocator.class ).visibleIn( Visibility.application ); } http://git-wip-us.apache.org/repos/asf/zest-java/blob/7d1eccbf/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/RestletCrudConnectivityAssembler.java ---------------------------------------------------------------------- diff --git a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/RestletCrudConnectivityAssembler.java b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/RestletCrudConnectivityAssembler.java index faa607c..7bba71d 100644 --- a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/RestletCrudConnectivityAssembler.java +++ b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/RestletCrudConnectivityAssembler.java @@ -15,10 +15,10 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * */ package org.apache.zest.library.restlet.assembly; +import org.apache.zest.api.common.Visibility; import org.apache.zest.bootstrap.Assembler; import org.apache.zest.bootstrap.AssemblyException; import org.apache.zest.bootstrap.ModuleAssembly; @@ -46,16 +46,24 @@ public class RestletCrudConnectivityAssembler public void assemble( ModuleAssembly module ) throws AssemblyException { - module.values( EntryPointResource.class ); - module.values( EntityListResource.class ); - module.values( EntityResource.class ); - module.values( CreationResource.class ); - module.values( Command.class, FormField.class, RestForm.class, RestLink.class, EntityList.class, EntityRef.class ); - module.objects( DefaultResourceFactoryImpl.class ); - module.objects( JsonRepresentation.class ); - module.objects( FormRepresentation.class ); - module.objects( ZestEntityRestlet.class ); - module.services( ResourceBuilder.class ); + module.values( EntryPointResource.class, + EntityListResource.class, + EntityResource.class, + CreationResource.class ) + .visibleIn( Visibility.layer ); + module.values( Command.class, + FormField.class, + RestForm.class, + RestLink.class, + EntityList.class, + EntityRef.class ) + .visibleIn( Visibility.layer ); + module.objects( DefaultResourceFactoryImpl.class, + JsonRepresentation.class, + FormRepresentation.class, + ZestEntityRestlet.class ) + .visibleIn( Visibility.layer ); + module.services( ResourceBuilder.class ).visibleIn( Visibility.layer ); new JacksonValueSerializationAssembler().assemble( module ); } } http://git-wip-us.apache.org/repos/asf/zest-java/blob/7d1eccbf/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/connectivity/RestModule.java ---------------------------------------------------------------------- diff --git a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/connectivity/RestModule.java b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/connectivity/RestModule.java index 12f6201..1d77e07 100644 --- a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/connectivity/RestModule.java +++ b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/connectivity/RestModule.java @@ -15,9 +15,7 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * */ - package org.apache.zest.library.restlet.assembly.connectivity; import org.apache.zest.bootstrap.AssemblyException; @@ -30,7 +28,7 @@ import org.apache.zest.library.restlet.resource.EntryPoint; public class RestModule implements ModuleAssembler { - public static String NAME; + public static final String NAME = "REST Module"; @Override public ModuleAssembly assemble( LayerAssembly layer, ModuleAssembly module ) http://git-wip-us.apache.org/repos/asf/zest-java/blob/7d1eccbf/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/domain/CrudModule.java ---------------------------------------------------------------------- diff --git a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/domain/CrudModule.java b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/domain/CrudModule.java index acac756..8520e9d 100644 --- a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/domain/CrudModule.java +++ b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/domain/CrudModule.java @@ -15,9 +15,7 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * */ - package org.apache.zest.library.restlet.assembly.domain; import org.apache.zest.bootstrap.AssemblyException; @@ -29,6 +27,8 @@ import org.apache.zest.library.restlet.assembly.CrudServiceAssembler; public class CrudModule implements ModuleAssembler { + public static final String NAME = "CRUD Module"; + @Override public ModuleAssembly assemble( LayerAssembly layer, ModuleAssembly module ) throws AssemblyException http://git-wip-us.apache.org/repos/asf/zest-java/blob/7d1eccbf/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/domain/DomainLayer.java ---------------------------------------------------------------------- diff --git a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/domain/DomainLayer.java b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/domain/DomainLayer.java index fc0ee3d..b94b0ab 100644 --- a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/domain/DomainLayer.java +++ b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/assembly/domain/DomainLayer.java @@ -15,9 +15,7 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * */ - package org.apache.zest.library.restlet.assembly.domain; import java.util.function.Function; @@ -37,6 +35,7 @@ public class DomainLayer extends LayeredLayerAssembler public LayerAssembly assemble( LayerAssembly layer ) throws AssemblyException { + createModule( layer, CrudModule.class ); return layer; } http://git-wip-us.apache.org/repos/asf/zest-java/blob/7d1eccbf/libraries/restlet/src/main/java/org/apache/zest/library/restlet/resource/CreationResource.java ---------------------------------------------------------------------- diff --git a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/resource/CreationResource.java b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/resource/CreationResource.java index 5591793..8786868 100644 --- a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/resource/CreationResource.java +++ b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/resource/CreationResource.java @@ -37,10 +37,10 @@ import org.apache.zest.library.restlet.identity.IdentityManager; import org.apache.zest.library.restlet.repository.RepositoryLocator; import org.restlet.data.Method; -@Mixins( CreationResource.CreateHostMixin.class ) +@Mixins( CreationResource.Mixin.class ) public interface CreationResource<T extends Identity> extends ServerResource<T> { - abstract class CreateHostMixin<T extends Identity> + abstract class Mixin<T extends Identity> implements CreationResource<T> { @Structure http://git-wip-us.apache.org/repos/asf/zest-java/blob/7d1eccbf/libraries/restlet/src/main/java/org/apache/zest/library/restlet/resource/DefaultResourceFactoryImpl.java ---------------------------------------------------------------------- diff --git a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/resource/DefaultResourceFactoryImpl.java b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/resource/DefaultResourceFactoryImpl.java index af6f07e..944cd41 100644 --- a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/resource/DefaultResourceFactoryImpl.java +++ b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/resource/DefaultResourceFactoryImpl.java @@ -86,7 +86,7 @@ public class DefaultResourceFactoryImpl<K extends Identity, T extends ServerReso Object id = attributes.get( "id" ); if( id == null ) { - throw new IllegalArgumentException( resourceType.getName() + " implements Identity and must have an {id} attribute in the path templatee." ); + throw new IllegalArgumentException( resourceType.getName() + " implements Identity and must have an {id} attribute in the path template." ); } return id; } http://git-wip-us.apache.org/repos/asf/zest-java/blob/7d1eccbf/libraries/restlet/src/main/java/org/apache/zest/library/restlet/resource/EntryPointResource.java ---------------------------------------------------------------------- diff --git a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/resource/EntryPointResource.java b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/resource/EntryPointResource.java index 3a3667b..57a855e 100644 --- a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/resource/EntryPointResource.java +++ b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/resource/EntryPointResource.java @@ -72,7 +72,7 @@ public interface EntryPointResource extends ServerResource<EntryPoint> TemplateRoute route = (TemplateRoute) r; Template template = route.getTemplate(); // Only include patterns that doesn't have variables, and has a proper name. - if( template.getVariableNames().size() == 0 && route.getName().indexOf( '>' ) == -1 ) + if( template.getVariableNames().isEmpty() && route.getName().indexOf( '>' ) == -1 ) { Reference hostRef = parameters.request().get().getOriginalRef(); Reference reference = new Reference( hostRef, template.getPattern() ); http://git-wip-us.apache.org/repos/asf/zest-java/blob/7d1eccbf/libraries/restlet/src/main/resources/META_INF/services/org.restlet.engine.converter.ConverterHelper ---------------------------------------------------------------------- diff --git a/libraries/restlet/src/main/resources/META_INF/services/org.restlet.engine.converter.ConverterHelper b/libraries/restlet/src/main/resources/META_INF/services/org.restlet.engine.converter.ConverterHelper index 381cf8c..2673c63 100644 --- a/libraries/restlet/src/main/resources/META_INF/services/org.restlet.engine.converter.ConverterHelper +++ b/libraries/restlet/src/main/resources/META_INF/services/org.restlet.engine.converter.ConverterHelper @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -org.apache.zest.library.restlet.Qi4jConverter +org.apache.zest.library.restlet.ZestConverter
