Umožněna deaktivace modulu prostřednictvím nastavení objektu modulu ve

třídě Constants. Položku neaktivního modulu v menu lze skrýt funkcí
isActive definovanou v module.tld (viz mainMenu.zul).
Verze_2.0
Josef Rokos 10 years ago
parent b1818546c0
commit cf6c523698

@ -200,6 +200,9 @@ public class AppInitListener implements ServletContextListener {
private void checkPermissions() { private void checkPermissions() {
for (Module m : Constants.MODULES) { for (Module m : Constants.MODULES) {
if (!m.isDefaultPermissions()) {
continue;
}
for (Permission p : Constants.DEF_PERMISSIONS) { for (Permission p : Constants.DEF_PERMISSIONS) {
if (permService.getPermissionByModule(m.getId(), p.getAuthority()) == null) { if (permService.getPermissionByModule(m.getId(), p.getAuthority()) == null) {
p.setModule(m.getId()); p.setModule(m.getId());

@ -11,6 +11,8 @@ public class Module {
private String name; private String name;
private Class<?> serviceClass; private Class<?> serviceClass;
private List<Report> reports; private List<Report> reports;
private boolean defaultPermissions;
private boolean active;
public Class<?> getServiceClass() { public Class<?> getServiceClass() {
return serviceClass; return serviceClass;
@ -25,6 +27,18 @@ public class Module {
this.name = name; this.name = name;
this.serviceClass = serviceClass; this.serviceClass = serviceClass;
reports = new ArrayList<Report>(); reports = new ArrayList<Report>();
defaultPermissions = true;
active = true;
}
public Module(String id, String name, Class<?> serviceClass, boolean active) {
this(id, name, serviceClass);
this.active = active;
}
public Module(String id, String name, Class<?> serviceClass, boolean active, boolean defaultPermissions) {
this(id, name, serviceClass, active);
this.defaultPermissions = defaultPermissions;
} }
public String getId() { public String getId() {
@ -51,4 +65,20 @@ public class Module {
this.reports.add(report); this.reports.add(report);
} }
public boolean isDefaultPermissions() {
return defaultPermissions;
}
public void setDefaultPermissions(boolean defaultPermissions) {
this.defaultPermissions = defaultPermissions;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
} }

@ -0,0 +1,45 @@
package info.bukova.isspst;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ModuleUtils {
public static List<Module> getActiveModules() {
List<Module> modules = new ArrayList<Module>();
for (Module m : Arrays.asList(Constants.MODULES)) {
if (m.isActive()) {
modules.add(m);
}
}
return modules;
}
public static Module getModule(Class<?> serviceClass) {
for (Module m : Constants.MODULES) {
if (Arrays.asList(serviceClass.getInterfaces()).contains(m.getServiceClass())) {
return m;
}
}
return null;
}
public static Module getModule(String id) {
for (Module m : Constants.MODULES) {
if (m.getId().equals(id)) {
return m;
}
}
return null;
}
public static boolean isActive(String id) {
return getModule(id).isActive();
}
}

@ -1,8 +1,8 @@
package info.bukova.isspst.services; package info.bukova.isspst.services;
import static ch.lambdaj.Lambda.filter; import static ch.lambdaj.Lambda.filter;
import info.bukova.isspst.Constants;
import info.bukova.isspst.Module; import info.bukova.isspst.Module;
import info.bukova.isspst.ModuleUtils;
import info.bukova.isspst.SessionData; import info.bukova.isspst.SessionData;
import info.bukova.isspst.dao.BaseDao; import info.bukova.isspst.dao.BaseDao;
import info.bukova.isspst.dao.QueryDao; import info.bukova.isspst.dao.QueryDao;
@ -73,6 +73,10 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
throw new IsspstException("DAO is null"); throw new IsspstException("DAO is null");
} }
if (getModule() != null && !getModule().isActive()) {
throw new ModuleNotActiveException();
}
validate(entity); validate(entity);
entity.setCreated(new Date()); entity.setCreated(new Date());
dao.add(entity); dao.add(entity);
@ -86,6 +90,10 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
throw new IsspstException("DAO is null"); throw new IsspstException("DAO is null");
} }
if (getModule() != null && !getModule().isActive()) {
throw new ModuleNotActiveException();
}
validate(entity); validate(entity);
entity.setModified(new Date()); entity.setModified(new Date());
dao.modify(entity); dao.modify(entity);
@ -99,6 +107,10 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
throw new IsspstException("DAO is null"); throw new IsspstException("DAO is null");
} }
if (getModule() != null && !getModule().isActive()) {
throw new ModuleNotActiveException();
}
dao.delete(entity); dao.delete(entity);
} }
@ -137,6 +149,10 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
throw new IsspstException("DAO is null"); throw new IsspstException("DAO is null");
} }
if (getModule() != null && !getModule().isActive()) {
throw new ModuleNotActiveException();
}
return dao.getById(id); return dao.getById(id);
} }
@ -148,6 +164,10 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
throw new IsspstException("DAO is null"); throw new IsspstException("DAO is null");
} }
if (getModule() != null && !getModule().isActive()) {
throw new ModuleNotActiveException();
}
return dao.getAll(); return dao.getAll();
} }
@ -159,6 +179,10 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
throw new IsspstException("DAO is null"); throw new IsspstException("DAO is null");
} }
if (getModule() != null && !getModule().isActive()) {
throw new ModuleNotActiveException();
}
return dao.execQuery(query); return dao.execQuery(query);
} }
@ -171,6 +195,10 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
throw new IsspstException("DAO is null"); throw new IsspstException("DAO is null");
} }
if (getModule() != null && !getModule().isActive()) {
throw new ModuleNotActiveException();
}
try { try {
Query q = dao.getQuery(query); Query q = dao.getQuery(query);
return (T) q.uniqueResult(); return (T) q.uniqueResult();
@ -189,13 +217,7 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
@Override @Override
public Module getModule() { public Module getModule() {
for (Module m : Constants.MODULES) { return ModuleUtils.getModule(this.getClass());
if (Arrays.asList(this.getClass().getInterfaces()).contains(m.getServiceClass())) {
return m;
}
}
return null;
} }
public List<Report> getReports() { public List<Report> getReports() {

@ -0,0 +1,14 @@
package info.bukova.isspst.services;
public class ModuleNotActiveException extends IsspstException {
/**
*
*/
private static final long serialVersionUID = -1219763294556500698L;
public ModuleNotActiveException() {
super("Module deactivated");
}
}

@ -0,0 +1,42 @@
package info.bukova.isspst.ui;
import info.bukova.isspst.StringUtils;
import info.bukova.isspst.services.ModuleNotActiveException;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zkoss.bind.annotation.Init;
import org.zkoss.zk.ui.Executions;
public class ErrorVM {
private String message;
private final Logger logger = LoggerFactory.getLogger(ErrorVM.class);
@Init
public void init() {
HttpServletRequest request = (HttpServletRequest) Executions.getCurrent().getNativeRequest();
Throwable ex = (Throwable) request.getAttribute("javax.servlet.error.exception");
Throwable root = ex;
if (root != null) {
while (root.getCause() != null) {
root = root.getCause();
}
if (root instanceof ModuleNotActiveException) {
message = StringUtils.localize("ModuleNotActive");
} else {
logger.error("Unhandled exception", ex);
message = ex.toString();
}
}
}
public String getMessage() {
return message;
}
}

@ -1,5 +1,10 @@
package info.bukova.isspst.ui.settings; package info.bukova.isspst.ui.settings;
import info.bukova.isspst.Module;
import info.bukova.isspst.ModuleUtils;
import info.bukova.isspst.data.NumberSeries;
import info.bukova.isspst.services.numberseries.NumberSeriesService;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -11,11 +16,6 @@ import org.zkoss.bind.annotation.Init;
import org.zkoss.zk.ui.select.annotation.WireVariable; import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Window; import org.zkoss.zul.Window;
import info.bukova.isspst.Constants;
import info.bukova.isspst.Module;
import info.bukova.isspst.data.NumberSeries;
import info.bukova.isspst.services.numberseries.NumberSeriesService;
public class NumberSeriesVM { public class NumberSeriesVM {
@WireVariable @WireVariable
@ -27,7 +27,7 @@ public class NumberSeriesVM {
public void init() { public void init() {
numberSeriesList = new ArrayList<NumberSeries>(numericSeriesService.getAll()); numberSeriesList = new ArrayList<NumberSeries>(numericSeriesService.getAll());
moduleMap = new HashMap<String, Module>(); moduleMap = new HashMap<String, Module>();
for (Module m : Constants.MODULES) { for (Module m : ModuleUtils.getActiveModules()) {
moduleMap.put(m.getId(), m); moduleMap.put(m.getId(), m);
} }
} }

@ -1,7 +1,7 @@
package info.bukova.isspst.ui.users; package info.bukova.isspst.ui.users;
import info.bukova.isspst.Constants;
import info.bukova.isspst.Module; import info.bukova.isspst.Module;
import info.bukova.isspst.ModuleUtils;
import info.bukova.isspst.StringUtils; import info.bukova.isspst.StringUtils;
import info.bukova.isspst.data.Role; import info.bukova.isspst.data.Role;
import info.bukova.isspst.data.Workgroup; import info.bukova.isspst.data.Workgroup;
@ -10,7 +10,6 @@ import info.bukova.isspst.services.users.RoleService;
import info.bukova.isspst.ui.FormViewModel; import info.bukova.isspst.ui.FormViewModel;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import org.zkoss.bind.annotation.Init; import org.zkoss.bind.annotation.Init;
@ -47,7 +46,7 @@ public class PermissionForm extends FormViewModel<Role> {
} }
public List<Module> getModules() { public List<Module> getModules() {
return Arrays.asList(Constants.MODULES); return ModuleUtils.getActiveModules();
} }
public RolePermissions getRolePerms() { public RolePermissions getRolePerms() {

@ -1,17 +1,16 @@
package info.bukova.isspst.ui.users; package info.bukova.isspst.ui.users;
import java.util.Arrays;
import java.util.List;
import org.zkoss.bind.annotation.Init;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import info.bukova.isspst.Constants;
import info.bukova.isspst.Module; import info.bukova.isspst.Module;
import info.bukova.isspst.ModuleUtils;
import info.bukova.isspst.data.Role; import info.bukova.isspst.data.Role;
import info.bukova.isspst.services.users.RoleService; import info.bukova.isspst.services.users.RoleService;
import info.bukova.isspst.ui.ListViewModel; import info.bukova.isspst.ui.ListViewModel;
import java.util.List;
import org.zkoss.bind.annotation.Init;
import org.zkoss.zk.ui.select.annotation.WireVariable;
public class PermissionsList extends ListViewModel<Role> { public class PermissionsList extends ListViewModel<Role> {
@WireVariable @WireVariable
@ -25,7 +24,7 @@ public class PermissionsList extends ListViewModel<Role> {
} }
public List<Module> getModules() { public List<Module> getModules() {
return Arrays.asList(Constants.MODULES); return ModuleUtils.getActiveModules();
} }
} }

@ -1,16 +1,8 @@
package info.bukova.isspst.ui.users; package info.bukova.isspst.ui.users;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.zkoss.bind.annotation.GlobalCommand;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import info.bukova.isspst.Constants; import info.bukova.isspst.Constants;
import info.bukova.isspst.Module; import info.bukova.isspst.Module;
import info.bukova.isspst.ModuleUtils;
import info.bukova.isspst.data.Permission; import info.bukova.isspst.data.Permission;
import info.bukova.isspst.data.Role; import info.bukova.isspst.data.Role;
import info.bukova.isspst.data.User; import info.bukova.isspst.data.User;
@ -18,6 +10,14 @@ import info.bukova.isspst.filters.UserFilter;
import info.bukova.isspst.services.users.UserService; import info.bukova.isspst.services.users.UserService;
import info.bukova.isspst.ui.ListViewModel; import info.bukova.isspst.ui.ListViewModel;
import java.util.ArrayList;
import java.util.List;
import org.zkoss.bind.annotation.GlobalCommand;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.select.annotation.WireVariable;
public class UsersList extends ListViewModel<User> { public class UsersList extends ListViewModel<User> {
@WireVariable @WireVariable
@ -32,7 +32,7 @@ public class UsersList extends ListViewModel<User> {
} }
public List<Module> getModules() { public List<Module> getModules() {
return Arrays.asList(Constants.MODULES); return ModuleUtils.getActiveModules();
} }
@Override @Override

@ -356,3 +356,8 @@ WorkgroupFormCannotAddUser=Uživatele nelze přidat
WorkgroupFormCannotAddWorkgroup=Komisi nelze přidat WorkgroupFormCannotAddWorkgroup=Komisi nelze přidat
WorkgroupFormOrderLimit=Limit nákupů WorkgroupFormOrderLimit=Limit nákupů
WorkgroupIsInWorkgroup=Komisi nelze smazat, protože je členem některého střediska WorkgroupIsInWorkgroup=Komisi nelze smazat, protože je členem některého střediska
Help=Příručka
GoogleDriveUrl=Odkaz na Google Drive
ModuleNotActive=Modul není aktivovaný

@ -0,0 +1,17 @@
<!DOCTYPE xml>
<taglib>
<uri></uri>
<description>
Methods and actions for ZK + application modules
</description>
<function>
<name>isActive</name>
<function-class>info.bukova.isspst.ModuleUtils</function-class>
<function-signature> boolean isActive(java.lang.String id)
</function-signature>
<description>
Return true if module represented by id is active.
</description>
</function>
</taglib>

@ -186,6 +186,11 @@
<filter-name>springSecurityFilterChain</filter-name> <filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern> <url-pattern>/*</url-pattern>
</filter-mapping> </filter-mapping>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.zul</location>
</error-page>
<welcome-file-list> <welcome-file-list>
<welcome-file>index.zul</welcome-file> <welcome-file>index.zul</welcome-file>

@ -1,6 +1,7 @@
<?page title="Main Menu" contentType="text/html;charset=UTF-8"?> <?page title="Main Menu" contentType="text/html;charset=UTF-8"?>
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?> <?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
<?taglib uri="/WEB-INF/security.tld" prefix="sec"?> <?taglib uri="/WEB-INF/security.tld" prefix="sec"?>
<?taglib uri="/WEB-INF/module.tld" prefix="module"?>
<zk xmlns:n="native"> <zk xmlns:n="native">
<menubar <menubar
id="menubar" id="menubar"
@ -39,7 +40,8 @@
image="/img/invoicing-016.png" image="/img/invoicing-016.png"
label="${labels.Invoicing}" label="${labels.Invoicing}"
href="/main/invoicing/" href="/main/invoicing/"
disabled="${not sec:isAllGranted('PERM_READ_INVOICING')}" /> disabled="${not sec:isAllGranted('PERM_READ_INVOICING')}"
visible="${module:isActive('INVOICING') }" />
</menupopup> </menupopup>
</menu> </menu>
<menu label="${labels.BussinessTrips}"> <menu label="${labels.BussinessTrips}">

@ -0,0 +1,8 @@
<?page title="${labels.Error}" contentType="text/html;charset=UTF-8"?>
<zk>
<zscript>
String gridZul = "/errorWindow.zul";
</zscript>
<include src="/app/template.zhtml"/>
</zk>

@ -0,0 +1,12 @@
<?page title="${labels.Error}" contentType="text/html;charset=UTF-8"?>
<zk>
<window border="normal"
apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('info.bukova.isspst.ui.ErrorVM')"
vflex="1">
<caption zclass="form-caption" label="${labels.Error}" />
<label value="@load(vm.message)"/>
</window>
</zk>
Loading…
Cancel
Save