fix #870 add attributes management

This commit is contained in:
Shinsuke Sugaya 2017-02-03 17:54:12 +09:00
parent 46b5d3685e
commit bdc0f9aab7
13 changed files with 281 additions and 223 deletions

View file

@ -15,6 +15,9 @@
*/
package org.codelibs.fess.app.web.admin.group;
import java.util.HashMap;
import java.util.Map;
import javax.validation.constraints.Size;
import org.lastaflute.web.validation.Required;
@ -33,8 +36,7 @@ public class CreateForm {
@Size(max = 100)
public String name;
@ValidateTypeFailure
public Long gidNumber;
public Map<String, String> attributes = new HashMap<>();
public void initialize() {
}

View file

@ -15,6 +15,9 @@
*/
package org.codelibs.fess.app.web.admin.role;
import java.util.HashMap;
import java.util.Map;
import javax.validation.constraints.Size;
import org.lastaflute.web.validation.Required;
@ -33,6 +36,8 @@ public class CreateForm {
@Size(max = 100)
public String name;
public Map<String, String> attributes = new HashMap<>();
public void initialize() {
}
}

View file

@ -15,9 +15,11 @@
*/
package org.codelibs.fess.app.web.admin.user;
import java.util.HashMap;
import java.util.Map;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;
import org.lastaflute.web.validation.Required;
import org.lastaflute.web.validation.theme.conversion.ValidateTypeFailure;
@ -40,114 +42,7 @@ public class CreateForm {
@Size(max = 100)
public String confirmPassword;
@Size(max = 1000)
public String surname;
@Size(max = 1000)
public String givenName;
@Email
@Size(max = 1000)
public String mail;
@Size(max = 1000)
public String employeeNumber;
@Size(max = 1000)
public String telephoneNumber;
@Size(max = 1000)
public String homePhone;
@Size(max = 1000)
public String homePostalAddress;
@Size(max = 1000)
public String labeledURI;
@Size(max = 1000)
public String roomNumber;
@Size(max = 1000)
public String description;
@Size(max = 1000)
public String title;
@Size(max = 1000)
public String pager;
@Size(max = 1000)
public String street;
@Size(max = 1000)
public String postalCode;
@Size(max = 1000)
public String physicalDeliveryOfficeName;
@Size(max = 1000)
public String destinationIndicator;
@Size(max = 1000)
public String internationaliSDNNumber;
@Size(max = 1000)
public String state;
@Size(max = 1000)
public String employeeType;
@Size(max = 1000)
public String facsimileTelephoneNumber;
@Size(max = 1000)
public String postOfficeBox;
@Size(max = 1000)
public String initials;
@Size(max = 1000)
public String carLicense;
@Size(max = 1000)
public String mobile;
@Size(max = 1000)
public String postalAddress;
@Size(max = 1000)
public String city;
@Size(max = 1000)
public String teletexTerminalIdentifier;
@Size(max = 1000)
public String x121Address;
@Size(max = 1000)
public String businessCategory;
@Size(max = 1000)
public String registeredAddress;
@Size(max = 1000)
public String displayName;
@Size(max = 1000)
public String preferredLanguage;
@Size(max = 1000)
public String departmentNumber;
@ValidateTypeFailure
public Long uidNumber;
@ValidateTypeFailure
public Long gidNumber;
@Size(max = 1000)
public String homeDirectory;
public Map<String, String> attributes = new HashMap<>();
public String[] roles;

View file

@ -15,11 +15,32 @@
*/
package org.codelibs.fess.es.user.exbhv;
import java.util.Map;
import java.util.stream.Collectors;
import org.codelibs.core.misc.Pair;
import org.codelibs.fess.es.user.bsbhv.BsGroupBhv;
import org.codelibs.fess.es.user.exentity.Group;
import org.dbflute.exception.IllegalBehaviorStateException;
import org.dbflute.util.DfTypeUtil;
/**
* @author FreeGen
*/
public class GroupBhv extends BsGroupBhv {
@Override
protected <RESULT extends Group> RESULT createEntity(Map<String, Object> source, Class<? extends RESULT> entityType) {
try {
final RESULT result = entityType.newInstance();
result.setName(DfTypeUtil.toString(source.get("name")));
result.setAttributes(source.entrySet().stream().filter(e -> !"name".equals(e.getKey()))
.map(e -> new Pair<>(e.getKey(), (String) e.getValue()))
.collect(Collectors.toMap(t -> t.getFirst(), t -> t.getSecond())));
return result;
} catch (InstantiationException | IllegalAccessException e) {
final String msg = "Cannot create a new instance: " + entityType.getName();
throw new IllegalBehaviorStateException(msg, e);
}
}
}

View file

@ -15,11 +15,31 @@
*/
package org.codelibs.fess.es.user.exbhv;
import java.util.Map;
import java.util.stream.Collectors;
import org.codelibs.core.misc.Pair;
import org.codelibs.fess.es.user.bsbhv.BsRoleBhv;
import org.codelibs.fess.es.user.exentity.Role;
import org.dbflute.exception.IllegalBehaviorStateException;
import org.dbflute.util.DfTypeUtil;
/**
* @author FreeGen
*/
public class RoleBhv extends BsRoleBhv {
@Override
protected <RESULT extends Role> RESULT createEntity(Map<String, Object> source, Class<? extends RESULT> entityType) {
try {
final RESULT result = entityType.newInstance();
result.setName(DfTypeUtil.toString(source.get("name")));
result.setAttributes(source.entrySet().stream().filter(e -> !"name".equals(e.getKey()))
.map(e -> new Pair<>(e.getKey(), (String) e.getValue()))
.collect(Collectors.toMap(t -> t.getFirst(), t -> t.getSecond())));
return result;
} catch (InstantiationException | IllegalAccessException e) {
final String msg = "Cannot create a new instance: " + entityType.getName();
throw new IllegalBehaviorStateException(msg, e);
}
}
}

View file

@ -15,11 +15,45 @@
*/
package org.codelibs.fess.es.user.exbhv;
import java.util.Map;
import java.util.stream.Collectors;
import org.codelibs.core.misc.Pair;
import org.codelibs.fess.es.user.bsbhv.BsUserBhv;
import org.codelibs.fess.es.user.exentity.User;
import org.dbflute.exception.IllegalBehaviorStateException;
import org.dbflute.util.DfTypeUtil;
/**
* @author FreeGen
*/
public class UserBhv extends BsUserBhv {
private static final String ROLES = "roles";
private static final String GROUPS = "groups";
private static final String PASSWORD = "password";
private static final String NAME = "name";
@Override
protected <RESULT extends User> RESULT createEntity(Map<String, Object> source, Class<? extends RESULT> entityType) {
try {
final RESULT result = entityType.newInstance();
result.setName(DfTypeUtil.toString(source.get(NAME)));
result.setPassword(DfTypeUtil.toString(source.get(PASSWORD)));
result.setGroups(toStringArray(source.get(GROUPS)));
result.setRoles(toStringArray(source.get(ROLES)));
result.setAttributes(source.entrySet().stream().filter(e -> isAttribute(e.getKey()))
.map(e -> new Pair<>(e.getKey(), (String) e.getValue()))
.collect(Collectors.toMap(t -> t.getFirst(), t -> t.getSecond())));
return result;
} catch (InstantiationException | IllegalAccessException e) {
final String msg = "Cannot create a new instance: " + entityType.getName();
throw new IllegalBehaviorStateException(msg, e);
}
}
private boolean isAttribute(final String key) {
return !NAME.equals(key) && !PASSWORD.equals(key) && !GROUPS.equals(key) && !ROLES.equals(key);
}
}

View file

@ -15,6 +15,9 @@
*/
package org.codelibs.fess.es.user.exentity;
import java.util.HashMap;
import java.util.Map;
import org.codelibs.fess.es.user.bsentity.BsGroup;
/**
@ -24,6 +27,8 @@ public class Group extends BsGroup {
private static final long serialVersionUID = 1L;
private Map<String, String> attributes;
public Long getVersionNo() {
return asDocMeta().version();
}
@ -45,4 +50,23 @@ public class Group extends BsGroup {
return "Group [name=" + name + "]";
}
public Map<String, String> getAttributes() {
return attributes;
}
public void setAttributes(Map<String, String> attributes) {
this.attributes = attributes;
}
@Override
public Map<String, Object> toSource() {
Map<String, Object> sourceMap = new HashMap<>();
if (name != null) {
sourceMap.put("name", name);
}
if (attributes != null) {
sourceMap.putAll(attributes);
}
return sourceMap;
}
}

View file

@ -15,6 +15,9 @@
*/
package org.codelibs.fess.es.user.exentity;
import java.util.HashMap;
import java.util.Map;
import org.codelibs.fess.es.user.bsentity.BsRole;
/**
@ -24,6 +27,8 @@ public class Role extends BsRole {
private static final long serialVersionUID = 1L;
private Map<String, String> attributes;
public Long getVersionNo() {
return asDocMeta().version();
}
@ -44,4 +49,24 @@ public class Role extends BsRole {
public String toString() {
return "Role [name=" + name + "]";
}
public Map<String, String> getAttributes() {
return attributes;
}
public void setAttributes(Map<String, String> attributes) {
this.attributes = attributes;
}
@Override
public Map<String, Object> toSource() {
Map<String, Object> sourceMap = new HashMap<>();
if (name != null) {
sourceMap.put("name", name);
}
if (attributes != null) {
sourceMap.putAll(attributes);
}
return sourceMap;
}
}

View file

@ -20,7 +20,9 @@ import static org.codelibs.core.stream.StreamUtil.stream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.codelibs.fess.Constants;
import org.codelibs.fess.entity.FessUser;
@ -37,6 +39,8 @@ public class User extends BsUser implements FessUser {
private String originalPassword;
private Map<String, String> attributes;
public Long getVersionNo() {
return asDocMeta().version();
}
@ -96,4 +100,32 @@ public class User extends BsUser implements FessUser {
return true;
}
public Map<String, String> getAttributes() {
return attributes;
}
public void setAttributes(Map<String, String> attributes) {
this.attributes = attributes;
}
@Override
public Map<String, Object> toSource() {
Map<String, Object> sourceMap = new HashMap<>();
if (name != null) {
sourceMap.put("name", name);
}
if (password != null) {
sourceMap.put("password", password);
}
if (groups != null) {
sourceMap.put("groups", groups);
}
if (roles != null) {
sourceMap.put("roles", roles);
}
if (attributes != null) {
sourceMap.putAll(attributes);
}
return sourceMap;
}
}

View file

@ -54,7 +54,7 @@
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.group_gidNumber" /></th>
<td>${f:h(gidNumber)}<la:hidden property="gidNumber" /></td>
<td>${f:h(attributes.gidNumber)}<la:hidden property="attributes.gidNumber" /></td>
</tr>
</tbody>
</table>

View file

@ -58,8 +58,8 @@
<label for="gidNumber" class="col-sm-3 control-label"><la:message
key="labels.group_gidNumber" /></label>
<div class="col-sm-9">
<la:errors property="gidNumber" />
<la:text property="gidNumber" styleClass="form-control" />
<la:errors property="attributes.gidNumber" />
<la:text property="attributes.gidNumber" styleClass="form-control" />
</div>
</div>
</div>

View file

@ -52,148 +52,148 @@
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_surname" /></th>
<td>${f:h(surname)}<la:hidden property="surname" /></td>
<td>${f:h(attributes.surname)}<la:hidden property="attributes.surname" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_given_name" /></th>
<td>${f:h(givenName)}<la:hidden property="givenName" /></td>
<td>${f:h(attributes.givenName)}<la:hidden property="attributes.givenName" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_mail" /></th>
<td>${f:h(mail)}<la:hidden property="mail" /></td>
<td>${f:h(attributes.mail)}<la:hidden property="attributes.mail" /></td>
</tr>
<c:if test="${ldapAdminEnabled}">
<tr>
<th class="col-xs-2"><la:message key="labels.user_employeeNumber" /></th>
<td>${f:h(employeeNumber)}<la:hidden property="employeeNumber" /></td>
<td>${f:h(attributes.employeeNumber)}<la:hidden property="attributes.employeeNumber" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_telephoneNumber" /></th>
<td>${f:h(telephoneNumber)}<la:hidden property="telephoneNumber" /></td>
<td>${f:h(attributes.telephoneNumber)}<la:hidden property="attributes.telephoneNumber" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_homePhone" /></th>
<td>${f:h(homePhone)}<la:hidden property="homePhone" /></td>
<td>${f:h(attributes.homePhone)}<la:hidden property="attributes.homePhone" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_homePostalAddress" /></th>
<td>${f:h(homePostalAddress)}<la:hidden property="homePostalAddress" /></td>
<td>${f:h(attributes.homePostalAddress)}<la:hidden property="attributes.homePostalAddress" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_labeledURI" /></th>
<td>${f:h(labeledURI)}<la:hidden property="labeledURI" /></td>
<td>${f:h(attributes.labeledURI)}<la:hidden property="attributes.labeledURI" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_roomNumber" /></th>
<td>${f:h(roomNumber)}<la:hidden property="roomNumber" /></td>
<td>${f:h(attributes.roomNumber)}<la:hidden property="attributes.roomNumber" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_description" /></th>
<td>${f:h(description)}<la:hidden property="description" /></td>
<td>${f:h(attributes.description)}<la:hidden property="attributes.description" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_title" /></th>
<td>${f:h(title)}<la:hidden property="title" /></td>
<td>${f:h(attributes.title)}<la:hidden property="attributes.title" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_pager" /></th>
<td>${f:h(pager)}<la:hidden property="pager" /></td>
<td>${f:h(attributes.pager)}<la:hidden property="attributes.pager" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_street" /></th>
<td>${f:h(street)}<la:hidden property="street" /></td>
<td>${f:h(attributes.street)}<la:hidden property="attributes.street" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_postalCode" /></th>
<td>${f:h(postalCode)}<la:hidden property="postalCode" /></td>
<td>${f:h(attributes.postalCode)}<la:hidden property="attributes.postalCode" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_physicalDeliveryOfficeName" /></th>
<td>${f:h(physicalDeliveryOfficeName)}<la:hidden property="physicalDeliveryOfficeName" /></td>
<td>${f:h(attributes.physicalDeliveryOfficeName)}<la:hidden property="attributes.physicalDeliveryOfficeName" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_destinationIndicator" /></th>
<td>${f:h(destinationIndicator)}<la:hidden property="destinationIndicator" /></td>
<td>${f:h(attributes.destinationIndicator)}<la:hidden property="attributes.destinationIndicator" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_internationaliSDNNumber" /></th>
<td>${f:h(internationaliSDNNumber)}<la:hidden property="internationaliSDNNumber" /></td>
<td>${f:h(attributes.internationaliSDNNumber)}<la:hidden property="attributes.internationaliSDNNumber" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_state" /></th>
<td>${f:h(state)}<la:hidden property="state" /></td>
<td>${f:h(attributes.state)}<la:hidden property="attributes.state" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_employeeType" /></th>
<td>${f:h(facsimileTelephoneNumber)}<la:hidden property="employeeType" /></td>
<td>${f:h(attributes.facsimileTelephoneNumber)}<la:hidden property="attributes.employeeType" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_facsimileTelephoneNumber" /></th>
<td>${f:h(facsimileTelephoneNumber)}<la:hidden property="facsimileTelephoneNumber" /></td>
<td>${f:h(attributes.facsimileTelephoneNumber)}<la:hidden property="attributes.facsimileTelephoneNumber" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_postOfficeBox" /></th>
<td>${f:h(postOfficeBox)}<la:hidden property="postOfficeBox" /></td>
<td>${f:h(attributes.postOfficeBox)}<la:hidden property="attributes.postOfficeBox" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_initials" /></th>
<td>${f:h(initials)}<la:hidden property="initials" /></td>
<td>${f:h(attributes.initials)}<la:hidden property="attributes.initials" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_carLicense" /></th>
<td>${f:h(carLicense)}<la:hidden property="carLicense" /></td>
<td>${f:h(attributes.carLicense)}<la:hidden property="attributes.carLicense" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_mobile" /></th>
<td>${f:h(mobile)}<la:hidden property="mobile" /></td>
<td>${f:h(attributes.mobile)}<la:hidden property="attributes.mobile" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_postalAddress" /></th>
<td>${f:h(postalAddress)}<la:hidden property="postalAddress" /></td>
<td>${f:h(attributes.postalAddress)}<la:hidden property="attributes.postalAddress" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_city" /></th>
<td>${f:h(city)}<la:hidden property="city" /></td>
<td>${f:h(attributes.city)}<la:hidden property="attributes.city" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_teletexTerminalIdentifier" /></th>
<td>${f:h(teletexTerminalIdentifier)}<la:hidden property="teletexTerminalIdentifier" /></td>
<td>${f:h(attributes.teletexTerminalIdentifier)}<la:hidden property="attributes.teletexTerminalIdentifier" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_x121Address" /></th>
<td>${f:h(x121Address)}<la:hidden property="x121Address" /></td>
<td>${f:h(attributes.x121Address)}<la:hidden property="attributes.x121Address" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_businessCategory" /></th>
<td>${f:h(businessCategory)}<la:hidden property="businessCategory" /></td>
<td>${f:h(attributes.businessCategory)}<la:hidden property="attributes.businessCategory" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_registeredAddress" /></th>
<td>${f:h(registeredAddress)}<la:hidden property="registeredAddress" /></td>
<td>${f:h(attributes.registeredAddress)}<la:hidden property="attributes.registeredAddress" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_displayName" /></th>
<td>${f:h(displayName)}<la:hidden property="displayName" /></td>
<td>${f:h(attributes.displayName)}<la:hidden property="attributes.displayName" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_preferredLanguage" /></th>
<td>${f:h(preferredLanguage)}<la:hidden property="preferredLanguage" /></td>
<td>${f:h(attributes.preferredLanguage)}<la:hidden property="attributes.preferredLanguage" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_departmentNumber" /></th>
<td>${f:h(departmentNumber)}<la:hidden property="departmentNumber" /></td>
<td>${f:h(attributes.departmentNumber)}<la:hidden property="attributes.departmentNumber" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_uidNumber" /></th>
<td>${f:h(uidNumber)}<la:hidden property="uidNumber" /></td>
<td>${f:h(attributes.uidNumber)}<la:hidden property="attributes.uidNumber" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_gidNumber" /></th>
<td>${f:h(gidNumber)}<la:hidden property="gidNumber" /></td>
<td>${f:h(attributes.gidNumber)}<la:hidden property="attributes.gidNumber" /></td>
</tr>
<tr>
<th class="col-xs-2"><la:message key="labels.user_homeDirectory" /></th>
<td>${f:h(homeDirectory)}<la:hidden property="homeDirectory" /></td>
<td>${f:h(attributes.homeDirectory)}<la:hidden property="attributes.homeDirectory" /></td>
</tr>
</c:if>
<tr>

View file

@ -77,24 +77,24 @@
<label for="surname" class="col-sm-3 control-label"><la:message
key="labels.user_surname" /></label>
<div class="col-sm-9">
<la:errors property="surname" />
<la:text property="surname" styleClass="form-control" />
<la:errors property="attributes.surname" />
<la:text property="attributes.surname" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="givenName" class="col-sm-3 control-label"><la:message
key="labels.user_given_name" /></label>
<div class="col-sm-9">
<la:errors property="givenName" />
<la:text property="givenName" styleClass="form-control" />
<la:errors property="attributes.givenName" />
<la:text property="attributes.givenName" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="mail" class="col-sm-3 control-label"><la:message
key="labels.user_mail" /></label>
<div class="col-sm-9">
<la:errors property="mail" />
<la:text property="mail" styleClass="form-control" />
<la:errors property="attributes.mail" />
<la:text property="attributes.mail" styleClass="form-control" />
</div>
</div>
<c:if test="${ldapAdminEnabled}">
@ -102,264 +102,264 @@
<label for="employeeNumber" class="col-sm-3 control-label"><la:message
key="labels.user_employeeNumber" /></label>
<div class="col-sm-9">
<la:errors property="employeeNumber" />
<la:text property="employeeNumber" styleClass="form-control" />
<la:errors property="attributes.employeeNumber" />
<la:text property="attributes.employeeNumber" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="telephoneNumber" class="col-sm-3 control-label"><la:message
key="labels.user_telephoneNumber" /></label>
<div class="col-sm-9">
<la:errors property="telephoneNumber" />
<la:text property="telephoneNumber" styleClass="form-control" />
<la:errors property="attributes.telephoneNumber" />
<la:text property="attributes.telephoneNumber" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="homePhone" class="col-sm-3 control-label"><la:message
key="labels.user_homePhone" /></label>
<div class="col-sm-9">
<la:errors property="homePhone" />
<la:text property="homePhone" styleClass="form-control" />
<la:errors property="attributes.homePhone" />
<la:text property="attributes.homePhone" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="homePostalAddress" class="col-sm-3 control-label"><la:message
key="labels.user_homePostalAddress" /></label>
<div class="col-sm-9">
<la:errors property="homePostalAddress" />
<la:text property="homePostalAddress" styleClass="form-control" />
<la:errors property="attributes.homePostalAddress" />
<la:text property="attributes.homePostalAddress" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="labeledURI" class="col-sm-3 control-label"><la:message
key="labels.user_labeledURI" /></label>
<div class="col-sm-9">
<la:errors property="labeledURI" />
<la:text property="labeledURI" styleClass="form-control" />
<la:errors property="attributes.labeledURI" />
<la:text property="attributes.labeledURI" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="roomNumber" class="col-sm-3 control-label"><la:message
key="labels.user_roomNumber" /></label>
<div class="col-sm-9">
<la:errors property="roomNumber" />
<la:text property="roomNumber" styleClass="form-control" />
<la:errors property="attributes.roomNumber" />
<la:text property="attributes.roomNumber" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="description" class="col-sm-3 control-label"><la:message
key="labels.user_description" /></label>
<div class="col-sm-9">
<la:errors property="description" />
<la:text property="description" styleClass="form-control" />
<la:errors property="attributes.description" />
<la:text property="attributes.description" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="title" class="col-sm-3 control-label"><la:message
key="labels.user_title" /></label>
<div class="col-sm-9">
<la:errors property="title" />
<la:text property="title" styleClass="form-control" />
<la:errors property="attributes.title" />
<la:text property="attributes.title" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="pager" class="col-sm-3 control-label"><la:message
key="labels.user_pager" /></label>
<div class="col-sm-9">
<la:errors property="pager" />
<la:text property="pager" styleClass="form-control" />
<la:errors property="attributes.pager" />
<la:text property="attributes.pager" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="street" class="col-sm-3 control-label"><la:message
key="labels.user_street" /></label>
<div class="col-sm-9">
<la:errors property="street" />
<la:text property="street" styleClass="form-control" />
<la:errors property="attributes.street" />
<la:text property="attributes.street" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="postalCode" class="col-sm-3 control-label"><la:message
key="labels.user_postalCode" /></label>
<div class="col-sm-9">
<la:errors property="postalCode" />
<la:text property="postalCode" styleClass="form-control" />
<la:errors property="attributes.postalCode" />
<la:text property="attributes.postalCode" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="physicalDeliveryOfficeName" class="col-sm-3 control-label"><la:message
key="labels.user_physicalDeliveryOfficeName" /></label>
<div class="col-sm-9">
<la:errors property="physicalDeliveryOfficeName" />
<la:text property="physicalDeliveryOfficeName" styleClass="form-control" />
<la:errors property="attributes.physicalDeliveryOfficeName" />
<la:text property="attributes.physicalDeliveryOfficeName" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="destinationIndicator" class="col-sm-3 control-label"><la:message
key="labels.user_destinationIndicator" /></label>
<div class="col-sm-9">
<la:errors property="destinationIndicator" />
<la:text property="destinationIndicator" styleClass="form-control" />
<la:errors property="attributes.destinationIndicator" />
<la:text property="attributes.destinationIndicator" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="internationaliSDNNumber" class="col-sm-3 control-label"><la:message
key="labels.user_internationaliSDNNumber" /></label>
<div class="col-sm-9">
<la:errors property="internationaliSDNNumber" />
<la:text property="internationaliSDNNumber" styleClass="form-control" />
<la:errors property="attributes.internationaliSDNNumber" />
<la:text property="attributes.internationaliSDNNumber" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="state" class="col-sm-3 control-label"><la:message
key="labels.user_state" /></label>
<div class="col-sm-9">
<la:errors property="state" />
<la:text property="state" styleClass="form-control" />
<la:errors property="attributes.state" />
<la:text property="attributes.state" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="employeeType" class="col-sm-3 control-label"><la:message
key="labels.user_employeeType" /></label>
<div class="col-sm-9">
<la:errors property="employeeType" />
<la:text property="employeeType" styleClass="form-control" />
<la:errors property="attributes.employeeType" />
<la:text property="attributes.employeeType" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="facsimileTelephoneNumber" class="col-sm-3 control-label"><la:message
key="labels.user_facsimileTelephoneNumber" /></label>
<div class="col-sm-9">
<la:errors property="facsimileTelephoneNumber" />
<la:text property="facsimileTelephoneNumber" styleClass="form-control" />
<la:errors property="attributes.facsimileTelephoneNumber" />
<la:text property="attributes.facsimileTelephoneNumber" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="postOfficeBox" class="col-sm-3 control-label"><la:message
key="labels.user_postOfficeBox" /></label>
<div class="col-sm-9">
<la:errors property="postOfficeBox" />
<la:text property="postOfficeBox" styleClass="form-control" />
<la:errors property="attributes.postOfficeBox" />
<la:text property="attributes.postOfficeBox" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="initials" class="col-sm-3 control-label"><la:message
key="labels.user_initials" /></label>
<div class="col-sm-9">
<la:errors property="initials" />
<la:text property="initials" styleClass="form-control" />
<la:errors property="attributes.initials" />
<la:text property="attributes.initials" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="carLicense" class="col-sm-3 control-label"><la:message
key="labels.user_carLicense" /></label>
<div class="col-sm-9">
<la:errors property="carLicense" />
<la:text property="carLicense" styleClass="form-control" />
<la:errors property="attributes.carLicense" />
<la:text property="attributes.carLicense" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="mobile" class="col-sm-3 control-label"><la:message
key="labels.user_mobile" /></label>
<div class="col-sm-9">
<la:errors property="mobile" />
<la:text property="mobile" styleClass="form-control" />
<la:errors property="attributes.mobile" />
<la:text property="attributes.mobile" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="postalAddress" class="col-sm-3 control-label"><la:message
key="labels.user_postalAddress" /></label>
<div class="col-sm-9">
<la:errors property="postalAddress" />
<la:text property="postalAddress" styleClass="form-control" />
<la:errors property="attributes.postalAddress" />
<la:text property="attributes.postalAddress" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="city" class="col-sm-3 control-label"><la:message
key="labels.user_city" /></label>
<div class="col-sm-9">
<la:errors property="city" />
<la:text property="city" styleClass="form-control" />
<la:errors property="attributes.city" />
<la:text property="attributes.city" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="teletexTerminalIdentifier" class="col-sm-3 control-label"><la:message
key="labels.user_teletexTerminalIdentifier" /></label>
<div class="col-sm-9">
<la:errors property="teletexTerminalIdentifier" />
<la:text property="teletexTerminalIdentifier" styleClass="form-control" />
<la:errors property="attributes.teletexTerminalIdentifier" />
<la:text property="attributes.teletexTerminalIdentifier" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="x121Address" class="col-sm-3 control-label"><la:message
key="labels.user_x121Address" /></label>
<div class="col-sm-9">
<la:errors property="x121Address" />
<la:text property="x121Address" styleClass="form-control" />
<la:errors property="attributes.x121Address" />
<la:text property="attributes.x121Address" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="businessCategory" class="col-sm-3 control-label"><la:message
key="labels.user_businessCategory" /></label>
<div class="col-sm-9">
<la:errors property="businessCategory" />
<la:text property="businessCategory" styleClass="form-control" />
<la:errors property="attributes.businessCategory" />
<la:text property="attributes.businessCategory" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="registeredAddress" class="col-sm-3 control-label"><la:message
key="labels.user_registeredAddress" /></label>
<div class="col-sm-9">
<la:errors property="registeredAddress" />
<la:text property="registeredAddress" styleClass="form-control" />
<la:errors property="attributes.registeredAddress" />
<la:text property="attributes.registeredAddress" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="displayName" class="col-sm-3 control-label"><la:message
key="labels.user_displayName" /></label>
<div class="col-sm-9">
<la:errors property="displayName" />
<la:text property="displayName" styleClass="form-control" />
<la:errors property="attributes.displayName" />
<la:text property="attributes.displayName" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="preferredLanguage" class="col-sm-3 control-label"><la:message
key="labels.user_preferredLanguage" /></label>
<div class="col-sm-9">
<la:errors property="preferredLanguage" />
<la:text property="preferredLanguage" styleClass="form-control" />
<la:errors property="attributes.preferredLanguage" />
<la:text property="attributes.preferredLanguage" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="departmentNumber" class="col-sm-3 control-label"><la:message
key="labels.user_departmentNumber" /></label>
<div class="col-sm-9">
<la:errors property="departmentNumber" />
<la:text property="departmentNumber" styleClass="form-control" />
<la:errors property="attributes.departmentNumber" />
<la:text property="attributes.departmentNumber" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="uidNumber" class="col-sm-3 control-label"><la:message
key="labels.user_uidNumber" /></label>
<div class="col-sm-9">
<la:errors property="uidNumber" />
<la:text property="uidNumber" styleClass="form-control" />
<la:errors property="attributes.uidNumber" />
<la:text property="attributes.uidNumber" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="gidNumber" class="col-sm-3 control-label"><la:message
key="labels.user_gidNumber" /></label>
<div class="col-sm-9">
<la:errors property="gidNumber" />
<la:text property="gidNumber" styleClass="form-control" />
<la:errors property="attributes.gidNumber" />
<la:text property="attributes.gidNumber" styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="homeDirectory" class="col-sm-3 control-label"><la:message
key="labels.user_homeDirectory" /></label>
<div class="col-sm-9">
<la:errors property="homeDirectory" />
<la:text property="homeDirectory" styleClass="form-control" />
<la:errors property="attributes.homeDirectory" />
<la:text property="attributes.homeDirectory" styleClass="form-control" />
</div>
</div>
</c:if>