blob: 04b59c9e5c809d2ef6fa03da11399d17b55734e7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2011 Obeo.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.docs.intent.client.compiler.launcher;
import java.util.LinkedHashSet;
import java.util.Set;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.mylyn.docs.intent.client.compiler.repositoryconnection.CompilerRepositoryClient;
import org.eclipse.mylyn.docs.intent.collab.handlers.RepositoryObjectHandler;
import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.ReadOnlyException;
import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.RepositoryAdapter;
import org.eclipse.mylyn.docs.intent.collab.handlers.impl.ReadWriteRepositoryObjectHandlerImpl;
import org.eclipse.mylyn.docs.intent.collab.handlers.impl.notification.typeListener.TypeNotificator;
import org.eclipse.mylyn.docs.intent.collab.handlers.notification.Notificator;
import org.eclipse.mylyn.docs.intent.collab.repository.Repository;
import org.eclipse.mylyn.docs.intent.collab.repository.RepositoryConnectionException;
import org.eclipse.mylyn.docs.intent.core.document.IntentDocumentPackage;
import org.eclipse.mylyn.docs.intent.core.genericunit.GenericUnitPackage;
import org.eclipse.mylyn.docs.intent.core.modelingunit.ModelingUnitPackage;
/**
* Creates Compiler repository clients.
*
* @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a>
*/
public final class CompilerCreator {
/**
* CompilerCreator constructor.
*/
private CompilerCreator() {
}
/**
* Creates a CompilerRepositoryClient.
*
* @param repository
* is the repository containing the modeling units to compile
* @throws RepositoryConnectionException
* if a connection to the given repository cannot be established
* @return the created CompilerRepositoryClient
* @throws ReadOnlyException
* if no sufficient rights to write on the repository
*/
public static CompilerRepositoryClient createCompilerClient(Repository repository)
throws RepositoryConnectionException, ReadOnlyException {
// Step 1: initialize the listened types
Set<EStructuralFeature> listenedTypes = new LinkedHashSet<EStructuralFeature>();
listenedTypes.add(IntentDocumentPackage.eINSTANCE.getIntentSection_ModelingUnits());
for (EObject obj : ModelingUnitPackage.eINSTANCE.eContents()) {
if (obj instanceof EClass && !(ModelingUnitPackage.eINSTANCE.getTypeReference().equals(obj))) {
listenedTypes.addAll(TypeNotificator.getStructuralFeaturesForEClass((EClass)obj));
}
}
listenedTypes.remove(IntentDocumentPackage.eINSTANCE.getIntentGenericElement_CompilationStatus());
listenedTypes.remove(GenericUnitPackage.eINSTANCE.getGenericUnit_Instructions());
listenedTypes.remove(GenericUnitPackage.eINSTANCE.getGenericUnit_UnitName());
listenedTypes
.remove(ModelingUnitPackage.eINSTANCE.getContributionInstruction_ContributionReference());
listenedTypes.remove(ModelingUnitPackage.eINSTANCE
.getModelingUnitInstructionReference_ReferencedInstruction());
listenedTypes.remove(ModelingUnitPackage.eINSTANCE.getResourceReference_Declaration());
listenedTypes.remove(ModelingUnitPackage.eINSTANCE.getInstanceLevelInstruction_MetaType());
// Step 2: create the adapter and the handler for these types
final RepositoryAdapter repositoryAdapter = repository.createRepositoryAdapter();
repositoryAdapter.openSaveContext();
RepositoryObjectHandler handler;
handler = new ReadWriteRepositoryObjectHandlerImpl(repositoryAdapter);
Notificator notificator = new TypeNotificator(listenedTypes);
handler.addNotificator(notificator);
// Step 3: create the compiler
CompilerRepositoryClient compilerClient = new CompilerRepositoryClient();
compilerClient.setRepository(repository);
compilerClient.addRepositoryObjectHandler(handler);
return compilerClient;
}
}