blob: 17c67079695c4d1cc25f5d70f1ea1fbffb1cb5d4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.j2ee.commonarchivecore.looseconfig.internal;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.jst.j2ee.application.Module;
import org.eclipse.jst.j2ee.commonarchivecore.internal.Container;
import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.ArchiveRuntimeException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
import org.eclipse.wst.common.internal.emf.utilities.StringUtil;
/**
* Used internally for loose module support
*/
public class LooseConfigRegister {
/**
* The system property used to specify the absolute path to the loose config document;
* "was.loose.config"
*/
public static final String LOOSE_CONFIG_PROPERTY = "was.loose.config"; //$NON-NLS-1$
protected static LooseConfigRegister singleton;
protected LooseConfiguration looseConfiguration;
protected ResourceSet resourceSet;
/** Have we previously loaded or tried to load the loose configuration? */
protected boolean loadAttempted = false;
private Map looseEarMap;
/**
* Constructor for LooseConfigRegister.
*/
protected LooseConfigRegister() {
super();
initialize();
}
public static LooseConfigRegister singleton() {
if (singleton == null)
singleton = new LooseConfigRegister();
return singleton;
}
/**
* Searches for the ear file in the fluffed LooseConfiguration object, and attempts to load the
* LooseApplication on demand from the existing mappings if it is not already loaded.
*
* @param earFileURI
* @return
*/
public LooseApplication findLooseApplication(String earFileURI) {
// System.out.println(getClass().getName() + ".findLooseApplication(String
// earFileURI=\""+earFileURI+"\")");
if (getLooseConfiguration() != null) {
List apps = getLooseConfiguration().getApplications();
for (int i = 0; i < apps.size(); i++) {
LooseApplication app = (LooseApplication) apps.get(i);
// System.out.println(getClass().getName() + ".findLooseApplication():
// app["+i+"].getURI()=\""+app.getUri()+"\"" );
if (app.getUri().equals(earFileURI))
return app;
}
}
// System.out.println(getClass().getName() + ".findLooseApplication(): did not find loaded
// LooseApplication, loading new value." );
if (getDocumentURI() == null || getDocumentURI().trim().length() == 0) {
URI looseConfig = (URI) getLooseEarMap().get(earFileURI);
// System.out.println(getClass().getName() + ".findLooseApplication(): looseConfig URI
// from map \""+looseConfig+"\"");
LooseApplication application = loadLooseApplication(looseConfig);
// System.out.println(getClass().getName() + ".findLooseApplication():
// looseApplication="+application);
if (application != null) {
List modules = application.getLooseArchives();
// System.out.println(getClass().getName() + ".findLooseApplication():
// looseApplication contains " + modules.size() + " modules.");
for (int i = 0; i < modules.size(); i++)
// System.out.println(getClass().getName() + ".findLooseApplication():
// modules.get("+i+"):"+ modules.get(i));
getLooseConfiguration().getApplications().add(application);
return application;
}
}
return null;
}
/**
* @param earFileURI
* The containing EAR -- the absolute file system URI will be determined
* automatically
* @param looseApplicationResource
* The absolute file system URI of a document containing a LooseApplication as its
* root
*/
public void addLooseMapping(Container container, String looseApplicationResource) {
if (container != null)
addLooseMapping(ArchiveUtil.getOSUri(container.getURI()), looseApplicationResource);
}
/**
* @param earFileURI
* The absolute file system URI of the EAR file of the given mapping
* @param looseApplicationResource
* The absolute file system URI of a document containing a LooseApplication as its
* root
*/
public void addLooseMapping(String earFileURI, String looseApplicationResource) {
if (earFileURI != null) {
// System.out.println(getClass().getName() + ".addLooseMapping(String
// earFileURI=\""+earFileURI+"\", String
// looseApplicationResource=\""+looseApplicationResource+"\")");
if (getLooseEarMap().containsKey(earFileURI)) {
// System.out.println(getClass().getName() + ".addLooseMapping(): Found existing key
// with same earFileURI, looking for loaded app.");
LooseApplication app = findLooseApplicationIfLoaded(earFileURI);
// System.out.println(getClass().getName() + ".addLooseMapping(): Loaded app=" +
// app);
if (app != null) {
Resource res = loadLooseApplicationResource(URI.createURI(looseApplicationResource));
// System.out.println(getClass().getName() + ".addLooseMapping(): clearing
// resource:" + res);
res.unload();
removeLooseApplication(app);
}
}
getLooseEarMap().put(earFileURI, URI.createURI(looseApplicationResource));
}
}
/**
* @param earFileURI
* @return
*/
public LooseApplication findLooseApplicationIfLoaded(String earFileURI) {
// System.out.println(getClass().getName() + ".findLooseApplicationIfLoaded(String
// earFileURI=\""+earFileURI+"\")");
if (getLooseConfiguration() != null) {
List apps = getLooseConfiguration().getApplications();
for (int i = 0; i < apps.size(); i++) {
LooseApplication app = (LooseApplication) apps.get(i);
// System.out.println(getClass().getName() + ".findLooseApplicationIfLoaded():
// app["+i+"].getURI()=\""+app.getUri()+"\"" );
if (app.getUri().equals(earFileURI))
return app;
}
}
return null;
}
/**
* Allows adding LooseApplications dynmically.
*
* @param application
* An application created and persisted by an external entity
*/
public void addLooseApplication(LooseApplication application) {
getLooseConfiguration().getApplications().add(application);
}
/**
* Allows removing LooseApplications dynmically.
*
* @param application
* An application created and persisted by an external entity
*/
public void removeLooseApplication(LooseApplication application) {
// System.out.println(getClass().getName() + ".removeLooseApplication(LooseApplication
// application=\""+application+"\")");
getLooseConfiguration().getApplications().remove(application);
}
/**
* @param earFileURI
* The absolute file system URI of the EAR file of the given mapping
*/
public void removeLooseMapping(String earFileURI) {
// System.out.println(getClass().getName() + ".removeLooseMapping(String
// earFileURI=\""+earFileURI+"\")");
if (earFileURI != null)
getLooseEarMap().remove(earFileURI);
}
public LooseModule findLooseModule(LooseApplication app, String uri, String altDD) {
List archives = app.getLooseArchives();
for (int i = 0; i < archives.size(); i++) {
LooseArchive element = (LooseArchive) archives.get(i);
if (!element.isModule())
continue;
if (StringUtil.stringsEqual(uri, element.getUri()) && StringUtil.stringsEqual(altDD, ((LooseModule) element).getAltDD()))
return (LooseModule) element;
}
return null;
}
public LooseModule findLooseModule(Module m, EARFile ear) {
LooseApplication app = findLooseApplication(ear.getURI());
return app == null ? null : findLooseModule(app, m.getUri(), m.getAltDD());
}
/**
* Clears the loose configuration; the next time it is requested it will be reloaded;
*/
public void flush() {
loadAttempted = false;
looseConfiguration = null;
resourceSet = new ResourceSetImpl();
}
protected void initialize() {
resourceSet = new ResourceSetImpl();
}
protected void loadLooseConfiguration() {
Resource res = loadLooseConfigurationResource();
if (res != null && !res.getContents().isEmpty())
setLooseConfiguration((LooseConfiguration) res.getContents().get(0));
else
/*
* if the document is empty then fluff up a LooseConfiguration object
*/
setLooseConfiguration(LooseconfigFactory.eINSTANCE.createLooseConfiguration());
loadAttempted = true;
}
protected Resource loadLooseConfigurationResource() {
String uri = getDocumentURI();
if (ArchiveUtil.isNullOrEmpty(uri))
return null;
try {
return resourceSet.getResource(URI.createURI(uri), true);
} catch (Exception ex) {
throw new ArchiveRuntimeException("Exception occurred loading loose configuration", ex); //$NON-NLS-1$
}
}
protected LooseApplication loadLooseApplication(URI looseAppURI) {
Resource res = loadLooseApplicationResource(looseAppURI);
if (res != null && !res.getContents().isEmpty())
return (LooseApplication) res.getContents().get(0);
return null;
}
protected Resource loadLooseApplicationResource(URI looseConfigURI) {
if (looseConfigURI == null)
return null;
try {
return resourceSet.getResource(looseConfigURI, true);
} catch (Exception ex) {
throw new ArchiveRuntimeException("Exception occurred loading loose application", ex); //$NON-NLS-1$
}
}
/**
* Gets the looseConfiguration. Basic accessor with no initialization
*
* @return Returns a LooseConfiguration
*/
public LooseConfiguration primGetLooseConfiguration() {
return looseConfiguration;
}
/** The value of the loose config property */
protected String getDocumentURI() {
return System.getProperty(LOOSE_CONFIG_PROPERTY);
}
/**
* Gets the looseConfiguration. Tries to load it using the system property was.loose.config, if
* necessary.
*
* @return Returns a LooseConfiguration or null
*/
public LooseConfiguration getLooseConfiguration() {
if (looseConfiguration == null && !loadAttempted)
loadLooseConfiguration();
return looseConfiguration;
}
/**
* Assumption: the parameter must be a type that can have children, e.g., LooseWAR or
* LooseApplication
*/
public List getLooseChildren(LooseArchive loose) {
if (loose != null) {
if (loose.isEAR())
return ((LooseApplication) loose).getLooseArchives();
else if (loose.isWAR())
return ((LooseWARFile) loose).getLooseLibs();
}
return Collections.EMPTY_LIST;
}
/**
* Assumption: the parameter must be a type that can have children, e.g., LooseWAR or
* LooseApplication
*/
public LooseArchive findFirstLooseChild(String uri, LooseArchive loose) {
List children = getLooseChildren(loose);
for (int i = 0; i < children.size(); i++) {
LooseArchive child = (LooseArchive) children.get(i);
if (StringUtil.stringsEqual(uri, child.getUri()))
return loose;
}
return null;
}
/**
* Sets the looseConfiguration.
*
* @param looseConfiguration
* The looseConfiguration to set
*/
public void setLooseConfiguration(LooseConfiguration config) {
looseConfiguration = config;
}
/**
* Have we previously loaded or tried to load the loose configuration?
*
* @return Returns a boolean
*/
public boolean getLoadAttempted() {
return loadAttempted;
}
/**
* @return Returns the looseEarMap.
*/
public Map getLooseEarMap() {
if (looseEarMap == null)
looseEarMap = new HashMap();
return looseEarMap;
}
}