diff options
Diffstat (limited to 'jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org')
2 files changed, 172 insertions, 78 deletions
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/CompositeComponentTaglibLocator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/CompositeComponentTaglibLocator.java index ddc72b84a..8cf8ced65 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/CompositeComponentTaglibLocator.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/CompositeComponentTaglibLocator.java @@ -6,9 +6,13 @@ import java.util.Map; import org.eclipse.core.resources.IProject; import org.eclipse.jst.jsf.common.internal.locator.ILocatorProvider; +import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResource; +import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResourceContainer; +import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResourceFragment; +import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResourceFragment.Type; import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResourceLocator; -import org.eclipse.jst.jsf.designtime.internal.resources.JSFResource; import org.eclipse.jst.jsf.designtime.internal.resources.JSFResourceChangeListener; +import org.eclipse.jst.jsf.designtime.internal.resources.JSFResourceContainer; import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.JSFResourceBasedTagRecord.Builder; import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.Listener.TaglibChangedEvent; import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.Listener.TaglibChangedEvent.CHANGE_TYPE; @@ -32,55 +36,103 @@ public class CompositeComponentTaglibLocator extends final Builder builder = new Builder(); switch (event.getChangeType()) { - case ADDED: - case CHANGED: - { - List<TaglibChangedEvent> events = Collections.EMPTY_LIST; - - if (event.getNewValue().isFragment()) + case ADDED: + case CHANGED: { - // if it's a fragment handle as a possible library add - events = handleFolderAddChange(event, builder); - } else - { - // otherwise, handle as a file add. - events = handleFileAddChange(event, builder); + handleAddAndChange(event, builder); } - _records = builder.merge(events, _records); - for (final TaglibChangedEvent fireEvent : events) + break; + case REMOVED: { - fireChangeEvent(fireEvent); + handleRemove(event, builder); } - } break; - case REMOVED: + } + } + + private void handleRemove(final JSFResourceChangedEvent event, + final Builder builder) + { + List<TaglibChangedEvent> events = Collections.EMPTY_LIST; + switch (event.getOldValue().getType()) { - final JSFResource oldValue = event.getOldValue(); - builder.addTag(oldValue, CHANGE_TYPE.REMOVED); - final List<TaglibChangedEvent> events = builder.createRemove( - CompositeComponentTaglibLocator.this, _records); - _records = builder.merge(events, _records); - for (final TaglibChangedEvent fireEvent : events) + case RESOURCE: { - fireChangeEvent(fireEvent); + events = handleRemoveResource(event, builder); } + break; + case CONTAINER: + { + events = handleRemoveContainer(event, builder); + } + break; + } + + _records = builder.merge(events, _records); + for (final TaglibChangedEvent fireEvent : events) + { + fireChangeEvent(fireEvent); } + } + + private List<TaglibChangedEvent> handleRemoveContainer( + final JSFResourceChangedEvent event, final Builder builder) + { + final IJSFResourceFragment oldValue = event.getOldValue(); + builder.addLibrary((IJSFResourceContainer) oldValue, + CHANGE_TYPE.REMOVED); + return builder.createRemove(CompositeComponentTaglibLocator.this, + _records); + } + + private List<TaglibChangedEvent> handleRemoveResource( + final JSFResourceChangedEvent event, final Builder builder) + { + final IJSFResourceFragment oldValue = event.getOldValue(); + builder.addTag((IJSFResource) oldValue, CHANGE_TYPE.REMOVED); + return builder.createRemove(CompositeComponentTaglibLocator.this, + _records); + } + + private void handleAddAndChange(final JSFResourceChangedEvent event, + final Builder builder) + { + List<TaglibChangedEvent> events = Collections.EMPTY_LIST; + + switch (event.getNewValue().getType()) + { + case CONTAINER: + // if it's a fragment handle as a possible library add + events = handleFolderAddChange(event, builder); break; + case RESOURCE: + // otherwise, handle as a file add. + events = handleFileAddChange(event, builder); + break; + } + + _records = builder.merge(events, _records); + + for (final TaglibChangedEvent fireEvent : events) + { + fireChangeEvent(fireEvent); } } private List<TaglibChangedEvent> handleFolderAddChange( - JSFResourceChangedEvent event, Builder builder) + final JSFResourceChangedEvent event, final Builder builder) { - final JSFResource newValue = event.getNewValue(); + final JSFResourceContainer newValue = (JSFResourceContainer) event + .getNewValue(); builder.addLibrary(newValue, CHANGE_TYPE.ADDED); - return builder.createMerge(CompositeComponentTaglibLocator.this, _records); + return builder.createMerge(CompositeComponentTaglibLocator.this, + _records); } private List<TaglibChangedEvent> handleFileAddChange( final JSFResourceChangedEvent event, final Builder builder) { - final JSFResource newValue = event.getNewValue(); + final IJSFResource newValue = (IJSFResource) event.getNewValue(); builder.addTag(newValue, CHANGE_TYPE.ADDED); return builder.createMerge(CompositeComponentTaglibLocator.this, _records); @@ -121,10 +173,14 @@ public class CompositeComponentTaglibLocator extends final Builder builder = new Builder(); for (final IJSFResourceLocator locator : _locatorProvider.getLocators()) { - final List<JSFResource> resources = locator.locate(initialContext); - for (final JSFResource resource : resources) + final List<IJSFResourceFragment> resources = locator + .locate(initialContext); + for (final IJSFResourceFragment resource : resources) { - builder.addTag(resource, CHANGE_TYPE.ADDED); + if (resource.getType() == Type.RESOURCE) + { + builder.addTag((IJSFResource) resource, CHANGE_TYPE.ADDED); + } } } _records = builder.build(); diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/JSFResourceBasedTagRecord.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/JSFResourceBasedTagRecord.java index 1b23add35..02f6fe857 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/JSFResourceBasedTagRecord.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/JSFResourceBasedTagRecord.java @@ -9,7 +9,8 @@ import java.util.Map; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; -import org.eclipse.jst.jsf.designtime.internal.resources.JSFResource; +import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResource; +import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResourceContainer; import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.Listener.TaglibChangedEvent; import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.Listener.TaglibChangedEvent.CHANGE_TYPE; import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFactory; @@ -119,24 +120,25 @@ public class JSFResourceBasedTagRecord extends FaceletTagRecord */ public static class Builder { + private static final List<FaceletTaglibTag> WHOLE_LIBRARY = new ArrayList<FaceletTaglibTag>( + 0); private final Map<String, List<FaceletTaglibTag>> _tags = new HashMap<String, List<FaceletTaglibTag>>(); private static final String FACELET_FILE_CONTENT_TYPE = "org.eclipse.wst.html.core.htmlsource"; //$NON-NLS-1$ /** * @param jsfResource - * @param changeType + * @param changeType */ - public void addTag(final JSFResource jsfResource, + public void addTag(final IJSFResource jsfResource, final CHANGE_TYPE changeType) { - String libraryName = jsfResource.getId().getLibraryName(); + final String libraryName = jsfResource.getId().getLibraryName(); if (libraryName == null) { return; } - final String uri = String - .format( - "http://java.sun.com/jsf/composite/%s", libraryName); //$NON-NLS-1$ + final String uri = String.format( + "http://java.sun.com/jsf/composite/%s", libraryName); //$NON-NLS-1$ List<FaceletTaglibTag> tags = _tags.get(uri); if (tags == null) { @@ -152,42 +154,53 @@ public class JSFResourceBasedTagRecord extends FaceletTagRecord switch (changeType) { - case ADDED: - case CHANGED: - // only add to the list on a add/change if the resource exists - // and is the right type - if (jsfResource.isAccessible() - && jsfResource.isContentType(FACELET_FILE_CONTENT_TYPE)) - { + case ADDED: + case CHANGED: + // only add to the list on a add/change if the resource + // exists + // and is the right type + if (jsfResource.isAccessible() + && jsfResource + .isContentType(FACELET_FILE_CONTENT_TYPE)) + { + tags.add(tag); + } + break; + case REMOVED: + // add all comers to the remove list. There will only be + // removal + // on merge if ADDED/CHANGED path decided they should be + // there. tags.add(tag); - } break; - case REMOVED: - // add all comers to the remove list. They will only be removal - // on merge if ADDED/CHANGED path decided they should be there. - tags.add(tag); } } /** * @param jsfResource - * @param added + * @param changeType */ - public void addLibrary(JSFResource jsfResource, CHANGE_TYPE added) + public void addLibrary(final IJSFResourceContainer jsfResource, + final CHANGE_TYPE changeType) { - String libraryName = jsfResource.getId().getLibraryName(); + final String libraryName = jsfResource.getId().getLibraryName(); if (libraryName == null) { return; } - final String uri = String - .format( - "http://java.sun.com/jsf/composite/%s", libraryName); //$NON-NLS-1$ - List<FaceletTaglibTag> tags = _tags.get(uri); - if (tags == null) + final String uri = String.format( + "http://java.sun.com/jsf/composite/%s", libraryName); //$NON-NLS-1$ + if (changeType == CHANGE_TYPE.REMOVED) { - tags = new ArrayList<FaceletTaglibTag>(); - _tags.put(uri, tags); + _tags.put(uri, WHOLE_LIBRARY); + } else + { + List<FaceletTaglibTag> tags = _tags.get(uri); + if (tags == null) + { + tags = new ArrayList<FaceletTaglibTag>(); + _tags.put(uri, tags); + } } } @@ -230,9 +243,9 @@ public class JSFResourceBasedTagRecord extends FaceletTagRecord .getValue(), CHANGE_TYPE.ADDED); } else { - JSFResourceBasedTagRecord oldRecord = records.get(entry - .getKey()); - JSFResourceBasedTagRecord newRecord = oldRecord + final JSFResourceBasedTagRecord oldRecord = records + .get(entry.getKey()); + final JSFResourceBasedTagRecord newRecord = oldRecord .mergeTags(entry.getValue()._tags); event = new TaglibChangedEvent(locator, oldRecord, newRecord, CHANGE_TYPE.CHANGED); @@ -249,8 +262,8 @@ public class JSFResourceBasedTagRecord extends FaceletTagRecord * _tags from records. */ public List<TaglibChangedEvent> createRemove( - AbstractFaceletTaglibLocator locator, - Map<String, JSFResourceBasedTagRecord> records) + final AbstractFaceletTaglibLocator locator, + final Map<String, JSFResourceBasedTagRecord> records) { final Map<String, JSFResourceBasedTagRecord> newRecords = build(); final List<TaglibChangedEvent> mergeEvents = new ArrayList<TaglibChangedEvent>(); @@ -258,21 +271,29 @@ public class JSFResourceBasedTagRecord extends FaceletTagRecord .entrySet()) { TaglibChangedEvent event = null; + final JSFResourceBasedTagRecord oldRecord = records + .get(entry.getKey()); + if (oldRecord != null) { - JSFResourceBasedTagRecord oldRecord = records.get(entry - .getKey()); - if (oldRecord != null) + final List<FaceletTaglibTag> tags = entry.getValue()._tags; + if (tags == WHOLE_LIBRARY) + { + event = new TaglibChangedEvent(locator, oldRecord, + null, CHANGE_TYPE.REMOVED); + } else { - JSFResourceBasedTagRecord newRecord = oldRecord + final JSFResourceBasedTagRecord newRecord = oldRecord .removeTags(entry.getValue()._tags); event = new TaglibChangedEvent(locator, oldRecord, newRecord, CHANGE_TYPE.CHANGED); } } - mergeEvents.add(event); + if (event != null) + { + mergeEvents.add(event); + } } return mergeEvents; - } /** @@ -282,19 +303,36 @@ public class JSFResourceBasedTagRecord extends FaceletTagRecord * here. */ public Map<String, JSFResourceBasedTagRecord> merge( - List<TaglibChangedEvent> events, + final List<TaglibChangedEvent> events, final Map<String, JSFResourceBasedTagRecord> withThese) { final Map<String, JSFResourceBasedTagRecord> newMap = new HashMap<String, JSFResourceBasedTagRecord>( withThese); for (final TaglibChangedEvent event : events) { - IFaceletTagRecord newRecord = event.getNewValue(); - // doubles as null check - if (newRecord instanceof JSFResourceBasedTagRecord) + switch (event.getChangeType()) { - newMap.put(newRecord.getURI(), - (JSFResourceBasedTagRecord) newRecord); + case ADDED: + case CHANGED: + { + final IFaceletTagRecord newRecord = event.getNewValue(); + // doubles as null check + if (newRecord instanceof JSFResourceBasedTagRecord) + { + newMap.put(newRecord.getURI(), + (JSFResourceBasedTagRecord) newRecord); + } + } + break; + case REMOVED: + { + final IFaceletTagRecord oldRecord = event.getOldValue(); + if (oldRecord != null) + { + newMap.remove(oldRecord.getURI()); + } + } + break; } } return newMap; |