{"action":"created","comment":{"url":"https://api.github.com/repos/bptlab/argos-backend/pulls/comments/108930828","pull_request_review_id":29996982,"id":108930828,"diff_hunk":"@@ -0,0 +1,448 @@\n+package de.hpi.bpt.argos.persistence.model.parsing;\n+\n+import de.hpi.bpt.argos.api.product.ProductEndpoint;\n+import de.hpi.bpt.argos.common.parsing.XMLFileParserImpl;\n+import de.hpi.bpt.argos.persistence.model.product.Product;\n+import de.hpi.bpt.argos.persistence.model.product.ProductConfiguration;\n+import de.hpi.bpt.argos.persistence.model.product.ProductConfigurationImpl;\n+import de.hpi.bpt.argos.persistence.model.product.ProductFamily;\n+import de.hpi.bpt.argos.persistence.model.product.error.ErrorCause;\n+import de.hpi.bpt.argos.persistence.model.product.error.ErrorCauseImpl;\n+import de.hpi.bpt.argos.persistence.model.product.error.ErrorType;\n+import de.hpi.bpt.argos.persistence.model.product.error.ErrorTypeImpl;\n+\n+import java.io.File;\n+import java.util.ArrayList;\n+import java.util.Date;\n+import java.util.List;\n+\n+/**\n+ * This class parses backbone data from XML files.\n+ */\n+public class BackboneDataParserImpl extends XMLFileParserImpl {\n+\t// these variables are in the order of the XML file, the order is important!\n+\tprotected static final String PRODUCTS_ELEMENT = \"products\";\n+\tprotected static final String PRODUCT_ELEMENT = \"product\";\n+\tprotected static final String PRODUCT_IDENTIFIER_ELEMENT = \"productIdentifier\";\n+\tprotected static final String PRODUCT_DESCRIPTION_ELEMENT = \"productDescription\";\n+\tprotected static final String PRODUCT_CONFIGURATION_ELEMENT = \"productConfiguration\";\n+\tprotected static final String CODING_PLUG_ELEMENT = \"codingPlug\";\n+\tprotected static final String CODING_PLUG_SOFTWARE_VERSION_ELEMENT = \"codingPlugSoftwareVersion\";\n+\tprotected static final String DISPLAY_CODE_ELEMENT = \"displayCode\";\n+\tprotected static final String CAUSE_CODE_ELEMENT = \"causeCode\";\n+\tprotected static final String ERROR_DESCRIPTION_ELEMENT = \"errorDescription\";\n+\tprotected static final String CAUSE_DESCRIPTION_ELEMENT = \"causeDescription\";\n+\tprotected static final String CAUSE_PREDICTION_ELEMENT = \"causePrediction\";\n+\n+\tprotected static final String PRODUCT_FAMILY_SEPARATOR = \"-\";\n+\tprotected static final int PRODUCT_FAMILY_SPLIT_LENGTH = 2;\n+\tprotected static final double TO_PERCENT = 1.0 / 100.0;\n+\n+\tprotected List<Long> cachedExternalProductIdentifiers = new ArrayList<>();\n+\tprotected String tempCurrentProductExternalId = \"\";\n+\tprotected String tempCurrentProductFamilyId = \"\";\n+\tprotected String tempCurrentCauseDescription = \"\";\n+\tprotected String tempCurrentProductName = \"\";\n+\tprotected String tempCurrentCauseCode = \"\";\n+\tprotected String tempCurrentErrorDisplayCode = \"\";\n+\tprotected String tempCurrentCodingPlug = \"\";\n+\tprotected Product currentProduct = null;\n+\tprotected ErrorType currentErrorType = null;\n+\tprotected ProductConfiguration currentProductConfiguration = null;\n+\n+\t// statistics\n+\tprotected String fileName;\n+\tprotected Date importStartTime;\n+\tprotected long productsImported = 0;\n+\tprotected long productConfigurationsImported = 0;\n+\tprotected long errorTypesImported = 0;\n+\tprotected long errorCausesImported = 0;\n+\n+\t// time conversion\n+\tprotected static final int SECONDS_PER_MINUTE = 60;\n+\tprotected static final int MINUTES_PER_HOUR = 60;\n+\tprotected static final int HOURS_PER_DAY = 24;\n+\n+\t/**\n+\t * {@inheritDoc}\n+\t */\n+\t@Override\n+\tpublic void parse(File dataFile) {\n+\t\tfileName = dataFile.getName();\n+\t\timportStartTime = new Date();\n+\n+\t\tList<ProductFamily> families = entityManager.getProductFamilies();\n+\t\tcachedExternalProductIdentifiers.clear();\n+\n+\t\tfor (ProductFamily family : families) {\n+\t\t\tfor (Product product : family.getProducts()) {\n+\t\t\t\tcachedExternalProductIdentifiers.add(product.getOrderNumber());\n+\t\t\t}\n+\t\t}\n+\n+\t\tsuper.parse(dataFile);\n+\t}\n+\n+\t/**\n+\t * {@inheritDoc}\n+\t */\n+\t@Override\n+\tprotected void endElement(String elementName) {\n+\t\tsuper.startElement(elementName);\n+\n+\t\tswitch (elementName) {\n+\t\t\tcase PRODUCT_ELEMENT:\n+\t\t\t\tsaveCurrentProduct();\n+\t\t\t\tbreak;\n+\n+\t\t\tcase PRODUCT_CONFIGURATION_ELEMENT:\n+\t\t\t\tcurrentProductConfiguration = null;\n+\t\t\t\tbreak;\n+\n+\t\t\tcase PRODUCTS_ELEMENT:\n+\t\t\t\tlogStatistics();\n+\t\t\t\tbreak;\n+\n+\t\t\tdefault:\n+\t\t\t\t// empty, since nothing to do\n+\t\t\t\tbreak;\n+\t\t}\n+\n+\t\tif (elementName.equals(PRODUCT_ELEMENT)) {\n+\t\t\tsaveCurrentProduct();\n+\t\t}\n+\t}\n+\n+\t/**\n+\t * {@inheritDoc}\n+\t */\n+\t@Override\n+\tprotected void element(String elementData) {\n+\t\tswitch (latestOpenedElement(0)) {\n+\t\t\tcase PRODUCT_IDENTIFIER_ELEMENT:\n+\t\t\t\ttempCurrentProductExternalId = elementData;\n+\t\t\t\tbreak;\n+\n+\t\t\tcase PRODUCT_DESCRIPTION_ELEMENT:\n+\t\t\t\tstartNewProduct(elementData);\n+\t\t\t\tbreak;\n+\n+\t\t\tcase CODING_PLUG_ELEMENT:\n+\t\t\t\ttempCurrentCodingPlug = elementData;\n+\t\t\t\tbreak;\n+\n+\t\t\tcase CODING_PLUG_SOFTWARE_VERSION_ELEMENT:\n+\t\t\t\tstartNewProductConfiguration(elementData);\n+\t\t\t\tbreak;\n+\n+\t\t\tcase DISPLAY_CODE_ELEMENT:\n+\t\t\t\ttempCurrentErrorDisplayCode = elementData;\n+\t\t\t\tbreak;\n+\n+\t\t\tcase CAUSE_CODE_ELEMENT:\n+\t\t\t\ttempCurrentCauseCode = elementData;\n+\t\t\t\tbreak;\n+\n+\t\t\tcase ERROR_DESCRIPTION_ELEMENT:\n+\t\t\t\tstartNewErrorType(elementData);\n+\t\t\t\tbreak;\n+\n+\t\t\tcase CAUSE_DESCRIPTION_ELEMENT:\n+\t\t\t\ttempCurrentCauseDescription = elementData;\n+\t\t\t\tbreak;\n+\n+\t\t\tcase CAUSE_PREDICTION_ELEMENT:\n+\t\t\t\tstartNewErrorCause(elementData);\n+\t\t\t\tbreak;\n+\n+\t\t\tdefault:\n+\t\t\t\t// empty, since nothing to do\n+\t\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\t/**\n+\t * This method starts a new product and saves it in the database.\n+\t * @param productDescription - the product description, which should contain a product family id and a product name\n+\t */\n+\tprotected void startNewProduct(String productDescription) {\n+\n+\t\tlong externalProductId;\n+\n+\t\ttry {\n+\t\t\texternalProductId = Long.parseLong(tempCurrentProductExternalId);\n+\t\t} catch (Exception e) {\n+\t\t\tlogger.debug(String.format(\"can not parse product identifier '%1$s'\", tempCurrentProductExternalId));\n+\t\t\tlogTrace(e);\n+\t\t\tresetCurrentEntities();\n+\t\t\treturn;\n+\t\t}\n+\n+\t\tif (!splitProductDescription(productDescription)\n+\t\t\t\t|| cachedExternalProductIdentifiers.contains(externalProductId)) {\n+\t\t\tresetCurrentEntities();\n+\t\t\treturn;\n+\t\t}\n+\n+\t\tcurrentProduct = entityManager.getProduct(tempCurrentProductFamilyId, externalProductId);\n+\t\tcurrentProduct.setName(tempCurrentProductName);\n+\t\tproductsImported++;\n+\t}\n+\n+\t/**\n+\t * This method splits a product description and sets the current productFamilyId and the currentProductName.\n+\t * @param productDescription - the description for the current product\n+\t * @return - true if the description is valid\n+\t */\n+\tprotected boolean splitProductDescription(String productDescription) {\n+\n+\t\tString[] split = productDescription.split(PRODUCT_FAMILY_SEPARATOR);\n+\n+\t\tif (split.length < PRODUCT_FAMILY_SPLIT_LENGTH) {\n+\t\t\tlogger.info(String.format(\"product '%1$s' is not supported\", productDescription));\n+\t\t\treturn false;\n+\t\t}\n+\n+\t\tStringBuilder productName = new StringBuilder();\n+\t\tproductName.append(split[1]);\n+\n+\t\t// add separator to product name, if more than two split parts exist\n+\t\tfor (int i = PRODUCT_FAMILY_SPLIT_LENGTH; i < split.length; i++) {\n+\t\t\tproductName.append(PRODUCT_FAMILY_SEPARATOR);\n+\t\t\tproductName.append(split[i]);\n+\t\t}\n+\n+\t\ttempCurrentProductFamilyId = split[0];\n+\t\ttempCurrentProductName = productName.toString();\n+\t\treturn true;\n+\t}\n+\n+\t/**\n+\t * This method starts a new product configuration and adds it to the current product.\n+\t * @param codingPlugSoftwareVersion - the coding plug software version of the new configuration\n+\t */\n+\tprotected void startNewProductConfiguration(String codingPlugSoftwareVersion) {\n+\n+\t\tint codingPlugId;\n+\t\tfloat version;\n+\n+\t\ttry {\n+\t\t\tversion = Float.parseFloat(codingPlugSoftwareVersion);\n+\t\t} catch (Exception e) {\n+\t\t\tlogger.debug(String.format(\"can not parse coding plug software version '%1$s'\", codingPlugSoftwareVersion));\n+\t\t\tlogTrace(e);\n+\t\t\treturn;\n+\t\t}\n+\n+\t\ttry {\n+\t\t\tcodingPlugId = Integer.parseInt(tempCurrentCodingPlug);\n+\t\t} catch (Exception e) {\n+\t\t\tlogger.debug(String.format(\"can not parse coding plug id '%1$s'\", tempCurrentCodingPlug));\n+\t\t\tlogTrace(e);\n+\t\t\treturn;\n+\t\t}\n+\n+\t\tif (currentProductConfiguration != null) {\n+\t\t\tcurrentProductConfiguration.addCodingPlugSoftwareVersion(version);\n+\t\t\treturn;\n+\t\t}\n+\n+\t\tif (currentProduct == null) {\n+\t\t\treturn;\n+\t\t}\n+\n+\t\tcurrentProductConfiguration = new ProductConfigurationImpl();\n+\t\tcurrentProductConfiguration.setProduct(currentProduct);\n+\t\tcurrentProductConfiguration.setCodingPlugId(codingPlugId);\n+\t\tcurrentProductConfiguration.addCodingPlugSoftwareVersion(version);\n+\t\tcurrentProduct.addProductConfiguration(currentProductConfiguration);\n+\t\tproductConfigurationsImported++;\n+\t}\n+\n+\t/**\n+\t * This method starts a new errorEventType and adds it to the current product.\n+\t * @param errorDescription - the error description for the current error type\n+\t */\n+\tprotected void startNewErrorType(String errorDescription) {\n+\n+\t\tif (currentProductConfiguration == null) {\n+\t\t\treturn;\n+\t\t}\n+\n+\t\tint causeCode;\n+\n+\t\ttry {\n+\t\t\tcauseCode = Integer.parseInt(tempCurrentCauseCode);\n+\t\t} catch (Exception e) {\n+\t\t\tlogger.debug(String.format(\"can not parse cause code '%1$s'\", tempCurrentCauseCode));\n+\t\t\tlogTrace(e);\n+\t\t\tcurrentErrorType = null;\n+\t\t\treturn;\n+\t\t}\n+\n+\t\tcurrentErrorType = new ErrorTypeImpl();\n+\t\tcurrentErrorType.setCauseCode(causeCode);\n+\t\tcurrentErrorType.setDisplayCode(tempCurrentErrorDisplayCode);\n+\t\tcurrentErrorType.setErrorDescription(errorDescription);\n+\n+\t\tif (currentProductConfigurationHasErrorType(currentErrorType)) {\n+\t\t\tcurrentErrorType = null;\n+\t\t\treturn;\n+\t\t}\n+\n+\t\tcurrentProductConfiguration.addErrorType(currentErrorType);\n+\t\terrorTypesImported++;\n+\t}\n+\n+\t/**\n+\t * This method starts a new errorCause and adds it to the current errorEventType.\n+\t * @param causePrediction - the error cause prediction as string\n+\t */\n+\tprotected void startNewErrorCause(String causePrediction) {\n+\n+\t\tif (currentProductConfiguration == null\n+\t\t\t\t|| currentErrorType == null) {\n+\t\t\treturn;\n+\t\t}\n+\n+\t\tdouble prediction;\n+\n+\t\ttry {\n+\t\t\tprediction = Double.parseDouble(causePrediction);\n+\n+\t\t\tif (prediction > 1.0) {\n+\t\t\t\tprediction *= TO_PERCENT;\n+\t\t\t}\n+\t\t} catch (Exception e) {\n+\t\t\tlogger.debug(String.format(\"can not parse cause prediction '%1$s'\", causePrediction));\n+\t\t\tlogTrace(e);\n+\t\t\treturn;\n+\t\t}\n+\n+\t\tErrorCause cause = new ErrorCauseImpl();\n+\t\tcause.setDescription(tempCurrentCauseDescription);\n+\t\tcause.setErrorPrediction(prediction);\n+\t\tcurrentErrorType.addErrorCause(cause);\n+\n+\t\terrorCausesImported++;\n+\t}\n+\n+\t/**\n+\t * This method saves the finished product in the database.\n+\t */\n+\tprotected void saveCurrentProduct() {\n+\n+\t\tif (currentProduct == null) {\n+\t\t\treturn;\n+\t\t}\n+\n+\t\tlogger.info(String.format(\"added product '%1$s' with '%2$d' configurations in family '%3$s'\", currentProduct.getName(), currentProduct\n+\t\t\t\t.getProductConfigurations().size(), currentProduct.getProductFamily().getName()));\n+\t\tentityManager.updateEntity(currentProduct, ProductEndpoint.getProductUri(currentProduct.getId()));\n+\n+\t\tresetCurrentEntities();\n+\t}\n+\n+\t/**\n+\t * This method resets all temporary variables.\n+\t */\n+\tprotected void resetCurrentEntities() {\n+\n+\t\ttempCurrentProductExternalId = \"\";\n+\t\ttempCurrentProductFamilyId = \"\";\n+\t\ttempCurrentCauseDescription = \"\";\n+\t\ttempCurrentProductName = \"\";\n+\t\ttempCurrentCauseCode = \"\";\n+\t\ttempCurrentErrorDisplayCode = \"\";\n+\t\ttempCurrentCodingPlug = \"\";\n+\t\tcurrentProduct = null;\n+\t\tcurrentErrorType = null;\n+\t\tcurrentProductConfiguration = null;\n+\t}\n+\n+\t/**\n+\t * This method checks, whether a error type is already present in the current product.\n+\t * @param errorType - the error type to check\n+\t * @return - true, if the error type is already present\n+\t */\n+\tprotected boolean currentProductConfigurationHasErrorType(ErrorType errorType) {\n+\t\tif (currentProductConfiguration == null) {\n+\t\t\treturn false;\n+\t\t}\n+\n+\t\tfor (ErrorType type : currentProductConfiguration.getErrorTypes()) {\n+\t\t\tif (type.getErrorTypeId().equalsIgnoreCase(errorType.getErrorTypeId())) {\n+\t\t\t\treturn true;\n+\t\t\t}\n+\t\t}\n+\n+\t\treturn false;\n+\t}\n+\n+    /**\n+     * Logs an exception on log level trace.\n+     * @param e - exception to log\n+     */\n+\tprivate void logTrace(Exception e) {\n+\t\tlogger.trace(\"Reason: \", e);\n+    }\n+\n+\t/**\n+\t * This method logs the statistics about the imported entities.\n+\t */\n+\tprotected void logStatistics() {\n+\t\tlogger.info(String.format(\"finished importing data from '%1$s' in '%2$s'. \"\n+\t\t\t\t+ \"imported %3$d products, \"\n+\t\t\t\t+ \"%4$d productConfigurations, \"\n+\t\t\t\t+ \"%5$d errorTypes and \"\n+\t\t\t\t+ \"%6$d errorCauses.\",\n+\t\t\t\tfileName,\n+\t\t\t\tgetTimeSinceStart(),\n+\t\t\t\tproductsImported,\n+\t\t\t\tproductConfigurationsImported,\n+\t\t\t\terrorTypesImported,\n+\t\t\t\terrorCausesImported));\n+\t}\n+\n+\t/**\n+\t * This method calculates the passed time since the import process started and returns it as a string.\n+\t * @return - the passed time since start of the import process as string\n+\t */\n+\tprotected String getTimeSinceStart() {\n+\n+\t\tlong passedTimeInSeconds = ((new Date()).getTime() - importStartTime.getTime()) / 1000;\n+\t\tlong[] passedTime = new long[] { 0, 0, 0, 0 };\n+\n+\t\tif (passedTimeInSeconds >= SECONDS_PER_MINUTE) {\n+\t\t\tpassedTime[3] = passedTimeInSeconds % SECONDS_PER_MINUTE;\n+\t\t} else {\n+\t\t\tpassedTime[3] = passedTimeInSeconds;\n+\t\t}\n+\n+\t\tlong passedTimeInMinutes = passedTimeInSeconds / SECONDS_PER_MINUTE;\n+\n+\t\tif (passedTimeInMinutes >= MINUTES_PER_HOUR) {\n+\t\t\tpassedTime[2] = passedTimeInMinutes % MINUTES_PER_HOUR;","path":"src/main/java/de/hpi/bpt/argos/persistence/model/parsing/BackboneDataParserImpl.java","position":425,"original_position":425,"commit_id":"918fcafddb9214b517e974cd809fc9b1454abd31","original_commit_id":"918fcafddb9214b517e974cd809fc9b1454abd31","user":{"login":"hpibptlab","id":25980770,"avatar_url":"https://avatars2.githubusercontent.com/u/25980770?v=3","gravatar_id":"","url":"https://api.github.com/users/hpibptlab","html_url":"https://github.com/hpibptlab","followers_url":"https://api.github.com/users/hpibptlab/followers","following_url":"https://api.github.com/users/hpibptlab/following{/other_user}","gists_url":"https://api.github.com/users/hpibptlab/gists{/gist_id}","starred_url":"https://api.github.com/users/hpibptlab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hpibptlab/subscriptions","organizations_url":"https://api.github.com/users/hpibptlab/orgs","repos_url":"https://api.github.com/users/hpibptlab/repos","events_url":"https://api.github.com/users/hpibptlab/events{/privacy}","received_events_url":"https://api.github.com/users/hpibptlab/received_events","type":"User","site_admin":false},"body":"![MAJOR](https://raw.githubusercontent.com/SonarCommunity/sonar-github/master/images/severity-major.png 'Severity: MAJOR') Assign this magic number 2 to a well-named constant, and use the constant instead. [![rule](https://raw.githubusercontent.com/SonarCommunity/sonar-github/master/images/rule.png)](http://bpt-lab.org/sonarqube/coding_rules#rule_key=squid%3AS109)\n","created_at":"2017-03-30T13:50:26Z","updated_at":"2017-03-30T13:50:26Z","html_url":"https://github.com/bptlab/argos-backend/pull/25#discussion_r108930828","pull_request_url":"https://api.github.com/repos/bptlab/argos-backend/pulls/25","_links":{"self":{"href":"https://api.github.com/repos/bptlab/argos-backend/pulls/comments/108930828"},"html":{"href":"https://github.com/bptlab/argos-backend/pull/25#discussion_r108930828"},"pull_request":{"href":"https://api.github.com/repos/bptlab/argos-backend/pulls/25"}}},"pull_request":{"url":"https://api.github.com/repos/bptlab/argos-backend/pulls/25","id":113173205,"html_url":"https://github.com/bptlab/argos-backend/pull/25","diff_url":"https://github.com/bptlab/argos-backend/pull/25.diff","patch_url":"https://github.com/bptlab/argos-backend/pull/25.patch","issue_url":"https://api.github.com/repos/bptlab/argos-backend/issues/25","number":25,"state":"open","locked":false,"title":"Bp 0305 read backbone data","user":{"login":"Hannes01071995","id":9248711,"avatar_url":"https://avatars2.githubusercontent.com/u/9248711?v=3","gravatar_id":"","url":"https://api.github.com/users/Hannes01071995","html_url":"https://github.com/Hannes01071995","followers_url":"https://api.github.com/users/Hannes01071995/followers","following_url":"https://api.github.com/users/Hannes01071995/following{/other_user}","gists_url":"https://api.github.com/users/Hannes01071995/gists{/gist_id}","starred_url":"https://api.github.com/users/Hannes01071995/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Hannes01071995/subscriptions","organizations_url":"https://api.github.com/users/Hannes01071995/orgs","repos_url":"https://api.github.com/users/Hannes01071995/repos","events_url":"https://api.github.com/users/Hannes01071995/events{/privacy}","received_events_url":"https://api.github.com/users/Hannes01071995/received_events","type":"User","site_admin":false},"body":"","created_at":"2017-03-29T11:12:45Z","updated_at":"2017-03-30T13:50:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4d2762a031127ef56b9167a8da0db68117f545ff","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/bptlab/argos-backend/pulls/25/commits","review_comments_url":"https://api.github.com/repos/bptlab/argos-backend/pulls/25/comments","review_comment_url":"https://api.github.com/repos/bptlab/argos-backend/pulls/comments{/number}","comments_url":"https://api.github.com/repos/bptlab/argos-backend/issues/25/comments","statuses_url":"https://api.github.com/repos/bptlab/argos-backend/statuses/918fcafddb9214b517e974cd809fc9b1454abd31","head":{"label":"bptlab:BP_0305_read_backbone_data","ref":"BP_0305_read_backbone_data","sha":"918fcafddb9214b517e974cd809fc9b1454abd31","user":{"login":"bptlab","id":13486054,"avatar_url":"https://avatars3.githubusercontent.com/u/13486054?v=3","gravatar_id":"","url":"https://api.github.com/users/bptlab","html_url":"https://github.com/bptlab","followers_url":"https://api.github.com/users/bptlab/followers","following_url":"https://api.github.com/users/bptlab/following{/other_user}","gists_url":"https://api.github.com/users/bptlab/gists{/gist_id}","starred_url":"https://api.github.com/users/bptlab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bptlab/subscriptions","organizations_url":"https://api.github.com/users/bptlab/orgs","repos_url":"https://api.github.com/users/bptlab/repos","events_url":"https://api.github.com/users/bptlab/events{/privacy}","received_events_url":"https://api.github.com/users/bptlab/received_events","type":"Organization","site_admin":false},"repo":{"id":81831148,"name":"argos-backend","full_name":"bptlab/argos-backend","owner":{"login":"bptlab","id":13486054,"avatar_url":"https://avatars3.githubusercontent.com/u/13486054?v=3","gravatar_id":"","url":"https://api.github.com/users/bptlab","html_url":"https://github.com/bptlab","followers_url":"https://api.github.com/users/bptlab/followers","following_url":"https://api.github.com/users/bptlab/following{/other_user}","gists_url":"https://api.github.com/users/bptlab/gists{/gist_id}","starred_url":"https://api.github.com/users/bptlab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bptlab/subscriptions","organizations_url":"https://api.github.com/users/bptlab/orgs","repos_url":"https://api.github.com/users/bptlab/repos","events_url":"https://api.github.com/users/bptlab/events{/privacy}","received_events_url":"https://api.github.com/users/bptlab/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/bptlab/argos-backend","description":"This is the repository for the argos backend server. The server controls and serves product, event type and event data for an event dashboard. It requires an Event Processing Platform, eg. Unicorn","fork":false,"url":"https://api.github.com/repos/bptlab/argos-backend","forks_url":"https://api.github.com/repos/bptlab/argos-backend/forks","keys_url":"https://api.github.com/repos/bptlab/argos-backend/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bptlab/argos-backend/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bptlab/argos-backend/teams","hooks_url":"https://api.github.com/repos/bptlab/argos-backend/hooks","issue_events_url":"https://api.github.com/repos/bptlab/argos-backend/issues/events{/number}","events_url":"https://api.github.com/repos/bptlab/argos-backend/events","assignees_url":"https://api.github.com/repos/bptlab/argos-backend/assignees{/user}","branches_url":"https://api.github.com/repos/bptlab/argos-backend/branches{/branch}","tags_url":"https://api.github.com/repos/bptlab/argos-backend/tags","blobs_url":"https://api.github.com/repos/bptlab/argos-backend/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bptlab/argos-backend/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bptlab/argos-backend/git/refs{/sha}","trees_url":"https://api.github.com/repos/bptlab/argos-backend/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bptlab/argos-backend/statuses/{sha}","languages_url":"https://api.github.com/repos/bptlab/argos-backend/languages","stargazers_url":"https://api.github.com/repos/bptlab/argos-backend/stargazers","contributors_url":"https://api.github.com/repos/bptlab/argos-backend/contributors","subscribers_url":"https://api.github.com/repos/bptlab/argos-backend/subscribers","subscription_url":"https://api.github.com/repos/bptlab/argos-backend/subscription","commits_url":"https://api.github.com/repos/bptlab/argos-backend/commits{/sha}","git_commits_url":"https://api.github.com/repos/bptlab/argos-backend/git/commits{/sha}","comments_url":"https://api.github.com/repos/bptlab/argos-backend/comments{/number}","issue_comment_url":"https://api.github.com/repos/bptlab/argos-backend/issues/comments{/number}","contents_url":"https://api.github.com/repos/bptlab/argos-backend/contents/{+path}","compare_url":"https://api.github.com/repos/bptlab/argos-backend/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bptlab/argos-backend/merges","archive_url":"https://api.github.com/repos/bptlab/argos-backend/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bptlab/argos-backend/downloads","issues_url":"https://api.github.com/repos/bptlab/argos-backend/issues{/number}","pulls_url":"https://api.github.com/repos/bptlab/argos-backend/pulls{/number}","milestones_url":"https://api.github.com/repos/bptlab/argos-backend/milestones{/number}","notifications_url":"https://api.github.com/repos/bptlab/argos-backend/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bptlab/argos-backend/labels{/name}","releases_url":"https://api.github.com/repos/bptlab/argos-backend/releases{/id}","deployments_url":"https://api.github.com/repos/bptlab/argos-backend/deployments","created_at":"2017-02-13T14:02:15Z","updated_at":"2017-02-15T14:27:33Z","pushed_at":"2017-03-30T13:48:12Z","git_url":"git://github.com/bptlab/argos-backend.git","ssh_url":"git@github.com:bptlab/argos-backend.git","clone_url":"https://github.com/bptlab/argos-backend.git","svn_url":"https://github.com/bptlab/argos-backend","homepage":"","size":18982,"stargazers_count":4,"watchers_count":4,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":4,"default_branch":"master"}},"base":{"label":"bptlab:dev","ref":"dev","sha":"79cd3752d66b19f5ad4d5a632ccbbe17742da775","user":{"login":"bptlab","id":13486054,"avatar_url":"https://avatars3.githubusercontent.com/u/13486054?v=3","gravatar_id":"","url":"https://api.github.com/users/bptlab","html_url":"https://github.com/bptlab","followers_url":"https://api.github.com/users/bptlab/followers","following_url":"https://api.github.com/users/bptlab/following{/other_user}","gists_url":"https://api.github.com/users/bptlab/gists{/gist_id}","starred_url":"https://api.github.com/users/bptlab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bptlab/subscriptions","organizations_url":"https://api.github.com/users/bptlab/orgs","repos_url":"https://api.github.com/users/bptlab/repos","events_url":"https://api.github.com/users/bptlab/events{/privacy}","received_events_url":"https://api.github.com/users/bptlab/received_events","type":"Organization","site_admin":false},"repo":{"id":81831148,"name":"argos-backend","full_name":"bptlab/argos-backend","owner":{"login":"bptlab","id":13486054,"avatar_url":"https://avatars3.githubusercontent.com/u/13486054?v=3","gravatar_id":"","url":"https://api.github.com/users/bptlab","html_url":"https://github.com/bptlab","followers_url":"https://api.github.com/users/bptlab/followers","following_url":"https://api.github.com/users/bptlab/following{/other_user}","gists_url":"https://api.github.com/users/bptlab/gists{/gist_id}","starred_url":"https://api.github.com/users/bptlab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bptlab/subscriptions","organizations_url":"https://api.github.com/users/bptlab/orgs","repos_url":"https://api.github.com/users/bptlab/repos","events_url":"https://api.github.com/users/bptlab/events{/privacy}","received_events_url":"https://api.github.com/users/bptlab/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/bptlab/argos-backend","description":"This is the repository for the argos backend server. The server controls and serves product, event type and event data for an event dashboard. It requires an Event Processing Platform, eg. Unicorn","fork":false,"url":"https://api.github.com/repos/bptlab/argos-backend","forks_url":"https://api.github.com/repos/bptlab/argos-backend/forks","keys_url":"https://api.github.com/repos/bptlab/argos-backend/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bptlab/argos-backend/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bptlab/argos-backend/teams","hooks_url":"https://api.github.com/repos/bptlab/argos-backend/hooks","issue_events_url":"https://api.github.com/repos/bptlab/argos-backend/issues/events{/number}","events_url":"https://api.github.com/repos/bptlab/argos-backend/events","assignees_url":"https://api.github.com/repos/bptlab/argos-backend/assignees{/user}","branches_url":"https://api.github.com/repos/bptlab/argos-backend/branches{/branch}","tags_url":"https://api.github.com/repos/bptlab/argos-backend/tags","blobs_url":"https://api.github.com/repos/bptlab/argos-backend/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bptlab/argos-backend/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bptlab/argos-backend/git/refs{/sha}","trees_url":"https://api.github.com/repos/bptlab/argos-backend/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bptlab/argos-backend/statuses/{sha}","languages_url":"https://api.github.com/repos/bptlab/argos-backend/languages","stargazers_url":"https://api.github.com/repos/bptlab/argos-backend/stargazers","contributors_url":"https://api.github.com/repos/bptlab/argos-backend/contributors","subscribers_url":"https://api.github.com/repos/bptlab/argos-backend/subscribers","subscription_url":"https://api.github.com/repos/bptlab/argos-backend/subscription","commits_url":"https://api.github.com/repos/bptlab/argos-backend/commits{/sha}","git_commits_url":"https://api.github.com/repos/bptlab/argos-backend/git/commits{/sha}","comments_url":"https://api.github.com/repos/bptlab/argos-backend/comments{/number}","issue_comment_url":"https://api.github.com/repos/bptlab/argos-backend/issues/comments{/number}","contents_url":"https://api.github.com/repos/bptlab/argos-backend/contents/{+path}","compare_url":"https://api.github.com/repos/bptlab/argos-backend/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bptlab/argos-backend/merges","archive_url":"https://api.github.com/repos/bptlab/argos-backend/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bptlab/argos-backend/downloads","issues_url":"https://api.github.com/repos/bptlab/argos-backend/issues{/number}","pulls_url":"https://api.github.com/repos/bptlab/argos-backend/pulls{/number}","milestones_url":"https://api.github.com/repos/bptlab/argos-backend/milestones{/number}","notifications_url":"https://api.github.com/repos/bptlab/argos-backend/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bptlab/argos-backend/labels{/name}","releases_url":"https://api.github.com/repos/bptlab/argos-backend/releases{/id}","deployments_url":"https://api.github.com/repos/bptlab/argos-backend/deployments","created_at":"2017-02-13T14:02:15Z","updated_at":"2017-02-15T14:27:33Z","pushed_at":"2017-03-30T13:48:12Z","git_url":"git://github.com/bptlab/argos-backend.git","ssh_url":"git@github.com:bptlab/argos-backend.git","clone_url":"https://github.com/bptlab/argos-backend.git","svn_url":"https://github.com/bptlab/argos-backend","homepage":"","size":18982,"stargazers_count":4,"watchers_count":4,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":4,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/bptlab/argos-backend/pulls/25"},"html":{"href":"https://github.com/bptlab/argos-backend/pull/25"},"issue":{"href":"https://api.github.com/repos/bptlab/argos-backend/issues/25"},"comments":{"href":"https://api.github.com/repos/bptlab/argos-backend/issues/25/comments"},"review_comments":{"href":"https://api.github.com/repos/bptlab/argos-backend/pulls/25/comments"},"review_comment":{"href":"https://api.github.com/repos/bptlab/argos-backend/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/bptlab/argos-backend/pulls/25/commits"},"statuses":{"href":"https://api.github.com/repos/bptlab/argos-backend/statuses/918fcafddb9214b517e974cd809fc9b1454abd31"}}}}
{"actor":{"display_login":"hpibptlab"}}