/*
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.hibernate.eclipse.console.views;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.datatools.connectivity.IConnectionProfile;
import org.eclipse.datatools.connectivity.ProfileManager;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.internal.core.LaunchConfiguration;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jface.viewers.ICellEditorValidator;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.ui.views.properties.PropertyDescriptor;
import org.eclipse.ui.views.properties.TextPropertyDescriptor;
import org.hibernate.console.ConsoleConfiguration;
import org.hibernate.console.KnownConfigurations;
import org.hibernate.console.preferences.ConsoleConfigurationPreferences;
import org.hibernate.console.preferences.ConsoleConfigurationPreferences.ConfigurationMode;
import org.hibernate.eclipse.console.HibernateConsoleMessages;
import org.hibernate.eclipse.console.HibernateConsolePlugin;
import org.hibernate.eclipse.console.utils.LaunchHelper;
import org.hibernate.eclipse.launch.IConsoleConfigurationLaunchConstants;
@SuppressWarnings("restriction")
public class ConsoleConfigurationPropertySource implements IPropertySource {
private ConsoleConfiguration cfg;
static List<IPropertyDescriptor> pd;
static {
ComboBoxPropertyDescriptor modeDescriptor = new ComboBoxPropertyDescriptor(
"mode", //$NON-NLS-1$
HibernateConsoleMessages.ConsoleConfigurationPropertySource_mode,
ConfigurationMode.labels());
List<IPropertyDescriptor> l = new ArrayList<IPropertyDescriptor>();
l.add(new TextPropertyDescriptor("name", HibernateConsoleMessages.ConsoleConfigurationPropertySource_name)); //$NON-NLS-1$
l.add(modeDescriptor);
l.add(new PropertyDescriptor("hibernate.cfg.xml", HibernateConsoleMessages.ConsoleConfigurationPropertySource_config_file)); //$NON-NLS-1$
l.add(new PropertyDescriptor("hibernate.properties", HibernateConsoleMessages.ConsoleConfigurationPropertySource_properties_file)); //$NON-NLS-1$
l.add(new PropertyDescriptor("mapping.files", HibernateConsoleMessages.ConsoleConfigurationPropertySource_additional_mapping_files)); //$NON-NLS-1$
pd = l;
}
public ConsoleConfigurationPropertySource(ConsoleConfiguration cfg) {
this.cfg = cfg;
}
public Object getEditableValue() {
return null;
}
public IPropertyDescriptor[] getPropertyDescriptors() {
IPropertyDescriptor[] propertyDescriptors = new IPropertyDescriptor[pd.size() + 2];
pd.toArray(propertyDescriptors);
propertyDescriptors[propertyDescriptors.length - 2] = createProjectDescriptor();
propertyDescriptors[propertyDescriptors.length - 1] = createConnectionDescriptor();
return propertyDescriptors;
}
public Object getPropertyValue(Object id) {
try {
if("name".equals(id)) { //$NON-NLS-1$
return cfg.getName();
}
// TODO: bring back more eclipse friendly file names
ConsoleConfigurationPreferences preferences = cfg.getPreferences();
if ("project".equals(id)){ //$NON-NLS-1$
try {
ILaunchConfiguration lc = HibernateConsolePlugin.getDefault().findLaunchConfig(cfg.getName());
if (lc != null){
String projectName = lc.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, ""); //$NON-NLS-1$
return Arrays.binarySearch(getSortedProjectNames(), projectName);
} else {
HibernateConsolePlugin.getDefault().log("Can't find Console Configuration \"" + cfg.getName() + "\"");//$NON-NLS-1$//$NON-NLS-2$
}
} catch (CoreException e) {
HibernateConsolePlugin.getDefault().log(e);
}
}
if("mode".equals(id)) { //$NON-NLS-1$
String[] values = ConfigurationMode.values();
String value = preferences.getConfigurationMode().toString();
for (int i = 0; i < values.length; i++) {
if (value.equals(values[i])){
return i;
}
}
return new RuntimeException("Unknown ConsoleConfiguration mode: " + value); //$NON-NLS-1$
}
if("connection".equals(id)) { //$NON-NLS-1$
try {
ILaunchConfiguration lc = HibernateConsolePlugin.getDefault().findLaunchConfig(cfg.getName());
if (lc != null){
String connectionName = lc.getAttribute(IConsoleConfigurationLaunchConstants.CONNECTION_PROFILE_NAME, (String)null);
if (connectionName == null){
connectionName = lc.getAttribute(IConsoleConfigurationLaunchConstants.USE_JPA_PROJECT_PROFILE, Boolean.FALSE.toString());
if (Boolean.TRUE.toString().equalsIgnoreCase(connectionName)){
connectionName = HibernateConsoleMessages.ConnectionProfileCtrl_JPAConfiguredConnection;
} else {
connectionName = HibernateConsoleMessages.ConnectionProfileCtrl_HibernateConfiguredConnection;
}
}
String[] values = getConnectionNames();
for (int i = 0; i < values.length; i++) {
if (values[i].equals(connectionName)){
return i;
}
}
} else {
HibernateConsolePlugin.getDefault().log("Can't find Console Configuration \"" + cfg.getName() + "\"");//$NON-NLS-1$//$NON-NLS-2$
}
} catch (CoreException e) {
HibernateConsolePlugin.getDefault().log(e);
}
}
if("hibernate.cfg.xml".equals(id)) { //$NON-NLS-1$
return preferences.getConfigXMLFile();
}
if("hibernate.properties".equals(id)) { //$NON-NLS-1$
return preferences.getPropertyFile();
}
if("mapping.files".equals(id)) { //$NON-NLS-1$
return Integer.valueOf(preferences.getMappingFiles().length);
}
return null;
} catch(RuntimeException e) {
return HibernateConsoleMessages.ConsoleConfigurationPropertySource_error + e.getMessage();
}
}
public boolean isPropertySet(Object id) {
return true;
}
public void resetPropertyValue(Object id) {
}
public void setPropertyValue(Object id, Object value) {
if("name".equals(id) && value instanceof String) { //$NON-NLS-1$
String newName = (String) value;
if (LaunchHelper.verifyConfigurationName(newName) != null) {
return;//just do not change name
}
String oldName = cfg.getName();
try {
ILaunchConfiguration lc = HibernateConsolePlugin.getDefault().findLaunchConfig(oldName);
if (lc != null){
ILaunchConfigurationWorkingCopy wc = lc.getWorkingCopy();
wc.rename(newName);
wc.doSave();
//find newly created console configuration
cfg = KnownConfigurations.getInstance().find(newName);
} else {
HibernateConsolePlugin.getDefault().log("Can't find Console Configuration \"" + oldName + "\"");//$NON-NLS-1$//$NON-NLS-2$
}
} catch (CoreException e) {
HibernateConsolePlugin.getDefault().log(e);
}
} else if ("mode".equals(id) && value instanceof Integer){ //$NON-NLS-1$
int index = (Integer) value;
try {
ILaunchConfiguration lc = HibernateConsolePlugin.getDefault().findLaunchConfig(cfg.getName());
if (lc != null){
ILaunchConfigurationWorkingCopy wc = lc.getWorkingCopy();
wc.setAttribute("org.hibernate.eclipse.launch.CONFIGURATION_FACTORY", ConfigurationMode.values()[index]);////$NON-NLS-1$
wc.doSave();
} else {
HibernateConsolePlugin.getDefault().log("Can't find Console Configuration \"" + cfg.getName() + "\"");//$NON-NLS-1$//$NON-NLS-2$
}
} catch (CoreException e) {
HibernateConsolePlugin.getDefault().log("Can't find Console Configuration \"" + cfg.getName() + "\"");//$NON-NLS-1$//$NON-NLS-2$
}
} else if ("project".equals(id) && value instanceof Integer){ //$NON-NLS-1$
int index = (Integer) value;
try {
ILaunchConfiguration lc = HibernateConsolePlugin.getDefault().findLaunchConfig(cfg.getName());
if (lc != null){
ILaunchConfigurationWorkingCopy wc = lc.getWorkingCopy();
String projectName = getSortedProjectNames()[index];
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, projectName);
if (projectName != null){
wc.setAttribute(LaunchConfiguration.ATTR_MAPPED_RESOURCE_PATHS,
Collections.singletonList(projectName));
wc.setAttribute(LaunchConfiguration.ATTR_MAPPED_RESOURCE_TYPES, Collections.singletonList(Integer.toString(IResource.PROJECT)));
} else {
wc.removeAttribute(LaunchConfiguration.ATTR_MAPPED_RESOURCE_PATHS);
wc.removeAttribute(LaunchConfiguration.ATTR_MAPPED_RESOURCE_TYPES);
}
wc.doSave();
} else {
HibernateConsolePlugin.getDefault().log("Can't find Console Configuration \"" + cfg.getName() + "\"");//$NON-NLS-1$//$NON-NLS-2$
}
} catch (CoreException e) {
HibernateConsolePlugin.getDefault().log("Can't find Console Configuration \"" + cfg.getName() + "\"");//$NON-NLS-1$//$NON-NLS-2$
}
} else if ("connection".equals(id) && value instanceof Integer){ //$NON-NLS-1$
int index = (Integer) value;
try {
ILaunchConfiguration lc = HibernateConsolePlugin.getDefault().findLaunchConfig(cfg.getName());
if (lc != null){
ILaunchConfigurationWorkingCopy wc = lc.getWorkingCopy();
if (index == 0){//jpa
wc.setAttribute(IConsoleConfigurationLaunchConstants.USE_JPA_PROJECT_PROFILE, Boolean.TRUE.toString());
wc.removeAttribute(IConsoleConfigurationLaunchConstants.CONNECTION_PROFILE_NAME);
} else if (index == 1){//hibernate
wc.removeAttribute(IConsoleConfigurationLaunchConstants.USE_JPA_PROJECT_PROFILE);
wc.removeAttribute(IConsoleConfigurationLaunchConstants.CONNECTION_PROFILE_NAME);
} else {//connection profile
String[] values = getConnectionNames();
wc.setAttribute(IConsoleConfigurationLaunchConstants.CONNECTION_PROFILE_NAME, values[index]);
wc.removeAttribute(IConsoleConfigurationLaunchConstants.USE_JPA_PROJECT_PROFILE);
}
wc.doSave();
} else {
HibernateConsolePlugin.getDefault().log("Can't find Console Configuration \"" + cfg.getName() + "\"");//$NON-NLS-1$//$NON-NLS-2$
}
} catch (CoreException e) {
HibernateConsolePlugin.getDefault().log("Can't find Console Configuration \"" + cfg.getName() + "\"");//$NON-NLS-1$//$NON-NLS-2$
}
}
}
private IPropertyDescriptor createProjectDescriptor(){
ComboBoxPropertyDescriptor projectDescriptor = new ComboBoxPropertyDescriptor(
"project", //$NON-NLS-1$
HibernateConsoleMessages.ConsoleConfigurationPropertySource_project,
getSortedProjectNames());
projectDescriptor.setValidator(new ICellEditorValidator(){
public String isValid(Object value) {
if (value instanceof Integer){
if (((Integer)value).intValue() < 0){
try {
ILaunchConfiguration lc = HibernateConsolePlugin.getDefault().findLaunchConfig(cfg.getName());
if (lc != null){
String projectName = lc.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String)null);
if (projectName != null){
return NLS.bind(HibernateConsoleMessages.ConsoleConfigurationMainTab_the_java_project_does_not_exist, projectName);
}
} else {
HibernateConsolePlugin.getDefault().log("Can't find Console Configuration \"" + cfg.getName() + "\"");//$NON-NLS-1$//$NON-NLS-2$
}
} catch (CoreException e) {
HibernateConsolePlugin.getDefault().log(e);
}
}
}
return null;
}
});
return projectDescriptor;
}
private IPropertyDescriptor createConnectionDescriptor(){
ComboBoxPropertyDescriptor connectionDescriptor = new ComboBoxPropertyDescriptor(
"connection", //$NON-NLS-1$
HibernateConsoleMessages.ConsoleConfigurationPropertySource_connection,
getConnectionNames());
return connectionDescriptor;
}
private String[] getSortedProjectNames(){
IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();//get all projects
String[] projectNames = new String[projects.length];
for (int i = 0; i < projects.length; i++ ) {
projectNames[i] = projects[i].getName();
};
Arrays.sort(projectNames);
return projectNames;
}
private String[] getConnectionNames(){
IConnectionProfile[] profiles = ProfileManager.getInstance()
.getProfilesByCategory("org.eclipse.datatools.connectivity.db.category"); //$NON-NLS-1$
String[] names = new String[profiles.length];
for (int i = 0; i < profiles.length; i ++){
names[i] = profiles[i].getName();
}
Arrays.sort(names);
String[] resNames = new String[names.length + 2];
resNames[0] = HibernateConsoleMessages.ConnectionProfileCtrl_JPAConfiguredConnection;
resNames[1] = HibernateConsoleMessages.ConnectionProfileCtrl_HibernateConfiguredConnection;
System.arraycopy(names, 0, resNames, 2, names.length);
return resNames;
}
}