/* * Copyright 2014 Google Inc. * * Licensed 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 com.google.web.bindery.requestfactory.server; import com.google.gwt.http.client.Request; import com.google.web.bindery.requestfactory.shared.InstanceRequest; import com.google.web.bindery.requestfactory.shared.MethodProvidedByServiceLayerTest; import com.google.web.bindery.requestfactory.vm.impl.OperationKey; import java.lang.reflect.Method; /** * JRE version of {@link MethodProvidedByServiceLayerTest}. */ public class MethodProvidedByServiceLayerJreTest extends MethodProvidedByServiceLayerTest { static class Decorator extends ServiceLayerDecorator { private static final String MISSING_DOMAIN_METHOD; private static final String MISSING_DOMAIN_TYPE; private static final String MISSING_DOMAIN_TYPE_INSTANCE_METHOD; private static String getTypeDescriptor(Class<?> clazz) { return "L" + clazz.getName().replace('.', '/') + ";"; } static { String proxyTypeDescriptor = getTypeDescriptor(Proxy.class); String requestTypeDescriptor = getTypeDescriptor(Request.class); MISSING_DOMAIN_METHOD = new OperationKey(Context.class.getName(), "missingDomainMethod", "(" + getTypeDescriptor(String.class) + ")" + requestTypeDescriptor).get(); MISSING_DOMAIN_TYPE = new OperationKey(Context.class.getName(), "missingDomainType", "(" + proxyTypeDescriptor + ")" + requestTypeDescriptor).get(); MISSING_DOMAIN_TYPE_INSTANCE_METHOD = new OperationKey(Context.class.getName(), "missingDomainTypeInstanceMethod", "()" + getTypeDescriptor(InstanceRequest.class)).get(); } @Override public Method resolveDomainMethod(String operation) { if (MISSING_DOMAIN_METHOD.equals(operation)) { try { return getClass().getDeclaredMethod("echo", String.class); } catch (NoSuchMethodException e) { return this.die(e, "Cannot find " + getClass().getCanonicalName() + "::echo method"); } } else if (MISSING_DOMAIN_TYPE.equals(operation)) { try { return SimpleFoo.class.getDeclaredMethod("echo", SimpleFoo.class); } catch (NoSuchMethodException e) { return this.die(e, "Cannot find " + SimpleFoo.class.getCanonicalName() + "::echo method"); } } else if (MISSING_DOMAIN_TYPE_INSTANCE_METHOD.equals(operation)) { try { return SimpleFoo.class.getDeclaredMethod("persistAndReturnSelf"); } catch (NoSuchMethodException e) { return this.die(e, "Cannot find " + SimpleFoo.class.getCanonicalName() + "::persistAndReturnSelf method"); } } return super.resolveDomainMethod(operation); } @Override public Class<?> resolveDomainClass(Class<?> clazz) { if (Proxy.class.equals(clazz)) { return SimpleFoo.class; } return super.resolveDomainClass(clazz); } @Override public <T> Class<? extends T> resolveClientType(Class<?> domainClass, Class<T> clientType, boolean required) { if (SimpleFoo.class.equals(domainClass) && Proxy.class.equals(clientType)) { return Proxy.class.asSubclass(clientType); } return super.resolveClientType(domainClass, clientType, required); } public static final String echo(String s) { return s; } } @Override public String getModuleName() { return null; } @Override protected Factory createFactory() { return RequestFactoryJreTest.createInProcess(Factory.class); } }