Re: InjectPageLink and InjectExternalLink

2006-12-13 Thread jimlaren

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

2006-12-13 Thread Renat Zubairov

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

2006-12-11 Thread jimlaren
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

2006-12-11 Thread andyhot
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!