1. /*
  2. * Copyright 2001-2004 The Apache Software Foundation
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. *
  16. */
  17. package org.apache.tools.ant.taskdefs.optional.ide;
  18. import java.io.BufferedReader;
  19. import java.io.File;
  20. import java.io.IOException;
  21. import java.io.InputStream;
  22. import java.io.InputStreamReader;
  23. import java.net.HttpURLConnection;
  24. import java.net.URL;
  25. import java.net.URLEncoder;
  26. import java.util.Enumeration;
  27. import java.util.Vector;
  28. import org.apache.tools.ant.BuildException;
  29. import org.apache.tools.ant.Task;
  30. /**
  31. * Helper class for VAJ tasks. Holds Workspace singleton and
  32. * wraps IvjExceptions into BuildExceptions
  33. *
  34. */
  35. class VAJRemoteUtil implements VAJUtil {
  36. // calling task
  37. Task caller;
  38. // VAJ remote tool server
  39. String remoteServer;
  40. public VAJRemoteUtil(Task caller, String remote) {
  41. this.caller = caller;
  42. this.remoteServer = remote;
  43. }
  44. /**
  45. * export the array of Packages
  46. */
  47. public void exportPackages(File destDir,
  48. String[] includePatterns, String[] excludePatterns,
  49. boolean exportClasses, boolean exportDebugInfo,
  50. boolean exportResources, boolean exportSources,
  51. boolean useDefaultExcludes, boolean overwrite) {
  52. try {
  53. String request = "http://" + remoteServer + "/servlet/vajexport?"
  54. + VAJExportServlet.WITH_DEBUG_INFO + "=" + exportDebugInfo + "&"
  55. + VAJExportServlet.OVERWRITE_PARAM + "=" + overwrite + "&"
  56. + assembleImportExportParams(destDir,
  57. includePatterns, excludePatterns,
  58. exportClasses, exportResources,
  59. exportSources, useDefaultExcludes);
  60. sendRequest(request);
  61. } catch (Exception ex) {
  62. throw new BuildException(ex);
  63. }
  64. }
  65. /**
  66. * Do the import.
  67. */
  68. public void importFiles(
  69. String importProject, File srcDir,
  70. String[] includePatterns, String[] excludePatterns,
  71. boolean importClasses, boolean importResources,
  72. boolean importSources, boolean useDefaultExcludes) {
  73. try {
  74. String request = "http://" + remoteServer + "/servlet/vajimport?"
  75. + VAJImportServlet.PROJECT_NAME_PARAM + "="
  76. + importProject + "&"
  77. + assembleImportExportParams(srcDir,
  78. includePatterns, excludePatterns,
  79. importClasses, importResources,
  80. importSources, useDefaultExcludes);
  81. sendRequest(request);
  82. } catch (Exception ex) {
  83. throw new BuildException(ex);
  84. }
  85. }
  86. /**
  87. * Assemble string for parameters common for import and export
  88. * Helper method to remove double code.
  89. */
  90. private String assembleImportExportParams(
  91. File dir,
  92. String[] includePatterns, String[] excludePatterns,
  93. boolean includeClasses, boolean includeResources,
  94. boolean includeSources, boolean useDefaultExcludes) {
  95. String result =
  96. VAJToolsServlet.DIR_PARAM + "="
  97. + URLEncoder.encode(dir.getPath()) + "&"
  98. + VAJToolsServlet.CLASSES_PARAM + "=" + includeClasses + "&"
  99. + VAJToolsServlet.RESOURCES_PARAM + "=" + includeResources + "&"
  100. + VAJToolsServlet.SOURCES_PARAM + "=" + includeSources + "&"
  101. + VAJToolsServlet.DEFAULT_EXCLUDES_PARAM + "=" + useDefaultExcludes;
  102. if (includePatterns != null) {
  103. for (int i = 0; i < includePatterns.length; i++) {
  104. result = result + "&" + VAJExportServlet.INCLUDE_PARAM + "="
  105. + URLEncoder.encode(includePatterns[i]);
  106. }
  107. }
  108. if (excludePatterns != null) {
  109. for (int i = 0; i < excludePatterns.length; i++) {
  110. result = result + "&" + VAJExportServlet.EXCLUDE_PARAM + "="
  111. + URLEncoder.encode(excludePatterns[i]);
  112. }
  113. }
  114. return result;
  115. }
  116. /**
  117. * Load specified projects.
  118. */
  119. public void loadProjects(Vector projectDescriptions) {
  120. try {
  121. String request = "http://" + remoteServer + "/servlet/vajload?";
  122. String delimiter = "";
  123. for (Enumeration e = projectDescriptions.elements(); e.hasMoreElements();) {
  124. VAJProjectDescription pd = (VAJProjectDescription) e.nextElement();
  125. request = request
  126. + delimiter + VAJLoadServlet.PROJECT_NAME_PARAM
  127. + "=" + pd.getName().replace(' ', '+')
  128. + "&" + VAJLoadServlet.VERSION_PARAM
  129. + "=" + pd.getVersion().replace(' ', '+');
  130. //the first param needs no delimiter, but all other
  131. delimiter = "&";
  132. }
  133. sendRequest(request);
  134. } catch (Exception ex) {
  135. throw new BuildException(ex);
  136. }
  137. }
  138. /**
  139. * logs a message.
  140. */
  141. public void log(String msg, int level) {
  142. caller.log(msg, level);
  143. }
  144. /**
  145. * Sends a servlet request.
  146. */
  147. private void sendRequest(String request) {
  148. boolean requestFailed = false;
  149. try {
  150. log("Request: " + request, MSG_DEBUG);
  151. //must be HTTP connection
  152. URL requestUrl = new URL(request);
  153. HttpURLConnection connection =
  154. (HttpURLConnection) requestUrl.openConnection();
  155. InputStream is = null;
  156. // retry three times
  157. for (int i = 0; i < 3; i++) {
  158. try {
  159. is = connection.getInputStream();
  160. break;
  161. } catch (IOException ex) {
  162. // ignore
  163. }
  164. }
  165. if (is == null) {
  166. log("Can't get " + request, MSG_ERR);
  167. throw new BuildException("Couldn't execute " + request);
  168. }
  169. // log the response
  170. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  171. String line = br.readLine();
  172. while (line != null) {
  173. int level = MSG_ERR;
  174. try {
  175. // the first char of each line contains the log level
  176. level = Integer.parseInt(line.substring(0, 1));
  177. if (level == MSG_ERR) {
  178. requestFailed = true;
  179. }
  180. } catch (Exception e) {
  181. log("Response line doesn't contain log level!", MSG_ERR);
  182. }
  183. log(line.substring(2), level);
  184. line = br.readLine();
  185. }
  186. } catch (IOException ex) {
  187. log("Error sending tool request to VAJ" + ex, MSG_ERR);
  188. throw new BuildException("Couldn't execute " + request);
  189. }
  190. if (requestFailed) {
  191. throw new BuildException("VAJ tool request failed");
  192. }
  193. }
  194. }