/** * File ./src/main/java/de/lemo/dms/connectors/ConnectorManager.java * Lemo-Data-Management-Server for learning analytics. * Copyright (C) 2013 * Leonard Kappe, Andreas Pursian, Sebastian Schwarzrock, Boris Wenzlaff * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. **/ /** * File ./main/java/de/lemo/dms/connectors/ConnectorManager.java * Date 2013-01-24 * Project Lemo Learning Analytics */ package de.lemo.dms.connectors; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.criterion.Projections; import com.google.common.collect.Lists; import de.lemo.dms.core.ConnectorGetDataWorkerThread; import de.lemo.dms.core.config.ServerConfiguration; import de.lemo.dms.db.DBConfigObject; import de.lemo.dms.db.IDBHandler; import de.lemo.dms.db.mapping.PlatformMining; /** * Handles all connector instances. * * @author Leonard Kappe * @author Boris Wenzlaff */ public enum ConnectorManager { INSTANCE; private final Logger logger = Logger.getLogger(this.getClass()); private final List<IConnector> connectors = Lists.newArrayList(); private ConnectorGetDataWorkerThread getDataThread; /** * Return the instance of the manager. * * @return a singleton instance of the ConnectorManager */ public static ConnectorManager getInstance() { return INSTANCE; } /** * @return all available connectors */ public List<IConnector> getAvailableConnectors() { return new ArrayList<IConnector>(connectors); } /** * Add a connector. * * @param connector */ public void addConnector(final IConnector connector) { this.saveOrUpdateConnectorInfo(connector); this.connectors.add(connector); } public IConnector createNewConnector(Long platformId, Long prefix, String name, String platformType, List<String> properties, List<Long> courseIdFilter, List<String> logins) { ESourcePlatform platform = ESourcePlatform.valueOf(platformType); DBConfigObject config = new DBConfigObject(); if(!properties.isEmpty()){ for(int i = 0; i < properties.size() - 1; i += 2) { config.setProperty(properties.get(i), properties.get(i + 1)); } } IConnector connector = platform.newConnector(platformId, name, config, courseIdFilter, logins); this.addConnector(connector); return connector; } /** * Update the mining database, new data will be loaded from the platform. * * @return true if updating has started */ public boolean startUpdateData(final IConnector connector) { this.logger.info("Updating " + connector); if ((this.getDataThread == null) || (this.connectorState() == EConnectorManagerState.READY)) { this.getDataThread = new ConnectorGetDataWorkerThread(connector); this.getDataThread.start(); return true; } return false; } /** * Information about the connector update process. * * @see EConnectorManagerState * @return the state of the connector update process */ public EConnectorManagerState connectorState() { if (this.connectors.isEmpty()) { return EConnectorManagerState.NO_CONNECTORS; } if (getDataThread != null && this.getDataThread.isAlive()) { return EConnectorManagerState.IN_PROGRESS; } return EConnectorManagerState.READY; } public IConnector getUpdatingConnector() { if (getDataThread != null) { return getDataThread.getConnector(); } return null; } /** * Get a connector by its id. * * @param connectorId * a connector id * @return the connector with the provided id or null if none found */ public IConnector getConnectorById(final Long connectorId) { if (connectorId != null) { for (final IConnector connector : this.connectors) { if (connectorId.equals(connector.getPlatformId())) { return connector; } } } return null; } private void saveOrUpdateConnectorInfo(final IConnector connector) { final IDBHandler dbHandler = ServerConfiguration.getInstance().getMiningDbHandler(); final Session session = dbHandler.getMiningSession(); PlatformMining platform = (PlatformMining) session.get(PlatformMining.class, connector.getPlatformId()); if (platform == null) { // save new platform final Criteria criteria = session .createCriteria(PlatformMining.class) .setProjection(Projections.max("prefix")); Long maxPrefix = (Long) criteria.uniqueResult(); if (maxPrefix == null) { maxPrefix = 10L; } platform = new PlatformMining(); platform.setId(connector.getPlatformId()); platform.setPrefix(maxPrefix + 1); } final AbstractConnector ac = (AbstractConnector) connector; ac.setPrefix(platform.getPrefix()); // update name platform.setName(connector.getName()); platform.setType(connector.getPlattformType().name()); dbHandler.saveToDB(session, platform); dbHandler.closeSession(session); } }