package net.osmand.plus.osmedit;
import net.osmand.PlatformUtil;
import net.osmand.osm.io.Base64;
import net.osmand.osm.io.NetworkUtils;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.osmedit.OsmPoint.Action;
import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URLEncoder;
public class OsmBugsRemoteUtil implements OsmBugsUtil {
private static final Log log = PlatformUtil.getLog(OsmBugsRemoteUtil.class);
private static final String GET = "GET";
private static final String POST = "POST";
static String getNotesApi() {
final int deviceApiVersion = android.os.Build.VERSION.SDK_INT;
String RETURN_API;
if (deviceApiVersion >= android.os.Build.VERSION_CODES.GINGERBREAD) {
RETURN_API = "https://api.openstreetmap.org/api/0.6/notes";
} else {
RETURN_API = "http://api.openstreetmap.org/api/0.6/notes";
}
return RETURN_API;
}
static String getUserDetailsApi() {
final int deviceApiVersion = android.os.Build.VERSION.SDK_INT;
String RETURN_API;
if (deviceApiVersion >= android.os.Build.VERSION_CODES.GINGERBREAD) {
RETURN_API = "https://api.openstreetmap.org/api/0.6/user/details";
} else {
RETURN_API = "http://api.openstreetmap.org/api/0.6/user/details";
}
return RETURN_API;
}
private OsmandApplication app;
private OsmandSettings settings;
public OsmBugsRemoteUtil(OsmandApplication app) {
this.app = app;
settings = app.getSettings();
}
@Override
public OsmBugResult commit(OsmNotesPoint point, String text, Action action) {
return commit(point, text, action, false);
}
public OsmBugResult commit(OsmNotesPoint point, String text, Action action, boolean anonymous) {
StringBuilder b = new StringBuilder();
String msg = "";
try {
if (action == OsmPoint.Action.CREATE) {
b.append(getNotesApi()).append("?"); //$NON-NLS-1$
b.append("lat=").append(point.getLatitude()); //$NON-NLS-1$
b.append("&lon=").append(point.getLongitude()); //$NON-NLS-1$
b.append("&text=").append(URLEncoder.encode(text, "UTF-8")); //$NON-NLS-1$
msg = "creating bug";
} else {
b.append(getNotesApi()).append("/");
b.append(point.getId()); //$NON-NLS-1$
if (action == OsmPoint.Action.REOPEN) {
b.append("/reopen");
msg = "reopen note";
} else if (action == OsmPoint.Action.MODIFY) {
b.append("/comment");
msg = "adding comment";
} else if (action == OsmPoint.Action.DELETE) {
b.append("/close");
msg = "close note";
}
b.append("?text=").append(URLEncoder.encode(text, "UTF-8")); //$NON-NLS-1$
}
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
if (!anonymous) {
OsmBugResult loginResult = validateLoginDetails();
if (loginResult.warning != null) {
return loginResult;
}
}
return editingPOI(b.toString(), POST, msg, anonymous);
}
public OsmBugResult validateLoginDetails() {
return editingPOI(getUserDetailsApi(), GET, "validate_login", false);
}
private OsmBugResult editingPOI(String url, String requestMethod, String userOperation,
boolean anonymous) {
OsmBugResult r = new OsmBugResult();
try {
HttpURLConnection connection = NetworkUtils.getHttpURLConnection(url);
log.info("Editing poi " + url);
connection.setConnectTimeout(15000);
connection.setRequestMethod(requestMethod);
connection.setRequestProperty("User-Agent", Version.getFullVersion(app)); //$NON-NLS-1$
if (!anonymous) {
String token = settings.USER_NAME.get() + ":" + settings.USER_PASSWORD.get(); //$NON-NLS-1$
connection.addRequestProperty("Authorization", "Basic " + Base64.encode(token.getBytes("UTF-8"))); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
connection.setDoInput(true);
connection.connect();
String msg = connection.getResponseMessage();
boolean ok = connection.getResponseCode() == HttpURLConnection.HTTP_OK;
log.info(msg); //$NON-NLS-1$
// populate return fields.
StringBuilder responseBody = Algorithms.readFromInputStream(connection.getInputStream());
log.info("Response : " + responseBody); //$NON-NLS-1$
connection.disconnect();
if (!ok) {
r.warning = msg + "\n" + responseBody;
}
} catch (FileNotFoundException | NullPointerException e) {
// that's tricky case why NPE is thrown to fix that problem httpClient could be used
String msg = app.getString(R.string.auth_failed);
log.error(msg, e);
r.warning = app.getString(R.string.auth_failed) + "";
} catch (MalformedURLException e) {
log.error(userOperation + " " + app.getString(R.string.failed_op), e); //$NON-NLS-1$
r.warning = e.getMessage() + "";
} catch (IOException e) {
log.error(userOperation + " " + app.getString(R.string.failed_op), e); //$NON-NLS-1$
r.warning = e.getMessage() + " link unavailable";
}
return r;
}
}