blob: d735b7b19269f0600e821bf75b9f12af2b03a7ec [file] [log] [blame]
/*******************************************************************************
* 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;
}
}
}