/*
* Copyright 2015 the original author or authors.
* @https://github.com/scouter-project/scouter
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package scouter.client.stack.views;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
import scouter.client.Images;
import scouter.client.stack.actions.SaveXMLEditorAction;
import scouter.client.stack.base.MainProcessor;
import scouter.client.stack.base.PreferenceManager;
import scouter.client.stack.config.XMLReader;
import scouter.client.stack.data.StackFileInfo;
import scouter.client.stack.utils.ResourceUtils;
import scouter.client.util.ColoringWord;
import scouter.client.util.ImageUtil;
import scouter.client.util.CustomLineStyleListener;
public class XMLEditorView extends ViewPart {
public final static String ID = XMLEditorView.class.getName();
private ArrayList<ColoringWord> m_defaultHighlightings;
private StyledText m_text;
private String m_fileName;
private SaveXMLEditorAction m_saveAction;
private CustomLineStyleListener m_listener;
public void createPartControl(Composite parent) {
m_text = new StyledText(parent, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
initDefaultHighlightings();
m_listener = new CustomLineStyleListener(true, m_defaultHighlightings, false);
m_text.addLineStyleListener(m_listener);
m_text.addKeyListener(new KeyListener() {
public void keyReleased(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
if(e.stateMask == SWT.CTRL){
if(e.keyCode == 's'){
saveConfigurations();
}else if(e.keyCode == 'a'){
m_text.selectAll();
}
}
}
});
String fileName = null;
MainProcessor mainProcessor = MainProcessor.instance();
if(!mainProcessor.isDefaultConfiguration()){
fileName = checkFile(PreferenceManager.get().getCurrentParserConfig());
}
if(fileName == null){
StackFileInfo stackFileInfo = mainProcessor.getSelectedStackFileInfo();
if(stackFileInfo == null){
fileName = XMLReader.DEFAULT_XMLCONFIG;
}else{
fileName = checkFile(stackFileInfo.getParserConfig().getConfigFilename());
}
}
setFileName(fileName);
initialToolBar();
loadConfig();
}
private String checkFile(String fileName){
if(fileName == null){
return null;
}
File file = new File(fileName);
if(!file.exists() || !file.isFile()){
String message = new StringBuilder(100).append(fileName).append(" file is not exist. then editor use a default xml configuration.").toString();
ResourceUtils.confirmMessage(this.getSite().getShell(), message);
return XMLReader.DEFAULT_XMLCONFIG;
}
return fileName;
}
private void setFileName(String fileName){
m_fileName = fileName;
this.setPartName("ConfigStackAnalyzer-" + m_fileName);
}
private void loadConfig() {
BufferedInputStream in = null;
int fileSize = 0;
byte [] data = null;
try {
if(XMLReader.DEFAULT_XMLCONFIG.equals(m_fileName)){
in = new BufferedInputStream(ResourceUtils.getDefaultXMLConfig());
data = new byte[102400];
int ch;
while((ch = in.read()) >=0){
data[fileSize] = (byte)ch;
fileSize ++;
}
}else{
File file = new File(m_fileName);
fileSize = (int)file.length();
in = new BufferedInputStream(new FileInputStream(file));
data = new byte[fileSize];
in.read(data);
}
m_text.setText(new String(data, 0, fileSize, "UTF-8"));
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(in != null){
try { in.close();}catch(Exception ex){}
}
}
}
private void saveAsConfigurations(){
String newFileName = ResourceUtils.openFileSaveDialog(new String [] {"XML Parser Configuration"}, new String [] {"*.xml"}, ".", "scouter_stackanalyzer");
if(newFileName == null){
return;
}
ResourceUtils.saveFile(newFileName, m_text.getText());
if(XMLReader.DEFAULT_XMLCONFIG.equals(m_fileName)){
ResourceUtils.setVisiable(this, m_saveAction.getId(), true);
}
setFileName(newFileName);
PreferenceManager.get().setCurrentParserConfig(newFileName);
MainProcessor.instance().displayContent(null);
}
public void saveConfigurations(){
ResourceUtils.saveFile(m_fileName, m_text.getText());
}
private void initialToolBar() {
IToolBarManager man = getViewSite().getActionBars().getToolBarManager();
m_saveAction = new SaveXMLEditorAction(this, "Save", ImageUtil.getImageDescriptor(Images.save));
man.add(m_saveAction);
if(XMLReader.DEFAULT_XMLCONFIG.equals(m_fileName)){
ResourceUtils.setVisiable(this, m_saveAction.getId(), false);
}
man.add(new Action("SaveAs", ImageUtil.getImageDescriptor(Images.saveas)) {
public void run() {
saveAsConfigurations();
}
});
}
public void setFocus() {
IStatusLineManager slManager= getViewSite().getActionBars().getStatusLineManager();
slManager.setMessage("CTRL + S : save configurations, CTRL + A : select all text");
}
private void initDefaultHighlightings(){
m_defaultHighlightings = new ArrayList<ColoringWord>(20);
m_defaultHighlightings.add(new ColoringWord("<scouter>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</scouter>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<parser", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</parser>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<time", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</time>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<workerThread>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</workerThread>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<workingThread", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</workingThread>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<log>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</log>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<sql>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</sql>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<service", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</service>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<singleStack>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</singleStack>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<excludeStack>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</excludeStack>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<analyze>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</analyze>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<analyzeStack", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</analyzeStack", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<list>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</list>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<listMain>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</listMain>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<jmx>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</jmx>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<count>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</count>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<interval>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</interval>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<path>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</path>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<server>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</server>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<ip>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</ip>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("<port>", SWT.COLOR_BLUE, true));
m_defaultHighlightings.add(new ColoringWord("</port>", SWT.COLOR_BLUE, true));
}
}