package org.ofbiz.plugin.builder; import java.io.IOException; import java.util.Map; import javax.xml.parsers.SAXParserFactory; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.IResourceVisitor; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.ofbiz.plugin.Plugin; import org.ofbiz.plugin.model.ControllerHelper; import org.ofbiz.plugin.model.OfbizModelSingleton; import org.ofbiz.plugin.model.ScreenHelper; import org.ofbiz.plugin.model.ServiceHelper; import org.ofbiz.plugin.ofbiz.Component; import org.ofbiz.plugin.ofbiz.Controller; import org.ofbiz.plugin.ofbiz.Project; import org.ofbiz.plugin.ofbiz.Screen; import org.ofbiz.plugin.parser.Parser; import org.ofbiz.plugin.parser.WebappParser; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; public class ControllerXmlBuilder extends IncrementalProjectBuilder { class SampleDeltaVisitor implements IResourceDeltaVisitor { /* * (non-Javadoc) * * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta) */ public boolean visit(IResourceDelta delta) throws CoreException { IResource resource = delta.getResource(); if (resource instanceof IFile && resource.getName().endsWith("controller.xml")) { // Project project = OfbizModelSingleton.get().findProjectByEclipseProjectName(resource.getProject().getName()); // IFile file = (IFile) delta.getResource(); // Controller controller = ControllerHelper.getController(file); // String uri = controller.getUri(); // Component component = controller.getComponent(); // controller.getWebapp().setComponent(null); // controller.setWebapp(null); // WebappParser webAppParser = new WebappParser(component, uri, file); // try { // XmlPullParser xpp = Plugin.getDefault().getXmlPullParserPool().getPullParserFromPool(); // webAppParser.processDocument(xpp, file); // } catch (XmlPullParserException e) { // } catch (IOException e) { // } switch (delta.getKind()) { // case IResourceDelta.SYNC: // case IResourceDelta.ADDED: // // handle added resource // checkControllerXml(resource); // break; // case IResourceDelta.REMOVED: // // handle removed resource // checkControllerXml(resource); // break; case IResourceDelta.CHANGED: // handle changed resource checkControllerXml(resource); break; } } //return true to continue visiting children. return true; } } class ControllerXmlVisitor implements IResourceVisitor { public boolean visit(IResource resource) { checkControllerXml(resource); //return true to continue visiting children. return true; } } public static final String BUILDER_ID = "org.ofbiz.plugin.controllerXmlBuilder"; private static final String MARKER_TYPE = "org.ofbiz.plugin.xmlProblem"; private SAXParserFactory parserFactory; private void addMarker(IFile file, String message, int lineNumber, int severity) { try { IMarker marker = file.createMarker(MARKER_TYPE); marker.setAttribute(IMarker.MESSAGE, message); marker.setAttribute(IMarker.SEVERITY, severity); if (lineNumber == -1) { lineNumber = 1; } marker.setAttribute(IMarker.LINE_NUMBER, lineNumber); } catch (CoreException e) { } } /* * (non-Javadoc) * * @see org.eclipse.core.internal.events.InternalBuilder#build(int, * java.util.Map, org.eclipse.core.runtime.IProgressMonitor) */ protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException { if (kind == FULL_BUILD) { fullBuild(monitor); } else { IResourceDelta delta = getDelta(getProject()); if (delta == null) { fullBuild(monitor); } else { incrementalBuild(delta, monitor); } } return null; } void checkControllerXml(IResource resource) { if (resource instanceof IFile && resource.getName().endsWith("controller.xml")) { // OfbizModelSingleton.get(). Controller controller = ControllerHelper.getController((IFile) resource); if (controller == null) { //Maybe a parse error for the controller return; } IFile file = (IFile) resource; deleteMarkers(file); try { XmlPullParser xpp = Plugin.getDefault().getXmlPullParserPool().getPullParserFromPool(); new ControllerXmlParser(controller).processDocument(xpp, file); } catch (Exception e1) { } } } private class ControllerXmlParser extends Parser { private Controller controller; public ControllerXmlParser(Controller controller) { this.controller = controller; } @Override protected void processStartElement(XmlPullParser xpp) { String name = xpp.getName(); if (name.equals("view-map")) { String pageValue = xpp.getAttributeValue(null, "page"); if (xpp.getAttributeValue(null, "type").equals("screen")) { Screen screensByComponentName = ScreenHelper.getScreensByComponentName(controller.getComponent().getDirectory().getProject(), pageValue); if (screensByComponentName == null) { addMarker(file, "Couldn't find Screen", xpp.getLineNumber(), IMarker.SEVERITY_ERROR); } } else if (xpp.getAttributeValue(null, "type").equals("ftl")) { String page = pageValue; Controller controller = ControllerHelper.getController(file); IFile findMember; if (page.contains("component://")) { findMember = null; } else if (page.indexOf("/") == 0) { findMember = null; } else { findMember = (IFile) controller.getFile().getParent().getParent().findMember(page); } if (findMember == null) { addMarker(file, "Couldn't find ftl file", xpp.getLineNumber(), IMarker.SEVERITY_ERROR); } } } else if (name.equals("response")) { if (xpp.getAttributeValue(null, "type").equals("view")) { if (ControllerHelper.getHyperlinkForRequestValueView(xpp.getAttributeValue(null, "value"), file).size() == 0) { addMarker(file, "Couldn't find view", xpp.getLineNumber(), IMarker.SEVERITY_ERROR); } } else if (xpp.getAttributeValue(null, "type").equals("request")) { if (ControllerHelper.getHyperlinkForRequestValueRequest(xpp.getAttributeValue(null, "value"), file).size() == 0) { addMarker(file, "Couldn't find request", xpp.getLineNumber(), IMarker.SEVERITY_ERROR); } } } else if (name.equals("event")) { if (xpp.getAttributeValue(null, "type").equals("service")) { if (ServiceHelper.findServiceByName(xpp.getAttributeValue(null, "invoke"), controller.getComponent().getDirectory().getProject()).size() == 0) { addMarker(file, "Couldn't find service", xpp.getLineNumber(), IMarker.SEVERITY_ERROR); } } } } } private void deleteMarkers(IFile file) { try { file.deleteMarkers(MARKER_TYPE, false, IResource.DEPTH_ZERO); } catch (CoreException ce) { } } protected void fullBuild(final IProgressMonitor monitor) throws CoreException { try { getProject().accept(new ControllerXmlVisitor()); } catch (CoreException e) { } } protected void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) throws CoreException { // the visitor does the work. delta.accept(new SampleDeltaVisitor()); } }