You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by io...@apache.org on 2014/07/10 17:05:41 UTC
git commit: [KARAF-3111] Add the ability to specify text and binary
resources (as overrides) in InstanceSettings, create and clone commands.
Repository: karaf
Updated Branches:
refs/heads/karaf-2.x 19e2415e1 -> 4d0b29667
[KARAF-3111] Add the ability to specify text and binary resources (as overrides) in InstanceSettings, create and clone commands.
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/4d0b2966
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/4d0b2966
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/4d0b2966
Branch: refs/heads/karaf-2.x
Commit: 4d0b29667bf3047a685a8deb44d4ea56a7a35c2b
Parents: 19e2415
Author: Ioannis Canellos <io...@gmail.com>
Authored: Thu Jul 10 17:50:18 2014 +0300
Committer: Ioannis Canellos <io...@gmail.com>
Committed: Thu Jul 10 17:50:48 2014 +0300
----------------------------------------------------------------------
.../admin/command/AdminCommandSupport.java | 19 ++++
.../karaf/admin/command/CloneCommand.java | 17 +++-
.../karaf/admin/command/CreateCommand.java | 22 ++++-
.../apache/karaf/admin/InstanceSettings.java | 29 ++++++-
.../karaf/admin/internal/AdminServiceImpl.java | 91 +++++++++++---------
.../admin/internal/AdminServiceImplTest.java | 15 ++++
admin/core/src/test/resources/myresource | 20 +++++
7 files changed, 161 insertions(+), 52 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/4d0b2966/admin/command/src/main/java/org/apache/karaf/admin/command/AdminCommandSupport.java
----------------------------------------------------------------------
diff --git a/admin/command/src/main/java/org/apache/karaf/admin/command/AdminCommandSupport.java b/admin/command/src/main/java/org/apache/karaf/admin/command/AdminCommandSupport.java
index e830076..7041c4f 100644
--- a/admin/command/src/main/java/org/apache/karaf/admin/command/AdminCommandSupport.java
+++ b/admin/command/src/main/java/org/apache/karaf/admin/command/AdminCommandSupport.java
@@ -20,6 +20,12 @@ import org.apache.karaf.admin.AdminService;
import org.apache.karaf.admin.Instance;
import org.apache.karaf.shell.console.OsgiCommandSupport;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
public abstract class AdminCommandSupport extends OsgiCommandSupport {
private AdminService adminService;
@@ -39,4 +45,17 @@ public abstract class AdminCommandSupport extends OsgiCommandSupport {
}
return i;
}
+
+ protected static Map<String, URL> getResources(List<String> resources) throws MalformedURLException {
+ Map<String, URL> result = new HashMap<String, URL>();
+ if (resources != null) {
+ for(String resource : resources) {
+ String path = resource.substring(0, resource.indexOf("="));
+ String location = resource.substring(path.length() + 1);
+ URL url = new URL(location);
+ result.put(path, url);
+ }
+ }
+ return result;
+ }
}
http://git-wip-us.apache.org/repos/asf/karaf/blob/4d0b2966/admin/command/src/main/java/org/apache/karaf/admin/command/CloneCommand.java
----------------------------------------------------------------------
diff --git a/admin/command/src/main/java/org/apache/karaf/admin/command/CloneCommand.java b/admin/command/src/main/java/org/apache/karaf/admin/command/CloneCommand.java
index 2ee26f8..0daac2f 100644
--- a/admin/command/src/main/java/org/apache/karaf/admin/command/CloneCommand.java
+++ b/admin/command/src/main/java/org/apache/karaf/admin/command/CloneCommand.java
@@ -21,6 +21,10 @@ import org.apache.felix.gogo.commands.Command;
import org.apache.felix.gogo.commands.Option;
import org.apache.karaf.admin.InstanceSettings;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
/**
* Clone an existing instance.
*/
@@ -45,15 +49,24 @@ public class CloneCommand extends AdminCommandSupport {
@Option(name = "-v", aliases = {"--verbose"}, description = "Display actions performed by the command (disabled by default)", required = false, multiValued = false)
boolean verbose = false;
+ @Option(name = "-tr", aliases = {"--text-resource"},
+ description = "Add a text resource to the instance", required = false, multiValued = true)
+ List<String> textResourceLocation;
+
+ @Option(name = "-br", aliases = {"--binary-resource"},
+ description = "Add a text resource to the instance", required = false, multiValued = true)
+ List<String> binaryResourceLocations;
+
@Argument(index = 0, name = "name", description = "The name of the source container instance", required = true, multiValued = false)
String name;
@Argument(index = 1, name = "cloneName", description = "The name of the cloned container instance", required = true, multiValued = false)
String cloneName;
-
protected Object doExecute() throws Exception {
- InstanceSettings settings = new InstanceSettings(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, null, null);
+ Map<String, URL> textResources = getResources(textResourceLocation);
+ Map<String, URL> binaryResources = getResources(binaryResourceLocations);
+ InstanceSettings settings = new InstanceSettings(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, null, null, textResources, binaryResources);
getAdminService().cloneInstance(name, cloneName, settings);
return null;
}
http://git-wip-us.apache.org/repos/asf/karaf/blob/4d0b2966/admin/command/src/main/java/org/apache/karaf/admin/command/CreateCommand.java
----------------------------------------------------------------------
diff --git a/admin/command/src/main/java/org/apache/karaf/admin/command/CreateCommand.java b/admin/command/src/main/java/org/apache/karaf/admin/command/CreateCommand.java
index 8c34554..6e7439c 100644
--- a/admin/command/src/main/java/org/apache/karaf/admin/command/CreateCommand.java
+++ b/admin/command/src/main/java/org/apache/karaf/admin/command/CreateCommand.java
@@ -16,7 +16,12 @@
*/
package org.apache.karaf.admin.command;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
import org.apache.felix.gogo.commands.Argument;
import org.apache.felix.gogo.commands.Command;
@@ -31,6 +36,9 @@ import org.apache.karaf.features.command.completers.FeatureRepositoryCompleter;
@Command(scope = "admin", name = "create", description = "Creates a new container instance.")
public class CreateCommand extends AdminCommandSupport
{
+
+ private static final Pattern RESOURCE_PATTERN= Pattern.compile("([a-zA-Z0-9_.-]+[/\\\\]*)");
+
@Option(name = "-s", aliases = {"--ssh-port"}, description = "Port number for remote secure shell connection", required = false, multiValued = false)
int sshPort = 0;
@@ -54,13 +62,21 @@ public class CreateCommand extends AdminCommandSupport
description = "Additional feature descriptor URLs. This option can be specified multiple times to add multiple URLs", required = false, multiValued = true)
List<String> featureURLs;
+ @Option(name = "-tr", aliases = {"--text-resource"},
+ description = "Add a text resource to the instance", required = false, multiValued = true)
+ List<String> textResourceLocation;
+
+ @Option(name = "-br", aliases = {"--binary-resource"},
+ description = "Add a text resource to the instance", required = false, multiValued = true)
+ List<String> binaryResourceLocations;
+
@Argument(index = 0, name = "name", description="The name of the new container instance", required = true, multiValued = false)
String instance = null;
-
protected Object doExecute() throws Exception {
- InstanceSettings settings = new InstanceSettings(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, featureURLs, features);
+ Map<String, URL> textResources = getResources(textResourceLocation);
+ Map<String, URL> binaryResources = getResources(binaryResourceLocations);
+ InstanceSettings settings = new InstanceSettings(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, featureURLs, features, textResources, binaryResources);
getAdminService().createInstance(instance, settings);
return null;
}
-
}
http://git-wip-us.apache.org/repos/asf/karaf/blob/4d0b2966/admin/core/src/main/java/org/apache/karaf/admin/InstanceSettings.java
----------------------------------------------------------------------
diff --git a/admin/core/src/main/java/org/apache/karaf/admin/InstanceSettings.java b/admin/core/src/main/java/org/apache/karaf/admin/InstanceSettings.java
index 9b068cf..c3b9bed 100644
--- a/admin/core/src/main/java/org/apache/karaf/admin/InstanceSettings.java
+++ b/admin/core/src/main/java/org/apache/karaf/admin/InstanceSettings.java
@@ -16,7 +16,12 @@
*/
package org.apache.karaf.admin;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
public class InstanceSettings {
private final int sshPort;
@@ -26,15 +31,23 @@ public class InstanceSettings {
private final String javaOpts;
private final List<String> featureURLs;
private final List<String> features;
+ private final Map<String, URL> textResources;
+ private final Map<String, URL> binaryResources;
public InstanceSettings(int sshPort, int rmiRegistryPort, int rmiServerPort, String location, String javaOpts, List<String> featureURLs, List<String> features) {
+ this(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, featureURLs, features, new HashMap<String, URL>(), new HashMap<String, URL>());
+ }
+
+ public InstanceSettings(int sshPort, int rmiRegistryPort, int rmiServerPort, String location, String javaOpts, List<String> featureURLs, List<String> features, Map<String, URL> textResources, Map<String, URL> binaryResources) {
this.sshPort = sshPort;
this.rmiRegistryPort = rmiRegistryPort;
this.rmiServerPort = rmiServerPort;
this.location = location;
this.javaOpts = javaOpts;
- this.featureURLs = featureURLs;
- this.features = features;
+ this.featureURLs = featureURLs != null ? featureURLs : new ArrayList<String>();
+ this.features = features != null ? features : new ArrayList<String>();
+ this.textResources = textResources != null ? textResources : new HashMap<String, URL>();
+ this.binaryResources = binaryResources != null ? binaryResources : new HashMap<String, URL>();
}
public int getSshPort() {
@@ -58,11 +71,19 @@ public class InstanceSettings {
}
public List<String> getFeatureURLs() {
- return featureURLs;
+ return Collections.unmodifiableList(featureURLs);
}
public List<String> getFeatures() {
- return features;
+ return Collections.unmodifiableList(features);
+ }
+
+ public Map<String, URL> getTextResources() {
+ return Collections.unmodifiableMap(textResources);
+ }
+
+ public Map<String, URL> getBinaryResources() {
+ return Collections.unmodifiableMap(binaryResources);
}
@Override
http://git-wip-us.apache.org/repos/asf/karaf/blob/4d0b2966/admin/core/src/main/java/org/apache/karaf/admin/internal/AdminServiceImpl.java
----------------------------------------------------------------------
diff --git a/admin/core/src/main/java/org/apache/karaf/admin/internal/AdminServiceImpl.java b/admin/core/src/main/java/org/apache/karaf/admin/internal/AdminServiceImpl.java
index 9e0c7d5..bced7b9 100644
--- a/admin/core/src/main/java/org/apache/karaf/admin/internal/AdminServiceImpl.java
+++ b/admin/core/src/main/java/org/apache/karaf/admin/internal/AdminServiceImpl.java
@@ -17,8 +17,6 @@
package org.apache.karaf.admin.internal;
import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -29,11 +27,9 @@ import java.io.InputStreamReader;
import java.io.InterruptedIOException;
import java.io.OutputStream;
import java.io.PrintStream;
-import java.io.RandomAccessFile;
import java.net.Socket;
import java.net.URL;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedHashMap;
@@ -41,8 +37,6 @@ import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Scanner;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
import org.apache.karaf.admin.AdminService;
import org.apache.karaf.admin.Instance;
@@ -266,30 +260,33 @@ public class AdminServiceImpl implements AdminService {
mkdir(karafBase, "deploy");
mkdir(karafBase, "data");
- copyResourceToDir(karafBase, "etc/all.policy", true);
- copyResourceToDir(karafBase, "etc/config.properties", true);
- copyResourceToDir(karafBase, "etc/custom.properties", true);
- copyResourceToDir(karafBase, "etc/java.util.logging.properties", true);
- copyResourceToDir(karafBase, "etc/jmx.acl.cfg", true);
- copyResourceToDir(karafBase, "etc/jmx.acl.java.lang.Memory.cfg", true);
- copyResourceToDir(karafBase, "etc/jmx.acl.org.apache.karaf.bundle.cfg", true);
- copyResourceToDir(karafBase, "etc/jmx.acl.org.apache.karaf.config.cfg", true);
- copyResourceToDir(karafBase, "etc/jmx.acl.org.apache.karaf.security.jmx.cfg", true);
- copyResourceToDir(karafBase, "etc/jmx.acl.osgi.compendium.cm.cfg", true);
- copyResourceToDir(karafBase, "etc/jre.properties", true);
- copyResourceToDir(karafBase, "etc/keys.properties", true);
- copyResourceToDir(karafBase, "etc/org.apache.felix.fileinstall-deploy.cfg", true);
- copyResourceToDir(karafBase, FEATURES_CFG, true);
- copyResourceToDir(karafBase, "etc/org.apache.karaf.features.obr.cfg", true);
- copyResourceToDir(karafBase, "etc/org.apache.karaf.features.repos.cfg", true);
- copyResourceToDir(karafBase, "etc/org.apache.karaf.jaas.cfg", true);
- copyResourceToDir(karafBase, "etc/org.apache.karaf.kar.cfg", true);
- copyResourceToDir(karafBase, "etc/org.apache.karaf.log.cfg", true);
- copyResourceToDir(karafBase, "etc/org.ops4j.pax.logging.cfg", true);
- copyResourceToDir(karafBase, "etc/org.ops4j.pax.url.mvn.cfg", true);
- copyResourceToDir(karafBase, "etc/shell.init.script", true);
- copyResourceToDir(karafBase, "etc/startup.properties", true);
- copyResourceToDir(karafBase, "etc/users.properties", true);
+ Map<String, URL> textResources = new HashMap<String, URL>(settings.getTextResources());
+ Map<String, URL> binaryResources = new HashMap<String, URL>(settings.getBinaryResources());
+
+ copyResourceToDir(karafBase, "etc/all.policy", true, textResources);
+ copyResourceToDir(karafBase, "etc/config.properties", true, textResources);
+ copyResourceToDir(karafBase, "etc/custom.properties", true, textResources);
+ copyResourceToDir(karafBase, "etc/java.util.logging.properties", true, textResources);
+ copyResourceToDir(karafBase, "etc/jmx.acl.cfg", true, textResources);
+ copyResourceToDir(karafBase, "etc/jmx.acl.java.lang.Memory.cfg", true, textResources);
+ copyResourceToDir(karafBase, "etc/jmx.acl.org.apache.karaf.bundle.cfg", true, textResources);
+ copyResourceToDir(karafBase, "etc/jmx.acl.org.apache.karaf.config.cfg", true, textResources);
+ copyResourceToDir(karafBase, "etc/jmx.acl.org.apache.karaf.security.jmx.cfg", true, textResources);
+ copyResourceToDir(karafBase, "etc/jmx.acl.osgi.compendium.cm.cfg", true, textResources);
+ copyResourceToDir(karafBase, "etc/jre.properties", true, textResources);
+ copyResourceToDir(karafBase, "etc/keys.properties", true, textResources);
+ copyResourceToDir(karafBase, "etc/org.apache.felix.fileinstall-deploy.cfg", true, textResources);
+ copyResourceToDir(karafBase, FEATURES_CFG, true, textResources);
+ copyResourceToDir(karafBase, "etc/org.apache.karaf.features.obr.cfg", true, textResources);
+ copyResourceToDir(karafBase, "etc/org.apache.karaf.features.repos.cfg", true, textResources);
+ copyResourceToDir(karafBase, "etc/org.apache.karaf.jaas.cfg", true, textResources);
+ copyResourceToDir(karafBase, "etc/org.apache.karaf.kar.cfg", true, textResources);
+ copyResourceToDir(karafBase, "etc/org.apache.karaf.log.cfg", true, textResources);
+ copyResourceToDir(karafBase, "etc/org.ops4j.pax.logging.cfg", true, textResources);
+ copyResourceToDir(karafBase, "etc/org.ops4j.pax.url.mvn.cfg", true, textResources);
+ copyResourceToDir(karafBase, "etc/shell.init.script", true, textResources);
+ copyResourceToDir(karafBase, "etc/startup.properties", true, textResources);
+ copyResourceToDir(karafBase, "etc/users.properties", true, textResources);
HashMap<String, String> props = new HashMap<String, String>();
props.put("${SUBST-KARAF-NAME}", name);
@@ -298,20 +295,20 @@ public class AdminServiceImpl implements AdminService {
props.put("${SUBST-SSH-PORT}", Integer.toString(sshPort));
props.put("${SUBST-RMI-REGISTRY-PORT}", Integer.toString(rmiRegistryPort));
props.put("${SUBST-RMI-SERVER-PORT}", Integer.toString(rmiServerPort));
- copyFilteredResourceToDir(karafBase, "etc/system.properties", props);
- copyFilteredResourceToDir(karafBase, "etc/org.apache.karaf.shell.cfg", props);
- copyFilteredResourceToDir(karafBase, "etc/org.apache.karaf.management.cfg", props);
+ copyFilteredResourceToDir("etc/system.properties", karafBase, textResources, props);
+ copyFilteredResourceToDir("etc/org.apache.karaf.shell.cfg", karafBase, textResources, props);
+ copyFilteredResourceToDir("etc/org.apache.karaf.management.cfg", karafBase, textResources, props);
// If we use batch files, use batch files, else use bash scripts (even on cygwin)
boolean windows = System.getProperty("os.name").startsWith("Win");
boolean cygwin = windows && new File(System.getProperty("karaf.home"), "bin/admin").exists();
if (windows && !cygwin) {
- copyFilteredResourceToDir(karafBase, "bin/karaf.bat", props);
- copyFilteredResourceToDir(karafBase, "bin/start.bat", props);
- copyFilteredResourceToDir(karafBase, "bin/stop.bat", props);
+ copyFilteredResourceToDir("bin/karaf.bat", karafBase, textResources, props);
+ copyFilteredResourceToDir("bin/start.bat", karafBase, textResources, props);
+ copyFilteredResourceToDir("bin/stop.bat", karafBase, textResources, props);
} else {
- copyFilteredResourceToDir(karafBase, "bin/karaf", props);
- copyFilteredResourceToDir(karafBase, "bin/start", props);
- copyFilteredResourceToDir(karafBase, "bin/stop", props);
+ copyFilteredResourceToDir("bin/karaf", karafBase, textResources, props);
+ copyFilteredResourceToDir("bin/start", karafBase, textResources, props);
+ copyFilteredResourceToDir("bin/stop", karafBase, textResources, props);
if (!cygwin) {
chmod(new File(karafBase, "bin/karaf"), "a+x");
chmod(new File(karafBase, "bin/start"), "a+x");
@@ -321,6 +318,14 @@ public class AdminServiceImpl implements AdminService {
handleFeatures(new File(karafBase, FEATURES_CFG), settings);
+ for (String resource : textResources.keySet()) {
+ copyFilteredResourceToDir(resource, karafBase, textResources, props);
+ }
+
+ for (String resource : binaryResources.keySet()) {
+ copyResourceToDir(karafBase, resource, false, binaryResources);
+ }
+
String javaOpts = settings.getJavaOpts();
if (javaOpts == null || javaOpts.length() == 0) {
javaOpts = DEFAULT_JAVA_OPTS;
@@ -856,11 +861,11 @@ public class AdminServiceImpl implements AdminService {
return result;
}
- private void copyResourceToDir(File target, String resource, boolean text) throws IOException {
+ private void copyResourceToDir(File target, String resource, boolean text, Map<String, URL> resources) throws IOException {
File outFile = new File(target, resource);
if( !outFile.exists() ) {
println(Ansi.ansi().a("Creating file: ").a(Ansi.Attribute.INTENSITY_BOLD).a(outFile.getPath()).a(Ansi.Attribute.RESET).toString());
- InputStream is = getClass().getClassLoader().getResourceAsStream("org/apache/karaf/admin/" + resource);
+ InputStream is = resources.containsKey(resource) ? resources.remove(resource).openStream() : getClass().getClassLoader().getResourceAsStream("org/apache/karaf/admin/" + resource);
try {
if( text ) {
// Read it line at a time so that we can use the platform line ending when we write it out.
@@ -934,11 +939,11 @@ public class AdminServiceImpl implements AdminService {
bak.delete();
}
- private void copyFilteredResourceToDir(File target, String resource, HashMap<String, String> props) throws IOException {
+ private void copyFilteredResourceToDir(String resource, File target, Map<String, URL> resources, HashMap<String, String> props) throws IOException {
File outFile = new File(target, resource);
if( !outFile.exists() ) {
println(Ansi.ansi().a("Creating file: ").a(Ansi.Attribute.INTENSITY_BOLD).a(outFile.getPath()).a(Ansi.Attribute.RESET).toString());
- InputStream is = getClass().getClassLoader().getResourceAsStream("org/apache/karaf/admin/" + resource);
+ InputStream is = resources.containsKey(resource) ? resources.remove(resource).openStream() : getClass().getClassLoader().getResourceAsStream("org/apache/karaf/admin/" + resource);
copyAndFilterResource(is, new FileOutputStream(outFile), props);
}
}
http://git-wip-us.apache.org/repos/asf/karaf/blob/4d0b2966/admin/core/src/test/java/org/apache/karaf/admin/internal/AdminServiceImplTest.java
----------------------------------------------------------------------
diff --git a/admin/core/src/test/java/org/apache/karaf/admin/internal/AdminServiceImplTest.java b/admin/core/src/test/java/org/apache/karaf/admin/internal/AdminServiceImplTest.java
index cb917d6..049976d 100644
--- a/admin/core/src/test/java/org/apache/karaf/admin/internal/AdminServiceImplTest.java
+++ b/admin/core/src/test/java/org/apache/karaf/admin/internal/AdminServiceImplTest.java
@@ -22,7 +22,10 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.net.URL;
import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Properties;
import junit.framework.TestCase;
@@ -88,6 +91,18 @@ public class AdminServiceImplTest extends TestCase {
assertFileExists(instance.getLocation(), "etc/org.ops4j.pax.url.mvn.cfg");
}
+ public void testTextResources() throws Exception {
+ AdminServiceImpl service = new AdminServiceImpl();
+ service.setStorageLocation(new File("target/instances/" + System.currentTimeMillis()));
+ Map<String, URL> textResources = new HashMap<String, URL>();
+ textResources.put("etc/myresource", getClass().getClassLoader().getResource("myresource"));
+
+ InstanceSettings settings = new InstanceSettings(8122, 1122, 44444, getName(), null, null, null, textResources, new HashMap<String, URL>());
+ Instance instance = service.createInstance(getName(), settings);
+
+ assertFileExists(instance.getLocation(), "etc/myresource");
+ }
+
/**
* <p>
* Test the renaming of an existing instance.
http://git-wip-us.apache.org/repos/asf/karaf/blob/4d0b2966/admin/core/src/test/resources/myresource
----------------------------------------------------------------------
diff --git a/admin/core/src/test/resources/myresource b/admin/core/src/test/resources/myresource
new file mode 100644
index 0000000..1616b25
--- /dev/null
+++ b/admin/core/src/test/resources/myresource
@@ -0,0 +1,20 @@
+################################################################################
+#
+# 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.
+#
+################################################################################
+
+Yet another empty file!
\ No newline at end of file