blob: 6e6669be1e19c84e8b04612c40acaa2f53c5fe98 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2020 RBEI and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v. 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Adhith Gopal - Initial contribution and API
* Pavithra Krishna Reddy
* Deepthi Murugaiyan
*******************************************************************************/
package org.eclipse.blockchain.ui.views;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.blockchain.core.BlockchainCore;
import org.eclipse.blockchain.core.CoreCommandExecutor;
import org.eclipse.blockchain.ui.Activator;
import org.eclipse.blockchain.ui.util.UIUtilities;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
/**
*
*/
public class GethServerDialog extends Dialog {
private Text dataDirText;
private Text initFileText;
private final String userDir = System.getProperty("user.dir");
private String networkId = "";
private Label networkIdLabel;
private final Map<String, String> gethOptions = new HashMap<>();
private String dataDirectory = "";
private String genesisFile = "";
/**
* @return -
*/
public String getDataDirectory() {
return this.dataDirectory;
}
/**
* @return -
*/
public String getGenesisFile() {
return this.genesisFile;
}
/**
* @return -
*/
public Map<String, String> getGethOptions() {
return this.gethOptions;
}
/**
* @param parentShell
* -
*/
public GethServerDialog(final Shell parentShell) {
super(parentShell);
populateGethOptions();
}
private void populateGethOptions() {
this.gethOptions.put("rpc", "");
this.gethOptions.put("rpccorsdomain", "*");
this.gethOptions.put("rpcapi", "db,eth,net,web3,personal");
this.gethOptions.put("gcmode", "archive");
}
/**
* {@inheritDoc}
*/
@Override
protected void configureShell(final Shell shell) {
super.configureShell(shell);
shell.setText("Geth Server Setup");
shell.setSize(300, 400);
}
/**
* {@inheritDoc}
*/
@Override
protected Control createDialogArea(final Composite parent) {
Composite containerComp = new Composite(parent, SWT.None);
containerComp.setLayout(new GridLayout(3, false));
containerComp
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
createContent(containerComp);
UIUtilities.moveShellToCenterOfScreen(Display.getDefault(),
parent.getShell());
return parent;
}
private void createContent(final Composite containerComp) {
// First Layer
Label dataDirLabel = new Label(containerComp, SWT.None);
dataDirLabel.setText("Data Directory");
dataDirLabel
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
this.dataDirText = new Text(containerComp, SWT.BORDER);
this.dataDirText
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
this.dataDirText.setText("C:\\Deepthi\\BlockChain\\Account\\Node4");
this.dataDirText.setToolTipText(this.dataDirText.getText());
Button dataDirBrowse = new Button(containerComp, SWT.PUSH);
dataDirBrowse
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
dataDirBrowse.setText("Browse");
dataDirBrowse.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void widgetSelected(final SelectionEvent e) {
getAndSetSelectedDirectoryNode(containerComp,
GethServerDialog.this.dataDirText);
}
});
// Second Layer
Label initFileLabel = new Label(containerComp, SWT.None);
initFileLabel.setText("Init File");
initFileLabel
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
this.initFileText = new Text(containerComp, SWT.BORDER);
this.initFileText
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
this.initFileText.setText("");
this.initFileText.setToolTipText(this.initFileText.getText());
Button initFileBrowse = new Button(containerComp, SWT.PUSH);
initFileBrowse
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
initFileBrowse.setText("Browse");
initFileBrowse.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void widgetSelected(final SelectionEvent e) {
getandSetSelectedGenesisFile(containerComp,
GethServerDialog.this.initFileText);
}
});
// Scrolled Composite - contains network values
ScrolledComposite networkComposite = new ScrolledComposite(
containerComp, SWT.V_SCROLL | SWT.BORDER);
networkComposite.setLayout(new GridLayout(1, false));
networkComposite.setLayoutData(
new GridData(SWT.FILL, SWT.FILL, false, false, 3, 0));
Composite networkChild = createdScrolledContent(networkComposite);
networkComposite.setContent(networkChild);
networkComposite.setMinSize(
networkComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
networkComposite.setExpandHorizontal(true);
networkComposite.setExpandVertical(true);
networkComposite.layout();
}
private Composite createdScrolledContent(
final ScrolledComposite scrolledComposite) {
/**
* This contains the geth arguments which should be made configurable,
* as of now its static but networkId will be read from the genesis file
*/
Composite childComp = new Composite(scrolledComposite, SWT.None);
childComp.setLayout(new GridLayout(1, false));
childComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Group networkGroup = new Group(childComp, SWT.BORDER);
networkGroup.setLayout(new GridLayout(1, false));
networkGroup
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
networkGroup.setText("Network");
this.networkIdLabel = new Label(networkGroup, SWT.None | SWT.READ_ONLY);
this.networkIdLabel.setText("Network ID : " + (this.networkId.isEmpty()
? CoreCommandExecutor.getInstance().getDefaultNetworkIdForGeth()
: this.networkId));
Group rpcGroup = new Group(childComp, SWT.BORDER);
rpcGroup.setLayout(new GridLayout(1, false));
rpcGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
rpcGroup.setText("RPC");
for (Map.Entry<String, String> entry : this.gethOptions.entrySet()) {
Label lab = new Label(rpcGroup, SWT.None);
String val = entry.getValue();
lab.setText(entry.getKey() + (val.isEmpty() ? "" : " : " + val));
}
return childComp;
}
private void getandSetSelectedGenesisFile(final Composite parent,
final Text textWidget) {
FileDialog dataDir = new FileDialog(parent.getShell());
dataDir.setFilterPath(this.userDir);
String selectedDir = dataDir.open();
textWidget.setText(selectedDir);
try (BufferedReader br = new BufferedReader(
new FileReader(new File(selectedDir)))) {
String contents = "";
while ((contents = br.readLine()) != null) {
if (contents.contains("chainId")) {
this.networkId = contents
.substring(contents.indexOf(':') + 1)
.replace(",", "").trim();
this.networkIdLabel
.setText("Network ID : " + this.networkId);
this.networkIdLabel.getParent().layout();
}
}
} catch (IOException e) {
BlockchainCore.getInstance().logException(Activator.PLUGIN_ID,
e.getMessage(), e);
}
}
private void getAndSetSelectedDirectoryNode(final Composite parent,
final Text textWidget) {
DirectoryDialog dirDialog = new DirectoryDialog(parent.getShell());
dirDialog.setFilterPath(this.userDir);
String selectedDir = dirDialog.open();
textWidget.setText(selectedDir);
}
/**
* {@inheritDoc}
*/
@Override
protected void okPressed() {
this.dataDirectory = this.dataDirText.getText();
this.genesisFile = this.initFileText.getText();
super.okPressed();
}
}