blob: f19600b5d8eef51b4bd51375b04cef764a9b7d15 [file] [log] [blame]
<!--
Copyright (c) 2020 Contributors to the Eclipse Foundation
See the NOTICE file(s) distributed with this work for additional
information regarding copyright ownership.
This program and the accompanying materials are made available under the
terms of the Eclipse Public License 2.0 which is available at
http://www.eclipse.org/legal/epl-2.0
SPDX-License-Identifier: EPL-2.0
-->
<template>
<div style="height: 100%; position: relative">
<div v-if="!selectedFile" style="height: 100%">
<div style="height: 40px; margin-bottom: 5px; margin-top: 10px;">
<el-input style="margin-bottom: 10px;" size="mini" v-model="searchInput"
@keyup.enter.native="doSearch"
:placeholder="$t('jifa.typeKeyWord')" clearable/>
</div>
<div style="position: absolute; top: 50px; left: 0; right: 0; bottom: 80px;">
<el-table :data="candidateFiles"
:highlight-current-row="false"
stripe
:header-cell-style="headerCellStyle"
:cell-style='fileViewCellStyle'
row-key="rowKey"
lazy
height="100%"
v-loading="fileViewLoading"
>
<el-table-column label="File Name ( Please double click to choose a file as a heap baseline )" prop="name"
show-overflow-tooltip>
<template slot-scope="scope">
<span style="cursor: pointer" @dblclick="doCompare(scope.row.finalName)">
<i class="el-icon-document"></i> {{scope.row.originalName}}
</span>
</template>
</el-table-column>
</el-table>
</div>
<div style="position: absolute; left: 0; right: 0; bottom: 0; height: 80px">
<el-row type="flex" justify="space-around" style="margin-top: 15px">
<el-col :span="8">
<el-pagination
background
layout="prev, pager, next"
:current-page="fileViewPage"
:page-size="pageSize"
:total="candidateFileTotalSize"
@current-change="handleFileViewCurrentChange"
:hide-on-single-page=false
align="center">
</el-pagination>
</el-col>
</el-row>
</div>
</div>
<div v-else style="height: 100%">
<div style="margin-bottom: 6px; height: 50px">
<el-button size="mini" icon="el-icon-back" @click="reselect" circle></el-button>
<span style='margin-left: 10px; font-size: 15px; font-weight: normal;
font-family: "Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;
color: #606266;
'>
<i class="el-icon-document"></i> {{selectedFile}}
</span>
</div>
<div style="position: absolute; top: 50px; left: 0; right: 0; bottom: 0;">
<el-table :data="tableData"
:highlight-current-row="false"
stripe
:header-cell-style="headerCellStyle"
:cell-style='cellStyle'
row-key="rowKey"
lazy
:indent=8
height="100%"
v-loading="loading"
>
<el-table-column label="Class Name" width="800px" show-overflow-tooltip="">
<template slot-scope="scope">
<span v-if="scope.row.isRecord">
<img :src="classIcon"/> {{scope.row.className}}
</span>
<span v-if="scope.row.isSummary">
<img :src="sumIcon" v-if="records.length >= summary.totalSize"/>
<img :src="sumPlusIcon" @dblclick="fetchRecords" style="cursor: pointer" v-else/>
{{ records.length }} <strong> / </strong> {{summary.totalSize}}
</span>
</template>
</el-table-column>
<el-table-column label="Objects">
<template slot-scope="scope">
{{ scope.row.objects > 0 ? '+' : '' }} {{ scope.row.objects}}
</template>
</el-table-column>
<el-table-column label="Shallow Heap">
<template slot-scope="scope">
{{ scope.row.shallowHeap> 0 ? '+' : '' }} {{ scope.row.shallowHeap}}
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
</template>
<script>
import axios from 'axios'
import {heapDumpService} from '../../util'
let rowKey = 1
export default {
props: ['file'],
methods: {
fetchCompareSummary() {
this.loading = true
axios.get(heapDumpService(this.file, 'compare/summary'), {
params: {
baseline: this.selectedFile
}
}).then(resp => {
this.summary = resp.data
if (this.summary.totalSize > 0) {
this.fetchRecords()
} else {
this.loading = false
}
})
},
fetchRecords() {
this.loading = true
axios.get(heapDumpService(this.file, 'compare/records'), {
params: {
page: this.nextPage,
pageSize: this.pageSize,
baseline: this.selectedFile
}
}).then(resp => {
let records = resp.data.data
records.forEach(record => this.records.push({
rowKey: rowKey++,
className: record.className,
objects: record.objects,
shallowHeap: record.shallowSize,
isRecord: true,
}))
this.tableData = this.records.concat({
rowKey: rowKey++,
objects: this.summary.objects,
shallowHeap: this.summary.shallowSize,
isSummary: true
})
this.nextPage++
this.loading = false
})
},
doCompare(fileName) {
this.selectedFile = fileName
this.fetchCompareSummary()
},
reselect() {
this.selectedFile = null
this.summary = null
this.records = []
this.tableData = []
this.nextPage = 1
},
doSearch() {
this.expectedFile = this.searchInput
this.fileViewPage = 1
this.fetchFiles(this.fileViewPage)
},
handleFileViewCurrentChange(page) {
this.fetchFiles(page)
},
fetchFiles(page) {
this.fileViewLoading = true
axios.get(heapDumpService(this.file, 'compare/files'), {
params: {
page: page,
pageSize: this.pageSize,
expected: this.expectedFile,
}
}).then(resp => {
this.candidateFileTotalSize = resp.data.totalSize
this.candidateFiles = resp.data.data
this.fileViewLoading = false
})
}
},
data() {
return {
fileViewCellStyle: {padding: '8px', fontSize: '15px'},
cellStyle: {padding: '4px', fontSize: '12px'},
headerCellStyle: {padding: 0, 'font-size': '12px', 'font-weight': 'normal'},
pageSize: 25,
fileViewPage: 1,
fileViewLoading: false,
searchInput: null,
expectedFile: null,
candidateFiles: [],
candidateFileTotalSize: 0,
selectedFile: null,
classIcon: require('../../assets/heap/objects/class.gif'),
sumIcon: require('../../assets/heap/misc/sum.gif'),
sumPlusIcon: require('../../assets/heap/misc/sum_plus.gif'),
loading: false,
summary: null,
nextPage: 1,
records: [],
tableData: [],
}
},
created() {
this.fetchFiles(this.fileViewPage)
}
}
</script>