/******************************************************************************* * Copyright (c) 2007 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 * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.seam.internal.core.project.facet; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Set; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jst.j2ee.internal.web.archive.operations.WebFacetProjectCreationDataModelProvider; import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin; import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties; import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties; import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent; import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory; import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener; import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager; import org.eclipse.wst.server.core.IRuntime; import org.eclipse.wst.server.core.IServer; import org.eclipse.wst.server.core.ServerCore; import org.jboss.tools.seam.core.SeamCoreMessages; import org.jboss.tools.seam.core.SeamCorePlugin; public class SeamFacetProjectCreationDataModelProvider extends WebFacetProjectCreationDataModelProvider { @Override public Object getDefaultProperty(String propertyName) { if(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME.equals(propertyName)) { // Any not empty string should be returned by default // to workaround https://bugs.eclipse.org/bugs/show_bug.cgi?id=206541 return "__d_u_m_m_y__for__bug206541__"; } return super.getDefaultProperty(propertyName); } public static IStatus OK_STATUS = new Status(IStatus.OK, SeamCorePlugin.PLUGIN_ID, 0, "OK", null); //$NON-NLS-1$ //$NON-NLS-2$ public SeamFacetProjectCreationDataModelProvider() { super(); } public void init() { super.init(); FacetDataModelMap map = (FacetDataModelMap) getProperty(FACET_DM_MAP); IDataModel seamFacet = DataModelFactory.createDataModel(new SeamFacetInstallDataModelProvider()); map.add(seamFacet); seamFacet.addListener(new IDataModelListener() { public void propertyChanged(DataModelEvent event) { if (ISeamFacetDataModelProperties.JBOSS_AS_TARGET_RUNTIME.equals(event.getPropertyName())) { setProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_RUNTIME, event.getProperty()); model.notifyPropertyChange(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_RUNTIME, IDataModel.DEFAULT_CHG); model.notifyPropertyChange(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER, IDataModel.VALID_VALUES_CHG); } else if (IFacetDataModelProperties.FACET_PROJECT_NAME.equals(event.getPropertyName())) { setProperty(ISeamFacetDataModelProperties.SEAM_PROJECT_NAME, event.getProperty()); } } }); Collection requiredFacets = (Collection)getProperty(REQUIRED_FACETS_COLLECTION); requiredFacets.add(ProjectFacetsManager.getProjectFacet(seamFacet.getStringProperty(IFacetDataModelProperties.FACET_ID))); setProperty(REQUIRED_FACETS_COLLECTION, requiredFacets); IDialogSettings s = JSFUiPlugin.getDefault().getDialogSettings(); IDialogSettings r = s.getSection(JSFUiPlugin.PLUGIN_ID + ".jsfFacetInstall"); if(r == null) { r = s.addNewSection(JSFUiPlugin.PLUGIN_ID + ".jsfFacetInstall"); } String deployImplType = r.get("deployImplType"); if(deployImplType == null || !deployImplType.endsWith("_SUPPLIED")) { r.put("deployImplType", "SERVER_SUPPLIED"); } IDialogSettings u = r.getSection("urlMappings"); if(u == null) { u = r.addNewSection("urlMappings"); } u.put("pattern", new String[]{"*.seam"}); } public boolean propertySet(String propertyName, Object propertyValue) { if( propertyName.equals( IFacetProjectCreationDataModelProperties.FACET_RUNTIME )){ FacetDataModelMap map = (FacetDataModelMap) getProperty(FACET_DM_MAP); IDataModel seamFacet = map.getFacetDataModel(ISeamFacetDataModelProperties.SEAM_FACET_ID); seamFacet.setProperty( ISeamFacetDataModelProperties.JBOSS_AS_TARGET_RUNTIME, propertyValue ); if (propertyValue != null) { // Fixes the empty/wrong server IServer server = (IServer)model.getProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER); if (!validateServer(server).isOK()) { List<IServer> servers = getServers(getRuntimeName(propertyValue)); if (servers != null && !servers.isEmpty()) { setProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER, servers.get(0)); } } } } else if (propertyName.equals(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER)) { FacetDataModelMap map = (FacetDataModelMap) getProperty(FACET_DM_MAP); IDataModel seamFacet = map.getFacetDataModel(ISeamFacetDataModelProperties.SEAM_FACET_ID); seamFacet.setProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER, propertyValue); } else if (propertyName.equals(IFacetDataModelProperties.FACET_PROJECT_NAME)) { model.setProperty(ISeamFacetDataModelProperties.SEAM_PROJECT_NAME, propertyValue); } return super.propertySet(propertyName, propertyValue); } public Set getPropertyNames() { Set names = super.getPropertyNames(); names.add(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER); names.add(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_RUNTIME); names.add(ISeamFacetDataModelProperties.SEAM_PROJECT_NAME); return names; } public static DataModelPropertyDescriptor[] getServerPropertyDescriptors(String runtimeName) { List<IServer> list = getServers(runtimeName); DataModelPropertyDescriptor[] descriptors = new DataModelPropertyDescriptor[list.size() + 1]; Iterator<IServer> iterator = list.iterator(); for (int i = 0; i < descriptors.length - 1; i++) { IServer server = (IServer) iterator.next(); descriptors[i] = new DataModelPropertyDescriptor(server, server.getName()); } descriptors[descriptors.length - 1] = new DataModelPropertyDescriptor(null, "<None>"); if(descriptors.length > 2){ Arrays.sort(descriptors, 0, descriptors.length - 2, new Comparator() { public int compare(Object arg0, Object arg1) { DataModelPropertyDescriptor d1 = (DataModelPropertyDescriptor)arg0; DataModelPropertyDescriptor d2 = (DataModelPropertyDescriptor)arg1; return d1.getPropertyDescription().compareTo(d2.getPropertyDescription()); } }); } return descriptors; } public DataModelPropertyDescriptor[] getValidPropertyDescriptors(String propertyName) { if (ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER.equals(propertyName)) { Object rt = getProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_RUNTIME); String primaryName = getRuntimeName(rt); return getServerPropertyDescriptors(primaryName); } return super.getValidPropertyDescriptors(propertyName); } private static List<IServer> getServers(String runtimeName) { ArrayList<IServer> list = new ArrayList<IServer>(); if( runtimeName != null ) { if (runtimeName != null) { IServer[] servers = ServerCore.getServers(); for (IServer server : servers) { IRuntime runtime = server.getRuntime(); if(runtime!=null) { String serverRuntimeName = runtime.getName(); if(runtimeName.equals(serverRuntimeName)) { list.add(server); } } } } } return list; } /** * Performs the property validation * * returns IStatus status of validation */ public IStatus validate(String propertyName) { IStatus status = super.validate(propertyName); if (status != null && !status.isOK()) return status; if (ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER.equals(propertyName)) { IServer server = (IServer)model.getProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER); status = validateServer(server); if (!status.isOK()) return status; } if(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_RUNTIME.equals(propertyName)) { org.eclipse.wst.common.project.facet.core.runtime.IRuntime runtime = (org.eclipse.wst.common.project.facet.core.runtime.IRuntime)model.getProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_RUNTIME); status = validateRuntime(runtime); if (!status.isOK()) return status; } return OK_STATUS; } private IStatus validateServer(Object serverObject) { if (serverObject == null) { return SeamCorePlugin.createErrorStatus(SeamCoreMessages.ERROR_JBOSS_AS_TARGET_SERVER_IS_EMPTY, null); } IServer s = (serverObject instanceof IServer ? (IServer)serverObject : null); if (s == null) { return SeamCorePlugin.createErrorStatus(SeamCoreMessages.ERROR_JBOSS_AS_TARGET_SERVER_UNKNOWN, null); } Object rt = getProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_RUNTIME); String primaryRuntimeName = getRuntimeName(rt); List<IServer> servers = getServers(primaryRuntimeName); if (servers.isEmpty()) { return SeamCorePlugin.createErrorStatus(SeamCoreMessages.ERROR_JBOSS_AS_TARGET_SERVER_NO_SERVERS_DEFINED, null); } for (IServer server : servers) { if (s.equals(server)) { return OK_STATUS; } } return SeamCorePlugin.createErrorStatus(SeamCoreMessages.ERROR_JBOSS_AS_TARGET_SERVER_INCOMPATIBLE, null); } private static String getRuntimeName(Object rt) { if( rt == null ) { return null; } String rtName = null; if (rt instanceof org.eclipse.wst.common.project.facet.core.runtime.IRuntime) { rtName = ((org.eclipse.wst.common.project.facet.core.runtime.IRuntime)rt).getName(); } else if (rt instanceof IRuntime) { rtName = ((IRuntime)rt).getName(); } return rtName; } IStatus validateRuntime(Object runtimeObject) { if (runtimeObject == null) { return SeamCorePlugin.createErrorStatus(SeamCoreMessages.ERROR_JBOSS_AS_TARGET_RUNTIME_IS_EMPTY, null); } if (getRuntimeName(runtimeObject) == null) { return SeamCorePlugin.createErrorStatus(SeamCoreMessages.ERROR_JBOSS_AS_TARGET_RUNTIME_UNKNOWN, null); } return OK_STATUS; } /** * Returns The server name stored in the * ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER property value * of the model specified * * @param model * @return String Server name */ public static String getServerName(IDataModel model) { Object serverObject = model.getProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER); if (!(serverObject instanceof IServer)) return ""; IServer server = (IServer)serverObject; return (server.getName() == null ? "" : server.getName()); } /** * Sets the server by its name as * ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER property value * of the model specified * * @param model * @param serverName */ public static void setServerName(IDataModel model, String serverName) { if (serverName == null) return; IServer[] servers = ServerCore.getServers(); for (IServer server : servers) { if(serverName.equals(server.getName())) { model.setProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER, server); return; } } } }