/* AWE - Amanzi Wireless Explorer
* http://awe.amanzi.org
* (C) 2008-2009, AmanziTel AB
*
* This library is provided under the terms of the Eclipse Public License
* as described at http://www.eclipse.org/legal/epl-v10.html. Any use,
* reproduction or distribution of the library constitutes recipient's
* acceptance of this agreement.
*
* This library is distributed WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
package org.amanzi.neo.loader.core.saver.impl;
import java.io.File;
import java.util.Map;
import org.amanzi.neo.dto.IDataElement;
import org.amanzi.neo.loader.core.IMappedStringData;
import org.amanzi.neo.loader.core.internal.IConfiguration;
import org.amanzi.neo.loader.core.internal.LoaderCorePlugin;
import org.amanzi.neo.loader.core.saver.impl.internal.AbstractSynonymsSaver;
import org.amanzi.neo.loader.core.synonyms.SynonymsManager;
import org.amanzi.neo.models.exceptions.ModelException;
import org.amanzi.neo.models.network.INetworkModel;
import org.amanzi.neo.models.network.NetworkElementType;
import org.amanzi.neo.nodeproperties.IGeneralNodeProperties;
import org.amanzi.neo.nodeproperties.INetworkNodeProperties;
import org.amanzi.neo.providers.INetworkModelProvider;
import org.amanzi.neo.providers.IProjectModelProvider;
/**
* TODO Purpose of
* <p>
* </p>
*
* @author Nikolay Lagutko (nikolay.lagutko@amanzitel.com)
* @since 1.0.0
*/
public class NetworkSaver extends AbstractSynonymsSaver<IConfiguration> {
public static final String SYNONYMS_TYPE = "network";
private final INetworkModelProvider networkModelProvider;
private INetworkModel networkModel;
private final IGeneralNodeProperties generalNodeProperties;
private final INetworkNodeProperties networkNodeProperties;
public NetworkSaver() {
this(LoaderCorePlugin.getInstance().getProjectModelProvider(), LoaderCorePlugin.getInstance().getNetworkModelProvider(),
SynonymsManager.getInstance(), LoaderCorePlugin.getInstance().getGeneralNodeProperties(), LoaderCorePlugin
.getInstance().getNetworkNodeProperties());
}
protected NetworkSaver(final IProjectModelProvider projectModelProvider, final INetworkModelProvider networkModelProvider,
final SynonymsManager synonymsManager, final IGeneralNodeProperties generalNodeProperties,
final INetworkNodeProperties networkNodeProperties) {
super(projectModelProvider, synonymsManager);
this.networkModelProvider = networkModelProvider;
this.generalNodeProperties = generalNodeProperties;
this.networkNodeProperties = networkNodeProperties;
}
protected INetworkModel createNetworkModel(final String networkName) throws ModelException {
INetworkModel model = networkModelProvider.create(getCurrentProject(), networkName);
addProcessedModel(model);
return model;
}
private IDataElement findElement(final NetworkElementType elementType, final String elementName) throws ModelException {
return networkModel.findElement(elementType, elementName);
}
private IDataElement findSector(final String elementName, final Map<String, Object> properties) throws ModelException {
Integer ci = (Integer)properties.get(networkNodeProperties.getCIProperty());
Integer lac = (Integer)properties.get(networkNodeProperties.getLACProperty());
return networkModel.findSector(elementName, ci, lac);
}
@Override
public void finishUp() {
try {
networkModel.updateSynonyms(getSynonymsMap());
} catch (ModelException e) {
} finally {
super.finishUp();
}
}
@Override
protected String getSynonymsType() {
return SYNONYMS_TYPE;
}
@Override
public void init(final IConfiguration configuration) throws ModelException {
super.init(configuration);
networkModel = createNetworkModel(configuration.getDatasetName());
}
@Override
public void onFileParsingStarted(final File file) {
// do nothing
}
// TODO: shouldn't throw exception
@Override
protected void saveInModel(final IMappedStringData dataElement) throws ModelException {
IDataElement parent = networkModel.asDataElement();
for (NetworkElementType elementType : NetworkElementType.getGeneralNetworkElements()) {
Map<String, Object> properties = getElementProperties(elementType, dataElement,
elementType == NetworkElementType.SECTOR);
if (!properties.isEmpty()) {
String elementName = (String)properties.get(generalNodeProperties.getNodeNameProperty());
if (elementName != null) {
IDataElement child = null;
switch (elementType) {
case SECTOR:
child = findSector(elementName, properties);
break;
default:
child = findElement(elementType, elementName);
break;
}
if (child == null) {
child = networkModel.createElement(elementType, parent, elementName, properties);
}
parent = child;
} else {
// TODO: error!!!
}
}
}
}
}