/**
* Copyright (c) 2011 committers of YAKINDU 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:
* committers of YAKINDU - initial API and implementation
*
*/
package org.yakindu.sct.generator.runner.lib;
import static org.yakindu.sct.generator.runner.lib.IGenericJavaFeatureConstants.GENERATOR_CLASS;
import static org.yakindu.sct.generator.runner.lib.IGenericJavaFeatureConstants.GENERATOR_PROJECT;
import static org.yakindu.sct.generator.runner.lib.IGenericJavaFeatureConstants.LIBRARY_NAME;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.yakindu.sct.generator.core.filesystem.ISCTWorkspaceAccess;
import org.yakindu.sct.generator.core.library.AbstractDefaultFeatureValueProvider;
import org.yakindu.sct.model.sgen.FeatureParameterValue;
import org.yakindu.sct.model.sgen.FeatureType;
import org.yakindu.sct.model.sgen.FeatureTypeLibrary;
import com.google.inject.Inject;
/**
*
* @author holger willebrandt - Initial contribution and API
*/
public class GenericJavaLibraryDefaultValueProvider extends AbstractDefaultFeatureValueProvider {
private static final String GENERATOR_CLASS_DEFAULT = "org.yakindu.sct.generator.Generator";
private static final String CLASS_FORMAT_ERROR = "Generator class must be a full qualified class name";
private static final String CLASS_NOT_FOUND_ERROR = "Generator class %s could not be found. Please make sure the generator project lies on this project's build path.";
private static final String PROJECT_NOT_FOUND_ERROR = "Project %s does not exist";
@Inject
protected ISCTWorkspaceAccess access;
// (ID.)+ID
private static final String GENERATOR_CLASS_REGEX = "([a-zA-Z_][a-zA-Z0-9_]*\\.)+[a-zA-Z_][a-zA-Z0-9_]*"; //$NON-NLS-1$
public boolean isProviderFor(FeatureTypeLibrary library) {
return library.getName().equals(LIBRARY_NAME);
}
@Override
protected void setDefaultValue(FeatureType featureType, FeatureParameterValue parameterValue,
EObject contextElement) {
String parameterName = parameterValue.getParameter().getName();
if (GENERATOR_PROJECT.equals(parameterName)) {
parameterValue.setValue(getProject(contextElement).getName());
} else if (GENERATOR_CLASS.equals(parameterName)) {
parameterValue.setValue(GENERATOR_CLASS_DEFAULT);
}
}
public IStatus validateParameterValue(FeatureParameterValue parameterValue) {
String parameterName = parameterValue.getParameter().getName();
if (GENERATOR_PROJECT.equals(parameterName)) {
return validateGeneratorProject(parameterValue);
}
if (GENERATOR_CLASS.equals(parameterName)) {
return validateGeneratorClass(parameterValue);
}
return Status.OK_STATUS;
}
private IStatus validateGeneratorProject(FeatureParameterValue parameterValue) {
String value = parameterValue.getStringValue();
if (!access.projectExists(value)) {
return error(String.format(PROJECT_NOT_FOUND_ERROR, value));
}
return Status.OK_STATUS;
}
private IStatus validateGeneratorClass(FeatureParameterValue parameterValue) {
String value = parameterValue.getStringValue();
IJavaProject ijp = JavaCore.create(this.getProject(parameterValue));
try {
if (ijp.findType(value) == null) {
return error(String.format(CLASS_NOT_FOUND_ERROR, value));
}
} catch (JavaModelException e) {
e.printStackTrace();
}
if (!value.matches(GENERATOR_CLASS_REGEX)) {
return error(CLASS_FORMAT_ERROR);
}
return Status.OK_STATUS;
}
protected IProject getProject(EObject contextElement) {
return WorkspaceSynchronizer.getFile(contextElement.eResource()).getProject();
}
}