diff --git a/pom.xml b/pom.xml index 2bb7e3ab..e5e408c5 100644 --- a/pom.xml +++ b/pom.xml @@ -238,6 +238,24 @@ lambdaj 2.2 + + + commons-collections + commons-collections + 3.2.1 + + + + commons-httpclient + commons-httpclient + 3.1 + + + + org.codehaus.castor + spring-xml + 1.2.1 + diff --git a/src/main/java/info/bukova/isspst/Constants.java b/src/main/java/info/bukova/isspst/Constants.java index 2d1b3923..26c5ca28 100644 --- a/src/main/java/info/bukova/isspst/Constants.java +++ b/src/main/java/info/bukova/isspst/Constants.java @@ -1,10 +1,29 @@ package info.bukova.isspst; +import info.bukova.isspst.data.Role; + public class Constants { public final static String DEF_ADMIN = "admin"; public final static String DEF_ADMIN_PASSWD = "admin"; public final static String ROLE_USER = "ROLE_USER"; public final static String ROLE_ADMIN = "ROLE_ADMIN"; - public final static String ROLES[] = {ROLE_USER, ROLE_ADMIN}; + public final static String ROLE_DIRECTOR = "ROLE_DIRECTOR"; + public final static String ROLE_MANAGER = "ROLE_MANAGER"; + public final static String ROLE_PRINCIPAL = "ROLE_PRINCIPAL"; + public final static String ROLE_ACCOUNTANT = "ROLE_ACCOUNTANT"; + public final static String ROLE_SUPPLIER = "ROLE_SUPPLIER"; + public final static String ROLE_TECHNICIAN = "ROLE_TECHNICIAN"; + public final static String ROLE_LEADER = "ROLE_LEADER"; + public final static Role ROLES[] = { + new Role(ROLE_ADMIN, "Administrátor"), + new Role(ROLE_DIRECTOR, "Ředitel"), + new Role(ROLE_MANAGER, "Správce"), + new Role(ROLE_PRINCIPAL, "Příkazce"), + new Role(ROLE_ACCOUNTANT, "Účetní"), + new Role(ROLE_SUPPLIER, "Zásobovač"), + new Role(ROLE_TECHNICIAN, "Technik"), + new Role(ROLE_LEADER, "Vedoucí"), + new Role(ROLE_USER, "Uživatel") + }; } diff --git a/src/main/java/info/bukova/isspst/DbInitListener.java b/src/main/java/info/bukova/isspst/DbInitListener.java index ada4fa8a..da5f8974 100644 --- a/src/main/java/info/bukova/isspst/DbInitListener.java +++ b/src/main/java/info/bukova/isspst/DbInitListener.java @@ -2,14 +2,15 @@ package info.bukova.isspst; import info.bukova.isspst.data.Role; import info.bukova.isspst.data.User; -import info.bukova.isspst.services.RoleService; -import info.bukova.isspst.services.UserService; +import info.bukova.isspst.services.users.RoleService; +import info.bukova.isspst.services.users.UserService; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; @@ -37,16 +38,10 @@ public class DbInitListener implements ServletContextListener { } private void checkRoles() { - Role r = null; - - for (String auth : Constants.ROLES) + for (Role role : Constants.ROLES) { - r = roleService.getRoleByAuthority(auth); - if (r == null) { - r = new Role(); - r.setAuthority(auth); - r.setDescription("---"); - roleService.add(r); + if (roleService.getRoleByAuthority(role.getAuthority()) == null) { + roleService.add(role); } } } @@ -62,12 +57,20 @@ public class DbInitListener implements ServletContextListener { } if (!adminExists) { - User u = new User(); - u.setUsername(Constants.DEF_ADMIN); - u.addAuthority(roleService.getRoleByAuthority(Constants.ROLE_ADMIN)); - u.setEnabled(true); - userService.setPassword(u, Constants.DEF_ADMIN_PASSWD); - userService.add(u); + User u = null; + try { + u = (User) userService.loadUserByUsername(Constants.DEF_ADMIN); + u.addAuthority(roleService.getRoleByAuthority(Constants.ROLE_ADMIN)); + u.setEnabled(true); + userService.update(u); + } catch(UsernameNotFoundException e) { + u = new User(); + u.setUsername(Constants.DEF_ADMIN); + userService.setPassword(u, Constants.DEF_ADMIN_PASSWD); + u.addAuthority(roleService.getRoleByAuthority(Constants.ROLE_ADMIN)); + u.setEnabled(true); + userService.add(u); + } } } diff --git a/src/main/java/info/bukova/isspst/HomeController.java b/src/main/java/info/bukova/isspst/HomeController.java index 0d5b9736..fb3ef412 100644 --- a/src/main/java/info/bukova/isspst/HomeController.java +++ b/src/main/java/info/bukova/isspst/HomeController.java @@ -1,7 +1,7 @@ package info.bukova.isspst; import info.bukova.isspst.data.User; -import info.bukova.isspst.services.UserService; +import info.bukova.isspst.services.users.UserService; import java.text.DateFormat; import java.util.Date; diff --git a/src/main/java/info/bukova/isspst/StringUtils.java b/src/main/java/info/bukova/isspst/StringUtils.java new file mode 100644 index 00000000..2720016f --- /dev/null +++ b/src/main/java/info/bukova/isspst/StringUtils.java @@ -0,0 +1,13 @@ +package info.bukova.isspst; + +public class StringUtils { + + public static String nullStr(String str) { + return str == null ? "" : str; + } + + public static String not0ToStr(long i) { + return i == 0 ? "" : String.valueOf(i); + } + +} diff --git a/src/main/java/info/bukova/isspst/dao/AddressDao.java b/src/main/java/info/bukova/isspst/dao/AddressDao.java new file mode 100644 index 00000000..04ae626a --- /dev/null +++ b/src/main/java/info/bukova/isspst/dao/AddressDao.java @@ -0,0 +1,7 @@ +package info.bukova.isspst.dao; + +import info.bukova.isspst.data.Address; + +public interface AddressDao extends BaseDao
{ + +} diff --git a/src/main/java/info/bukova/isspst/dao/jpa/AddressDaoJPA.java b/src/main/java/info/bukova/isspst/dao/jpa/AddressDaoJPA.java new file mode 100644 index 00000000..92f605b5 --- /dev/null +++ b/src/main/java/info/bukova/isspst/dao/jpa/AddressDaoJPA.java @@ -0,0 +1,13 @@ +package info.bukova.isspst.dao.jpa; + +import info.bukova.isspst.dao.AddressDao; +import info.bukova.isspst.data.Address; + +public class AddressDaoJPA extends BaseDaoJPA
implements AddressDao { + + @Override + public String getEntityName() { + return Address.class.getSimpleName(); + } + +} diff --git a/src/main/java/info/bukova/isspst/data/Address.java b/src/main/java/info/bukova/isspst/data/Address.java new file mode 100644 index 00000000..d263970f --- /dev/null +++ b/src/main/java/info/bukova/isspst/data/Address.java @@ -0,0 +1,135 @@ +package info.bukova.isspst.data; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +import org.hibernate.validator.constraints.Email; +import org.hibernate.validator.constraints.NotEmpty; +import org.hibernate.validator.constraints.URL; + +@Entity +@Table(name="ADDRESS") +public class Address extends BaseData { + + @Column(name="COMPANY") + private String company; + @Column(name="DEPARTMENT") + private String department; + @Column(name="CONTACT_NAME") + private String contactName; + @Column(name="STREET") + private String street; + @Column(name="HOUSE_NUMBER") + private String houseNumber; + @Column(name="ZIP_CODE") + private String zipCode; + @Column(name="CITY") + private String city; + @Column(name="STATE") + private String state; + @Column(name="IC") + private long ic; + @Column(name="DIC") + private String dic; + @Column(name="PHONE") + private String phone; + @Column(name="EMAIL") + private String email; + @Column(name="WEB") + private String web; + @Column(name="DESCRIPTION") + private String description; + + @NotNull(message = "Zadejte firmu") + @NotEmpty(message = "Zadejte firmu") + public String getCompany() { + return company; + } + public void setCompany(String company) { + this.company = company; + } + public String getDepartment() { + return department; + } + public void setDepartment(String department) { + this.department = department; + } + public String getContactName() { + return contactName; + } + public void setContactName(String contactName) { + this.contactName = contactName; + } + public String getStreet() { + return street; + } + public void setStreet(String street) { + this.street = street; + } + public String getHouseNumber() { + return houseNumber; + } + public void setHouseNumber(String houseNumber) { + this.houseNumber = houseNumber; + } + public String getZipCode() { + return zipCode; + } + public void setZipCode(String zipCode) { + this.zipCode = zipCode; + } + @NotNull(message = "Zadejte město") + @NotEmpty(message = "Zadejte město") + public String getCity() { + return city; + } + public void setCity(String city) { + this.city = city; + } + public String getState() { + return state; + } + public void setState(String state) { + this.state = state; + } + public long getIc() { + return ic; + } + public void setIc(long ic) { + this.ic = ic; + } + public String getDic() { + return dic; + } + public void setDic(String dic) { + this.dic = dic; + } + public String getPhone() { + return phone; + } + public void setPhone(String phone) { + this.phone = phone; + } + @Email(message = "Špatný formát adresy") + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + @URL(message = "Špatný formát adresy") + public String getWeb() { + return web; + } + public void setWeb(String web) { + this.web = web; + } + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } +} diff --git a/src/main/java/info/bukova/isspst/data/BaseData.java b/src/main/java/info/bukova/isspst/data/BaseData.java new file mode 100644 index 00000000..189ee627 --- /dev/null +++ b/src/main/java/info/bukova/isspst/data/BaseData.java @@ -0,0 +1,94 @@ +package info.bukova.isspst.data; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.MappedSuperclass; +import javax.persistence.Transient; + +@MappedSuperclass +public abstract class BaseData implements OwnedDataModel { + + @Id + @Column(name="ID") + @GeneratedValue + private int id; + @Column(name="CREATED") + private Date created; + @Column(name="MODIFIED") + private Date modified; + @ManyToOne(fetch=FetchType.EAGER) + @JoinColumn(name="OWNED_BY_ID") + private User ownedBy; + @ManyToOne(fetch=FetchType.EAGER) + @JoinColumn(name="MODIFIED_BY_ID") + private User modifiedBy; + @Transient + private boolean valid; + + @Override + public void setId(int id) { + this.id = id; + } + + @Override + public int getId() { + return this.id; + } + + @Override + public void setCreated(Date created) { + this.created = created; + } + + @Override + public Date getCreated() { + return this.created; + } + + @Override + public void setModified(Date modified) { + this.modified = modified; + } + + @Override + public Date getModified() { + return this.modified; + } + + @Override + public boolean isValid() { + return this.valid; + } + + @Override + public void setValid(boolean valid) { + this.valid = valid; + } + + @Override + public void setOwnedBy(User user) { + this.ownedBy = user; + } + + @Override + public User getOwnedBy() { + return this.ownedBy; + } + + @Override + public void setModifiedBy(User user) { + this.modifiedBy = user; + } + + @Override + public User getModifiedBy() { + return this.modifiedBy; + } + +} diff --git a/src/main/java/info/bukova/isspst/data/OwnedDataModel.java b/src/main/java/info/bukova/isspst/data/OwnedDataModel.java new file mode 100644 index 00000000..99bd7100 --- /dev/null +++ b/src/main/java/info/bukova/isspst/data/OwnedDataModel.java @@ -0,0 +1,10 @@ +package info.bukova.isspst.data; + +public interface OwnedDataModel extends DataModel { + + public void setOwnedBy(User user); + public User getOwnedBy(); + public void setModifiedBy(User user); + public User getModifiedBy(); + +} diff --git a/src/main/java/info/bukova/isspst/data/Role.java b/src/main/java/info/bukova/isspst/data/Role.java index 6ecc2710..b957606f 100644 --- a/src/main/java/info/bukova/isspst/data/Role.java +++ b/src/main/java/info/bukova/isspst/data/Role.java @@ -34,6 +34,15 @@ public class Role implements GrantedAuthority, DataModel { private Date modified; @Transient private boolean valid; + + public Role(String authority, String description) { + this.authority = authority; + this.description = description; + } + + public Role() { + + } @Override public String getAuthority() { @@ -83,5 +92,14 @@ public class Role implements GrantedAuthority, DataModel { public void setValid(boolean valid) { this.valid = valid; } + + @Override + public boolean equals(Object o) { + if ((o instanceof Role) && ((Role)o).getId() == this.id) { + return true; + } else { + return false; + } + } } diff --git a/src/main/java/info/bukova/isspst/data/User.java b/src/main/java/info/bukova/isspst/data/User.java index 5091b7e9..fc3c20d7 100644 --- a/src/main/java/info/bukova/isspst/data/User.java +++ b/src/main/java/info/bukova/isspst/data/User.java @@ -9,9 +9,9 @@ import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.JoinColumn; import javax.persistence.JoinTable; -import javax.persistence.MapKeyColumn; -import javax.persistence.OneToMany; +import javax.persistence.ManyToMany; import javax.persistence.Table; import javax.persistence.Transient; @@ -36,9 +36,18 @@ public class User implements UserDetails, DataModel { private String password; @Column(name="ENABLED") private boolean enabled; - private String fullName; - @OneToMany(fetch=FetchType.EAGER) @JoinTable(name="USER_ROLE") - @MapKeyColumn(name="ROLE_ID") + @Column(name="FIRST_NAME") + private String firstName; + @Column(name="LAST_NAME") + private String lastName; + @Column(name="PERSONAL_NUMBER") + private String personalNumber; + @Column(name="EMAIL") + private String email; + @Column(name="NOTIFY") + private boolean notify; + @ManyToMany(fetch=FetchType.EAGER) + @JoinTable(name="USER_ROLE", joinColumns={@JoinColumn(name="USER_ID")}, inverseJoinColumns={@JoinColumn(name="ROLE_ID")}) private List authorities; @Column(name="CREATED") private Date created; @@ -139,11 +148,51 @@ public class User implements UserDetails, DataModel { } public String getFullName() { - return fullName; + String ret = ""; + if (firstName != null && !firstName.isEmpty()) { + ret = firstName + " "; + } + return ret + lastName == null ? "" : lastName; } - public void setFullName(String fullName) { - this.fullName = fullName; + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getPersonalNumber() { + return personalNumber; + } + + public void setPersonalNumber(String personalNumber) { + this.personalNumber = personalNumber; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public boolean isNotify() { + return notify; + } + + public void setNotify(boolean notify) { + this.notify = notify; } } diff --git a/src/main/java/info/bukova/isspst/filters/AddressFilter.java b/src/main/java/info/bukova/isspst/filters/AddressFilter.java new file mode 100644 index 00000000..468b59ea --- /dev/null +++ b/src/main/java/info/bukova/isspst/filters/AddressFilter.java @@ -0,0 +1,60 @@ +package info.bukova.isspst.filters; + +import static info.bukova.isspst.StringUtils.not0ToStr; +import static info.bukova.isspst.StringUtils.nullStr; +import info.bukova.isspst.data.Address; + +import org.hamcrest.Description; +import org.hamcrest.Factory; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; + +public class AddressFilter implements Filter
{ + + private Address condAddr; + + public AddressFilter(Address condAddr) { + this.condAddr = condAddr; + } + + private static class AddrMatcher extends TypeSafeMatcher
{ + + private Address condAddress; + + public AddrMatcher(Address cond) { + this.condAddress = cond; + } + + @Override + public void describeTo(Description desc) { + desc.appendText("address matches"); + } + + @Override + public boolean matchesSafely(Address item) { + return nullStr(item.getCompany()).toLowerCase().contains(nullStr(condAddress.getCompany()).toLowerCase()) + && nullStr(item.getCity()).toLowerCase().contains(nullStr(condAddress.getCity()).toLowerCase()) + && nullStr(item.getContactName()).toLowerCase().contains(nullStr(condAddress.getContactName()).toLowerCase()) + && nullStr(item.getStreet()).toLowerCase().contains(nullStr(condAddress.getStreet()).toLowerCase()) + && not0ToStr(item.getIc()).startsWith(not0ToStr(condAddress.getIc())) + && nullStr(item.getHouseNumber()).startsWith(nullStr(condAddress.getHouseNumber())); + } + + @Factory + public static Matcher
matchAddr(Address addr) { + return new AddrMatcher(addr); + } + } + + @Override + public AddrMatcher matcher() { + return new AddrMatcher(condAddr); + } + + @Override + public String queryString() { + // TODO query string + return ""; + } + +} diff --git a/src/main/java/info/bukova/isspst/filters/UserFilter.java b/src/main/java/info/bukova/isspst/filters/UserFilter.java new file mode 100644 index 00000000..c613510c --- /dev/null +++ b/src/main/java/info/bukova/isspst/filters/UserFilter.java @@ -0,0 +1,57 @@ +package info.bukova.isspst.filters; + +import info.bukova.isspst.data.User; + +import org.hamcrest.Description; +import org.hamcrest.Factory; +import org.hamcrest.TypeSafeMatcher; + +import static info.bukova.isspst.StringUtils.nullStr; + +public class UserFilter implements Filter { + + private User condUser; + + public UserFilter(User condition) { + this.condUser = condition; + } + + private static class UserMatcher extends TypeSafeMatcher { + + private User condUser; + + public UserMatcher(User condition) { + this.condUser = condition; + } + + @Override + public void describeTo(Description description) { + description.appendText("user matcher"); + } + + @Override + public boolean matchesSafely(User item) { + return nullStr(item.getUsername()).toLowerCase().contains(nullStr(condUser.getUsername()).toLowerCase()) + && nullStr(item.getFirstName()).toLowerCase().contains(nullStr(condUser.getFirstName()).toLowerCase()) + && nullStr(item.getLastName()).toLowerCase().contains(nullStr(condUser.getLastName()).toLowerCase()) + && nullStr(item.getPersonalNumber()).toLowerCase().contains(nullStr(condUser.getPersonalNumber()).toLowerCase()); + } + + @Factory + public UserMatcher matchUser(User cond) { + return new UserMatcher(cond); + } + + } + + @Override + public TypeSafeMatcher matcher() { + return new UserMatcher(condUser); + } + + @Override + public String queryString() { + return null; + } + +} diff --git a/src/main/java/info/bukova/isspst/services/AbstractOwnedService.java b/src/main/java/info/bukova/isspst/services/AbstractOwnedService.java new file mode 100644 index 00000000..93e0a433 --- /dev/null +++ b/src/main/java/info/bukova/isspst/services/AbstractOwnedService.java @@ -0,0 +1,39 @@ +package info.bukova.isspst.services; + +import java.util.Date; + +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.transaction.annotation.Transactional; + +import info.bukova.isspst.data.OwnedDataModel; +import info.bukova.isspst.data.User; + +public class AbstractOwnedService extends AbstractService { + + @Override + @Transactional + public void add(T entity) { + validate(entity); + entity.setCreated(new Date()); + entity.setOwnedBy(getLoggedInUser()); + dao.add(entity); + } + + @Override + @Transactional + public void update(T entity) { + if (entity.getCreated() == null) { + add(entity); + } else { + validate(entity); + entity.setModifiedBy(getLoggedInUser()); + entity.setModified(new Date()); + dao.modify(entity); + } + } + + protected User getLoggedInUser() { + return (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + } + +} diff --git a/src/main/java/info/bukova/isspst/services/AbstractService.java b/src/main/java/info/bukova/isspst/services/AbstractService.java index 163873f6..81b77371 100644 --- a/src/main/java/info/bukova/isspst/services/AbstractService.java +++ b/src/main/java/info/bukova/isspst/services/AbstractService.java @@ -1,6 +1,9 @@ package info.bukova.isspst.services; import static ch.lambdaj.Lambda.filter; +import info.bukova.isspst.dao.BaseDao; +import info.bukova.isspst.data.DataModel; +import info.bukova.isspst.filters.Filter; import java.util.Date; import java.util.List; @@ -9,16 +12,10 @@ import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validator; -import org.hibernate.HibernateException; import org.hibernate.NonUniqueResultException; import org.hibernate.Query; import org.springframework.transaction.annotation.Transactional; -import info.bukova.isspst.dao.BaseDao; -import info.bukova.isspst.dao.IntegrityException; -import info.bukova.isspst.data.DataModel; -import info.bukova.isspst.filters.Filter; - public abstract class AbstractService implements Service { protected BaseDao dao; @@ -31,25 +28,27 @@ public abstract class AbstractService implements Service @Override @Transactional public void add(T entity) { + validate(entity); entity.setCreated(new Date()); dao.add(entity); } - + @Override @Transactional public void update(T entity) { - entity.setModified(new Date()); - dao.modify(entity); + if (entity.getCreated() == null) { + add(entity); + } else { + validate(entity); + entity.setModified(new Date()); + dao.modify(entity); + } } @Override @Transactional public void delete(T entity) { - try { - dao.delete(entity); - } catch (HibernateException e) { - throw new IntegrityException(e); - } + dao.delete(entity); } @Override diff --git a/src/main/java/info/bukova/isspst/services/IsspstException.java b/src/main/java/info/bukova/isspst/services/IsspstException.java new file mode 100644 index 00000000..b0a89439 --- /dev/null +++ b/src/main/java/info/bukova/isspst/services/IsspstException.java @@ -0,0 +1,25 @@ +package info.bukova.isspst.services; + +public class IsspstException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + private final static String MSG = "RsFaktura Exception. "; + + public IsspstException() { + super(MSG); + } + + public IsspstException(String message) { + super(MSG + message); + } + + public IsspstException(Throwable cause) { + super(cause); + } + + public IsspstException(String message, Throwable cause) { + super(MSG + message, cause); + } + +} diff --git a/src/main/java/info/bukova/isspst/services/UserService.java b/src/main/java/info/bukova/isspst/services/UserService.java deleted file mode 100644 index de8af3b7..00000000 --- a/src/main/java/info/bukova/isspst/services/UserService.java +++ /dev/null @@ -1,11 +0,0 @@ -package info.bukova.isspst.services; - -import info.bukova.isspst.data.User; - -public interface UserService extends Service { - - public void setPassword(User user, String password); - public boolean hasRole(User user, String authority); - public void test(); - -} diff --git a/src/main/java/info/bukova/isspst/services/addressbook/AdbService.java b/src/main/java/info/bukova/isspst/services/addressbook/AdbService.java new file mode 100644 index 00000000..e14c0165 --- /dev/null +++ b/src/main/java/info/bukova/isspst/services/addressbook/AdbService.java @@ -0,0 +1,17 @@ +package info.bukova.isspst.services.addressbook; + +import info.bukova.isspst.data.Address; +import info.bukova.isspst.services.Service; + +import java.util.List; + +public interface AdbService extends Service
{ + + public List
lookForAddr(AddressFinder finder, Address condAdr); + public void fillFoundData(AddressFinder finder, Address address); + public void mergeAddress(Address destination, Address source, boolean overwrite); + public List
queryToArrayList(String filter); + + public int count(); + +} diff --git a/src/main/java/info/bukova/isspst/services/addressbook/AdbServiceImpl.java b/src/main/java/info/bukova/isspst/services/addressbook/AdbServiceImpl.java new file mode 100644 index 00000000..3abb9d95 --- /dev/null +++ b/src/main/java/info/bukova/isspst/services/addressbook/AdbServiceImpl.java @@ -0,0 +1,70 @@ +package info.bukova.isspst.services.addressbook; + +import info.bukova.isspst.data.Address; +import info.bukova.isspst.services.AbstractOwnedService; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.transaction.annotation.Transactional; + +public class AdbServiceImpl extends AbstractOwnedService
implements AdbService { + + @Override + public List
lookForAddr(AddressFinder finder, Address condAddr) { + return finder.findAddress(condAddr); + } + + @Override + public void mergeAddress(Address destination, Address source, boolean overwrite) { + if (destination.getIc() == 0) + destination.setIc(source.getIc()); + if (destination.getCompany() == null || destination.getCompany().isEmpty() || overwrite) + destination.setCompany(source.getCompany()); + if (destination.getDic() == null || destination.getDic().isEmpty() || overwrite) + destination.setDic(source.getDic()); + if (destination.getDepartment() == null || destination.getDepartment().isEmpty() || overwrite) + destination.setDepartment(source.getDepartment()); + if (destination.getContactName() == null || destination.getContactName().isEmpty() || overwrite) + destination.setContactName(source.getContactName()); + if (destination.getStreet() == null || destination.getStreet().isEmpty() || overwrite) + destination.setStreet(source.getStreet()); + if (destination.getHouseNumber() == null || destination.getHouseNumber().isEmpty() || overwrite) + destination.setHouseNumber(source.getHouseNumber()); + if (destination.getCity() == null || destination.getCity().isEmpty() || overwrite) + destination.setCity(source.getCity()); + if (destination.getZipCode() == null || destination.getZipCode().isEmpty() || overwrite) + destination.setZipCode(source.getZipCode()); + if (destination.getPhone() == null || destination.getPhone().isEmpty() || overwrite) + destination.setPhone(source.getPhone()); + if (destination.getEmail() == null || destination.getEmail().isEmpty() || overwrite) + destination.setEmail(source.getEmail()); + } + + @Override + public void fillFoundData(AddressFinder finder, Address address) { + List
found = finder.findAddress(address); + + if (found.size() > 0) { + this.mergeAddress(address, found.get(0), false); + } + } + + + @Override + public List
queryToArrayList(String filter) { + return new ArrayList
(execQuery(filter)); + } + + @Override + @Transactional + public int count() { +// Query q = queryDefaultFilter(); +// q.setResult("count(id)"); +// Object result = q.execute(); +// +// return ((Long)result).intValue(); + return 0; + } + +} diff --git a/src/main/java/info/bukova/isspst/services/addressbook/AddressFinder.java b/src/main/java/info/bukova/isspst/services/addressbook/AddressFinder.java new file mode 100644 index 00000000..119d7911 --- /dev/null +++ b/src/main/java/info/bukova/isspst/services/addressbook/AddressFinder.java @@ -0,0 +1,11 @@ +package info.bukova.isspst.services.addressbook; + +import info.bukova.isspst.data.Address; + +import java.util.List; + +public interface AddressFinder { + + public List
findAddress(Address condAddress); + +} diff --git a/src/main/java/info/bukova/isspst/services/addressbook/AddressFinderAres.java b/src/main/java/info/bukova/isspst/services/addressbook/AddressFinderAres.java new file mode 100644 index 00000000..cda7bd6f --- /dev/null +++ b/src/main/java/info/bukova/isspst/services/addressbook/AddressFinderAres.java @@ -0,0 +1,178 @@ +package info.bukova.isspst.services.addressbook; + +import info.bukova.isspst.data.Address; +import info.bukova.isspst.services.IsspstException; + +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.NameValuePair; +import org.apache.commons.httpclient.methods.GetMethod; +import org.exolab.castor.xml.MarshalException; +import org.exolab.castor.xml.Unmarshaller; +import org.exolab.castor.xml.ValidationException; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; + +public class AddressFinderAres implements AddressFinder { + + private Map conditions; + private String aresUrl; + private Unmarshaller unmarsheller; + + private NameValuePair[] buildQueryString() { + List resList = new ArrayList(); + + for (String key : conditions.keySet()) { + resList.add(new NameValuePair(key, conditions.get(key))); + } + + return resList.toArray(new NameValuePair[resList.size()]); + } + + private InputStream getAresResponse() throws HttpException, IOException, IsspstException { + GetMethod httpGet = new GetMethod(aresUrl); + HttpClient httpCli = new HttpClient(); + + httpGet.setQueryString(buildQueryString()); + int res = httpCli.executeMethod(httpGet); + + if (res != 200) { + throw new IsspstException("Server returned error code " + String.valueOf(res)); + } + + return httpGet.getResponseBodyAsStream(); + } + + private StringReader transformOut(InputStream inXml) throws IsspstException { + TransformerFactory tf = TransformerFactory.newInstance(); + + Resource resource = new ClassPathResource("info/bukova/isspst/services/addressbook/ares.xsl"); + + Transformer transformer; + StringWriter sWriter = null; + InputStream is = null; + try { + sWriter = new StringWriter(); + is = resource.getInputStream(); + StreamSource src = new StreamSource(is); + transformer = tf.newTransformer(src); + is.close(); + + StreamSource source = new StreamSource(inXml); + StreamResult result = new StreamResult(sWriter); + transformer.transform(source, result); + sWriter.flush(); + sWriter.close(); + + return new StringReader(sWriter.getBuffer().toString()); + } catch (TransformerException e) { + throw new IsspstException("ARES transformation error", e.getCause()); + } catch (IOException e) { + throw new IsspstException("Transformation file \"ares.xsl\" not found.", e.getCause()); + } finally { + try { + if (sWriter != null) { + sWriter.flush(); + sWriter.close(); + } + } catch (IOException e) { + throw new IsspstException("Cannot close stream", e.getCause()); + } + try { + if (is != null) { + is.close(); + } + } catch (IOException e) { + throw new IsspstException("Cannot close stream", e.getCause()); + } + } + } + + private List
convertToAddrList(AresOdpoved odpoved) { + List
resList = new ArrayList
(); + + if (odpoved == null || odpoved.getPocetZaznamu() <= 0) + return resList; + + for (AresZaznam zaznam : odpoved.getAresZaznam()) { + Address addr = new Address(); + addr.setCompany(zaznam.getFirma()); + addr.setIc(zaznam.getIco()); + addr.setStreet(zaznam.getUlice()); + addr.setHouseNumber(zaznam.getCp()); + addr.setCity(zaznam.getObec()); + addr.setZipCode(zaznam.getPsc()); + resList.add(addr); + } + return resList; + } + + private void setConditionAddr(Address condAddress) { + if (conditions == null) + conditions = new HashMap(); + else + conditions.clear(); + + if (condAddress.getCompany() != null && !condAddress.getCompany().isEmpty()) + conditions.put("obchodni_firma", condAddress.getCompany()); + if (condAddress.getIc() != 0) + conditions.put("ico", String.valueOf(condAddress.getIc())); + if (condAddress.getCity() != null && !condAddress.getCity().isEmpty()) + conditions.put("nazev_obce", condAddress.getCity()); + conditions.put("max_pocet", "200"); + conditions.put("czk", "utf"); + } + + @Override + public synchronized List
findAddress(Address condAddress) throws IsspstException { + setConditionAddr(condAddress); + AresOdpoved odpoved; + InputStream is = null; + try { + is = getAresResponse(); + odpoved = (AresOdpoved) unmarsheller.unmarshal(transformOut(is)); + is.close(); + return convertToAddrList(odpoved); + } catch (MarshalException e) { + throw new IsspstException("Can't create ARES answer object", e.getCause()); + } catch (ValidationException e) { + throw new IsspstException("ARES answer is not valid", e.getCause()); + } catch (HttpException e) { + throw new IsspstException("Error while comunication with ARES server", e.getCause()); + } catch (IOException e) { + throw new IsspstException("ARES find error", e.getCause()); + } finally { + try { + if (is != null) + is.close(); + } catch (IOException e) { + throw new IsspstException("Cannot close stream", e.getCause()); + } + } + + } + + public void setAresUrl(String aresUrl) { + this.aresUrl = aresUrl; + } + + public void setUnmarsheller(Unmarshaller unmarsheller) { + this.unmarsheller = unmarsheller; + } + +} diff --git a/src/main/java/info/bukova/isspst/services/addressbook/AddressFinderTaxID.java b/src/main/java/info/bukova/isspst/services/addressbook/AddressFinderTaxID.java new file mode 100644 index 00000000..0b9bbc08 --- /dev/null +++ b/src/main/java/info/bukova/isspst/services/addressbook/AddressFinderTaxID.java @@ -0,0 +1,137 @@ +package info.bukova.isspst.services.addressbook; + +import info.bukova.isspst.data.Address; +import info.bukova.isspst.services.IsspstException; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.methods.GetMethod; +import org.springframework.util.xml.SimpleNamespaceContext; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +public class AddressFinderTaxID implements AddressFinder { + + private String aresDicUrl; + private Address resAddr; + + @Override + public synchronized List
findAddress(Address condAddress) throws IsspstException { + ArrayList
resList = new ArrayList
(); + resAddr = new Address(); + resAddr.setIc(condAddress.getIc()); + InputStream is = null; + try { + is = getAresResponse(condAddress); + parseDic(is); + is.close(); + } catch (HttpException e) { + throw new IsspstException(); + } catch (IOException e) { + throw new IsspstException(); + } finally { + try { + is.close(); + } catch (IOException e) { + throw new IsspstException("Cannot close stream", e.getCause()); + } + } + resList.add(resAddr); + return resList; + } + + private InputStream getAresResponse(Address condAddress) throws IsspstException, HttpException, IOException { + GetMethod httpGet = new GetMethod(aresDicUrl); + HttpClient httpCli = new HttpClient(); + + httpGet.setQueryString("ico=" + String.valueOf(condAddress.getIc())); + int res = httpCli.executeMethod(httpGet); + + if (res != 200) { + throw new IsspstException("Server returned error code " + String.valueOf(res)); + } + + return httpGet.getResponseBodyAsStream(); + } + + private void parseDic(InputStream is) throws IsspstException { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setNamespaceAware(true); + try { + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + Document doc = docBuilder.parse(is); + + Map xmlNs = new HashMap(); + xmlNs.put("are", "http://wwwinfo.mfcr.cz/ares/xml_doc/schemas/ares/ares_answer_basic/v_1.0.3"); + xmlNs.put("D", "http://wwwinfo.mfcr.cz/ares/xml_doc/schemas/ares/ares_datatypes/v_1.0.3"); + xmlNs.put("U", "http://wwwinfo.mfcr.cz/ares/xml_doc/schemas/uvis_datatypes/v_1.0.3"); + SimpleNamespaceContext nsCtx = new SimpleNamespaceContext(); + nsCtx.setBindings(xmlNs); + + XPathFactory factory = XPathFactory.newInstance(); + XPath xpath = factory.newXPath(); + xpath.setNamespaceContext(nsCtx); + XPathExpression exp = xpath.compile("/are:Ares_odpovedi/are:Odpoved/D:VBAS/D:DIC"); + String dic = (String) exp.evaluate(doc, XPathConstants.STRING); + exp = xpath.compile("/are:Ares_odpovedi/are:Odpoved/D:VBAS/D:OF"); + String company = (String) exp.evaluate(doc, XPathConstants.STRING); + exp = xpath.compile("/are:Ares_odpovedi/are:Odpoved/D:VBAS/D:AA/D:NU"); + String street = (String) exp.evaluate(doc, XPathConstants.STRING); + exp = xpath.compile("/are:Ares_odpovedi/are:Odpoved/D:VBAS/D:AA/D:CD"); + String num = (String) exp.evaluate(doc, XPathConstants.STRING); + exp = xpath.compile("/are:Ares_odpovedi/are:Odpoved/D:VBAS/D:AA/D:CO"); + String numOr = (String) exp.evaluate(doc, XPathConstants.STRING); + exp = xpath.compile("/are:Ares_odpovedi/are:Odpoved/D:VBAS/D:AA/D:N"); + String city = (String) exp.evaluate(doc, XPathConstants.STRING); + exp = xpath.compile("/are:Ares_odpovedi/are:Odpoved/D:VBAS/D:AA/D:PSC"); + String zip = (String) exp.evaluate(doc, XPathConstants.STRING); + exp = xpath.compile("/are:Ares_odpovedi/are:Odpoved/D:VBAS/D:AA/D:NS"); + String state = (String) exp.evaluate(doc, XPathConstants.STRING); + + resAddr.setDic(dic); + resAddr.setCompany(company); + resAddr.setStreet(street); + if (numOr != null && !numOr.isEmpty()) + num = num + "/" + numOr; + resAddr.setHouseNumber(num); + resAddr.setCity(city); + resAddr.setZipCode(zip); + resAddr.setState(state); + + } catch (ParserConfigurationException e) { + throw new IsspstException("ARES: parese error while finding Tax ID", e.getCause()); + } catch (SAXException e) { + throw new IsspstException("ARES: SAX error while finding Tax ID", e.getCause()); + } catch (IOException e) { + throw new IsspstException("ARES: IO error while finding Tax ID", e.getCause()); + } catch (XPathExpressionException e) { + throw new IsspstException("ARES: xpath compile error", e.getCause()); + } + + } + + public String getAresDicUrl() { + return aresDicUrl; + } + + public void setAresDicUrl(String aresDicUrl) { + this.aresDicUrl = aresDicUrl; + } + +} diff --git a/src/main/java/info/bukova/isspst/services/addressbook/AresOdpoved.java b/src/main/java/info/bukova/isspst/services/addressbook/AresOdpoved.java new file mode 100644 index 00000000..53027819 --- /dev/null +++ b/src/main/java/info/bukova/isspst/services/addressbook/AresOdpoved.java @@ -0,0 +1,30 @@ +package info.bukova.isspst.services.addressbook; + +import java.util.List; + +public class AresOdpoved { + + private long pocetZaznamu; + private String typVyhledani; + private List aresZaznam; + + public long getPocetZaznamu() { + return pocetZaznamu; + } + public void setPocetZaznamu(long pocetZaznamu) { + this.pocetZaznamu = pocetZaznamu; + } + public String getTypVyhledani() { + return typVyhledani; + } + public void setTypVyhledani(String typVyhledani) { + this.typVyhledani = typVyhledani; + } + public List getAresZaznam() { + return aresZaznam; + } + public void setAresZaznam(List aresZaznam) { + this.aresZaznam = aresZaznam; + } + +} diff --git a/src/main/java/info/bukova/isspst/services/addressbook/AresZaznam.java b/src/main/java/info/bukova/isspst/services/addressbook/AresZaznam.java new file mode 100644 index 00000000..12e697b8 --- /dev/null +++ b/src/main/java/info/bukova/isspst/services/addressbook/AresZaznam.java @@ -0,0 +1,56 @@ +package info.bukova.isspst.services.addressbook; + +public class AresZaznam { + + private String firma; + private long ico; + private String obec; + private String mestskaCast; + private String ulice; + private String cp; + private String psc; + + public String getFirma() { + return firma; + } + public void setFirma(String firma) { + this.firma = firma; + } + public long getIco() { + return ico; + } + public void setIco(long ico) { + this.ico = ico; + } + public String getObec() { + return obec; + } + public void setObec(String obec) { + this.obec = obec; + } + public String getMestskaCast() { + return mestskaCast; + } + public void setMestskaCast(String mestskaCast) { + this.mestskaCast = mestskaCast; + } + public String getUlice() { + return ulice; + } + public void setUlice(String ulice) { + this.ulice = ulice; + } + public String getCp() { + return cp; + } + public void setCp(String cp) { + this.cp = cp; + } + public String getPsc() { + return psc; + } + public void setPsc(String psc) { + this.psc = psc; + } + +} diff --git a/src/main/java/info/bukova/isspst/services/addressbook/ares.xsl b/src/main/java/info/bukova/isspst/services/addressbook/ares.xsl new file mode 100644 index 00000000..c77d0d9a --- /dev/null +++ b/src/main/java/info/bukova/isspst/services/addressbook/ares.xsl @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + / + + + + + + + + + + diff --git a/src/main/java/info/bukova/isspst/services/addressbook/mappingAres.xml b/src/main/java/info/bukova/isspst/services/addressbook/mappingAres.xml new file mode 100644 index 00000000..0bd50b69 --- /dev/null +++ b/src/main/java/info/bukova/isspst/services/addressbook/mappingAres.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/info/bukova/isspst/services/RoleService.java b/src/main/java/info/bukova/isspst/services/users/RoleService.java similarity index 62% rename from src/main/java/info/bukova/isspst/services/RoleService.java rename to src/main/java/info/bukova/isspst/services/users/RoleService.java index f85e27ca..e20ca4f2 100644 --- a/src/main/java/info/bukova/isspst/services/RoleService.java +++ b/src/main/java/info/bukova/isspst/services/users/RoleService.java @@ -1,6 +1,7 @@ -package info.bukova.isspst.services; +package info.bukova.isspst.services.users; import info.bukova.isspst.data.Role; +import info.bukova.isspst.services.Service; public interface RoleService extends Service { diff --git a/src/main/java/info/bukova/isspst/services/RoleServiceImpl.java b/src/main/java/info/bukova/isspst/services/users/RoleServiceImpl.java similarity index 78% rename from src/main/java/info/bukova/isspst/services/RoleServiceImpl.java rename to src/main/java/info/bukova/isspst/services/users/RoleServiceImpl.java index 0fd81feb..b538fe79 100644 --- a/src/main/java/info/bukova/isspst/services/RoleServiceImpl.java +++ b/src/main/java/info/bukova/isspst/services/users/RoleServiceImpl.java @@ -1,8 +1,9 @@ -package info.bukova.isspst.services; +package info.bukova.isspst.services.users; import org.springframework.transaction.annotation.Transactional; import info.bukova.isspst.data.Role; +import info.bukova.isspst.services.AbstractService; public class RoleServiceImpl extends AbstractService implements RoleService { diff --git a/src/main/java/info/bukova/isspst/services/users/UserService.java b/src/main/java/info/bukova/isspst/services/users/UserService.java new file mode 100644 index 00000000..466ea95e --- /dev/null +++ b/src/main/java/info/bukova/isspst/services/users/UserService.java @@ -0,0 +1,14 @@ +package info.bukova.isspst.services.users; + +import org.springframework.security.core.userdetails.UserDetailsService; + +import info.bukova.isspst.data.User; +import info.bukova.isspst.services.Service; + +public interface UserService extends UserDetailsService, Service { + + public void setPassword(User user, String password); + public boolean hasRole(User user, String authority); + public void saveWithPwd(User user, String password); + +} diff --git a/src/main/java/info/bukova/isspst/services/UserServiceImpl.java b/src/main/java/info/bukova/isspst/services/users/UserServiceImpl.java similarity index 79% rename from src/main/java/info/bukova/isspst/services/UserServiceImpl.java rename to src/main/java/info/bukova/isspst/services/users/UserServiceImpl.java index af5a3c75..f2f1531c 100644 --- a/src/main/java/info/bukova/isspst/services/UserServiceImpl.java +++ b/src/main/java/info/bukova/isspst/services/users/UserServiceImpl.java @@ -1,18 +1,16 @@ -package info.bukova.isspst.services; +package info.bukova.isspst.services.users; import org.hibernate.Query; -import org.springframework.security.access.annotation.Secured; import org.springframework.security.authentication.encoding.PasswordEncoder; import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.transaction.annotation.Transactional; -import info.bukova.isspst.Constants; import info.bukova.isspst.data.Role; import info.bukova.isspst.data.User; +import info.bukova.isspst.services.AbstractService; -public class UserServiceImpl extends AbstractService implements UserService, UserDetailsService { +public class UserServiceImpl extends AbstractService implements UserService { private PasswordEncoder encoder; @@ -51,9 +49,10 @@ public class UserServiceImpl extends AbstractService implements UserServic } @Override - @Secured(Constants.ROLE_ADMIN) - public void test() { - System.out.println("pokus secured"); + @Transactional + public void saveWithPwd(User user, String password) { + this.setPassword(user, password); + this.update(user); } diff --git a/src/main/java/info/bukova/isspst/ui/FormViewModel.java b/src/main/java/info/bukova/isspst/ui/FormViewModel.java index 48e01e56..a3460c35 100644 --- a/src/main/java/info/bukova/isspst/ui/FormViewModel.java +++ b/src/main/java/info/bukova/isspst/ui/FormViewModel.java @@ -1,6 +1,6 @@ package info.bukova.isspst.ui; -import info.bukova.isspst.dao.IntegrityException; +import info.bukova.isspst.data.DataModel; import info.bukova.isspst.services.Service; import info.bukova.isspst.services.ValidationException; @@ -14,7 +14,7 @@ import org.zkoss.bind.annotation.NotifyChange; import org.zkoss.zul.Messagebox; import org.zkoss.zul.Window; -public class FormViewModel { +public class FormViewModel { private T dataBean; private Map errMessages; @@ -34,7 +34,7 @@ public class FormViewModel { @NotifyChange("errMessages") public void save(@BindingParam("window") Window win) { try { - service.update(dataBean); + doSave(); win.detach(); } catch (ValidationException e) { errMessages = e.getMessages(); @@ -44,9 +44,11 @@ public class FormViewModel { classErr = ""; } - Messagebox.show("Chyba validace", "Error", Messagebox.OK, Messagebox.ERROR); - } catch (IntegrityException e) { + Messagebox.show("Chyba validace", "Chyba", Messagebox.OK, Messagebox.ERROR); + } catch (Exception e) { + dataBean.setCreated(null); e.printStackTrace(); + Messagebox.show("Chyba při ukládání záznamu", "Chyba", Messagebox.OK, Messagebox.ERROR); } } @@ -57,5 +59,13 @@ public class FormViewModel { protected void setErrMesages(Map msgs) { this.errMessages = msgs; } + + protected void doSave() { + service.update(dataBean); + } + + public boolean isCanSave() { + return true; + } } diff --git a/src/main/java/info/bukova/isspst/ui/ListViewModel.java b/src/main/java/info/bukova/isspst/ui/ListViewModel.java index bdc32a95..12e948d2 100644 --- a/src/main/java/info/bukova/isspst/ui/ListViewModel.java +++ b/src/main/java/info/bukova/isspst/ui/ListViewModel.java @@ -1,6 +1,5 @@ package info.bukova.isspst.ui; -import info.bukova.isspst.dao.IntegrityException; import info.bukova.isspst.data.DataModel; import info.bukova.isspst.filters.Filter; import info.bukova.isspst.services.Service; @@ -10,11 +9,15 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.springframework.dao.DataIntegrityViolationException; +import org.zkoss.bind.BindUtils; import org.zkoss.bind.annotation.BindingParam; import org.zkoss.bind.annotation.Command; import org.zkoss.bind.annotation.GlobalCommand; import org.zkoss.bind.annotation.NotifyChange; import org.zkoss.zk.ui.Executions; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zul.Messagebox; import org.zkoss.zul.Window; @@ -24,8 +27,7 @@ public class ListViewModel { private boolean filter = false; private Window editWin; private T dataBean; - //private T filterTemplate; - private Filter dataFilter; + private T filterTemplate; private T editBean; private List dataList; private List fullList; @@ -39,6 +41,7 @@ public class ListViewModel { protected Service service; protected Class dataClass; protected String formZul; + protected Filter dataFilter; public List getDataList() { if (dataList == null) { @@ -57,6 +60,20 @@ public class ListViewModel { this.dataFilter = dataFilter; } + public T getFilterTemplate() { + if (filterTemplate == null) { + try { + filterTemplate = dataClass.newInstance(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + return filterTemplate; + } + public T getDataBean() { return dataBean; } @@ -125,6 +142,7 @@ public class ListViewModel { @Command public void edit() { int index = dataList.indexOf(dataBean); + newRec = false; if (index != -1) { selIndex = index; } @@ -141,20 +159,46 @@ public class ListViewModel { @Command @NotifyChange({"dataList", "dataBean"}) public void delete() { + Messagebox.show("Opravdu smazat?", "Smazat záznam", Messagebox.YES|Messagebox.NO, + Messagebox.QUESTION, new EventListener() { + + @Override + public void onEvent(Event evt) throws Exception { + if (((Integer)evt.getData()).intValue() == Messagebox.YES) { + try { + service.delete(dataBean); + dataList.remove(dataBean); + dataBean = null; + BindUtils.postNotifyChange(null, null, ListViewModel.this, "dataList"); + BindUtils.postNotifyChange(null, null, ListViewModel.this, "dataBean"); + } catch (DataIntegrityViolationException e) { + Messagebox.show("Chyba při mazání záznamu", "Chyba", Messagebox.OK, Messagebox.ERROR); + } + } + } + }); + + confirmDelete = false; + } + + @NotifyChange({"dataList", "dataBean"}) + private void onDelete() { try { service.delete(dataBean); dataList.remove(dataBean); dataBean = null; - } catch (IntegrityException e) { - Messagebox.show("Error while deleting object", "Error", Messagebox.OK, Messagebox.ERROR); + } catch (DataIntegrityViolationException e) { + Messagebox.show("Chyba při mazání záznamu", "Chyba", Messagebox.OK, Messagebox.ERROR); } - confirmDelete = false; } @GlobalCommand @NotifyChange({"dataList", "dataBean"}) public void refresh() { - if (editBean != null && !editBean.isValid()) { + /*if (editBean != null && !editBean.isValid()) { + return; + }*/ + if (editBean.getCreated() == null) { return; } if (!filter && newRec) { @@ -220,28 +264,29 @@ public class ListViewModel { } } - private void loadFromDb() { - Thread fillThread = new Thread(new Runnable() { - - @Override - public void run() { - tmpList = service.getAll(); - - try { - Thread.sleep(200); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - fullFill = true; - } - }); - - fillThread.start(); - } +// private void loadFromDb() { +// Thread fillThread = new Thread(new Runnable() { +// +// @Override +// public void run() { +// tmpList = service.getAll(); +// +// try { +// Thread.sleep(200); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// +// fullFill = true; +// } +// }); +// +// fillThread.start(); +// } private void loadFromDbSync() { dataList.addAll(service.getAll()); + fullList = dataList; } protected void showForm() { diff --git a/src/main/java/info/bukova/isspst/ui/Mapa.java b/src/main/java/info/bukova/isspst/ui/Mapa.java new file mode 100644 index 00000000..3002afd1 --- /dev/null +++ b/src/main/java/info/bukova/isspst/ui/Mapa.java @@ -0,0 +1,37 @@ +package info.bukova.isspst.ui; + +import org.zkoss.zk.ui.HtmlBasedComponent; + +public class Mapa extends HtmlBasedComponent { + + private static final long serialVersionUID = 6856577544897548586L; + + private String address = ""; + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + if (this.address != null && this.address.equals(address)) + return; + + this.address = address; + this.smartUpdate("address", this.address); + } + + public void setValue(String val) { + setAddress(val); + } + + public String getValue() { + return address; + } + + protected void renderProperties(org.zkoss.zk.ui.sys.ContentRenderer renderer) + throws java.io.IOException { + super.renderProperties(renderer); + render(renderer, "address", this.address); + } + +} diff --git a/src/main/java/info/bukova/isspst/ui/UserForm.java b/src/main/java/info/bukova/isspst/ui/UserForm.java deleted file mode 100644 index 07116ed4..00000000 --- a/src/main/java/info/bukova/isspst/ui/UserForm.java +++ /dev/null @@ -1,14 +0,0 @@ -package info.bukova.isspst.ui; - -import org.zkoss.bind.annotation.Init; - -import info.bukova.isspst.data.User; - -public class UserForm extends FormViewModel { - - @Init(superclass = true) - public void init() { - - } - -} diff --git a/src/main/java/info/bukova/isspst/ui/addressbook/AddressFindResult.java b/src/main/java/info/bukova/isspst/ui/addressbook/AddressFindResult.java new file mode 100644 index 00000000..a9c79058 --- /dev/null +++ b/src/main/java/info/bukova/isspst/ui/addressbook/AddressFindResult.java @@ -0,0 +1,38 @@ +package info.bukova.isspst.ui.addressbook; + +import info.bukova.isspst.data.Address; + +import java.util.List; + +import org.zkoss.bind.annotation.ExecutionArgParam; +import org.zkoss.bind.annotation.Init; +import org.zkoss.bind.annotation.NotifyChange; + +public class AddressFindResult { + + private List
listResult; + private Address selectedAddr; + + @Init + public void init(@ExecutionArgParam("result") List
result) { + listResult = result; + } + + public List
getListResult() { + return listResult; + } + + public Address getSelectedAddr() { + return selectedAddr; + } + + @NotifyChange("selected") + public void setSelectedAddr(Address selectedAddr) { + this.selectedAddr = selectedAddr; + } + + public boolean getSelected() { + return selectedAddr == null; + } + +} diff --git a/src/main/java/info/bukova/isspst/ui/addressbook/AddressForm.java b/src/main/java/info/bukova/isspst/ui/addressbook/AddressForm.java new file mode 100644 index 00000000..e3cdb3e7 --- /dev/null +++ b/src/main/java/info/bukova/isspst/ui/addressbook/AddressForm.java @@ -0,0 +1,77 @@ +package info.bukova.isspst.ui.addressbook; + +import info.bukova.isspst.data.Address; +import info.bukova.isspst.services.IsspstException; +import info.bukova.isspst.services.addressbook.AdbService; +import info.bukova.isspst.services.addressbook.AddressFinder; +import info.bukova.isspst.ui.FormViewModel; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.zkoss.bind.annotation.BindingParam; +import org.zkoss.bind.annotation.Command; +import org.zkoss.bind.annotation.GlobalCommand; +import org.zkoss.bind.annotation.Init; +import org.zkoss.bind.annotation.NotifyChange; +import org.zkoss.zk.ui.Executions; +import org.zkoss.zk.ui.select.annotation.WireVariable; +import org.zkoss.zul.Messagebox; +import org.zkoss.zul.Window; + +public class AddressForm extends FormViewModel
{ + + @WireVariable + private AdbService adbService; + @WireVariable + private AddressFinder addressFinderAres; + @WireVariable + private AddressFinder addressFinderTaxID; + + @Init(superclass = true) + public void init() { + + } + + @Command + @NotifyChange("dataBean") + public void searchAres() { + if (getDataBean().getIc() != 0) { + try { + adbService.fillFoundData(addressFinderTaxID, getDataBean()); + } catch (IsspstException e) { + e.printStackTrace(); + } + return; + } + + Map> arg = new HashMap>(); + try { + arg.put("result", adbService.lookForAddr(addressFinderAres, getDataBean())); + } catch (IsspstException e) { + e.printStackTrace(); + Messagebox.show("Chyba při hledání adresy", "Chyba", Messagebox.OK, Messagebox.ERROR); + return; + } + Window resWin = (Window) Executions.createComponents("addrFindResult.zul", null, arg); + resWin.doModal(); + + } + + @GlobalCommand("selectAddress") + @NotifyChange("dataBean") + public void selectAddress(@BindingParam("selected") Address selected, @BindingParam("window") Window window) { + try { + adbService.fillFoundData(addressFinderTaxID, selected); + } catch (IsspstException e) { + e.printStackTrace(); + } + + adbService.mergeAddress(getDataBean(), selected, true); + + if (window != null) + window.detach(); + } + +} diff --git a/src/main/java/info/bukova/isspst/ui/addressbook/AddressList.java b/src/main/java/info/bukova/isspst/ui/addressbook/AddressList.java new file mode 100644 index 00000000..a314fea6 --- /dev/null +++ b/src/main/java/info/bukova/isspst/ui/addressbook/AddressList.java @@ -0,0 +1,25 @@ +package info.bukova.isspst.ui.addressbook; + +import info.bukova.isspst.data.Address; +import info.bukova.isspst.filters.AddressFilter; +import info.bukova.isspst.services.addressbook.AdbService; +import info.bukova.isspst.ui.ListViewModel; + +import org.zkoss.bind.annotation.Init; +import org.zkoss.zk.ui.select.annotation.WireVariable; + +public class AddressList extends ListViewModel
{ + + @WireVariable + private AdbService adbService; + + @Init + public void init() { + service = adbService; + dataClass = Address.class; + formZul = "address.zul"; + dataFilter = new AddressFilter(getFilterTemplate()); + + } + +} diff --git a/src/main/java/info/bukova/isspst/ui/users/RoleCheck.java b/src/main/java/info/bukova/isspst/ui/users/RoleCheck.java new file mode 100644 index 00000000..a564be95 --- /dev/null +++ b/src/main/java/info/bukova/isspst/ui/users/RoleCheck.java @@ -0,0 +1,43 @@ +package info.bukova.isspst.ui.users; + +import info.bukova.isspst.data.Role; +import info.bukova.isspst.data.User; + +public class RoleCheck { + + private Role role; + private User user; + private boolean checked; + + public RoleCheck(User user, Role role) { + this.user = user; + this.role = role; + if (user.getAuthorities().contains(role)) { + checked = true; + } else { + checked = false; + } + } + + public Role getRole() { + return role; + } + + public void setRole(Role role) { + this.role = role; + } + + public boolean isChecked() { + return checked; + } + + public void setChecked(boolean checked) { + this.checked = checked; + if (checked && !user.getAuthorities().contains(role)) { + user.addAuthority(role); + } else { + user.getAuthorities().remove(role); + } + } + +} diff --git a/src/main/java/info/bukova/isspst/ui/users/UserForm.java b/src/main/java/info/bukova/isspst/ui/users/UserForm.java new file mode 100644 index 00000000..2ebdb55c --- /dev/null +++ b/src/main/java/info/bukova/isspst/ui/users/UserForm.java @@ -0,0 +1,90 @@ +package info.bukova.isspst.ui.users; + +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.zkoss.bind.annotation.Command; +import org.zkoss.bind.annotation.Init; +import org.zkoss.bind.annotation.NotifyChange; +import org.zkoss.zk.ui.select.annotation.WireVariable; + +import info.bukova.isspst.data.User; +import info.bukova.isspst.services.users.RoleService; +import info.bukova.isspst.services.users.UserService; +import info.bukova.isspst.ui.FormViewModel; + +public class UserForm extends FormViewModel { + + @WireVariable + private RoleService roleService; + @WireVariable + private UserService userService; + private String retPasswd = ""; + private String password = ""; + private UserRoles userRoles; + private boolean loginFree; + + @Init(superclass = true) + public void init() { + userRoles = new UserRoles(getDataBean(), roleService.getAll()); + loginFree = true; + } + + public UserRoles getUserRoles() { + return userRoles; + } + + public String getRetPasswd() { + return retPasswd; + } + + @NotifyChange({"canSave", "pwMatches"}) + public void setRetPasswd(String retPasswd) { + this.retPasswd = retPasswd; + } + + public String getPassword() { + return password; + } + + @NotifyChange({"canSave", "pwMatches"}) + public void setPassword(String password) { + this.password = password; + } + + @Command + @NotifyChange({"loginFree", "canSave"}) + public void checkLogin() { + try { + userService.loadUserByUsername(getDataBean().getUsername()); + loginFree = false; + } catch(UsernameNotFoundException e) { + loginFree = true; + } + } + + public boolean isPwMatches() { + return password.equals(retPasswd); + } + + public boolean isLoginFree() { + return loginFree || isEdit(); + } + + public boolean isEdit() { + return getDataBean().getCreated() != null; + } + + @Override + protected void doSave() { + if (!password.isEmpty()) { + userService.saveWithPwd(getDataBean(), this.password); + } else { + super.doSave(); + } + } + + @Override + public boolean isCanSave() { + return password.equals(retPasswd) && isLoginFree() && getDataBean().getUsername() != null && !getDataBean().getUsername().isEmpty(); + } + +} diff --git a/src/main/java/info/bukova/isspst/ui/users/UserRoles.java b/src/main/java/info/bukova/isspst/ui/users/UserRoles.java new file mode 100644 index 00000000..7ff5fbe9 --- /dev/null +++ b/src/main/java/info/bukova/isspst/ui/users/UserRoles.java @@ -0,0 +1,24 @@ +package info.bukova.isspst.ui.users; + +import info.bukova.isspst.data.Role; +import info.bukova.isspst.data.User; + +import java.util.ArrayList; +import java.util.List; + +public class UserRoles { + + private List roleChecks; + + public UserRoles(User user, List roles) { + roleChecks = new ArrayList(); + for (Role r : roles) { + roleChecks.add(new RoleCheck(user, r)); + } + } + + public List getRoleChecks() { + return roleChecks; + } + +} diff --git a/src/main/java/info/bukova/isspst/ui/UsersList.java b/src/main/java/info/bukova/isspst/ui/users/UsersList.java similarity index 60% rename from src/main/java/info/bukova/isspst/ui/UsersList.java rename to src/main/java/info/bukova/isspst/ui/users/UsersList.java index c5ca0c0f..047f22ff 100644 --- a/src/main/java/info/bukova/isspst/ui/UsersList.java +++ b/src/main/java/info/bukova/isspst/ui/users/UsersList.java @@ -1,10 +1,12 @@ -package info.bukova.isspst.ui; +package info.bukova.isspst.ui.users; import org.zkoss.bind.annotation.Init; import org.zkoss.zk.ui.select.annotation.WireVariable; import info.bukova.isspst.data.User; -import info.bukova.isspst.services.UserService; +import info.bukova.isspst.filters.UserFilter; +import info.bukova.isspst.services.users.UserService; +import info.bukova.isspst.ui.ListViewModel; public class UsersList extends ListViewModel { @@ -16,6 +18,7 @@ public class UsersList extends ListViewModel { service = userService; dataClass = User.class; formZul = "userForm.zul"; + dataFilter = new UserFilter(getFilterTemplate()); } } diff --git a/src/main/java/web/js/info/bukova/isspst/ui/Mapa.js b/src/main/java/web/js/info/bukova/isspst/ui/Mapa.js new file mode 100644 index 00000000..ce95476f --- /dev/null +++ b/src/main/java/web/js/info/bukova/isspst/ui/Mapa.js @@ -0,0 +1,43 @@ +info.bukova.isspst.ui.Mapa = zk.$extends(zk.Widget, { + address : '', // default value + + getAddress : function() { + return this.address; + }, + + setAddress : function(value) { + if (this.address != value) { + this.address = value; + if (this.desktop) { + var myOptions = { + zoom: 12, + center: new google.maps.LatLng(-34.397, 150.644), + mapTypeId: google.maps.MapTypeId.ROADMAP + }; + + var map = new google.maps.Map(this.$n(), myOptions); + var geocoder = new google.maps.Geocoder(); + + var request = { + address: this.address + }; + geocoder.geocode(request, function(results, status) { + if (status == google.maps.GeocoderStatus.OK) { + var marker = new google.maps.Marker({ + map: map, + position: results[0].geometry.location + }); + map.panTo(marker.getPosition()); + } else { + window.console.log('failed to geocode address: ' + status); + } + }); + } + } + }, + + redraw: function (out) { + out.push('
', this.getAddress(), '
'); + } + +}); \ No newline at end of file diff --git a/src/main/java/web/js/info/bukova/isspst/ui/zk.wpd b/src/main/java/web/js/info/bukova/isspst/ui/zk.wpd new file mode 100644 index 00000000..dfa706ce --- /dev/null +++ b/src/main/java/web/js/info/bukova/isspst/ui/zk.wpd @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/main/resources/hibernate.cfg.xml b/src/main/resources/hibernate.cfg.xml index 848e7cb8..5aeb6836 100644 --- a/src/main/resources/hibernate.cfg.xml +++ b/src/main/resources/hibernate.cfg.xml @@ -7,6 +7,8 @@ + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/ckez-bind-lang-addon.xml b/src/main/webapp/WEB-INF/ckez-bind-lang-addon.xml new file mode 100644 index 00000000..44ea3165 --- /dev/null +++ b/src/main/webapp/WEB-INF/ckez-bind-lang-addon.xml @@ -0,0 +1,35 @@ + + + + ckezbind + + + xul/html + + + ckeditor + ckeditor + + ZKBIND + value + + ACCESS + both + + + SAVE_EVENT + onChange + + + LOAD_REPLACEMENT + value + + + LOAD_TYPE + java.lang.String + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jdbc.properties b/src/main/webapp/WEB-INF/jdbc.properties index 3483bc97..658408f0 100644 --- a/src/main/webapp/WEB-INF/jdbc.properties +++ b/src/main/webapp/WEB-INF/jdbc.properties @@ -1,5 +1,5 @@ jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.dialect=org.hibernate.dialect.MySQLDialect -jdbc.databaseurl=jdbc:mysql://127.0.0.1:3306/isspst +jdbc.databaseurl=jdbc:mysql://127.0.0.1:3306/isspst?characterEncoding=utf8 jdbc.username=root jdbc.password=xsacfgd \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/mapa-lang-addon.xml b/src/main/webapp/WEB-INF/mapa-lang-addon.xml new file mode 100644 index 00000000..dede21d7 --- /dev/null +++ b/src/main/webapp/WEB-INF/mapa-lang-addon.xml @@ -0,0 +1,11 @@ + + + mapa + xul/html + + + mapa + info.bukova.isspst.ui.Mapa + info.bukova.isspst.ui.Mapa + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/spring/root-context.xml b/src/main/webapp/WEB-INF/spring/root-context.xml index 2e95a6b7..c3a8e678 100644 --- a/src/main/webapp/WEB-INF/spring/root-context.xml +++ b/src/main/webapp/WEB-INF/spring/root-context.xml @@ -88,7 +88,13 @@ + + + + + + @@ -97,5 +103,31 @@ + + + + + + + + + + + + + + + + + + + info/bukova/isspst/services/addressbook/mappingAres.xml + + + + + + + diff --git a/src/main/webapp/WEB-INF/zk.xml b/src/main/webapp/WEB-INF/zk.xml new file mode 100644 index 00000000..3eec7dba --- /dev/null +++ b/src/main/webapp/WEB-INF/zk.xml @@ -0,0 +1,30 @@ + + + + + + + true + + + org.zkoss.web.classWebResource.cache + false + + + + /WEB-INF/mapa-lang-addon.xml + /WEB-INF/ckez-bind-lang-addon.xml + + + + diff --git a/src/main/webapp/admin/addressbook/addrFindResult.zul b/src/main/webapp/admin/addressbook/addrFindResult.zul new file mode 100644 index 00000000..e4c30525 --- /dev/null +++ b/src/main/webapp/admin/addressbook/addrFindResult.zul @@ -0,0 +1,30 @@ + + + + + +