/******************************************************************************* * Copyright (c) 2007-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.ui.view; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.IColorProvider; import org.eclipse.jface.viewers.IFontProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import org.hibernate.console.ConsoleConfiguration; import org.hibernate.console.KnownConfigurations; import org.hibernate.console.execution.ExecutionContext; import org.hibernate.eclipse.console.HibernateConsolePlugin; import org.jboss.tools.hibernate.runtime.spi.IColumn; import org.jboss.tools.hibernate.runtime.spi.IConfiguration; import org.jboss.tools.hibernate.runtime.spi.IDialect; import org.jboss.tools.hibernate.runtime.spi.IEnvironment; import org.jboss.tools.hibernate.runtime.spi.IPersistentClass; import org.jboss.tools.hibernate.runtime.spi.IProperty; import org.jboss.tools.hibernate.runtime.spi.IService; /** * */ public class OrmLabelProvider extends LabelProvider implements IColorProvider, IFontProvider { private Map<ImageDescriptor, Image> imageCache = new HashMap<ImageDescriptor, Image>(25); private IService service = null; protected String consoleConfigName; protected IDialect dialect = null; public OrmLabelProvider() { } public OrmLabelProvider(String consoleConfigName) { super(); setConsoleConfigName(consoleConfigName); } public void setConsoleConfigName(String consoleConfigName) { if (this.consoleConfigName == consoleConfigName) { return; } this.consoleConfigName = consoleConfigName; final ConsoleConfiguration consoleConfig = getConsoleConfig(); // need to build session factory for hibernate 4.3 // TODO verify if/how this can be done differently if (consoleConfig != null && "4.3".equals(consoleConfig.getHibernateExtension().getHibernateVersion())) { getConsoleConfig().execute(new ExecutionContext.Command() { @Override public Object execute() { return getConfig().buildSessionFactory(); } }); } dialect = null; } protected IConfiguration getConfig() { final ConsoleConfiguration consoleConfig = getConsoleConfig(); if (consoleConfig != null) { if (!consoleConfig.hasConfiguration()) { try { consoleConfig.build(); consoleConfig.buildMappings(); } catch (Exception he) { HibernateConsolePlugin.getDefault().logErrorMessage("HibernateException: ", he); //$NON-NLS-1$ } } return consoleConfig.getConfiguration(); } return null; } protected ConsoleConfiguration getConsoleConfig() { final KnownConfigurations knownConfigurations = KnownConfigurations.getInstance(); ConsoleConfiguration consoleConfig = knownConfigurations.find(consoleConfigName); return consoleConfig; } @Override public Image getImage(Object element) { ImageDescriptor descriptor = OrmImageMap.getImageDescriptor(element, getConsoleConfig()); if (descriptor == null) { return null; } Image image = imageCache.get(descriptor); if (image == null) { image = descriptor.createImage(); imageCache.put(descriptor, image); } return image; } @Override public String getText(Object obj) { if (obj instanceof IColumn) { updateColumnSqlType((IColumn)obj); } return OrmLabelMap.getLabel(obj, getConsoleConfig()); } public void dispose() { for (Iterator<Image> i = imageCache.values().iterator(); i.hasNext();) { i.next().dispose(); } imageCache.clear(); } public Color getForeground(Object element) { if (element instanceof IPersistentClass && ((IPersistentClass)element).isInstanceOfRootClass()) { return Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN); } else if (element instanceof IProperty) { return Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE); } return null; } public Color getBackground(Object element) { return null; } public Font getFont(Object element) { //return JFaceResources.getFontRegistry().getBold(JFaceResources.getTextFont().getFontData()[0].getName()); return null; } /** * For correct label creation should update column sql type. * @param column * @return */ public boolean updateColumnSqlType(final IColumn column) { IEnvironment environment = getService().getEnvironment(); String sqlType = column.getSqlType(); if (sqlType != null) { return false; } final IConfiguration config = getConfig(); if (dialect == null && config != null) { final String dialectName = config.getProperty(environment.getDialect()); if (dialectName != null) { try { dialect = config.getDialect(); } catch (Exception e) { HibernateConsolePlugin.getDefault().logErrorMessage("Exception: ", e); //$NON-NLS-1$ } } } if (dialect != null && config != null) { final ConsoleConfiguration consoleConfig = getConsoleConfig(); try { sqlType = (String)consoleConfig.execute(new ExecutionContext.Command() { public Object execute() { return column.getSqlType(dialect, config); } } ); } catch (Exception e) { // do not ignore it - print in Error Log HibernateConsolePlugin.getDefault().logErrorMessage("Exception: ", e); //$NON-NLS-1$ } } if (sqlType != null) { column.setSqlType(sqlType); return true; } return false; } private IService getService() { if (service == null) { service = getConsoleConfig().getHibernateExtension().getHibernateService(); } return service; } }