Subversion Repositories general

Rev

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