diff --git a/TugasBesar2_2017/WebService/build.gradle b/TugasBesar2_2017/WebService/build.gradle new file mode 100644 index 0000000000000000000000000000000000000000..06603644342c36e684eea0a34ef635dcb40fcafd --- /dev/null +++ b/TugasBesar2_2017/WebService/build.gradle @@ -0,0 +1,23 @@ +plugins { + id 'java' + id 'war' + id 'org.akhikhl.gretty' +} + +dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') + + compile project(':SharedLibrary') + + // https://mvnrepository.com/artifact/junit/junit + testCompile 'junit:junit:4.12' + // https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api + providedCompile 'javax.servlet:javax.servlet-api:4.0.0' + // https://mvnrepository.com/artifact/com.google.code.gson/gson + compile 'com.google.code.gson:gson:2.8.2' + + // https://mvnrepository.com/artifact/com.sun.xml.ws/jaxws-ri + gretty 'com.sun.xml.ws:jaxws-ri:2.3.0' + // https://mvnrepository.com/artifact/mysql/mysql-connector-java + gretty 'mysql:mysql-connector-java:8.0.8-dmr' +} diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/OjekOnline.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/OjekOnline.java new file mode 100644 index 0000000000000000000000000000000000000000..a8a3a6f7aba3270a7a11b609b43628fbe40f019c --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/OjekOnline.java @@ -0,0 +1,129 @@ +package com.adaapa.ojekservice; + +import com.adaapa.ojekservice.handlers.DriverHandler; +import com.adaapa.ojekservice.handlers.OrderHandler; +import com.adaapa.ojekservice.handlers.ProfileHandler; +import com.google.gson.Gson; +import javax.jws.WebMethod; +import javax.jws.WebParam; +import javax.jws.WebService; +import javax.jws.soap.SOAPBinding; + +@SOAPBinding(style = SOAPBinding.Style.RPC) +@WebService() +public class OjekOnline { + private Gson gson = new Gson(); + @WebMethod(operationName = "getProfile") + public String getProfile(@WebParam(name = "access_token") String access_token) + { + return ProfileHandler.doGetProfile(access_token); + } + + @WebMethod + public String addUser( + @WebParam(name = "access_token") String access_token, + @WebParam(name = "user") String user) { + //Redone registering user here, without password but with isdriver status + return ProfileHandler.doAddUser(access_token, user); + } + + @WebMethod + public String getDriverProfile(@WebParam(name = "access_token") String access_token) { + return DriverHandler.doGetDriverProfile(access_token); + } + + @WebMethod(operationName = "getPreferredLocation") + public String getPreferredLocations( + @WebParam(name = "access_token") String access_token) { + return DriverHandler.doGetPreferredLocation(access_token); + } + + @WebMethod + public String addPreferredLocation( + @WebParam(name = "access_token") String access_token, + @WebParam(name = "location") String location) { + return DriverHandler.doAddPreferredLocation(access_token, location); + } + + @WebMethod + public String editProfile( + @WebParam(name = "access_token") String access_token, + @WebParam(name = "user") String user) { + return ProfileHandler.doEditProfile(access_token,user); + } + + @WebMethod + public String findDriver ( + @WebParam(name = "access_token") String access_token, + @WebParam(name = "driver_name") String driver_name) { + return OrderHandler.doFindDriver(access_token, driver_name); + } + + @WebMethod + public String findDriverByPreferredLocation ( + @WebParam(name ="access_token") String access_token, + @WebParam(name = "pickup") String pickup, + @WebParam(name = "destination") String destination){ + return OrderHandler.doFindDriverByPreferredLocation(access_token, pickup, destination); + } + + @WebMethod + public String completeOrder( + @WebParam(name = "access_token") String access_token, + @WebParam(name = "order") String order) { + return OrderHandler.doCompleteOrder(access_token, order); + } + + @WebMethod + public String getUserHistory( + @WebParam(name = "access_token") String access_token + ) { + return OrderHandler.doGetUserHistory(access_token); + } + + @WebMethod + public String getDriverHistory( + @WebParam(name = "access_token") String access_token + ) { + return OrderHandler.doGetDriverHistory(access_token); + } + + @WebMethod + public String hideDriverHistory( + @WebParam(name = "access_token") String access_token, + @WebParam(name = "order_id") Integer order_id) { + return OrderHandler.doDriverHideHistory(access_token, order_id); + + } + + @WebMethod + public String hideUserHistory( + @WebParam(name = "access_token") String access_token, + @WebParam(name = "order_id") Integer order_id) { + return OrderHandler.doUserHideHistory(access_token, order_id); + } + + @WebMethod + public String deletePreferredLocation( + @WebParam(name = "access_token") String access_token, + @WebParam(name = "position") Integer position + ) { + return DriverHandler.doDeletePreferredLocation(access_token,position); + } + + @WebMethod + public String editPreferredLocation( + @WebParam(name = "access_token") String access_token, + @WebParam(name = "position") Integer position, + @WebParam(name = "location") String location + ) { + return DriverHandler.doUpdatePreferredLocation(access_token, position, location); + } + + @WebMethod + public String findDriverByUsername(String access_token, String username) { + return DriverHandler.doFindDriverByUsername(access_token, username); + } +} + + diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/DriverHandler.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/DriverHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..13592f2fa8f40bf106bc8549d61018e7c1504a8b --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/DriverHandler.java @@ -0,0 +1,145 @@ +package com.adaapa.ojekservice.handlers; + +import com.adaapa.bean.DriverBean; +import com.adaapa.bean.PreferredLocationBean; +import com.adaapa.bean.UserBean; +import com.adaapa.bean.WebServiceBean; +import com.adaapa.ojekservice.models.DriverModel; +import com.adaapa.ojekservice.models.UserModel; +import com.adaapa.ojekservice.services.TokenVerificationService; +import com.google.gson.Gson; +import java.sql.ResultSet; +import java.util.ArrayList; + +public class DriverHandler { + public static String doGetPreferredLocation(String access_token) { + try { + WebServiceBean response = new WebServiceBean(); + UserModel userModel = new UserModel(); + UserBean validUser = TokenVerificationService.verifyToken(access_token); + if(validUser != null) { + DriverModel driverModel = new DriverModel(); + ArrayList<PreferredLocationBean> preferredLocationArray = driverModel.findPreferredLocation(validUser.getUsername()); + response.setStatus(WebServiceBean.STATUS_VALID); + response.setBody(new Gson().toJson(preferredLocationArray)); + } else { + response.setStatus(WebServiceBean.STATUS_INVALID); + } + return new Gson().toJson(response); + }catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static String doGetDriverProfile(String access_token) { + try { + WebServiceBean response = new WebServiceBean(); + UserModel userModel = new UserModel(); + UserBean validUser = TokenVerificationService.verifyToken(access_token); + if(validUser != null) { + DriverModel driverModel = new DriverModel(); + DriverBean driverBean = new DriverBean(); + driverBean.setVote(driverModel.countVote(validUser.username)); + driverBean.setName(validUser.getName()); + driverBean.setRating(driverModel.calculateRating(validUser.username)); + response.setStatus(WebServiceBean.STATUS_VALID); + response.setBody(new Gson().toJson(driverBean)); + } else { + response.setStatus(WebServiceBean.STATUS_INVALID); + } + return new Gson().toJson(response); + }catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static String doAddPreferredLocation(String access_token, String location) { + try { + WebServiceBean response = new WebServiceBean(); + UserBean validUser = TokenVerificationService.verifyToken(access_token); + if(validUser == null) { + response.setStatus(WebServiceBean.STATUS_INVALID); + } else { + response.setStatus(WebServiceBean.STATUS_VALID); + UserModel userModel = new UserModel(); + DriverModel driverModel = new DriverModel(); + UserBean wsUser = userModel.findUserByUsername(validUser.username); + ResultSet rs = driverModel.query(String.format("SELECT MAX(position) as max FROM preferred_locations WHERE id= %d",wsUser.getId())); + int curr = rs.next() ? rs.getInt("max") + 1 : 1; + driverModel.queryUpdate( + String.format("INSERT INTO preferred_locations VALUES (%d,%d,'%s')", + wsUser.getId(), curr,location)); + } + return new Gson().toJson(response); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static String doDeletePreferredLocation(String access_token, Integer position) { + try { + WebServiceBean response = new WebServiceBean(); + UserBean validUser = TokenVerificationService.verifyToken(access_token); + if(validUser == null) { + response.setStatus(WebServiceBean.STATUS_INVALID); + } else { + response.setStatus(WebServiceBean.STATUS_VALID); + UserModel userModel = new UserModel(); + DriverModel driverModel = new DriverModel(); + UserBean wsUser = userModel.findUserByUsername(validUser.getUsername()); + ResultSet rs = driverModel.queryUpdate(String.format( + "DELETE FROM preferred_locations WHERE id=%d and position=%d", + wsUser.getId(),position + )); + } + return new Gson().toJson(response); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static String doUpdatePreferredLocation(String access_token, Integer position, String location) { + try { + WebServiceBean response = new WebServiceBean(); + UserBean validUser = TokenVerificationService.verifyToken(access_token); + if(validUser == null) { + response.setStatus(WebServiceBean.STATUS_INVALID); + } else { + response.setStatus(WebServiceBean.STATUS_VALID); + UserModel userModel = new UserModel(); + DriverModel driverModel = new DriverModel(); + UserBean wsUser = userModel.findUserByUsername(validUser.getUsername()); + ResultSet rs = driverModel.queryUpdate(String.format( + "UPDATE preferred_locations SET location = '%s' WHERE id=%d AND position=%d", + location,wsUser.getId(),position + )); + } + return new Gson().toJson(response); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + public static String doFindDriverByUsername(String access_token, String username) { + try { + UserBean validUser = TokenVerificationService.verifyToken(access_token); + Gson gson = new Gson(); + WebServiceBean response = new WebServiceBean(); + if(validUser != null) { + response.setStatus(WebServiceBean.STATUS_VALID); + response.setBody(gson.toJson(new UserModel().findUserByUsername(username))); + } else { + response.setStatus(WebServiceBean.STATUS_INVALID); + } + return gson.toJson(response); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + } +} diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/OrderHandler.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/OrderHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..0de1e08bc3d3bb126bdda7097de50248eb2a7dd6 --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/OrderHandler.java @@ -0,0 +1,161 @@ +package com.adaapa.ojekservice.handlers; + +import com.adaapa.bean.DriverBean; +import com.adaapa.bean.OrderBean; +import com.adaapa.bean.UserBean; +import com.adaapa.bean.WebServiceBean; +import com.adaapa.ojekservice.models.DriverModel; +import com.adaapa.ojekservice.models.UserModel; +import com.adaapa.ojekservice.services.TokenVerificationService; +import com.google.gson.Gson; +import java.util.ArrayList; + +/** + * Created by ireneedriadr on 11/5/17. + */ +public class OrderHandler { + public static String doGetUserHistory(String access_token) { + try { + WebServiceBean response = new WebServiceBean(); + UserModel userModel = new UserModel(); + UserBean validUser = TokenVerificationService.verifyToken(access_token); + if(validUser != null) { + ArrayList<OrderBean> userHistoryArray = userModel.findPrevOrder(userModel.findOrderByUsername(validUser.getUsername())); + response.setStatus(WebServiceBean.STATUS_VALID); + response.setBody(new Gson().toJson(userHistoryArray)); + } else { + response.setStatus(WebServiceBean.STATUS_INVALID); + } + return new Gson().toJson(response); + }catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static String doFindDriver(String access_token, String driver_name){ + try { + Gson gson = new Gson(); + WebServiceBean webServiceBean = new WebServiceBean(); + UserBean validUser = TokenVerificationService.verifyToken(access_token); + if (validUser == null) { + webServiceBean.setStatus(WebServiceBean.STATUS_INVALID); + return gson.toJson(webServiceBean); + } else { + webServiceBean.setStatus(WebServiceBean.STATUS_VALID); + UserModel userModel = new UserModel(); + DriverModel driverModel = new DriverModel(); + ArrayList<DriverBean> driverBeans = driverModel.findDriverByName(validUser.getUsername(),driver_name); + webServiceBean.setBody(gson.toJson(driverBeans)); + return gson.toJson(webServiceBean); + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + public static String doGetDriverHistory(String access_token) { + try { + WebServiceBean response = new WebServiceBean(); + UserModel userModel = new UserModel(); + UserBean validUser = TokenVerificationService.verifyToken(access_token); + if(validUser != null) { + ArrayList<OrderBean> userHistoryArray = userModel.findPrevDriverOrder(userModel.findOrderByUsername(validUser.getUsername())); + response.setStatus(WebServiceBean.STATUS_VALID); + response.setBody(new Gson().toJson(userHistoryArray)); + } else { + response.setStatus(WebServiceBean.STATUS_INVALID); + } + return new Gson().toJson(response); + }catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static String doFindDriverByPreferredLocation(String access_token, String pickup, String destination){ + try { + Gson gson = new Gson(); + WebServiceBean webServiceBean = new WebServiceBean(); + UserBean validUser = TokenVerificationService.verifyToken(access_token); + if (validUser == null) { + webServiceBean.setStatus(WebServiceBean.STATUS_INVALID); + return gson.toJson(webServiceBean); + } else { + webServiceBean.setStatus(WebServiceBean.STATUS_VALID); + UserModel userModel = new UserModel(); + DriverModel driverModel = new DriverModel(); + ArrayList<DriverBean> driverBeans = driverModel.findDriverByPreferredLocation(validUser.getUsername(), pickup, destination); + webServiceBean.setBody(gson.toJson(driverBeans)); + return gson.toJson(webServiceBean); + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static String doCompleteOrder(String access_token, String order) { + try{ + Gson gson = new Gson(); + WebServiceBean webServiceBean = new WebServiceBean(); + UserBean validUser = TokenVerificationService.verifyToken(access_token); + if (validUser == null) { + webServiceBean.setStatus(WebServiceBean.STATUS_INVALID); + } else { + webServiceBean.setStatus(WebServiceBean.STATUS_VALID); + OrderBean orderBean = gson.fromJson(order, OrderBean.class); + DriverModel driverModel = new DriverModel(); + driverModel.queryUpdate(String.format( + "INSERT INTO orders (user_id,driver_id,pickup,destination,rating,comment) VALUES" + + "(%d,%d,'%s','%s','%d','%s')", + validUser.getId(),orderBean.getDriverId(),orderBean.getPickup(),orderBean.getDestination(), + orderBean.getRating().intValue(), orderBean.getComment() + )); + } + return gson.toJson(webServiceBean); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static String doUserHideHistory(String access_token, Integer orderId) { + try{ + Gson gson = new Gson(); + WebServiceBean webServiceBean = new WebServiceBean(); + UserBean validUser = TokenVerificationService.verifyToken(access_token); + if (validUser == null) { + webServiceBean.setStatus(WebServiceBean.STATUS_INVALID); + } else { + webServiceBean.setStatus(WebServiceBean.STATUS_VALID); + UserModel userModel = new UserModel(); + userModel.queryUpdate(String.format("UPDATE orders SET user_hidden=1 WHERE id=%d",orderId)); + } + return gson.toJson(webServiceBean); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static String doDriverHideHistory(String access_token, Integer orderId) { + try{ + Gson gson = new Gson(); + WebServiceBean webServiceBean = new WebServiceBean(); + UserBean validUser = TokenVerificationService.verifyToken(access_token); + if (validUser == null) { + webServiceBean.setStatus(WebServiceBean.STATUS_INVALID); + } else { + webServiceBean.setStatus(WebServiceBean.STATUS_VALID); + UserModel userModel = new UserModel(); + userModel.queryUpdate(String.format("UPDATE orders SET driver_hidden=1 WHERE id=%d",orderId)); + } + return gson.toJson(webServiceBean); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/ProfileHandler.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/ProfileHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..9ecb290df990a3417f7db49b2a20fb7838fc113b --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/ProfileHandler.java @@ -0,0 +1,74 @@ +package com.adaapa.ojekservice.handlers; + +import com.adaapa.bean.UserBean; +import com.adaapa.bean.WebServiceBean; +import com.adaapa.ojekservice.models.UserModel; +import com.adaapa.ojekservice.services.TokenVerificationService; +import com.google.gson.Gson; + +public class ProfileHandler { + static Gson gson = new Gson(); + public static String doGetProfile(String access_token){ + try { + WebServiceBean webServiceBean = new WebServiceBean(); + UserBean resUser = TokenVerificationService.verifyToken(access_token); + if (resUser == null) { + webServiceBean.setStatus(WebServiceBean.STATUS_INVALID); + return gson.toJson(webServiceBean); + } else { + webServiceBean.setStatus(WebServiceBean.STATUS_VALID); + UserModel userModel = new UserModel(); + UserBean user = userModel.findUserByUsername(resUser.getUsername()); + if (user == null) { + resUser.isDriver = false; + userModel.saveUser(resUser); + webServiceBean.setBody(gson.toJson(resUser)); + } else { + webServiceBean.setBody(gson.toJson(user)); + } + return gson.toJson(webServiceBean); + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + public static String doEditProfile(String access_token, String user) { + try { + WebServiceBean webServiceBean = new WebServiceBean(); + UserBean resUser = TokenVerificationService.verifyToken(access_token); + if (resUser == null) { + webServiceBean.setStatus(WebServiceBean.STATUS_INVALID); + } else { + UserBean userBean = gson.fromJson(user, UserBean.class); + userBean.username = resUser.username; + UserModel userModel = new UserModel(); + userModel.updateUser(userBean); + webServiceBean.setStatus(WebServiceBean.STATUS_VALID); + } + return gson.toJson(webServiceBean); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static String doAddUser(String access_token, String user) { + try { + WebServiceBean webServiceBean = new WebServiceBean(); + UserBean validUser = TokenVerificationService.verifyToken(access_token); + if (validUser == null) { + webServiceBean.setStatus(WebServiceBean.STATUS_INVALID); + } else { + UserBean userBean = gson.fromJson(user, UserBean.class); + UserModel userModel = new UserModel(); + userModel.saveUser(userBean); + webServiceBean.setStatus(WebServiceBean.STATUS_VALID); + } + return gson.toJson(webServiceBean); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/models/DriverModel.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/models/DriverModel.java new file mode 100644 index 0000000000000000000000000000000000000000..88ad284985facecb0ce626317f071168688e3d43 --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/models/DriverModel.java @@ -0,0 +1,121 @@ +package com.adaapa.ojekservice.models; + +import com.adaapa.bean.DriverBean; +import com.adaapa.bean.PreferredLocationBean; +import com.adaapa.models.BaseModel; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Base64; + +public class DriverModel extends BaseModel { + public static String ORDER_TABLE = "orders"; + public static String USER_TABLE = "users"; + public static String PREFERRED_TABLE = "preferred_locations"; + public DriverModel() { + super("users","id"); + } + public Integer countVote(String username) { + try { + ResultSet rs = query(String.format( + "SELECT COUNT(rating) as vote FROM %s inner join %s on (%s.driver_id = %s.id) where users.username = '%s'", + ORDER_TABLE, USER_TABLE, ORDER_TABLE, USER_TABLE, username)); + if(rs.next()) { + return rs.getInt("vote"); + } else { + return 0; + } + + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + public DriverBean parseDriverBean(ResultSet resultSet) throws SQLException { + String username = resultSet.getString("username"); + DriverBean driverBean = new DriverBean(); + driverBean.setRating(calculateRating(username)); + driverBean.setName(resultSet.getString("name")); + driverBean.setVote(countVote(username)); + driverBean.setId(resultSet.getInt("id")); + driverBean.setUsername(username); + try { + driverBean.setImage("data:image/jpeg;charset=utf-8;base64,"+ Base64.getEncoder().encodeToString(resultSet.getBytes("image"))); + } catch (Exception e){ + System.out.println("User has no profile image"); + } + return driverBean; + } + public Double calculateRating (String username) { + try { + ResultSet rs = query(String.format( + "SELECT AVG(rating) as rating FROM %s inner join %s on (%s.driver_id = %s.id) where users.username = '%s'", + ORDER_TABLE, USER_TABLE, ORDER_TABLE, USER_TABLE, username)); + if(rs.next()) { + return rs.getDouble("rating"); + } else { + return 0.0; + } + } catch (Exception e) { + e.printStackTrace(); + return 0.0; + } + } + + public ArrayList<PreferredLocationBean> findPreferredLocation (String username ) { + ArrayList<PreferredLocationBean> preferredLocationBeanArray = new ArrayList<>(); + try { + ResultSet rs = query(String.format( + "SELECT position,location FROM %s NATURAL JOIN %s WHERE users.username = '%s'", + PREFERRED_TABLE,USER_TABLE, username + )); + while (rs.next()) { + PreferredLocationBean preferredLocationBean = new PreferredLocationBean(); + preferredLocationBean.setLocation(rs.getString("location")); + preferredLocationBean.setPosition(rs.getInt("position")); + preferredLocationBeanArray.add(preferredLocationBean); + } + return preferredLocationBeanArray; + } catch (Exception e) { + e.printStackTrace(); + return preferredLocationBeanArray; + } + } + + public ArrayList<DriverBean> findDriverByName(String username, String name) { + ResultSet resultSet = null; + ArrayList<DriverBean> driverBeans = new ArrayList<>(); + int i = 0; + try { + resultSet = query("SELECT * FROM users WHERE username != '"+username+"' AND name LIKE '%"+name+"%' and is_driver=1"); + while (resultSet.next()) { + driverBeans.add(parseDriverBean(resultSet)); + } + } catch (Exception e) { + e.printStackTrace(); + } + return driverBeans; + } + + + public ArrayList<DriverBean> findDriverByPreferredLocation(String username, String pickup, String destination) { + ResultSet resultSet = null; + ArrayList<DriverBean> driverBeans = new ArrayList<>(); + int i = 0; + try { + resultSet = query(String.format( + "SELECT DISTINCT users.name, users.username, users.id, users.image " + + "FROM users NATURAL JOIN preferred_locations WHERE username!= '%s' and (location='%s' or location='%s')", + username,pickup,destination + )); + while (resultSet.next()) { + driverBeans.add(parseDriverBean(resultSet)); + } + } catch (Exception e) { + e.printStackTrace(); + } + return driverBeans; + } + +} diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/models/UserModel.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/models/UserModel.java new file mode 100644 index 0000000000000000000000000000000000000000..d90d8cfcef0c2256e10648e813480e46731e18e3 --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/models/UserModel.java @@ -0,0 +1,149 @@ +package com.adaapa.ojekservice.models; + +import com.adaapa.bean.OrderBean; +import com.adaapa.bean.UserBean; +import com.adaapa.models.BaseModel; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Base64; + +public class UserModel extends BaseModel{ + public UserModel(){ + super("users","id"); + } + + public UserBean parseUserBean(ResultSet resultSet)throws SQLException { + UserBean ubean = new UserBean(); + ubean.id = resultSet.getInt("id"); + ubean.email = resultSet.getString("email"); + ubean.phoneNumber = resultSet.getString("phone"); + ubean.name = resultSet.getString("name"); + ubean.isDriver = resultSet.getBoolean("is_driver"); + ubean.username = resultSet.getString("username"); + try { + ubean.image = "data:image/jpeg;charset=utf-8;base64,"+Base64.getEncoder().encodeToString(resultSet.getBytes("image")); + } catch (Exception e) { + System.out.println("User has no image"); + } + return ubean; + } + + public OrderBean parseUserOrder(ResultSet resultSet)throws SQLException { + OrderBean obean = new OrderBean(); + obean.setId(resultSet.getInt("id")); + obean.setUserId(resultSet.getInt("user_id")); + obean.setDriverId(resultSet.getInt("driver_id")); + obean.setPickup(resultSet.getString("pickup")); + obean.setDestination(resultSet.getString("destination")); + obean.setRating(resultSet.getDouble("rating")); + obean.setComment(resultSet.getString("comment")); + obean.setName(resultSet.getString("name")); + obean.setTimestamp(resultSet.getTimestamp("timestamp")); + try { + obean.setImage("data:image/jpeg;charset=utf-8;base64,"+Base64.getEncoder().encodeToString(resultSet.getBytes("image"))); + } catch (Exception e) { + System.out.println("User has no image"); + } + return obean; + } + + public UserBean findUserByUsername(String username) { + UserBean userBean = null; + ResultSet resultSet = null; + try { + resultSet = query(String.format("SELECT * FROM %s WHERE username='%s'", tableName, username)); + if(resultSet.next()) { + userBean = parseUserBean(resultSet); + } + } catch (Exception e) { + e.printStackTrace(); + } + return userBean; + } + + public OrderBean findOrderByUsername(String username) { + OrderBean orderBean = null; + ResultSet resultSet = null; + try { + resultSet = query(String.format( + "SELECT * FROM orders JOIN users ON users.id = orders.driver_id WHERE username='%s'", + username)); + if (resultSet.next()) { + orderBean = parseUserOrder(resultSet); + } + } catch (Exception e) { + e.printStackTrace(); + } + return orderBean; + } + + public Boolean saveUser(UserBean userBean) { + ResultSet resultSet = null; + try { + resultSet = queryUpdate(String.format( + "INSERT INTO %s (name,email,phone,username,is_driver)" + + "VALUES ('%s','%s','%s','%s','%d')", + tableName,userBean.name,userBean.email,userBean.phoneNumber,userBean.username,userBean.isDriver ? 1 : 0 + + )); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + + } + public void updateImage(String username, String image) throws SQLException { + PreparedStatement statement = db + .prepareStatement("UPDATE users SET image=? WHERE username = ?"); + statement.setBytes(1, Base64.getDecoder().decode(image)); + statement.setString(2,username); + statement.executeUpdate(); + } + public void updateUser(UserBean updatedUser) { + try { + PreparedStatement statement = db + .prepareStatement("UPDATE users SET name=?, phone=?,is_driver=? WHERE username = ?"); + statement.setString(1, updatedUser.getName()); + statement.setString(2, updatedUser.phoneNumber); + statement.setBoolean(3,updatedUser.isDriver); + statement.setString(4, updatedUser.getUsername()); + statement.executeUpdate(); + if(updatedUser.getImage() != null) { + updateImage(updatedUser.username, updatedUser.image); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public ArrayList<OrderBean> findPrevOrder(OrderBean driver) { + ArrayList<OrderBean> res = new ArrayList<>(); + + try { + ResultSet rs = query(String.format("SELECT * FROM orders JOIN users ON users.id = orders.driver_id WHERE user_id = '%s' and not user_hidden ORDER BY timestamp desc",driver.getDriverId())); + while (rs.next()) { + res.add(parseUserOrder(rs)); + } + } catch (Exception e) { + e.printStackTrace(); + } + return res; + } + + public ArrayList<OrderBean> findPrevDriverOrder(OrderBean driver) { + ArrayList<OrderBean> res = new ArrayList<>(); + + try { + ResultSet rs = query(String.format("SELECT * FROM orders JOIN users ON users.id = orders.user_id WHERE driver_id = '%s' and not driver_hidden ORDER BY timestamp desc",driver.getDriverId())); + while (rs.next()) { + res.add(parseUserOrder(rs)); + } + } catch (Exception e) { + e.printStackTrace(); + } + return res; + } +} diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/services/DomainConfig.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/services/DomainConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..69367b53cd7a2cb8849cf17a27107dceebea9e81 --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/services/DomainConfig.java @@ -0,0 +1,26 @@ +package com.adaapa.ojekservice.services; + +import java.io.InputStream; +import java.util.Properties; + +public class DomainConfig { + public static String IS_DOMAIN; + private final String file_name = "/config/domain.properties"; + + public DomainConfig() { + try { + Properties prop = new Properties(); + InputStream inp = this.getClass().getResourceAsStream(file_name); + prop.load(inp); + IS_DOMAIN = prop.getProperty("IDSERVICE_DOMAIN"); + } catch (Exception e) { + e.printStackTrace(); + } + } + public static String getISDomain() { + if(IS_DOMAIN == null) { + new DomainConfig(); + } + return IS_DOMAIN; + } +} diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/services/TokenVerificationService.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/services/TokenVerificationService.java new file mode 100644 index 0000000000000000000000000000000000000000..cca774d906928ee8c0dbb1f4505ddb1efc8dfdf7 --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/services/TokenVerificationService.java @@ -0,0 +1,36 @@ +package com.adaapa.ojekservice.services; + +import com.adaapa.bean.TokenVerificationResponse; +import com.adaapa.bean.UserBean; +import com.adaapa.bean.WebServiceBean; +import com.adaapa.tokenverifier.TokenVerifier; +import com.google.gson.Gson; +import java.net.MalformedURLException; +import java.net.URL; +import javax.xml.namespace.QName; +import javax.xml.ws.Service; + +public class TokenVerificationService { + private final String TOKEN_VERIFIER_PATH = "/verifytoken"; + private final String WSDL_PATH = "?wsdl"; + private static TokenVerifier serviceClass; + TokenVerificationService() throws MalformedURLException { + URL url = new URL(DomainConfig.getISDomain()+TOKEN_VERIFIER_PATH+WSDL_PATH); + QName qname = new QName("tokenverifier.adaapa.com", "TokenVerifierService"); + Service service = Service.create(url, qname); + serviceClass = service.getPort(TokenVerifier.class); + } + public static UserBean verifyToken(String access_token) throws MalformedURLException { + if(serviceClass == null) { + new TokenVerificationService(); + } + String result = serviceClass.verifyToken(access_token); + TokenVerificationResponse resultObj = new Gson().fromJson(result,TokenVerificationResponse.class); + WebServiceBean response = new WebServiceBean(); + if(resultObj.getStatus().equals(TokenVerificationResponse.TOKEN_VALID)) { + return resultObj.getUser(); + } else { + return null; + } + } +} diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/ObjectFactory.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/ObjectFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..c9f1faa1b3689a182aedf5eba5050f6805d9577e --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/ObjectFactory.java @@ -0,0 +1,71 @@ + +package com.adaapa.tokenverifier; + +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlElementDecl; +import javax.xml.bind.annotation.XmlRegistry; +import javax.xml.namespace.QName; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the com.adaapa.tokenverifier package. + * <p>An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + private final static QName _VerifyToken_QNAME = new QName("tokenverifier.adaapa.com", "verifyToken"); + private final static QName _VerifyTokenResponse_QNAME = new QName("tokenverifier.adaapa.com", "verifyTokenResponse"); + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: com.adaapa.tokenverifier + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link VerifyToken } + * + */ + public VerifyToken createVerifyToken() { + return new VerifyToken(); + } + + /** + * Create an instance of {@link VerifyTokenResponse } + * + */ + public VerifyTokenResponse createVerifyTokenResponse() { + return new VerifyTokenResponse(); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link VerifyToken }{@code >}} + * + */ + @XmlElementDecl(namespace = "tokenverifier.adaapa.com", name = "verifyToken") + public JAXBElement<VerifyToken> createVerifyToken(VerifyToken value) { + return new JAXBElement<VerifyToken>(_VerifyToken_QNAME, VerifyToken.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link VerifyTokenResponse }{@code >}} + * + */ + @XmlElementDecl(namespace = "tokenverifier.adaapa.com", name = "verifyTokenResponse") + public JAXBElement<VerifyTokenResponse> createVerifyTokenResponse(VerifyTokenResponse value) { + return new JAXBElement<VerifyTokenResponse>(_VerifyTokenResponse_QNAME, VerifyTokenResponse.class, null, value); + } + +} diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/TokenVerifier.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/TokenVerifier.java new file mode 100644 index 0000000000000000000000000000000000000000..dbfe06ba3c4bbe66c3ea41db89853ceda1cb024f --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/TokenVerifier.java @@ -0,0 +1,42 @@ + +package com.adaapa.tokenverifier; + +import javax.jws.WebMethod; +import javax.jws.WebParam; +import javax.jws.WebResult; +import javax.jws.WebService; +import javax.xml.bind.annotation.XmlSeeAlso; +import javax.xml.ws.Action; +import javax.xml.ws.RequestWrapper; +import javax.xml.ws.ResponseWrapper; + + +/** + * This class was generated by the JAX-WS RI. + * JAX-WS RI 2.2.9-b130926.1035 + * Generated source version: 2.2 + * + */ +@WebService(name = "TokenVerifier", targetNamespace = "tokenverifier.adaapa.com") +@XmlSeeAlso({ + ObjectFactory.class +}) +public interface TokenVerifier { + + + /** + * + * @param accessToken + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(name = "userObjectInJSON", targetNamespace = "") + @RequestWrapper(localName = "verifyToken", targetNamespace = "tokenverifier.adaapa.com", className = "com.adaapa.tokenverifier.VerifyToken") + @ResponseWrapper(localName = "verifyTokenResponse", targetNamespace = "tokenverifier.adaapa.com", className = "com.adaapa.tokenverifier.VerifyTokenResponse") + @Action(input = "tokenverifier.adaapa.com/TokenVerifier/verifyTokenRequest", output = "tokenverifier.adaapa.com/TokenVerifier/verifyTokenResponse") + public String verifyToken( + @WebParam(name = "access_token", targetNamespace = "") + String accessToken); + +} diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/TokenVerifierService.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/TokenVerifierService.java new file mode 100644 index 0000000000000000000000000000000000000000..78b39f9ad7a40449456fef44c219f6ecb369ff23 --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/TokenVerifierService.java @@ -0,0 +1,94 @@ + +package com.adaapa.tokenverifier; + +import java.net.MalformedURLException; +import java.net.URL; +import javax.xml.namespace.QName; +import javax.xml.ws.Service; +import javax.xml.ws.WebEndpoint; +import javax.xml.ws.WebServiceClient; +import javax.xml.ws.WebServiceException; +import javax.xml.ws.WebServiceFeature; + + +/** + * This class was generated by the JAX-WS RI. + * JAX-WS RI 2.2.9-b130926.1035 + * Generated source version: 2.2 + * + */ +@WebServiceClient(name = "TokenVerifierService", targetNamespace = "tokenverifier.adaapa.com", wsdlLocation = "http://localhost:8001/verifytoken?wsdl") +public class TokenVerifierService + extends Service +{ + + private final static URL TOKENVERIFIERSERVICE_WSDL_LOCATION; + private final static WebServiceException TOKENVERIFIERSERVICE_EXCEPTION; + private final static QName TOKENVERIFIERSERVICE_QNAME = new QName("tokenverifier.adaapa.com", "TokenVerifierService"); + + static { + URL url = null; + WebServiceException e = null; + try { + url = new URL("http://localhost:8001/verifytoken?wsdl"); + } catch (MalformedURLException ex) { + e = new WebServiceException(ex); + } + TOKENVERIFIERSERVICE_WSDL_LOCATION = url; + TOKENVERIFIERSERVICE_EXCEPTION = e; + } + + public TokenVerifierService() { + super(__getWsdlLocation(), TOKENVERIFIERSERVICE_QNAME); + } + + public TokenVerifierService(WebServiceFeature... features) { + super(__getWsdlLocation(), TOKENVERIFIERSERVICE_QNAME, features); + } + + public TokenVerifierService(URL wsdlLocation) { + super(wsdlLocation, TOKENVERIFIERSERVICE_QNAME); + } + + public TokenVerifierService(URL wsdlLocation, WebServiceFeature... features) { + super(wsdlLocation, TOKENVERIFIERSERVICE_QNAME, features); + } + + public TokenVerifierService(URL wsdlLocation, QName serviceName) { + super(wsdlLocation, serviceName); + } + + public TokenVerifierService(URL wsdlLocation, QName serviceName, WebServiceFeature... features) { + super(wsdlLocation, serviceName, features); + } + + /** + * + * @return + * returns TokenVerifier + */ + @WebEndpoint(name = "TokenVerifierPort") + public TokenVerifier getTokenVerifierPort() { + return super.getPort(new QName("tokenverifier.adaapa.com", "TokenVerifierPort"), TokenVerifier.class); + } + + /** + * + * @param features + * A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values. + * @return + * returns TokenVerifier + */ + @WebEndpoint(name = "TokenVerifierPort") + public TokenVerifier getTokenVerifierPort(WebServiceFeature... features) { + return super.getPort(new QName("tokenverifier.adaapa.com", "TokenVerifierPort"), TokenVerifier.class, features); + } + + private static URL __getWsdlLocation() { + if (TOKENVERIFIERSERVICE_EXCEPTION!= null) { + throw TOKENVERIFIERSERVICE_EXCEPTION; + } + return TOKENVERIFIERSERVICE_WSDL_LOCATION; + } + +} diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/VerifyToken.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/VerifyToken.java new file mode 100644 index 0000000000000000000000000000000000000000..230c4a2a89fc3f17c385671eb26cd164409529ae --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/VerifyToken.java @@ -0,0 +1,62 @@ + +package com.adaapa.tokenverifier; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + + +/** + * <p>Java class for verifyToken complex type. + * + * <p>The following schema fragment specifies the expected content contained within this class. + * + * <pre> + * <complexType name="verifyToken"> + * <complexContent> + * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> + * <sequence> + * <element name="access_token" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> + * </sequence> + * </restriction> + * </complexContent> + * </complexType> + * </pre> + * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "verifyToken", propOrder = { + "accessToken" +}) +public class VerifyToken { + + @XmlElement(name = "access_token") + protected String accessToken; + + /** + * Gets the value of the accessToken property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getAccessToken() { + return accessToken; + } + + /** + * Sets the value of the accessToken property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setAccessToken(String value) { + this.accessToken = value; + } + +} diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/VerifyTokenResponse.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/VerifyTokenResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..553c4c5c8ce4a8b8c8603ef2e589c3f221fd1180 --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/VerifyTokenResponse.java @@ -0,0 +1,60 @@ + +package com.adaapa.tokenverifier; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlType; + + +/** + * <p>Java class for verifyTokenResponse complex type. + * + * <p>The following schema fragment specifies the expected content contained within this class. + * + * <pre> + * <complexType name="verifyTokenResponse"> + * <complexContent> + * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> + * <sequence> + * <element name="userObjectInJSON" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> + * </sequence> + * </restriction> + * </complexContent> + * </complexType> + * </pre> + * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "verifyTokenResponse", propOrder = { + "userObjectInJSON" +}) +public class VerifyTokenResponse { + + protected String userObjectInJSON; + + /** + * Gets the value of the userObjectInJSON property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getUserObjectInJSON() { + return userObjectInJSON; + } + + /** + * Sets the value of the userObjectInJSON property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setUserObjectInJSON(String value) { + this.userObjectInJSON = value; + } + +} diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/package-info.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..557e7d7845a07c7e6e1d5190bc142a8ccd0d2916 --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/package-info.java @@ -0,0 +1,2 @@ +@javax.xml.bind.annotation.XmlSchema(namespace = "tokenverifier.adaapa.com") +package com.adaapa.tokenverifier; diff --git a/TugasBesar2_2017/WebService/src/main/resources/config/db.properties.example b/TugasBesar2_2017/WebService/src/main/resources/config/db.properties.example new file mode 100644 index 0000000000000000000000000000000000000000..d4c28255313d72c4c8701d14f5ab9a1149c00457 --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/resources/config/db.properties.example @@ -0,0 +1,4 @@ +DB_HOST = localhost +DB_USER = wbd +DB_PASS = wbd123 +DB_NAME = wbd_ojekservice \ No newline at end of file diff --git a/TugasBesar2_2017/WebService/src/main/resources/config/domain.properties.example b/TugasBesar2_2017/WebService/src/main/resources/config/domain.properties.example new file mode 100644 index 0000000000000000000000000000000000000000..533f27bb11a4c4ae88aa980b8d1823b3c23fd1bb --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/resources/config/domain.properties.example @@ -0,0 +1 @@ +IDSERVICE_DOMAIN = localhost:8001 diff --git a/TugasBesar2_2017/WebService/src/main/webapp/WEB-INF/sun-jaxws.xml b/TugasBesar2_2017/WebService/src/main/webapp/WEB-INF/sun-jaxws.xml new file mode 100644 index 0000000000000000000000000000000000000000..8e026514c7b55dcb9f613bea25b5bf5cc17382e4 --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/webapp/WEB-INF/sun-jaxws.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<endpoints + xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" + version="2.0"> + + <endpoint + name="OjekOnline" + implementation="com.adaapa.ojekservice.OjekOnline" + url-pattern="/ojekonline"/> +</endpoints> diff --git a/TugasBesar2_2017/WebService/src/main/webapp/WEB-INF/web.xml b/TugasBesar2_2017/WebService/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000000000000000000000000000000000..d004022fad19e303b981743d94f3cdf124340dc8 --- /dev/null +++ b/TugasBesar2_2017/WebService/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<web-app + xmlns="http://java.sun.com/xml/ns/j2ee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" + version="4.0"> + + <listener> + <listener-class> + com.sun.xml.ws.transport.http.servlet.WSServletContextListener + </listener-class> + </listener> + + <servlet> + <servlet-name>web-jaxws</servlet-name> + <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>web-jaxws</servlet-name> + <url-pattern>/soap</url-pattern> + </servlet-mapping> +</web-app>