SLING-11314 : Enhance API with methods to simply check if a configuration is private
diff --git a/pom.xml b/pom.xml
index d136e35..388ea3b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,7 +19,7 @@
 
     <artifactId>org.apache.sling.feature.extension.apiregions</artifactId>
     <version>1.5.1-SNAPSHOT</version>
-    <name>Sling Featuremodel - API Regions Exension</name>
+    <name>Apache Sling Feature Model - API Regions Extension</name>
 
     <scm>
         <connection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-extension-apiregions.git</connection>
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurationApi.java b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurationApi.java
index efd3807..dccf6b4 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurationApi.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurationApi.java
@@ -292,7 +292,45 @@
 		return internalFactories;
 	}
 
-	/**
+    /**
+     * Check if the configuration is an internal configuration
+     * @param pid The pid
+     * @return {@code true} if it is an internal configuration
+     * @since 1.7.0
+     */
+    public boolean isInternalConfiguration(final String pid) {
+        boolean result = this.internalConfigurations.contains(pid);
+        if ( !result ) {
+            final ConfigurationDescription desc = this.configurations.get(pid);
+            if ( desc != null ) {
+                result = desc.getPropertyDescriptions().isEmpty();
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Check if the factory configuration is an internal configuration
+     * @param factoryPid The factory pid
+     * @param name Optional name of the configuration
+     * @return {@code true} if it is an internal factory configuration
+     * @since 1.7.0
+     */
+    public boolean isInternalFactoryConfiguration(final String factoryPid, final String name) {
+        boolean result = this.internalFactories.contains(factoryPid);
+        if ( !result ) {
+            final FactoryConfigurationDescription desc = this.factories.get(factoryPid);
+            if ( desc != null ) {
+                result = desc.getPropertyDescriptions().isEmpty();
+                if ( !result && name != null ) {
+                    result = desc.getInternalNames().contains(name);
+                }
+            }
+        }
+        return result;
+    }
+
+    /**
      * Get the internal framework property names
 	 * @return Mutable set of internal framework property names
 	 */
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/package-info.java b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/package-info.java
index 0c44f4f..1db8dcc 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/package-info.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@org.osgi.annotation.versioning.Version("1.6.0")
+@org.osgi.annotation.versioning.Version("1.7.0")
 package org.apache.sling.feature.extension.apiregions.api.config;
 
 
diff --git a/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurationApiTest.java b/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurationApiTest.java
index ff16509..ce21bd3 100644
--- a/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurationApiTest.java
+++ b/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurationApiTest.java
@@ -17,6 +17,7 @@
 package org.apache.sling.feature.extension.apiregions.api.config;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -158,4 +159,79 @@
         entity.setRegion(Region.INTERNAL);
         assertEquals(Region.INTERNAL, entity.detectRegion());
     }
+
+    @Test public void testIsInternalConfiguration() {
+        final String PID = "org.apache.sling.configuration";
+        final ConfigurationApi api = new ConfigurationApi();
+        // ootb nothing is internal
+        assertFalse(api.isInternalConfiguration(PID));
+
+        // adding a normal description with a property does not change this
+        final ConfigurationDescription desc = new ConfigurationDescription();
+        final PropertyDescription propDesc = new PropertyDescription();
+        desc.getPropertyDescriptions().put("foo", propDesc);
+        api.getConfigurationDescriptions().put(PID, desc);
+        assertFalse(api.isInternalConfiguration(PID));
+
+        // a description without properties makes it internal
+        desc.getPropertyDescriptions().clear();
+        assertTrue(api.isInternalConfiguration(PID));
+
+        // and deprecated variant
+        api.getConfigurationDescriptions().clear();
+        api.getInternalConfigurations().add(PID);
+        assertTrue(api.isInternalConfiguration(PID));
+    }
+
+    @Test public void testIsInternalFactoryConfigurationNoName() {
+        final String FACTORYPID = "org.apache.sling.configuration";
+        final ConfigurationApi api = new ConfigurationApi();
+        // ootb nothing is internal
+        assertFalse(api.isInternalFactoryConfiguration(FACTORYPID, null));
+
+        // adding a normal description with a property does not change this
+        final FactoryConfigurationDescription desc = new FactoryConfigurationDescription();
+        final PropertyDescription propDesc = new PropertyDescription();
+        desc.getPropertyDescriptions().put("foo", propDesc);
+        api.getFactoryConfigurationDescriptions().put(FACTORYPID, desc);
+        assertFalse(api.isInternalFactoryConfiguration(FACTORYPID, null));
+
+        // a description without properties makes it internal
+        desc.getPropertyDescriptions().clear();
+        assertTrue(api.isInternalFactoryConfiguration(FACTORYPID, null));
+
+        // and deprecated variant
+        api.getFactoryConfigurationDescriptions().clear();
+        api.getInternalFactoryConfigurations().add(FACTORYPID);
+        assertTrue(api.isInternalFactoryConfiguration(FACTORYPID, null));
+    }
+
+    @Test public void testIsInternalFactoryConfigurationWithName() {
+        final String FACTORYPID = "org.apache.sling.configuration";
+        final String NAME = "bar";
+        final ConfigurationApi api = new ConfigurationApi();
+        // ootb nothing is internal
+        assertFalse(api.isInternalFactoryConfiguration(FACTORYPID, NAME));
+
+        // adding a normal description with a property does not change this
+        final FactoryConfigurationDescription desc = new FactoryConfigurationDescription();
+        final PropertyDescription propDesc = new PropertyDescription();
+        desc.getPropertyDescriptions().put("foo", propDesc);
+        api.getFactoryConfigurationDescriptions().put(FACTORYPID, desc);
+        assertFalse(api.isInternalFactoryConfiguration(FACTORYPID, NAME));
+
+        // name can be added to internal names
+        desc.getInternalNames().add(NAME);
+        assertTrue(api.isInternalFactoryConfiguration(FACTORYPID, NAME));
+
+        // a description without properties makes it internal
+        desc.getInternalNames().clear();
+        desc.getPropertyDescriptions().clear();
+        assertTrue(api.isInternalFactoryConfiguration(FACTORYPID, NAME));
+
+        // and deprecated variant
+        api.getFactoryConfigurationDescriptions().clear();
+        api.getInternalFactoryConfigurations().add(FACTORYPID);
+        assertTrue(api.isInternalFactoryConfiguration(FACTORYPID, NAME));
+    }
 }