/sun/hostadmiral/trunk/src/ak/hostadmiral/core/action/UserAction.java |
---|
99,6 → 99,17 |
else |
return mapping.findForward("view"); |
} |
else if("deleting".equals(mapping.getParameter())) { |
DynaActionForm theForm = (DynaActionForm)form; |
Long userId = StringConverter.parseLong(theForm.get("id")); |
User u = UserManager.getInstance().get(user, userId); |
request.setAttribute("action", "/user/delete.do"); |
request.setAttribute("object", u); |
request.setAttribute("cascade", UserManager.getInstance().beforeDelete(user, u)); |
return mapping.findForward("default"); |
} |
else if("delete".equals(mapping.getParameter())) { |
DynaActionForm theForm = (DynaActionForm)form; |
Long userId = StringConverter.parseLong(theForm.get("id")); |
/sun/hostadmiral/trunk/src/ak/hostadmiral/core/model/UserManager.java |
---|
8,8 → 8,16 |
import ak.hostadmiral.util.ModelSecurityException; |
public class UserManager |
implements UserBeforeDeleteListener |
{ |
private static UserManager userManager = null; |
private static boolean registered = false; |
public static UserManager getInstance() |
{ |
return userManager; |
} |
protected static void register() |
{ |
synchronized(MailboxManager.class) { |
19,6 → 27,8 |
try { |
HibernateUtil.getConfiguration().addResource( |
"/ak/hostadmiral/core/model/User.hbm.xml"); |
userManager = new UserManager(); |
} |
catch(Exception ex) { |
ex.printStackTrace(); |
31,8 → 41,11 |
register(); |
} |
private Collection beforeDeleteListeners = new ArrayList(); |
private UserManager() |
{ |
addBeforeDeleteListener(this); |
} |
public User create(User editor) |
128,6 → 141,31 |
} |
} |
public void addBeforeDeleteListener(UserBeforeDeleteListener listener) |
{ |
beforeDeleteListeners.add(listener); |
} |
public void removeBeforeDeleteListener(UserBeforeDeleteListener listener) |
{ |
beforeDeleteListeners.remove(listener); |
} |
public Collection beforeDelete(User editor, User user) |
throws ModelException |
{ |
Collection cascade = new ArrayList(); |
for(Iterator i = beforeDeleteListeners.iterator(); i.hasNext(); ) { |
UserBeforeDeleteListener listener = (UserBeforeDeleteListener)i.next(); |
Collection subcascade = listener.userBeforeDelete(editor, user); |
if(subcascade != null) |
cascade.addAll(subcascade); |
} |
return cascade; |
} |
public void delete(User editor, User user) |
throws ModelException |
{ |
201,16 → 239,40 |
return null; |
} |
private static UserManager userManager = null; |
public Collection userBeforeDelete(User editor, User user) |
throws ModelException |
{ |
Collection subusers; |
public static UserManager getInstance() |
try { |
subusers = HibernateUtil.currentSession().find( |
"from User where boss = ?", |
user, Hibernate.entity(User.class) ); |
} |
catch(HibernateException ex) |
{ |
if(userManager == null) |
userManager = new UserManager(); |
throw new ModelException(ex); |
} |
return userManager; |
Collection cascade = new ArrayList(); |
for(Iterator i = subusers.iterator(); i.hasNext(); ) { |
User u = (User)i.next(); |
if(u.viewableBy(editor)) { |
if(u.deleteableBy(editor)) |
cascade.add(new CascadeDeleteElement(u, CascadeDeleteElement.DELETE, |
this.beforeDelete(editor, u))); |
else |
cascade.add(new CascadeDeleteElement(u, CascadeDeleteElement.FORBIDDEN, null)); |
} |
else { |
cascade.add(new CascadeDeleteElement(User.createLimitedCopy(u), |
CascadeDeleteElement.FORBIDDEN, null)); |
} |
} |
return cascade; |
} |
public static final Comparator LOGIN_COMPARATOR = new LoginComparator(); |
private static class LoginComparator |
/sun/hostadmiral/trunk/src/ak/hostadmiral/core/model/User.java |
---|
176,7 → 176,7 |
public boolean deleteableBy(User user) |
{ |
return user.isSuperuser() || user.equals(boss); |
return !user.equals(this) && (user.isSuperuser() || user.equals(boss)); |
} |
public boolean mayChangePassword(User user) |
194,4 → 194,11 |
{ |
return editor.isSuperuser(); |
} |
protected static User createLimitedCopy(User origin) |
{ |
User u = new User(); |
u.setLogin(origin.getLogin()); |
return u; |
} |
} |
/sun/hostadmiral/trunk/src/ak/hostadmiral/core/model/CascadeDeleteElement.java |
---|
0,0 → 1,55 |
package ak.hostadmiral.core.model; |
import java.util.Collection; |
public class CascadeDeleteElement |
{ |
public static final int FORBIDDEN = 1; |
public static final int DELETE = 2; |
public static final int CHANGE = 3; |
private ModelObject object; |
private int effect; |
private Collection cascade; // Collection(CascadeDeleteElement) |
public CascadeDeleteElement() |
{ |
} |
public CascadeDeleteElement(ModelObject object, int effect, Collection cascade) |
{ |
this.object = object; |
this.effect = effect; |
this.cascade = cascade; |
} |
public ModelObject getObject() |
{ |
return object; |
} |
public void setObject(ModelObject object) |
{ |
this.object = object; |
} |
public int getEffect() |
{ |
return effect; |
} |
public void setEffect(int effect) |
{ |
this.effect = effect; |
} |
public Collection getCascade() |
{ |
return cascade; |
} |
public void setCascade(Collection cascade) |
{ |
this.cascade = cascade; |
} |
} |
/sun/hostadmiral/trunk/src/ak/hostadmiral/core/model/InetDomainManager.java |
---|
8,8 → 8,19 |
import ak.hostadmiral.util.ModelSecurityException; |
public class InetDomainManager |
implements UserBeforeDeleteListener |
{ |
private static InetDomainManager inetDomainManager = null; |
private static boolean registered = false; |
public static InetDomainManager getInstance() |
{ |
if(inetDomainManager == null) |
inetDomainManager = new InetDomainManager(); |
return inetDomainManager; |
} |
protected static void register() |
{ |
synchronized(InetDomainManager.class) { |
19,6 → 30,8 |
try { |
HibernateUtil.getConfiguration().addResource( |
"/ak/hostadmiral/core/model/InetDomain.hbm.xml"); |
inetDomainManager = new InetDomainManager(); |
} |
catch(Exception ex) { |
ex.printStackTrace(); |
33,6 → 46,7 |
private InetDomainManager() |
{ |
UserManager.getInstance().addBeforeDeleteListener(this); |
} |
public InetDomain create(User editor) |
109,16 → 123,16 |
} |
} |
public void save(User editor, InetDomain inetDomain) |
public void save(User editor, InetDomain domain) |
throws ModelException |
{ |
if(!inetDomain.editableBy(editor)) |
if(!domain.editableBy(editor)) |
throw new ModelSecurityException(); |
inetDomain.setModUser(editor); |
domain.setModUser(editor); |
try { |
HibernateUtil.currentSession().saveOrUpdate(inetDomain); |
HibernateUtil.currentSession().saveOrUpdate(domain); |
} |
catch(HibernateException ex) |
{ |
126,15 → 140,30 |
} |
} |
public void delete(User editor, InetDomain inetDomain) |
public Collection beforeDelete(User editor, InetDomain domain) |
throws ModelException |
{ |
if(!inetDomain.deleteableBy(editor)) |
Collection cascade = new ArrayList(); |
/* |
for(Iterator i = beforeDeleteListeners.iterator(); i.hasNext(); ) { |
InetDomainBeforeDeleteListener listener = (InetDomainBeforeDeleteListener)i.next(); |
Collection subcascade = listener.userBeforeDelete(editor, domain); |
if(subcascade != null) |
cascade.addAll(subcascade); |
} |
*/ |
return cascade; |
} |
public void delete(User editor, InetDomain domain) |
throws ModelException |
{ |
if(!domain.deleteableBy(editor)) |
throw new ModelSecurityException(); |
try { |
HibernateUtil.currentSession().delete(inetDomain); |
HibernateUtil.currentSession().delete(domain); |
} |
catch(HibernateException ex) |
{ |
175,16 → 204,40 |
} |
} |
private static InetDomainManager inetDomainManager = null; |
public Collection userBeforeDelete(User editor, User user) |
throws ModelException |
{ |
Collection domains; |
public static InetDomainManager getInstance() |
try { |
domains = HibernateUtil.currentSession().find( |
"from InetDomain where owner = ?", |
user, Hibernate.entity(InetDomain.class) ); |
} |
catch(HibernateException ex) |
{ |
if(inetDomainManager == null) |
inetDomainManager = new InetDomainManager(); |
throw new ModelException(ex); |
} |
return inetDomainManager; |
Collection cascade = new ArrayList(); |
for(Iterator i = domains.iterator(); i.hasNext(); ) { |
InetDomain d = (InetDomain)i.next(); |
if(d.viewableBy(editor)) { |
if(d.deleteableBy(editor)) |
cascade.add(new CascadeDeleteElement(d, CascadeDeleteElement.DELETE, |
this.beforeDelete(editor, d))); |
else |
cascade.add(new CascadeDeleteElement(d, CascadeDeleteElement.FORBIDDEN, null)); |
} |
else { |
cascade.add(new CascadeDeleteElement(InetDomain.createLimitedCopy(d), |
CascadeDeleteElement.FORBIDDEN, null)); |
} |
} |
return cascade; |
} |
public static final Comparator NAME_COMPARATOR = new NameComparator(); |
private static class NameComparator |
/sun/hostadmiral/trunk/src/ak/hostadmiral/core/model/InetDomain.java |
---|
98,4 → 98,11 |
{ |
return editor.isSuperuser(); |
} |
protected static InetDomain createLimitedCopy(InetDomain origin) |
{ |
InetDomain d = new InetDomain(); |
d.setName(origin.getName()); |
return d; |
} |
} |
/sun/hostadmiral/trunk/src/ak/hostadmiral/core/model/UserBeforeDeleteListener.java |
---|
0,0 → 1,18 |
package ak.hostadmiral.core.model; |
import java.util.Collection; |
import ak.hostadmiral.util.ModelException; |
public interface UserBeforeDeleteListener |
{ |
/** |
* called if some user is about to be deleted. |
* |
* @param editor who is doing the operation |
* @param user the user to delete |
* @return Collection(CascadeDeleteElement) - object which are touched by deleting the user |
* FIXME: limit deep of load? |
*/ |
public Collection userBeforeDelete(User editor, User user) |
throws ModelException; |
} |