@Override
 public void validate(UIValidationContext validator) {
   boolean overwriteValue = overwrite.getValue() != null && overwrite.getValue();
   JavaResource resource = (JavaResource) validator.getUIContext().getInitialSelection().get();
   JavaClass javaClass;
   if (!overwriteValue) {
     try {
       String fieldName = conversationFieldName.getValue();
       String beginName = beginMethodName.getValue();
       String endName = endMethodName.getValue();
       javaClass = (JavaClass) resource.getJavaSource();
       if (javaClass.hasField(fieldName)
           && !javaClass.getField(fieldName).isType(Conversation.class)) {
         validator.addValidationError(
             conversationFieldName, "Field [" + fieldName + "] already exists.");
       }
       if (javaClass.hasMethodSignature(beginName)
           && (javaClass.getMethod(beginName).getParameters().size() == 0)) {
         validator.addValidationError(beginMethodName, "Method [" + beginName + "] exists.");
       }
       if (javaClass.hasMethodSignature(endName)
           && (javaClass.getMethod(endName).getParameters().size() == 0)) {
         validator.addValidationError(endMethodName, "Method [" + endName + "] exists.");
       }
     } catch (FileNotFoundException e) {
       validator.addValidationError(null, "The selected resource file was not found");
     }
   }
 }
  @Override
  public Result execute(UIExecutionContext context) throws Exception {
    UIContext uiContext = context.getUIContext();
    JavaResource resource = (JavaResource) uiContext.getInitialSelection().get();
    String name = named.getValue();
    String fieldName = conversationFieldName.getValue();
    String beginName = beginMethodName.getValue();
    String endName = endMethodName.getValue();
    Boolean overwriteValue = overwrite.getValue();
    UIOutput output = uiContext.getProvider().getOutput();
    if (resource.exists()) {
      if (resource.getJavaSource().isClass()) {
        JavaClass javaClass = (JavaClass) resource.getJavaSource();

        if (javaClass.hasField(fieldName)
            && !javaClass.getField(fieldName).isType(Conversation.class)) {
          if (overwriteValue) {
            javaClass.removeField(javaClass.getField(fieldName));
          } else {
            return Results.fail("Field [" + fieldName + "] already exists.");
          }
        }
        if (javaClass.hasMethodSignature(beginName)
            && (javaClass.getMethod(beginName).getParameters().size() == 0)) {
          if (overwriteValue) {
            javaClass.removeMethod(javaClass.getMethod(beginName));
          } else {
            return Results.fail("Method [" + beginName + "] exists.");
          }
        }
        if (javaClass.hasMethodSignature(endName)
            && (javaClass.getMethod(endName).getParameters().size() == 0)) {
          if (overwriteValue) {
            javaClass.removeMethod(javaClass.getMethod(endName));
          } else {
            return Results.fail("Method [" + endName + "] exists.");
          }
        }

        javaClass
            .addField()
            .setPrivate()
            .setName(fieldName)
            .setType(Conversation.class)
            .addAnnotation(Inject.class);

        Method<JavaClass> beginMethod =
            javaClass.addMethod().setName(beginName).setReturnTypeVoid().setPublic();
        if (Strings.isNullOrEmpty(name)) {
          beginMethod.setBody(fieldName + ".begin();");
        } else {
          beginMethod.setBody(fieldName + ".begin(\"" + name + "\");");
        }

        if (timeout.getValue() != null) {
          beginMethod.setBody(
              beginMethod.getBody() + "\n" + fieldName + ".setTimeout(" + timeout + ");");
        }

        javaClass
            .addMethod()
            .setName(endName)
            .setReturnTypeVoid()
            .setPublic()
            .setBody(fieldName + ".end();");

        if (javaClass.hasSyntaxErrors()) {
          output.err().println("Modified Java class contains syntax errors:");
          for (SyntaxError error : javaClass.getSyntaxErrors()) {
            output.err().print(error.getDescription());
          }
        }

        resource.setContents(javaClass);
      } else {
        return Results.fail(
            "Must operate on a Java Class file, not an ["
                + resource.getJavaSource().getSourceType()
                + "]");
      }
    }
    return Results.success("Conversation block created");
  }