/* 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.awe.correlation.provider.impl; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.amanzi.awe.correlation.model.CorrelationNodeTypes; import org.amanzi.awe.correlation.model.ICorrelationModel; import org.amanzi.awe.correlation.model.impl.CorrelationModel; import org.amanzi.awe.correlation.nodeproperties.ICorrelationProperties; import org.amanzi.awe.correlation.provider.ICorrelationModelProvider; import org.amanzi.awe.correlation.service.ICorrelationService; import org.amanzi.neo.impl.dto.DataElement; import org.amanzi.neo.models.drive.IDriveModel; import org.amanzi.neo.models.exceptions.DuplicatedModelException; import org.amanzi.neo.models.exceptions.ModelException; import org.amanzi.neo.models.impl.internal.AbstractModel; import org.amanzi.neo.models.measurement.IMeasurementModel; import org.amanzi.neo.models.network.INetworkModel; import org.amanzi.neo.nodeproperties.IGeneralNodeProperties; import org.amanzi.neo.nodeproperties.INetworkNodeProperties; import org.amanzi.neo.nodeproperties.ITimePeriodNodeProperties; import org.amanzi.neo.nodetypes.INodeType; import org.amanzi.neo.providers.IDriveModelProvider; import org.amanzi.neo.providers.IProjectModelProvider; import org.amanzi.neo.providers.impl.internal.AbstractNamedModelProvider; import org.amanzi.neo.services.INodeService; import org.amanzi.neo.services.exceptions.ServiceException; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.log4j.Logger; import org.neo4j.graphdb.Node; /** * TODO Purpose of * <p> * </p> * * @author Vladislav_Kondratenko * @since 1.0.0 */ public class CorrelationModelProvider extends AbstractNamedModelProvider<ICorrelationModel, INetworkModel, CorrelationModel> implements ICorrelationModelProvider { @SuppressWarnings("unused") private static final class CorrelationModelKey implements IKey { private final INetworkModel networkModel; private final IMeasurementModel measurementModel; private final String correlationProperty; private final String correlatedProperty; /** * @param networkModel * @param measurementModel * @param correlatedProperty * @param correlationProperty */ public CorrelationModelKey(final INetworkModel networkModel, final IMeasurementModel measurementModel, final String correlationProperty, final String correlatedProperty) { super(); this.networkModel = networkModel; this.measurementModel = measurementModel; this.correlationProperty = correlationProperty; this.correlatedProperty = correlatedProperty; } @Override public boolean equals(final Object o) { return EqualsBuilder.reflectionEquals(this, o, true); } @Override public int hashCode() { return HashCodeBuilder.reflectionHashCode(this, true); } } private static final Logger LOGGER = Logger.getLogger(CorrelationModelProvider.class); private final INetworkNodeProperties networkNodeProperties; private final IGeneralNodeProperties generalNodeProperties; private final ICorrelationService correlationService; private final INodeService nodeService; private final ICorrelationProperties correlationProperties; private final ITimePeriodNodeProperties timePeriodNodePropertie; private final IDriveModelProvider driveModelProvider; private final IProjectModelProvider projectModelProvider; /** * @param networkNodeProperties * @param measurementNodeProperties * @param generalNodeProperties * @param correlationService * @param nodeService */ public CorrelationModelProvider(final INetworkNodeProperties networkNodeProperties, final IGeneralNodeProperties generalNodeProperties, final ICorrelationProperties correlationProperties, final ICorrelationService correlationService, final INodeService nodeService, final ITimePeriodNodeProperties timePeriodNodeProperties, final IDriveModelProvider driveModelProvider, final IProjectModelProvider projectModelProvider) { super(nodeService, generalNodeProperties); this.networkNodeProperties = networkNodeProperties; this.generalNodeProperties = generalNodeProperties; this.correlationService = correlationService; this.nodeService = nodeService; this.correlationProperties = correlationProperties; this.timePeriodNodePropertie = timePeriodNodeProperties; this.driveModelProvider = driveModelProvider; this.projectModelProvider = projectModelProvider; } @Override public ICorrelationModel createCorrelationModel(final INetworkModel networkModel, final IMeasurementModel correlatedModel, final String correlationProperty, final String correlatedProperty) throws ModelException { if (LOGGER.isDebugEnabled()) { LOGGER.debug(getStartLogStatement("createCorrelation", networkModel, correlatedModel)); } if (findCorrelationModel(networkModel, correlatedModel, correlationProperty, correlatedProperty) != null) { throw new DuplicatedModelException(getModelClass(), "correlation_model", networkModel); } final IKey key = new CorrelationModelKey(networkModel, correlatedModel, correlationProperty, correlatedProperty); CorrelationModel result = null; final AbstractModel parentModel = (AbstractModel)networkModel; final AbstractModel measurementModel = (AbstractModel)correlatedModel; try { final Node correlationRoot = correlationService.createCorrelationModelNode(parentModel.getRootNode(), measurementModel.getRootNode(), correlationProperty, correlatedProperty); if (correlationRoot != null) { result = initializeFromNode(correlationRoot); initializeCorrelationModel(result, networkModel, correlatedModel); addToCache(result, key); } } catch (final ServiceException e) { deleteFromCache(key); processException("Error on searching for a CorrelationModel Model <" + networkModel + ", " + correlatedModel + ">", e); } if (LOGGER.isDebugEnabled()) { LOGGER.debug(getFinishLogStatement("createCorrelation")); } return result; } @Override protected CorrelationModel createInstance() { return new CorrelationModel(correlationService, nodeService, generalNodeProperties, networkNodeProperties, correlationProperties, timePeriodNodePropertie); } @Override public List<ICorrelationModel> findAll(final INetworkModel parent) throws ModelException { assert parent != null; List<ICorrelationModel> correlations = new ArrayList<ICorrelationModel>(); try { Iterator<Node> nodes = correlationService.findAllNetworkCorrelations(((DataElement)parent.asDataElement()).getNode()); while (nodes.hasNext()) { Node correlation = nodes.next(); CorrelationModel model = initializeFromNode(correlation); Node measurementNode = correlationService.findMeasurementModel(correlation); IDriveModel drive = driveModelProvider.findByName(projectModelProvider.getActiveProjectModel(), nodeService.getNodeName(measurementNode)); model.setCorrelatedModels(parent, drive); correlations.add(model); } } catch (ServiceException e) { processException("Can't find correlations for model " + parent.getName(), e); } return correlations; } @Override public ICorrelationModel findCorrelationModel(final INetworkModel networkModel, final IMeasurementModel correlatedModel, final String correlationProperty, final String correlatedProperty) throws ModelException { if (LOGGER.isDebugEnabled()) { LOGGER.debug(getStartLogStatement("find correlation model", networkModel, correlatedModel)); } final IKey key = new CorrelationModelKey(networkModel, correlatedModel, correlationProperty, correlatedProperty); CorrelationModel result = getFromCache(key); if (result == null) { LOGGER.info("Creating new Correlation Model <" + networkModel + ", " + correlatedModel + "> in Database"); final AbstractModel parentModel = (AbstractModel)networkModel; final AbstractModel measurementModel = (AbstractModel)correlatedModel; try { final Node correlationRoot = correlationService.findCorrelationModelNode(parentModel.getRootNode(), measurementModel.getRootNode(), correlationProperty, correlatedProperty); if (correlationRoot != null) { result = initializeFromNode(correlationRoot); initializeCorrelationModel(result, networkModel, correlatedModel); addToCache(result, key); } } catch (final ServiceException e) { processException("Error on searching for a Correlation Model <" + networkModel + ", " + correlatedModel + ">", e); } } if (LOGGER.isDebugEnabled()) { LOGGER.debug(getFinishLogStatement("getCorrelation")); } return result; } @Override protected Class< ? extends ICorrelationModel> getModelClass() { return CorrelationModel.class; } @Override protected INodeType getModelType() { return CorrelationNodeTypes.CORRELATION_MODEL; } /** * @param result * @param networkModel * @param measurementModel */ private void initializeCorrelationModel(final CorrelationModel result, final INetworkModel networkModel, final IMeasurementModel measurementModel) { result.setCorrelatedModels(networkModel, measurementModel); } @Override public void removeModel(final ICorrelationModel model) throws ModelException { deleteFromCache(new CorrelationModelKey(model.getNetworModel(), model.getMeasurementModel(), model.getCorrelationProperty(), model.getCorrelatedProperty())); model.delete(); } }