1
18 package org.torweg.pulse.accesscontrol.attributes;
19
20 import java.io.Serializable;
21 import java.util.HashSet;
22 import java.util.Map;
23 import java.util.Set;
24
25 import javax.persistence.Basic;
26 import javax.persistence.CascadeType;
27 import javax.persistence.Entity;
28 import javax.persistence.Inheritance;
29 import javax.persistence.InheritanceType;
30 import javax.persistence.JoinColumn;
31 import javax.persistence.OneToMany;
32 import javax.xml.bind.annotation.XmlAccessOrder;
33 import javax.xml.bind.annotation.XmlAccessType;
34 import javax.xml.bind.annotation.XmlAccessorOrder;
35 import javax.xml.bind.annotation.XmlAccessorType;
36 import javax.xml.bind.annotation.XmlElement;
37 import javax.xml.bind.annotation.XmlElementWrapper;
38 import javax.xml.bind.annotation.XmlRootElement;
39 import javax.xml.bind.annotation.XmlTransient;
40
41 import net.sf.json.JSONObject;
42
43 import org.hibernate.LazyInitializationException;
44 import org.hibernate.Session;
45 import org.jdom.Element;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
48 import org.torweg.pulse.accesscontrol.Role;
49 import org.torweg.pulse.accesscontrol.User;
50 import org.torweg.pulse.bundle.JDOMable;
51 import org.torweg.pulse.invocation.lifecycle.Lifecycle;
52 import org.torweg.pulse.service.request.Command;
53 import org.torweg.pulse.util.INamed;
54 import org.torweg.pulse.util.entity.Node;
55
56
64 @Entity
65 @Inheritance(strategy = InheritanceType.JOINED)
66 @XmlRootElement(name = "abstract-attribute")
67 @XmlAccessorOrder(XmlAccessOrder.UNDEFINED)
68 @XmlAccessorType(XmlAccessType.FIELD)
69 public abstract class AbstractAttribute<T> extends Node implements INamed,
70 JDOMable, Serializable {
71
72
75 private static final long serialVersionUID = 5937048602470227822L;
76
77
80 protected static final Logger LOGGER = LoggerFactory
81 .getLogger(AbstractAttribute.class);
82
83
87 @OneToMany(cascade = { CascadeType.MERGE, CascadeType.PERSIST,
88 CascadeType.REFRESH })
89 @JoinColumn(nullable = true)
90 @XmlTransient
91 private final Set<Role> selfViewRoles = new HashSet<Role>();
93
94
98 @OneToMany(cascade = { CascadeType.MERGE, CascadeType.PERSIST,
99 CascadeType.REFRESH })
100 @JoinColumn(nullable = true)
101 @XmlTransient
102 private final Set<Role> selfEditRoles = new HashSet<Role>();
104
105
109 @OneToMany(cascade = { CascadeType.MERGE, CascadeType.PERSIST,
110 CascadeType.REFRESH })
111 @JoinColumn(nullable = true)
112 @XmlTransient
113 private final Set<Role> adminViewRoles = new HashSet<Role>();
115
116
120 @OneToMany(cascade = { CascadeType.MERGE, CascadeType.PERSIST,
121 CascadeType.REFRESH })
122 @JoinColumn(nullable = true)
123 @XmlTransient
124 private final Set<Role> adminEditRoles = new HashSet<Role>();
126
127
131 @OneToMany(cascade = { CascadeType.MERGE, CascadeType.PERSIST,
132 CascadeType.REFRESH })
133 @JoinColumn(nullable = true)
134 @XmlTransient
135 private final Set<Role> triggeredRoles = new HashSet<Role>();
137
138
141 @Basic
142 @XmlElement(name = "system-attribute")
143 private final boolean systemAttribute;
144
145
148 @Basic
149 @XmlElement(name = "required")
150 private boolean required;
151
152
155 @Deprecated
156 protected AbstractAttribute() {
157 super();
158 this.systemAttribute = false;
159 }
160
161
167 protected AbstractAttribute(final boolean isSystemAttribute) {
168 super();
169 this.systemAttribute = isSystemAttribute;
170 }
171
172
179 public final void setSelfViewRoles(final Set<Role> r) {
180 this.selfViewRoles.clear();
181 this.selfViewRoles.addAll(r);
182 }
183
184
192 public final boolean addSelfViewRole(final Role r) {
193 return this.selfViewRoles.add(r);
194
195 }
196
197
205 public final boolean removeSelfViewRole(final Role r) {
206 return this.selfViewRoles.remove(r);
207 }
208
209
215 public final Set<Role> getSelfViewRoles() {
216 return this.selfViewRoles;
217 }
218
219
224 @XmlElementWrapper(name = "self-view-roles")
225 @XmlElement(name = "role")
226 @SuppressWarnings("unused")
227 @Deprecated
228 private HashSet<Role> getSelfViewRolesJAXB() { try {
230 return new HashSet<Role>(getSelfViewRoles());
231 } catch (LazyInitializationException e) {
232 LOGGER.debug("ignored: {}", e.getLocalizedMessage());
233 return null;
234 }
235 }
236
237
243 public final Set<Role> getSelfEditRoles() {
244 return this.selfEditRoles;
245 }
246
247
254 public final void setSelfEditRoles(final Set<Role> r) {
255 this.selfEditRoles.clear();
256 this.selfEditRoles.addAll(r);
257 }
258
259
267 public final boolean addSelfEditRole(final Role r) {
268 return this.selfEditRoles.add(r);
269
270 }
271
272
280 public final boolean removeSelfEditRole(final Role r) {
281 return this.selfEditRoles.remove(r);
282 }
283
284
289 @XmlElementWrapper(name = "self-edit-roles")
290 @XmlElement(name = "role")
291 @SuppressWarnings("unused")
292 @Deprecated
293 private HashSet<Role> getSelfEditRolesJAXB() { try {
295 return new HashSet<Role>(getSelfEditRoles());
296 } catch (LazyInitializationException e) {
297 LOGGER.debug("ignored: {}", e.getLocalizedMessage());
298 return null;
299 }
300 }
301
302
309 public final void setAdminViewRoles(final Set<Role> r) {
310 this.adminViewRoles.clear();
311 this.adminViewRoles.addAll(r);
312 }
313
314
322 public final boolean addAdminViewRole(final Role r) {
323 return this.adminViewRoles.add(r);
324
325 }
326
327
335 public final boolean removeAdminViewRole(final Role r) {
336 return this.adminViewRoles.remove(r);
337 }
338
339
345 public final Set<Role> getAdminViewRoles() {
346 return this.adminViewRoles;
347 }
348
349
354 @XmlElementWrapper(name = "admin-view-roles")
355 @XmlElement(name = "role")
356 @SuppressWarnings("unused")
357 @Deprecated
358 private HashSet<Role> getAdminViewRolesJAXB() { try {
360 return new HashSet<Role>(getAdminViewRoles());
361 } catch (LazyInitializationException e) {
362 LOGGER.debug("ignored: {}", e.getLocalizedMessage());
363 return null;
364 }
365 }
366
367
374 public final void setAdminEditRoles(final Set<Role> r) {
375 this.adminEditRoles.clear();
376 this.adminEditRoles.addAll(r);
377 }
378
379
387 public final boolean addAdminEditRole(final Role r) {
388 return this.adminEditRoles.add(r);
389
390 }
391
392
400 public final boolean removeAdminEditRole(final Role r) {
401 return this.adminEditRoles.remove(r);
402 }
403
404
410 public final Set<Role> getAdminEditRoles() {
411 return this.adminEditRoles;
412 }
413
414
419 @XmlElementWrapper(name = "admin-edit-roles")
420 @XmlElement(name = "role")
421 @SuppressWarnings("unused")
422 @Deprecated
423 private HashSet<Role> getAdminEditRolesJAXB() { try {
425 return new HashSet<Role>(getAdminEditRoles());
426 } catch (LazyInitializationException e) {
427 LOGGER.debug("ignored: {}", e.getLocalizedMessage());
428 return null;
429 }
430 }
431
432
439 public final void setTriggeredRoles(final Set<Role> r) {
440 this.triggeredRoles.clear();
441 this.triggeredRoles.addAll(r);
442 }
443
444
452 public final boolean addTriggeredRole(final Role r) {
453 return this.triggeredRoles.add(r);
454
455 }
456
457
465 public final boolean removeTriggeredRole(final Role r) {
466 return this.triggeredRoles.remove(r);
467 }
468
469
475 public final Set<Role> getTriggeredRoles() {
476 return this.triggeredRoles;
477 }
478
479
484 @XmlElementWrapper(name = "triggered-roles")
485 @XmlElement(name = "role")
486 @SuppressWarnings("unused")
487 @Deprecated
488 private HashSet<Role> getTriggeredRolesJAXB() { try {
490 return new HashSet<Role>(getTriggeredRoles());
491 } catch (LazyInitializationException e) {
492 LOGGER.debug("ignored: {}", e.getLocalizedMessage());
493 return null;
494 }
495 }
496
497
502 public final boolean isSystemAttribute() {
503 return this.systemAttribute;
504 }
505
506
511 public final boolean isRequired() {
512 return this.required;
513 }
514
515
521 public final void setRequired(final boolean r) {
522 this.required = r;
523 }
524
525
537 public final boolean isValid(final User user) {
538 if (getCheck() != null) {
539 if (getValue(user) == null) {
540 return false;
541 }
542 if (!getCheck().isValid(getValue(user))) {
543 return false;
544 }
545 }
546 for (Node n : getChildren()) {
547 if (!((AbstractAttribute<?>) n).isValid(user)) {
548 return false;
549 }
550 }
551 return true;
552
553
561 }
562
563
568 public abstract String getName();
569
570
577 @SuppressWarnings("unchecked")
578 public final AbstractValue<T> getValue(final User user) {
579 return (AbstractValue<T>) user.getAttributeValue(this);
580 }
581
582
591 public final User setValue(final AbstractValue<T> value, final User user) {
592 if (value.getAttribute() == null) {
593 value.setAttribute(this);
594 } else if (!value.getAttribute().equals(this)) {
595 throw new IllegalArgumentException("cannot set attribute.value: "
596 + "given value is already associated "
597 + "with another attribute");
598 }
599 user.setAttributeValue(value);
600 return user;
601 }
602
603
608 @SuppressWarnings("unchecked")
609 public final Set<Class<AbstractTypedCheck<?>>> getTypedChecks() {
610 return Lifecycle.getAttributeFactory().getTypedChecks(
611 (Class<AbstractAttribute<?>>) this.getClass());
612 }
613
614
620 public abstract void setCheck(final AbstractTypedCheck<T> c);
621
622
627 public abstract AbstractTypedCheck<T> getCheck();
628
629
643 public abstract AbstractAttribute<T> getAttributeInstance(String name,
644 boolean isSystem);
645
646
653 public abstract AbstractValue<T> valueFromCommand(Command c);
654
655
669 public abstract AbstractAttribute<T> updateSettingsFromCommand(
670 Command command, Session session);
671
672
688 public Element deserializeToJDOM() {
689 Element attr = getRootElement();
690
691 Element svr = new Element("self-view-roles");
692 addRoleSet(svr, this.selfViewRoles);
693 attr.addContent(svr);
694
695 Element ser = new Element("self-edit-roles");
696 addRoleSet(ser, this.selfEditRoles);
697 attr.addContent(ser);
698
699 Element avr = new Element("admin-view-roles");
700 addRoleSet(avr, this.adminViewRoles);
701 attr.addContent(avr);
702
703 Element aer = new Element("admin-edit-roles");
704 addRoleSet(aer, this.adminEditRoles);
705 attr.addContent(aer);
706
707 Element tr = new Element("triggered-roles");
708 addRoleSet(tr, this.triggeredRoles);
709 attr.addContent(tr);
710
711 if (getCheck() != null) {
712 attr.addContent(getCheck().deserializeToJDOM());
713 }
714 return attr;
715 }
716
717
722 private Element getRootElement() {
723 Element attr = new Element("Attribute").setAttribute("class",
724 getClass().getCanonicalName()).setAttribute("name", getName())
725 .setAttribute("system", Boolean.toString(this.systemAttribute))
726 .setAttribute("required", Boolean.toString(this.required))
727 .setAttribute("id", getId().toString());
728 return attr;
729 }
730
731
743 public Element deserializeToJDOM(final Map<Long, AbstractValue<?>> valueMap) {
744 Element attr = getRootElement();
745 if (valueMap.get(getId()) != null) {
747 attr.addContent(valueMap.get(getId()).deserializeToJDOM());
748 }
749
750 for (Node n : getChildren()) {
751 AbstractAttribute<?> cAttr = (AbstractAttribute<?>) n;
753 attr.addContent(cAttr.deserializeToJDOM(valueMap));
754 }
755
756 return attr;
757 }
758
759
765 @Override
766 public JSONObject toJSON() {
767 JSONObject nodeObject = super.toJSON();
768 nodeObject.put("clazz", getClass().getCanonicalName());
770 nodeObject.put("text", getName());
771 nodeObject.put("uiProvider", "RegistryTreeNodeUI");
772 nodeObject.put("isSystem", isSystemAttribute());
773 nodeObject.put("isRequired", isRequired());
774 return nodeObject;
775 }
776
777
785 private void addRoleSet(final Element el, final Set<Role> rs) {
786 try {
787 for (Role r : rs) {
788 el.addContent(r.deserializeToJDOM());
789 }
790 } catch (LazyInitializationException e) {
791 if (LOGGER.isTraceEnabled()) {
792 LOGGER.trace(e.getLocalizedMessage(), e);
793 }
794 }
795 }
796
797 }
798