|
What this is
Other links
The source code/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original * Code is Sun Microsystems, Inc. Portions Copyright 1997-2004 Sun * Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.j2ee.deployment.config; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider; import org.netbeans.modules.j2ee.deployment.impl.ServerString; import org.netbeans.modules.j2ee.deployment.impl.Server; import javax.enterprise.deploy.spi.DeploymentConfiguration; import javax.enterprise.deploy.spi.exceptions.ConfigurationException; import javax.enterprise.deploy.model.*; import javax.enterprise.deploy.shared.ModuleType; import javax.enterprise.deploy.spi.*; import org.netbeans.modules.j2ee.deployment.config.ConfigurationStorage; import org.netbeans.modules.j2ee.deployment.config.ModuleDeploymentSupport; import org.netbeans.modules.j2ee.deployment.config.ui.ConfigUtils; import org.netbeans.modules.j2ee.deployment.devmodules.api.J2eeModule; import org.netbeans.modules.j2ee.deployment.impl.ServerInstance; import org.netbeans.modules.j2ee.deployment.impl.ServerRegistry; import org.netbeans.modules.j2ee.deployment.impl.ServerString; import org.netbeans.modules.j2ee.deployment.impl.gen.nbd.WebContextRoot; import org.netbeans.modules.j2ee.deployment.plugins.api.DeploymentPlanSplitter; import org.openide.ErrorManager; import org.openide.filesystems.FileLock; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.loaders.DataObject; import org.openide.loaders.DataFolder; import org.openide.util.NbBundle; import org.netbeans.api.project.FileOwnerQuery; import org.netbeans.api.project.Project; import org.netbeans.modules.j2ee.deployment.common.api.SourceFileMap; /** * Each J2eeModuleProvider hold a reference to an instance of this config support. * An instance of ConfigDataObject representing the current target configuration * and it is cached for to avoid performance penalty of creating new one for every * access to configuration. * * Whenenver target server of the module changes, a new config support is associate * with the module providing access to the right configuration data object. * * @author nn136682 */ //PENDING: cleanup the usage of fakeserver, refresh. Instead, provide UI feedback for // case when provider does not associate with any server. public final class ConfigSupportImpl implements J2eeModuleProvider.ConfigSupport { static public final File[] EMPTY_FILE_LIST = new File[0]; private J2eeModuleProvider provider; private String webContextRootXpath; private String webContextRootPropName; private java.util.Map relativePaths = null; private String configurationPrimaryFileName = null; private Map allRelativePaths = null; private ConfigDataObject configDO = null; private boolean preparing = false; //to cut possible circularity of ensureConfigurationReady /** Creates a new instance of ConfigSupportImpl */ public ConfigSupportImpl (J2eeModuleProvider provider) { this.provider = provider; } private void refresh () { Server s = getServer(); if (s == null) { return; } WebContextRoot webContextRoot = s.getWebContextRoot(); if (webContextRoot != null) { webContextRootXpath = webContextRoot.getXpath(); webContextRootPropName = webContextRoot.getPropName(); } } private boolean initForWeb() { if (! getProvider().getJ2eeModule().getModuleType().equals(J2eeModule.WAR)) return false; if (webContextRootXpath != null && webContextRootPropName != null) { return true; } refresh(); if (webContextRootXpath != null && webContextRootPropName != null) { return true; } return false; } private Server getServer () { Server s = ServerRegistry.getInstance ().getServer (getProvider ().getServerID ()); if (s == null) { //PENDING some ntoifcation. ServerString ss = ServerRegistry.getInstance().getDefaultInstance(); s = ss == null ? null : ss.getServer(); } return s; } private DConfigBean getWebContextDConfigBean() { refresh(); try { DeploymentConfiguration dc = getStorage().getDeploymentConfiguration(); DeployableObject deployable = dc.getDeployableObject(); //PENDIND: do we need if (deployable instanceof J2eeApplicationObject) ... DDBeanRoot ddBeanRoot = deployable.getDDBeanRoot(); DConfigBeanRoot configBeanRoot = dc.getDConfigBeanRoot(ddBeanRoot); DDBean[] ddBeans = ddBeanRoot.getChildBean(webContextRootXpath); if (ddBeans == null || ddBeans.length != 1) { ErrorManager.getDefault ().log (ErrorManager.EXCEPTION, "DDBeans not found"); //NOI18N return null; //better than throw exception } return configBeanRoot.getDConfigBean(ddBeans[0]); } catch (Exception e) { ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, e); } return null; } public boolean createInitialConfiguration() { try { FileObject fo = findPrimaryConfigurationFO(); if (fo == null) { return ensureConfigurationReady(); } } catch (Exception e) { ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, e); } return false; } public boolean ensureConfigurationReady() { if (preparing) { // should be single place to check return true; // optimistic } preparing = true; try { ConfigurationStorage storage = getStorage(); return (storage != null); } finally { preparing = false; } } /** * Get context root * @return string value, null if not set or could not find */ public String getWebContextRoot() { if (initForWeb() == false) return null; DConfigBean configBean = getWebContextDConfigBean(); if (configBean == null) { ErrorManager.getDefault ().log ("ConfigBean for "+webContextRootXpath+" not found"); //NOI18N return null; } return (String) ConfigUtils.getBeanPropertyValue(configBean, webContextRootPropName); } /** * Set context root */ public void setWebContextRoot(String contextRoot) { if (initForWeb() == false) return; DConfigBean configBean = getWebContextDConfigBean(); if (configBean == null) { ErrorManager.getDefault ().log ("ConfigBean for "+webContextRootXpath+":"+webContextRootPropName+" not found"); //NOI18N return; } ConfigUtils.setBeanPropertyValue(configBean, webContextRootPropName, contextRoot); try { getStorage ().save (); } catch (java.io.IOException e) { ErrorManager.getDefault ().notify (e); } } public void resetStorage() { try { preparing = false; if (configDO == null) { FileObject fo = findPrimaryConfigurationFO(); if (fo != null) { configDO = (ConfigDataObject) DataObject.find(fo); } } if (configDO != null) { configDO.resetStorage(); } relativePaths = null; configurationPrimaryFileName = null; } catch (Exception ex) { ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, ex); } } //from J2eeDeploymentLookup: /** * Note this call is temporary for backward compatibility. Do not use. */ public FileObject findConfigurationFO(String name) { if (name == null) return null; FileObject moduleFolder = getProvider().getModuleFolder(); // should not happen, new project should have ovrridden this method to return non-null. if (moduleFolder == null) { throw new IllegalStateException("J2eeModuleProvider implementation needs to override this method!"); //NOI18N } if (getProvider().useDirectoryPath()) { name = getContentRelativePath(name); if (name == null) return null; } return moduleFolder.getFileObject(name); } /** * Note this call is temporary for backward compatibility. Do not use. */ public FileObject getConfigurationFO(String name) throws IOException { FileObject moduleFolder = getProvider().getModuleFolder(); // should not happen, new project should have ovrridden this method to return non-null. if (moduleFolder == null) { throw new IllegalStateException("New J2eeProviderImplementation needs to override this method!"); //NOI18N } String path = getContentRelativePath(name); if (path == null || ! getProvider().useDirectoryPath()) { path = name; } FileObject configFO = moduleFolder.getFileObject(path); if (configFO == null) configFO = FileUtil.createData(moduleFolder, path); return configFO; } /** * This method save configurations in deployment plan in content directory * and return the fileobject for the plan. Primary use is for remote deployment * or standard jsr88 deployement. */ public File getConfigurationFile() { try { return getDeploymentPlanFileForDistribution(); } catch (Exception ex) { ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, ex); } return null; } public File getDeploymentPlanFileForDistribution() throws IOException, ConfigurationException { if (getServer() == null) { String msg = NbBundle.getMessage(ConfigSupportImpl.class, "MSG_NoTargetSelected"); throw new ConfigurationException(msg); } FileLock lock = null; OutputStream out = null; try { FileObject dist = getProvider().getJ2eeModule().getContentDirectory(); String planName = getStandardDeploymentPlanName(); FileObject plan = dist.getFileObject(planName); if (plan == null) { plan = dist.createData(planName); } lock = plan.lock(); out = plan.getOutputStream(lock); getStorage().getDeploymentConfiguration().save(out); return FileUtil.toFile(plan); } finally { if (lock != null) lock.releaseLock(); try { if (out != null) out.close(); } catch(IOException ioe) { ErrorManager.getDefault().log(ioe.toString()); } } } private String getPrimaryConfigurationFileName() { getRelativePaths(); if (configurationPrimaryFileName == null) return getStandardDeploymentPlanName(); else return configurationPrimaryFileName; } private String getStandardDeploymentPlanName() { return ConfigDataLoader.getStandardDeploymentPlanName(getServer()); } private FileObject findPrimaryConfigurationFO() throws IOException { String configFileName = getPrimaryConfigurationFileName(); return getProvider().findDeploymentConfigurationFile(configFileName); } /** Creates the cache if it does not exist for the selected server */ public ConfigurationStorage getStorage() { if (getServer() == null) { return null; } FileLock lock = null; OutputStream out = null; try { if (configDO != null) { preparing = true; return (ConfigurationStorage) configDO.getCookie(ConfigurationStorage.class); } FileObject primary = findPrimaryConfigurationFO(); if (primary == null) { ServerInstance instance = ServerRegistry.getInstance ().getServerInstance (getProvider ().getServerInstanceID ()); ModuleDeploymentSupport mds = new ModuleDeploymentSupport(getProvider().getJ2eeModule()); DeploymentConfiguration config; if(instance != null) { config = instance.getDeploymentManagerForConfiguration().createConfiguration(mds.getDeployableObject()); } else { config = getServer ().getDeploymentManager().createConfiguration(mds.getDeployableObject()); } config.getDConfigBeanRoot(mds.getDeployableObject().getDDBeanRoot()); if (!hasCustomSupport()) { //standard configuration primary.lock(); out = primary.getOutputStream(lock); config.save(out); } else { //server sepecific files String[] fnames = getDeploymentConfigurationFileNames(); File[] files = new File[fnames.length]; for (int i = 0; i < fnames.length; i++) { FileObject fo = getProvider().findDeploymentConfigurationFile(fnames[i]); if (fo == null) { fo = getProvider().getDeploymentConfigurationFile(fnames[i]); } files[i] = FileUtil.toFile(fo); if (files[i].getName().equals(getPrimaryConfigurationFileName())) primary = fo; } getDeploymentPlanSplitter().writeDeploymentPlanFiles(config, mds.getDeployableObject(), files); } } configDO = (ConfigDataObject) DataObject.find(primary); return (ConfigurationStorage) configDO.getCookie(ConfigurationStorage.class); } catch (Exception ex) { String msg = NbBundle.getMessage(ConfigSupportImpl.class, "MSG_ConfigStorageFailed", getServer (), getProvider().getJ2eeModule()); ErrorManager.getDefault().annotate(ex, msg); ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, ex); } finally { if (lock != null) lock.releaseLock(); try { if (out != null) out.close(); } catch(IOException ioe) { ErrorManager.getDefault().log(ioe.toString()); } preparing = false; } return null; } private DeploymentPlanSplitter getDeploymentPlanSplitter() { return getServer ().getDeploymentPlanSplitter(); } private ModuleType getModuleType() { return (ModuleType) getProvider().getJ2eeModule().getModuleType(); } private boolean hasCustomSupport() { return hasCustomSupport(getDeploymentPlanSplitter(), getModuleType()); } private static boolean hasCustomSupport(DeploymentPlanSplitter dps, ModuleType type) { if(dps == null) return false; return dps.getDeploymentPlanFileNames(type) != null; } private J2eeModuleProvider getProvider () { return provider; } private Map getRelativePaths() { if (relativePaths != null) return relativePaths; relativePaths = new HashMap(); if (hasCustomSupport()) { String [] paths = getDeploymentPlanSplitter().getDeploymentPlanFileNames(getModuleType()); configurationPrimaryFileName = paths[0].substring(paths[0].lastIndexOf("/")+1); collectData(getServer(), relativePaths); } return relativePaths; } private void collectData(Server server, Map map) { if (! this.hasCustomSupport(getDeploymentPlanSplitter(), getModuleType())) return; String [] paths = server.getDeploymentPlanSplitter().getDeploymentPlanFileNames(getModuleType()); paths = (paths == null) ? new String[0] : paths; for (int i=0; i |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.