001    //
002    // Licensed under the Apache License, Version 2.0 (the "License");
003    // you may not use this file except in compliance with the License.
004    // You may obtain a copy of the License at
005    //
006    //     http://www.apache.org/licenses/LICENSE-2.0
007    //
008    // Unless required by applicable law or agreed to in writing, software
009    // distributed under the License is distributed on an "AS IS" BASIS,
010    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
011    // See the License for the specific language governing permissions and
012    // limitations under the License.
013    
014    package net.sf.tacos.annotations;
015    
016    import java.lang.reflect.Method;
017    import java.lang.reflect.Modifier;
018    
019    import org.apache.hivemind.ApplicationRuntimeException;
020    import org.apache.hivemind.Location;
021    import org.apache.hivemind.service.BodyBuilder;
022    import org.apache.hivemind.service.MethodSignature;
023    import org.apache.tapestry.annotations.AnnotationUtils;
024    import org.apache.tapestry.annotations.MethodAnnotationEnhancementWorker;
025    import org.apache.tapestry.engine.ILink;
026    import org.apache.tapestry.enhance.EnhancementOperation;
027    import org.apache.tapestry.spec.IComponentSpecification;
028    
029    /**
030     * @author Ming Jiang
031     * @author Andreas Andreou
032     */
033    
034    public class InjectPageLinkAnnotationWorker implements MethodAnnotationEnhancementWorker {
035    
036            public void performEnhancement(EnhancementOperation op, IComponentSpecification spec,
037                    Method method, Location location) {
038                if (!method.getReturnType().equals(ILink.class))
039                        throw new ApplicationRuntimeException(
040                                        "InjectPageLink annotation must return ILink");
041    
042                InjectPageLink injectPageLink = method
043                                .getAnnotation(InjectPageLink.class);
044    
045                String pageName = injectPageLink.value();
046    
047                BodyBuilder builder = new BodyBuilder();
048    
049                builder.begin();
050                builder.addln("String pageName=\"{0}\";", pageName);
051                if (injectPageLink.currentNamespace())
052                    builder.addln("pageName=getNamespace().constructQualifiedName(pageName);");
053                builder.addln( "return getPage().getRequestCycle().getInfrastructure().getServiceMap()." +
054                        "getService(org.apache.tapestry.Tapestry.PAGE_SERVICE).getLink(false,pageName);");
055    
056                builder.end();
057    
058                op.addMethod(Modifier.PUBLIC, new MethodSignature(method), builder
059                                .toString(), location);
060    
061                if (isGetter(method))
062                        op.claimReadonlyProperty(AnnotationUtils.getPropertyName(method));
063            }
064    
065            boolean isGetter(Method method) {
066                    return method.getName().startsWith("get")
067                                    && method.getParameterTypes().length == 0;
068            }
069    }