/** * Copyright 2012 Markus Scheidgen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.hub.emffrag.model.emffrag.impl; import java.util.Iterator; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.resource.Resource; import de.hub.emffrag.EmfFragActivator; import de.hub.emffrag.datastore.IDataMap; import de.hub.emffrag.datastore.IDataStore; import de.hub.emffrag.datastore.KeyType; import de.hub.emffrag.fragmentation.AbstractValueSetSemantics; import de.hub.emffrag.fragmentation.FInternalObjectImpl; import de.hub.emffrag.fragmentation.FObjectImpl; import de.hub.emffrag.fragmentation.Fragment; import de.hub.emffrag.fragmentation.FragmentedModel; import de.hub.emffrag.fragmentation.IndexedValueSetSemantics; import de.hub.emffrag.model.emffrag.EmfFragPackage; import de.hub.emffrag.model.emffrag.IndexedMap; /** * <!-- begin-user-doc --> * An implementation of the model object '<em><b>Indexed Map</b></em>'. * <!-- end-user-doc --> * <p> * The following features are implemented: * <ul> * <li>{@link de.hub.emffrag.model.emffrag.impl.IndexedMapImpl#getFirstKey <em>First Key</em>}</li> * <li>{@link de.hub.emffrag.model.emffrag.impl.IndexedMapImpl#getLastKey <em>Last Key</em>}</li> * <li>{@link de.hub.emffrag.model.emffrag.impl.IndexedMapImpl#getPrefix <em>Prefix</em>}</li> * <li>{@link de.hub.emffrag.model.emffrag.impl.IndexedMapImpl#getKeytype <em>Keytype</em>}</li> * </ul> * </p> * * @generated */ public class IndexedMapImpl<K, V> extends FObjectImpl implements IndexedMap<K, V> { protected IDataMap<K> index = null; private AbstractValueSetSemantics<K> semantics; /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected IndexedMapImpl() { super(); } private void init() { if (semantics == null) { Resource eResource = fInternalObject().eResource(); if (eResource instanceof Fragment) { Fragment fragment = (Fragment)eResource; FragmentedModel model = fragment.getFragmentedModel(); IDataStore dataStore = model.getDataStore(); String prefix = getPrefix(); if (prefix == null) { String id = EmfFragActivator.instance.idSemantics.getPrefixID(fInternalObject()); prefix = FragmentedModel.INDEX_CLASSES_PREFIX + "_" + id; setPrefix(prefix); } index = dataStore.getMap(prefix.getBytes(), getKeytype()); semantics = createValueSet(model, index); } else { throw new IllegalStateException("Map operations can only be used, if the map is part of a fragmented model."); } } } protected AbstractValueSetSemantics<K> createValueSet(FragmentedModel model, IDataMap<K> index) { return new IndexedValueSetSemantics<K>(model, index){}; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override protected EClass eStaticClass() { return EmfFragPackage.Literals.INDEXED_MAP; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override protected int eStaticFeatureCount() { return 0; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ public K getFirstKey() { init(); return index.first(); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ public boolean isSetFirstKey() { return true; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ public K getLastKey() { init(); return index.last(); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public boolean isSetLastKey() { return eIsSet(EmfFragPackage.Literals.INDEXED_MAP__LAST_KEY); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public String getPrefix() { return (String)eGet(EmfFragPackage.Literals.INDEXED_MAP__PREFIX, true); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public void setPrefix(String newPrefix) { eSet(EmfFragPackage.Literals.INDEXED_MAP__PREFIX, newPrefix); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ public KeyType<K> getKeytype() { throw new UnsupportedOperationException("This needs to be overwritten"); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public boolean isSetKeytype() { return eIsSet(EmfFragPackage.Literals.INDEXED_MAP__KEYTYPE); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ public Iterator<V> iterator() { return iterator(index.first(), index.last()); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ public Iterator<V> iterator(K from, K to) { init(); final Iterator<FInternalObjectImpl> sourceIterator = semantics.iterator(from, to); return new Iterator<V>() { @Override public boolean hasNext() { return sourceIterator.hasNext(); } @SuppressWarnings("unchecked") @Override public V next() { return (V)sourceIterator.next().getUserObject(); } @Override public void remove() { throw new UnsupportedOperationException(); } }; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ @SuppressWarnings("unchecked") public V exact(K key) { init(); FInternalObjectImpl result = semantics.getValueForExactKey(key); return result == null ? null : (V)result.getUserObject(); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ @SuppressWarnings("unchecked") public V next(K key) { init(); key = index.exactOrNext(key); return key == null ? null : (V)semantics.getValueForExactKey(key).getUserObject(); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ public void put(K key, V value) { init(); if (value instanceof FObjectImpl) { semantics.setValueForKey(key, ((FObjectImpl)value).fInternalObject()); } else { throw new IllegalArgumentException("Non fragmented model objects are not supported as map values."); } } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ @SuppressWarnings("unchecked") public V remove(K key) { init(); FInternalObjectImpl result = semantics.getValueForExactKey(key); if (result != null) { semantics.removeValueForKey(key, result); } return (V)result.getUserObject(); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ public byte[] keyToBytes(K key) { throw new UnsupportedOperationException(); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ public K bytesToKey(byte[] bytes) { throw new UnsupportedOperationException(); } } //IndexedMapImpl