blob: 29d26c29891f32b60ebfba8ce544bd61f5781c41 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2015 The University of York.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the Eclipse
* Public License, v. 2.0 are satisfied: GNU General Public License, version 3.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-3.0
*
* Contributors:
* Konstantinos Barmpis - initial API and implementation
******************************************************************************/
package org.eclipse.hawk.core;
import java.io.File;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ScheduledFuture;
import org.eclipse.hawk.core.IStateListener.HawkState;
import org.eclipse.hawk.core.graph.IGraphChangeListener;
import org.eclipse.hawk.core.graph.IGraphDatabase;
import org.eclipse.hawk.core.query.IQueryEngine;
import org.eclipse.hawk.core.runtime.CompositeGraphChangeListener;
import org.eclipse.hawk.core.runtime.CompositeStateListener;
import org.eclipse.hawk.core.util.IndexedAttributeParameters;
public interface IModelIndexer {
enum ShutdownRequestType {
/**
* Request came straight from the user and must be honored no matter
* what.
*/
ALWAYS,
/**
* Request came from an automated process and may be ignored in some
* cases (e.g. remote instances).
*/
ONLY_LOCAL;
}
/**
* Name of the property that is used by Hawk for its internal identifiers
* (e.g. type names for EClasses, URI fragments for EObjects and so on).
* Should be reasonably unique and avoid potential collisions that names
* that might be used in a metamodel.
*/
String IDENTIFIER_PROPERTY = "_hawkid";
String SIGNATURE_PROPERTY = "_hawksignature";
String METAMODEL_TYPE_PROPERTY = "type";
String METAMODEL_RESOURCE_PROPERTY = "resource";
String METAMODEL_DEPENDENCY_EDGE = "dependency";
boolean VERBOSE = false;
/**
* Forces a synchronisation to be performed immediately.
*
* The synchronisation process may run in a separate thread. Users wishing
* to run code when synchronisation really starts or ends should register an
* {@link IGraphChangeListener}.
*/
void requestImmediateSync() throws Exception;
/**
* Shuts down, persisting metadata.
*/
void shutdown(ShutdownRequestType requestType) throws Exception;
/**
* Shuts down and deletes the backend.
*/
void delete() throws Exception;
/**
*
* @return running back-end
*/
IGraphDatabase getGraph();
/**
*
* @return running vcs managers
*/
Set<IVcsManager> getRunningVCSManagers();
/**
* Returns a collection with all the available model updaters.
*/
Collection<IModelUpdater> getModelUpdaters();
/**
*
* @return current known metamodels in hawk
*/
Set<String> getKnownMMUris();
String getId();
void registerMetamodels(File... f) throws Exception;
void removeMetamodels(String... metamodelURI) throws Exception;
IConsole getConsole();
void addVCSManager(IVcsManager vcs, boolean persist);
void removeVCSManager(IVcsManager vcs) throws Exception;
void addModelUpdater(IModelUpdater updater);
void removeModelUpdater(IModelUpdater updater) throws Exception;
void addMetaModelResourceFactory(IMetaModelResourceFactory metaModelParser);
void removeMetaModelResourceFactory(IMetaModelResourceFactory metaModelParser);
void addModelResourceFactory(IModelResourceFactory modelParser);
void removeModelResourceFactory(IModelResourceFactory modelParser);
boolean addGraphChangeListener(IGraphChangeListener changeListener);
boolean removeGraphChangeListener(IGraphChangeListener changeListener);
CompositeGraphChangeListener getCompositeGraphChangeListener();
boolean addStateListener(IStateListener stateListener);
boolean removeStateListener(IStateListener stateListener);
CompositeStateListener getCompositeStateListener();
/**
* Convenience method for {@link #waitFor(HawkState)} that waits
* indefinitely.
*/
void waitFor(HawkState targetState) throws InterruptedException;
/**
* On a running Hawk, blocks the current thread until the state of Hawk
* changes to the target state or a certain amount of time passes.
*
* @param targetState
* State that we should wait for.
* @param timeoutMillis
* Milliseconds to wait (or 0 to wait indefinitely).
* @throws InterruptedException
* The wait was interrupted.
* @throws IllegalStateException
* if the Hawk instance is not running altogether.
*/
void waitFor(HawkState targetState, long timeoutMillis) throws InterruptedException;
void setDB(IGraphDatabase db, boolean persist);
void addQueryEngine(IQueryEngine q);
/**
* starts hawk -- given an admit password for de-serialising any stored
* passwords for saved version control systems NOTE: run init() with no
* parameters to disregard serialisation of hawk metadata. NOTE: do not call
* this method before setting all the required factories and parsers you
* wish to use in this hawk!
*
* If <code>maxDelay</code> is 0, periodic synchronisation will be disabled,
* and only manual synchronisation through {@link #requestImmediateSync()}
* will be available.
*
* @param minDelay
* @param maxDelay
*/
void init(int minDelay, int maxDelay) throws Exception;
/**
* Returns <code>true</code> if this indexer is running, <code>false</code>
* otherwise.
*/
boolean isRunning();
Collection<IModelResourceFactory> getModelParsers();
Set<String> getKnownMetaModelParserTypes();
Collection<IMetaModelResourceFactory> getMetaModelParsers();
IMetaModelResourceFactory getMetaModelParser(String metaModelType);
/**
* Returns a set with all the supported metamodel extensions, in the
* format of ".ext". For instance, for Ecore we would return ".ecore".
*/
Set<String> getKnownMetamodelFileExtensions();
Map<String, IQueryEngine> getKnownQueryLanguages();
/**
*
* @return the folder the entire hawk structure is stored in
*/
File getParentFolder();
IMetaModelUpdater getMetaModelUpdater();
void setMetaModelUpdater(IMetaModelUpdater metaModelUpdater);
void addDerivedAttribute(String metamodeluri, String typename, String attributename, String attributetype,
boolean isMany, boolean isOrdered, boolean isUnique, String derivationlanguage, String derivationlogic);
void addIndexedAttribute(String metamodeluri, String typename, String attributename);
Collection<IndexedAttributeParameters> getDerivedAttributes();
Collection<IndexedAttributeParameters> getIndexedAttributes();
Collection<String> getIndexes();
List<String> validateExpression(String derivationlanguage, String derivationlogic);
public String getName();
/**
* if set to true hawk will not unload resources between synchronise calls,
* or within the calls, so that they can be used by listeners. NB: this will
* greatly affect performance as the memory hawk will need will be increased
*
* @param enable
*/
void setSyncMetricsEnabled(Boolean enable);
ICredentialsStore getCredentialsStore();
String getDerivedAttributeExecutionEngine();
/**
* Sets the periodic synchronisation of Hawk's index. This interval will
* start at base and will keep doubling until it reaches max every time no
* changes are found, resetting to base when a change is found. If
* {@code max} is set to 0, periodic polling is disabled.
*
* @param base
* @param max
*/
void setPolling(int base, int max);
boolean removeIndexedAttribute(String metamodelUri, String typename, String attributename);
boolean removeDerivedAttribute(String metamodelUri, String typeName, String attributeName);
/**
* Schedules a task on the Hawk update thread. This avoids unwanted
* concurrent accesses on an instance of Hawk. Clients are suggested to make
* any changes on a Hawk configuration through tasks scheduled this way. Hawk
* is not designed to be thread safe.
*/
<T> ScheduledFuture<T> scheduleTask(Callable<T> task, long delayMillis);
}