package org.geoserver.python.format;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import org.geoserver.platform.FileWatcher;
import org.geoserver.python.Python;
import org.python.core.PyException;
import org.python.core.PyFunction;
import org.python.core.PyObject;
import org.python.core.PyStringMap;
import org.python.util.PythonInterpreter;
public abstract class PythonFormatAdapter {
protected Python py;
protected FileWatcher<PyObject> fw;
protected PyObject pobj;
public PythonFormatAdapter(File module, Python py) {
this.py = py;
this.fw = new FileWatcher<PyObject>(module) {
@Override
protected PyObject parseFileContents(InputStream in) throws IOException {
PythonInterpreter pi = PythonFormatAdapter.this.py.interpreter();
pi.execfile(in);
PyStringMap locals = (PyStringMap) pi.getLocals();
for (Object o : locals.keys()) {
String key = (String) o;
PyObject obj = locals.__getitem__(key);
if (obj instanceof PyFunction ) {
try {
if (obj.__getattr__(getMarker()) != null) {
return obj;
}
}
catch(PyException e) {}
}
}
throw new IllegalStateException("No output format function found in "
+ fw.getFile().getAbsolutePath());
}
};
}
public String getName() {
return pyObject().__getattr__("name").toString();
}
public String getMimeType() {
return pyObject().__getattr__("mime").toString();
}
protected PyObject pyObject() {
if (fw.isModified()) {
synchronized (fw) {
if (fw.isModified()) {
try {
pobj = fw.read();
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
return pobj;
}
protected abstract String getMarker();
}