//------------------------------------------------------------------------------ // Copyright (c) 2005, 2006 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 implementation //------------------------------------------------------------------------------ package org.eclipse.epf.resourcemanager.impl; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.NotificationChain; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.impl.ENotificationImpl; import org.eclipse.emf.ecore.util.EObjectContainmentEList; import org.eclipse.emf.ecore.util.InternalEList; import org.eclipse.epf.persistence.MultiFileSaveUtil; import org.eclipse.epf.resourcemanager.ResourceDescriptor; import org.eclipse.epf.resourcemanager.ResourceManager; import org.eclipse.epf.resourcemanager.ResourcemanagerPackage; import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject; import org.eclipse.epf.uma.util.UmaUtil; /** * <!-- begin-user-doc --> * An implementation of the model object '<em><b>Resource Manager</b></em>'. * <!-- end-user-doc --> * <p> * The following features are implemented: * <ul> * <li>{@link org.eclipse.epf.resourcemanager.impl.ResourceManagerImpl#getGuid <em>Guid</em>}</li> * <li>{@link org.eclipse.epf.resourcemanager.impl.ResourceManagerImpl#getUriBase <em>Uri Base</em>}</li> * <li>{@link org.eclipse.epf.resourcemanager.impl.ResourceManagerImpl#getSubManagers <em>Sub Managers</em>}</li> * <li>{@link org.eclipse.epf.resourcemanager.impl.ResourceManagerImpl#getResourceDescriptors <em>Resource Descriptors</em>}</li> * </ul> * </p> * * @generated */ public class ResourceManagerImpl extends MultiResourceEObject implements ResourceManager { private static final long serialVersionUID = -5164471475509169204L; /** * The default value of the '{@link #getGuid() <em>Guid</em>}' attribute. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getGuid() * @generated * @ordered */ protected static final String GUID_EDEFAULT = null; /** * The cached value of the '{@link #getGuid() <em>Guid</em>}' attribute. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getGuid() * @generated * @ordered */ protected String guid = GUID_EDEFAULT; /** * The default value of the '{@link #getUriBase() <em>Uri Base</em>}' attribute. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getUriBase() * @generated * @ordered */ protected static final String URI_BASE_EDEFAULT = null; /** * The cached value of the '{@link #getUriBase() <em>Uri Base</em>}' attribute. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getUriBase() * @generated * @ordered */ protected String uriBase = URI_BASE_EDEFAULT; /** * The cached value of the '{@link #getSubManagers() <em>Sub Managers</em>}' containment reference list. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getSubManagers() * @generated * @ordered */ protected EList<ResourceManager> subManagers; /** * The cached value of the '{@link #getResourceDescriptors() <em>Resource Descriptors</em>}' containment reference list. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getResourceDescriptors() * @generated * @ordered */ protected EList<ResourceDescriptor> resourceDescriptors; /** * <!-- begin-user-doc --> * <!-- end-user-doc --> */ protected ResourceManagerImpl() { super(); guid = UmaUtil.generateGUID(); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override protected EClass eStaticClass() { return ResourcemanagerPackage.Literals.RESOURCE_MANAGER; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public String getGuid() { return guid; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public void setGuid(String newGuid) { String oldGuid = guid; guid = newGuid; if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.SET, ResourcemanagerPackage.RESOURCE_MANAGER__GUID, oldGuid, guid)); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public String getUriBase() { return uriBase; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public void setUriBase(String newUriBase) { String oldUriBase = uriBase; uriBase = newUriBase; if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.SET, ResourcemanagerPackage.RESOURCE_MANAGER__URI_BASE, oldUriBase, uriBase)); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public List<ResourceManager> getSubManagers() { if (subManagers == null) { subManagers = new EObjectContainmentEList.Resolving<ResourceManager>(ResourceManager.class, this, ResourcemanagerPackage.RESOURCE_MANAGER__SUB_MANAGERS); } return subManagers; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public List<ResourceDescriptor> getResourceDescriptors() { if (resourceDescriptors == null) { resourceDescriptors = new EObjectContainmentEList.Resolving<ResourceDescriptor>(ResourceDescriptor.class, this, ResourcemanagerPackage.RESOURCE_MANAGER__RESOURCE_DESCRIPTORS); } return resourceDescriptors; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public String toString() { if (eIsProxy()) return super.toString(); StringBuffer result = new StringBuffer(super.toString()); result.append(" (guid: "); //$NON-NLS-1$ result.append(guid); result.append(", uriBase: "); //$NON-NLS-1$ result.append(uriBase); result.append(')'); return result.toString(); } // // Start custom code // /* (non-Javadoc) * @see com.ibm.umaf.ecore.impl.MultiResourceEObject#eResolveProxy(org.eclipse.emf.ecore.InternalEObject) */ public EObject eResolveProxy(InternalEObject proxy) { return super.eResolveProxy(proxy); } /* (non-Javadoc) * @see org.eclipse.epf.uma.resourcemanager.ResourceManager#resolve() */ public void resolve() { URI base = MultiFileSaveUtil.getFinalURI(eResource()); for (Iterator iter = getResourceDescriptors().iterator(); iter.hasNext();) { ResourceDescriptorImpl desc = (ResourceDescriptorImpl) iter.next(); desc.resolvedURI = URI.createURI(desc.getUri()).resolve(base); } } /* (non-Javadoc) * @see org.eclipse.epf.uma.resourcemanager.ResourceManager#deresolve() */ public void deresolve() { URI base = MultiFileSaveUtil.getFinalURI(eResource()); // convert path in all descriptors to relative // for (Iterator iter = getResourceDescriptors().iterator(); iter.hasNext();) { ResourceDescriptor desc = (ResourceDescriptor) iter.next(); desc.setUri(desc.getResolvedURI().deresolve(base).toString()); } } /* (non-Javadoc) * @see org.eclipse.epf.uma.resourcemanager.ResourceManager#removeResourceDescriptor(org.eclipse.emf.common.util.URI, boolean) */ public List removeResourceDescriptor(URI uri, boolean clearFolder) { ArrayList removedList = new ArrayList(); // ResourceDescriptor removedDescriptor = null; for (Iterator iter = getResourceDescriptors().iterator(); iter.hasNext();) { ResourceDescriptor desc = (ResourceDescriptor) iter.next(); if(uri.equals(desc.getResolvedURI().trimFragment())) { iter.remove(); // removedDescriptor = desc; removedList.add(desc); } } // if(removedDescriptor != null) { if(clearFolder) { // remove all child descriptors of the removed descriptor // String oldDir = new File(uri.toFileString()).getParent() + File.separator; for (Iterator iter = getResourceDescriptors().iterator(); iter.hasNext();) { ResourceDescriptor desc = (ResourceDescriptor) iter.next(); if(desc.getResolvedURI().toFileString().startsWith(oldDir)) { iter.remove(); removedList.add(desc); } } } // else { // // remove all the descriptors of the same resource // // // URI resUri = removedDescriptor.getResolvedURI().trimFragment(); // for (Iterator iter = getResourceDescriptors().iterator(); iter.hasNext();) { // ResourceDescriptor desc = (ResourceDescriptor) iter.next(); // if(desc.getResolvedURI().trimFragment().equals(resUri)) { // iter.remove(); // removedList.add(desc); // } // } // } // } return removedList; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> */ public ResourceDescriptor getResourceDescriptor(String guid) { if(idToResourceDescriptorMap == null) { idToResourceDescriptorMap = new HashMap(); eAdapters().add(new AdapterImpl() { public void notifyChanged(Notification msg) { ResourceDescriptor desc; switch(msg.getFeatureID(ResourceManager.class)) { case ResourcemanagerPackage.RESOURCE_MANAGER__RESOURCE_DESCRIPTORS: switch(msg.getEventType()) { case Notification.ADD: desc = (ResourceDescriptor)msg.getNewValue(); idToResourceDescriptorMap.put(desc.getId(), desc); return; case Notification.ADD_MANY: for (Iterator iter = ((Collection)msg.getNewValue()).iterator(); iter .hasNext();) { desc = (ResourceDescriptor) iter.next(); idToResourceDescriptorMap.put(desc.getId(), desc); } return; case Notification.REMOVE: idToResourceDescriptorMap.remove(((ResourceDescriptor)msg.getOldValue()).getId()); return; case Notification.REMOVE_MANY: for (Iterator iter = ((Collection)msg.getOldValue()).iterator(); iter .hasNext();) { idToResourceDescriptorMap.remove(((ResourceDescriptor) iter.next()).getId()); } return; } } } }); // populate the map // for (Iterator iter = getResourceDescriptors().iterator(); iter.hasNext();) { ResourceDescriptor element = (ResourceDescriptor) iter.next(); idToResourceDescriptorMap.put(element.getId(), element); } } return (ResourceDescriptor) idToResourceDescriptorMap.get(guid); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) { switch (featureID) { case ResourcemanagerPackage.RESOURCE_MANAGER__SUB_MANAGERS: return ((InternalEList<?>)getSubManagers()).basicRemove(otherEnd, msgs); case ResourcemanagerPackage.RESOURCE_MANAGER__RESOURCE_DESCRIPTORS: return ((InternalEList<?>)getResourceDescriptors()).basicRemove(otherEnd, msgs); } return super.eInverseRemove(otherEnd, featureID, msgs); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public Object eGet(int featureID, boolean resolve, boolean coreType) { switch (featureID) { case ResourcemanagerPackage.RESOURCE_MANAGER__GUID: return getGuid(); case ResourcemanagerPackage.RESOURCE_MANAGER__URI_BASE: return getUriBase(); case ResourcemanagerPackage.RESOURCE_MANAGER__SUB_MANAGERS: return getSubManagers(); case ResourcemanagerPackage.RESOURCE_MANAGER__RESOURCE_DESCRIPTORS: return getResourceDescriptors(); } return super.eGet(featureID, resolve, coreType); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @SuppressWarnings("unchecked") @Override public void eSet(int featureID, Object newValue) { switch (featureID) { case ResourcemanagerPackage.RESOURCE_MANAGER__GUID: setGuid((String)newValue); return; case ResourcemanagerPackage.RESOURCE_MANAGER__URI_BASE: setUriBase((String)newValue); return; case ResourcemanagerPackage.RESOURCE_MANAGER__SUB_MANAGERS: getSubManagers().clear(); getSubManagers().addAll((Collection<? extends ResourceManager>)newValue); return; case ResourcemanagerPackage.RESOURCE_MANAGER__RESOURCE_DESCRIPTORS: getResourceDescriptors().clear(); getResourceDescriptors().addAll((Collection<? extends ResourceDescriptor>)newValue); return; } super.eSet(featureID, newValue); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public void eUnset(int featureID) { switch (featureID) { case ResourcemanagerPackage.RESOURCE_MANAGER__GUID: setGuid(GUID_EDEFAULT); return; case ResourcemanagerPackage.RESOURCE_MANAGER__URI_BASE: setUriBase(URI_BASE_EDEFAULT); return; case ResourcemanagerPackage.RESOURCE_MANAGER__SUB_MANAGERS: getSubManagers().clear(); return; case ResourcemanagerPackage.RESOURCE_MANAGER__RESOURCE_DESCRIPTORS: getResourceDescriptors().clear(); return; } super.eUnset(featureID); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public boolean eIsSet(int featureID) { //UMA--> EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID); if(feature != null) { return isFeatureWithOverridenDefaultValueSet(feature); } //UMA<-- switch (featureID) { case ResourcemanagerPackage.RESOURCE_MANAGER__GUID: return GUID_EDEFAULT == null ? guid != null : !GUID_EDEFAULT.equals(guid); case ResourcemanagerPackage.RESOURCE_MANAGER__URI_BASE: return URI_BASE_EDEFAULT == null ? uriBase != null : !URI_BASE_EDEFAULT.equals(uriBase); case ResourcemanagerPackage.RESOURCE_MANAGER__SUB_MANAGERS: return subManagers != null && !subManagers.isEmpty(); case ResourcemanagerPackage.RESOURCE_MANAGER__RESOURCE_DESCRIPTORS: return resourceDescriptors != null && !resourceDescriptors.isEmpty(); } return super.eIsSet(featureID); } /* (non-Javadoc) * @see org.eclipse.epf.uma.resourcemanager.ResourceManager#dispose() */ public void dispose() { if(idToResourceDescriptorMap != null) { idToResourceDescriptorMap.clear(); idToResourceDescriptorMap = null; } eAdapters().clear(); // dispose the sub managers // for (Iterator iter = ((InternalEList)getSubManagers()).basicIterator(); iter.hasNext();) { ResourceManager subMgr = (ResourceManager) iter.next(); if(!((InternalEObject)subMgr).eIsProxy()) { subMgr.dispose(); } } } private Map idToResourceDescriptorMap; }