/* | |
* Copyright (c) Robert Bosch GmbH. All rights reserved. | |
*/ | |
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; | |
/** | |
* @author ADG5COB | |
*/ | |
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(); | |
} | |
} |