Skip to content

Package: IDEViewModelRegistryImpl$1

IDEViewModelRegistryImpl$1

nameinstructionbranchcomplexitylinemethod
resourceChanged(IResourceChangeEvent)
M: 0 C: 92
100%
M: 2 C: 14
88%
M: 2 C: 7
78%
M: 0 C: 18
100%
M: 0 C: 1
100%
{...}
M: 0 C: 9
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2011-2015 EclipseSource Muenchen GmbH and others.
3: *
4: * All rights reserved. This program and the accompanying materials
5: * are made available under the terms of the Eclipse Public License 2.0
6: * which accompanies this distribution, and is available at
7: * https://www.eclipse.org/legal/epl-2.0/
8: *
9: * SPDX-License-Identifier: EPL-2.0
10: *
11: * Contributors:
12: * Eugen Neufeld - initial API and implementation
13: ******************************************************************************/
14: package org.eclipse.emf.ecp.ide.view.internal.service;
15:
16: import java.io.IOException;
17: import java.util.LinkedHashMap;
18: import java.util.LinkedHashSet;
19: import java.util.List;
20: import java.util.Map;
21: import java.util.Set;
22:
23: import org.eclipse.core.resources.IResourceChangeEvent;
24: import org.eclipse.core.resources.IResourceChangeListener;
25: import org.eclipse.core.resources.IResourceDelta;
26: import org.eclipse.core.resources.ResourcesPlugin;
27: import org.eclipse.emf.common.util.URI;
28: import org.eclipse.emf.ecp.ide.spi.util.EcoreHelper;
29: import org.eclipse.emf.ecp.ide.view.service.IDEViewModelRegistry;
30: import org.eclipse.emf.ecp.ide.view.service.ViewModelEditorCallback;
31: import org.eclipse.emf.ecp.view.spi.model.VView;
32:
33: /**
34: * An implementation of the {@link IDEViewModelRegistry}.
35: *
36: * @author Eugen Neufeld
37: * @author Alexandra Buzila
38: */
39: public class IDEViewModelRegistryImpl implements IDEViewModelRegistry {
40:
41:         private final Map<VView, ViewModelEditorCallback> viewModelViewModelEditorMapping = new LinkedHashMap<VView, ViewModelEditorCallback>();
42:
43:         private final Map<String, Set<VView>> ecoreViewMapping = new LinkedHashMap<String, Set<VView>>();
44:
45:         private final Map<VView, String> viewModelviewModelFileMapping = new LinkedHashMap<VView, String>();
46:
47:         private final Map<String, IResourceChangeListener> resourceChangeListeners = new LinkedHashMap<String, IResourceChangeListener>();
48:
49:         private final Map<String, Set<String>> viewToRelatedEcorePaths = new LinkedHashMap<String, Set<String>>();
50:
51:         @Override
52:         public void register(String ecorePath, VView viewModel) {
53:
54:                 final Set<String> otherRelatedWorkspaceURIs = new LinkedHashSet<String>();
55:                 for (final String viewModelEcorePath : viewModel.getEcorePaths()) {
56:                         otherRelatedWorkspaceURIs.addAll(EcoreHelper
57:                                 .getOtherRelatedWorkspacePaths(viewModelEcorePath));
58:                 }
59:
60:                 final Set<String> otherRelatedWorkspacePaths = new LinkedHashSet<String>();
61:                 for (final String uri : otherRelatedWorkspaceURIs) {
62:                         final URI platformURI = URI.createURI(uri);
63:                         final StringBuilder builder = new StringBuilder();
64:                         for (int i = 1; i < platformURI.segmentCount(); i++) {
65:                                 builder.append("/"); //$NON-NLS-1$
66:                                 builder.append(URI.createURI(uri).segment(i));
67:                         }
68:                         otherRelatedWorkspacePaths.add(builder.toString());
69:                 }
70:                 viewToRelatedEcorePaths.put(ecorePath, otherRelatedWorkspacePaths);
71:
72:                 if (!ecoreViewMapping.containsKey(ecorePath) || ecoreViewMapping.get(ecorePath).isEmpty()) {
73:                         if (ecoreViewMapping.get(ecorePath) == null) {
74:                                 ecoreViewMapping.put(ecorePath, new LinkedHashSet<VView>());
75:                         }
76:                         if (!resourceChangeListeners.containsKey(ecorePath)) {
77:                                 addECoreChangeListener(ecorePath);
78:                         }
79:                 }
80:                 ecoreViewMapping.get(ecorePath).add(viewModel);
81:         }
82:
83:         private void addECoreChangeListener(final String ecorePath) {
84:                 final IResourceChangeListener listener = new IResourceChangeListener() {
85:                         @Override
86:                         public void resourceChanged(IResourceChangeEvent event) {
87:                                 IResourceDelta delta = event.getDelta();
88:•                                if (delta != null) {
89:•                                        while (delta.getAffectedChildren().length != 0) {
90:                                                 delta = delta.getAffectedChildren()[0];
91:                                         }
92:•                                        for (final VView view : ecoreViewMapping.get(ecorePath)) {
93:                                                 final Set<String> ecorePathsToCheck = new LinkedHashSet<String>();
94:•                                                if (view.getEcorePaths() != null) {
95:                                                         ecorePathsToCheck.addAll(view.getEcorePaths());
96:                                                 }
97:•                                                if (viewToRelatedEcorePaths.containsKey(ecorePath)) {
98:                                                         ecorePathsToCheck.addAll(viewToRelatedEcorePaths.get(ecorePath));
99:                                                 }
100:•                                                for (final String path : ecorePathsToCheck) {
101:•                                                        if (delta.getResource().getFullPath().toString().contains(path)) {
102:                                                                 final ViewModelEditorCallback viewModelEditorCallback = viewModelViewModelEditorMapping
103:                                                                         .get(view);
104:•                                                                if (viewModelEditorCallback == null) {
105:                                                                         continue;
106:                                                                 }
107:                                                                 viewModelEditorCallback.signalEcoreOutOfSync();
108:                                                         }
109:                                                 }
110:                                         }
111:                                 }
112:                         }
113:                 };
114:                 ResourcesPlugin.getWorkspace().addResourceChangeListener(listener);
115:                 resourceChangeListeners.put(ecorePath, listener);
116:         }
117:
118:         @Override
119:         public void unregister(String registeredEcorePath, VView viewModel) {
120:                 if (ecoreViewMapping.containsKey(registeredEcorePath)) {
121:                         ecoreViewMapping.get(registeredEcorePath).remove(viewModel);
122:                         if (ecoreViewMapping.get(registeredEcorePath).size() == 0) {
123:                                 final IResourceChangeListener listener = resourceChangeListeners.get(registeredEcorePath);
124:                                 if (listener != null) {
125:                                         ResourcesPlugin.getWorkspace().removeResourceChangeListener(listener);
126:                                         resourceChangeListeners.remove(registeredEcorePath);
127:                                 }
128:                                 viewToRelatedEcorePaths.remove(registeredEcorePath);
129:                         }
130:                 }
131:         }
132:
133:         @Override
134:         public void registerViewModelEditor(VView viewModel, ViewModelEditorCallback viewModelEditor) throws IOException {
135:
136:                 viewModelViewModelEditorMapping.put(viewModel, viewModelEditor);
137:                 // final String ecorePath = viewModel.getEcorePath();
138:                 // if (ecorePath == null) {
139:                 // return;
140:                 // }
141:                 // EcoreHelper.registerEcore(ecorePath);
142:
143:         }
144:
145:         @Override
146:         public void unregisterViewModelEditor(VView viewModel, ViewModelEditorCallback viewModelEditor) {
147:                 viewModelViewModelEditorMapping.remove(viewModel);
148:                 final List<String> ecorePaths = viewModel.getEcorePaths();
149:                 for (final String ecorePath : ecorePaths) {
150:                         EcoreHelper.unregisterEcore(ecorePath);
151:                 }
152:         }
153:
154:         @Override
155:         public void registerViewModel(VView view, String path) {
156:                 if (!viewModelviewModelFileMapping.containsKey(view)) {
157:                         viewModelviewModelFileMapping.put(view, path);
158:                 }
159:         }
160: }