/*******************************************************************************
* Copyright (c) 2008-2009 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.hibernate.jpt.ui.internal.persistence.details;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.ui.wizards.TypedElementSelectionValidator;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jpt.common.ui.internal.swt.listeners.SWTListenerTools;
import org.eclipse.jpt.common.ui.internal.widgets.Pane;
import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
import org.eclipse.jpt.common.utility.internal.model.value.SimpleListValueModel;
import org.eclipse.jpt.common.utility.internal.transformer.TransformerTools;
import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent;
import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
import org.eclipse.jpt.common.utility.model.value.ModifiablePropertyValueModel;
import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
import org.eclipse.swt.graphics.Image;
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.Text;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.views.navigator.ResourceComparator;
import org.hibernate.eclipse.console.FileFilter;
import org.hibernate.eclipse.console.HibernateConsoleMessages;
import org.hibernate.eclipse.console.utils.DriverClassHelpers;
import org.hibernate.eclipse.console.wizards.NewConfigurationWizard;
import org.hibernate.eclipse.console.wizards.NewConfigurationWizardPage;
import org.jboss.tools.hibernate.jpt.core.internal.context.basic.BasicHibernateProperties;
/**
* @author Dmitry Geraskov
*
*/
public class HibernatePropertiesComposite extends Pane<BasicHibernateProperties> {
private Text cfgFile;
DriverClassHelpers helper;
/**
* @param subjectHolder
* @param container
* @param widgetFactory
*/
public HibernatePropertiesComposite(
Pane<BasicHibernateProperties> parentPane, Composite parent) {
super(parentPane, parent);
}
@Override
protected void initializeLayout(Composite container) {
GridLayout gl = new GridLayout(3, false);
container.setLayout(gl);
this.helper = new DriverClassHelpers();
final SimpleListValueModel<String> lvmDialect = new SimpleListValueModel<String>(Arrays.asList(this.helper
.getDialectNames()));
PropertyValueModel<BasicHibernateProperties> p = (PropertyValueModel<BasicHibernateProperties>)getSubjectHolder();
List<String> drivers = new ArrayList<String>();
BasicHibernateProperties props = p.getValue();
if (props != null) {
String dialectClass = this.helper.getDialectClass(props.getDialect());
String[] driverClasses = this.helper.getDriverClasses(dialectClass);
drivers.addAll(Arrays.asList(driverClasses));
}
final SimpleListValueModel<String> lvmDriver = new SimpleListValueModel<String>(drivers);
List<String> urls = new ArrayList<String>();
if (props != null) {
String driverClass = props.getDriver();
String[] connectionURLS = this.helper.getConnectionURLS(driverClass);
urls.addAll(Arrays.asList(connectionURLS));
}
final SimpleListValueModel<String> lvmUrl = new SimpleListValueModel<String>(urls);
ModifiablePropertyValueModel<String> dialectHolder = buildDialectHolder();
final ModifiablePropertyValueModel<String> driverHolder = buildDriverHolder();
final ModifiablePropertyValueModel<String> urlHolder = buildUrlHolder();
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
this.addLabel(container, HibernateConsoleMessages.ConsoleConfigurationPropertySource_config_file + ':');
this.cfgFile = this.addText(container, buildConfigFileHolder());
Button b = this.addButton(container, HibernateConsoleMessages.CodeGenerationSettingsTab_setup, createSetupAction());
cfgFile.setLayoutData(gd);
// Button b = addButton(section, HibernateConsoleMessages.CodeGenerationSettingsTab_setup, createSetupAction());
// this.cfgFile = addLabeledText(container,
// HibernateConsoleMessages.ConsoleConfigurationPropertySource_config_file + ':', buildConfigFileHolder(),
// b, null);
gd = new GridData(GridData.FILL_HORIZONTAL);
this.addLabel(container, HibernateConsoleMessages.NewConfigurationWizardPage_database_dialect);
Control c = this.addEditableCombo(container, lvmDialect, dialectHolder, TransformerTools.<String>objectToStringTransformer(), (String)null);
gd.horizontalSpan = 2;
c.setLayoutData(gd);
// addLabeledEditableCombo(
// section,
// HibernateConsoleMessages.NewConfigurationWizardPage_database_dialect,
// lvmDialect,
// dialectHolder,
// StringConverter.Default.<String>instance(),
// null);
this.addLabel(container, HibernateConsoleMessages.NewConfigurationWizardPage_driver_class);
c = this.addEditableCombo(container, lvmDriver, driverHolder, TransformerTools.<String>objectToStringTransformer(), (String)null);
c.setLayoutData(gd);
// addLabeledEditableCombo(
// section,
// HibernateConsoleMessages.NewConfigurationWizardPage_driver_class,
// lvmDriver,
// driverHolder,
// StringConverter.Default.<String>instance(),
// null);
this.addLabel(container, HibernateConsoleMessages.NewConfigurationWizardPage_connection_url);
c = this.addEditableCombo(container, lvmUrl, urlHolder, TransformerTools.<String>objectToStringTransformer(), (String)null);
c.setLayoutData(gd);
// addLabeledEditableCombo(
// section,
// HibernateConsoleMessages.NewConfigurationWizardPage_connection_url,
// lvmUrl,
// urlHolder,
// StringConverter.Default.<String>instance(),
// null);
dialectHolder.addPropertyChangeListener(PropertyValueModel.VALUE, SWTListenerTools.wrap(
new PropertyChangeListener() {
@Override
public void propertyChanged(PropertyChangeEvent event) {
String dialectClass = HibernatePropertiesComposite.this.helper.getDialectClass((String) event.getNewValue());
String[] driverClasses = HibernatePropertiesComposite.this.helper.getDriverClasses(dialectClass);
String driver = driverHolder.getValue();//save value
lvmDriver.clear();
lvmDriver.addAll(Arrays.asList(driverClasses));
driverHolder.setValue(driver); //restore value
}
}
)
);
driverHolder.addPropertyChangeListener( PropertyValueModel.VALUE, SWTListenerTools.wrap(
new PropertyChangeListener() {
@Override
public void propertyChanged(PropertyChangeEvent event) {
String driverClass = (String) event.getNewValue();
String[] connectionURLS = HibernatePropertiesComposite.this.helper.getConnectionURLS(driverClass);
String url = urlHolder.getValue();//save value
lvmUrl.clear();
lvmUrl.addAll(Arrays.asList(connectionURLS));
urlHolder.setValue(url); //restore value
}
}
) );
this.addLabel(container, HibernateConsoleMessages.NewConfigurationWizardPage_default_schema);
c = this.addText(container, buildSchemaDefaultHolder());
c.setLayoutData(gd);
// addLabeledText(
// section,
// HibernateConsoleMessages.NewConfigurationWizardPage_default_schema,
// buildSchemaDefaultHolder());
this.addLabel(container, HibernateConsoleMessages.NewConfigurationWizardPage_default_catalog);
c = this.addText(container, buildCatalogDefaultHolder());
c.setLayoutData(gd);
// addLabeledText(
// section,
// HibernateConsoleMessages.NewConfigurationWizardPage_default_catalog,
// buildCatalogDefaultHolder());
this.addLabel(container, HibernateConsoleMessages.NewConfigurationWizardPage_user_name);
c = this.addText(container, buildUsernameHolder());
c.setLayoutData(gd);
// addLabeledText(
// section,
// HibernateConsoleMessages.NewConfigurationWizardPage_user_name,
// buildUsernameHolder());
this.addLabel(container, HibernateConsoleMessages.NewConfigurationWizardPage_password);
c = this.addText(container, buildPasswordHolder());
c.setLayoutData(gd);
// addLabeledText(
// section,
// HibernateConsoleMessages.NewConfigurationWizardPage_password,
// buildPasswordHolder());
}
private IPath getConfigurationFilePath() {
String filePath = cfgFile.getText().trim();
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IFile[] files = root.findFilesForLocation(new Path(filePath));
IPath path = null;
if (files != null && files.length > 0){
path = new Path(files[0].getProject().getName()).append(files[0].getProjectRelativePath());
filePath = path.toString();
}
if (filePath.length() > 0 ){
IPackageFragmentRoot[] allPackageFragmentRoots = getSourcePackageFragmentRoots();
for (IPackageFragmentRoot iPackageFragmentRoot : allPackageFragmentRoots) {
IResource sourceFolder = iPackageFragmentRoot.getResource();
if (sourceFolder instanceof IContainer) {
IContainer folder = (IContainer) sourceFolder;
if (folder.findMember(filePath) != null){
return folder.findMember(filePath).getFullPath();
}
}
}
}
return path;
}
public IPackageFragmentRoot[] getSourcePackageFragmentRoots(){
BasicHibernateProperties props = getSubject();
if (props != null){
IProject project = props.getJpaProject().getProject();
IJavaProject jProject = JavaCore.create(project);
if (jProject != null){
try {
IPackageFragmentRoot[] allPackageFragmentRoots = jProject.getAllPackageFragmentRoots();
List<IPackageFragmentRoot> sources = new LinkedList<IPackageFragmentRoot>();
for (IPackageFragmentRoot iPackageFragmentRoot : allPackageFragmentRoots) {
if (!iPackageFragmentRoot.isArchive() && iPackageFragmentRoot.isOpen()){
sources.add(iPackageFragmentRoot);
}
}
return sources.toArray(new IPackageFragmentRoot[0]);
} catch (JavaModelException e) {
//ignore
}
}
}
return new IPackageFragmentRoot[0];
}
private Runnable createSetupAction() {
return new Runnable() {
@Override
public void run() {
IPath initialPath = getConfigurationFilePath();
int defaultChoice = 0;
if(initialPath!=null) {
defaultChoice = 1;
}
MessageDialog dialog = createSetupDialog(HibernateConsoleMessages.ConsoleConfigurationMainTab_setup_configuration_file, HibernateConsoleMessages.ConsoleConfigurationMainTab_do_you_want_to_create_new_cfgxml, defaultChoice);
int answer = dialog.open();
IPath cfgFile = null;
if(answer==0) { // create new
cfgFile = handleConfigurationFileCreate();
} else if (answer==1) { // use existing
cfgFile = handleConfigurationFileBrowse();
}
if (cfgFile != null){
HibernatePropertiesComposite.this.cfgFile.setText( makeClassPathRelative(cfgFile).toString() );
}
}
protected IPath makeClassPathRelative(IPath cfgFile){
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IResource res = root.findMember(cfgFile);
if ( res != null && res.exists() && res.getType() == IResource.FILE) {
IPackageFragmentRoot[] allPackageFragmentRoots = getSourcePackageFragmentRoots();
for (IPackageFragmentRoot iPackageFragmentRoot : allPackageFragmentRoots) {
if (iPackageFragmentRoot.getResource().getFullPath().isPrefixOf(cfgFile)){
cfgFile = cfgFile.removeFirstSegments(iPackageFragmentRoot.getResource().getFullPath().segmentCount());
return cfgFile;
}
}
}
return res.getLocation();
}
private MessageDialog createSetupDialog(String title, String question, int defaultChoice){
return new MessageDialog(getShell(),
title,
null,
question,
MessageDialog.QUESTION,
new String[] { HibernateConsoleMessages.ConsoleConfigurationMainTab_create_new, HibernateConsoleMessages.ConsoleConfigurationMainTab_use_existing, IDialogConstants.CANCEL_LABEL},
defaultChoice);
}
private IPath handleConfigurationFileBrowse() {
IPath[] paths = chooseFileEntries();
if(paths!=null && paths.length==1) {
return paths[0];
}
return null;
}
public IPath[] chooseFileEntries() {
TypedElementSelectionValidator validator = new TypedElementSelectionValidator(new Class[]{IFile.class}, false);
IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
IResource focus= getConfigurationFilePath() != null ? root.findMember(getConfigurationFilePath()) : null;
ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(), new WorkbenchContentProvider(){
public Object[] getElements(Object element) {
IPackageFragmentRoot[] sourcePackageFragmentRoots = getSourcePackageFragmentRoots();
IResource[] ress = new IResource[sourcePackageFragmentRoots.length];
for (int i = 0; i < sourcePackageFragmentRoots.length; i++) {
ress[i] = sourcePackageFragmentRoots[i].getResource();
}
return ress;
}
});
dialog.setValidator(validator);
dialog.setAllowMultiple(false);
dialog.setTitle(HibernateConsoleMessages.ConsoleConfigurationMainTab_select_hibernate_cfg_xml_file);
dialog.setMessage(HibernateConsoleMessages.ConsoleConfigurationMainTab_choose_file_to_use_as_hibernate_cfg_xml);
dialog.addFilter(new FileFilter(new String[] {HibernateConsoleMessages.ConsoleConfigurationMainTab_cfg_xml}, null, true, false) );
dialog.setInput(root);
dialog.setComparator(new ResourceComparator(ResourceComparator.NAME));
dialog.setInitialSelection(focus);
if (dialog.open() == Window.OK) {
Object[] elements= dialog.getResult();
IPath[] res= new IPath[elements.length];
for (int i= 0; i < res.length; i++) {
IResource elem= (IResource)elements[i];
res[i]= elem.getFullPath();
}
return res;
}
return null;
}
private IPath handleConfigurationFileCreate() {
NewConfigurationWizard wizard = new NewConfigurationWizard();
wizard.init(PlatformUI.getWorkbench(), StructuredSelection.EMPTY );
IWorkbenchWindow win = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
WizardDialog wdialog = new WizardDialog(win.getShell(), wizard);
wdialog.create();
IWizardPage configPage = wizard.getPage(HibernateConsoleMessages.ConsoleConfigurationMainTab_wizard_page);
if (configPage != null && configPage instanceof NewConfigurationWizardPage){
((NewConfigurationWizardPage)configPage).setCreateConsoleConfigurationVisible(false);
}
// This opens a dialog
if (wdialog.open() == Window.OK){
WizardNewFileCreationPage createdFilePath = ((WizardNewFileCreationPage)wizard.getStartingPage());
if(createdFilePath!=null) {
// createNewFile() does not creates new file if it was created by wizard (OK was pressed)
return createdFilePath.createNewFile().getFullPath();
}
}
return null;
}
};
}
private ModifiablePropertyValueModel<String> buildConfigFileHolder() {
return new PropertyAspectAdapter<BasicHibernateProperties, String>(getSubjectHolder(),
BasicHibernateProperties.CONFIG_FILE_PROPERTY) {
@Override
protected String buildValue_() {
return this.subject.getConfigurationFile();
}
@Override
protected void setValue_(String value) {
if ("".equals(value))value = null;//$NON-NLS-1$
this.subject.setConfigurationFile(value);
}
};
}
private ModifiablePropertyValueModel<String> buildDialectHolder() {
return new PropertyAspectAdapter<BasicHibernateProperties, String>(getSubjectHolder(),
BasicHibernateProperties.DIALECT_PROPERTY) {
@Override
protected String buildValue_() {
return HibernatePropertiesComposite.this.helper.getShortDialectName(this.subject.getDialect());
}
@Override
protected void setValue_(String value) {
if ("".equals(value))value = null; //$NON-NLS-1$
this.subject.setDialect(HibernatePropertiesComposite.this.helper.getDialectClass(value));
}
};
}
private ModifiablePropertyValueModel<String> buildDriverHolder() {
return new PropertyAspectAdapter<BasicHibernateProperties, String>(getSubjectHolder(),
BasicHibernateProperties.DRIVER_PROPERTY) {
@Override
protected String buildValue_() {
return this.subject.getDriver();
}
@Override
protected void setValue_(String value) {
if ("".equals(value))value = null;//$NON-NLS-1$
this.subject.setDriver(value);
}
};
}
private ModifiablePropertyValueModel<String> buildUrlHolder() {
return new PropertyAspectAdapter<BasicHibernateProperties, String>(getSubjectHolder(),
BasicHibernateProperties.URL_PROPERTY) {
@Override
protected String buildValue_() {
return this.subject.getUrl();
}
@Override
protected void setValue_(String value) {
if ("".equals(value))value = null;//$NON-NLS-1$
this.subject.setUrl(value);
}
};
}
private ModifiablePropertyValueModel<String> buildSchemaDefaultHolder() {
return new PropertyAspectAdapter<BasicHibernateProperties, String>(getSubjectHolder(),
BasicHibernateProperties.SCHEMA_DEFAULT_PROPERTY) {
@Override
protected String buildValue_() {
return this.subject.getSchemaDefault();
}
@Override
protected void setValue_(String value) {
if ("".equals(value))value = null;//$NON-NLS-1$
this.subject.setSchemaDefault(value);
}
};
}
private ModifiablePropertyValueModel<String> buildCatalogDefaultHolder() {
return new PropertyAspectAdapter<BasicHibernateProperties, String>(getSubjectHolder(),
BasicHibernateProperties.CATALOG_DEFAULT_PROPERTY) {
@Override
protected String buildValue_() {
return this.subject.getCatalogDefault();
}
@Override
protected void setValue_(String value) {
if ("".equals(value))value = null;//$NON-NLS-1$
this.subject.setCatalogDefault(value);
}
};
}
private ModifiablePropertyValueModel<String> buildUsernameHolder() {
return new PropertyAspectAdapter<BasicHibernateProperties, String>(getSubjectHolder(),
BasicHibernateProperties.USERNAME_PROPERTY) {
@Override
protected String buildValue_() {
return this.subject.getUsername();
}
@Override
protected void setValue_(String value) {
if ("".equals(value))value = null;//$NON-NLS-1$
this.subject.setUsername(value);
}
};
}
private ModifiablePropertyValueModel<String> buildPasswordHolder() {
return new PropertyAspectAdapter<BasicHibernateProperties, String>(getSubjectHolder(),
BasicHibernateProperties.PASSWORD_PROPERTY) {
@Override
protected String buildValue_() {
return this.subject.getPassword();
}
@Override
protected void setValue_(String value) {
if ("".equals(value))value = null;//$NON-NLS-1$
this.subject.setPassword(value);
}
};
}
public Image getPageImage() {
return null;
}
}