Hi,

I need help to get around this error I'm getting. I have a list of products
in my cart that I have added. In another session the administrator has
deleted the products.
When I hit a refresh link ( AjaxSubmitLink ) I get an
IndexOutOfBoundsException. This is done before getting to the onSubmit().
How can I get around this?

Look at the refresh AjaxSubmitLink.

protected class BasketFragment extends Fragment{
private static final long serialVersionUID = 1L;
private WebMarkupContainer updateContainer;
WebMarkupContainer cartContainer;
public void onFlash(AjaxRequestTarget target ){
updateContainer.setVisible( true );
target.appendJavascript(  "new Effect.Fade('"+ updateContainer.getMarkupId()
+"',{duration: 2.0});" );
target.appendJavascript(  "new Effect.Highlight('"+
updateContainer.getMarkupId() +"',{startcolor: '#ff99ff',endcolor:
'#ffffff'});" );
 target.addComponent(updateContainer );
 }

public BasketFragment(String id, String markupId ) {
super(id, markupId, BasePage.this);
 Form<Void> cartForm = new Form<Void>( "cartForm" );
updateContainer = new WebMarkupContainer( "updateContainer" );
updateContainer.setOutputMarkupId( true );
updateContainer.setOutputMarkupPlaceholderTag( true );
updateContainer.setVisible( false );
cartForm.add( updateContainer );
 IModel<List<CartItem>> cartItemModel = new
LoadableDetachableModel<List<CartItem>>(){
private static final long serialVersionUID = 1L;

@Override
protected List<CartItem> load() {
return getCartDAO().getCartItems( FricoSession.get().getCartId() );
}
 };
 final ListView<CartItem> cartView = new ListView<CartItem>( "cartView",
cartItemModel ){
private static final long serialVersionUID = 1L;

@Override
protected void populateItem(ListItem<CartItem> item) {
 final CartItem cartItem = item.getModelObject();
 item.setModel(new CompoundPropertyModel<CartItem>(item.getModel()));
if( item.getIndex() % 2 == 0 ){
item.add( new SimpleAttributeModifier( "class" , "even" ));
}else{
item.add( new SimpleAttributeModifier( "class" , "odd" ));
}
Product product = item.getModelObject().getProduct();
String name = product.getName();
if( name.length() > 19 ){
name = name.substring( 0,19) + "...";
}
Label label = new Label( "name" , name );
label.add( new SimpleAttributeModifier( "title" , product.getName()));
 item.add( label );
 TextField<Long> quantity = new TextField<Long>( "quantity" );
item.add( quantity );
 AjaxSubmitLink delete = new AjaxSubmitLink( "delete" ){
private static final long serialVersionUID = 1L;

@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
getCartDAO().delete( cartItem );
onUpdateCart(target,false);
 }
 };
 item.add( delete );
 }
 };
 AjaxSubmitLink refresh = new AjaxSubmitLink( "refresh" ){
private static final long serialVersionUID = 1L;

@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
List<CartItem> items = cartView.getModelObject();
Iterator<CartItem> iter = items.iterator();
while( iter.hasNext() ){
CartItem item = iter.next();
Product product = item.getProduct();
Product p = getProductDAO().find( Product.class, product.getId());
if( p != null ){
getCartDAO().save( item );
}else{
iter.remove();
}
}
 onUpdateCart(target, true);
  }
 };
cartForm.add( refresh );
cartContainer = new WebMarkupContainer( "cartContainer" );
cartContainer.add( cartForm );
cartContainer.setOutputMarkupId( true );
add( cartContainer );
cartForm.add( cartView );
WebMarkupContainer emptyCart = new WebMarkupContainer( "emptyCart" );
emptyCart.add( new LogoutLink( "logoutLink" ) );
add( emptyCart );
 AjaxLink<Void> cancelLink = new AjaxLink<Void>( "cancelLink" ){

private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
getCartDAO().empty( FricoSession.get().getCartId() );
onUpdateCart(target,false);
}
 @Override
                protected IAjaxCallDecorator getAjaxCallDecorator(){
                    return new AjaxCallDecorator() {
private static final long serialVersionUID = 1L;
@Override
                        public CharSequence decorateScript(CharSequence
script) {
                             return "if( !confirm('"+
getLocalizer().getString( "cancel.warning", BasePage.this ) +"')) return
false;" + script;
                        }

                    };
                }
};
 AjaxLink<Void> checkoutLink = new AjaxLink<Void>( "checkoutLink" ){

private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
checkoutPanel =  new CheckoutPanel( "content" );
getContentPanel().addOrReplace( checkoutPanel);
target.addComponent(  getContentPanel() );
}




};
 cartContainer.add( new LogoutLink( "logoutLink" ) );
cartContainer.add( cancelLink );
cartContainer.add( checkoutLink );
 emptyCart.setVisible( false );
if( cartItemModel.getObject().isEmpty() ){
cartContainer.setVisible( false );
emptyCart.setVisible( true );
}
  }
}

Reply via email to