From ef5fa978b45f4903db62bc229f0ec1634cf9c932 Mon Sep 17 00:00:00 2001
From: "Andrei.Pozolotin" <Andrei.Pozolotin@gmail.com>
Date: Tue, 21 Aug 2012 13:31:02 -0500
Subject: [PATCH] fix hard coded features uri in features deployer

---
 .../features/FeatureDeploymentListener.java        |   28 +++++++++++++--
 .../apache/karaf/features/FeaturesNamespaces.java  |   37 ++++++++++++++++++++
 .../features/internal/FeatureValidationUtil.java   |    1 +
 .../features/internal/FeaturesNamespaces.java      |   37 --------------------
 .../karaf/features/internal/model/JaxbUtil.java    |    2 +-
 .../features/internal/model/package-info.java      |    3 +-
 .../features/GenerateDescriptorMojoTest.java       |    2 +-
 7 files changed, 68 insertions(+), 42 deletions(-)
 create mode 100644 features/core/src/main/java/org/apache/karaf/features/FeaturesNamespaces.java
 delete mode 100644 features/core/src/main/java/org/apache/karaf/features/internal/FeaturesNamespaces.java

diff --git a/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureDeploymentListener.java b/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureDeploymentListener.java
index 9a384b5..1ad69f8 100644
--- a/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureDeploymentListener.java
+++ b/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureDeploymentListener.java
@@ -34,6 +34,7 @@ import org.w3c.dom.Document;
 
 import org.apache.felix.fileinstall.ArtifactUrlTransformer;
 import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.FeaturesNamespaces;
 import org.apache.karaf.features.FeaturesService;
 import org.apache.karaf.features.Repository;
 import org.osgi.framework.Bundle;
@@ -86,14 +87,37 @@ public class FeatureDeploymentListener implements ArtifactUrlTransformer, Bundle
         bundleContext.removeBundleListener(this);
     }
 
+    private boolean isKnownFeaturesURI(String uri){
+    	if(uri == null){
+    		return true;
+    	}
+    	if(FeaturesNamespaces.URI_0_0_0.equalsIgnoreCase(uri)){
+    		return true;
+    	}
+    	if(FeaturesNamespaces.URI_1_0_0.equalsIgnoreCase(uri)){
+    		return true;
+    	}
+    	if(FeaturesNamespaces.URI_1_1_0.equalsIgnoreCase(uri)){
+    		return true;
+    	}
+    	if(FeaturesNamespaces.URI_CURRENT.equalsIgnoreCase(uri)){
+    		return true;
+    	}
+    	return false;
+    }
+    
     public boolean canHandle(File artifact) {
         try {
             if (artifact.isFile() && artifact.getName().endsWith(".xml")) {
                 Document doc = parse(artifact);
                 String name = doc.getDocumentElement().getLocalName();
                 String uri  = doc.getDocumentElement().getNamespaceURI();
-                if ("features".equals(name) && (uri == null || "".equals(uri) || "http://karaf.apache.org/xmlns/features/v1.0.0".equalsIgnoreCase(uri))) {
-                    return true;
+                if ("features".equals(name) ) {
+                	if(isKnownFeaturesURI(uri)){
+                        return true;
+                	} else {
+                		logger.error("unknown features uri", new Exception("" + uri));
+                	}
                 }
             }
         } catch (Exception e) {
diff --git a/features/core/src/main/java/org/apache/karaf/features/FeaturesNamespaces.java b/features/core/src/main/java/org/apache/karaf/features/FeaturesNamespaces.java
new file mode 100644
index 0000000..1a1bae2
--- /dev/null
+++ b/features/core/src/main/java/org/apache/karaf/features/FeaturesNamespaces.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.karaf.features;
+
+import javax.xml.namespace.QName;
+
+/**
+ * Provides features XML/XSD constants.
+ */
+public interface FeaturesNamespaces {
+
+    String URI_0_0_0 = "";
+    String URI_1_0_0 = "http://karaf.apache.org/xmlns/features/v1.0.0";
+    String URI_1_1_0 = "http://karaf.apache.org/xmlns/features/v1.1.0";
+
+    String URI_CURRENT = URI_1_1_0;
+
+    QName FEATURES_0_0_0 = new QName("features");
+    QName FEATURES_1_0_0 = new QName(URI_1_0_0, "features");
+    QName FEATURES_1_1_0 = new QName(URI_1_1_0, "features");
+
+    QName FEATURES_CURRENT = FEATURES_1_1_0;
+
+}
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/FeatureValidationUtil.java b/features/core/src/main/java/org/apache/karaf/features/internal/FeatureValidationUtil.java
index 9609daa..0b19fcb 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/FeatureValidationUtil.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/FeatureValidationUtil.java
@@ -29,6 +29,7 @@ import javax.xml.validation.Schema;
 import javax.xml.validation.SchemaFactory;
 import javax.xml.validation.Validator;
 
+import org.apache.karaf.features.FeaturesNamespaces;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesNamespaces.java b/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesNamespaces.java
deleted file mode 100644
index 9a798e6..0000000
--- a/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesNamespaces.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.features.internal;
-
-import javax.xml.namespace.QName;
-
-/**
- * Provides features XML/XSD constants.
- */
-public interface FeaturesNamespaces {
-
-    String URI_0_0_0 = "";
-    String URI_1_0_0 = "http://karaf.apache.org/xmlns/features/v1.0.0";
-    String URI_1_1_0 = "http://karaf.apache.org/xmlns/features/v1.1.0";
-
-    String URI_CURRENT = URI_1_1_0;
-
-    QName FEATURES_0_0_0 = new QName("features");
-    QName FEATURES_1_0_0 = new QName(URI_1_0_0, "features");
-    QName FEATURES_1_1_0 = new QName(URI_1_1_0, "features");
-
-    QName FEATURES_CURRENT = FEATURES_1_1_0;
-
-}
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/model/JaxbUtil.java b/features/core/src/main/java/org/apache/karaf/features/internal/model/JaxbUtil.java
index 46b9dda..e835e2a 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/model/JaxbUtil.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/model/JaxbUtil.java
@@ -35,7 +35,7 @@ import javax.xml.parsers.SAXParserFactory;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.transform.sax.SAXSource;
 
-import org.apache.karaf.features.internal.FeaturesNamespaces;
+import org.apache.karaf.features.FeaturesNamespaces;
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/model/package-info.java b/features/core/src/main/java/org/apache/karaf/features/internal/model/package-info.java
index d691c0a..02a597d 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/model/package-info.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/model/package-info.java
@@ -20,4 +20,5 @@
 @javax.xml.bind.annotation.XmlSchema(namespace = FeaturesNamespaces.URI_CURRENT, elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
 package org.apache.karaf.features.internal.model;
 
-import org.apache.karaf.features.internal.FeaturesNamespaces;
+import org.apache.karaf.features.FeaturesNamespaces;
+
diff --git a/tooling/karaf-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateDescriptorMojoTest.java b/tooling/karaf-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateDescriptorMojoTest.java
index 87062b5..9d11346 100644
--- a/tooling/karaf-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateDescriptorMojoTest.java
+++ b/tooling/karaf-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateDescriptorMojoTest.java
@@ -29,7 +29,7 @@ import javax.xml.bind.JAXBException;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.stream.XMLStreamException;
 
-import org.apache.karaf.features.internal.FeaturesNamespaces;
+import org.apache.karaf.features.FeaturesNamespaces;
 import org.apache.karaf.features.internal.model.Features;
 import org.apache.karaf.features.internal.model.Feature;
 import org.apache.karaf.features.internal.model.JaxbUtil;
-- 
1.7.9.5

