/* 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.providers.impl; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.amanzi.neo.models.exceptions.DuplicatedModelException; import org.amanzi.neo.models.exceptions.ModelException; import org.amanzi.neo.models.exceptions.ParameterInconsistencyException; import org.amanzi.neo.models.impl.project.ProjectModel; import org.amanzi.neo.models.impl.project.ProjectModelNodeType; import org.amanzi.neo.models.project.IProjectModel; import org.amanzi.neo.nodeproperties.IGeneralNodeProperties; import org.amanzi.neo.providers.IProjectModelProvider; import org.amanzi.neo.providers.impl.internal.AbstractModelProvider; import org.amanzi.neo.services.INodeService; import org.amanzi.neo.services.exceptions.ServiceException; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.neo4j.graphdb.Node; /** * TODO Purpose of * <p> * </p> * * @author Nikolay Lagutko (nikolay.lagutko@amanzitel.com) * @since 1.0.0 */ public class ProjectModelProvider extends AbstractModelProvider<ProjectModel, IProjectModel> implements IProjectModelProvider { private static final Logger LOGGER = Logger.getLogger(ProjectModelProvider.class); private final INodeService nodeService; private final IGeneralNodeProperties generalNodeProperties; private IProjectModel activeProject; public ProjectModelProvider(final INodeService nodeService, final IGeneralNodeProperties generalNodeProperties) { this.nodeService = nodeService; this.generalNodeProperties = generalNodeProperties; } @Override public IProjectModel findProjectByName(final String name) throws ModelException { if (LOGGER.isDebugEnabled()) { LOGGER.debug(getStartLogStatement("findProjectByName", name)); } // validate arguments if (StringUtils.isEmpty(name)) { throw new ParameterInconsistencyException(generalNodeProperties.getNodeNameProperty(), name); } IKey cacheKey = new NameKey(name); // check cache IProjectModel projectModel = getFromCache(cacheKey); if (projectModel == null) { Node modelNode = null; try { Node referencedNode = nodeService.getReferencedNode(); modelNode = nodeService.getChildByName(referencedNode, name, ProjectModelNodeType.PROJECT); } catch (ServiceException e) { processException("Error on Searching for a Project Model", e); } if (modelNode != null) { ProjectModel model = createInstance(); model.initialize(modelNode); addToCache(model, cacheKey); projectModel = model; } } if (LOGGER.isDebugEnabled()) { LOGGER.debug(getFinishLogStatement("findProjectByName")); } return projectModel; } @Override public IProjectModel createProjectModel(final String name) throws ModelException { if (LOGGER.isDebugEnabled()) { LOGGER.debug(getStartLogStatement("createProjectModel", name)); } // validate arguments if (StringUtils.isEmpty(name)) { throw new ParameterInconsistencyException(generalNodeProperties.getNodeNameProperty(), name); } // validate uniqueness if (findProjectByName(name) != null) { throw new DuplicatedModelException(IProjectModel.class, generalNodeProperties.getNodeNameProperty(), name); } ProjectModel projectModel = createInstance(); projectModel.initialize(name); if (LOGGER.isDebugEnabled()) { LOGGER.debug(getFinishLogStatement("createProjectModel")); } return projectModel; } @Override public IProjectModel getActiveProjectModel() { return activeProject; } @Override public void setActiveProjectModel(final IProjectModel projectModel) { assert projectModel != null; activeProject = projectModel; } @Override protected ProjectModel createInstance() { return new ProjectModel(nodeService, generalNodeProperties); } @Override protected Class< ? extends IProjectModel> getModelClass() { return ProjectModel.class; } @Override public List<IProjectModel> findAll() throws ModelException { if (LOGGER.isDebugEnabled()) { LOGGER.debug(getStartLogStatement("findAll")); } List<IProjectModel> result = new ArrayList<IProjectModel>(); try { Node referencedNode = nodeService.getReferencedNode(); Iterator<Node> projectNodes = nodeService.getChildren(referencedNode, ProjectModelNodeType.PROJECT); while (projectNodes.hasNext()) { ProjectModel projectModel = createInstance(); projectModel.initialize(projectNodes.next()); result.add(projectModel); } } catch (ServiceException e) { processException("Error on Searching for a Project Model", e); } if (LOGGER.isDebugEnabled()) { LOGGER.debug(getFinishLogStatement("findAll")); } return result; } }