org.eclipse.emf.emfstore.internal.client.model.impl.api
Class ESLocalProjectImpl

java.lang.Object
  extended by org.eclipse.emf.emfstore.internal.common.api.AbstractAPIImpl<ESLocalProjectImpl,ProjectSpace>
      extended by org.eclipse.emf.emfstore.internal.client.model.impl.api.ESLocalProjectImpl
All Implemented Interfaces:
ESLocalProject, ESProject, ESObjectContainer<ESModelElementId>, InternalAPIDelegator<ESLocalProjectImpl,ProjectSpace>

public class ESLocalProjectImpl
extends AbstractAPIImpl<ESLocalProjectImpl,ProjectSpace>
implements ESLocalProject

Mapping between ESLocalProject and ProjectSpace.

All methods except getModelElements() are wrapped in commands by default.

Author:
emueller

Constructor Summary
ESLocalProjectImpl(ProjectSpace projectSpace)
          Constructor.
 
Method Summary
 void addTag(ESPrimaryVersionSpec versionSpec, ESTagVersionSpec tag, org.eclipse.core.runtime.IProgressMonitor monitor)
           Adds a tag to the specified version of this project on the server.
 void addToWorkspace(org.eclipse.core.runtime.IProgressMonitor progressMonitor)
          Adds this project to the workspace.
 ESPrimaryVersionSpec commit(org.eclipse.core.runtime.IProgressMonitor monitor)
           Commits any local changes.
 ESPrimaryVersionSpec commit(String logMessage, ESCommitCallback callback, org.eclipse.core.runtime.IProgressMonitor monitor)
           Commits any local changes.
 ESPrimaryVersionSpec commitToBranch(ESBranchVersionSpec branch, String logMessage, ESCommitCallback callback, org.eclipse.core.runtime.IProgressMonitor monitor)
           Commits any local changes to a branch.
 boolean contains(org.eclipse.emf.ecore.EObject modelElement)
          Checks whether a given EObject is contained in the collection.
 boolean contains(ESModelElementId modelElementId)
          Checks whether the EObject with the given ESModelElementId is contained in the collection.
 void delete(org.eclipse.core.runtime.IProgressMonitor monitor)
           Deletes the project.
 Set<org.eclipse.emf.ecore.EObject> getAllModelElements()
           Returns a flat representation of all model elements in the collection.
<T extends org.eclipse.emf.ecore.EObject>
Set<T>
getAllModelElementsByClass(Class<T> modelElementClass)
          Retrieve a list of all model elements of a certain type in the collection.
<T extends org.eclipse.emf.ecore.EObject>
Set<T>
getAllModelElementsByClass(Class<T> modelElementClass, Boolean includeSubclasses)
          Retrieve a list of all model elements of a certain type in the collection.
 ESPrimaryVersionSpec getBaseVersion()
          Returns the base version of the project.
 List<ESBranchInfo> getBranches(org.eclipse.core.runtime.IProgressMonitor monitor)
           Returns a list of branches for the current project.
 ESGlobalProjectId getGlobalProjectId()
          Returns the global ID of the project.
 List<ESHistoryInfo> getHistoryInfos(ESHistoryQuery<? extends ESHistoryQuery<?>> query, org.eclipse.core.runtime.IProgressMonitor monitor)
           Retrieves a part of the project's version history from the server based on the given query.
 Date getLastUpdated()
          Returns the Date when the project was updated the last time.
 ESLocalProjectId getLocalProjectId()
          Returns a locally unique ID for the project.
 org.eclipse.emf.ecore.EObject getModelElement(ESModelElementId modelElementId)
          Returns the model element with the given ESModelElementId.
 ESModelElementIdImpl getModelElementId(org.eclipse.emf.ecore.EObject modelElement)
          Retrieve the ESModelElementId of the given model element.
 org.eclipse.emf.common.util.EList<org.eclipse.emf.ecore.EObject> getModelElements()
          Returns all directly contained model element of the container, i.e.
 String getProjectName()
          Returns the project's name.
 List<String> getRecentLogMessages()
          Returns a list with copies of the most recent log messages.
 ESRemoteProjectImpl getRemoteProject()
          Returns the ESRemoteProject on a server this local project is associated with.
 ESUsersessionImpl getUsersession()
          Returns the ESUsersession associated with this project, if any.
 boolean hasUncommitedChanges()
          Determines whether the project has uncommitted changes.
 boolean hasUnsavedChanges()
          Determines whether the project has unsaved changes.
 boolean isShared()
          Whether this project has been shared.
 boolean isUpdated()
          Determines whether the project is up to date, that is, whether the base revision and the head revision are equal.
 void removeTag(ESPrimaryVersionSpec versionSpec, ESTagVersionSpec tag, org.eclipse.core.runtime.IProgressMonitor monitor)
           Removes a tag from the specified version of this project on the server.
 ESPrimaryVersionSpec resolveVersionSpec(ESVersionSpec versionSpec, org.eclipse.core.runtime.IProgressMonitor monitor)
          Resolves a ESVersionSpec to a ESPrimaryVersionSpec by querying the server.
 void revert()
          Revert all local changes in the project space.
 void save()
          Saves the project space.
 ESRemoteProject shareProject(ESUsersession session, org.eclipse.core.runtime.IProgressMonitor monitor)
          Shares this project.
 void shareProject(org.eclipse.core.runtime.IProgressMonitor monitor)
           Shares this project.
 void undoLastOperation()
          Undoes the last operation of the project.
 void undoLastOperations(int nrOperations)
          Undo the last operation n operations of the project.
 ESPrimaryVersionSpec update(ESVersionSpec versionSpec, ESUpdateCallback callback, org.eclipse.core.runtime.IProgressMonitor monitor)
           Updates the project to the given version from the server.
 ESPrimaryVersionSpec update(org.eclipse.core.runtime.IProgressMonitor monitor)
           Updates the project to the head version from the server.
 
Methods inherited from class org.eclipse.emf.emfstore.internal.common.api.AbstractAPIImpl
equals, hashCode, toInternalAPI
 
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ESLocalProjectImpl

public ESLocalProjectImpl(ProjectSpace projectSpace)
Constructor.

Parameters:
projectSpace - the delegate
Method Detail

getGlobalProjectId

public ESGlobalProjectId getGlobalProjectId()
Returns the global ID of the project. This ID is globally unique even among different server and client nodes.

Specified by:
getGlobalProjectId in interface ESProject
Returns:
the global ID of the project
See Also:
ESProject.getGlobalProjectId()

getProjectName

public String getProjectName()
Returns the project's name.

Specified by:
getProjectName in interface ESProject
Returns:
the name of the project
See Also:
ESProject.getProjectName()

delete

public void delete(org.eclipse.core.runtime.IProgressMonitor monitor)
            throws IOException

Deletes the project.

When calling this method on a remote project it is recommended to use the overloaded method which allows to specify an ESUsersession.

Specified by:
delete in interface ESProject
Parameters:
monitor - an IProgressMonitor instance that is used to indicate progress while deleting the project
Throws:
IOException - in case an I/O related error occurred while deleting the project
See Also:
ESProject.delete(org.eclipse.core.runtime.IProgressMonitor)

resolveVersionSpec

public ESPrimaryVersionSpec resolveVersionSpec(ESVersionSpec versionSpec,
                                               org.eclipse.core.runtime.IProgressMonitor monitor)
                                        throws ESException
Resolves a ESVersionSpec to a ESPrimaryVersionSpec by querying the server. When calling this method on a remote project it is recommended to use the overloaded method which allows to specify an ESUsersession.

Specified by:
resolveVersionSpec in interface ESProject
Parameters:
versionSpec - the ESVersionSpec to resolve
monitor - an IProgressMonitor instance that is used to indicate progress while resolving the version
Returns:
the resolved ESPrimaryVersionSpec
Throws:
ESException - in case an error occurs while resolving the given ESVersionSpec
See Also:
ESProject.resolveVersionSpec(org.eclipse.emf.emfstore.server.model.versionspec.ESVersionSpec, org.eclipse.core.runtime.IProgressMonitor)

getBranches

public List<ESBranchInfo> getBranches(org.eclipse.core.runtime.IProgressMonitor monitor)
                               throws ESException

Returns a list of branches for the current project.

When calling this method on a remote project it is recommended to use the overloaded method which allows to specify an ESUsersession.

Specified by:
getBranches in interface ESProject
Parameters:
monitor - an IProgressMonitor instance that is used to indicate progress while fetching the branch information
Returns:
a list containing information about all branches for the current project
Throws:
ESException - in case an error occurs while retrieving the branch information for the project
See Also:
ESProject.getBranches(org.eclipse.core.runtime.IProgressMonitor)

addTag

public void addTag(ESPrimaryVersionSpec versionSpec,
                   ESTagVersionSpec tag,
                   org.eclipse.core.runtime.IProgressMonitor monitor)
            throws ESException

Adds a tag to the specified version of this project on the server.

When calling this method on a remote project it is recommended to use the overloaded method which allows to specify an ESUsersession.

Specified by:
addTag in interface ESProject
Parameters:
versionSpec - the ESPrimaryVersionSpec that should be tagged
tag - the tag being created
monitor - an IProgressMonitor instance that is used to indicate progress while adding the tag
Throws:
ESException - in case the given tag could not be removed
See Also:
ESProject.addTag(org.eclipse.emf.emfstore.server.model.versionspec.ESPrimaryVersionSpec, org.eclipse.emf.emfstore.server.model.versionspec.ESTagVersionSpec, org.eclipse.core.runtime.IProgressMonitor)

removeTag

public void removeTag(ESPrimaryVersionSpec versionSpec,
                      ESTagVersionSpec tag,
                      org.eclipse.core.runtime.IProgressMonitor monitor)
               throws ESException

Removes a tag from the specified version of this project on the server.

When calling this method on a remote project it is recommended to use the overloaded method which allows to specify an ESUsersession.

Specified by:
removeTag in interface ESProject
Parameters:
versionSpec - the ESPrimaryVersionSpec identifying the version from which the tag should be removed
tag - the ESTagVersionSpec to be removed
monitor - an IProgressMonitor instance that is used to indicate progress while removing the tag
Throws:
ESException - in case the given tag could not be removed
See Also:
ESProject.removeTag(org.eclipse.emf.emfstore.server.model.versionspec.ESPrimaryVersionSpec, org.eclipse.emf.emfstore.server.model.versionspec.ESTagVersionSpec, org.eclipse.core.runtime.IProgressMonitor)

getModelElement

public org.eclipse.emf.ecore.EObject getModelElement(ESModelElementId modelElementId)
Returns the model element with the given ESModelElementId.

Specified by:
getModelElement in interface ESObjectContainer<ESModelElementId>
Parameters:
modelElementId - the ID of the model element, that should be retrieved
Returns:
the model element that has the given ID assigned to it within the container
See Also:
ESObjectContainer.getModelElement(java.lang.Object)

getModelElementId

public ESModelElementIdImpl getModelElementId(org.eclipse.emf.ecore.EObject modelElement)
Retrieve the ESModelElementId of the given model element.

Specified by:
getModelElementId in interface ESObjectContainer<ESModelElementId>
Parameters:
modelElement - the model element for which to retrieve the ID for
Returns:
the ESModelElementId of the given model element
See Also:
ESObjectContainer.getModelElementId(org.eclipse.emf.ecore.EObject)

getModelElements

public org.eclipse.emf.common.util.EList<org.eclipse.emf.ecore.EObject> getModelElements()
Returns all directly contained model element of the container, i.e. a hierarchical representation of the model elements.

Specified by:
getModelElements in interface ESObjectContainer<ESModelElementId>
Returns:
a list containing the directly contained model elements within the container
See Also:
ESObjectContainer.getModelElements()

getAllModelElements

public Set<org.eclipse.emf.ecore.EObject> getAllModelElements()

Returns a flat representation of all model elements in the collection.

The returned set is not modifiable and will throw an UnsupportedOperationException in case trying to do so.

Specified by:
getAllModelElements in interface ESObjectContainer<ESModelElementId>
Returns:
a set of all model elements contained in the collection
See Also:
ESObjectContainer.getAllModelElements()

getAllModelElementsByClass

public <T extends org.eclipse.emf.ecore.EObject> Set<T> getAllModelElementsByClass(Class<T> modelElementClass,
                                                                                   Boolean includeSubclasses)
Retrieve a list of all model elements of a certain type in the collection.

Specified by:
getAllModelElementsByClass in interface ESObjectContainer<ESModelElementId>
Type Parameters:
T - the type of the model element(s) to be retrieved
Parameters:
modelElementClass - the Class of the model element(s) to be retrieved
includeSubclasses - whether to also include all subclasses of the given Class in the list
Returns:
a list of model elements of the given type
See Also:
ESObjectContainer.getAllModelElementsByClass(java.lang.Class, java.lang.Boolean)

getAllModelElementsByClass

public <T extends org.eclipse.emf.ecore.EObject> Set<T> getAllModelElementsByClass(Class<T> modelElementClass)
Retrieve a list of all model elements of a certain type in the collection.

Specified by:
getAllModelElementsByClass in interface ESObjectContainer<ESModelElementId>
Type Parameters:
T - the type of the model element(s) to be retrieved
Parameters:
modelElementClass - the Class of the model element(s) to be retrieved
Returns:
a list of model elements of the given type
See Also:
ESObjectContainer.getAllModelElementsByClass(java.lang.Class)

contains

public boolean contains(ESModelElementId modelElementId)
Checks whether the EObject with the given ESModelElementId is contained in the collection.

Specified by:
contains in interface ESObjectContainer<ESModelElementId>
Parameters:
modelElementId - the model element ID of the EObject, which needs to be checked, whether it is contained in the collection
Returns:
true, if the EObject with the given model element ID is contained in the collection, false
See Also:
ESObjectContainer.contains(java.lang.Object)

contains

public boolean contains(org.eclipse.emf.ecore.EObject modelElement)
Checks whether a given EObject is contained in the collection.

Specified by:
contains in interface ESObjectContainer<ESModelElementId>
Parameters:
modelElement - the model element to be checked, whether it is contained in the collection
Returns:
true, if the model element is contained in the collection, false otherwise
See Also:
ESObjectContainer.contains(org.eclipse.emf.ecore.EObject)

commit

public ESPrimaryVersionSpec commit(org.eclipse.core.runtime.IProgressMonitor monitor)
                            throws ESException

Commits any local changes.

NOTE: The commit will be executed in headless mode, so no callback can be specified. If clients would like to influence the commit behavior, they should use ESLocalProject.commit(String, ESCommitCallback, IProgressMonitor).

This method throws a ESProjectNotSharedException runtime exception if the project hasn't been shared yet

Specified by:
commit in interface ESLocalProject
Parameters:
monitor - a progress monitor to track the progress of the commit
Returns:
the new base version, if the commit was successful, otherwise the old base version
Throws:
ESException - in case any error occurs during commit
See Also:
ESLocalProject.commit(org.eclipse.core.runtime.IProgressMonitor)

commit

public ESPrimaryVersionSpec commit(String logMessage,
                                   ESCommitCallback callback,
                                   org.eclipse.core.runtime.IProgressMonitor monitor)
                            throws ESUpdateRequiredException,
                                   ESException

Commits any local changes.

NOTE: If no callback is specified the return value will be used to indicate whether the commit was successful or not. This enables the the headless execution of the commit.

This method throws a ESProjectNotSharedException runtime exception if the project hasn't been shared yet

Specified by:
commit in interface ESLocalProject
Parameters:
logMessage - a message describing the changes being committed
callback - an optional ESCommitCallback
monitor - an IProgressMonitor instance that is used to track the progress of the commit
Returns:
the new base version, if the commit was successful, otherwise the old base version
Throws:
ESUpdateRequiredException - in case the local working copy is outdated and an update is required
ESException - in case any other error occurs during commit
See Also:
ESLocalProject.commit(java.lang.String, org.eclipse.emf.emfstore.client.callbacks.ESCommitCallback, org.eclipse.core.runtime.IProgressMonitor)

commitToBranch

public ESPrimaryVersionSpec commitToBranch(ESBranchVersionSpec branch,
                                           String logMessage,
                                           ESCommitCallback callback,
                                           org.eclipse.core.runtime.IProgressMonitor monitor)
                                    throws InvalidVersionSpecException,
                                           ESUpdateRequiredException,
                                           ESException

Commits any local changes to a branch.

NOTE: If no callback is specified the return value will be used to indicate whether the commit was successful or not. This enables the the headless execution of the commit.

This method throws a ESProjectNotSharedException runtime exception if the project hasn't been shared yet

Specified by:
commitToBranch in interface ESLocalProject
Parameters:
branch - the ESBranchVersionSpec indicating the branch to commit to
logMessage - a message describing the changes being committed
callback - a optional ESCommitCallback
monitor - an IProgressMonitor instance that is used to track the progress of the commit
Returns:
the new base version, if the commit was successful, otherwise the old base version
Throws:
InvalidVersionSpecException - in case the given ESBranchVersionSpec could not be resolved
ESUpdateRequiredException - in case the local working copy is outdated
ESException - in case any other error occurs during commit
See Also:
ESLocalProject.commitToBranch(org.eclipse.emf.emfstore.server.model.versionspec.ESBranchVersionSpec, java.lang.String, org.eclipse.emf.emfstore.client.callbacks.ESCommitCallback, org.eclipse.core.runtime.IProgressMonitor)

update

public ESPrimaryVersionSpec update(org.eclipse.core.runtime.IProgressMonitor monitor)
                            throws ChangeConflictException,
                                   ESException

Updates the project to the head version from the server.

This method throws a ESProjectNotSharedException runtime exception if the project hasn't been shared yet

Specified by:
update in interface ESLocalProject
Parameters:
monitor - a progress monitor to track progress
Returns:
the new base version
Throws:
ChangeConflictException - in case a conflict is detected on update
ESException - in case update fails for any other reason
See Also:
ESLocalProject.update(org.eclipse.core.runtime.IProgressMonitor)

update

public ESPrimaryVersionSpec update(ESVersionSpec versionSpec,
                                   ESUpdateCallback callback,
                                   org.eclipse.core.runtime.IProgressMonitor monitor)
                            throws ChangeConflictException,
                                   ESException

Updates the project to the given version from the server.

This method throws a ESProjectNotSharedException runtime exception if the project hasn't been shared yet

Specified by:
update in interface ESLocalProject
Parameters:
versionSpec - the ESVersionSpec to update to
callback - the ESUpdateCallback that will be called while the update is performing
monitor - an IProgressMonitor instance that is used to track the progress of the update
Returns:
the new base version
Throws:
ChangeConflictException - in case a conflict is detected on update
ESException - in case update fails for any other reason
See Also:
ESLocalProject.update(org.eclipse.emf.emfstore.server.model.versionspec.ESVersionSpec, org.eclipse.emf.emfstore.client.callbacks.ESUpdateCallback, org.eclipse.core.runtime.IProgressMonitor)

addToWorkspace

public void addToWorkspace(org.eclipse.core.runtime.IProgressMonitor progressMonitor)
Adds this project to the workspace.

Specified by:
addToWorkspace in interface ESLocalProject
Parameters:
progressMonitor - a IProgressMonitor to track the progress while adding the project to the workspace
See Also:
ESLocalProject.addToWorkspace(org.eclipse.core.runtime.IProgressMonitor)

shareProject

public void shareProject(org.eclipse.core.runtime.IProgressMonitor monitor)
                  throws ESException

Shares this project.

The ESUsersession used to share the project will be injected by the framework.

Specified by:
shareProject in interface ESLocalProject
Parameters:
monitor - an IProgressMonitor instance that is used to indicate progress while sharing the project
Throws:
ESException - in case an error occurs while sharing the project
See Also:
ESLocalProject.shareProject(org.eclipse.core.runtime.IProgressMonitor)

shareProject

public ESRemoteProject shareProject(ESUsersession session,
                                    org.eclipse.core.runtime.IProgressMonitor monitor)
                             throws ESException
Shares this project.

Specified by:
shareProject in interface ESLocalProject
Parameters:
session - the ESUsersession that should be used for sharing the project
monitor - an IProgressMonitor instance that is used to indicate progress while sharing the project
Returns:
the corresponding remote project of a successful share
Throws:
ESException - in case an error occurs while sharing the project
See Also:
ESLocalProject.shareProject(org.eclipse.emf.emfstore.client.ESUsersession, org.eclipse.core.runtime.IProgressMonitor)

isShared

public boolean isShared()
Whether this project has been shared.

Specified by:
isShared in interface ESLocalProject
Returns:
true, if the project space has been shared, false otherwise
See Also:
ESLocalProject.isShared()

getUsersession

public ESUsersessionImpl getUsersession()
Returns the ESUsersession associated with this project, if any.

Specified by:
getUsersession in interface ESLocalProject
Returns:
the user session associated with this project, or null, if no such session is available
See Also:
ESLocalProject.getUsersession()

getBaseVersion

public ESPrimaryVersionSpec getBaseVersion()
Returns the base version of the project.

Specified by:
getBaseVersion in interface ESLocalProject
Returns:
the base version of the project
See Also:
ESLocalProject.getBaseVersion()

getLastUpdated

public Date getLastUpdated()
Returns the Date when the project was updated the last time.

Specified by:
getLastUpdated in interface ESLocalProject
Returns:
the date of the last update
See Also:
ESLocalProject.getLastUpdated()

getRecentLogMessages

public List<String> getRecentLogMessages()
Returns a list with copies of the most recent log messages.

Specified by:
getRecentLogMessages in interface ESLocalProject
Returns:
a list with copies of the most recent log messages
See Also:
ESLocalProject.getRecentLogMessages()

undoLastOperation

public void undoLastOperation()
Undoes the last operation of the project.

Specified by:
undoLastOperation in interface ESLocalProject
See Also:
ESLocalProject.undoLastOperation()

undoLastOperations

public void undoLastOperations(int nrOperations)
Undo the last operation n operations of the project.

Specified by:
undoLastOperations in interface ESLocalProject
Parameters:
nrOperations - the number of operations to be undone
See Also:
ESLocalProject.undoLastOperations(int)

isUpdated

public boolean isUpdated()
                  throws ESException
Determines whether the project is up to date, that is, whether the base revision and the head revision are equal.

Specified by:
isUpdated in interface ESLocalProject
Returns:
true, if the project is up to date, false otherwise
Throws:
ESException - if the head revision can not be resolved
See Also:
ESLocalProject.isUpdated()

revert

public void revert()
Revert all local changes in the project space. Returns the state of the project to that of the project space base version.

Specified by:
revert in interface ESLocalProject
See Also:
ESLocalProject.revert()

save

public void save()
Saves the project space.

Specified by:
save in interface ESLocalProject
See Also:
ESLocalProject.save()

hasUnsavedChanges

public boolean hasUnsavedChanges()
Determines whether the project has unsaved changes.

Specified by:
hasUnsavedChanges in interface ESLocalProject
Returns:
true, if there are unsaved changes, false otherwise
See Also:
ESLocalProject.hasUnsavedChanges()

hasUncommitedChanges

public boolean hasUncommitedChanges()
Determines whether the project has uncommitted changes.

Specified by:
hasUncommitedChanges in interface ESLocalProject
Returns:
true, if there are any uncommitted changes, false otherwise
See Also:
ESLocalProject.hasUncommitedChanges()

getRemoteProject

public ESRemoteProjectImpl getRemoteProject()
                                     throws ESException
Returns the ESRemoteProject on a server this local project is associated with.

Specified by:
getRemoteProject in interface ESLocalProject
Returns:
the remote project this project is associated with
Throws:
ESException - in case any error occurs while retrieving the remote project
See Also:
ESLocalProject.getRemoteProject()

getLocalProjectId

public ESLocalProjectId getLocalProjectId()
Returns a locally unique ID for the project. It is only unique within the same workspace and it is not the same for different checkouts of the same ESRemoteProject. It is intended to identify a local copy of a remote project.

Specified by:
getLocalProjectId in interface ESLocalProject
Returns:
the ID of the project
See Also:
ESLocalProject.getLocalProjectId()

getHistoryInfos

public List<ESHistoryInfo> getHistoryInfos(ESHistoryQuery<? extends ESHistoryQuery<?>> query,
                                           org.eclipse.core.runtime.IProgressMonitor monitor)
                                    throws ESException

Retrieves a part of the project's version history from the server based on the given query. Use ESHistoryQueryFactory to generate query objects.

Specified by:
getHistoryInfos in interface ESProject
Parameters:
query - the ESHistoryQuery to be performed in order to fetch the history information
monitor - an IProgressMonitor instance that is used to indicate progress while fetching the history information
Returns:
a list containing the history information for the given query
Throws:
ESException - in case an error occurs while retrieving the history information
See Also:
ESProject.getHistoryInfos(org.eclipse.emf.emfstore.server.model.query.ESHistoryQuery, org.eclipse.core.runtime.IProgressMonitor)


Copyright © 2015. All Rights Reserved.