Subversion Repositories general

Rev

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