From 9d5ff9beac9a23817f83a029d33dd12cec68c87a Mon Sep 17 00:00:00 2001 From: Andrei Pozolotin Date: Sun, 26 Aug 2012 12:04:19 -0500 Subject: [PATCH] back port KARAF-1738 KARAF-1752 --- .../features/FeatureDeploymentListener.java | 28 ++- .../apache/karaf/features/FeaturesNamespaces.java | 37 +++ .../features/internal/FeatureValidationUtil.java | 2 + .../apache/karaf/features/karaf-features-1.1.0.xsd | 237 ++++++++++++++++++++ .../tooling/features/GenerateFeaturesXmlMojo.java | 40 +++- .../features/GenerateFeaturesXmlMojoTest.java | 47 ++++ .../src/test/resources/features-01.xml | 25 +++ 7 files changed, 409 insertions(+), 7 deletions(-) create mode 100644 features/core/src/main/java/org/apache/karaf/features/FeaturesNamespaces.java create mode 100644 features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.1.0.xsd create mode 100644 tooling/features-maven-plugin/src/test/resources/features-01.xml 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 edc6441..b598749 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 @@ -36,6 +36,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; @@ -88,14 +89,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 811937e..7e21690 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 @@ -56,6 +56,8 @@ public class FeatureValidationUtil { } SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + + /** FIXME should move to 1.1.0 ? */ // root element has namespace - we can use schema validation Schema schema = factory.newSchema(new StreamSource(FeatureValidationUtil.class .getResourceAsStream("/org/apache/karaf/features/karaf-features-1.0.0.xsd"))); diff --git a/features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.1.0.xsd b/features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.1.0.xsd new file mode 100644 index 0000000..7138573 --- /dev/null +++ b/features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.1.0.xsd @@ -0,0 +1,237 @@ + + + + + + Karaf website. + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojo.java b/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojo.java index 403303d..1891884 100644 --- a/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojo.java +++ b/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojo.java @@ -87,6 +87,19 @@ public class GenerateFeaturesXmlMojo extends MojoSupport { private ArtifactCollector collector; /** + * Installation mode. If present, generate "feature.install" attribute: + * + * Installation mode + * + * Can be either manual or auto. Specifies whether the feature should be automatically installed when + * dropped inside the deploy folder. Note: this attribute doesn't affect feature descriptors that are installed + * from the feature:install command or as part of the etc/org.apache.karaf.features.cfg file. + * + * @parameter + */ + protected String installMode; + + /** * The file to generate * * @parameter default-value="${project.build.directory}/classes/feature.xml" @@ -524,12 +537,12 @@ public class GenerateFeaturesXmlMojo extends MojoSupport { return String.format("%s/%s/%s/%s", artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), artifact.getType()); } - private class Feature { + /*package*/ class Feature { private Stack artifacts = new Stack(); private final Artifact artifact; - private Feature(Artifact artifact) { + /*package*/ Feature(Artifact artifact) { super(); this.artifact = artifact; artifacts.push(artifact); @@ -547,10 +560,25 @@ public class GenerateFeaturesXmlMojo extends MojoSupport { } return false; } + + private String writeAttr(String name, String value){ + return " " + name + "=" + "'" + value + "'" + " "; + } public void write(PrintStream out) { - out.println(" "); + + out.print( + " "); Stack resulting = new Stack(); resulting.addAll(artifacts); @@ -575,7 +603,9 @@ public class GenerateFeaturesXmlMojo extends MojoSupport { } } } - out.println(" "); + + out.println(" "); + } public List getDependencies() { diff --git a/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojoTest.java b/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojoTest.java index bb1f073..21846d5 100644 --- a/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojoTest.java +++ b/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojoTest.java @@ -16,7 +16,14 @@ */ package org.apache.karaf.tooling.features; +import java.io.ByteArrayOutputStream; +import java.io.FileOutputStream; +import java.io.PrintStream; +import java.io.StringWriter; + +import org.apache.karaf.tooling.features.GenerateFeaturesXmlMojo.Feature; import org.apache.maven.artifact.Artifact; +import org.codehaus.plexus.util.FileUtils; import org.easymock.EasyMock; import static org.easymock.EasyMock.*; @@ -28,6 +35,14 @@ import junit.framework.TestCase; */ public class GenerateFeaturesXmlMojoTest extends TestCase { + private GenerateFeaturesXmlMojo mojo; + + @Override + protected void setUp() throws Exception { + super.setUp(); + mojo = new GenerateFeaturesXmlMojo(); + } + public void testToString() throws Exception { Artifact artifact = EasyMock.createMock(Artifact.class); @@ -41,4 +56,36 @@ public class GenerateFeaturesXmlMojoTest extends TestCase { assertEquals("org.apache.karaf.test/test-artifact/1.2.3", GenerateFeaturesXmlMojo.toString(artifact)); } + public void testInstallMode() throws Exception { + + Artifact artifact = EasyMock.createMock(Artifact.class); + + expect(artifact.getGroupId()).andReturn("org.apache.karaf.test").anyTimes(); + expect(artifact.getArtifactId()).andReturn("test-artifact").anyTimes(); + expect(artifact.getBaseVersion()).andReturn("1.2.3").anyTimes(); + expect(artifact.getVersion()).andReturn("1.2.3").anyTimes(); + expect(artifact.getType()).andReturn("jar").anyTimes(); + + replay(artifact); + + mojo.installMode="auto"; + + Feature feature = mojo.new Feature(artifact); + + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + + PrintStream out = new PrintStream(byteStream); + + feature.write(out); + + String source = byteStream.toString("UTF-8"); + + System.out.println(source); + + String target = FileUtils.fileRead("./src/test/resources/features-01.xml", "UTF-8"); + + assertTrue(target.contains(source)); + + } + } diff --git a/tooling/features-maven-plugin/src/test/resources/features-01.xml b/tooling/features-maven-plugin/src/test/resources/features-01.xml new file mode 100644 index 0000000..2f9ea50 --- /dev/null +++ b/tooling/features-maven-plugin/src/test/resources/features-01.xml @@ -0,0 +1,25 @@ + + + + + + mvn:org.apache.karaf.test/test-artifact/1.2.3 + + + -- 1.7.9.5