/Flickr4Java/src/main/java/com/flickr4java/flickr/reflection/ReflectionInterface.java

https://gitlab.com/sugesk/flickr4java · Java · 204 lines · 109 code · 23 blank · 72 comment · 16 complexity · e4f030630a84f14aca33a0f769197090 MD5 · raw file

  1. /*
  2. * Copyright (c) 2005 Aetrion LLC.
  3. */
  4. package com.flickr4java.flickr.reflection;
  5. import com.flickr4java.flickr.FlickrException;
  6. import com.flickr4java.flickr.Response;
  7. import com.flickr4java.flickr.Transport;
  8. import com.flickr4java.flickr.util.XMLUtilities;
  9. import org.apache.log4j.Logger;
  10. import org.w3c.dom.Element;
  11. import org.w3c.dom.NodeList;
  12. import java.util.ArrayList;
  13. import java.util.Collection;
  14. import java.util.HashMap;
  15. import java.util.List;
  16. import java.util.Map;
  17. /**
  18. * Interface for testing the complete implementation of all Flickr-methods.
  19. * <p>
  20. *
  21. * @author Anthony Eden
  22. * @version $Id: ReflectionInterface.java,v 1.10 2008/01/28 23:01:45 x-mago Exp $
  23. */
  24. public class ReflectionInterface {
  25. private static Logger _log = Logger.getLogger(ReflectionInterface.class);
  26. public static final String METHOD_GET_METHOD_INFO = "flickr.reflection.getMethodInfo";
  27. public static final String METHOD_GET_METHODS = "flickr.reflection.getMethods";
  28. private final String apiKey;
  29. private final String sharedSecret;
  30. private final Transport transport;
  31. /**
  32. * Construct a ReflectionInterface.
  33. *
  34. * @param apiKey
  35. * The API key
  36. * @param sharedSecret
  37. * The Shared Secret
  38. * @param transport
  39. * The Transport interface
  40. */
  41. public ReflectionInterface(String apiKey, String sharedSecret, Transport transport) {
  42. this.apiKey = apiKey;
  43. this.sharedSecret = sharedSecret;
  44. this.transport = transport;
  45. }
  46. /**
  47. * Get the info for the specified method.
  48. *
  49. * @param methodName
  50. * The method name
  51. * @return The Method object
  52. * @throws FlickrException
  53. */
  54. public Method getMethodInfo(String methodName) throws FlickrException {
  55. Map<String, Object> parameters = new HashMap<String, Object>();
  56. parameters.put("method", METHOD_GET_METHOD_INFO);
  57. parameters.put("method_name", methodName);
  58. Response response = transport.get(transport.getPath(), parameters, apiKey, sharedSecret);
  59. if (response.isError()) {
  60. throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
  61. }
  62. Element methodElement = response.getPayload();
  63. Method method = new Method();
  64. method.setName(methodElement.getAttribute("name"));
  65. method.setNeedsLogin("1".equals(methodElement.getAttribute("needslogin")));
  66. method.setNeedsSigning("1".equals(methodElement.getAttribute("needssigning")));
  67. String requiredPermsStr = methodElement.getAttribute("requiredperms");
  68. if (requiredPermsStr != null && requiredPermsStr.length() > 0) {
  69. try {
  70. int perms = Integer.parseInt(requiredPermsStr);
  71. method.setRequiredPerms(perms);
  72. } catch (NumberFormatException e) {
  73. // what shall we do?
  74. e.printStackTrace();
  75. }
  76. }
  77. method.setDescription(XMLUtilities.getChildValue(methodElement, "description"));
  78. method.setResponse(XMLUtilities.getChildValue(methodElement, "response"));
  79. method.setExplanation(XMLUtilities.getChildValue(methodElement, "explanation"));
  80. List<Argument> arguments = new ArrayList<Argument>();
  81. Element argumentsElement = XMLUtilities.getChild(methodElement, "arguments");
  82. // tolerant fix for incorrect nesting of the <arguments> element
  83. // as observed in current flickr responses of this method
  84. //
  85. // specified as
  86. // <rsp>
  87. // <method>
  88. // <arguments>
  89. // <errors>
  90. // <method>
  91. // </rsp>
  92. //
  93. // observed as
  94. // <rsp>
  95. // <method>
  96. // <arguments>
  97. // <errors>
  98. // </rsp>
  99. //
  100. if (argumentsElement == null) {
  101. _log.debug("getMethodInfo: Using workaround for arguments array");
  102. Element parent = (Element) methodElement.getParentNode();
  103. Element child = XMLUtilities.getChild(parent, "arguments");
  104. if (child != null) {
  105. argumentsElement = child;
  106. }
  107. }
  108. NodeList argumentElements = argumentsElement.getElementsByTagName("argument");
  109. for (int i = 0; i < argumentElements.getLength(); i++) {
  110. Argument argument = new Argument();
  111. Element argumentElement = (Element) argumentElements.item(i);
  112. argument.setName(argumentElement.getAttribute("name"));
  113. argument.setOptional("1".equals(argumentElement.getAttribute("optional")));
  114. argument.setDescription(XMLUtilities.getValue(argumentElement));
  115. arguments.add(argument);
  116. }
  117. method.setArguments(arguments);
  118. Element errorsElement = XMLUtilities.getChild(methodElement, "errors");
  119. // tolerant fix for incorrect nesting of the <errors> element
  120. // as observed in current flickr responses of this method
  121. // as of 2006-09-15
  122. //
  123. // specified as
  124. // <rsp>
  125. // <method>
  126. // <arguments>
  127. // <errors>
  128. // <method>
  129. // </rsp>
  130. //
  131. // observed as
  132. // <rsp>
  133. // <method>
  134. // <arguments>
  135. // <errors>
  136. // </rsp>
  137. //
  138. if (errorsElement == null) {
  139. _log.debug("getMethodInfo: Using workaround for errors array");
  140. Element parent = (Element) methodElement.getParentNode();
  141. Element child = XMLUtilities.getChild(parent, "errors");
  142. if (child != null) {
  143. errorsElement = child;
  144. }
  145. }
  146. List<Error> errors = new ArrayList<Error>();
  147. NodeList errorElements = errorsElement.getElementsByTagName("error");
  148. for (int i = 0; i < errorElements.getLength(); i++) {
  149. Error error = new Error();
  150. Element errorElement = (Element) errorElements.item(i);
  151. error.setCode(errorElement.getAttribute("code"));
  152. error.setMessage(errorElement.getAttribute("message"));
  153. error.setExplaination(XMLUtilities.getValue(errorElement));
  154. errors.add(error);
  155. }
  156. method.setErrors(errors);
  157. return method;
  158. }
  159. /**
  160. * Get a list of all methods.
  161. *
  162. * @return The method names
  163. * @throws FlickrException
  164. */
  165. public Collection<String> getMethods() throws FlickrException {
  166. Map<String, Object> parameters = new HashMap<String, Object>();
  167. parameters.put("method", METHOD_GET_METHODS);
  168. Response response = transport.get(transport.getPath(), parameters, apiKey, sharedSecret);
  169. if (response.isError()) {
  170. throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
  171. }
  172. Element methodsElement = response.getPayload();
  173. List<String> methods = new ArrayList<String>();
  174. NodeList methodElements = methodsElement.getElementsByTagName("method");
  175. for (int i = 0; i < methodElements.getLength(); i++) {
  176. Element methodElement = (Element) methodElements.item(i);
  177. methods.add(XMLUtilities.getValue(methodElement));
  178. }
  179. return methods;
  180. }
  181. }