| /******************************************************************************* |
| * Copyright (c) 2007 Oracle Corporation. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Oracle - initial API and implementation |
| * |
| ********************************************************************************/ |
| package org.eclipse.jst.jsf.core.metadata.internal; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.jst.jsf.common.metadata.internal.AbstractMetaDataLocator; |
| import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator; |
| import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider; |
| import org.eclipse.jst.jsf.common.metadata.internal.IPathSensitiveMetaDataLocator; |
| import org.eclipse.jst.jsf.core.internal.tld.CMUtil; |
| import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentFactoryTLD; |
| import org.eclipse.jst.jsp.core.taglib.ITaglibRecord; |
| import org.eclipse.jst.jsp.core.taglib.TaglibIndex; |
| import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocumentFactory; |
| import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument; |
| import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType; |
| |
| /** |
| * Locator of tag library meta data |
| * |
| */ |
| public class TaglibMetaDataLocator extends AbstractMetaDataLocator implements IPathSensitiveMetaDataLocator{ |
| //project must be set to the current project context during locate only... should not be used when noifying observers |
| private IProject _project; |
| private TaglibMetaDataSource _source; |
| |
| // private boolean _notificationEventOccuring; |
| |
| /** |
| * Constructor |
| */ |
| public TaglibMetaDataLocator(){ |
| super(); |
| } |
| |
| public List/*<IMetaDataModelProvider>*/ locateMetaDataModelProviders(String uri) { |
| List ret = new ArrayList(); |
| CMDocument doc = null; |
| |
| if (uri == null){ |
| return ret; |
| } |
| else if (uri.equalsIgnoreCase(CMDocType.HTML_DOC_TYPE)){ |
| doc = HTMLCMDocumentFactory.getCMDocument(CMDocType.HTML_DOC_TYPE); |
| } |
| else if (uri.equalsIgnoreCase(CMDocType.JSP11_DOC_TYPE)){ |
| doc = HTMLCMDocumentFactory.getCMDocument(CMDocType.JSP11_DOC_TYPE); |
| } |
| else if (uri.equalsIgnoreCase(CMDocType.JSP12_DOC_TYPE)){ |
| doc = HTMLCMDocumentFactory.getCMDocument(CMDocType.JSP12_DOC_TYPE); |
| } |
| else if (uri.equalsIgnoreCase(CMDocType.JSP20_DOC_TYPE)){ |
| doc = HTMLCMDocumentFactory.getCMDocument(CMDocType.JSP20_DOC_TYPE); |
| } |
| else if (_project != null ){//TLD |
| CMDocumentFactoryTLD factory = new CMDocumentFactoryTLD(); |
| ITaglibRecord[] tldRecs = TaglibIndex.getAvailableTaglibRecords(_project.getFullPath()); |
| ITaglibRecord tldRec = findTLD(tldRecs, uri); |
| if (tldRec != null) |
| doc = factory.createCMDocument(tldRec); |
| } |
| |
| if (doc != null){ |
| _source = new TaglibMetaDataSource(doc); |
| ret.add(_source); |
| } |
| |
| return ret; |
| } |
| |
| private ITaglibRecord findTLD(ITaglibRecord[] tldRecs, String uri) { |
| for (int i=0;i<tldRecs.length;i++){ |
| ITaglibRecord tldRec = tldRecs[i]; |
| String tldRecURI = CMUtil.getURIFromTaglibRecord(tldRec, _project); |
| if (uri.equals(tldRecURI)) |
| return tldRec; |
| } |
| |
| return null; |
| } |
| |
| public void startLocating() { |
| // TaglibIndex.addTaglibIndexListener(this); |
| } |
| public void stopLocating() { |
| // TaglibIndex.removeTaglibIndexListener(this);//non-api call.... danger |
| } |
| |
| //not currently listening, so will not be called |
| // public void indexChanged(ITaglibIndexDelta delta) { |
| //// System.out.println("-----------------------"); //$NON-NLS-1$ |
| // if (delta.getProject() == _project) { |
| // for (ITaglibIndexDelta d : delta.getAffectedChildren()) { |
| // System.out.println(">>delta: "+d.getTaglibRecord()+"\n"+d.getKind()); //$NON-NLS-1$ //$NON-NLS-2$ |
| // String eventURI = CMUtil.createURIFromTaglibRecord(d.getTaglibRecord(), _project); |
| // if (eventURI != null){ |
| //// System.out.println(">>>eventURI: "+eventURI); //$NON-NLS-1$ |
| // if (!_notificationEventOccuring){ |
| // try { |
| // _notificationEventOccuring = true; |
| // int type = adaptTagLibEvent(delta); |
| // IMetaDataChangeNotificationEvent mdEvent = new MetaDataChangeNotificationEvent(this, eventURI, type); |
| // fireEvent(mdEvent); |
| // } finally { |
| // _notificationEventOccuring = false; |
| // } |
| // } |
| // } |
| // } |
| // } |
| // } |
| |
| // private int adaptTagLibEvent(ITaglibIndexDelta event) { |
| // switch (event.getKind()){ |
| // case ITaglibIndexDelta.ADDED: |
| // return IMetaDataChangeNotificationEvent.ADDED; |
| // case ITaglibIndexDelta.REMOVED: |
| // return IMetaDataChangeNotificationEvent.REMOVED; |
| // default: |
| // return IMetaDataChangeNotificationEvent.CHANGED; |
| // } |
| // } |
| // |
| // private void fireEvent(final IMetaDataChangeNotificationEvent event) { |
| // SafeRunnable.run(new ISafeRunnable(){ |
| // |
| // public void handleException(Throwable exception) { |
| // // TODO Auto-generated method stub |
| // } |
| // |
| // public void run() throws Exception { |
| // Iterator it = getObservers().iterator(); |
| // while (it.hasNext()){ |
| // IMetaDataObserver observer = (IMetaDataObserver)it.next(); |
| // observer.notifyMetadataChanged(event); |
| // } |
| // } |
| // |
| // }); |
| // |
| // } |
| |
| public void setProjectContext(IProject project) { |
| this._project = project; |
| } |
| |
| private class TaglibMetaDataSource implements IMetaDataSourceModelProvider{ |
| |
| private CMDocument doc; |
| private IMetaDataLocator locator; |
| |
| TaglibMetaDataSource(CMDocument doc){ |
| super(); |
| this.doc = doc; |
| } |
| |
| public Object getSourceModel() { |
| return doc; |
| } |
| |
| public IMetaDataLocator getLocator() { |
| return locator; |
| } |
| |
| public void setLocator(IMetaDataLocator locator) { |
| this.locator = locator; |
| } |
| |
| public Object getAdapter(Class klass) { |
| return null; |
| } |
| } |
| |
| } |