예제 #1
0
  private static Map<JType, JClassType> findCustomSerializers(TypeOracle oracle)
      throws NotFoundException {
    Map<JType, JClassType> serializers = new HashMap<JType, JClassType>();

    JClassType serializerInterface = oracle.findType(JSONSerializer.class.getName());
    JType[] deserializeParamTypes =
        new JType[] {
          oracle.findType(com.vaadin.client.metadata.Type.class.getName()),
          oracle.findType(JSONValue.class.getName()),
          oracle.findType(ApplicationConnection.class.getName())
        };
    String deserializeMethodName = "deserialize";
    // Just test that the method exists
    serializerInterface.getMethod(deserializeMethodName, deserializeParamTypes);

    for (JClassType serializer : serializerInterface.getSubtypes()) {
      JMethod deserializeMethod =
          serializer.findMethod(deserializeMethodName, deserializeParamTypes);
      if (deserializeMethod == null) {
        continue;
      }
      JType returnType = deserializeMethod.getReturnType();

      serializers.put(returnType, serializer);
    }
    return serializers;
  }
예제 #2
0
 protected void generateCheckRpcTokenTypeOverride(
     SourceWriter srcWriter, TypeOracle typeOracle, SerializableTypeOracle typesSentFromBrowser) {
   JClassType rpcTokenType = typeOracle.findType(RpcToken.class.getName());
   JClassType[] rpcTokenSubtypes = rpcTokenType.getSubtypes();
   String rpcTokenImplementation = "";
   for (JClassType rpcTokenSubtype : rpcTokenSubtypes) {
     if (typesSentFromBrowser.isSerializable(rpcTokenSubtype)) {
       if (rpcTokenImplementation.length() > 0) {
         // >1 implematation of RpcToken, bail
         rpcTokenImplementation = "";
         break;
       } else {
         rpcTokenImplementation = rpcTokenSubtype.getQualifiedSourceName();
       }
     }
   }
   if (rpcTokenImplementation.length() > 0) {
     srcWriter.println("@Override");
     srcWriter.println("protected void checkRpcTokenType(RpcToken token) {");
     srcWriter.indent();
     srcWriter.println("if (!(token instanceof " + rpcTokenImplementation + ")) {");
     srcWriter.indent();
     srcWriter.println(
         "throw new RpcTokenException(\"Invalid RpcToken type: "
             + "expected '"
             + rpcTokenImplementation
             + "' but got '\" + "
             + "token.getClass() + \"'\");");
     srcWriter.outdent();
     srcWriter.println("}");
     srcWriter.outdent();
     srcWriter.println("}");
   }
 }
예제 #3
0
 public void processSubTypes(TreeLogger logger, JClassType type) throws UnableToCompleteException {
   processTypes(logger, Arrays.asList(type.getSubtypes()));
 }
예제 #4
0
  /** Adds a root type for each type that appears in the RemoteService interface methods. */
  private static void addRemoteServiceRootTypes(
      TreeLogger logger,
      TypeOracle typeOracle,
      SerializableTypeOracleBuilder typesSentFromBrowser,
      SerializableTypeOracleBuilder typesSentToBrowser,
      JClassType remoteService)
      throws NotFoundException, UnableToCompleteException {
    logger =
        logger.branch(
            TreeLogger.DEBUG,
            "Analyzing '"
                + remoteService.getParameterizedQualifiedSourceName()
                + "' for serializable types",
            null);

    JMethod[] methods = remoteService.getOverridableMethods();

    JClassType exceptionClass = typeOracle.getType(Exception.class.getName());

    JClassType rteType = typeOracle.getType(RpcTokenException.class.getName());
    JClassType rpcTokenClass = typeOracle.getType(RpcToken.class.getName());
    RpcTokenImplementation tokenClassToUse =
        remoteService.findAnnotationInTypeHierarchy(RpcTokenImplementation.class);
    if (tokenClassToUse != null) {
      // only include serializer for the specified class literal
      JClassType rpcTokenType = typeOracle.getType(tokenClassToUse.value());
      if (rpcTokenType.isAssignableTo(rpcTokenClass)) {
        typesSentFromBrowser.addRootType(logger, rpcTokenType);
        typesSentToBrowser.addRootType(logger, rteType);
      } else {
        logger.branch(
            TreeLogger.ERROR,
            "RPC token class "
                + tokenClassToUse.value()
                + " must implement "
                + RpcToken.class.getName(),
            null);
        throw new UnableToCompleteException();
      }
    } else {
      JClassType[] rpcTokenSubclasses = rpcTokenClass.getSubtypes();
      for (JClassType rpcTokenSubclass : rpcTokenSubclasses) {
        typesSentFromBrowser.addRootType(logger, rpcTokenSubclass);
      }
      if (rpcTokenSubclasses.length > 0) {
        typesSentToBrowser.addRootType(logger, rteType);
      }
    }

    TreeLogger validationLogger = logger.branch(TreeLogger.DEBUG, "Analyzing methods:", null);
    for (JMethod method : methods) {
      TreeLogger methodLogger = validationLogger.branch(TreeLogger.DEBUG, method.toString(), null);
      JType returnType = method.getReturnType();
      if (returnType != JPrimitiveType.VOID) {
        TreeLogger returnTypeLogger =
            methodLogger.branch(
                TreeLogger.DEBUG,
                "Return type: " + returnType.getParameterizedQualifiedSourceName(),
                null);
        typesSentToBrowser.addRootType(returnTypeLogger, returnType);
      }

      JParameter[] params = method.getParameters();
      for (JParameter param : params) {
        TreeLogger paramLogger =
            methodLogger.branch(TreeLogger.DEBUG, "Parameter: " + param.toString(), null);
        JType paramType = param.getType();
        typesSentFromBrowser.addRootType(paramLogger, paramType);
      }

      JType[] exs = method.getThrows();
      if (exs.length > 0) {
        TreeLogger throwsLogger = methodLogger.branch(TreeLogger.DEBUG, "Throws:", null);
        for (JType ex : exs) {
          if (!exceptionClass.isAssignableFrom(ex.isClass())) {
            throwsLogger =
                throwsLogger.branch(
                    TreeLogger.WARN,
                    "'"
                        + ex.getQualifiedSourceName()
                        + "' is not a checked exception; only checked exceptions may be used",
                    null);
          }

          typesSentToBrowser.addRootType(throwsLogger, ex);
        }
      }
    }
  }