/*******************************************************************************
* Copyright (c) 2011 SAP AG and others.
* 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:
* SAP AG - initial API and implementation
******************************************************************************/
package com.sap.furcas.ide.dslproject.conf;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import com.sap.furcas.ide.dslproject.Activator;
import com.sap.furcas.ide.dslproject.Constants;
import com.sap.furcas.utils.exceptions.EclipseExceptionHelper;
/**
* Configures a project to use an ecore metamodel as reference.
*
* @author Frederik Petersen (D054528)
*/
public abstract class EcoreMetaProjectConf implements IProjectMetaRefConf {
protected final IProject referencedProject;
protected final boolean autoResolve;
public EcoreMetaProjectConf(IProject referencedProject, boolean autoResolve) {
this.referencedProject = referencedProject;
this.autoResolve = autoResolve;
}
public static EcoreMetaProjectConf getConfigurationFromProject(IProject project) throws CoreException {
String projectName = ProjectPropertiesStorageHelper.getProperty(project, Constants.REFERRED_PROJECT_NAME_KEY);
String metamodelURIs = ProjectPropertiesStorageHelper.getProperty(project, "metamodels");
boolean autoResolve = Boolean.parseBoolean(ProjectPropertiesStorageHelper.getProperty(project, "autoResolve"));
if (projectName == null || projectName.trim().equals("")) {
throw new CoreException(EclipseExceptionHelper.getErrorStatus("Project " + project.getName()
+ " not configured for use with " + EcoreMetaProjectConf.class.getName(), Activator.PLUGIN_ID));
}
IProject referencedProject = project.getWorkspace().getRoot().getProject(projectName);
if (referencedProject == null) {
throw new CoreException(EclipseExceptionHelper.getErrorStatus("Referenced Project " + projectName
+ " does not exist in Workspace.", Activator.PLUGIN_ID));
}
if (metamodelURIs != null) {
return new RegisteredEcoreMetamodelProjectConf(referencedProject, metamodelURIs, autoResolve);
} else {
throw new CoreException(
EclipseExceptionHelper.getErrorStatus(
"The dslEngineering.properties file in Project "
+ project.getName()
+ " contains the properties metamodels and modelPath. However only one of these properties is allowed to exist. Please remove the empty one from the file.",
Activator.PLUGIN_ID));
}
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.epi.conf.IProjectMetaRefConf#configureProject(org.eclipse.core.resources.IProject)
*/
@Override
public void configureProject(IProject project) throws CoreException {
ProjectPropertiesStorageHelper.setProperty(project, Constants.REFERRED_PROJECT_NAME_KEY, referencedProject.getName());
ProjectPropertiesStorageHelper.setProperty(project, "autoResolve", Boolean.toString(autoResolve));
}
protected void addAllCrossReferences(ResourceSet resourceSet) {
boolean foundNew;
do {
foundNew = false;
for (EObject obj : EcoreUtil.ExternalCrossReferencer.find(resourceSet).keySet()) {
if (obj.eResource() != null) {
resourceSet.getResources().add(obj.eResource());
foundNew = true;
}
}
} while (foundNew);
}
public String getRefProjectName() {
return referencedProject.getName();
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof EcoreMetaProjectConf) {
EcoreMetaProjectConf other = (EcoreMetaProjectConf) obj;
if (other.referencedProject.equals(this.referencedProject)) {
return true;
}
}
return false;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return referencedProject.hashCode();
}
}