You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by luiss184 <lu...@yahoo.com.ar> on 2013/11/03 03:16:06 UTC

AjaxButton submit issue in GAE

Hi,

I have an issue in my application with an AjaxButton which submits properly
only the first time.
To get it working again is necessary to clear the browser cache.
The application is deployed in Google App Engine.
In development mode works perfectly.

Has anybody experienced anything similar or has an idea how to solve this
issue?

Thanks in advanced,

Luis



--
View this message in context: http://apache-wicket.1842946.n4.nabble.com/AjaxButton-submit-issue-in-GAE-tp4662084.html
Sent from the Users forum mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: AjaxButton submit issue in GAE

Posted by luiss184 <lu...@yahoo.com.ar>.
Sorry, i am not able to provide the url since it is an internal application
and corporate email is needed to be part of it.

 Here is the code:


public class PostPanel extends Panel {

  private static final Logger log =
LoggerFactory.getLogger(PostPanel.class);
  private static final Long MAX_FILE_LENGTH = new Long(1048576);
  private static final long serialVersionUID = 4297044401384008810L;
  private static final IValidator<Integer> MINIMUM_VALIDATOR = new
RangeValidator<Integer>(
      new Integer(0), new Integer(99999999));
  private static final IValidator<Short> MINIMUM_VALIDATOR_SHORT = new
RangeValidator<Short>(
      new Short((short) 0), new Short((short) 99));
  private static final StringValidator TITLE_VALIDATOR = StringValidator
      .lengthBetween(3, 100);
  private static final StringValidator DESCRIPTION_VALIDATOR =
StringValidator
      .lengthBetween(3, 500);

  @Inject
  private PostService postService;

  @Inject
  private CategoryService categoryService;

  private List<FileUpload> photos;
  private Post post;
  private boolean editing = false;
  private final Component feedback;
  private String fileFeedbackMessage;


  /**
   * Constructor.
   * 
   * @param id
   * @param post
   */
  public PostPanel(String id, final Post post) {
    super(id);

    // if not editing create a new empty post
    if (post == null) {
      MyAuthSession session = (MyAuthSession) WebSession.get();
      this.post =
this.postService.createPostInstance(session.getCurrentUser());
    } else {
      this.post = post;
      editing = true;
    }

    add(this.createFormTitle());

    feedback = new FeedbackPanel("feedback");
    feedback.setOutputMarkupPlaceholderTag(true);

    final StatelessForm<Post> form = new
StatelessForm<Post>("createPostForm",
        new CompoundPropertyModel<Post>(this.post));
    form.add(feedback);
    form.setMultiPart(true);
    form.add(this.createTitleTextField());
    form.add(this.createPriceTextField());
    form.add(this.createCurrencySelect());
    form.add(this.createPhotoPanel());
    form.add(this.createFileUploader());
    form.add(this.createDescriptionTextArea());
    form.add(this.createPostButton());
    form.add(new ExternalLink("cancelLink", "/my-posts?operation=ALL"));
    form.add(createCategoryDropDownChoice());
    form.add(createConditionSelectOption());

    this.add(form);
  }

  public String getFileFeedbackMessage() {
    return fileFeedbackMessage;
  }

  public void setFileFeedbackMessage(String fileFeedbackMessage) {
    this.fileFeedbackMessage = fileFeedbackMessage;
  }

  public void copyPost(Post post) {
    this.post.setPrice(post.getPrice());
    this.post.setCurrency(post.getCurrency());
    this.post.setPriceNatural(post.getPrice().intValue());
    this.post.setPriceDecimal(post.getPrice().shortValue());
    this.post.setTitle(post.getTitle());
    this.post.setQuantity(post.getQuantity());
    this.post.setDescription(post.getDescriptionSaved());
    this.post.setDescriptionSaved(post.getDescriptionSaved());
    this.post.setCategory(post.getCategory());
    this.post.setCondition(post.getCondition());
    BinaryInformation photo = post.getPhoto();
    this.post.addPhoto(new BinaryInformation(photo.getContent(), photo
        .getName(), photo.getContentType(), photo.getContent().length));
    this.post.addThumbnail(new BinaryInformation(photo.getContent(),
        "kea_thumbnail_" + photo.getName(), photo.getContentType(), photo
            .getContent().length));
  }

  private Select<String> createConditionSelectOption() {
    // Condition Drop Down Choice
    Select<String> condition = new Select<String>("condition");
    condition.add(new SelectOption<String>("new", new
Model<String>("new")));
    condition.add(new SelectOption<String>("used", new
Model<String>("used")));
    return condition;
  }

  private DropDownChoice<Void> createCategoryDropDownChoice() {

    final List<Category> categoryList = categoryService.getCategories();
    List<Long> catIds = new ArrayList<Long>();

    // Categories Drop Down Choice
    for (Category cat : categoryList) {
      catIds.add(cat.getId());
    }
    @SuppressWarnings("unchecked")
    DropDownChoice<Void> catDropDownChoice = new DropDownChoice(
        "categoriesDropDown", new PropertyModel(this.post, "categoryId"),
        catIds, new ChoiceRenderer<Long>() {
          @Override
          public String getDisplayValue(Long catId) {
            for (Category cat : categoryList) {
              if (cat.getId().equals(catId)) {
                return cat.getName();
              }
            }
            return "Select one!";
          }

          @Override
          public String getIdValue(Long catId, int index) {
            return catId.toString();
          }
        }) {

    };
    catDropDownChoice.setRequired(true).setEscapeModelStrings(false);

    return catDropDownChoice;

  }

  private Select<String> createCurrencySelect() {
    // TODO get the currency from a property file
    Select<String> currency = new Select<String>("currency");
    currency.add(new SelectOption<String>("pesos", new
Model<String>("ARS$")));
    currency.add(new SelectOption<String>("dolares", new
Model<String>("US$")));
    currency.add(new SelectOption<String>("pesosUruguayos", new
Model<String>(
        "UYU$")));
    currency.add(new SelectOption<String>("pesosColombianos",
        new Model<String>("COP$")));
    return currency;
  }

  private TextArea<String> createDescriptionTextArea() {
    if (editing) {
      post.setDescription(post.getDescriptionSaved());
    }
    TextArea<String> description = new TextArea<String>("description");
    description.setRequired(true);
    description.add(DESCRIPTION_VALIDATOR);
    return description;
  }

  private TextField<Integer> createPriceTextField() {
    if (editing) {
      String strPrice = post.getPrice().toPlainString();
      int idx = strPrice.indexOf(".");
      strPrice = (idx >= 0) ? strPrice.substring(0, idx) : strPrice;
      post.setPriceNatural(Integer.valueOf(strPrice));
    }
    TextField<Integer> price = new TextField<Integer>("priceNatural");
    price.setType(Integer.class);
    price.setRequired(true);
    price.add(MINIMUM_VALIDATOR);
    return price;
  }

  private TextField<Short> createPriceDecimalTextField() {
    if (editing) {
      String strPrice = post.getPrice().toPlainString();
      int idx = strPrice.indexOf(".");
      strPrice = (idx >= 0) ? strPrice.substring(idx + 1) : "00";
      if (strPrice.length() > 2) {
        strPrice = strPrice.substring(0, 2);
      }
      post.setPriceDecimal(Short.valueOf(strPrice));
    }
    TextField<Short> priceDecimal = new TextField<Short>("priceDecimal");
    priceDecimal.setType(Short.class);
    priceDecimal.setRequired(true);
    priceDecimal.add(MINIMUM_VALIDATOR_SHORT);
    return priceDecimal;
  }

  @SuppressWarnings("serial")
  private AjaxButton createPostButton() {
    AjaxButton but = new AjaxButton("createPostButton") {

      @Inject
      private ImageService imageService;

      @Override
      public void onError(AjaxRequestTarget target, Form<?> form) {
        log.debug("....... onError");
        feedback.add(new AttributeAppender("class", "alert alert-error"));
        target.add(feedback);
      }

      @Override
      public void onSubmit(AjaxRequestTarget target, Form<?> form) {
        try {
          log.debug("....... SUBMITTING");

          Post postNew = (Post) getForm().getModel().getObject();

          // Only for compatibility purpose
          postNew.setPriceDecimal((short) 0);

          if (photos == null) { // can be editing
            postNew.addPhoto(post.getPhoto());
          } else {

            FileUpload photo = photos.get(0);

            if (photo.getSize() >= MAX_FILE_LENGTH) {
              error("La imagen del producto debe ser menor a 1MB.");
              log.debug("PHOTO SIZE >= MAX_FILE_LENGTH");
              feedback.add(new AttributeAppender("class", "alert
alert-error"));
              target.add(feedback);
              return;
            } else {
              log.debug("PHOTO NOT NULL");
              String contentType = photo.getContentType();

              // Verifies if there is a file uploaded, if it is checks
              // thats its an image and the format
              if (!contentType.contains("image")) {
                error("Tipo de archivo invalido, por favor seleccionar una
imagen para subir.");
                feedback
                    .add(new AttributeAppender("class", "alert
alert-error"));
                target.add(feedback);
                return;
              } else {
                log.debug(".........PHOTO UPLOADING");
                log.debug("...... ON SUBMIT: Creating POST");

                BinaryInformation bi = new
BinaryInformation(photo.getBytes(),
                    photo.getClientFileName(), photo.getContentType(),
                    photo.getSize());
                postNew
                    .addPhoto(imageService.resizeImage(bi,
ImageSize.NORMAL));
                postNew.addThumbnail(imageService.resizeImage(bi,
                    ImageSize.THUMBNAIL));
              }
            }
          }
          createPost(postNew);
        } catch (Throwable e) {
          log.error("SUBMIT ERROR:" + e);
        }
      }


    };
    String message = (editing) ? getDefaultString("postPanel.post")
        : getDefaultString("postPanel.publish");
    but.add(new AttributeModifier("value", message));
    return but;
  }


  /**
   * Saves posts in db
   * 
   * @param post to save
   * @author Nelson.Rey
   */
  private void createPost(Post post) {

    post.setQuantity(1);
    log.debug("...... PANEL: Creating POST");
    if (!editing) {
      postService.create(post);
    } else {
      postService.update(post);
    }

    PageParameters parameters;
    parameters = new PageParameters();
    parameters.add("operation", "ALL");

    setResponsePage(MyPostsPage.class, parameters);

  }

  private TextField<String> createTitleTextField() {
    TextField<String> title = new TextField<String>("title");
    title.setRequired(true);
    title.add(TITLE_VALIDATOR);
    return title;
  }

  private Label createFormTitle() {
    return editing ? new Label("postProductTitle", "Editar Producto")
        : new Label("postProductTitle", "");
  }

  private ViewPhotoPanel createPhotoPanel() {
    ViewPhotoPanel photoPanel = null;

    if (!editing)
      photoPanel = new ViewPhotoPanel("viewPhotoPanel", new Long(0));
    else
      photoPanel = new ViewPhotoPanel("viewPhotoPanel",
post.getKey().getId());

    photoPanel.setVisible(editing);

    return photoPanel;
  }

  private FileUploaderPanel createFileUploader() {
    FileUploaderPanel fileUploader = new
FileUploaderPanel("fileUploaderPanel",
        new PropertyModel<List&lt;FileUpload>>(this, "photos"));

    fileUploader.setRequiredFile(!editing);
    return fileUploader;
  }

  private String getDefaultString(String key) {
    // String string =
    //
componentStringResourceLoader.loadStringResource(SearchFilterPanel.class,
    // key, getLocale(), getSession().getStyle(), getVariation());
    ComponentStringResourceLoader loader = new
ComponentStringResourceLoader();
    String string = loader.loadStringResource(this, key, getLocale(),
        getSession().getStyle(), getVariation());
    return string;
  }
}




In the html:


            <div class="control-group">
                <label class="control-label">&nbsp;</label>
                <div class="form_buttons">
                    <input type="submit" class="btn btn-success post-submit"
wicket:id="createPostButton" ></input>
                    
                     <wicket:message
key="postPanel.cancelLink">Cancel</wicket:message> 
                </div>
            </div>




--
View this message in context: http://apache-wicket.1842946.n4.nabble.com/AjaxButton-submit-issue-in-GAE-tp4662084p4662108.html
Sent from the Users forum mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: AjaxButton submit issue in GAE

Posted by Martin Funk <ma...@gmail.com>.
How about some code?

And if it is deployed on GAE you even might be able to provide an url to the app.

mf

Am 03.11.2013 um 03:16 schrieb luiss184 <lu...@yahoo.com.ar>:

> Hi,
> 
> I have an issue in my application with an AjaxButton which submits properly
> only the first time.
> To get it working again is necessary to clear the browser cache.
> The application is deployed in Google App Engine.
> In development mode works perfectly.
> 
> Has anybody experienced anything similar or has an idea how to solve this
> issue?
> 
> Thanks in advanced,
> 
> Luis
> 
> 
> 
> --
> View this message in context: http://apache-wicket.1842946.n4.nabble.com/AjaxButton-submit-issue-in-GAE-tp4662084.html
> Sent from the Users forum mailing list archive at Nabble.com.
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org