package com.farata.cleardatabuilder.extjs.wizard;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jpt.jpa.core.internal.facet.JpaFacetDataModelProperties;
import org.eclipse.jst.servlet.ui.project.facet.WebProjectFirstPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Dialog;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
import org.eclipse.wst.common.frameworks.internal.operations.IProjectCreationPropertiesNew;
import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.core.ServerCore;
import org.eclipse.wst.server.core.ServerPort;
public class CDBProjectSecondPage extends WebProjectFirstPage implements CDBFacetDataModelProperties {
private Button springCheckbox;
private Group persistancePlatformGroup;
private Group extJSGroup;
private Group sampleDBGroup;
private Label warningLabel;
private Composite connectionGroup;
private Text appNameText;
public CDBProjectSecondPage(IDataModel model, String pageName) {
super(model, pageName);
setShouldAddEARComposite(false);
setPageComplete(false);
}
@Override
public void storeDefaultSettings() {
super.storeDefaultSettings();
IDialogSettings settings = getDialogSettings();
String locationType = model.getStringProperty(CDB_EXTJS_LOCATION_TYPE);
String extjsFolder = model.getStringProperty(CDB_EXTJS_FOLDER);
String extjsPath = model.getStringProperty(CDB_EXTJS_URL);
String extjsCDN = model.getStringProperty(CDB_EXTJS_CDN);
String platform = model.getStringProperty(CDB_PERSISTANCE_PLATFORM);
String connection = model.getStringProperty(CONNECTION);
String springIntegration = String.valueOf(model.getBooleanProperty(CDB_SPRING_INTEGRATION));
settings.put(CDB_EXTJS_LOCATION_TYPE, locationType);
settings.put(CDB_EXTJS_FOLDER, extjsFolder);
settings.put(CDB_EXTJS_URL, extjsPath);
settings.put(CDB_EXTJS_CDN, extjsCDN);
settings.put(CDB_PERSISTANCE_PLATFORM, platform);
settings.put(CONNECTION, connection);
settings.put(CDB_SPRING_INTEGRATION, springIntegration);
}
@Override
public void restoreDefaultSettings() {
super.restoreDefaultSettings();
IDialogSettings settings = getDialogSettings();
String locationType = settings.get(CDB_EXTJS_LOCATION_TYPE);
String extjsFolder = settings.get(CDB_EXTJS_FOLDER);
String extjsPath = settings.get(CDB_EXTJS_URL);
String extjsCDN = settings.get(CDB_EXTJS_CDN);
String platform = settings.get(CDB_PERSISTANCE_PLATFORM);
String connection = settings.get(CONNECTION);
String springIntegration = settings.get(CDB_SPRING_INTEGRATION);
model.setProperty(CDB_EXTJS_LOCATION_TYPE, isEmpty(locationType) ? TYPE_LOCAL_FOLDER : locationType);
model.setProperty(CDB_EXTJS_FOLDER, extjsFolder);
model.setProperty(CDB_EXTJS_URL, isEmpty(extjsPath) ? "/extjs" : extjsPath);
model.setProperty(CDB_EXTJS_CDN, isEmpty(extjsCDN) ? "http://cdn.sencha.io/ext-4.2.0-gpl" : extjsCDN);
model.setProperty(CDB_PERSISTANCE_PLATFORM, isEmpty(platform) ? "myBatis" : platform);
try {
model.setProperty(CONNECTION, connection);
} catch (Exception e) {
}
model.setProperty(CDB_SPRING_INTEGRATION, isEmpty(springIntegration) ? true : Boolean.parseBoolean(springIntegration));
}
private boolean isEmpty(String s) {
return s == null || s.trim().length() == 0;
}
@Override
protected String[] getValidationPropertyNames() {
String superProperties[] = super.getValidationPropertyNames();
List list = Arrays.asList(superProperties);
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.addAll(list);
arrayList.add(CDB_APPLICATION_NAME);
arrayList.add(CDB_EXTJS_FOLDER);
arrayList.add(CDB_EXTJS_CDN);
arrayList.add(CDB_EXTJS_URL);
arrayList.add(CDB_EXTJS_LOCATION_TYPE);
arrayList.add(CDB_SAMPLEDB_FOLDER);
arrayList.add(CDB_PERSISTANCE_PLATFORM);
arrayList.add(JpaFacetDataModelProperties.CONNECTION_ACTIVE);
return (String[]) arrayList.toArray(new String[0]);
}
@Override
protected Composite createTopLevelComposite(Composite parent) {
final Composite top = new Composite(parent, 0);
// PlatformUI.getWorkbench().getHelpSystem().setHelp(top,
// getInfopopID());
top.setLayout(new GridLayout());
top.setLayoutData(new GridData(1808));
createProjectGroup(top);
Control[] children = top.getChildren();
Composite locationGroup = (Composite) children[children.length - 1];
excludeControl(locationGroup);
createApplicationGroup(top);
createExtJSGroup(top);
createServerTargetComposite(top);
createSampleDBGroup(top);
createPersistancePlatformGroup(top);
CDBJpaFacetInstallPage.getConnectionGroup(top, (CDBProjectWizard) getWizard());
children = top.getChildren();
connectionGroup = (Composite) children[children.length - 1];
for (int i = 0; i < 9; i++) {
int toRemove = connectionGroup.getChildren().length - i - 1;
excludeControl(connectionGroup.getChildren()[toRemove]);
}
createSpringIntegrationGroup(top);
createWarningLabel(top);
IDataModelListener idatamodellistener = new IDataModelListener() {
@Override
public void propertyChanged(DataModelEvent datamodelevent) {
if (CDB_PROJECT_TYPE.equals(datamodelevent.getPropertyName())) {
switchControls(model.getStringProperty(CDB_PROJECT_TYPE), top);
} else if (IProjectCreationPropertiesNew.PROJECT.equals(datamodelevent.getPropertyName())) {
IProject prj = (IProject) model.getProperty(IProjectCreationPropertiesNew.PROJECT);
appNameText.setText(prj.getName());
model.setStringProperty(CDB_APPLICATION_NAME, prj.getName());
}
}
};
model.addListener(idatamodellistener);
model.setProperty(CDB_PROJECT_TYPE, "new");
return top;
}
private void createApplicationGroup(Composite parent) {
Composite appGroup = new Composite(parent, 0);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
appGroup.setLayout(layout);
appGroup.setLayoutData(new GridData(768));
Label appNameLabel = new Label(appGroup, SWT.NONE);
appNameLabel.setText("Application: ");
appNameText = new Text(appGroup, SWT.BORDER);
appNameText.setLayoutData(new GridData(768));
appNameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
model.setProperty(CDB_APPLICATION_NAME, appNameText.getText());
}
});
}
private void createExtJSGroup(final Composite parent) {
Group group = new Group(parent, SWT.SHADOW_IN);
group.setText("Ext JS Location");
group.setLayoutData(gdhfill());
group.setLayout(new GridLayout(3, false));
createLocalFolderGroup(group);
createLocalURLGroup(group);
createCDNGroup(group);
model.setStringProperty(CDB_EXTJS_LOCATION_TYPE, TYPE_LOCAL_FOLDER);
extJSGroup = group;
}
private void createLocalFolderGroup(final Group parent) {
final Button localFolderButton = new Button(parent, SWT.RADIO);
localFolderButton.setText("Local Folder:");
localFolderButton.setSelection(true);
final Text extJSPath = new Text(parent, SWT.BORDER);
extJSPath.setLayoutData(gdhfill());
extJSPath.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
model.setProperty(CDB_EXTJS_FOLDER, extJSPath.getText());
}
});
localFolderButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
if (localFolderButton.getSelection()) {
model.setStringProperty(CDB_EXTJS_LOCATION_TYPE, TYPE_LOCAL_FOLDER);
model.setProperty(CDB_EXTJS_FOLDER, extJSPath.getText());
}
}
@Override
public void widgetDefaultSelected(SelectionEvent arg0) {
}
});
final Button button = new Button(parent, SWT.NONE);
button.setText(" Browse... ");
button.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
DirectoryDialog dialog = new DirectoryDialog(parent.getShell());
if (!"".equals(extJSPath.getText())) {
String initialDir = extJSPath.getText();
dialog.setFilterPath(initialDir);
}
String result = dialog.open();
if (result != null) {
extJSPath.setText(result.toString());
model.setProperty(CDB_EXTJS_FOLDER, extJSPath.getText());
}
}
});
model.addListener(new IDataModelListener() {
@Override
public void propertyChanged(DataModelEvent e) {
if (e.getPropertyName().equals(CDB_EXTJS_LOCATION_TYPE)) {
String type = model.getStringProperty(CDB_EXTJS_LOCATION_TYPE);
boolean enabled = type.equals(TYPE_LOCAL_FOLDER);
extJSPath.setEnabled(enabled);
button.setEnabled(enabled);
localFolderButton.setSelection(enabled);
} else if (e.getPropertyName().equals(CDB_EXTJS_FOLDER)) {
String s = model.getStringProperty(CDB_EXTJS_FOLDER);
if (isEmpty(s) || !s.equals(extJSPath.getText())) {
extJSPath.setText(s);
}
}
}
});
}
private void createLocalURLGroup(final Group parent) {
final Button localFolderButton = new Button(parent, SWT.RADIO);
localFolderButton.setText("Local URL:");
final Text extJSPath = new Text(parent, SWT.BORDER);
extJSPath.setLayoutData(gdhfill());
model.setProperty(CDB_EXTJS_URL, "/extjs");
extJSPath.setText("/extjs");
extJSPath.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
model.setProperty(CDB_EXTJS_URL, extJSPath.getText());
}
});
localFolderButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
if (localFolderButton.getSelection()) {
model.setStringProperty(CDB_EXTJS_LOCATION_TYPE, TYPE_LOCAL_URL);
model.setProperty(CDB_EXTJS_URL, extJSPath.getText());
}
}
@Override
public void widgetDefaultSelected(SelectionEvent arg0) {
}
});
final Button button = new Button(parent, SWT.NONE);
button.setText(" Validate ");
button.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
String sUrl = extJSPath.getText();
if (!CDBPingJob.isExternalURL(sUrl)) {
sUrl = sUrl.startsWith("/") ? sUrl : "/" + sUrl;
IRuntime runtime = (IRuntime) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_RUNTIME);
sUrl = "http://localhost:" + suggestHttpPort(runtime.getName()) + sUrl;
}
new CDBPingJob(getShell(), sUrl, false).schedule();
}
});
model.addListener(new IDataModelListener() {
@Override
public void propertyChanged(DataModelEvent e) {
if (e.getPropertyName().equals(CDB_EXTJS_LOCATION_TYPE)) {
String type = model.getStringProperty(CDB_EXTJS_LOCATION_TYPE);
boolean enabled = type.equals(TYPE_LOCAL_URL);
extJSPath.setEnabled(enabled);
button.setEnabled(enabled);
localFolderButton.setSelection(enabled);
} else if (e.getPropertyName().equals(CDB_EXTJS_URL)) {
String type = model.getStringProperty(CDB_EXTJS_LOCATION_TYPE);
boolean enabled = type.equals(TYPE_LOCAL_URL);
button.setEnabled(enabled);
String s = model.getStringProperty(CDB_EXTJS_URL);
if (isEmpty(s) || !s.equals(extJSPath.getText())) {
extJSPath.setText(s);
}
}
}
});
}
private void createCDNGroup(final Group parent) {
final Button localFolderButton = new Button(parent, SWT.RADIO);
localFolderButton.setText("CDN:");
final Text extJSPath = new Text(parent, SWT.BORDER);
extJSPath.setLayoutData(gdhfill());
extJSPath.setText("http://cdn.sencha.io/ext-4.2.0-gpl");
model.setProperty(CDB_EXTJS_CDN, extJSPath.getText());
extJSPath.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
model.setProperty(CDB_EXTJS_CDN, extJSPath.getText());
}
});
localFolderButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
if (localFolderButton.getSelection()) {
model.setStringProperty(CDB_EXTJS_LOCATION_TYPE, TYPE_CDN);
model.setProperty(CDB_EXTJS_CDN, extJSPath.getText());
}
}
@Override
public void widgetDefaultSelected(SelectionEvent arg0) {
}
});
final Button button = new Button(parent, SWT.NONE);
button.setText(" Validate ");
button.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
new CDBPingJob(getShell(), extJSPath.getText(), false).schedule();
}
});
model.addListener(new IDataModelListener() {
@Override
public void propertyChanged(DataModelEvent e) {
if (e.getPropertyName().equals(CDB_EXTJS_LOCATION_TYPE)) {
String type = model.getStringProperty(CDB_EXTJS_LOCATION_TYPE);
boolean enabled = type.equals(TYPE_CDN);
extJSPath.setEnabled(enabled);
button.setEnabled(enabled);
localFolderButton.setSelection(enabled);
} else if (e.getPropertyName().equals(CDB_EXTJS_CDN)) {
String s = model.getStringProperty(CDB_EXTJS_CDN);
if (isEmpty(s) || !s.equals(extJSPath.getText())) {
extJSPath.setText(s);
}
}
}
});
}
private void createPersistancePlatformGroup(Composite parent) {
Group group = new Group(parent, SWT.SHADOW_IN);
group.setText("Persistence Platform");
group.setLayoutData(gdhfill());
group.setLayout(new GridLayout(3, false));
final Button myBatis = new Button(group, SWT.RADIO);
myBatis.setText("MyBatis");
myBatis.setSelection(true);
final Button hibernate = new Button(group, SWT.RADIO);
hibernate.setText("Hibernate");
final Button none = new Button(group, SWT.RADIO);
none.setText("None");
model.setStringProperty(CDB_PERSISTANCE_PLATFORM, "myBatis");
SelectionListener listener = new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent event) {
if (event.widget == myBatis) {
model.setProperty(CDB_PERSISTANCE_PLATFORM, "myBatis");
} else if (event.widget == hibernate) {
model.setProperty(CDB_PERSISTANCE_PLATFORM, "hibernate");
} else if (event.widget == none) {
model.setProperty(CDB_PERSISTANCE_PLATFORM, "none");
}
}
@Override
public void widgetDefaultSelected(SelectionEvent arg0) {
}
};
myBatis.addSelectionListener(listener);
hibernate.addSelectionListener(listener);
none.addSelectionListener(listener);
model.addListener(new IDataModelListener() {
@Override
public void propertyChanged(DataModelEvent e) {
if (e.getPropertyName().equals(CDB_PERSISTANCE_PLATFORM)) {
String platform = model.getStringProperty(CDB_PERSISTANCE_PLATFORM);
myBatis.setSelection("myBatis".equals(platform));
hibernate.setSelection("hibernate".equals(platform));
none.setSelection("none".equals(platform));
}
}
});
persistancePlatformGroup = group;
}
private void createSampleDBGroup(final Composite parent) {
Group group = new Group(parent, SWT.NO_RADIO_GROUP);
group.setText("Folder to install sample database - cleardb");
group.setLayoutData(gdhfill());
group.setLayout(new GridLayout(2, false));
String home = System.getProperty("user.home");
String os = System.getProperty("os.name").toLowerCase();
String defaultDBFolder = "";
if (os.indexOf("win") >= 0) {
defaultDBFolder = home + "\\Application Data\\ClearDataBuilder";
} else if (os.indexOf("mac") >= 0) {
defaultDBFolder = home + "/Library/Application Support/ClearDataBuilder";
}
;
final Text sampleDB = new Text(group, SWT.BORDER);
sampleDB.setText(defaultDBFolder);
model.setStringProperty(CDB_SAMPLEDB_FOLDER, defaultDBFolder);
sampleDB.setLayoutData(gdhfill());
sampleDB.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
model.setProperty(CDB_SAMPLEDB_FOLDER, sampleDB.getText());
}
});
Button sampleDBbtn = new Button(group, SWT.NONE);
sampleDBbtn.setText(" Browse... ");
sampleDBbtn.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
DirectoryDialog dialog = new DirectoryDialog(parent.getShell());
if (!"".equals(sampleDB.getText())) {
String initialDir = sampleDB.getText();
dialog.setFilterPath(initialDir);
}
String result = dialog.open();
if (result != null) {
sampleDB.setText(result.toString());
model.setProperty(CDB_SAMPLEDB_FOLDER, sampleDB.getText());
}
}
});
sampleDBGroup = group;
}
private void createSpringIntegrationGroup(Composite parent) {
springCheckbox = new Button(parent, SWT.CHECK);
springCheckbox.setLayoutData(new GridData());
springCheckbox.setText("Spring Integration");
springCheckbox.setSelection(true);
springCheckbox.setEnabled(false);
model.setBooleanProperty(CDB_SPRING_INTEGRATION, true);
springCheckbox.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent event) {
model.setBooleanProperty(CDB_SPRING_INTEGRATION, springCheckbox.getSelection());
}
@Override
public void widgetDefaultSelected(SelectionEvent arg0) {
}
});
model.addListener(new IDataModelListener() {
@Override
public void propertyChanged(DataModelEvent e) {
if (e.getPropertyName().equals(CDB_PERSISTANCE_PLATFORM)) {
String platform = model.getStringProperty(CDB_PERSISTANCE_PLATFORM);
boolean enabled = platform.equals("hibernate") || platform.equals("none");
springCheckbox.setEnabled(enabled);
if (!enabled) {
springCheckbox.setSelection(true);
model.setBooleanProperty(CDB_SPRING_INTEGRATION, true);
}
} else if (e.getPropertyName().equals(CDB_SPRING_INTEGRATION)) {
springCheckbox.setSelection(model.getBooleanProperty(CDB_SPRING_INTEGRATION));
}
}
});
}
private void createWarningLabel(Composite parent) {
warningLabel = new Label(parent, SWT.WRAP);
warningLabel.setLayoutData(new GridData(GridData.FILL_VERTICAL));
warningLabel.setText(WARNING_TEXT);
}
private void switchControls(String property, Composite top) {
boolean isNew = "new".equals(property);
boolean isHibernateExample = "hibernateExample".equals(property);
boolean isJavaExample = "javaExample".equals(property);
boolean isMyBatisExample = "myBatisExample".equals(property);
excludeControl(sampleDBGroup, !(isHibernateExample || isMyBatisExample));
excludeControl(warningLabel, !(isHibernateExample || isMyBatisExample));
excludeControl(persistancePlatformGroup, !isNew);
excludeControl(connectionGroup, !isNew);
excludeControl(springCheckbox, !isNew);
if (isNew) {
setTitle("New CDB Project");
setDescription("New CDB Project");
}
if (isHibernateExample || isMyBatisExample) {
setTitle("Example CDB Project (with persistence)");
setDescription("Example CDB Project (with persistence)");
}
if (isJavaExample) {
setTitle("Example CDB Project (w/out persistence)");
setDescription("Example CDB Project (w/out persistence)");
}
top.layout();
Display.getCurrent().update();
}
private void excludeControl(Control c, boolean exclude) {
if (exclude) {
excludeControl(c);
} else {
includeControl(c);
}
}
private void excludeControl(Control c) {
Object ld = c.getLayoutData();
if (ld instanceof GridData) {
GridData gld = (GridData) ld;
gld.exclude = true;
}
c.setVisible(false);
}
private void includeControl(Control c) {
Object ld = c.getLayoutData();
if (ld instanceof GridData) {
GridData gld = (GridData) ld;
gld.exclude = false;
}
c.setVisible(true);
}
private ServerPort findHttpPort(IServer server, IProgressMonitor monitor) {
final ServerPort[] serverPorts = server.getServerPorts(monitor);
ServerPort serverPort = null;
for (int i = 0; i < serverPorts.length; i++) {
if ("HTTP".equalsIgnoreCase(serverPorts[i].getProtocol())) {
serverPort = serverPorts[i];
}
}
return serverPort;
}
public int suggestHttpPort(String runtimeId) {
try {
final ServerPort httpPort = findHttpPort(findServer(runtimeId), null);
if (httpPort != null) {
return httpPort.getPort();
} else {
return 8080;
}
} catch (Throwable e) {
return 8080;
}
}
private static IServer findServer(final String runtimeId) {
final IServer[] servers = ServerCore.getServers();
for (int i = 0; i < servers.length; i++) {
final String serverRuntimeName = servers[i].getRuntime().getName();
final String serverRuntimeId = servers[i].getRuntime().getId();
if (serverRuntimeId.equals(runtimeId) || serverRuntimeName.equals(runtimeId)) {
return servers[i];
}
}
return null;
}
}