catch up with branch daily Signed-off-by: Ralf Mollik <ramollik@compex-commerce.com>
diff --git a/org.eclipse.osbp.ide.core.ui.softwarefactory/src/org/eclipse/osbp/ide/core/ui/softwarefactory/builder/OSBP2Builder.java b/org.eclipse.osbp.ide.core.ui.softwarefactory/src/org/eclipse/osbp/ide/core/ui/softwarefactory/builder/OSBP2Builder.java index a5b1341..07ae06f 100644 --- a/org.eclipse.osbp.ide.core.ui.softwarefactory/src/org/eclipse/osbp/ide/core/ui/softwarefactory/builder/OSBP2Builder.java +++ b/org.eclipse.osbp.ide.core.ui.softwarefactory/src/org/eclipse/osbp/ide/core/ui/softwarefactory/builder/OSBP2Builder.java
@@ -14,11 +14,9 @@ */ package org.eclipse.osbp.ide.core.ui.softwarefactory.builder; -import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -32,71 +30,32 @@ import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.IResourceVisitor; -import org.eclipse.core.resources.IStorage; +import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.ProgressMonitorWrapper; import org.eclipse.core.runtime.SubMonitor; -import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.common.util.WrappedException; -import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; -import org.eclipse.emf.ecore.util.EcoreUtil; -import org.eclipse.osbp.dsl.semantic.common.types.LType; -import org.eclipse.osbp.dsl.semantic.common.types.LTypedPackage; -import org.eclipse.osbp.dsl.semantic.entity.LBean; -import org.eclipse.osbp.dsl.semantic.entity.LEntity; -import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute; -import org.eclipse.osbp.dsl.semantic.entity.LEntityModel; import org.eclipse.osbp.ide.core.ui.softwarefactory.constants.Constants; import org.eclipse.osbp.ide.core.ui.softwarefactory.extender.IModelExtenderProvider; import org.eclipse.osbp.ide.core.ui.softwarefactory.extender.IModelExtenderProvider.Event.Listener; import org.eclipse.osbp.ide.core.ui.softwarefactory.extender.ModelExtendedEvent; import org.eclipse.osbp.ide.core.ui.softwarefactory.extender.ModelExtenderUtils; import org.eclipse.osbp.ide.core.ui.softwarefactory.extender.ModelInstanceDescription; -import org.eclipse.osbp.xtext.action.ActionModel; -import org.eclipse.osbp.xtext.action.ActionPackage; -import org.eclipse.osbp.xtext.action.ActionToolbar; -import org.eclipse.osbp.xtext.addons.EObjectHelper; -import org.eclipse.osbp.xtext.authorizationdsl.AuthorizationModel; -import org.eclipse.osbp.xtext.authorizationdsl.Role; -import org.eclipse.osbp.xtext.datainterchange.DataInterchange; -import org.eclipse.osbp.xtext.datainterchange.DataInterchangeGroup; -import org.eclipse.osbp.xtext.datainterchange.DataInterchangeModel; -import org.eclipse.osbp.xtext.datainterchange.DataInterchangePackage; -import org.eclipse.osbp.xtext.datamartdsl.AxisEnum; -import org.eclipse.osbp.xtext.datamartdsl.DatamartAttribute; -import org.eclipse.osbp.xtext.datamartdsl.DatamartAxis; -import org.eclipse.osbp.xtext.datamartdsl.DatamartDSLFactory; -import org.eclipse.osbp.xtext.datamartdsl.DatamartDSLPackage; -import org.eclipse.osbp.xtext.datamartdsl.DatamartDefinition; -import org.eclipse.osbp.xtext.datamartdsl.DatamartEntity; -import org.eclipse.osbp.xtext.datamartdsl.DatamartModel; -import org.eclipse.osbp.xtext.datamartdsl.DatamartPackage; -import org.eclipse.xtext.resource.IReferenceDescription; import org.eclipse.xtext.resource.XtextResourceSet; import org.eclipse.xtext.ui.editor.findrefs.IReferenceFinder; -import org.eclipse.xtext.ui.resource.IStorage2UriMapper; import org.eclipse.xtext.ui.resource.XtextResourceSetProvider; -import org.eclipse.xtext.util.IAcceptor; -import org.eclipse.xtext.util.Pair; import org.eclipse.xtext.util.concurrent.IUnitOfWork; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.inject.Inject; -class DatamartMetadata { - IProject project; - Resource resource; - DatamartModel datamartModel; - List<DatamartEntity> trackingEntities; -} - public class OSBP2Builder extends IncrementalProjectBuilder { public static final String BUILDER_ID = Constants.BUILDER_ID; @@ -118,32 +77,60 @@ public static final String UIMODEL_MODEL_EXTENSION = "ui"; public static final String PERSPECTIVE_MODEL_EXTENSION = "perspective"; public static final String MENU_MODEL_EXTENSION = "menu"; - - Set<String> doNotTouchExtensions = new HashSet<>(); - { - doNotTouchExtensions.add(ENTITY_MODEL_EXTENSION); - doNotTouchExtensions.add(DTO_MODEL_EXTENSION); - doNotTouchExtensions.add(SERVICE_MODEL_EXTENSION); - } + + @SuppressWarnings("serial") + private Map<String, List<String>> dependencyTree = new HashMap<String, List<String>>() {{ //NOSONAR + put("datatype", new ArrayList<String>() {{ // NOSONAR + add("entity"); + add("dialog"); + }}); + put("entity", new ArrayList<String>() {{ // NOSONAR + add("datamart"); + add("datainterchange"); + }}); + put("dto", new ArrayList<String>() {{ // NOSONAR + add("dialog"); + add("ui"); + add("statemachine"); + add("functionlibrary"); + add("entitymock"); + add("blip"); + }}); + put("datamart", new ArrayList<String>() {{ // NOSONAR + add("report"); + add("table"); + add("chart"); + }}); + put("data", new ArrayList<String>() {{ // NOSONAR + add("action"); + add("entitymock"); + }}); + put("functionlibrary", new ArrayList<String>() {{ // NOSONAR + add("action"); + add("statemachine"); + add("blip"); + }}); + put("authorization", new ArrayList<String>() {{ // NOSONAR + add("dialog"); + }}); + put("message", new ArrayList<String>() {{ // NOSONAR + add("action"); + }}); + }}; @Inject private XtextResourceSetProvider rsProvider; @Inject - private IReferenceFinder referenceFinder; - - @Inject - private IStorage2UriMapper uriStorageMapper; - - @Inject private IModelExtenderProvider.Event.Source modelExtenderBuilder; + @Inject + private IWorkspace workspace; + private boolean firstBuild = true; @Override protected IProject[] build(int kind, Map<String, String> args, IProgressMonitor monitor) throws CoreException { - LOGGER.info("build started for {}", getProject()); - long startTime = System.currentTimeMillis(); SubMonitor progress = null; boolean isModelExtending = false; @@ -203,7 +190,6 @@ if (progress != null) { progress.done(); } - LOGGER.info("Build {} in {} ms", getProject().getName(), System.currentTimeMillis() - startTime); } } if (!extensionsRebuilt.isEmpty()) { @@ -220,29 +206,46 @@ } private boolean checkFile(IFile file) { - if (file.getFileExtension() != null) { - try { - if (file.getFileExtension().equals(ENTITY_MODEL_EXTENSION)) { - modifyModel(file); - touchReferenced(file); + return buildUpstream(file.getFileExtension()); + } + + private boolean buildUpstream(String extension) { + if(!dependencyTree.containsKey(extension)) { + return false; + } + for(String depExt:dependencyTree.get(extension)) { + LOGGER.debug("****** must rebuild {}", depExt); + for(IProject project:workspace.getRoot().getProjects()) { + if(depExt.equals(project.getFileExtension())) { + LOGGER.debug("****** rebuild {}", project.getName()); + XtextResourceSet resourceSet = (XtextResourceSet) rsProvider.get(project); + Set<String> result = new HashSet<>(); + try { + project.accept(new IResourceVisitor() { + + @Override + public boolean visit(IResource resource) throws CoreException { + if (resource.getType() == IResource.FILE) { + IFile file = (IFile) resource; + if (depExt.equalsIgnoreCase(file.getFileExtension()) && !file.getFullPath().toString().contains("target/classes")) { + result.add(file.getFullPath().toString()); + } + } + return true; + } + }); + } catch (CoreException e) { + LOGGER.error("{}", e); + } + for(String uri:result) { + org.eclipse.emf.common.util.URI dslURI = org.eclipse.emf.common.util.URI.createPlatformResourceURI(uri, false); + Resource resource = resourceSet.getResource(dslURI, true); + ModelExtenderUtils.writeResource(resource, project.getName()); + } } - if (file.getFileExtension().equals(AUTHORIZATION_MODEL_EXTENSION)) { - touchReferenced(file); - } - if (file.getFileExtension().equals(DATAMART_MODEL_EXTENSION)) { - touchReferenced(file); - } - if (file.getFileExtension().equals(ACTION_MODEL_EXTENSION)) { - touchReferenced(file); - } - if (file.getFileExtension().equals(DATAINTERCHANGE_MODEL_EXTENSION)) { - touchReferenced(file); - } - } catch (IOException e) { // NOSONAR - is logged - LOGGER.error(e.getLocalizedMessage()); } } - return false; + return true; } /** @@ -321,255 +324,6 @@ } /** - * touches all model resources referencing this root model resource file - * - * @param modifiedFile - */ - protected void touchReferenced(IFile modifiedFile) throws IOException { - if (modifiedFile == null) { - return; - } - - EObject model = loadSemanticModel(modifiedFile); - if (model == null) { - LOGGER.error("Skipping build since SemanticModel could not be loaded from {}", modifiedFile.getName()); - return; - } - - if (model instanceof LEntityModel) { - LEntityModel entityModel = (LEntityModel) model; - Set<URI> lTypes = new HashSet<>(); - for (LTypedPackage entityPkg : entityModel.getPackages()) { - for (LType lType : entityPkg.getTypes()) { - lTypes.add(EcoreUtil.getURI(lType)); - } - } - touchReferencingModel(modifiedFile.getName(), lTypes, model.eResource().getResourceSet()); - } - - if (model instanceof AuthorizationModel) { - AuthorizationModel authorizationModel = (AuthorizationModel) model; - Set<URI> roles = new HashSet<>(); - for (Role role : authorizationModel.getPckg().getRoles()) { - roles.add(EcoreUtil.getURI(role)); - } - touchReferencingModel(modifiedFile.getName(), roles, model.eResource().getResourceSet()); - } - - if (model instanceof DatamartModel) { - DatamartModel datamartModel = (DatamartModel) model; - Set<URI> datamarts = new HashSet<>(); - for (DatamartPackage datamartPkg : datamartModel.getPackages()) { - for (DatamartDefinition datamart : datamartPkg.getDefinitions()) { - datamarts.add(EcoreUtil.getURI(datamart)); - } - } - touchReferencingModel(modifiedFile.getName(), datamarts, model.eResource().getResourceSet()); - } - if (model instanceof ActionModel) { - ActionModel actionModel = (ActionModel) model; - Set<URI> actionToolbars = new HashSet<>(); - for (ActionPackage actionPkg : actionModel.getPackages()) { - for (ActionToolbar actionToolbar : actionPkg.getToolbars()) { - actionToolbars.add(EcoreUtil.getURI(actionToolbar)); // NOSONAR - } - } - touchReferencingModel(modifiedFile.getName(), actionToolbars, model.eResource().getResourceSet()); - } - if (model instanceof DataInterchangeModel) { - DataInterchangeModel dataInterchangeModel = (DataInterchangeModel) model; - Set<URI> dataInterchanges = new HashSet<>(); - for (DataInterchangePackage actionPkg : dataInterchangeModel.getPackages()) { - for (DataInterchangeGroup group : actionPkg.getGroups()) { - for (DataInterchange dataInterchange : group.getDatInts()) { - dataInterchanges.add(EcoreUtil.getURI(dataInterchange)); // NOSONAR - } - } - } - touchReferencingModel(modifiedFile.getName(), dataInterchanges, model.eResource().getResourceSet()); - } - } - - protected boolean shouldTouch(IReferenceDescription t) { - URI sourceResourceURI = t.getSourceEObjectUri().trimFragment(); - URI targetResourceURI = t.getTargetEObjectUri().trimFragment(); - if (sourceResourceURI.equals(targetResourceURI)) { - // reference points to an EObject in same resource - return false; - } - - // if defined in set to not touch - return !doNotTouchExtensions.contains(sourceResourceURI.fileExtension()); - } - - protected void touchReferencingModel(String triggerModel, Set<URI> items, ResourceSet sourceResourceSet) { - final List<IReferenceDescription> referenceTargets = new ArrayList<>(); - referenceFinder.findAllReferences(items, new LocalResourceAccess(sourceResourceSet), - new IAcceptor<IReferenceDescription>() { - @Override - public void accept(IReferenceDescription t) { - if (shouldTouch(t) && !referenceTargets.contains(t)) { - referenceTargets.add(t); - } - } - }, null); - - List<Resource> affectedResources = new LinkedList<>(); - Map<IProject, XtextResourceSet> targetResourceSets = new HashMap<>(); - for (IReferenceDescription desc : referenceTargets) { - IProject project = null; - Iterable<Pair<IStorage, IProject>> pairs = uriStorageMapper.getStorages(desc.getSourceEObjectUri()); - if (pairs.iterator().hasNext()) { - project = pairs.iterator().next().getSecond(); - } - - if (project == null) { - LOGGER.error("No project could be found for {}", desc.getSourceEObjectUri()); - continue; - } - - XtextResourceSet resourceSet; - if (targetResourceSets.containsKey(project)) { - resourceSet = targetResourceSets.get(project); - } else { - resourceSet = (XtextResourceSet) rsProvider.get(getProject()); - targetResourceSets.put(project, resourceSet); - } - - // load the resource by the resource set - Resource modelResource = resourceSet.getResource(desc.getSourceEObjectUri().trimFragment(), true); - if (!affectedResources.contains(modelResource)) { - affectedResources.add(modelResource); - } - } - for (Resource resource : affectedResources) { - ModelExtenderUtils.writeResource(resource, triggerModel); - } - } - - /** - * Modifies the datamart model for which the changed entity model has a - * tracking reference match. - * - * @param modifiedFile - */ - protected void modifyModel(IFile modifiedFile) { - if (modifiedFile == null) { - return; - } - - LEntityModel lEntityModel = loadSemanticModel(modifiedFile); - if (lEntityModel == null) { - LOGGER.error("Skipping datamart build since SemanticModel can not be loaded from file {}", modifiedFile.getName()); - return; - } - - Set<URI> entities = new HashSet<>(); - for (LTypedPackage lPkg : lEntityModel.getPackages()) { - for (LType lType : lPkg.getTypes()) { - if (lType instanceof LEntity) { - entities.add(EcoreUtil.getURI(lType)); - } - } - } - - final List<IReferenceDescription> referenceTargets = new ArrayList<>(); - referenceFinder.findAllReferences(entities, new LocalResourceAccess(lEntityModel.eResource().getResourceSet()), - new IAcceptor<IReferenceDescription>() { - @Override - public void accept(IReferenceDescription t) { - if (t.getEReference() == DatamartDSLPackage.Literals.DATAMART_ENTITY__ENTITY_REF) { - referenceTargets.add(t); - } - } - }, null); - - List<Resource> affectedResources = new LinkedList<>(); - Map<IProject, XtextResourceSet> datamartResourceSets = new HashMap<>(); - for (IReferenceDescription desc : referenceTargets) { - IProject datamartProject = null; - Iterable<Pair<IStorage, IProject>> pairs = uriStorageMapper.getStorages(desc.getSourceEObjectUri()); - if (pairs.iterator().hasNext()) { - datamartProject = pairs.iterator().next().getSecond(); - } - - if (datamartProject == null) { - LOGGER.error("No project could be found for {}", desc.getSourceEObjectUri()); - continue; - } - - XtextResourceSet resourceSet; - if (datamartResourceSets.containsKey(datamartProject)) { - resourceSet = datamartResourceSets.get(datamartProject); - } else { - resourceSet = (XtextResourceSet) rsProvider.get(getProject()); - datamartResourceSets.put(datamartProject, resourceSet); - } - - // load the resource by the resource set - Resource datamartModelResource = resourceSet.getResource(desc.getSourceEObjectUri().trimFragment(), true); - DatamartEntity dmEntity = (DatamartEntity) EObjectHelper.getSemanticElement(datamartModelResource, - desc.getSourceEObjectUri().fragment()); - - if (!dmEntity.isTracking()) { - continue; - } - - if (!affectedResources.contains(datamartModelResource)) { - affectedResources.add(datamartModelResource); - } - - // clear properties section - DatamartDSLFactory dmFactory = DatamartDSLFactory.eINSTANCE; - EList<DatamartAttribute> properties = dmEntity.getAttributes(); - if (properties != null) { - properties.clear(); - // rebuild properties section - for (LEntityAttribute eAttr : dmEntity.getEntityRef().getAllAttributes()) { - if (!eAttr.isId() && !eAttr.isUuid() && !eAttr.isVersion() && !(eAttr.getType() instanceof LBean)) { - DatamartAxis axis = dmFactory.createDatamartAxis(); - axis.setName(AxisEnum.COLUMNS); - DatamartAttribute attribute = dmFactory.createDatamartAttribute(); - attribute.setAggregated(false); - attribute.setScaled(false); - attribute.setAxis(axis); - attribute.setAttributeRef(eAttr); - properties.add(attribute); - } - } - } - } - - for (Resource resource : affectedResources) { - ModelExtenderUtils.writeResource(resource, DATAMART_MODEL_EXTENSION); - } - } - - /** - * Returns the entityModel which is to be build, identified by file. - * - * @param file - * @return - */ - protected <A extends EObject> A loadSemanticModel(IFile file) { - LOGGER.info("loading {}", file.getName()); - org.eclipse.emf.common.util.URI entityDSLURI = org.eclipse.emf.common.util.URI - .createPlatformResourceURI(file.getFullPath().toString(), false); - XtextResourceSet rs = (XtextResourceSet) rsProvider.get(getProject()); - Resource entityResource = rs.getResource(entityDSLURI, true); - try { - entityResource.load(null); - } catch (IOException e) { // NOSONAR - is logged - LOGGER.error(e.getLocalizedMessage()); - return null; - } - @SuppressWarnings("unchecked") - A entityModel = (A) EObjectHelper.getSemanticElement(entityResource); - LOGGER.info("finished loading {}", file.getName()); - return entityModel; - } - - /** * Returns true, if delta is from our projectentity is contained in * entityModel. *
diff --git a/org.eclipse.osbp.ide.core.ui.softwarefactory/src/org/eclipse/osbp/ide/core/ui/softwarefactory/extender/ModelExtenderUtils.java b/org.eclipse.osbp.ide.core.ui.softwarefactory/src/org/eclipse/osbp/ide/core/ui/softwarefactory/extender/ModelExtenderUtils.java index af74623..5653634 100644 --- a/org.eclipse.osbp.ide.core.ui.softwarefactory/src/org/eclipse/osbp/ide/core/ui/softwarefactory/extender/ModelExtenderUtils.java +++ b/org.eclipse.osbp.ide.core.ui.softwarefactory/src/org/eclipse/osbp/ide/core/ui/softwarefactory/extender/ModelExtenderUtils.java
@@ -93,10 +93,8 @@ public static void writeResource(Resource resource, String id) { StringBuilder errors = new StringBuilder(); try { - LOGGER.info("running diagnostic for {}", resource.getURI()); XtextResource xR = (XtextResource) resource; if (xR.getErrors().isEmpty()) { - LOGGER.info("writing {}", id); resource.save(SaveOptions.newBuilder().format().getOptions().toOptionsMap()); } else { for(org.eclipse.emf.ecore.resource.Resource.Diagnostic error:xR.getErrors()) { @@ -107,7 +105,7 @@ LOGGER.error("model {} diagnosic error {}", resource.getURI(), errors); LOGGER.error("****************************"); } - LOGGER.info("finished writing {}", resource.getURI()); + LOGGER.info("****** finished writing {}", id); } catch (IOException e) { LOGGER.error("{}", e); }