diff --git a/jsprit-core/src/main/java/algorithms/SchrimpfFactory.java b/jsprit-core/src/main/java/algorithms/SchrimpfFactory.java index 3142c4f4..c8363f73 100644 --- a/jsprit-core/src/main/java/algorithms/SchrimpfFactory.java +++ b/jsprit-core/src/main/java/algorithms/SchrimpfFactory.java @@ -20,8 +20,14 @@ ******************************************************************************/ package algorithms; +import java.io.File; +import java.net.MalformedURLException; import java.net.URL; +import util.Resource; + + + import basics.VehicleRoutingAlgorithm; import basics.VehicleRoutingProblem; import basics.io.AlgorithmConfig; @@ -57,9 +63,11 @@ public class SchrimpfFactory { */ public VehicleRoutingAlgorithm createAlgorithm(VehicleRoutingProblem vrp){ AlgorithmConfig algorithmConfig = new AlgorithmConfig(); - URL resource = this.getClass().getClassLoader().getResource("schrimpf.xml"); + URL resource = Resource.getAsURL("schrimpf.xml"); new AlgorithmConfigXmlReader(algorithmConfig).read(resource.getPath()); return VehicleRoutingAlgorithms.createAlgorithm(vrp, algorithmConfig); } + + } diff --git a/jsprit-core/src/main/java/algorithms/acceptors/SchrimpfAcceptance.java b/jsprit-core/src/main/java/algorithms/acceptors/SchrimpfAcceptance.java index 380d63d3..4a6035f6 100644 --- a/jsprit-core/src/main/java/algorithms/acceptors/SchrimpfAcceptance.java +++ b/jsprit-core/src/main/java/algorithms/acceptors/SchrimpfAcceptance.java @@ -26,6 +26,7 @@ import java.util.Collection; import org.apache.commons.math.stat.descriptive.moment.StandardDeviation; import org.apache.log4j.Logger; +import util.Resource; import util.Solutions; import algorithms.VehicleRoutingAlgorithms; import basics.VehicleRoutingAlgorithm; @@ -115,7 +116,7 @@ public class SchrimpfAcceptance implements SolutionAcceptor, IterationStartsList */ final double[] results = new double[nOfRandomWalks]; - URL resource = this.getClass().getClassLoader().getResource("randomWalk.xml"); + URL resource = Resource.getAsURL("randomWalk.xml"); AlgorithmConfig algorithmConfig = new AlgorithmConfig(); new AlgorithmConfigXmlReader(algorithmConfig).read(resource.getPath()); VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.createAlgorithm(problem, algorithmConfig); diff --git a/jsprit-core/src/main/java/basics/io/AlgorithmConfigXmlReader.java b/jsprit-core/src/main/java/basics/io/AlgorithmConfigXmlReader.java index c2479641..e2c1ce96 100644 --- a/jsprit-core/src/main/java/basics/io/AlgorithmConfigXmlReader.java +++ b/jsprit-core/src/main/java/basics/io/AlgorithmConfigXmlReader.java @@ -29,6 +29,8 @@ import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; +import util.Resource; + public class AlgorithmConfigXmlReader { private static Logger log = Logger.getLogger(AlgorithmConfigXmlReader.class); @@ -55,7 +57,7 @@ public class AlgorithmConfigXmlReader { algorithmConfig.getXMLConfiguration().setDelimiterParsingDisabled(true); if(schemaValidation){ - final URL resource = this.getClass().getClassLoader().getResource("algorithm_schema.xsd"); + final URL resource = Resource.getAsURL("algorithm_schema.xsd"); if(resource != null) { EntityResolver resolver = new EntityResolver() { diff --git a/jsprit-core/src/main/java/basics/io/VrpXMLReader.java b/jsprit-core/src/main/java/basics/io/VrpXMLReader.java index 0b0262a8..d4b43110 100644 --- a/jsprit-core/src/main/java/basics/io/VrpXMLReader.java +++ b/jsprit-core/src/main/java/basics/io/VrpXMLReader.java @@ -37,6 +37,7 @@ import org.xml.sax.InputSource; import org.xml.sax.SAXException; import util.Coordinate; +import util.Resource; import basics.Service; import basics.VehicleRoutingProblem; import basics.VehicleRoutingProblem.FleetComposition; @@ -97,7 +98,7 @@ public class VrpXMLReader{ xmlConfig.setDelimiterParsingDisabled(true); if(schemaValidation){ - final URL resource = this.getClass().getClassLoader().getResource("vrp_xml_schema.xsd"); + final URL resource = Resource.getAsURL("vrp_xml_schema.xsd"); if(resource != null) { EntityResolver resolver = new EntityResolver() { diff --git a/jsprit-core/src/main/java/util/Resource.java b/jsprit-core/src/main/java/util/Resource.java new file mode 100644 index 00000000..2d3ab1df --- /dev/null +++ b/jsprit-core/src/main/java/util/Resource.java @@ -0,0 +1,47 @@ +package util; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; + +import org.apache.log4j.Logger; + +import algorithms.SchrimpfFactory; + +/** + * This is a copy of MatsimResource.java (see matsim.org). + * + * It makes sure that resources can also be located within jar files, since it looks for resources in several places. + * + * @author stefan schroeder + * + */ +public class Resource { + + private static Logger log = Logger.getLogger(Resource.class); + + /** + * Returns URL from the relative path of a resource. + * + * @param filename + * @return + */ + public final static URL getAsURL(final String filename) { + // look for the file locally + File file = new File("/" + filename); + if (file.exists()) { + try { + return file.toURI().toURL(); + } catch (MalformedURLException e) { + log.warn("Found resource-file, but could not return URL for it.", e); // just continue, maybe we have more luck in the classpath + } + } + // maybe we find the file in the classpath, possibly inside a jar-file + URL url = SchrimpfFactory.class.getResource("/" + filename); + if (url == null) { + log.warn("Resource '" + filename + "' not found!"); + } + return url; + } + +} diff --git a/jsprit-core/src/test/java/algorithms/TestSchrimpf.java b/jsprit-core/src/test/java/algorithms/TestSchrimpf.java new file mode 100644 index 00000000..5e0a3fcf --- /dev/null +++ b/jsprit-core/src/test/java/algorithms/TestSchrimpf.java @@ -0,0 +1,17 @@ +package algorithms; + +import org.junit.Test; + +import basics.VehicleRoutingAlgorithm; +import basics.VehicleRoutingProblem; + +public class TestSchrimpf { + + @Test + public void whenUsingSchrimpfFactory_itFindsTheConfig(){ + + VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(VehicleRoutingProblem.newBuilderInstance().build()); + + } + +}