From e3299338025c9cf33f885672fe439c294fb287e6 Mon Sep 17 00:00:00 2001 From: Tglman Date: Thu, 31 Mar 2016 16:26:54 +1100 Subject: [PATCH] moved check for property consistence only on public api --- .../core/metadata/schema/OClassImpl.java | 30 +++++++++++++------ .../core/metadata/schema/OSchemaShared.java | 5 ++++ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OClassImpl.java b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OClassImpl.java index 4c592f30636..9aaaaadc071 100755 --- a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OClassImpl.java +++ b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OClassImpl.java @@ -385,6 +385,11 @@ public OClass setSuperClassesByNames(List classNames) { @Override public OClass setSuperClasses(final List classes) { getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + if (classes != null) { + List toCheck = new ArrayList(classes); + toCheck.add(this); + checkParametersConflict(toCheck); + } acquireSchemaWriteLock(); try { final ODatabaseDocumentInternal database = getDatabase(); @@ -436,7 +441,6 @@ void setSuperClassesInternal(final List classes) { newSuperClasses.add(cls); } - checkParametersConflict(newSuperClasses); List toAddList = new ArrayList(newSuperClasses); toAddList.removeAll(superClasses); List toRemoveList = new ArrayList(superClasses); @@ -458,6 +462,7 @@ void setSuperClassesInternal(final List classes) { @Override public OClass addSuperClass(final OClass superClass) { getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + checkParametersConflict(superClass); acquireSchemaWriteLock(); try { final ODatabaseDocumentInternal database = getDatabase(); @@ -2548,7 +2553,6 @@ private void addClusterIdToIndexes(int iId) { */ private OClass addBaseClass(final OClassImpl iBaseClass) { checkRecursion(iBaseClass); - checkParametersConflict(iBaseClass); if (subclasses == null) subclasses = new ArrayList(); @@ -2573,23 +2577,31 @@ private void checkParametersConflict(final OClass baseClass) { } } - private void checkParametersConflict(List classes) { - final Map commulative = new HashMap(); + protected static void checkParametersConflict(List classes) { + final Map comulative = new HashMap(); final Map properties = new HashMap(); - for (OClassImpl superClass : classes) { - superClass.propertiesMap(properties, false); + for (OClass superClass : classes) { + if (superClass == null) + continue; + OClassImpl impl; + + if (superClass instanceof OClassAbstractDelegate) + impl = (OClassImpl) ((OClassAbstractDelegate) superClass).delegate; + else + impl = (OClassImpl) superClass; + impl.propertiesMap(properties, false); for (Map.Entry entry : properties.entrySet()) { - if (commulative.containsKey(entry.getKey())) { + if (comulative.containsKey(entry.getKey())) { final String property = entry.getKey(); - final OProperty existingProperty = commulative.get(property); + final OProperty existingProperty = comulative.get(property); if (!existingProperty.getType().equals(entry.getValue().getType())) { throw new OSchemaException("Properties conflict detected: '" + existingProperty + "] vs [" + entry.getValue() + "]"); } } } - commulative.putAll(properties); + comulative.putAll(properties); properties.clear(); } } diff --git a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaShared.java b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaShared.java index dd25c79a86c..3c12927434b 100755 --- a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaShared.java +++ b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaShared.java @@ -948,6 +948,9 @@ private OClass doCreateClass(final String className, final int[] clusterIds, int StringBuilder cmd = null; getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE); + if (superClasses != null) + OClassImpl.checkParametersConflict(Arrays.asList(superClasses)); + acquireSchemaWriteLock(); try { @@ -1034,6 +1037,8 @@ private OClass doCreateClass(final String className, final int clusters, final i StringBuilder cmd = null; getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE); + if(superClasses != null) + OClassImpl.checkParametersConflict(Arrays.asList(superClasses)); acquireSchemaWriteLock(); try {