/*
* Copyright 2003-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.mps.openapi.persistence;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.mps.openapi.persistence.datasource.DataSourceType;
/**
* Represents a location of the model data sources to build models.
* For example it can be based on files, internet content, database content, etc.
*
* NB:
* Must not contain any information on the storage format specifics --
* all that belongs to the {@link ModelFactory}.
*
* For implementation consider extending {@code jetbrains.mps.extapi.persistence.DataSourceBase}.
*
* @author apyshkin
*/
public interface DataSource {
/**
* Yields a string representation for the location of the data source (if applicable)
*/
@NotNull String getLocation();
/**
* Registers listeners who need to be notified about changes in the underlying data source.
* It is the responsibility of the DataSource to detect such updates and notify the listeners.
*/
void addListener(@NotNull DataSourceListener listener);
void removeListener(@NotNull DataSourceListener listener);
/**
* Retrieves the last modification timestamp.
* The timestamp should reliably reflect all external changes to the data source.
* @return 0 if timestamp is not supported for the source, or -1 if the source is dead (like when file is deleted)
*/
long getTimestamp();
/**
* TODO Makes sense only with API which introduce changes to the <code>DataSource</code>. Currently it is incomplete.
* Usually there is a possibility to edit <code>DataSource</code>.
* For examples please see {@link StreamDataSource}.
*
* @return whether this data source can be changed.
*/
boolean isReadOnly();
/**
* Defines a data source type for this kind of data sources.
* The data source type notion is strongly associated with the possibility to provide <code>DataSourceFactory</code> and
* <code>ModelFactory</code> custom mappings.
* See <code>DataSourceFactoryRuleService</code> and <code>ModelFactoryService</code> for the implementation details.
*
* @return the unique data source type for this instance of data source
* if the developer wants others to be able to change the default behavior of this data source (register with the same key)
* or if he desires to associate this data source with some specific model factory.
*/
@Nullable
default DataSourceType getType() {
return null;
}
}