blob: e4e0569a55961d0b3dd1f387a08956b0858e64bb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2012 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.eclipse.bpel.ui;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import org.apache.xerces.parsers.SAXParser;
import org.apache.xerces.xni.Augmentations;
import org.apache.xerces.xni.QName;
import org.apache.xerces.xni.XMLAttributes;
import org.apache.xerces.xni.XNIException;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.core.runtime.content.IContentDescription;
import org.eclipse.core.runtime.content.ITextContentDescriber;
import org.xml.sax.InputSource;
/**
* @author Bob Brodt
*
* added for https://jira.jboss.org/browse/JBIDE-6006
*/
public class BPELContentDescriber implements ITextContentDescriber {
private static final String WSBPEL_2_NAMESPACE = "http://docs.oasis-open.org/wsbpel/2.0/process/executable"; //$NON-NLS-1$
// https://issues.jboss.org/browse/JBIDE-8068
private static final String WSBPEL_2_ABSTRACT_NAMESPACE = "http://docs.oasis-open.org/wsbpel/2.0/process/abstract"; //$NON-NLS-1$
private static final String ROOT_ELEMENT = "process"; //$NON-NLS-1$
private RootElementParser parser;
public BPELContentDescriber() {
}
public int describe(Reader contents, IContentDescription description) throws IOException {
return doDescribe(contents) == null ? INVALID : VALID;
}
public int describe(InputStream contents, IContentDescription description) throws IOException {
return describe(new InputStreamReader(contents), description);
}
private synchronized String doDescribe(Reader contents) throws IOException {
try {
InputSource source = new InputSource(contents);
parser = new RootElementParser();
parser.parse(source);
} catch (AcceptedException e) {
return e.acceptedRootElement;
} catch (RejectedException e) {
return null;
} catch (Exception e) {
return null;
}
finally {
parser = null;
}
return null;
}
public QualifiedName[] getSupportedOptions() {
return null;
}
private class RootElementParser extends SAXParser {
public void startElement(QName qName, XMLAttributes attributes, Augmentations augmentations) throws XNIException {
super.startElement(qName, attributes, augmentations);
if (ROOT_ELEMENT.equals(qName.localpart)) {
String namespace = fNamespaceContext.getURI(qName.prefix);
// https://issues.jboss.org/browse/JBIDE-8068
if (WSBPEL_2_NAMESPACE.equals(namespace) || WSBPEL_2_ABSTRACT_NAMESPACE.equals(namespace))
throw new AcceptedException(qName.localpart);
else
throw new RejectedException();
} else
throw new RejectedException();
}
}
private class AcceptedException extends RuntimeException {
public String acceptedRootElement;
public AcceptedException(String acceptedRootElement) {
this.acceptedRootElement = acceptedRootElement;
}
private static final long serialVersionUID = 1L;
}
private class RejectedException extends RuntimeException {
private static final long serialVersionUID = 1L;
}
}