Как получить индекс строки текущей проверяемой строки в p: dataTable? - PullRequest
0 голосов
/ 13 февраля 2019

Я делаю ap: dataTable для ip-диапазонов пользователей с cellEditors, которые состоят из p: inputMask.Таблица данных состоит из 2 редактируемых столбцов.Для проверки мне необходимо:

  1. Проверить, соответствует ли указанный IP-адрес RegEx,
  2. . Убедиться, что начало диапазона на самом деле раньше, чем окончание,
  3. Убедитесь, что указанный диапазон не пересекается с ранее введенными диапазонами.

Первые две части не создавали большого шума.Третий требовал от меня проверить, находится ли указанный диапазон до или после ранее введенных диапазонов.Вы просто проверяете начало и конец, чтобы быть как до, так и после каждого другого диапазона IP-адресов.Легко, правда?

Цикл проверки.

    for (Groupip gip : searchResults) {
        long ipend = ipToLong(InetAddress.getByName(gip.getIpend()));
        long ipstart = ipToLong(InetAddress.getByName(gip.getIpstart()));
        boolean validLeft = true, validRight = true;
        validLeft = validLeft && ipstart < ipValidated;
        validLeft = validLeft && ipend < ipValidated;
        validLeft = validLeft && ipstart < ipValidating;
        validLeft = validLeft && ipend < ipValidating;
        validRight = validRight && ipstart > ipValidated;
        validRight = validRight && ipend > ipValidated;
        validRight = validRight && ipstart > ipValidating;
        validRight = validRight && ipend > ipValidating;
        if (validLeft || validRight) {
            //OK
        } else {
            //ERROR
        }
    }

Таблица данных.

    <p:dataTable id="ips1" widgetVar="ips1" var="ip" value="#{groupipController.searchResults}" editable="true"
                 rowKey="#{ip.groupcode}-#{ip.ipstart}-#{ip.ipend}" selection="#{groupipController.selected}" selectionMode="single"
                 >
        <f:facet name="header">
            Диапазон IP
        </f:facet>
        <p:ajax event="rowEditCancel" listener="#{groupipController.onRowCancel}" />
        <p:ajax event="rowEditInit" listener="#{groupipController.onRowEditInit}" />
        <p:ajax event="rowEdit" listener="#{groupipController.onRowEdit}" update=":form:msgs :form:ips1 :form:growlmsgs" process=":form:ips1"/>

        <p:column headerText="От" style="min-height: 16px" id='from_col'>
            <p:cellEditor>
                <f:facet name="output"><h:outputText value="#{ip.ipstart}" /></f:facet>
                <f:facet name="input">
                    <p:inputMask mask="999.999.999.999" value="#{ip.ipstart}" id="fromip" autoClear="false" slotChar="0"
                                 validator="#{groupipController.validate}"
                                 class="ui-inputfield ui-inputmask ui-widget ui-state-default ui-corner-all p-0-1 w-100 h-100"/>
                </f:facet>
            </p:cellEditor>
        </p:column>
        <p:column headerText="До" style="min-height: 16px" id='to_col'>
            <p:cellEditor>
                <f:facet name="output"><h:outputText value="#{ip.ipend}" /></f:facet>
                <f:facet name="input">
                    <p:inputMask mask="999.999.999.999" value="#{ip.ipend}" id="toip" autoClear="false" slotChar="0"
                                 validator="#{groupipController.validate}"
                                 class="ui-inputfield ui-inputmask ui-widget ui-state-default ui-corner-all p-0-1 w-100 h-100"/>  
                </f:facet>
            </p:cellEditor>
        </p:column>
        <p:column width="10%" >
            <p:rowEditor rendered="#{armgroupController.update}" />
        </p:column>
    </p:dataTable>

Но это еще не все.searchResults - это переменная, которая является источником для dataTable, которая содержит List<Groupip>.Но он также содержит строку, которая в данный момент редактируется.Поэтому я должен исключить его, или я провалю проверку, сравнивая диапазон с самим собой.

Как мне сделать это точно?Единственный способ найти индекс строки редактирующей строки - это получить предварительное последнее значение cliendId (которое выглядит так в браузере: form:ips1:2:toip) с помощью этого кода:

if (gip == searchResults.get(Integer.parseInt(component.getClientId().split(":")[2]))) {
    continue;
}

Это не подходит, поскольку именование контейнеров может измениться.Итак, я хотел бы знать, есть ли другой способ получить индекс строки?

1 Ответ

0 голосов
/ 13 февраля 2019

Ваш идентификатор текущего компонента всегда является последним в полном списке clientID, и вы сами заявляете, что принимаете предварительное последнее значение, но фактически вы берете третье значение (индекс 2)

Если вына самом деле вы получите последний, но один индекс (base-0), так как индекс строки у вас (в основном) всегда в порядке.

String[] fields = component.getClientId().split(":");
int index = Integer.parseInt(fields[fields.length-2]); 
if (gip == searchResults.get(index)) {
    continue;
}

Если кто-то обернет этот 'текущий' компонент в контейнер именования, индекс будет не одним, а последним, но одним перед этим или даже перед этим.Таким образом, вы можете добавить это в цикл, чтобы получить первую часть разделенного clientId, который является числом, поскольку JSF (html) id не может начинаться с числа и, следовательно, не может быть числом, поэтому вы в «безопасности».' затем.

String[] fields = component.getClientId().split(":");
int indexPos = fields.length-2;
int index = -1;
do {
   try {
       index = Integer.parseInt(fields[indexPos]); 
   } catch {
       indexPos--;
   }
} while (index == -1)
if (gip == searchResults.get(index)) {
    continue;
}

Вы также можете попытаться привести родителя компонента к Datatable и посмотреть, есть ли в нем что-то вроде getCurrentRow(), которое можно использовать, но затем вам также нужно создать цикл для полученияродитель родительского объекта, если родитель не является датируемым.

Примером для изучения является источник http://showcase.omnifaces.org/validators/validateUniqueColumn

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...