blob: 643c323ae3f228b2e5b3db8265e0565631449da2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 SAP AG.
* 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:
* Emil Simeonov - initial API and implementation.
* Dimitar Donchev - initial API and implementation.
* Dimitar Tenev - initial API and implementation.
* Nevena Manova - initial API and implementation.
* Georgi Konstantinov - initial API and implementation.
*******************************************************************************/
package org.eclipse.wst.sse.sieditor.model.impl;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.wst.wsdl.Definition;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.wst.sse.sieditor.core.editorfwk.ExtensibleObjectFactory;
import org.eclipse.wst.sse.sieditor.model.api.IWsdlModelRoot;
import org.eclipse.wst.sse.sieditor.model.api.IXSDModelRoot;
import org.eclipse.wst.sse.sieditor.model.xsd.api.ISchema;
abstract class AbstractModelObjectFactory implements ExtensibleObjectFactory {
private final static HashMap<ModelRootObjectKey, WeakReference<IXSDModelRoot>> xsdModelRootPool = new HashMap<ModelRootObjectKey, WeakReference<IXSDModelRoot>>();
private final static HashMap<ModelRootObjectKey, WeakReference<IWsdlModelRoot>> wsdlModelRootPool = new HashMap<ModelRootObjectKey, WeakReference<IWsdlModelRoot>>();
IXSDModelRoot getXSDModelRoot(XSDSchema xsdSchema, IAdaptable adaptable) {
if(adaptable != null) {
ISchema schema = (ISchema)adaptable.getAdapter(ISchema.class);
xsdSchema = schema == null ? xsdSchema : schema.getComponent();
}
clearEmptyKeys(xsdModelRootPool.keySet());
Resource schemaResource = xsdSchema.eResource();
final ModelRootObjectKey key = new ModelRootObjectKey(schemaResource, xsdSchema, adaptable);
WeakReference<IXSDModelRoot> weakXSDModelRoot = xsdModelRootPool.get(key);
IXSDModelRoot xsdModelRoot = weakXSDModelRoot == null ? null : weakXSDModelRoot.get();
if(xsdModelRoot == null) {
xsdModelRoot = new XSDModelRoot(xsdSchema, adaptable);
xsdModelRootPool.put(key, new WeakReference<IXSDModelRoot>(xsdModelRoot));
}
return xsdModelRoot;
}
IWsdlModelRoot getWsdlModelRoot(Definition definition, IAdaptable adaptable) {
clearEmptyKeys(wsdlModelRootPool.keySet());
Resource definitionResource = definition.eResource();
final ModelRootObjectKey key = new ModelRootObjectKey(definitionResource, definition, adaptable);
WeakReference<IWsdlModelRoot> weakWsdlModelRoot = wsdlModelRootPool.get(key);
IWsdlModelRoot wsdlModelRoot = weakWsdlModelRoot == null ? null : weakWsdlModelRoot.get();
if(wsdlModelRoot == null) {
wsdlModelRoot = new WSDLModelRoot(definition, adaptable);
wsdlModelRootPool.put(key, new WeakReference<IWsdlModelRoot>(wsdlModelRoot));
}
return wsdlModelRoot;
}
private void clearEmptyKeys(Set<ModelRootObjectKey> keys) {
Iterator<ModelRootObjectKey> iterator = keys.iterator();
while(iterator.hasNext()) {
ModelRootObjectKey key = iterator.next();
if(key.weakResource.get() == null || key.xsdObject.get() == null) {
iterator.remove();
}
}
}
private static class ModelRootObjectKey {
private WeakReference<Resource> weakResource = null;
private WeakReference<EObject> xsdObject = null;
private WeakReference<IAdaptable> weakAdaptable = null;
ModelRootObjectKey(Resource eResource, EObject xsdObject, IAdaptable adaptable) {
weakResource = new WeakReference<Resource>(eResource);
this.xsdObject = new WeakReference<EObject>(xsdObject);
this.weakAdaptable = new WeakReference<IAdaptable>(adaptable);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((weakAdaptable.get() == null) ? 0 : weakAdaptable.get().hashCode());
result = prime
* result
+ ((xsdObject.get() == null) ? 0 : xsdObject.get()
.hashCode());
result = prime * result
+ ((weakResource.get() == null) ? 0 : weakResource.get().hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ModelRootObjectKey other = (ModelRootObjectKey) obj;
if (weakAdaptable.get() == null) {
if (other.weakAdaptable.get() != null)
return false;
} else if (!weakAdaptable.equals(other.weakAdaptable.get()))
return false;
if (xsdObject.get() == null) {
if (other.xsdObject.get() != null)
return false;
} else if (!xsdObject.get().equals(other.xsdObject.get()))
return false;
if (weakResource.get() == null) {
if (other.weakResource.get() != null)
return false;
} else if (!weakResource.get().equals(other.weakResource.get()))
return false;
return true;
}
}
}