{"action":"created","comment":{"url":"https://api.github.com/repos/OpenGamma/Strata/pulls/comments/37397701","id":37397701,"diff_hunk":"@@ -0,0 +1,391 @@\n+/**\n+ * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies\n+ * \n+ * Please see distribution for license.\n+ */\n+package com.opengamma.strata.collect.io;\n+\n+import static com.opengamma.strata.collect.Guavate.ensureOnlyOne;\n+import static com.opengamma.strata.collect.Guavate.toImmutableList;\n+\n+import java.util.List;\n+import java.util.Map;\n+import java.util.Map.Entry;\n+import java.util.Objects;\n+import java.util.Optional;\n+import java.util.Set;\n+import java.util.stream.Stream;\n+\n+import javax.xml.namespace.QName;\n+\n+import org.joda.beans.ImmutableBean;\n+import org.joda.beans.MetaBean;\n+import org.joda.beans.Property;\n+import org.joda.beans.PropertyDefinition;\n+import org.joda.beans.impl.light.LightMetaBean;\n+\n+import com.google.common.collect.ImmutableList;\n+import com.google.common.collect.ImmutableMap;\n+import com.opengamma.strata.collect.ArgChecker;\n+import com.opengamma.strata.collect.Messages;\n+\n+/**\n+ * A single element in the tree structure of XML.\n+ * <p>\n+ * This class is a minimal, lightweight representation of an element in the XML tree.\n+ * The element has a name, attributes, and either content or children.\n+ * <p>\n+ * Note that this representation does not express all XML features.\n+ * No support is provided for processing instructions, comments or mixed content.\n+ * In addition, it is not possible to determine the difference between empty content and no children.\n+ * <p>\n+ * There is no explicit support for namespaces.\n+ * When creating instances, the caller may choose to use a convention to represent namespaces.\n+ * For example, element and attribute names may use prefixes or the standard {@link QName} format.\n+ */\n+public final class XmlElement\n+    implements ImmutableBean {\n+\n+  /**\n+   * The meta-bean.\n+   * This is a manually coded bean.\n+   */\n+  private static MetaBean META_BEAN = LightMetaBean.of(XmlElement.class);\n+\n+  /**\n+   * The element name.\n+   */\n+  @PropertyDefinition(validate = \"notNull\")\n+  private final String name;\n+  /**\n+   * The attributes.\n+   */\n+  @PropertyDefinition(validate = \"notNull\")\n+  private final ImmutableMap<String, String> attributes;\n+  /**\n+   * The element content.\n+   */\n+  @PropertyDefinition(validate = \"notNull\")\n+  private final String content;\n+  /**\n+   * The child nodes.\n+   */\n+  @PropertyDefinition(validate = \"notNull\")\n+  private final ImmutableList<XmlElement> children;\n+\n+  //-------------------------------------------------------------------------\n+  /**\n+   * Obtains an instance with content and no attributes.\n+   * <p>\n+   * Returns an element representing XML with content, but no children.\n+   * \n+   * @param name  the element name, not empty\n+   * @param content  the content, empty if the element has no content\n+   * @return the element\n+   */\n+  public static XmlElement ofContent(String name, String content) {\n+    return ofContent(name, ImmutableMap.of(), content);\n+  }\n+\n+  /**\n+   * Obtains an instance with content and attributes.\n+   * <p>\n+   * Returns an element representing XML with content and attributes but no children.\n+   * \n+   * @param name  the element name, not empty\n+   * @param attributes  the attributes, empty if the element has no attributes\n+   * @param content  the content, empty if the element has no content\n+   * @return the element\n+   */\n+  public static XmlElement ofContent(String name, Map<String, String> attributes, String content) {\n+    return new XmlElement(name, ImmutableMap.copyOf(attributes), content, ImmutableList.of());\n+  }\n+\n+  /**\n+   * Obtains an instance with children and no attributes.\n+   * <p>\n+   * Returns an element representing XML with children, but no content.\n+   * \n+   * @param name  the element name, not empty\n+   * @param children  the children, empty if the element has no children\n+   * @return the element\n+   */\n+  public static XmlElement ofChildren(String name, List<XmlElement> children) {\n+    return ofChildren(name, ImmutableMap.of(), children);\n+  }\n+\n+  /**\n+   * Obtains an instance with children and attributes.\n+   * <p>\n+   * Returns an element representing XML with children and attributes, but no content.\n+   * \n+   * @param name  the element name, not empty\n+   * @param attributes  the attributes, empty if the element has no attributes\n+   * @param children  the children, empty if the element has no children\n+   * @return the element\n+   */\n+  public static XmlElement ofChildren(String name, Map<String, String> attributes, List<XmlElement> children) {\n+    return new XmlElement(name, ImmutableMap.copyOf(attributes), \"\", ImmutableList.copyOf(children));\n+  }\n+\n+  //-------------------------------------------------------------------------\n+  /**\n+   * Creates an instance.\n+   * \n+   * @param name  the element name, not empty\n+   * @param attributes  the attributes, empty if the element has no attributes\n+   * @param content  the content, empty if the element has no content\n+   * @param children  the children, empty if the element has no children\n+   */\n+  private XmlElement(\n+      String name,\n+      ImmutableMap<String, String> attributes,\n+      String content,\n+      ImmutableList<XmlElement> children) {\n+\n+    this.name = ArgChecker.notEmpty(name, \"name\");\n+    this.attributes = ArgChecker.notNull(attributes, \"attributes\");\n+    this.content = ArgChecker.notNull(content, \"content\");\n+    this.children = ArgChecker.notNull(children, \"children\");\n+  }\n+\n+  //-----------------------------------------------------------------------\n+  /**\n+   * Gets the element name.\n+   * \n+   * @return the name\n+   */\n+  public String getName() {\n+    return name;\n+  }\n+\n+  /**\n+   * Gets an attribute by name.\n+   * <p>\n+   * This returns the value of the attribute with the specified name.\n+   * An exception is thrown if the attribute does not exist.\n+   * \n+   * @param attrName  the attribute name to find\n+   * @return the attribute\n+   * @throws IllegalArgumentException if the attribute name does not exist\n+   */\n+  public String getAttribute(String attrName) {\n+    String attrValue = attributes.get(attrName);\n+    if (attrValue == null) {\n+      throw new IllegalArgumentException(Messages.format(\n+          \"Unknown attribute '{}' on element '{}'\", attrName, name));\n+    }\n+    return attrValue;\n+  }\n+\n+  /**\n+   * Gets the attributes.\n+   * <p>\n+   * This returns all the attributes of this element.\n+   * \n+   * @return the attributes\n+   */\n+  public ImmutableMap<String, String> getAttributes() {\n+    return attributes;\n+  }\n+\n+  /**\n+   * Checks if the element has content.\n+   * <p>\n+   * Content exists if it is non-empty.\n+   * \n+   * @return the content\n+   */\n+  public boolean hasContent() {\n+    return content.length() > 0;\n+  }\n+\n+  /**\n+   * Gets the element content.\n+   * <p>\n+   * If this element has no content, the empty string is returned.\n+   * \n+   * @return the content\n+   */\n+  public String getContent() {\n+    return content;\n+  }\n+\n+  /**\n+   * Gets a child element by index.\n+   * \n+   * @param index  the index to find\n+   * @return the child\n+   * @throws IndexOutOfBoundsException if the index is invalid\n+   */\n+  public XmlElement getChild(int index) {\n+    return children.get(index);\n+  }\n+\n+  /**\n+   * Gets the child elements.\n+   * <p>\n+   * This returns all the children of this element.\n+   * \n+   * @return the children\n+   */\n+  public ImmutableList<XmlElement> getChildren() {\n+    return children;\n+  }\n+\n+  /**\n+   * Gets the single matching child element with the specified name, or empty if not found.\n+   * <p>\n+   * This returns the child element with the specified name.\n+   * An exception is thrown if there is more than one matching child.\n+   * \n+   * @param childName  the name to match\n+   * @return the child matching the name\n+   * @throws IllegalArgumentException if there is more than one match\n+   */\n+  public Optional<XmlElement> getChildOptional(String childName) {\n+    return streamChildren(childName).reduce(ensureOnlyOne());\n+  }\n+\n+  /**\n+   * Gets the single matching child element with the specified name.\n+   * <p>\n+   * This returns the child element with the specified name.\n+   * An exception is thrown if there is more than one matching child or the child does not exist.\n+   * \n+   * @param childName  the name to match\n+   * @return the child matching the name\n+   * @throws IllegalArgumentException if there is more than one match or no matches\n+   */\n+  public XmlElement getChildSingle(String childName) {\n+    return getChildOptional(childName)\n+        .orElseThrow(() -> new IllegalArgumentException(Messages.format(\n+            \"Unknown element '{}' in element '{}'\", childName, name)));\n+  }\n+\n+  /**\n+   * Gets the first matching child element with the specified name.\n+   * <p>\n+   * This returns the first child element with the specified name.\n+   * An exception is thrown if the child does not exist.\n+   * \n+   * @param childName  the name to match\n+   * @return the child matching the name\n+   * @throws IllegalArgumentException if there is no match\n+   */\n+  public XmlElement getChildFirst(String childName) {\n+    return streamChildren(childName)\n+        .findFirst()\n+        .orElseThrow(() -> new IllegalArgumentException(Messages.format(\n+            \"Unknown element '{}' in element '{}'\", childName, name)));\n+  }\n+\n+  /**\n+   * Gets the child elements matching the specified name.\n+   * <p>\n+   * This returns all the child elements with the specified name.\n+   * \n+   * @param childName  the name to match\n+   * @return the children matching the name\n+   */\n+  public ImmutableList<XmlElement> getChildren(String childName) {\n+    return streamChildren(childName).collect(toImmutableList());\n+  }\n+\n+  /**\n+   * Gets the child elements matching the specified name.\n+   * <p>\n+   * This returns all the child elements with the specified name.\n+   * \n+   * @param childName  the name to match\n+   * @return the children matching the name\n+   */\n+  public Stream<XmlElement> streamChildren(String childName) {\n+    return children.stream().filter(child -> child.getName().equals(childName));\n+  }\n+\n+  //-------------------------------------------------------------------------\n+  @Override\n+  public MetaBean metaBean() {\n+    return META_BEAN;\n+  }\n+\n+  @Override\n+  public <R> Property<R> property(String propertyName) {\n+    return metaBean().<R>metaProperty(propertyName).createProperty(this);\n+  }\n+\n+  @Override\n+  public Set<String> propertyNames() {\n+    return metaBean().metaPropertyMap().keySet();\n+  }\n+\n+  //-------------------------------------------------------------------------\n+  /**\n+   * Checks if this element equals another.\n+   * <p>\n+   * This compares the entire state of the elements.\n+   * \n+   * @param obj  the other element, null returns false\n+   * @return true if equal\n+   */\n+  @Override\n+  public boolean equals(Object obj) {\n+    if (obj == this) {\n+      return true;\n+    }\n+    if (obj instanceof XmlElement) {\n+      XmlElement other = (XmlElement) obj;\n+      return name.equals(other.name) &&\n+          Objects.equals(content, other.content) &&\n+          attributes.equals(other.attributes) &&\n+          children.equals(other.children);\n+    }\n+    return false;\n+  }\n+\n+  /**\n+   * Returns a suitable hash code.\n+   * <p>\n+   * Note that the has code excludes the children to ensure performance is reasonable in large trees.","path":"modules/collect/src/main/java/com/opengamma/strata/collect/io/XmlElement.java","position":347,"original_position":350,"commit_id":"d9a7f42d9d4826d2d3fcad3c5cfb001bc74c2415","original_commit_id":"6647eb7ed5a9d72e5d6d80a3331fe663761193a2","user":{"login":"cjkent","id":98477,"avatar_url":"https://avatars.githubusercontent.com/u/98477?v=3","gravatar_id":"","url":"https://api.github.com/users/cjkent","html_url":"https://github.com/cjkent","followers_url":"https://api.github.com/users/cjkent/followers","following_url":"https://api.github.com/users/cjkent/following{/other_user}","gists_url":"https://api.github.com/users/cjkent/gists{/gist_id}","starred_url":"https://api.github.com/users/cjkent/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cjkent/subscriptions","organizations_url":"https://api.github.com/users/cjkent/orgs","repos_url":"https://api.github.com/users/cjkent/repos","events_url":"https://api.github.com/users/cjkent/events{/privacy}","received_events_url":"https://api.github.com/users/cjkent/received_events","type":"User","site_admin":false},"body":"I'm still not comfortable with breaking such a fundamental rule without a concrete reason. It feels like a premature optimisation.\r\n\r\nIf we don't think these will be used as map keys then what harm does it do to implement `hashCode` properly? Or not implement it at all? Either would be preferable to a surprising and non-standard implementation that isn't justified by any data.\r\n","created_at":"2015-08-19T09:54:39Z","updated_at":"2015-08-19T09:54:39Z","html_url":"https://github.com/OpenGamma/Strata/pull/424#discussion_r37397701","pull_request_url":"https://api.github.com/repos/OpenGamma/Strata/pulls/424","_links":{"self":{"href":"https://api.github.com/repos/OpenGamma/Strata/pulls/comments/37397701"},"html":{"href":"https://github.com/OpenGamma/Strata/pull/424#discussion_r37397701"},"pull_request":{"href":"https://api.github.com/repos/OpenGamma/Strata/pulls/424"}}},"pull_request":{"url":"https://api.github.com/repos/OpenGamma/Strata/pulls/424","id":42456368,"html_url":"https://github.com/OpenGamma/Strata/pull/424","diff_url":"https://github.com/OpenGamma/Strata/pull/424.diff","patch_url":"https://github.com/OpenGamma/Strata/pull/424.patch","issue_url":"https://api.github.com/repos/OpenGamma/Strata/issues/424","number":424,"state":"open","locked":false,"title":"Add XmlFile support","user":{"login":"jodastephen","id":213212,"avatar_url":"https://avatars.githubusercontent.com/u/213212?v=3","gravatar_id":"","url":"https://api.github.com/users/jodastephen","html_url":"https://github.com/jodastephen","followers_url":"https://api.github.com/users/jodastephen/followers","following_url":"https://api.github.com/users/jodastephen/following{/other_user}","gists_url":"https://api.github.com/users/jodastephen/gists{/gist_id}","starred_url":"https://api.github.com/users/jodastephen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jodastephen/subscriptions","organizations_url":"https://api.github.com/users/jodastephen/orgs","repos_url":"https://api.github.com/users/jodastephen/repos","events_url":"https://api.github.com/users/jodastephen/events{/privacy}","received_events_url":"https://api.github.com/users/jodastephen/received_events","type":"User","site_admin":false},"body":"Parse simple/common XML files into a DOM-like structure\r\nBase on StAX, but hidden from regular use\r\nAvoid exposing comments, PIs and mixed content\r\nEnhance Guavate to check a stream contains a single element","created_at":"2015-08-14T13:38:39Z","updated_at":"2015-08-19T09:54:40Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4bc0e8dacf16a8940d2919a60bddd38d7cbbc9df","assignee":{"login":"cjkent","id":98477,"avatar_url":"https://avatars.githubusercontent.com/u/98477?v=3","gravatar_id":"","url":"https://api.github.com/users/cjkent","html_url":"https://github.com/cjkent","followers_url":"https://api.github.com/users/cjkent/followers","following_url":"https://api.github.com/users/cjkent/following{/other_user}","gists_url":"https://api.github.com/users/cjkent/gists{/gist_id}","starred_url":"https://api.github.com/users/cjkent/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cjkent/subscriptions","organizations_url":"https://api.github.com/users/cjkent/orgs","repos_url":"https://api.github.com/users/cjkent/repos","events_url":"https://api.github.com/users/cjkent/events{/privacy}","received_events_url":"https://api.github.com/users/cjkent/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/OpenGamma/Strata/pulls/424/commits","review_comments_url":"https://api.github.com/repos/OpenGamma/Strata/pulls/424/comments","review_comment_url":"https://api.github.com/repos/OpenGamma/Strata/pulls/comments{/number}","comments_url":"https://api.github.com/repos/OpenGamma/Strata/issues/424/comments","statuses_url":"https://api.github.com/repos/OpenGamma/Strata/statuses/d9a7f42d9d4826d2d3fcad3c5cfb001bc74c2415","head":{"label":"OpenGamma:topic/xml-file","ref":"topic/xml-file","sha":"d9a7f42d9d4826d2d3fcad3c5cfb001bc74c2415","user":{"login":"OpenGamma","id":120064,"avatar_url":"https://avatars.githubusercontent.com/u/120064?v=3","gravatar_id":"","url":"https://api.github.com/users/OpenGamma","html_url":"https://github.com/OpenGamma","followers_url":"https://api.github.com/users/OpenGamma/followers","following_url":"https://api.github.com/users/OpenGamma/following{/other_user}","gists_url":"https://api.github.com/users/OpenGamma/gists{/gist_id}","starred_url":"https://api.github.com/users/OpenGamma/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OpenGamma/subscriptions","organizations_url":"https://api.github.com/users/OpenGamma/orgs","repos_url":"https://api.github.com/users/OpenGamma/repos","events_url":"https://api.github.com/users/OpenGamma/events{/privacy}","received_events_url":"https://api.github.com/users/OpenGamma/received_events","type":"Organization","site_admin":false},"repo":{"id":20882897,"name":"Strata","full_name":"OpenGamma/Strata","owner":{"login":"OpenGamma","id":120064,"avatar_url":"https://avatars.githubusercontent.com/u/120064?v=3","gravatar_id":"","url":"https://api.github.com/users/OpenGamma","html_url":"https://github.com/OpenGamma","followers_url":"https://api.github.com/users/OpenGamma/followers","following_url":"https://api.github.com/users/OpenGamma/following{/other_user}","gists_url":"https://api.github.com/users/OpenGamma/gists{/gist_id}","starred_url":"https://api.github.com/users/OpenGamma/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OpenGamma/subscriptions","organizations_url":"https://api.github.com/users/OpenGamma/orgs","repos_url":"https://api.github.com/users/OpenGamma/repos","events_url":"https://api.github.com/users/OpenGamma/events{/privacy}","received_events_url":"https://api.github.com/users/OpenGamma/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/OpenGamma/Strata","description":"OpenGamma's next-generation market risk toolkit","fork":false,"url":"https://api.github.com/repos/OpenGamma/Strata","forks_url":"https://api.github.com/repos/OpenGamma/Strata/forks","keys_url":"https://api.github.com/repos/OpenGamma/Strata/keys{/key_id}","collaborators_url":"https://api.github.com/repos/OpenGamma/Strata/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/OpenGamma/Strata/teams","hooks_url":"https://api.github.com/repos/OpenGamma/Strata/hooks","issue_events_url":"https://api.github.com/repos/OpenGamma/Strata/issues/events{/number}","events_url":"https://api.github.com/repos/OpenGamma/Strata/events","assignees_url":"https://api.github.com/repos/OpenGamma/Strata/assignees{/user}","branches_url":"https://api.github.com/repos/OpenGamma/Strata/branches{/branch}","tags_url":"https://api.github.com/repos/OpenGamma/Strata/tags","blobs_url":"https://api.github.com/repos/OpenGamma/Strata/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/OpenGamma/Strata/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/OpenGamma/Strata/git/refs{/sha}","trees_url":"https://api.github.com/repos/OpenGamma/Strata/git/trees{/sha}","statuses_url":"https://api.github.com/repos/OpenGamma/Strata/statuses/{sha}","languages_url":"https://api.github.com/repos/OpenGamma/Strata/languages","stargazers_url":"https://api.github.com/repos/OpenGamma/Strata/stargazers","contributors_url":"https://api.github.com/repos/OpenGamma/Strata/contributors","subscribers_url":"https://api.github.com/repos/OpenGamma/Strata/subscribers","subscription_url":"https://api.github.com/repos/OpenGamma/Strata/subscription","commits_url":"https://api.github.com/repos/OpenGamma/Strata/commits{/sha}","git_commits_url":"https://api.github.com/repos/OpenGamma/Strata/git/commits{/sha}","comments_url":"https://api.github.com/repos/OpenGamma/Strata/comments{/number}","issue_comment_url":"https://api.github.com/repos/OpenGamma/Strata/issues/comments{/number}","contents_url":"https://api.github.com/repos/OpenGamma/Strata/contents/{+path}","compare_url":"https://api.github.com/repos/OpenGamma/Strata/compare/{base}...{head}","merges_url":"https://api.github.com/repos/OpenGamma/Strata/merges","archive_url":"https://api.github.com/repos/OpenGamma/Strata/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/OpenGamma/Strata/downloads","issues_url":"https://api.github.com/repos/OpenGamma/Strata/issues{/number}","pulls_url":"https://api.github.com/repos/OpenGamma/Strata/pulls{/number}","milestones_url":"https://api.github.com/repos/OpenGamma/Strata/milestones{/number}","notifications_url":"https://api.github.com/repos/OpenGamma/Strata/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/OpenGamma/Strata/labels{/name}","releases_url":"https://api.github.com/repos/OpenGamma/Strata/releases{/id}","created_at":"2014-06-16T11:45:55Z","updated_at":"2015-08-14T20:11:53Z","pushed_at":"2015-08-18T16:54:26Z","git_url":"git://github.com/OpenGamma/Strata.git","ssh_url":"git@github.com:OpenGamma/Strata.git","clone_url":"https://github.com/OpenGamma/Strata.git","svn_url":"https://github.com/OpenGamma/Strata","homepage":"http://opengamma.github.io/StrataDocs","size":22718,"stargazers_count":8,"watchers_count":8,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":35,"forks":3,"open_issues":35,"watchers":8,"default_branch":"master"}},"base":{"label":"OpenGamma:master","ref":"master","sha":"7013301a9991f0ba34cd8e81c90478ae3095ca91","user":{"login":"OpenGamma","id":120064,"avatar_url":"https://avatars.githubusercontent.com/u/120064?v=3","gravatar_id":"","url":"https://api.github.com/users/OpenGamma","html_url":"https://github.com/OpenGamma","followers_url":"https://api.github.com/users/OpenGamma/followers","following_url":"https://api.github.com/users/OpenGamma/following{/other_user}","gists_url":"https://api.github.com/users/OpenGamma/gists{/gist_id}","starred_url":"https://api.github.com/users/OpenGamma/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OpenGamma/subscriptions","organizations_url":"https://api.github.com/users/OpenGamma/orgs","repos_url":"https://api.github.com/users/OpenGamma/repos","events_url":"https://api.github.com/users/OpenGamma/events{/privacy}","received_events_url":"https://api.github.com/users/OpenGamma/received_events","type":"Organization","site_admin":false},"repo":{"id":20882897,"name":"Strata","full_name":"OpenGamma/Strata","owner":{"login":"OpenGamma","id":120064,"avatar_url":"https://avatars.githubusercontent.com/u/120064?v=3","gravatar_id":"","url":"https://api.github.com/users/OpenGamma","html_url":"https://github.com/OpenGamma","followers_url":"https://api.github.com/users/OpenGamma/followers","following_url":"https://api.github.com/users/OpenGamma/following{/other_user}","gists_url":"https://api.github.com/users/OpenGamma/gists{/gist_id}","starred_url":"https://api.github.com/users/OpenGamma/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OpenGamma/subscriptions","organizations_url":"https://api.github.com/users/OpenGamma/orgs","repos_url":"https://api.github.com/users/OpenGamma/repos","events_url":"https://api.github.com/users/OpenGamma/events{/privacy}","received_events_url":"https://api.github.com/users/OpenGamma/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/OpenGamma/Strata","description":"OpenGamma's next-generation market risk toolkit","fork":false,"url":"https://api.github.com/repos/OpenGamma/Strata","forks_url":"https://api.github.com/repos/OpenGamma/Strata/forks","keys_url":"https://api.github.com/repos/OpenGamma/Strata/keys{/key_id}","collaborators_url":"https://api.github.com/repos/OpenGamma/Strata/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/OpenGamma/Strata/teams","hooks_url":"https://api.github.com/repos/OpenGamma/Strata/hooks","issue_events_url":"https://api.github.com/repos/OpenGamma/Strata/issues/events{/number}","events_url":"https://api.github.com/repos/OpenGamma/Strata/events","assignees_url":"https://api.github.com/repos/OpenGamma/Strata/assignees{/user}","branches_url":"https://api.github.com/repos/OpenGamma/Strata/branches{/branch}","tags_url":"https://api.github.com/repos/OpenGamma/Strata/tags","blobs_url":"https://api.github.com/repos/OpenGamma/Strata/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/OpenGamma/Strata/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/OpenGamma/Strata/git/refs{/sha}","trees_url":"https://api.github.com/repos/OpenGamma/Strata/git/trees{/sha}","statuses_url":"https://api.github.com/repos/OpenGamma/Strata/statuses/{sha}","languages_url":"https://api.github.com/repos/OpenGamma/Strata/languages","stargazers_url":"https://api.github.com/repos/OpenGamma/Strata/stargazers","contributors_url":"https://api.github.com/repos/OpenGamma/Strata/contributors","subscribers_url":"https://api.github.com/repos/OpenGamma/Strata/subscribers","subscription_url":"https://api.github.com/repos/OpenGamma/Strata/subscription","commits_url":"https://api.github.com/repos/OpenGamma/Strata/commits{/sha}","git_commits_url":"https://api.github.com/repos/OpenGamma/Strata/git/commits{/sha}","comments_url":"https://api.github.com/repos/OpenGamma/Strata/comments{/number}","issue_comment_url":"https://api.github.com/repos/OpenGamma/Strata/issues/comments{/number}","contents_url":"https://api.github.com/repos/OpenGamma/Strata/contents/{+path}","compare_url":"https://api.github.com/repos/OpenGamma/Strata/compare/{base}...{head}","merges_url":"https://api.github.com/repos/OpenGamma/Strata/merges","archive_url":"https://api.github.com/repos/OpenGamma/Strata/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/OpenGamma/Strata/downloads","issues_url":"https://api.github.com/repos/OpenGamma/Strata/issues{/number}","pulls_url":"https://api.github.com/repos/OpenGamma/Strata/pulls{/number}","milestones_url":"https://api.github.com/repos/OpenGamma/Strata/milestones{/number}","notifications_url":"https://api.github.com/repos/OpenGamma/Strata/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/OpenGamma/Strata/labels{/name}","releases_url":"https://api.github.com/repos/OpenGamma/Strata/releases{/id}","created_at":"2014-06-16T11:45:55Z","updated_at":"2015-08-14T20:11:53Z","pushed_at":"2015-08-18T16:54:26Z","git_url":"git://github.com/OpenGamma/Strata.git","ssh_url":"git@github.com:OpenGamma/Strata.git","clone_url":"https://github.com/OpenGamma/Strata.git","svn_url":"https://github.com/OpenGamma/Strata","homepage":"http://opengamma.github.io/StrataDocs","size":22718,"stargazers_count":8,"watchers_count":8,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":35,"forks":3,"open_issues":35,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/OpenGamma/Strata/pulls/424"},"html":{"href":"https://github.com/OpenGamma/Strata/pull/424"},"issue":{"href":"https://api.github.com/repos/OpenGamma/Strata/issues/424"},"comments":{"href":"https://api.github.com/repos/OpenGamma/Strata/issues/424/comments"},"review_comments":{"href":"https://api.github.com/repos/OpenGamma/Strata/pulls/424/comments"},"review_comment":{"href":"https://api.github.com/repos/OpenGamma/Strata/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/OpenGamma/Strata/pulls/424/commits"},"statuses":{"href":"https://api.github.com/repos/OpenGamma/Strata/statuses/d9a7f42d9d4826d2d3fcad3c5cfb001bc74c2415"}}}}