protected void setSuperClassesInternal(final List<? extends OClass> classes) { List<OClassImpl> newSuperClasses = new ArrayList<OClassImpl>(); OClassImpl cls; for (OClass superClass : classes) { if (superClass instanceof OClassAbstractDelegate) cls = (OClassImpl) ((OClassAbstractDelegate) superClass).delegate; else cls = (OClassImpl) superClass; if (newSuperClasses.contains(cls)) { throw new OSchemaException("Duplicated superclass '" + cls.getName() + "'"); } newSuperClasses.add(cls); } List<OClassImpl> toAddList = new ArrayList<OClassImpl>(newSuperClasses); toAddList.removeAll(superClasses); List<OClassImpl> toRemoveList = new ArrayList<OClassImpl>(superClasses); toRemoveList.removeAll(newSuperClasses); for (OClassImpl toRemove : toRemoveList) { toRemove.removeBaseClassInternal(this); } for (OClassImpl addTo : toAddList) { addTo.addBaseClass(this); } superClasses.clear(); superClasses.addAll(newSuperClasses); }
protected void addSuperClassInternal(ODatabaseDocumentInternal database, final OClass superClass) { acquireSchemaWriteLock(); try { final OClassImpl cls; if (superClass instanceof OClassAbstractDelegate) cls = (OClassImpl) ((OClassAbstractDelegate) superClass).delegate; else cls = (OClassImpl) superClass; if (cls != null) { // CHECK THE USER HAS UPDATE PRIVILEGE AGAINST EXTENDING CLASS final OSecurityUser user = database.getUser(); if (user != null) user.allow(ORule.ResourceGeneric.CLASS, cls.getName(), ORole.PERMISSION_UPDATE); if (superClasses.contains(superClass)) { throw new OSchemaException( "Class: '" + this.getName() + "' already has the class '" + superClass.getName() + "' as superclass"); } cls.addBaseClass(this); superClasses.add(cls); } } finally { releaseSchemaWriteLock(); } }