Mapsforge themes compatibility improvements #100, fix #392

This commit is contained in:
Emux
2017-09-05 13:29:22 +03:00
parent eddfa5a896
commit 07138f3240
6 changed files with 42 additions and 45 deletions

View File

@@ -17,6 +17,8 @@ package org.oscim.theme;
import org.oscim.theme.IRenderTheme.ThemeException;
import org.oscim.utils.Utils;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
@@ -45,7 +47,8 @@ public class StreamRenderTheme implements ThemeFile {
*/
public StreamRenderTheme(String relativePathPrefix, InputStream inputStream, XmlRenderThemeMenuCallback menuCallback) {
mRelativePathPrefix = relativePathPrefix;
mInputStream = inputStream;
mInputStream = new BufferedInputStream(inputStream);
mInputStream.mark(0);
mMenuCallback = menuCallback;
}
@@ -78,6 +81,11 @@ public class StreamRenderTheme implements ThemeFile {
@Override
public InputStream getRenderThemeAsStream() throws ThemeException {
try {
mInputStream.reset();
} catch (IOException e) {
throw new ThemeException(e.getMessage());
}
return mInputStream;
}

View File

@@ -48,7 +48,7 @@ public class ThemeLoader {
public static IRenderTheme load(ThemeFile theme, ThemeCallback themeCallback) throws ThemeException {
IRenderTheme t;
if (ThemeUtils.isMapsforgeTheme(theme.getRenderThemeAsStream()))
if (ThemeUtils.isMapsforgeTheme(theme))
t = USE_ATLAS ? XmlMapsforgeAtlasThemeBuilder.read(theme, themeCallback) : XmlMapsforgeThemeBuilder.read(theme, themeCallback);
else
t = USE_ATLAS ? XmlAtlasThemeBuilder.read(theme, themeCallback) : XmlThemeBuilder.read(theme, themeCallback);

View File

@@ -15,20 +15,15 @@
*/
package org.oscim.theme;
import org.oscim.utils.IOUtils;
import org.oscim.backend.XMLReaderAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import java.io.InputStream;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.xml.parsers.SAXParserFactory;
/**
* A utility class with theme specific helper methods.
*/
@@ -37,25 +32,21 @@ public final class ThemeUtils {
private static final Logger log = LoggerFactory.getLogger(ThemeUtils.class);
/**
* Check if the given InputStream is a Mapsforge render theme.
* Check if the given theme is a Mapsforge one.
*/
public static boolean isMapsforgeTheme(InputStream is) {
public static boolean isMapsforgeTheme(ThemeFile theme) {
try {
final AtomicBoolean isMapsforgeTheme = new AtomicBoolean(false);
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
xmlReader.setContentHandler(new DefaultHandler() {
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (localName.equals("rendertheme")) {
isMapsforgeTheme.set(uri.equals("http://mapsforge.org/renderTheme"));
// We have all info, break parsing
throw new SAXTerminationException();
}
}
});
try {
xmlReader.parse(new InputSource(is));
new XMLReaderAdapter().parse(new DefaultHandler() {
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (localName.equals("rendertheme")) {
isMapsforgeTheme.set(uri.equals("http://mapsforge.org/renderTheme"));
// We have all info, break parsing
throw new SAXTerminationException();
}
}
}, theme.getRenderThemeAsStream());
} catch (SAXTerminationException e) {
// Do nothing
}
@@ -63,8 +54,6 @@ public final class ThemeUtils {
} catch (Exception e) {
log.error(e.getMessage(), e);
return false;
} finally {
IOUtils.closeQuietly(is);
}
}