Sunday, September 30, 2012

ADF: forEach with showdetailheader

I had a showdetailheader inside a forEach which would just not disclose/ hide.

No matter what I tried the header would just not work.

So I changed the for each value from a binding to a get from the backing bean and everything worked as it should.

Strange...

Wednesday, September 19, 2012

ADF : Some solution to various UI related problems

11.1.1.5

So here is my handy list to myself of things to check if you are getting weird problems with things that should work (buttons not work, or drop downs misbehaving):

Mark you table as contentDelivery="immediate"
Remove partialSubmit="true" from some buttons
Remove immediate="true" from buttons
Use af:forEach instead of af:iterator.


Monday, September 10, 2012

Java: Generics dont keep it simple stupid

So I was playing around with generics (dont love them because of type erasure - class level is ok method level gets scary) the other day and here are some examples and lessons learned:

1) Method level generics with return types are harder than they look.
2) Wildcards and when to use them confuse me.
3) My code is ugly and I must be missing something but what - who knows.


What I wanted was a Singleton class with generic get and put methods (what you put in is what you get out) without the cast. Something that works a little like Collections.emptyList();


The map I was storing my generic stuff in  ignore the naming for now:

What I wanted to do is something like this:

CacheItem<AnItem>  someCacheItem  = new DateCacheItemImpl<AnItem>();

Cache.getInstance().register(NameCacheItem.class);
Cache.getInstance().put(someCacheItem);

CacheItem<AnotherItem>  anotherCacheItem  = Cache.getInstance().get();



private ConcurrentHashMap<String, CacheItem<? extends ParentItem>> cacheMap =
  new ConcurrentHashMap<String, CacheItem<? extends  Parent Item>>();

public <T extends CacheItem<? extends  ParentItem >> void put(T cacheInstance) {

    cacheMap.put(cacheInstance.getCacheKey(), cacheInstance);
}

public <T extends CacheItem<? extends  ParentItem>> T get(String cacheKey) {
    return (T)cacheMap.get(cacheKey);
}

    public <T extends CacheItem<? extends  ParentItem >> void registerCache(Class<T> clazz) {

        try {
            CacheItem<? extends  ParentItem  > cacheInstance = clazz.newInstance();
            put(cacheInstance);
        } catch (InstantiationException e) {
            LOGGER.warning("Unable to create cache " + clazz.getName());
        } catch (IllegalAccessException e) {
            LOGGER.warning("Unable to create cache " + clazz.getName());
        }
    }


Not exactly what I wanted, will update this post once I have a epiphany.

Monday, September 3, 2012

ADF: SelectOneChoice ForEach, Filter - Drop down list keeping the first size selected

Ok so I had a bunch of filters all rendered from a backing bean using the forEach tag to render the select items.

On updating the table the filters would always have the size of the initially selected item - not good.
So if you fist selection had one item in the filter the filter would always be one item big.

SOLUTION:
Changed from a forEach to a f:SelectItems creating the Select items in my backing bean - everything worked.

Nice and simple.


    public List<SelectItem> listUniqueSelectItemList(List<String> items) {
        List<SelectItem> itemList = new ArrayList<SelectItem>();
        if (items != null) {
            for (String item : items) {
                itemList.add(createSelectItem(item));
            }
        }
        return itemList;
    }

    private SelectItem createSelectItem(String filter) {
        return new SelectItem(filter, filter);
    }



                  <af:selectOneChoice value="#{pageFlowScope.testBean.stringFilterValue}"
                                      id="soc1"
                                      unselectedLabel="#{bundle['test.unselected.label']}"
                                      label="filter"
                                      autoSubmit="true">
                    <f:selectItems value="#{pageFlowScope.scheduleBean.listUniqueTestItems}"
                                id="fe_it"/>
                  </af:selectOneChoice>