Я делаю ap: dataTable для ip-диапазонов пользователей с cellEditors, которые состоят из p: inputMask.Таблица данных состоит из 2 редактируемых столбцов.Для проверки мне необходимо:
- Проверить, соответствует ли указанный IP-адрес RegEx,
- . Убедиться, что начало диапазона на самом деле раньше, чем окончание,
- Убедитесь, что указанный диапазон не пересекается с ранее введенными диапазонами.
Первые две части не создавали большого шума.Третий требовал от меня проверить, находится ли указанный диапазон до или после ранее введенных диапазонов.Вы просто проверяете начало и конец, чтобы быть как до, так и после каждого другого диапазона 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;
}
Это не подходит, поскольку именование контейнеров может измениться.Итак, я хотел бы знать, есть ли другой способ получить индекс строки?