package captor.domainsystem.metamodelvalidator;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventLocator;
import javax.xml.bind.util.ValidationEventCollector;
import captor.domainsystem.DomainSystem;
import captor.domainsystem.FormsType;
import captor.domainsystem.metamodelvalidator.semanticValidator.SemanticValidator;
import captor.modelsystem.Model;
import captor.modelsystem.Project;
/**
* @author Kicho
*
*/
public class MetaModelValidator {
private Model model;
private File file;
private FormsType forms;
private ValidationResults vr;
public MetaModelValidator(String installPath) {
model = new Model();
model.load(installPath);
}
//-------------------------------------------------------------------------
public ValidationResults validate(File file) {
this.file = file;
if ( file == null )
return null;
if ( !file.isFile() )
return null;
vr = new ValidationResults();
vr.appendBuffer("Step 1 Loading the domains file into a object tree.\n");
//carregar o metamodelo
loadDomain();
if ( !vr.isSuccess() ) {
return vr;
}
if ( model.getProject() == null )
model.setProject(new Project(model));
model.getProject().setFormsType(forms);
vr.ident();
vr.appendBuffer("- Tree successfully loaded.");
vr.dident();
vr.newLine();
vr.appendBuffer("Step 2 - Apply the extends mechanism to normalize the tree.\n");
//colocar o mecanismo de extens�o pra normalizar a �rvore
DomainSystem d = new DomainSystem(model);
String ret = d.extendsMechanism(forms);
if ( ret != null ) {
vr.appendBuffer(ret);
vr.setSuccess(false);
return vr;
}
vr.ident();
vr.appendBuffer("- Extends mechanism successfully applied.");
vr.dident();
//fazer a valida��o semantica
vr.newLine();
vr.appendBuffer("Step 3 - Checking semantic restrictions:\n");
SemanticValidator sv = new SemanticValidator(model, vr);
sv.validate();
if ( !vr.isSuccess() ) {
return vr;
}
vr.ident();
vr.newLine();
vr.appendBuffer("- Checking semantic restrictions OK.\n\n");
vr.dident();
return vr;
}
//-------------------------------------------------------------------------
public void loadDomain() {
Unmarshaller u = null;
JAXBContext jc = null;
ValidationEventCollector vec = new ValidationEventCollector();
try {
jc = JAXBContext.newInstance("captor.domainsystem");
u = jc.createUnmarshaller();
u.setEventHandler(vec);
}
catch(Exception e) {
vr.appendBuffer("Cannot load captor.domainsystem XML instance: " + e);
vr.setSuccess(false);
return;
}
String path = file.getAbsolutePath();
try {
JAXBElement<FormsType> element = (JAXBElement<FormsType>) u.unmarshal(new FileInputStream(path));
forms = element.getValue();
} catch (RuntimeException e1) {
vr.appendBuffer("Cannot validade domain meta-model file: " + path);
vr.setSuccess(false);
return;
} catch (FileNotFoundException e2) {
vr.appendBuffer("Cannot find file: " + path);
vr.setSuccess(false);
return;
} catch ( JAXBException e3 ) {
//guiView.setErrorView("Metal-model invalid format - " + e3.toString());
//Esta exce��o vai ser tratada no vec.hasEvents ;o)
}
StringBuffer buffer = new StringBuffer();
if (vec.hasEvents()) {
ValidationEvent[] ve = vec.getEvents();
buffer = buffer.append("\n\nMetal-model syntax validation error:\n\n");
for ( int i = 0; i < ve.length; i++ ) {
int severityNumber = ve[i].getSeverity();
String severity = "";
if ( severityNumber == ValidationEvent.ERROR )
severity = "ERROR";
else if ( severityNumber == ValidationEvent.FATAL_ERROR )
severity = "FATAL ERROR";
else if ( severityNumber == ValidationEvent.WARNING )
severity = "WARNING";
ValidationEventLocator locator = ve[i].getLocator();
buffer = buffer.append(" (" + i + ") File: " + path + "\n");
buffer = buffer.append(" (" + i + ") Description: " + ve[i].getMessage() + "\n");
buffer = buffer.append(" (" + i + ") Severity: " + severity + "\n");
buffer = buffer.append("\n");
buffer = buffer.append(" (" + i + ") Position: " + "\n");
buffer = buffer.append(" (" + i + ") Line Number: " + locator.getLineNumber() + "\n");
buffer = buffer.append(" (" + i + ") Column Number: " + locator.getColumnNumber() + "\n");
buffer = buffer.append(" (" + i + ") Node: " + locator.getNode() + "\n");
buffer = buffer.append(" (" + i + ") URL: " + locator.getURL() + "\n");
buffer = buffer.append("\n------------------------------------------------------------------\n");
}
vr.appendBuffer(buffer);
vr.setSuccess(false);
return;
}
return;
}
//-------------------------------------------------------------------------
}