Subversion Repositories general

Rev

Rev 1010 | Rev 1014 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
924 dev 1
package ak.hostadmiral.core.model;
919 dev 2
 
3
import java.util.*;
4
import net.sf.hibernate.*;
923 dev 5
import net.sf.hibernate.type.Type;
924 dev 6
import ak.hostadmiral.util.HibernateUtil;
7
import ak.hostadmiral.util.ModelException;
8
import ak.hostadmiral.util.ModelSecurityException;
919 dev 9
 
10
public class InetDomainManager
946 dev 11
	implements UserBeforeDeleteListener
919 dev 12
{
946 dev 13
	private static InetDomainManager inetDomainManager = null;
919 dev 14
	private static boolean registered = false;
946 dev 15
 
16
	public static InetDomainManager getInstance()
17
	{
18
		return inetDomainManager;
19
	}
20
 
919 dev 21
	protected static void register()
22
	{
23
		synchronized(InetDomainManager.class) {
24
			if(registered) return;
25
 
26
			registered = true;
27
			try {
28
				HibernateUtil.getConfiguration().addResource(
950 dev 29
					"ak/hostadmiral/core/model/InetDomain.hbm.xml");
946 dev 30
 
31
				inetDomainManager = new InetDomainManager();
919 dev 32
			}
33
			catch(Exception ex) {
34
				ex.printStackTrace();
35
				throw new RuntimeException(ex.getMessage());
36
			}
37
		}
38
	}
39
 
40
	static {
41
		register();
42
	}
43
 
1011 dev 44
	private Collection createdListeners      = new ArrayList();
45
	private Collection modifiedListeners     = new ArrayList();
949 dev 46
	private Collection beforeDeleteListeners = new ArrayList();
1011 dev 47
	private Collection deletedListeners      = new ArrayList();
949 dev 48
 
919 dev 49
	private InetDomainManager()
50
	{
946 dev 51
		UserManager.getInstance().addBeforeDeleteListener(this);
919 dev 52
	}
53
 
54
	public InetDomain create(User editor)
55
		throws ModelException
56
	{
57
		if(!allowedToCreate(editor)) throw new ModelSecurityException();
58
 
59
		return new InetDomain();
60
	}
61
 
62
	public boolean allowedToCreate(User editor)
63
		throws ModelException
64
	{
921 dev 65
		return InetDomain.allowedToCreate(this, editor);
919 dev 66
	}
67
 
68
	public InetDomain get(User editor, Long id)
69
		throws ModelException
70
	{
71
		InetDomain domain;
72
 
73
		try {
74
			domain = (InetDomain)HibernateUtil.currentSession().load(
75
				InetDomain.class, id);
76
		}
77
		catch(HibernateException ex)
78
		{
79
			throw new ModelException(ex);
80
		}
81
 
82
		if(!domain.viewableBy(editor))
83
			throw new ModelSecurityException();
84
 
85
		return domain;
86
	}
87
 
923 dev 88
	public boolean nameExists(User editor, InetDomain domain, String name)
89
		throws ModelException
90
	{
91
		try {
92
			if(domain.getId() == null)
93
				return ((Integer)HibernateUtil.currentSession().iterate(
94
					"select count(*) from InetDomain d where name = ?",
95
					name, Hibernate.STRING)
96
					.next()).intValue() > 0;
97
			else
98
				return ((Integer)HibernateUtil.currentSession().iterate(
99
					"select count(*) from InetDomain d where name = ? and d != ?",
100
					new Object[] { name, domain },
101
					new Type[] { Hibernate.STRING, Hibernate.entity(InetDomain.class) } )
102
					.next()).intValue() > 0;
103
		}
104
		catch(HibernateException ex)
105
		{
106
			throw new ModelException(ex);
107
		}
108
	}
109
 
919 dev 110
	protected InetDomain findForName(String name)
111
		throws ModelException
112
	{
113
		try {
114
			List list = HibernateUtil.currentSession().find(
115
				"from InetDomain where name=?", name, Hibernate.STRING);
116
 
117
			if(list.size() == 0)
118
				return null;
119
			else
120
				return (InetDomain)list.get(0);
121
		}
122
		catch(HibernateException ex)
123
		{
124
			throw new ModelException(ex);
125
		}
126
	}
127
 
946 dev 128
	public void save(User editor, InetDomain domain)
919 dev 129
		throws ModelException
130
	{
946 dev 131
		if(!domain.editableBy(editor))
919 dev 132
			throw new ModelSecurityException();
133
 
1011 dev 134
        boolean isNew = domain.isNew();
135
 
1010 dev 136
		//domain.setModUser(editor); // FIXME
919 dev 137
 
138
		try {
946 dev 139
			HibernateUtil.currentSession().saveOrUpdate(domain);
919 dev 140
		}
141
		catch(HibernateException ex)
142
		{
143
			throw new ModelException(ex);
144
		}
1011 dev 145
 
146
        // inform listeners
147
        if(isNew) {
148
        	for(Iterator i = createdListeners.iterator(); i.hasNext(); ) {
149
        		InetDomainCreatedListener listener = (InetDomainCreatedListener)i.next();
150
    			listener.inetDomainCreated(editor, domain);
151
        	}
152
        }
153
        else {
154
            InetDomain oldDomain = domain.getOrigin();
155
            if(oldDomain == null) oldDomain = domain;
156
        	for(Iterator i = modifiedListeners.iterator(); i.hasNext(); ) {
157
        		InetDomainModifiedListener listener = (InetDomainModifiedListener)i.next();
158
    			listener.inetDomainModified(editor, domain, oldDomain);
159
        	}
160
        }
919 dev 161
	}
162
 
1011 dev 163
    public void addCreatedListener(InetDomainCreatedListener listener)
949 dev 164
    {
1011 dev 165
    	createdListeners.add(listener);
166
    }
167
 
168
    public void removeCreatedListener(InetDomainCreatedListener listener)
169
    {
170
    	createdListeners.remove(listener);
171
    }
172
 
173
    public void addModifiedListener(InetDomainModifiedListener listener)
174
    {
175
    	modifiedListeners.add(listener);
176
    }
177
 
178
    public void removeModifiedListener(InetDomainModifiedListener listener)
179
    {
180
    	modifiedListeners.remove(listener);
181
    }
182
 
183
    public void addBeforeDeleteListener(InetDomainBeforeDeleteListener listener)
184
    {
949 dev 185
    	beforeDeleteListeners.add(listener);
186
    }
187
 
1011 dev 188
    public void removeBeforeDeleteListener(InetDomainBeforeDeleteListener listener)
949 dev 189
    {
190
    	beforeDeleteListeners.remove(listener);
191
    }
192
 
1011 dev 193
    public void addDeletedListener(InetDomainDeletedListener listener)
194
    {
195
    	deletedListeners.add(listener);
196
    }
197
 
198
    public void removeDeletedListener(InetDomainDeletedListener listener)
199
    {
200
    	deletedListeners.remove(listener);
201
    }
202
 
949 dev 203
    public Collection beforeDelete(User editor, InetDomain domain, Collection known)
919 dev 204
		throws ModelException
946 dev 205
    {
206
    	Collection cascade = new ArrayList();
949 dev 207
 
946 dev 208
    	for(Iterator i = beforeDeleteListeners.iterator(); i.hasNext(); ) {
209
    		InetDomainBeforeDeleteListener listener = (InetDomainBeforeDeleteListener)i.next();
949 dev 210
			Collection subcascade = listener.inetDomainBeforeDelete(editor, domain, known);
946 dev 211
    		if(subcascade != null)
212
    			cascade.addAll(subcascade);
213
    	}
949 dev 214
 
946 dev 215
    	return cascade;
216
    }
217
 
218
	public void delete(User editor, InetDomain domain)
219
		throws ModelException
919 dev 220
	{
1011 dev 221
	    // check rights
946 dev 222
		if(!domain.deleteableBy(editor))
919 dev 223
			throw new ModelSecurityException();
224
 
1011 dev 225
        // backup copy
226
        InetDomain oldDomain = new InetDomain(domain);
227
 
228
        // delete it
919 dev 229
		try {
230
 
946 dev 231
			HibernateUtil.currentSession().delete(domain);
919 dev 232
		}
233
		catch(HibernateException ex)
234
		{
235
			throw new ModelException(ex);
236
		}
1011 dev 237
 
238
        // inform listeners
239
    	for(Iterator i = deletedListeners.iterator(); i.hasNext(); ) {
240
    		InetDomainDeletedListener listener = (InetDomainDeletedListener)i.next();
241
			listener.inetDomainDeleted(editor, oldDomain);
242
    	}
919 dev 243
	}
244
 
245
	public Collection listInetDomains(User editor)
246
		throws ModelException
247
	{
248
		try {
249
			if(editor.isSuperuser())
250
				return HibernateUtil.currentSession().find("from InetDomain");
251
			else
252
				return HibernateUtil.currentSession().find(
253
					"from InetDomain where owner=?", editor, Hibernate.entity(User.class));
254
		}
255
		catch(HibernateException ex)
256
		{
257
			throw new ModelException(ex);
258
		}
259
	}
260
 
261
	public boolean areInetDomainsAvailable(User editor)
262
		throws ModelException
263
	{
264
		try {
265
			if(editor.isSuperuser())
266
				return true;
267
			else
268
				return ((Integer)HibernateUtil.currentSession().iterate(
269
					"select count(*) from InetDomain where owner=?",
270
					editor, Hibernate.entity(User.class)).next()).intValue() > 0;
271
		}
272
		catch(HibernateException ex)
273
		{
274
			throw new ModelException(ex);
275
		}
276
	}
277
 
949 dev 278
	public Collection userBeforeDelete(User editor, User user, Collection known)
946 dev 279
		throws ModelException
919 dev 280
	{
946 dev 281
        Collection domains;
919 dev 282
 
946 dev 283
		try {
284
			domains = HibernateUtil.currentSession().find(
285
				"from InetDomain where owner = ?",
949 dev 286
				user, Hibernate.entity(User.class) );
946 dev 287
		}
288
		catch(HibernateException ex)
289
		{
290
			throw new ModelException(ex);
291
		}
292
 
293
    	Collection cascade = new ArrayList();
294
		for(Iterator i = domains.iterator(); i.hasNext(); ) {
295
			InetDomain d = (InetDomain)i.next();
296
            if(d.viewableBy(editor)) {
297
				if(d.deleteableBy(editor))
298
					cascade.add(new CascadeDeleteElement(d, CascadeDeleteElement.DELETE,
949 dev 299
						this.beforeDelete(editor, d, known)));
946 dev 300
				else
301
					cascade.add(new CascadeDeleteElement(d, CascadeDeleteElement.FORBIDDEN, null));
302
			}
303
			else {
304
				cascade.add(new CascadeDeleteElement(InetDomain.createLimitedCopy(d),
305
					CascadeDeleteElement.FORBIDDEN, null));
306
			}
307
		}
308
 
309
    	return cascade;
919 dev 310
	}
311
 
312
	public static final Comparator NAME_COMPARATOR = new NameComparator();
313
 
314
	private static class NameComparator
315
		implements Comparator
316
	{
317
		public int compare(Object o1, Object o2)
318
		{
319
			if(!(o1 instanceof InetDomain) || !(o2 instanceof InetDomain))
320
				throw new ClassCastException("not a InetDomain");
321
 
322
		    InetDomain a1 = (InetDomain)o1;
323
		    InetDomain a2 = (InetDomain)o2;
324
 
325
		    if(a1 == null && a2 == null)
326
		    	return 0;
327
		    else if(a1 == null && a2 != null)
328
		    	return -1;
329
		    else if(a1 != null && a2 == null)
330
		    	return 1;
331
		    else
332
		    	return a1.getName().compareToIgnoreCase(a2.getName());
333
		}
334
 
335
		public boolean equals(Object obj)
336
		{
337
			return (obj instanceof NameComparator);
338
		}
339
	}
340
}