Tuesday, July 21, 2009

How to include rowspan information with h:dataTable

There is a well known limitation in the h:dataTable component of JSF's RI 1.2 (Mojarra) that you cannot set the rowspan attribute in any way. Recently I needed such a feature and here is what I did...

Step one: First you need to make the TableRenderer (com.sun.faces.renderkit.html_basic) work with the rowspan attribute. To do this, you need to create a new renderer that extends TableRenderer and overrides the renderRow() method. Next you copy the default implementation and after the line:

writer.startElement("td", column);

You insert :

writer.writeAttribute("rowspan", rowspan, null);

Voila, you have inserted your rowspan value for the current cell. Of course it is not yet evaluated so you need to think of the best way to calculate the rowspan in your case. Before that have a look at the final code (some other fixes included) I came up with for renderRow():

TableMetaInfo info = getMetaInfo(context, table);
info.newRow();
int columnIndex = 0;
for (UIColumn column : info.columns) {
String columnClass = info.getCurrentColumnClass();
int rowspan = ((UIMyData) table).getRowspan(columnIndex++, info.columns);
if (rowspan > 0) {
// Render the beginning of this cell
writer.startElement("td", column);
writer.writeAttribute("rowspan", rowspan, null);
if (columnClass != null) {

Step two: To evaluate the rowspan in my case, I extended UIData (javax.faces.component) and provided a method called getRowspan(int column, List columns). Since you're in the UIData you have access to the DataModel and RowIndex/RowCount. My decision was to prepare a matrix of rowspans that will reside in the DataModel so the implementation of my UIData looked as follows:

public int getRowspan(int column, List columns) {
return getDataModel().getRowspan(column, columns);
}

@Override
protected MyListDataModel getDataModel() {
MyListDataModel result;

DataModel dataModel = super.getDataModel();
if (dataModel instanceof MyListDataModel) {
result = (MyListDataModel) dataModel;
} else {
result = new MyListDataModel((List) dataModel.getWrappedData());
setDataModel(result);
}

return result;
}

As you can see MyListDataModel extends ListDataModel and what it does is initialize and provide access to my rowspans matrix:

private MutableInt[][] rowspans;

The getRowspan() methods is declared as follows:

public int getRowspan(int column, List columns) {
if (getRowIndex() < 0) {
throw new IllegalArgumentException("Row index should not be negative!");
}

if (rowspans == null) {
initRowspans(columns);
}

return rowspans[getRowIndex()][column].getValue();
}

Step three: Find your way of implementing the rowspans matrix. In my case I used a f:attribute attached to each h:column to be able to group the columns and then compare the value of the each item for that group.

Step four: Declare the renderer and the component and use them.

Final thoughts: I think this post could be a good example of how to start your rowspanning dataTable. I hope that it helps you and don't hesitate to discuss the issue in the comments box.

Wednesday, July 15, 2009

Таксите за услуги от държавната администрация

Днес имах малко работа с КАТ-София и естествено събрах интересни наблюдения, които ще обсъдя в тази статия. Ще започна с обобщение на видяното, а после ще мина към темата.

Като цяло, обслужването беше добро. Администраторите ми дадоха ясни насоки какво трябва да правя и благодарение на информационната система, не беше нужно да попълвам десетки заявления на ръка. Като малка забележка мога да спомена, че липсва информационно бюро, където можеш да разбереш от къде да започнеш и как протича процедурата на услугата, която ти е нужна.

Целта на тази статия е да опиша наблюденията си върху организацията на плащането на услугите предоставени от държавната администрация. Не съм търсил допълнителна информация по темата, но с няколко прости въпроса, мисля, че ще успея да покажа известни нередности в сегашния начин на работа.

До колкото разбирам нещата стоят така: искаш услуга от администрацията, плащаш нужната сума чрез някоя банка, получаваш услугата. Според мен посредника за плащането е въведен, за да има по-голяма ефективност в работата на администрацията като тя не се занимава с паричните потоци. По този начин се намалява и възможността за корупция, тъй като този, който се занимава с парите не е свързан с този, който предоставя услугата.

До тук добре. Колко пари, обаче трябва да взима посредника? В момента администрацията има точно определена такса, която очаква да бъде преведена, а посредникът добавя своята комисионна. И тук идва проблема: всичко щеше да е идеално, ако имахме механизъм за избягване на частен монопол от страна на посредника. За съжаление това не е така.

Съгласен съм, че посредника (най-често банка) трябва да създаде специален клон, в близост до администрацията, но по какъв начин се определя някаква максимална и разумна цена на неговата комисионна?

Моето наблюдение е, че има злоупотреби (а може би просто неясноти?) с комисионните и ще включа два примера.

Първо, при попълване на заявление се заплащат 3 лв. на каса. Ето бележката:


Въпросите ми са няколко: Кои са БМВ ЕООД? За какво точно платих тази сума? За хартийката? Или може би за попълване на заявлението? Това не е ли услуга на администрацията и ако е, не трябва ли да платя и комисионна?

Второто заплащане е на касата на клон на СИ Банк. Ето двете части от бележката:


Документ от КАТ - 5 лв., Комисионна - 1 лв.



Транзитни номера - 35 лв., Комисионна - 3 лв.

Въпросът ми е как точно банката определи, че превеждането на 5 лв. е по-евтино от превеждането на 35 лв.? И то 3 пъти по-евтино. Ако питате мен, те просто определят цена, която съотнесена към административната такса, изглежда разумна.

И сега гранде въпросе:
Предвид факта, че администрациите са предоставили мястото за извършване на този частен монопол от страна на посредниците, не е ли редно някой да регулира нивото на комисионните?

Tuesday, July 14, 2009

My recent Oracle SQL Developer update surprised me

After checking for an update of my Oracle SQL Developer installation, version 1.5.4 popped up in the wizard. I selected it and clicked Finish. The summary for the installation looked interesting - some colors, some sports and some food, where about to be deployed on my machine. Look at the screenshot:
A good laugh to start the day :-)

Monday, July 6, 2009

Бъдещето на кирилицата и българския език

Занимавайки се с компютри, например при изготвяне на софтуерен продукт, много често изникват въпроси около използването на кирилицата и смесването й с латиница. Интересно е да се наблюдава връзката на използвана азбука и отражението й върху езика.

Според мен трябва да се наложат няколко прости и строги правила при съставянето на текстове на български език, чиито първоизточник е на чужд език. Искам да дам няколко примера и за целта ще използвам сравнението с английския език, който в момента е най-използван в мултикултурна среда.

Имена - фонетично представяне
  • Примери: Microsoft - Майкрософт, Windows - Уиндоус, Intel - Интел, Bluetooth - Блутут
  • Цел: Хора, които не познават добре чуждия език и правилата му за четене могат да произнесат приблизително правилно думата, която много често е запазена марка и не трябва да се променя
Други думи и словосъчетания - превод
  • Примери: motherboard - дънна платка, mouse - мишка, showroom - изложбена зала
  • Цел: Пресъздаване на значението на думата от английски език на български
Сметнах, че е нужно да напиша тази статия, да изясня тези прости правила, защото явно има българи, които са прекалено "модерни" и забравят или просто не знаят, че ползването на чужд език няма нищо общо с ползването на майчиния език. Може би на някого не му пука, може би някой е неграмотен (не, че аз мога да служа за пример), но е недопустимо, когато стигаме до изречения от вида:
  • Елате в новия ни шоурум на Симеоновско шосе.
  • Последните новини от Microsoft са за новата версия на Windows.
Изреченията на български трябва да са написани на кирилица и по възможност да използват български думи.

Баща ми ми зададе един много интересен парадокс: Идва един чужденец в България и вижда заглавието на статията "Нов кол център стартира в България". Човекът току що е научил кирилицата и започнал да се справя с търсенето на думите в речника. Какво намира: нов, център, стартирам, кол? Как ще преведе думата "кол"? Трябва ли да въведем още стотици, ако не и хиляди думи в езика ни, за които имаме прост превод?

Явно сме толкова погълнати от глобализацията, Интернет и телевизията, че много хора не се сещат да направят усилието да пишат на български език... А много хубаво би било, ако и БАН, МОН, университетите и училищата, се съсредоточат върху проблема, върху дупката, която е зейнала в езика ни.

Благодаря за вниманието

09.07.2009 г.
Попаднах на една много интересна личност от Българското възраждане - Иван Богоров. Статията за него в Уикипедия съдържа една любопитната част Някои думи, въведени от Богоров, която може да ни служи за пример в следването на идеята за чист език.