@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user