├── settings.gradle ├── libs └── json.jar ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── src └── main │ ├── resources │ └── Credentials.properties │ ├── java │ └── ZohoPay │ │ ├── PaymentReference.java │ │ ├── ZohoPayPaymentPageServlet.java │ │ ├── ZohoPayPaymentRequestServlet.java │ │ ├── ZohoPayRefundPaymentServlet.java │ │ ├── ZohoPayProcessPaymentServlet.java │ │ └── PaymentUtil.java │ ├── main.iml │ └── webapp │ └── paypage.jsp ├── README.md ├── gradlew.bat └── gradlew /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'zhpay' 2 | 3 | -------------------------------------------------------------------------------- /libs/json.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zoho/custompaymentgateway/master/libs/json.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zoho/custompaymentgateway/master/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /src/main/resources/Credentials.properties: -------------------------------------------------------------------------------- 1 | # ------------------------------------------------------------------ 2 | # Dummy credentials for development and testing purposes only. 3 | # These credentials are NOT intended for use in production systems. 4 | # ------------------------------------------------------------------ 5 | accountID=8719992 6 | password=uRIj0837FYjk 7 | -------------------------------------------------------------------------------- /src/main/java/ZohoPay/PaymentReference.java: -------------------------------------------------------------------------------- 1 | package ZohoPay; 2 | import java.util.HashMap; 3 | import java.util.Map; 4 | 5 | class PaymentReference 6 | { 7 | static Map> paymentRequestRefMap = new HashMap>(); 8 | static Map paymentRecordedRefMap = new HashMap<>(); 9 | static Map paymentRefundedRefMap = new HashMap<>(); 10 | } 11 | -------------------------------------------------------------------------------- /src/main/main.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/main/java/ZohoPay/ZohoPayPaymentPageServlet.java: -------------------------------------------------------------------------------- 1 | package ZohoPay; 2 | 3 | import java.io.IOException; 4 | import java.util.Map; 5 | 6 | import javax.servlet.RequestDispatcher; 7 | import javax.servlet.ServletException; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.annotation.*; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | 13 | @WebServlet("/paymentpage/*") 14 | public class ZohoPayPaymentPageServlet extends HttpServlet 15 | { 16 | @Override 17 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 18 | { 19 | this.doPost(req, resp); 20 | } 21 | 22 | 23 | @Override 24 | protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException 25 | { 26 | String requri = req.getRequestURI(); 27 | String[] uri = requri.split("/"); 28 | String refId = uri[uri.length - 1]; 29 | Map refMap = PaymentReference.paymentRequestRefMap.get(refId); 30 | String entityNumber = refMap.get("entity_number"); 31 | String amount = refMap.get("amount"); 32 | req.setAttribute("invoiceNumber",entityNumber); 33 | req.setAttribute("amount",amount); 34 | req.setAttribute("reference_id", refId); 35 | RequestDispatcher dispatcher = req.getRequestDispatcher("/paypage.jsp"); 36 | dispatcher.forward(req, res); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/ZohoPay/ZohoPayPaymentRequestServlet.java: -------------------------------------------------------------------------------- 1 | package ZohoPay; 2 | import java.io.IOException; 3 | import java.io.InputStream; 4 | import java.io.PrintWriter; 5 | import javax.servlet.annotation.*; 6 | import java.util.Map; 7 | import java.util.Properties; 8 | 9 | import javax.servlet.ServletException; 10 | import javax.servlet.http.HttpServlet; 11 | import javax.servlet.http.HttpServletRequest; 12 | import javax.servlet.http.HttpServletResponse; 13 | 14 | @WebServlet("/createpaypage") 15 | public class ZohoPayPaymentRequestServlet extends HttpServlet 16 | { 17 | @Override 18 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 19 | { 20 | this.doPost(req, resp); 21 | } 22 | 23 | 24 | @Override 25 | protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException 26 | { 27 | PrintWriter writer = res.getWriter(); 28 | try 29 | { 30 | Properties properties = new Properties(); 31 | InputStream inputStream = PaymentUtil.class.getClassLoader().getResourceAsStream("Credentials.properties"); 32 | properties.load(inputStream); 33 | Map paramMap = PaymentUtil.getRequestParams(req, req.getParameterNames()); 34 | String signature = paramMap.remove("signature");//NO I18N 35 | boolean isVerified = PaymentUtil.verifySignature(signature, paramMap); 36 | if(!isVerified) 37 | { 38 | throw new Exception("Signature Mismatch !!!");//NO I18N 39 | } 40 | String refID = paramMap.get("reference_id");//NO I18N 41 | PaymentReference.paymentRequestRefMap.put(refID, paramMap); 42 | String paymentpageURL = "/zhpay/paymentpage/"+ refID;//NO I18N 43 | res.setStatus(302); 44 | res.setHeader("Location", paymentpageURL);//No I18N 45 | } 46 | catch(Exception e) 47 | { 48 | res.setContentType("application/json"); 49 | res.setStatus(400); 50 | writer.write("{\"error_code\":510, \"message\" : \"" + e.getMessage() + "\" }");//NO I18N 51 | 52 | } 53 | } 54 | 55 | 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/ZohoPay/ZohoPayRefundPaymentServlet.java: -------------------------------------------------------------------------------- 1 | package ZohoPay; 2 | 3 | import java.io.IOException; 4 | import java.io.PrintWriter; 5 | import java.math.BigDecimal; 6 | import java.util.Enumeration; 7 | import java.util.Map; 8 | 9 | import javax.servlet.ServletException; 10 | import javax.servlet.annotation.WebServlet; 11 | import javax.servlet.http.HttpServlet; 12 | import javax.servlet.http.HttpServletRequest; 13 | import javax.servlet.http.HttpServletResponse; 14 | 15 | @WebServlet("/refundPayment") //No I18N 16 | public class ZohoPayRefundPaymentServlet extends HttpServlet 17 | { 18 | @Override 19 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 20 | { 21 | this.doPost(req, resp); 22 | } 23 | 24 | @Override 25 | protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException 26 | { 27 | PrintWriter writer = res.getWriter(); 28 | try 29 | { 30 | Enumeration parameterNames = req.getParameterNames(); 31 | Map paramMap = PaymentUtil.getRequestParams(req, parameterNames); 32 | String gatewayReferenceID = paramMap.get("gateway_reference_id");//No I18N 33 | String booksReferenceID = PaymentReference.paymentRecordedRefMap.get(gatewayReferenceID); 34 | Map booksRequestJSON = PaymentReference.paymentRequestRefMap.get(booksReferenceID); 35 | String accountID = booksRequestJSON.get("account_id");//No I18N 36 | String signature = paramMap.remove("signature");//No I18N 37 | String actualSignature = PaymentUtil.getSignature(paramMap, accountID); 38 | if(!actualSignature.equals(signature)) 39 | { 40 | throw new Exception("Signature Mismatch");//No I18N 41 | } 42 | BigDecimal amount = new BigDecimal(paramMap.get("amount"));//No I18N 43 | BigDecimal paidAmount = new BigDecimal(booksRequestJSON.get("amount")); 44 | if(paidAmount.compareTo(amount) < 0) 45 | { 46 | throw new Exception("Invalid amount");//No I18N 47 | } 48 | PaymentReference.paymentRefundedRefMap.put(gatewayReferenceID, String.valueOf(amount)); 49 | res.setContentType("application/json");//No I18N 50 | res.setStatus(201); 51 | writer.write("{\"zcm_errorcode\":101, \"message\" : \"Refund Recorded Successfully\" }");//No I18N 52 | } 53 | catch(Exception e) 54 | { 55 | res.setStatus(403); 56 | writer.write("{\"zcm_errorcode\":101, \"message\" : \"Failure in recording refund due to" + e +"\" }");//No I18N 57 | } 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Payment Gateway Connector Development Kit 2 | 3 | This Payment Gateway Connector development kit built using gradle, will allow you simulate the interation between zoho books and payment gateway. To use this development kit kindly familiarize yourself with Payment Gateway Connector from our Help Documantation. 4 | 5 | ## What you'll need 6 | 7 | - Java installed in your system 8 | - Gradle installed in your system 9 | 10 | 11 | ## How to get Started 12 | 13 | - Clone this repository to your machine. 14 | - use `gradle appRun` in the cloned path to start payment gateway server in your machine. 15 | - check if the server is up using `https://localhost:8550`. 16 | 17 | ## Creating a Payment Gateway Connector in Zoho Books. 18 | 19 | You need to be granted access to custom payment gateways, for requesting access kindly write to ***support[at]zohobooks[dot]com*** 20 | Once you have been granted access to custom payment gateways 21 | 22 | - Move to Settings ---> Integrations ---> Customer Payments ---> Custom Payment Gateway ---> Create New Gateway. 23 | 24 | - Enter the following details in the creation page 25 | 26 | - Gateway Name - Any name for your gateway 27 | - Gateway Name formatted - Formatted name for your gateway 28 | - Live API URL - `https://localhost:8550` 29 | - Test API URL - `https://localhost:8550` 30 | - type - choose 'Client for Redirection' option from dropdown 31 | - Payment Request Path = `/zhpay/createpaypage` 32 | - Identifier Label Name - Any Label 33 | - Password Label Name - Any Label 34 | - Supported Currencies - Any set of currencies 35 | 36 | - Then move to Integrated gateway tab. Find you gateway from the listed gateways and click set-up gateway. 37 | 38 | - Enter the following credentials 39 | 40 | - **Identifier** - ***dummy_accountid*** 41 | - **Password** - ***dummy_password*** 42 | 43 | ## Collect payment from the connected Gateway 44 | 45 | - Create an Invoice from your devlopment org and choose this gateway as your payment option. 46 | 47 | - Click on ***Pay Now*** button for the created invoice from client portal or use charge customer option from admin console. 48 | 49 | - You will be redirected to the payment page of this gateway. 50 | 51 | - Pay your gateway using success/failure cards 52 | 53 | - After payment this gateway will redirect you back to zoho books which will process your transaction and land you to payment success/failure pages. 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS="-Xmx64m" 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /src/main/java/ZohoPay/ZohoPayProcessPaymentServlet.java: -------------------------------------------------------------------------------- 1 | package ZohoPay; 2 | 3 | import javax.servlet.http.HttpServlet; 4 | import java.io.IOException; 5 | import java.io.PrintWriter; 6 | import javax.servlet.annotation.*; 7 | import java.net.URLEncoder; 8 | import java.util.HashMap; 9 | import java.util.Map; 10 | import java.util.UUID; 11 | 12 | import java.util.Enumeration; 13 | import javax.servlet.ServletException; 14 | import javax.servlet.http.HttpServletRequest; 15 | import javax.servlet.http.HttpServletResponse; 16 | 17 | @WebServlet("/makepayment") 18 | public class ZohoPayProcessPaymentServlet extends HttpServlet 19 | { 20 | 21 | @Override 22 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 23 | { 24 | this.doPost(req, resp); 25 | } 26 | 27 | 28 | @Override 29 | protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException 30 | { 31 | PrintWriter writers = res.getWriter(); 32 | try 33 | { 34 | Enumeration parameterNames = req.getParameterNames(); 35 | Map paramMap = PaymentUtil.getRequestParams(req, parameterNames); 36 | String card = paramMap.get("card_number"); 37 | String refID = paramMap.get("reference_id"); 38 | Map refMap = PaymentReference.paymentRequestRefMap.get(refID); 39 | String uniquePaymentID = String.valueOf(UUID.randomUUID()); 40 | boolean isSuccess = ("4111111111111111").equals(card); 41 | String userID = refMap.get("account_id"); 42 | Map paramterMap = new HashMap<>(); 43 | String redirectURL = refMap.get("payment_complete_url"); 44 | String[] urlAndParams = redirectURL.split("\\?"); 45 | String targetURL = urlAndParams[0]; 46 | if(urlAndParams.length > 1) 47 | { 48 | String[] queryParams = urlAndParams[1].split("&"); 49 | for(String param : queryParams) 50 | { 51 | String[] paramNameVSValue = param.split("="); 52 | paramterMap.put(paramNameVSValue[0], paramNameVSValue[1]); 53 | } 54 | } 55 | paramterMap.put("gateway_fee", "5.00"); 56 | paramterMap.put("currency_code", refMap.get("currency_code")); 57 | paramterMap.put("payment_mode", "card"); 58 | paramterMap.put("gateway_referece_id", uniquePaymentID); 59 | paramterMap.put("amount", refMap.get("amount")); 60 | if(isSuccess) 61 | { 62 | paramterMap.put("transaction_status", "1"); 63 | } 64 | else 65 | { 66 | paramterMap.put("transaction_status", "0"); 67 | paramterMap.put("gateway_errorcode", "5012"); 68 | paramterMap.put("zcm_errorcode", "105"); 69 | } 70 | String signature = PaymentUtil.getSignature(paramterMap, userID); 71 | paramterMap.put("signature", signature); 72 | PaymentReference.paymentRecordedRefMap.put(uniquePaymentID, refID); 73 | StringBuilder stringBuilder = new StringBuilder(); 74 | for(Map.Entry paramEntry : paramterMap.entrySet()) 75 | { 76 | String value = paramEntry.getValue(); 77 | if(value == null) 78 | { 79 | value = ""; 80 | } 81 | stringBuilder.append(paramEntry.getKey()).append("=").append(URLEncoder.encode(value, "UTF-8")).append("&"); 82 | } 83 | res.setContentType("application/json"); 84 | String redirecturl = targetURL + "?" + stringBuilder.toString(); 85 | res.sendRedirect(redirecturl); 86 | 87 | } 88 | catch(Exception e) 89 | { 90 | res.setContentType("application/json"); 91 | e.printStackTrace(writers); 92 | writers.println(e); 93 | writers.println(e.getCause()); 94 | } 95 | } 96 | 97 | 98 | } 99 | -------------------------------------------------------------------------------- /src/main/java/ZohoPay/PaymentUtil.java: -------------------------------------------------------------------------------- 1 | package ZohoPay; 2 | 3 | import java.io.InputStream; 4 | import java.util.Enumeration; 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | import java.util.Properties; 8 | import java.util.TreeMap; 9 | 10 | import javax.crypto.Mac; 11 | import javax.crypto.spec.SecretKeySpec; 12 | import javax.servlet.http.HttpServletRequest; 13 | 14 | public class PaymentUtil 15 | { 16 | 17 | public static final String CREDENTIAL_PROPERTIES = "Credentials.properties";//No I18N 18 | public static final String ACCOUNT_ID = "accountID";//No I18N 19 | public static final String PASSWORD = "password";//No I18N 20 | 21 | private static Properties properties; 22 | 23 | static 24 | { 25 | try 26 | { 27 | properties = new Properties(); 28 | InputStream inputStream = PaymentUtil.class.getClassLoader().getResourceAsStream(CREDENTIAL_PROPERTIES); 29 | properties.load(inputStream); 30 | } 31 | catch(Exception e) 32 | { 33 | properties = new Properties(); 34 | properties.setProperty("accountID","dummy_accountid");//No I18N 35 | properties.setProperty("password","dummy_password");//No I18N 36 | } 37 | } 38 | 39 | 40 | public static String sortAndGetSign(Map params, String signKey) throws Exception 41 | { 42 | Map sortedParam = new TreeMap<>(params); 43 | StringBuilder sb = new StringBuilder(); 44 | for(Map.Entry paramEntry : sortedParam.entrySet()) 45 | { 46 | sb.append(paramEntry.getKey()).append(paramEntry.getValue().toString()); 47 | } 48 | return sign(signKey, sb.toString()); 49 | } 50 | 51 | private static String sign(String key, String message) throws Exception 52 | { 53 | 54 | SecretKeySpec keySpec = new SecretKeySpec( 55 | key.getBytes(), 56 | "HmacSHA256"); // No I18N 57 | 58 | Mac mac = Mac.getInstance("HmacSHA256"); 59 | mac.init(keySpec); 60 | byte[] rawHmac = mac.doFinal(message.getBytes()); 61 | return new String(encodeHex(rawHmac, new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}));//No I18N 62 | } 63 | 64 | private static char[] encodeHex(byte[] data, char[] toDigits) { 65 | int l = data.length; 66 | char[] out = new char[l << 1]; 67 | int i = 0; 68 | 69 | for(int var5 = 0; i < l; ++i) { 70 | out[var5++] = toDigits[(240 & data[i]) >>> 4]; 71 | out[var5++] = toDigits[15 & data[i]]; 72 | } 73 | 74 | return out; 75 | } 76 | 77 | public static boolean verifySignature(String receivedSignature, Map paramterMap) throws Exception 78 | { 79 | String accountId = paramterMap.get("account_id"); 80 | if(!properties.getProperty(ACCOUNT_ID).equals(accountId)) 81 | { 82 | throw new Exception("Invalid Account ID"); 83 | } 84 | String actualsignature = sortAndGetSign(paramterMap, properties.getProperty(PASSWORD)); 85 | return receivedSignature.equals(actualsignature); 86 | } 87 | 88 | 89 | public static Map getRequestParams(HttpServletRequest request, Enumeration parameterMap) 90 | { 91 | Map params = new HashMap<>(); 92 | while(parameterMap.hasMoreElements()) 93 | { 94 | String param = parameterMap.nextElement(); 95 | params.put(param, request.getParameter(param)); 96 | } 97 | return params; 98 | } 99 | 100 | public static String getSignature(Map paramMap, String userID) throws Exception 101 | { 102 | String signKey = properties.getProperty(PASSWORD); 103 | return sortAndGetSign(paramMap, signKey); 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /src/main/webapp/paypage.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=ISO-8859-1" 2 | pageEncoding="ISO-8859-1"%> 3 | 4 | 5 | 6 | 7 | 123 | PayZ Payment Page 124 | 125 | 126 |
127 |
128 |

${invoiceNumber}

129 |
130 | 131 | 135 |
136 | 137 |
138 |
139 |
140 | 141 |
142 | 143 |
144 | 145 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS='"-Xmx64m"' 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | --------------------------------------------------------------------------------