{"action":"created","comment":{"url":"https://api.github.com/repos/01org/parameter-framework/pulls/comments/31405143","id":31405143,"diff_hunk":"@@ -0,0 +1,255 @@\n+/*\n+ * Copyright (c) 2011-2015, Intel Corporation\n+ * All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or without modification,\n+ * are permitted provided that the following conditions are met:\n+ *\n+ * 1. Redistributions of source code must retain the above copyright notice, this\n+ * list of conditions and the following disclaimer.\n+ *\n+ * 2. Redistributions in binary form must reproduce the above copyright notice,\n+ * this list of conditions and the following disclaimer in the documentation and/or\n+ * other materials provided with the distribution.\n+ *\n+ * 3. Neither the name of the copyright holder nor the names of its contributors\n+ * may be used to endorse or promote products derived from this software without\n+ * specific prior written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\n+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+#include \"criterion/Criterion.h\"\n+#include <Utility.h>\n+#include <log/Logger.h>\n+\n+#include <stdexcept>\n+#include <sstream>\n+#include <cassert>\n+\n+namespace core\n+{\n+namespace criterion\n+{\n+\n+Criterion::Criterion(const std::string& name,\n+                     const CriterionInterface::Values& values,\n+                     core::log::Logger& logger)\n+    : Criterion(name, logger, values, (values.empty() ? State{\"\"} : State{*values.begin()}), {})\n+{\n+    if (mValues.size() < 2) {\n+        throw InvalidCriterionError(\"Not enough values were provided for exclusive criterion '\" +\n+                                    mName  + \"' which needs at least 2 values\");\n+    }\n+}\n+\n+Criterion::Criterion(const std::string& name,\n+                     core::log::Logger& logger,\n+                     const CriterionInterface::Values& values,\n+                     const State& defaultState,\n+                     const MatchMethods& derivedMatchMethods)\n+    : mValues(values.begin(), values.end()),\n+      mMatchMethods(gatherMap<MatchMethods>(MatchMethods{\n+                                {\"Is\", [&](const State& state){ return mState == state; }},\n+                                {\"IsNot\", [&](const State& state){ return mState != state; }}},\n+                                derivedMatchMethods)),\n+      mState(defaultState), _uiNbModifications(0), _logger(logger), mName(name),\n+      mDefaultState(defaultState)\n+{\n+}\n+\n+bool Criterion::hasBeenModified() const\n+{\n+    return _uiNbModifications != 0;\n+}\n+\n+void Criterion::resetModifiedStatus()\n+{\n+    _uiNbModifications = 0;\n+}\n+\n+bool Criterion::setState(const State& state, std::string& error)\n+{\n+    if (state.size() > 1) {\n+        error = \"Exclusive criterion '\" + mName + \"' can't be set with more than one value\";\n+        return false;\n+    }\n+\n+    State oldState = mState;\n+    if (state.empty()) {\n+        mState = mDefaultState;\n+    } else {\n+        // Check that the state contains a registered value\n+        if (mValues.count(*state.begin()) != 1) {\n+            error = \"Exclusive criterion '\" + mName + \"' can't be set with '\" +\n+                    *state.begin() + \"' value which is not registered\";\n+            return false;\n+        }\n+        mState = state;\n+    }\n+\n+    if (mState != oldState) {\n+        stateModificationsEvent();\n+    }\n+\n+    return true;\n+}\n+\n+void Criterion::stateModificationsEvent()\n+{\n+    _logger.info() << \"Selection criterion changed event: \"\n+                   << getFormattedDescription(false, false);\n+    // Check if the previous criterion value has been taken into account\n+    // (i.e. at least one Configuration was applied\n+    // since the last criterion change)\n+    if (_uiNbModifications != 0) {\n+        _logger.warning() << \"Selection criterion '\" << mName\n+                          << \"' has been modified \" << _uiNbModifications\n+                          << \" time(s) without any configuration application\";\n+    }\n+    // Track the number of modifications for this criterion\n+    _uiNbModifications++;\n+}\n+\n+CriterionInterface::State Criterion::getState() const\n+{\n+    return mState;\n+}\n+\n+std::string Criterion::getName() const\n+{\n+    return mName;\n+}\n+\n+std::string Criterion::getFormattedDescription(bool bWithTypeInfo, bool bHumanReadable) const\n+{\n+    std::string strFormattedDescription;\n+    if (bHumanReadable) {\n+\n+        if (bWithTypeInfo) {\n+\n+            // Display type info\n+            CUtility::appendTitle(strFormattedDescription, mName + \":\");\n+\n+            // States\n+            strFormattedDescription += \"Possible states \";\n+\n+            // Type Kind\n+            strFormattedDescription += \"(\";\n+            strFormattedDescription += getKind();\n+            strFormattedDescription += \"): \";\n+\n+            // States\n+            strFormattedDescription += listPossibleValues() + \"\\n\";\n+\n+            // Current State\n+            strFormattedDescription += \"Current state\";\n+        } else {\n+            // Name only\n+            strFormattedDescription = mName;\n+        }\n+\n+        // Current State\n+        strFormattedDescription += \" = \" + getFormattedState();\n+    } else {\n+        // Name\n+        strFormattedDescription = \"Criterion name: \" + mName;\n+\n+        if (bWithTypeInfo) {\n+            // Type Kind\n+            strFormattedDescription += \", type kind: \";\n+            strFormattedDescription +=  getKind();\n+        }\n+\n+        // Current State\n+        strFormattedDescription += \", current state: \" + getFormattedState();\n+\n+        if (bWithTypeInfo) {\n+            // States\n+            strFormattedDescription += \", states: \" + listPossibleValues();\n+        }\n+    }\n+    return strFormattedDescription;\n+}\n+\n+void Criterion::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const\n+{\n+    (void)serializingContext;\n+    xmlElement.setAttributeString(\"Value\", getFormattedState());\n+    xmlElement.setAttributeString(\"Name\", mName);\n+    xmlElement.setAttributeString(\"Kind\", getKind());\n+\n+    for (auto& value : mValues) {\n+        CXmlElement childValueElement;\n+\n+        xmlElement.createChild(childValueElement, \"Value\");\n+        childValueElement.setTextContent(value);\n+    }\n+}\n+\n+const std::string Criterion::getKind() const\n+{\n+    return \"Exclusive\";\n+}\n+\n+std::string Criterion::getFormattedState() const\n+{\n+    assert(!mState.empty());\n+    return *mState.begin();\n+}\n+\n+std::string Criterion::listPossibleValues() const\n+{\n+    std::string possibleValues = \"{\";\n+\n+    // Get comma separated list of values\n+    bool first = true;\n+    for (auto& value : mValues) {\n+\n+        if (first) {\n+            first = false;\n+        } else {\n+            possibleValues += \", \";\n+        }\n+        possibleValues += value;\n+    }\n+    possibleValues += \"}\";\n+\n+    return possibleValues;\n+}\n+\n+bool Criterion::isValueAvailable(const Value &value) const\n+{\n+    return mValues.count(value) == 1;\n+}\n+\n+bool Criterion::match(const std::string& method, const State& state) const\n+{\n+    return mMatchMethods.at(method)(state);\n+}\n+\n+bool Criterion::isMatchMethodAvailable(const std::string& method) const\n+{\n+    return mMatchMethods.count(method) == 1;","path":"parameter/criterion/src/Criterion.cpp","position":241,"original_position":241,"commit_id":"c92e48b03f07e1bc9ae41e5a2d16f968cd09abd5","original_commit_id":"4ac72cd5b8b8a4d414d214dbbd0b8a22c74a8877","user":{"login":"dawagner","id":6430928,"avatar_url":"https://avatars.githubusercontent.com/u/6430928?v=3","gravatar_id":"","url":"https://api.github.com/users/dawagner","html_url":"https://github.com/dawagner","followers_url":"https://api.github.com/users/dawagner/followers","following_url":"https://api.github.com/users/dawagner/following{/other_user}","gists_url":"https://api.github.com/users/dawagner/gists{/gist_id}","starred_url":"https://api.github.com/users/dawagner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dawagner/subscriptions","organizations_url":"https://api.github.com/users/dawagner/orgs","repos_url":"https://api.github.com/users/dawagner/repos","events_url":"https://api.github.com/users/dawagner/events{/privacy}","received_events_url":"https://api.github.com/users/dawagner/received_events","type":"User","site_admin":false},"body":"ok, maybe it's not suboptimal for maps and sets... but I still find it strange to use \"count\" for checking an element's existence. I won't hold it against you if you decide to keep count() :)","created_at":"2015-06-01T07:43:08Z","updated_at":"2015-06-01T07:43:08Z","html_url":"https://github.com/01org/parameter-framework/pull/96#discussion_r31405143","pull_request_url":"https://api.github.com/repos/01org/parameter-framework/pulls/96","_links":{"self":{"href":"https://api.github.com/repos/01org/parameter-framework/pulls/comments/31405143"},"html":{"href":"https://github.com/01org/parameter-framework/pull/96#discussion_r31405143"},"pull_request":{"href":"https://api.github.com/repos/01org/parameter-framework/pulls/96"}}},"pull_request":{"url":"https://api.github.com/repos/01org/parameter-framework/pulls/96","id":33327421,"html_url":"https://github.com/01org/parameter-framework/pull/96","diff_url":"https://github.com/01org/parameter-framework/pull/96.diff","patch_url":"https://github.com/01org/parameter-framework/pull/96.patch","issue_url":"https://api.github.com/repos/01org/parameter-framework/issues/96","number":96,"state":"open","locked":false,"title":"Criterion rework","user":{"login":"clero","id":7363635,"avatar_url":"https://avatars.githubusercontent.com/u/7363635?v=3","gravatar_id":"","url":"https://api.github.com/users/clero","html_url":"https://github.com/clero","followers_url":"https://api.github.com/users/clero/followers","following_url":"https://api.github.com/users/clero/following{/other_user}","gists_url":"https://api.github.com/users/clero/gists{/gist_id}","starred_url":"https://api.github.com/users/clero/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/clero/subscriptions","organizations_url":"https://api.github.com/users/clero/orgs","repos_url":"https://api.github.com/users/clero/repos","events_url":"https://api.github.com/users/clero/events{/privacy}","received_events_url":"https://api.github.com/users/clero/received_events","type":"User","site_admin":false},"body":"Depends on #93 \r\n\r\nThis is a rework of Pfw criterion. Please do not merge now but some feedback on designs changes would be appreciate.\r\n\r\nNext step:\r\nUpdate coding style everywhere\r\nSome documentation is still missing\r\n","created_at":"2015-04-15T07:00:59Z","updated_at":"2015-06-01T07:43:08Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a5a08365ab1e6d4faf324f4a111578c6dcefadbd","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/01org/parameter-framework/pulls/96/commits","review_comments_url":"https://api.github.com/repos/01org/parameter-framework/pulls/96/comments","review_comment_url":"https://api.github.com/repos/01org/parameter-framework/pulls/comments{/number}","comments_url":"https://api.github.com/repos/01org/parameter-framework/issues/96/comments","statuses_url":"https://api.github.com/repos/01org/parameter-framework/statuses/c92e48b03f07e1bc9ae41e5a2d16f968cd09abd5","head":{"label":"clero:criterion_rework","ref":"criterion_rework","sha":"c92e48b03f07e1bc9ae41e5a2d16f968cd09abd5","user":{"login":"clero","id":7363635,"avatar_url":"https://avatars.githubusercontent.com/u/7363635?v=3","gravatar_id":"","url":"https://api.github.com/users/clero","html_url":"https://github.com/clero","followers_url":"https://api.github.com/users/clero/followers","following_url":"https://api.github.com/users/clero/following{/other_user}","gists_url":"https://api.github.com/users/clero/gists{/gist_id}","starred_url":"https://api.github.com/users/clero/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/clero/subscriptions","organizations_url":"https://api.github.com/users/clero/orgs","repos_url":"https://api.github.com/users/clero/repos","events_url":"https://api.github.com/users/clero/events{/privacy}","received_events_url":"https://api.github.com/users/clero/received_events","type":"User","site_admin":false},"repo":{"id":30524280,"name":"parameter-framework","full_name":"clero/parameter-framework","owner":{"login":"clero","id":7363635,"avatar_url":"https://avatars.githubusercontent.com/u/7363635?v=3","gravatar_id":"","url":"https://api.github.com/users/clero","html_url":"https://github.com/clero","followers_url":"https://api.github.com/users/clero/followers","following_url":"https://api.github.com/users/clero/following{/other_user}","gists_url":"https://api.github.com/users/clero/gists{/gist_id}","starred_url":"https://api.github.com/users/clero/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/clero/subscriptions","organizations_url":"https://api.github.com/users/clero/orgs","repos_url":"https://api.github.com/users/clero/repos","events_url":"https://api.github.com/users/clero/events{/privacy}","received_events_url":"https://api.github.com/users/clero/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/clero/parameter-framework","description":"Plugin-based and rule-based framework for describing and controlling parameters","fork":true,"url":"https://api.github.com/repos/clero/parameter-framework","forks_url":"https://api.github.com/repos/clero/parameter-framework/forks","keys_url":"https://api.github.com/repos/clero/parameter-framework/keys{/key_id}","collaborators_url":"https://api.github.com/repos/clero/parameter-framework/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/clero/parameter-framework/teams","hooks_url":"https://api.github.com/repos/clero/parameter-framework/hooks","issue_events_url":"https://api.github.com/repos/clero/parameter-framework/issues/events{/number}","events_url":"https://api.github.com/repos/clero/parameter-framework/events","assignees_url":"https://api.github.com/repos/clero/parameter-framework/assignees{/user}","branches_url":"https://api.github.com/repos/clero/parameter-framework/branches{/branch}","tags_url":"https://api.github.com/repos/clero/parameter-framework/tags","blobs_url":"https://api.github.com/repos/clero/parameter-framework/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/clero/parameter-framework/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/clero/parameter-framework/git/refs{/sha}","trees_url":"https://api.github.com/repos/clero/parameter-framework/git/trees{/sha}","statuses_url":"https://api.github.com/repos/clero/parameter-framework/statuses/{sha}","languages_url":"https://api.github.com/repos/clero/parameter-framework/languages","stargazers_url":"https://api.github.com/repos/clero/parameter-framework/stargazers","contributors_url":"https://api.github.com/repos/clero/parameter-framework/contributors","subscribers_url":"https://api.github.com/repos/clero/parameter-framework/subscribers","subscription_url":"https://api.github.com/repos/clero/parameter-framework/subscription","commits_url":"https://api.github.com/repos/clero/parameter-framework/commits{/sha}","git_commits_url":"https://api.github.com/repos/clero/parameter-framework/git/commits{/sha}","comments_url":"https://api.github.com/repos/clero/parameter-framework/comments{/number}","issue_comment_url":"https://api.github.com/repos/clero/parameter-framework/issues/comments{/number}","contents_url":"https://api.github.com/repos/clero/parameter-framework/contents/{+path}","compare_url":"https://api.github.com/repos/clero/parameter-framework/compare/{base}...{head}","merges_url":"https://api.github.com/repos/clero/parameter-framework/merges","archive_url":"https://api.github.com/repos/clero/parameter-framework/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/clero/parameter-framework/downloads","issues_url":"https://api.github.com/repos/clero/parameter-framework/issues{/number}","pulls_url":"https://api.github.com/repos/clero/parameter-framework/pulls{/number}","milestones_url":"https://api.github.com/repos/clero/parameter-framework/milestones{/number}","notifications_url":"https://api.github.com/repos/clero/parameter-framework/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/clero/parameter-framework/labels{/name}","releases_url":"https://api.github.com/repos/clero/parameter-framework/releases{/id}","created_at":"2015-02-09T07:42:27Z","updated_at":"2015-04-20T12:02:41Z","pushed_at":"2015-05-29T17:54:50Z","git_url":"git://github.com/clero/parameter-framework.git","ssh_url":"git@github.com:clero/parameter-framework.git","clone_url":"https://github.com/clero/parameter-framework.git","svn_url":"https://github.com/clero/parameter-framework","homepage":"","size":36145,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"01org:next","ref":"next","sha":"2ddf4119c7729c3d0652badc5a3647dc35df8f62","user":{"login":"01org","id":1635439,"avatar_url":"https://avatars.githubusercontent.com/u/1635439?v=3","gravatar_id":"","url":"https://api.github.com/users/01org","html_url":"https://github.com/01org","followers_url":"https://api.github.com/users/01org/followers","following_url":"https://api.github.com/users/01org/following{/other_user}","gists_url":"https://api.github.com/users/01org/gists{/gist_id}","starred_url":"https://api.github.com/users/01org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/01org/subscriptions","organizations_url":"https://api.github.com/users/01org/orgs","repos_url":"https://api.github.com/users/01org/repos","events_url":"https://api.github.com/users/01org/events{/privacy}","received_events_url":"https://api.github.com/users/01org/received_events","type":"Organization","site_admin":false},"repo":{"id":16009363,"name":"parameter-framework","full_name":"01org/parameter-framework","owner":{"login":"01org","id":1635439,"avatar_url":"https://avatars.githubusercontent.com/u/1635439?v=3","gravatar_id":"","url":"https://api.github.com/users/01org","html_url":"https://github.com/01org","followers_url":"https://api.github.com/users/01org/followers","following_url":"https://api.github.com/users/01org/following{/other_user}","gists_url":"https://api.github.com/users/01org/gists{/gist_id}","starred_url":"https://api.github.com/users/01org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/01org/subscriptions","organizations_url":"https://api.github.com/users/01org/orgs","repos_url":"https://api.github.com/users/01org/repos","events_url":"https://api.github.com/users/01org/events{/privacy}","received_events_url":"https://api.github.com/users/01org/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/01org/parameter-framework","description":"Plugin-based and rule-based framework for describing and controlling parameters","fork":false,"url":"https://api.github.com/repos/01org/parameter-framework","forks_url":"https://api.github.com/repos/01org/parameter-framework/forks","keys_url":"https://api.github.com/repos/01org/parameter-framework/keys{/key_id}","collaborators_url":"https://api.github.com/repos/01org/parameter-framework/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/01org/parameter-framework/teams","hooks_url":"https://api.github.com/repos/01org/parameter-framework/hooks","issue_events_url":"https://api.github.com/repos/01org/parameter-framework/issues/events{/number}","events_url":"https://api.github.com/repos/01org/parameter-framework/events","assignees_url":"https://api.github.com/repos/01org/parameter-framework/assignees{/user}","branches_url":"https://api.github.com/repos/01org/parameter-framework/branches{/branch}","tags_url":"https://api.github.com/repos/01org/parameter-framework/tags","blobs_url":"https://api.github.com/repos/01org/parameter-framework/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/01org/parameter-framework/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/01org/parameter-framework/git/refs{/sha}","trees_url":"https://api.github.com/repos/01org/parameter-framework/git/trees{/sha}","statuses_url":"https://api.github.com/repos/01org/parameter-framework/statuses/{sha}","languages_url":"https://api.github.com/repos/01org/parameter-framework/languages","stargazers_url":"https://api.github.com/repos/01org/parameter-framework/stargazers","contributors_url":"https://api.github.com/repos/01org/parameter-framework/contributors","subscribers_url":"https://api.github.com/repos/01org/parameter-framework/subscribers","subscription_url":"https://api.github.com/repos/01org/parameter-framework/subscription","commits_url":"https://api.github.com/repos/01org/parameter-framework/commits{/sha}","git_commits_url":"https://api.github.com/repos/01org/parameter-framework/git/commits{/sha}","comments_url":"https://api.github.com/repos/01org/parameter-framework/comments{/number}","issue_comment_url":"https://api.github.com/repos/01org/parameter-framework/issues/comments{/number}","contents_url":"https://api.github.com/repos/01org/parameter-framework/contents/{+path}","compare_url":"https://api.github.com/repos/01org/parameter-framework/compare/{base}...{head}","merges_url":"https://api.github.com/repos/01org/parameter-framework/merges","archive_url":"https://api.github.com/repos/01org/parameter-framework/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/01org/parameter-framework/downloads","issues_url":"https://api.github.com/repos/01org/parameter-framework/issues{/number}","pulls_url":"https://api.github.com/repos/01org/parameter-framework/pulls{/number}","milestones_url":"https://api.github.com/repos/01org/parameter-framework/milestones{/number}","notifications_url":"https://api.github.com/repos/01org/parameter-framework/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/01org/parameter-framework/labels{/name}","releases_url":"https://api.github.com/repos/01org/parameter-framework/releases{/id}","created_at":"2014-01-17T19:24:01Z","updated_at":"2015-04-24T08:33:44Z","pushed_at":"2015-05-29T17:54:51Z","git_url":"git://github.com/01org/parameter-framework.git","ssh_url":"git@github.com:01org/parameter-framework.git","clone_url":"https://github.com/01org/parameter-framework.git","svn_url":"https://github.com/01org/parameter-framework","homepage":"","size":44935,"stargazers_count":8,"watchers_count":8,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":17,"mirror_url":null,"open_issues_count":24,"forks":17,"open_issues":24,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/01org/parameter-framework/pulls/96"},"html":{"href":"https://github.com/01org/parameter-framework/pull/96"},"issue":{"href":"https://api.github.com/repos/01org/parameter-framework/issues/96"},"comments":{"href":"https://api.github.com/repos/01org/parameter-framework/issues/96/comments"},"review_comments":{"href":"https://api.github.com/repos/01org/parameter-framework/pulls/96/comments"},"review_comment":{"href":"https://api.github.com/repos/01org/parameter-framework/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/01org/parameter-framework/pulls/96/commits"},"statuses":{"href":"https://api.github.com/repos/01org/parameter-framework/statuses/c92e48b03f07e1bc9ae41e5a2d16f968cd09abd5"}}}}