Re: InjectPageLink and InjectExternalLink
done! http://issues.apache.org/jira/browse/TAPESTRY-1184 andyhot wrote: Looks interesting. Please add a JIRA and attach the files there. - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: InjectPageLink and InjectExternalLink
Hi, Very good, indeed very good proposal. I'll use it right away. Thank you. Renat On 12/12/06, jimlaren [EMAIL PROTECTED] wrote: As a return type of listener method,ILink can be used to perform a redirect-after-post.So it will be a great convenience to inject ILink using annotations. @InjectPageLink(Home) public abstract ILink getHomeLink(); @InjectExternalLink(ShowCategory) public abstract ILink getCategoryLink(Long id); public ILink goHome(){ return getHomeLink(); } public ILink showCategory(Long id){ return getCategoryLink(id); } The sources: PageLink @Target( { ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface InjectPageLink { String value(); } public class InjectPageLinkAnnotationWorker implements MethodAnnotationEnhancementWorker { public void performEnhancement(EnhancementOperation op, IComponentSpecification spec, Method method, Location location) { if (!method.getReturnType().equals(ILink.class)) throw new ApplicationRuntimeException( InjectPageLink annotation must return ILink); InjectPageLink injectPageLink = method .getAnnotation(InjectPageLink.class); String pageName = injectPageLink.value(); BodyBuilder builder = new BodyBuilder(); builder.begin(); builder .addln( return getPage().getRequestCycle().getInfrastructure().getServiceMap().getService(org.apache.tapestry.Tapestry.PAGE_SERVICE).getLink(false,\{0}\);, pageName); builder.end(); op.addMethod(Modifier.PUBLIC, new MethodSignature(method), builder .toString(), location); if (isGetter(method)) op.claimReadonlyProperty(AnnotationUtils.getPropertyName(method)); } boolean isGetter(Method method) { return method.getName().startsWith(get) method.getParameterTypes().length == 0; } } ExternalLink @Target( { ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface InjectExternalLink { String value(); } public class InjectExternalLinkAnnotationWorker implements MethodAnnotationEnhancementWorker { public void performEnhancement(EnhancementOperation op, IComponentSpecification spec, Method method, Location location) { if (!method.getReturnType().equals(ILink.class)) throw new ApplicationRuntimeException( injectExternalLink annotation must return ILink); InjectExternalLink injectExternalLink = method .getAnnotation(InjectExternalLink.class); String pageName = injectExternalLink.value(); BodyBuilder builder = new BodyBuilder(); builder.begin(); Class[] parameterTypes = method.getParameterTypes(); int paramCount = Tapestry.size(parameterTypes); if (paramCount 0) { if (parameterTypes[0].isArray()) { builder .addln( return getPage().getRequestCycle().getInfrastructure().getServiceMap().getService(org.apache.tapestry.Tapestry.EXTERNAL_SERVICE).getLink(false, new org.apache.tapestry.engine.ExternalServiceParameter(\{0}\,$1));, pageName); } else { builder .addln( java.lang.Object[] params = new java.lang.Object[{0}];, paramCount); for (int i = 0; i paramCount; i++) { builder.add(params[{0}] = , i); if (parameterTypes[i].isPrimitive()) builder.add(($w) ); builder.addln(${0};, i + 1); } builder .addln( return getPage().getRequestCycle().getInfrastructure().getServiceMap().getService(org.apache.tapestry.Tapestry.EXTERNAL_SERVICE).getLink(false, new org.apache.tapestry.engine.ExternalServiceParameter(\{0}\,params));,
InjectPageLink and InjectExternalLink
As a return type of listener method,ILink can be used to perform a redirect-after-post.So it will be a great convenience to inject ILink using annotations. @InjectPageLink(Home) public abstract ILink getHomeLink(); @InjectExternalLink(ShowCategory) public abstract ILink getCategoryLink(Long id); public ILink goHome(){ return getHomeLink(); } public ILink showCategory(Long id){ return getCategoryLink(id); } The sources: PageLink @Target( { ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface InjectPageLink { String value(); } public class InjectPageLinkAnnotationWorker implements MethodAnnotationEnhancementWorker { public void performEnhancement(EnhancementOperation op, IComponentSpecification spec, Method method, Location location) { if (!method.getReturnType().equals(ILink.class)) throw new ApplicationRuntimeException( InjectPageLink annotation must return ILink); InjectPageLink injectPageLink = method .getAnnotation(InjectPageLink.class); String pageName = injectPageLink.value(); BodyBuilder builder = new BodyBuilder(); builder.begin(); builder .addln( return getPage().getRequestCycle().getInfrastructure().getServiceMap().getService(org.apache.tapestry.Tapestry.PAGE_SERVICE).getLink(false,\{0}\);, pageName); builder.end(); op.addMethod(Modifier.PUBLIC, new MethodSignature(method), builder .toString(), location); if (isGetter(method)) op.claimReadonlyProperty(AnnotationUtils.getPropertyName(method)); } boolean isGetter(Method method) { return method.getName().startsWith(get) method.getParameterTypes().length == 0; } } ExternalLink @Target( { ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface InjectExternalLink { String value(); } public class InjectExternalLinkAnnotationWorker implements MethodAnnotationEnhancementWorker { public void performEnhancement(EnhancementOperation op, IComponentSpecification spec, Method method, Location location) { if (!method.getReturnType().equals(ILink.class)) throw new ApplicationRuntimeException( injectExternalLink annotation must return ILink); InjectExternalLink injectExternalLink = method .getAnnotation(InjectExternalLink.class); String pageName = injectExternalLink.value(); BodyBuilder builder = new BodyBuilder(); builder.begin(); Class[] parameterTypes = method.getParameterTypes(); int paramCount = Tapestry.size(parameterTypes); if (paramCount 0) { if (parameterTypes[0].isArray()) { builder .addln( return getPage().getRequestCycle().getInfrastructure().getServiceMap().getService(org.apache.tapestry.Tapestry.EXTERNAL_SERVICE).getLink(false, new org.apache.tapestry.engine.ExternalServiceParameter(\{0}\,$1));, pageName); } else { builder .addln( java.lang.Object[] params = new java.lang.Object[{0}];, paramCount); for (int i = 0; i paramCount; i++) { builder.add(params[{0}] = , i); if (parameterTypes[i].isPrimitive()) builder.add(($w) ); builder.addln(${0};, i + 1); } builder .addln( return getPage().getRequestCycle().getInfrastructure().getServiceMap().getService(org.apache.tapestry.Tapestry.EXTERNAL_SERVICE).getLink(false, new org.apache.tapestry.engine.ExternalServiceParameter(\{0}\,params));, pageName); } } builder.end(); op.addMethod(Modifier.PUBLIC, new MethodSignature(method), builder .toString(), location);
Re: InjectPageLink and InjectExternalLink
Looks interesting. Please add a JIRA and attach the files there. jimlaren wrote: As a return type of listener method,ILink can be used to perform a redirect-after-post.So it will be a great convenience to inject ILink using annotations. @InjectPageLink(Home) public abstract ILink getHomeLink(); @InjectExternalLink(ShowCategory) public abstract ILink getCategoryLink(Long id); public ILink goHome(){ return getHomeLink(); } public ILink showCategory(Long id){ return getCategoryLink(id); } The sources: PageLink @Target( { ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface InjectPageLink { String value(); } public class InjectPageLinkAnnotationWorker implements MethodAnnotationEnhancementWorker { public void performEnhancement(EnhancementOperation op, IComponentSpecification spec, Method method, Location location) { if (!method.getReturnType().equals(ILink.class)) throw new ApplicationRuntimeException( InjectPageLink annotation must return ILink); InjectPageLink injectPageLink = method .getAnnotation(InjectPageLink.class); String pageName = injectPageLink.value(); BodyBuilder builder = new BodyBuilder(); builder.begin(); builder .addln( return getPage().getRequestCycle().getInfrastructure().getServiceMap().getService(org.apache.tapestry.Tapestry.PAGE_SERVICE).getLink(false,\{0}\);, pageName); builder.end(); op.addMethod(Modifier.PUBLIC, new MethodSignature(method), builder .toString(), location); if (isGetter(method)) op.claimReadonlyProperty(AnnotationUtils.getPropertyName(method)); } boolean isGetter(Method method) { return method.getName().startsWith(get) method.getParameterTypes().length == 0; } } ExternalLink @Target( { ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface InjectExternalLink { String value(); } public class InjectExternalLinkAnnotationWorker implements MethodAnnotationEnhancementWorker { public void performEnhancement(EnhancementOperation op, IComponentSpecification spec, Method method, Location location) { if (!method.getReturnType().equals(ILink.class)) throw new ApplicationRuntimeException( injectExternalLink annotation must return ILink); InjectExternalLink injectExternalLink = method .getAnnotation(InjectExternalLink.class); String pageName = injectExternalLink.value(); BodyBuilder builder = new BodyBuilder(); builder.begin(); Class[] parameterTypes = method.getParameterTypes(); int paramCount = Tapestry.size(parameterTypes); if (paramCount 0) { if (parameterTypes[0].isArray()) { builder .addln( return getPage().getRequestCycle().getInfrastructure().getServiceMap().getService(org.apache.tapestry.Tapestry.EXTERNAL_SERVICE).getLink(false, new org.apache.tapestry.engine.ExternalServiceParameter(\{0}\,$1));, pageName); } else { builder .addln( java.lang.Object[] params = new java.lang.Object[{0}];, paramCount); for (int i = 0; i paramCount; i++) { builder.add(params[{0}] = , i); if (parameterTypes[i].isPrimitive()) builder.add(($w) ); builder.addln(${0};, i + 1); } builder .addln( return getPage().getRequestCycle().getInfrastructure().getServiceMap().getService(org.apache.tapestry.Tapestry.EXTERNAL_SERVICE).getLink(false, new org.apache.tapestry.engine.ExternalServiceParameter(\{0}\,params));, pageName); } } builder.end(); op.addMethod(Modifier.PUBLIC, new MethodSignature(method), builder .toString(), location); if (isGetter(method)) op.claimReadonlyProperty(AnnotationUtils.getPropertyName(method)); } boolean isGetter(Method method) { return method.getName().startsWith(get) method.getParameterTypes().length == 0; } } hivemind configuration contribution configuration-id=tapestry.annotation.MethodWorkers worker annotation=InjectPageLink object=instance:InjectPageLinkAnnotationWorker/ worker annotation=InjectExternalLink object=instance:InjectExternalLinkAnnotationWorker/ /contribution enjoy it!