{"action":"created","comment":{"url":"https://api.github.com/repos/eclipse/hawkbit/pulls/comments/55179572","id":55179572,"diff_hunk":"@@ -0,0 +1,568 @@\n+/**\n+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.\n+ *\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Eclipse Public License v1.0\n+ * which accompanies this distribution, and is available at\n+ * http://www.eclipse.org/legal/epl-v10.html\n+ */\n+package org.eclipse.hawkbit.ui.rollout.rollout;\n+\n+import java.util.ArrayList;\n+import java.util.Arrays;\n+import java.util.List;\n+import java.util.Locale;\n+\n+import javax.annotation.PostConstruct;\n+import javax.annotation.PreDestroy;\n+\n+import org.eclipse.hawkbit.eventbus.event.RolloutChangeEvent;\n+import org.eclipse.hawkbit.repository.RolloutManagement;\n+import org.eclipse.hawkbit.repository.SpPermissionChecker;\n+import org.eclipse.hawkbit.repository.model.Rollout;\n+import org.eclipse.hawkbit.repository.model.Rollout.RolloutStatus;\n+import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;\n+import org.eclipse.hawkbit.ui.common.grid.AbstractGrid;\n+import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlButtonRenderer;\n+import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlLabelRenderer;\n+import org.eclipse.hawkbit.ui.customrenderers.renderers.LinkRenderer;\n+import org.eclipse.hawkbit.ui.rollout.DistributionBarHelper;\n+import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;\n+import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;\n+import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;\n+import org.eclipse.hawkbit.ui.utils.I18N;\n+import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;\n+import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;\n+import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;\n+import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;\n+import org.eclipse.hawkbit.ui.utils.UINotification;\n+import org.springframework.beans.factory.annotation.Autowired;\n+import org.vaadin.addons.lazyquerycontainer.BeanQueryFactory;\n+import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer;\n+import org.vaadin.addons.lazyquerycontainer.LazyQueryDefinition;\n+import org.vaadin.peter.contextmenu.ContextMenu;\n+import org.vaadin.peter.contextmenu.ContextMenu.ContextMenuItem;\n+import org.vaadin.peter.contextmenu.ContextMenu.ContextMenuItemClickEvent;\n+import org.vaadin.spring.events.EventBus;\n+import org.vaadin.spring.events.EventScope;\n+import org.vaadin.spring.events.annotation.EventBusListenerMethod;\n+\n+import com.vaadin.data.Container;\n+import com.vaadin.data.Item;\n+import com.vaadin.data.util.PropertyValueGenerator;\n+import com.vaadin.data.util.converter.Converter;\n+import com.vaadin.server.AbstractClientConnector;\n+import com.vaadin.server.FontAwesome;\n+import com.vaadin.spring.annotation.SpringComponent;\n+import com.vaadin.spring.annotation.ViewScope;\n+import com.vaadin.ui.UI;\n+import com.vaadin.ui.Window;\n+import com.vaadin.ui.renderers.ClickableRenderer.RendererClickEvent;\n+import com.vaadin.ui.renderers.HtmlRenderer;\n+\n+@SpringComponent\n+@ViewScope\n+public class RolloutListGrid extends AbstractGrid {\n+\n+    private static final long serialVersionUID = 4060904914954370524L;\n+\n+    private static final String UPDATE_OPTION = \"Update\";\n+\n+    private static final String RESUME_OPTION = \"Resume\";\n+\n+    private static final String PAUSE_OPTION = \"Pause\";\n+\n+    private static final String START_OPTION = \"Start\";\n+\n+    @Autowired\n+    private I18N i18n;\n+\n+    @Autowired\n+    private transient EventBus.SessionEventBus eventBus;\n+\n+    @Autowired\n+    private transient RolloutManagement rolloutManagement;\n+\n+    @Autowired\n+    private AddUpdateRolloutWindowLayout addUpdateRolloutWindow;\n+\n+    @Autowired\n+    private UINotification uiNotification;\n+\n+    @Autowired\n+    private transient RolloutUIState rolloutUIState;\n+\n+    @Autowired\n+    private transient SpPermissionChecker permissionChecker;\n+\n+    @Override\n+    @PostConstruct\n+    protected void init() {\n+        super.init();\n+        eventBus.subscribe(this);\n+    }\n+\n+    @PreDestroy\n+    void destroy() {\n+        eventBus.unsubscribe(this);\n+    }\n+\n+    @EventBusListenerMethod(scope = EventScope.SESSION)\n+    void onEvent(final RolloutEvent event) {\n+        if (event == RolloutEvent.FILTER_BY_TEXT || event == RolloutEvent.CREATE_ROLLOUT\n+                || event == RolloutEvent.UPDATE_ROLLOUT || event == RolloutEvent.SHOW_ROLLOUTS) {\n+            refreshGrid();\n+        }\n+    }\n+\n+    /**\n+     * Handles the RolloutChangeEvent to refresh the item in the grid.\n+     * \n+     * @param rolloutChangeEvent\n+     *            the event which contains the rollout which has been changed\n+     */\n+    @SuppressWarnings(\"unchecked\")\n+    @EventBusListenerMethod(scope = EventScope.SESSION)\n+    public void onEvent(final RolloutChangeEvent rolloutChangeEvent) {\n+        if (rolloutUIState.isShowRollOuts()) {\n+            final Rollout rollout = rolloutManagement.findRolloutWithDetailedStatus(rolloutChangeEvent.getRolloutId());\n+            final TotalTargetCountStatus totalTargetCountStatus = rollout.getTotalTargetCountStatus();\n+            final LazyQueryContainer rolloutContainer = (LazyQueryContainer) getContainerDataSource();\n+            final Item item = rolloutContainer.getItem(rolloutChangeEvent.getRolloutId());\n+            if (null != item) {\n+                item.getItemProperty(SPUILabelDefinitions.VAR_STATUS).setValue(rollout.getStatus());\n+                item.getItemProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS)\n+                        .setValue(totalTargetCountStatus);\n+                final Long groupCount = (Long) item.getItemProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS)\n+                        .getValue();\n+                if (null != rollout.getRolloutGroups() && groupCount != rollout.getRolloutGroups().size()) {\n+                    item.getItemProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS)\n+                            .setValue(Long.valueOf(rollout.getRolloutGroups().size()));\n+                }\n+            }\n+        }\n+    }\n+\n+    @Override\n+    protected Container createContainer() {\n+        final BeanQueryFactory<RolloutBeanQuery> rolloutQf = new BeanQueryFactory<>(RolloutBeanQuery.class);\n+        return new LazyQueryContainer(\n+                new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE, SPUILabelDefinitions.VAR_ID), rolloutQf);\n+    }\n+\n+    @Override\n+    protected void addContainerProperties() {\n+        final LazyQueryContainer rolloutGridContainer = (LazyQueryContainer) getContainerDataSource();\n+        rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, \"\", false, false);\n+        rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, null, false, false);\n+        rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, RolloutStatus.class, null, false,\n+                false);\n+        rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_DIST_NAME_VERSION, String.class, null, false,\n+                false);\n+        rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_DATE, String.class, null, false,\n+                false);\n+\n+        rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_DATE, String.class, null, false,\n+                false);\n+        rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_USER, String.class, null, false,\n+                false);\n+        rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_BY, String.class, null, false,\n+                false);\n+        rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS, Integer.class, 0, false,\n+                false);\n+        rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS, String.class, \"0\", false,\n+                false);\n+        rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS,\n+                TotalTargetCountStatus.class, null, false, false);\n+\n+        rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.ACTION, String.class,\n+                FontAwesome.CIRCLE_O.getHtml(), false, false);\n+\n+    }\n+\n+    @Override\n+    protected void setColumnExpandRatio() {\n+        getColumn(SPUILabelDefinitions.VAR_NAME).setMinimumWidth(40);\n+        getColumn(SPUILabelDefinitions.VAR_NAME).setMaximumWidth(150);\n+\n+        getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setMinimumWidth(40);\n+        getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setMaximumWidth(150);\n+\n+        getColumn(SPUILabelDefinitions.VAR_STATUS).setMinimumWidth(75);\n+        getColumn(SPUILabelDefinitions.VAR_STATUS).setMaximumWidth(75);\n+\n+        getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMinimumWidth(40);\n+        getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMaximumWidth(100);\n+\n+        getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setMinimumWidth(40);\n+        getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setMaximumWidth(100);\n+\n+        getColumn(SPUILabelDefinitions.ACTION).setMinimumWidth(75);\n+        getColumn(SPUILabelDefinitions.ACTION).setMaximumWidth(75);\n+\n+        getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setMinimumWidth(280);\n+\n+        setFrozenColumnCount(getColumns().size());\n+    }\n+\n+    @Override\n+    protected void setColumnHeaderNames() {\n+        getColumn(SPUILabelDefinitions.VAR_NAME).setHeaderCaption(i18n.get(\"header.name\"));\n+        getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setHeaderCaption(i18n.get(\"header.distributionset\"));\n+        getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setHeaderCaption(i18n.get(\"header.numberofgroups\"));\n+        getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setHeaderCaption(i18n.get(\"header.total.targets\"));\n+        getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setHeaderCaption(i18n.get(\"header.createdDate\"));\n+        getColumn(SPUILabelDefinitions.VAR_CREATED_USER).setHeaderCaption(i18n.get(\"header.createdBy\"));\n+        getColumn(SPUILabelDefinitions.VAR_MODIFIED_DATE).setHeaderCaption(i18n.get(\"header.modifiedDate\"));\n+        getColumn(SPUILabelDefinitions.VAR_MODIFIED_BY).setHeaderCaption(i18n.get(\"header.modifiedBy\"));\n+        getColumn(SPUILabelDefinitions.VAR_DESC).setHeaderCaption(i18n.get(\"header.description\"));\n+        getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS)\n+                .setHeaderCaption(i18n.get(\"header.detail.status\"));\n+        getColumn(SPUILabelDefinitions.VAR_STATUS).setHeaderCaption(i18n.get(\"header.status\"));\n+        getColumn(SPUILabelDefinitions.ACTION).setHeaderCaption(i18n.get(\"upload.action\"));\n+    }\n+\n+    @Override\n+    protected String getGridId() {\n+        return SPUIComponetIdProvider.ROLLOUT_LIST_GRID_ID;\n+    }\n+\n+    @Override\n+    protected void setColumnProperties() {\n+        List<Object> columnList = new ArrayList<>();\n+        columnList.add(SPUILabelDefinitions.VAR_NAME);\n+        columnList.add(SPUILabelDefinitions.VAR_DIST_NAME_VERSION);\n+        columnList.add(SPUILabelDefinitions.VAR_STATUS);\n+        columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS);\n+        columnList.add(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS);\n+        columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS);\n+        columnList.add(SPUILabelDefinitions.ACTION);\n+\n+        columnList.add(SPUILabelDefinitions.VAR_CREATED_DATE);\n+        columnList.add(SPUILabelDefinitions.VAR_CREATED_USER);\n+        columnList.add(SPUILabelDefinitions.VAR_MODIFIED_DATE);\n+        columnList.add(SPUILabelDefinitions.VAR_MODIFIED_BY);\n+        columnList.add(SPUILabelDefinitions.VAR_DESC);\n+        setColumnOrder(columnList.toArray());\n+        alignColumns();\n+    }\n+\n+    @Override\n+    protected void setHiddenColumns() {\n+        List<Object> columnsToBeHidden = new ArrayList<>();\n+        columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_DATE);\n+        columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_USER);\n+        columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_DATE);\n+        columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_BY);\n+        columnsToBeHidden.add(SPUILabelDefinitions.VAR_DESC);\n+        for (Object propertyId : columnsToBeHidden) {\n+            getColumn(propertyId).setHidden(true);\n+        }\n+\n+    }\n+\n+    @Override\n+    protected CellDescriptionGenerator getDescriptionGenerator() {\n+        return cell -> getDescription(cell);\n+    }\n+\n+    @Override\n+    protected void addColumnRenderes() {\n+        getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setRenderer(new HtmlRenderer(),\n+                new TotalTargetCountStatusConverter());\n+        getColumn(SPUILabelDefinitions.VAR_STATUS).setRenderer(new HtmlLabelRenderer(), new RolloutStatusConverter());\n+        getColumn(SPUILabelDefinitions.ACTION).setRenderer(new HtmlButtonRenderer(event -> onClickOfActionBtn(event)));\n+        getColumn(SPUILabelDefinitions.VAR_NAME).setRenderer(new LinkRenderer(event -> onClickOfRolloutName(event)));\n+    }\n+\n+    private void alignColumns() {\n+        setCellStyleGenerator(new CellStyleGenerator() {\n+            private static final long serialVersionUID = 5573570647129792429L;\n+\n+            @Override\n+            public String getStyle(final CellReference cellReference) {\n+                String[] coulmnNames = { SPUILabelDefinitions.VAR_STATUS, SPUILabelDefinitions.ACTION };\n+                if (Arrays.asList(coulmnNames).contains(cellReference.getPropertyId())) {\n+                    return \"centeralign\";\n+                }\n+                return null;\n+            }\n+        });\n+    }\n+\n+    private void onClickOfRolloutName(RendererClickEvent event) {\n+        rolloutUIState.setRolloutId((long) event.getItemId());\n+        final String rolloutName = (String) getContainerDataSource().getItem(event.getItemId())\n+                .getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();\n+        rolloutUIState.setRolloutName(rolloutName);\n+        String ds = (String) getContainerDataSource().getItem(event.getItemId())\n+                .getItemProperty(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).getValue();\n+        rolloutUIState.setRolloutDistributionSet(ds);\n+        eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUPS);\n+    }\n+\n+    private void onClickOfActionBtn(RendererClickEvent event) {\n+        final ContextMenu contextMenu = createContextMenu((Long) event.getItemId());\n+        contextMenu.setAsContextMenuOf((AbstractClientConnector) event.getComponent());\n+        contextMenu.open(event.getClientX(), event.getClientY());\n+    }\n+\n+    private ContextMenu createContextMenu(final Long rolloutId) {\n+        final Item row = getContainerDataSource().getItem(rolloutId);\n+        final RolloutStatus rolloutStatus = (RolloutStatus) row.getItemProperty(SPUILabelDefinitions.VAR_STATUS)\n+                .getValue();\n+        final ContextMenu context = new ContextMenu();\n+        context.addItemClickListener(event -> menuItemClicked(event));\n+        if (rolloutStatus == RolloutStatus.READY) {\n+            final ContextMenuItem startItem = context.addItem(START_OPTION);\n+            startItem.setData(new ContextMenuData(rolloutId, ACTION.START));\n+        } else if (rolloutStatus == RolloutStatus.RUNNING) {\n+            final ContextMenuItem pauseItem = context.addItem(PAUSE_OPTION);\n+            pauseItem.setData(new ContextMenuData(rolloutId, ACTION.PAUSE));\n+        } else if (rolloutStatus == RolloutStatus.PAUSED) {\n+            final ContextMenuItem resumeItem = context.addItem(RESUME_OPTION);\n+            resumeItem.setData(new ContextMenuData(rolloutId, ACTION.RESUME));\n+        } else if (rolloutStatus == RolloutStatus.STARTING || rolloutStatus == RolloutStatus.CREATING) {\n+            return context;\n+        }\n+        if (permissionChecker.hasRolloutUpdatePermission()) {\n+            final ContextMenuItem cancelItem = context.addItem(UPDATE_OPTION);\n+            cancelItem.setData(new ContextMenuData(rolloutId, ACTION.UPDATE));\n+        }\n+        return context;\n+    }\n+\n+    private String convertRolloutStatusToString(final RolloutStatus value) {\n+        String result = null;\n+        switch (value) {\n+        case FINISHED:\n+            result = HawkbitCommonUtil.getStatusLabelDetailsInString(\n+                    Integer.toString(FontAwesome.CHECK_CIRCLE.getCodepoint()), SPUIStyleDefinitions.STATUS_ICON_GREEN,\n+                    SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);\n+            break;\n+        case PAUSED:\n+            result = HawkbitCommonUtil.getStatusLabelDetailsInString(Integer.toString(FontAwesome.PAUSE.getCodepoint()),\n+                    SPUIStyleDefinitions.STATUS_ICON_BLUE, SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);\n+            break;\n+        case RUNNING:\n+            result = HawkbitCommonUtil.getStatusLabelDetailsInString(null, SPUIStyleDefinitions.STATUS_SPINNER_YELLOW,\n+                    SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);\n+            break;\n+        case READY:\n+            result = HawkbitCommonUtil.getStatusLabelDetailsInString(\n+                    Integer.toString(FontAwesome.DOT_CIRCLE_O.getCodepoint()),\n+                    SPUIStyleDefinitions.STATUS_ICON_LIGHT_BLUE, SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);\n+            break;\n+        case STOPPED:\n+            result = HawkbitCommonUtil.getStatusLabelDetailsInString(Integer.toString(FontAwesome.STOP.getCodepoint()),\n+                    SPUIStyleDefinitions.STATUS_ICON_RED, SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);\n+            break;\n+        case CREATING:\n+            result = HawkbitCommonUtil.getStatusLabelDetailsInString(null, SPUIStyleDefinitions.STATUS_SPINNER_GREY,\n+                    SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);\n+            break;\n+        case STARTING:\n+            result = HawkbitCommonUtil.getStatusLabelDetailsInString(null, SPUIStyleDefinitions.STATUS_SPINNER_BLUE,\n+                    SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);\n+            break;\n+        case ERROR_CREATING:\n+            result = HawkbitCommonUtil.getStatusLabelDetailsInString(\n+                    Integer.toString(FontAwesome.EXCLAMATION_CIRCLE.getCodepoint()),\n+                    SPUIStyleDefinitions.STATUS_ICON_RED, SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);\n+            break;\n+        case ERROR_STARTING:\n+            result = HawkbitCommonUtil.getStatusLabelDetailsInString(\n+                    Integer.toString(FontAwesome.EXCLAMATION_CIRCLE.getCodepoint()),\n+                    SPUIStyleDefinitions.STATUS_ICON_RED, SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);\n+            break;\n+        default:\n+            break;\n+        }\n+        return result;\n+    }\n+\n+    private void menuItemClicked(final ContextMenuItemClickEvent event) {\n+        final ContextMenuItem item = (ContextMenuItem) event.getSource();\n+        final ContextMenuData contextMenuData = (ContextMenuData) item.getData();\n+        final Item row = getContainerDataSource().getItem(contextMenuData.getRolloutId());\n+        final String rolloutName = (String) row.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();\n+        if (contextMenuData.getAction() == ACTION.PAUSE) {","path":"hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListGrid.java","position":389,"original_position":389,"commit_id":"578bd66b2852337da77a5bc9d1bdd9034853b722","original_commit_id":"578bd66b2852337da77a5bc9d1bdd9034853b722","user":{"login":"SirWayne","id":6340898,"avatar_url":"https://avatars.githubusercontent.com/u/6340898?v=3","gravatar_id":"","url":"https://api.github.com/users/SirWayne","html_url":"https://github.com/SirWayne","followers_url":"https://api.github.com/users/SirWayne/followers","following_url":"https://api.github.com/users/SirWayne/following{/other_user}","gists_url":"https://api.github.com/users/SirWayne/gists{/gist_id}","starred_url":"https://api.github.com/users/SirWayne/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SirWayne/subscriptions","organizations_url":"https://api.github.com/users/SirWayne/orgs","repos_url":"https://api.github.com/users/SirWayne/repos","events_url":"https://api.github.com/users/SirWayne/events{/privacy}","received_events_url":"https://api.github.com/users/SirWayne/received_events","type":"User","site_admin":false},"body":"switch","created_at":"2016-03-07T09:36:35Z","updated_at":"2016-03-07T09:36:35Z","html_url":"https://github.com/eclipse/hawkbit/pull/71#discussion_r55179572","pull_request_url":"https://api.github.com/repos/eclipse/hawkbit/pulls/71","_links":{"self":{"href":"https://api.github.com/repos/eclipse/hawkbit/pulls/comments/55179572"},"html":{"href":"https://github.com/eclipse/hawkbit/pull/71#discussion_r55179572"},"pull_request":{"href":"https://api.github.com/repos/eclipse/hawkbit/pulls/71"}}},"pull_request":{"url":"https://api.github.com/repos/eclipse/hawkbit/pulls/71","id":61838482,"html_url":"https://github.com/eclipse/hawkbit/pull/71","diff_url":"https://github.com/eclipse/hawkbit/pull/71.diff","patch_url":"https://github.com/eclipse/hawkbit/pull/71.patch","issue_url":"https://api.github.com/repos/eclipse/hawkbit/issues/71","number":71,"state":"open","locked":false,"title":"Rollout migrate table to grid","user":{"login":"asharani-murugesh","id":11748373,"avatar_url":"https://avatars.githubusercontent.com/u/11748373?v=3","gravatar_id":"","url":"https://api.github.com/users/asharani-murugesh","html_url":"https://github.com/asharani-murugesh","followers_url":"https://api.github.com/users/asharani-murugesh/followers","following_url":"https://api.github.com/users/asharani-murugesh/following{/other_user}","gists_url":"https://api.github.com/users/asharani-murugesh/gists{/gist_id}","starred_url":"https://api.github.com/users/asharani-murugesh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/asharani-murugesh/subscriptions","organizations_url":"https://api.github.com/users/asharani-murugesh/orgs","repos_url":"https://api.github.com/users/asharani-murugesh/repos","events_url":"https://api.github.com/users/asharani-murugesh/events{/privacy}","received_events_url":"https://api.github.com/users/asharani-murugesh/received_events","type":"User","site_admin":false},"body":"Rollout migrate table to grid \r\n\r\n\r\nSigned-off-by: asharani-murugesh <asharani.murugesh@in.bosch.com>\r\n","created_at":"2016-03-06T09:38:51Z","updated_at":"2016-03-07T09:36:35Z","closed_at":null,"merged_at":null,"merge_commit_sha":"213411f14b7f30da42fd8ad79d1809a330607728","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/eclipse/hawkbit/pulls/71/commits","review_comments_url":"https://api.github.com/repos/eclipse/hawkbit/pulls/71/comments","review_comment_url":"https://api.github.com/repos/eclipse/hawkbit/pulls/comments{/number}","comments_url":"https://api.github.com/repos/eclipse/hawkbit/issues/71/comments","statuses_url":"https://api.github.com/repos/eclipse/hawkbit/statuses/578bd66b2852337da77a5bc9d1bdd9034853b722","head":{"label":"bsinno:Rollout_migrate_table_to_grid_final","ref":"Rollout_migrate_table_to_grid_final","sha":"578bd66b2852337da77a5bc9d1bdd9034853b722","user":{"login":"bsinno","id":9215699,"avatar_url":"https://avatars.githubusercontent.com/u/9215699?v=3","gravatar_id":"","url":"https://api.github.com/users/bsinno","html_url":"https://github.com/bsinno","followers_url":"https://api.github.com/users/bsinno/followers","following_url":"https://api.github.com/users/bsinno/following{/other_user}","gists_url":"https://api.github.com/users/bsinno/gists{/gist_id}","starred_url":"https://api.github.com/users/bsinno/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bsinno/subscriptions","organizations_url":"https://api.github.com/users/bsinno/orgs","repos_url":"https://api.github.com/users/bsinno/repos","events_url":"https://api.github.com/users/bsinno/events{/privacy}","received_events_url":"https://api.github.com/users/bsinno/received_events","type":"Organization","site_admin":false},"repo":{"id":50108079,"name":"hawkbit","full_name":"bsinno/hawkbit","owner":{"login":"bsinno","id":9215699,"avatar_url":"https://avatars.githubusercontent.com/u/9215699?v=3","gravatar_id":"","url":"https://api.github.com/users/bsinno","html_url":"https://github.com/bsinno","followers_url":"https://api.github.com/users/bsinno/followers","following_url":"https://api.github.com/users/bsinno/following{/other_user}","gists_url":"https://api.github.com/users/bsinno/gists{/gist_id}","starred_url":"https://api.github.com/users/bsinno/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bsinno/subscriptions","organizations_url":"https://api.github.com/users/bsinno/orgs","repos_url":"https://api.github.com/users/bsinno/repos","events_url":"https://api.github.com/users/bsinno/events{/privacy}","received_events_url":"https://api.github.com/users/bsinno/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/bsinno/hawkbit","description":"","fork":true,"url":"https://api.github.com/repos/bsinno/hawkbit","forks_url":"https://api.github.com/repos/bsinno/hawkbit/forks","keys_url":"https://api.github.com/repos/bsinno/hawkbit/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bsinno/hawkbit/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bsinno/hawkbit/teams","hooks_url":"https://api.github.com/repos/bsinno/hawkbit/hooks","issue_events_url":"https://api.github.com/repos/bsinno/hawkbit/issues/events{/number}","events_url":"https://api.github.com/repos/bsinno/hawkbit/events","assignees_url":"https://api.github.com/repos/bsinno/hawkbit/assignees{/user}","branches_url":"https://api.github.com/repos/bsinno/hawkbit/branches{/branch}","tags_url":"https://api.github.com/repos/bsinno/hawkbit/tags","blobs_url":"https://api.github.com/repos/bsinno/hawkbit/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bsinno/hawkbit/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bsinno/hawkbit/git/refs{/sha}","trees_url":"https://api.github.com/repos/bsinno/hawkbit/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bsinno/hawkbit/statuses/{sha}","languages_url":"https://api.github.com/repos/bsinno/hawkbit/languages","stargazers_url":"https://api.github.com/repos/bsinno/hawkbit/stargazers","contributors_url":"https://api.github.com/repos/bsinno/hawkbit/contributors","subscribers_url":"https://api.github.com/repos/bsinno/hawkbit/subscribers","subscription_url":"https://api.github.com/repos/bsinno/hawkbit/subscription","commits_url":"https://api.github.com/repos/bsinno/hawkbit/commits{/sha}","git_commits_url":"https://api.github.com/repos/bsinno/hawkbit/git/commits{/sha}","comments_url":"https://api.github.com/repos/bsinno/hawkbit/comments{/number}","issue_comment_url":"https://api.github.com/repos/bsinno/hawkbit/issues/comments{/number}","contents_url":"https://api.github.com/repos/bsinno/hawkbit/contents/{+path}","compare_url":"https://api.github.com/repos/bsinno/hawkbit/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bsinno/hawkbit/merges","archive_url":"https://api.github.com/repos/bsinno/hawkbit/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bsinno/hawkbit/downloads","issues_url":"https://api.github.com/repos/bsinno/hawkbit/issues{/number}","pulls_url":"https://api.github.com/repos/bsinno/hawkbit/pulls{/number}","milestones_url":"https://api.github.com/repos/bsinno/hawkbit/milestones{/number}","notifications_url":"https://api.github.com/repos/bsinno/hawkbit/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bsinno/hawkbit/labels{/name}","releases_url":"https://api.github.com/repos/bsinno/hawkbit/releases{/id}","deployments_url":"https://api.github.com/repos/bsinno/hawkbit/deployments","created_at":"2016-01-21T13:05:15Z","updated_at":"2016-02-08T13:37:16Z","pushed_at":"2016-03-07T09:07:14Z","git_url":"git://github.com/bsinno/hawkbit.git","ssh_url":"git@github.com:bsinno/hawkbit.git","clone_url":"https://github.com/bsinno/hawkbit.git","svn_url":"https://github.com/bsinno/hawkbit","homepage":null,"size":2616,"stargazers_count":2,"watchers_count":2,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":2,"default_branch":"master"}},"base":{"label":"eclipse:master","ref":"master","sha":"f2fe6270f10293e753533401524e0d93bdff6ca7","user":{"login":"eclipse","id":56974,"avatar_url":"https://avatars.githubusercontent.com/u/56974?v=3","gravatar_id":"","url":"https://api.github.com/users/eclipse","html_url":"https://github.com/eclipse","followers_url":"https://api.github.com/users/eclipse/followers","following_url":"https://api.github.com/users/eclipse/following{/other_user}","gists_url":"https://api.github.com/users/eclipse/gists{/gist_id}","starred_url":"https://api.github.com/users/eclipse/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eclipse/subscriptions","organizations_url":"https://api.github.com/users/eclipse/orgs","repos_url":"https://api.github.com/users/eclipse/repos","events_url":"https://api.github.com/users/eclipse/events{/privacy}","received_events_url":"https://api.github.com/users/eclipse/received_events","type":"Organization","site_admin":false},"repo":{"id":45860898,"name":"hawkbit","full_name":"eclipse/hawkbit","owner":{"login":"eclipse","id":56974,"avatar_url":"https://avatars.githubusercontent.com/u/56974?v=3","gravatar_id":"","url":"https://api.github.com/users/eclipse","html_url":"https://github.com/eclipse","followers_url":"https://api.github.com/users/eclipse/followers","following_url":"https://api.github.com/users/eclipse/following{/other_user}","gists_url":"https://api.github.com/users/eclipse/gists{/gist_id}","starred_url":"https://api.github.com/users/eclipse/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eclipse/subscriptions","organizations_url":"https://api.github.com/users/eclipse/orgs","repos_url":"https://api.github.com/users/eclipse/repos","events_url":"https://api.github.com/users/eclipse/events{/privacy}","received_events_url":"https://api.github.com/users/eclipse/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/eclipse/hawkbit","description":"","fork":false,"url":"https://api.github.com/repos/eclipse/hawkbit","forks_url":"https://api.github.com/repos/eclipse/hawkbit/forks","keys_url":"https://api.github.com/repos/eclipse/hawkbit/keys{/key_id}","collaborators_url":"https://api.github.com/repos/eclipse/hawkbit/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/eclipse/hawkbit/teams","hooks_url":"https://api.github.com/repos/eclipse/hawkbit/hooks","issue_events_url":"https://api.github.com/repos/eclipse/hawkbit/issues/events{/number}","events_url":"https://api.github.com/repos/eclipse/hawkbit/events","assignees_url":"https://api.github.com/repos/eclipse/hawkbit/assignees{/user}","branches_url":"https://api.github.com/repos/eclipse/hawkbit/branches{/branch}","tags_url":"https://api.github.com/repos/eclipse/hawkbit/tags","blobs_url":"https://api.github.com/repos/eclipse/hawkbit/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/eclipse/hawkbit/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/eclipse/hawkbit/git/refs{/sha}","trees_url":"https://api.github.com/repos/eclipse/hawkbit/git/trees{/sha}","statuses_url":"https://api.github.com/repos/eclipse/hawkbit/statuses/{sha}","languages_url":"https://api.github.com/repos/eclipse/hawkbit/languages","stargazers_url":"https://api.github.com/repos/eclipse/hawkbit/stargazers","contributors_url":"https://api.github.com/repos/eclipse/hawkbit/contributors","subscribers_url":"https://api.github.com/repos/eclipse/hawkbit/subscribers","subscription_url":"https://api.github.com/repos/eclipse/hawkbit/subscription","commits_url":"https://api.github.com/repos/eclipse/hawkbit/commits{/sha}","git_commits_url":"https://api.github.com/repos/eclipse/hawkbit/git/commits{/sha}","comments_url":"https://api.github.com/repos/eclipse/hawkbit/comments{/number}","issue_comment_url":"https://api.github.com/repos/eclipse/hawkbit/issues/comments{/number}","contents_url":"https://api.github.com/repos/eclipse/hawkbit/contents/{+path}","compare_url":"https://api.github.com/repos/eclipse/hawkbit/compare/{base}...{head}","merges_url":"https://api.github.com/repos/eclipse/hawkbit/merges","archive_url":"https://api.github.com/repos/eclipse/hawkbit/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/eclipse/hawkbit/downloads","issues_url":"https://api.github.com/repos/eclipse/hawkbit/issues{/number}","pulls_url":"https://api.github.com/repos/eclipse/hawkbit/pulls{/number}","milestones_url":"https://api.github.com/repos/eclipse/hawkbit/milestones{/number}","notifications_url":"https://api.github.com/repos/eclipse/hawkbit/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/eclipse/hawkbit/labels{/name}","releases_url":"https://api.github.com/repos/eclipse/hawkbit/releases{/id}","deployments_url":"https://api.github.com/repos/eclipse/hawkbit/deployments","created_at":"2015-11-09T19:19:06Z","updated_at":"2016-02-14T16:30:25Z","pushed_at":"2016-03-07T09:07:14Z","git_url":"git://github.com/eclipse/hawkbit.git","ssh_url":"git@github.com:eclipse/hawkbit.git","clone_url":"https://github.com/eclipse/hawkbit.git","svn_url":"https://github.com/eclipse/hawkbit","homepage":null,"size":2859,"stargazers_count":7,"watchers_count":7,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":5,"forks":3,"open_issues":5,"watchers":7,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/eclipse/hawkbit/pulls/71"},"html":{"href":"https://github.com/eclipse/hawkbit/pull/71"},"issue":{"href":"https://api.github.com/repos/eclipse/hawkbit/issues/71"},"comments":{"href":"https://api.github.com/repos/eclipse/hawkbit/issues/71/comments"},"review_comments":{"href":"https://api.github.com/repos/eclipse/hawkbit/pulls/71/comments"},"review_comment":{"href":"https://api.github.com/repos/eclipse/hawkbit/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/eclipse/hawkbit/pulls/71/commits"},"statuses":{"href":"https://api.github.com/repos/eclipse/hawkbit/statuses/578bd66b2852337da77a5bc9d1bdd9034853b722"}}}}