/*******************************************************************************
* Copyright (c) 2005, 2012 eBay Inc.
* 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
*
*******************************************************************************/
package org.eclipse.vjet.eclipse.core.validation;
import java.util.Set;
import org.eclipse.vjet.dsf.jsgen.shared.validation.vjo.IVjoSemanticRule;
import org.eclipse.vjet.dsf.jsgen.shared.validation.vjo.IVjoSemanticRuleSet;
import org.eclipse.vjet.dsf.jsgen.shared.validation.vjo.VjoGroupRulesCache;
import org.eclipse.vjet.dsf.jsgen.shared.validation.vjo.VjoSemanticRulePolicy;
import org.eclipse.vjet.dsf.jsgen.shared.validation.vjo.semantic.rules.VjoSemanticRuleRepo;
import org.eclipse.vjet.eclipse.core.VjetPlugin;
import org.eclipse.vjet.eclipse.core.VjoNature;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectNature;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.osgi.service.prefs.BackingStoreException;
public class DefaultValidator {
private static VjoSemanticRuleRepo ruleRepo;
private VjoGroupRulesCache m_projectRulesCache = VjoGroupRulesCache
.getInstance();
private DefaultValidator() {
loadRuleRepo();
}
public static DefaultValidator validator = null;
/**
* return valiator
*
* @return {@link DefaultValidator}
*/
public synchronized static DefaultValidator getValidator() {
if (validator == null) {
return new DefaultValidator();
}
return validator;
}
public Set<IResource> deriveResources(Object object) {
return null;
}
private void loadRuleRepo() {
if (ruleRepo == null) {
ruleRepo = VjoSemanticRuleRepo.getInstance();
loadCustomedValue();
loadCustomedPrjoectValue();
}
}
private void loadCustomedPrjoectValue() {
if (ruleRepo == null) {
return;
}
IProject[] projects = ResourcesPlugin.getWorkspace().getRoot()
.getProjects();
IProject project = null;
IProjectNature nature = null;
for (int i = 0; i < projects.length; i++) {
project = projects[i];
if (project == null) {
continue;
}
try {
nature = project.getNature(VjoNature.NATURE_ID);
} catch (CoreException e) {
continue;
}
if (nature == null) {
continue;
}
innerClearCustomedProjectValue(project);
innerLoadProjectPreference(project);
}
}
private void innerLoadProjectPreference(IProject project) {
IScopeContext projectContext = new ProjectScope(project);
if (!projectContext.getLocation().toFile().exists()) {
return;
}
String groupName = project.getName();
IEclipsePreferences prefs = projectContext
.getNode(VjetPlugin.PLUGIN_ID);
if (prefs == null) {
return;
}
try {
if (prefs.keys().length != 0) {
loadProjectPre(groupName, prefs);
}
} catch (BackingStoreException e) {
return;
}
}
/**
* @param groupName
* @param prefs
*/
private void loadProjectPre(String groupName, IEclipsePreferences prefs) {
String ruleSetName = "";
String propertyValue = null;
for (IVjoSemanticRuleSet ruleSet : ruleRepo.getRuleSets()) {
ruleSetName = ruleSet.getRuleSetName();
propertyValue = prefs.get(ruleSetName, null);
for (IVjoSemanticRule<?> rule : ruleSet.getRules()) {
if (propertyValue == null) {
continue;
}
VjoSemanticRulePolicy policy = getRulePolicy(propertyValue);
if (policy ==null ) {
rule.setGroupRulePolicy(groupName, rule.getDefaultPolicy());
//m_projectRulesCache.addGroupPolicy(groupName, rule, policy);
}else{
rule.setGroupRulePolicy(groupName, policy);
}
}
}
}
private void loadCustomedValue() {
Preferences preferenceStore = VjetPlugin.getDefault()
.getPluginPreferences();
String ruleSetName = "";
String propertyValue = null;
for (IVjoSemanticRuleSet ruleSet : ruleRepo.getRuleSets()) {
ruleSetName = ruleSet.getRuleSetName();
propertyValue = preferenceStore.getString(ruleSetName);
if(propertyValue.equalsIgnoreCase("default")){
for (IVjoSemanticRule<?> rule : ruleSet.getRules()) {
rule.setGlobalPolicy(rule.getDefaultPolicy());
}
}else{
for (IVjoSemanticRule<?> rule : ruleSet.getRules()) {
rule.setGlobalPolicy(getRulePolicy(propertyValue));
}
}
}
}
private VjoSemanticRulePolicy getRulePolicy(String severity) {
if ("error".equalsIgnoreCase(severity)) {
return VjoSemanticRulePolicy.GLOBAL_ERROR_POLICY;
} else if ("warning".equalsIgnoreCase(severity)) {
return VjoSemanticRulePolicy.GLOBAL_WARNING_POLICY;
} else if ("ignore".equalsIgnoreCase(severity)) {
return VjoSemanticRulePolicy.GLOBAL_IGNORE_POLICY;
}
return null;
}
public void ruleChanged(String groupName) {
if (groupName == null) {
VjoSemanticRuleRepo.getInstance().restoreDefaultPolicies();
loadCustomedValue();
} else {
IProject project = ResourcesPlugin.getWorkspace().getRoot()
.getProject(groupName);
if (project == null) {
return;
}
innerClearCustomedProjectValue(project);
innerLoadProjectPreference(project);
}
}
public void innerClearCustomedProjectValue(IProject project) {
IScopeContext projectContext = new ProjectScope(project);
if (!projectContext.getLocation().toFile().exists()) {
return;
}
String groupName = project.getName();
if (groupName != null) {
m_projectRulesCache.clearGroupCache(groupName);
}
}
}