Skip to content

Commit

Permalink
Prod branch: Fixing BPMN2.0 Serialization to work in JBoss. Implement…
Browse files Browse the repository at this point in the history
…ation of class ClassFinder didn't work in JBoss

git-svn-id: http://oryx-editor.googlecode.com/svn/branches/prod@3370 d672c736-503d-0410-a38a-9366997c882b
  • Loading branch information
NicoPeters.NP authored and NicoPeters.NP committed Mar 17, 2010
1 parent d15f7fe commit 1bfe68f
Show file tree
Hide file tree
Showing 6 changed files with 129 additions and 120 deletions.
118 changes: 59 additions & 59 deletions editor/server/src/de/hpi/bpmn2_0/BPMNSerializationTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,65 +60,65 @@ public static void toBpmn2_0() throws Exception {

public static void toBpmn2_0(File json) throws Exception {

BufferedReader br = new BufferedReader(new FileReader(json));
String bpmnJson = "";
String line;
while ((line = br.readLine()) != null) {
bpmnJson += line;
}
Diagram diagram = DiagramBuilder.parseJson(bpmnJson);

Diagram2BpmnConverter converter = new Diagram2BpmnConverter(diagram);
Definitions def = converter.getDefinitionsFromDiagram();

// def.getOtherAttributes().put(new QName("xmlns:local"), "nurlokal");

// final XMLStreamWriter xmlStreamWriter = XMLOutputFactory
// .newInstance().createXMLStreamWriter(System.out);
//
// xmlStreamWriter.setPrefix("bpmndi","http://bpmndi.org");

JAXBContext context = JAXBContext.newInstance(Definitions.class);
Marshaller m = context.createMarshaller();

/* Schema validation */
SchemaFactory sf = SchemaFactory
.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File(schemaFilePath));
m.setSchema(schema);

ExportValidationEventCollector vec = new ExportValidationEventCollector();
m.setEventHandler(vec);


// m.setListener(new ListenerTest());
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
NamespacePrefixMapper nsp = new BPMNPrefixMapper();
m.setProperty("com.sun.xml.bind.namespacePrefixMapper", nsp);
m.marshal(def, System.out);
ValidationEvent[] events = vec.getEvents();

StringBuilder builder = new StringBuilder();
builder.append("Validation Errors: \n\n");

for(ValidationEvent event : Arrays.asList(events)) {

// builder.append("Line: ");
// builder.append(event.getLocator().getLineNumber());
// builder.append(" Column: ");
// builder.append(event.getLocator().getColumnNumber());

builder.append("\nError: ");
builder.append(event.getMessage());
builder.append("\n\n\n");
}

System.out.println(builder.toString());

// SyntaxChecker checker = def.getSyntaxChecker();
// checker.checkSyntax();
//
// System.out.println(checker.getErrorsAsJson().toString());
// BufferedReader br = new BufferedReader(new FileReader(json));
// String bpmnJson = "";
// String line;
// while ((line = br.readLine()) != null) {
// bpmnJson += line;
// }
// Diagram diagram = DiagramBuilder.parseJson(bpmnJson);
//
// Diagram2BpmnConverter converter = new Diagram2BpmnConverter(diagram);
// Definitions def = converter.getDefinitionsFromDiagram();
//
// // def.getOtherAttributes().put(new QName("xmlns:local"), "nurlokal");
//
// // final XMLStreamWriter xmlStreamWriter = XMLOutputFactory
// // .newInstance().createXMLStreamWriter(System.out);
// //
// // xmlStreamWriter.setPrefix("bpmndi","http://bpmndi.org");
//
// JAXBContext context = JAXBContext.newInstance(Definitions.class);
// Marshaller m = context.createMarshaller();
//
// /* Schema validation */
// SchemaFactory sf = SchemaFactory
// .newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
// Schema schema = sf.newSchema(new File(schemaFilePath));
// m.setSchema(schema);
//
// ExportValidationEventCollector vec = new ExportValidationEventCollector();
// m.setEventHandler(vec);
//
//
// // m.setListener(new ListenerTest());
// m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// NamespacePrefixMapper nsp = new BPMNPrefixMapper();
// m.setProperty("com.sun.xml.bind.namespacePrefixMapper", nsp);
// m.marshal(def, System.out);
// ValidationEvent[] events = vec.getEvents();
//
// StringBuilder builder = new StringBuilder();
// builder.append("Validation Errors: \n\n");
//
// for(ValidationEvent event : Arrays.asList(events)) {
//
//// builder.append("Line: ");
//// builder.append(event.getLocator().getLineNumber());
//// builder.append(" Column: ");
//// builder.append(event.getLocator().getColumnNumber());
//
// builder.append("\nError: ");
// builder.append(event.getMessage());
// builder.append("\n\n\n");
// }
//
// System.out.println(builder.toString());
//
// // SyntaxChecker checker = def.getSyntaxChecker();
// // checker.checkSyntax();
// //
// // System.out.println(checker.getErrorsAsJson().toString());
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,8 @@ public class Diagram2BpmnConverter {

private List<Choreography> choreography;
private ChoreographyDiagram choreographyDiagram;

private List<Class<? extends AbstractBpmnFactory>> factoryClasses;

/* Define edge ids */
private final static String[] edgeIdsArray = { "SequenceFlow",
Expand All @@ -130,12 +132,13 @@ public class Diagram2BpmnConverter {
public final static HashSet<String> dataObjectIds = new HashSet<String>(
Arrays.asList(dataObjectIdsArray));

public Diagram2BpmnConverter(Diagram diagram) {
public Diagram2BpmnConverter(Diagram diagram, List<Class<? extends AbstractBpmnFactory>> factoryClasses) {
this.factories = new HashMap<String, AbstractBpmnFactory>();
this.bpmnElements = new HashMap<String, BPMNElement>();
this.definitions = new Definitions();
this.definitions.setId(OryxUUID.generate());
this.diagram = diagram;
this.factoryClasses = factoryClasses;
}

/**
Expand Down Expand Up @@ -173,9 +176,6 @@ private AbstractBpmnFactory getFactoryForStencilId(String stencilId)
private AbstractBpmnFactory createFactoryForStencilId(String stencilId)
throws ClassNotFoundException, InstantiationException,
IllegalAccessException {
List<Class<? extends AbstractBpmnFactory>> factoryClasses = ClassFinder
.getClassesByPackageName(AbstractBpmnFactory.class,
"de.hpi.bpmn2_0.factory");

/* Find factory for stencil id */
for (Class<? extends AbstractBpmnFactory> factoryClass : factoryClasses) {
Expand Down
74 changes: 29 additions & 45 deletions editor/server/src/de/hpi/util/reflection/ClassFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import java.util.Enumeration;
import java.util.List;

import javax.servlet.ServletContext;

public class ClassFinder {

/** Returns all classes of the specified package, who are subclasses of the given super class
Expand All @@ -20,53 +22,35 @@ public class ClassFinder {
* @throws ClassNotFoundException
*/
@SuppressWarnings("unchecked")
public static <T> List<Class<? extends T>> getClassesByPackageName(Class<T> superclass, String pckgname) throws ClassNotFoundException {
// This will hold a list of directories matching the packagename. There may be more than one if a package is split over multiple jars/paths
ArrayList<File> directories = new ArrayList<File>();
try {
ClassLoader cld = Thread.currentThread().getContextClassLoader();
if (cld == null) {
throw new ClassNotFoundException("Can't get class loader.");
}
String path = pckgname.replace('.', '/');
// Ask for all resources for the path
Enumeration<URL> resources = cld.getResources(path);
while (resources.hasMoreElements()) {
directories.add(new File(URLDecoder.decode(resources.nextElement().getPath(), "UTF-8")));
}
} catch (NullPointerException x) {
throw new ClassNotFoundException(pckgname + " does not appear to be a valid package (Null pointer exception)");
} catch (UnsupportedEncodingException encex) {
throw new ClassNotFoundException(pckgname + " does not appear to be a valid package (Unsupported encoding)");
} catch (IOException ioex) {
throw new ClassNotFoundException("IOException was thrown when trying to get all resources for " + pckgname);
}

public static <T> List<Class<? extends T>> getClassesByPackageName(Class<T> superclass, String pckgname, ServletContext servletContext) throws ClassNotFoundException {
// This will hold a list of directories matching the packagename. There may be more than one if a package is split over multiple jars/paths
String path = pckgname.replace('.', '/');

File directory = new File(servletContext.getRealPath("WEB-INF/classes/" + path));

ArrayList<Class<? extends T>> classes = new ArrayList<Class<? extends T>>();
// For every directory identified capture all the .class files
for (File directory : directories) {
if (directory.exists()) {
// Get the list of the files contained in the package
File[] files = directory.listFiles();
for (File file : files) {
// we are only interested in .class files
if (file.getName().endsWith(".class")) {
// removes the .class extension
// Get the class object
Class<? extends Object> cls = Class.forName(pckgname + '.' + file.getName().substring(0, file.getName().length() - 6));
// Checks if its an AbstractHandler
if( superclass.isAssignableFrom(cls) ){
classes.add( (Class<? extends T>) cls );
}
} else if( file.isDirectory() ) {
// Add recursive all child packages
List<Class<? extends T>> childPackages = ClassFinder.getClassesByPackageName(superclass, pckgname + '.' + file.getName() );
classes.addAll( childPackages );
}
}
} else {
throw new ClassNotFoundException(pckgname + " (" + directory.getPath() + ") does not appear to be a valid package");
}
if (directory != null && directory.exists()) {
// Get the list of the files contained in the package
File[] files = directory.listFiles();
for (File file : files) {
// we are only interested in .class files
if (file.getName().endsWith(".class")) {
// removes the .class extension
// Get the class object
Class<? extends Object> cls = Class.forName(pckgname + '.' + file.getName().substring(0, file.getName().length() - 6));
// Checks if its an AbstractHandler
if( superclass.isAssignableFrom(cls) ){
classes.add( (Class<? extends T>) cls );
}
} else if( file.isDirectory() ) {
// Add recursive all child packages
List<Class<? extends T>> childPackages = ClassFinder.getClassesByPackageName(superclass, pckgname + '.' + file.getName(), servletContext );
classes.addAll( childPackages );
}
}
} else {
throw new ClassNotFoundException(pckgname + " (" + directory.getPath() + ") does not appear to be a valid package");
}
return classes;
}
Expand Down
15 changes: 11 additions & 4 deletions editor/server/src/org/oryxeditor/server/Bpmn2_0Servlet.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import java.io.File;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
Expand All @@ -45,9 +46,11 @@
import com.sun.xml.bind.marshaller.NamespacePrefixMapper;

import de.hpi.bpmn2_0.ExportValidationEventCollector;
import de.hpi.bpmn2_0.factory.AbstractBpmnFactory;
import de.hpi.bpmn2_0.model.Definitions;
import de.hpi.bpmn2_0.transformation.BPMNPrefixMapper;
import de.hpi.bpmn2_0.transformation.Diagram2BpmnConverter;
import de.hpi.util.reflection.ClassFinder;

/**
* This servlet provides the access point to the interchange format of BPMN 2.0
Expand All @@ -65,10 +68,14 @@ public class Bpmn2_0Servlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException {
String json = req.getParameter("data");
boolean asXML = req.getParameter("xml") != null;

/* Transform and return from DI */
try {
StringWriter output = this.performTransformationToDi(json, asXML);
List<Class<? extends AbstractBpmnFactory>> factoryClasses = ClassFinder
.getClassesByPackageName(AbstractBpmnFactory.class,
"de.hpi.bpmn2_0.factory", this.getServletContext());

StringWriter output = this.performTransformationToDi(json, asXML, factoryClasses);
res.setContentType("application/xml");
res.setStatus(200);
res.getWriter().print(output.toString());
Expand Down Expand Up @@ -99,7 +106,7 @@ protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Se
* @throws Exception
* Exception occurred while processing
*/
protected StringWriter performTransformationToDi(String json, boolean asXML) throws Exception {
protected StringWriter performTransformationToDi(String json, boolean asXML, List<Class<? extends AbstractBpmnFactory>> factoryClasses) throws Exception {
StringWriter writer = new StringWriter();
JSONObject result = new JSONObject();

Expand All @@ -108,7 +115,7 @@ protected StringWriter performTransformationToDi(String json, boolean asXML) thr
Diagram diagram = DiagramBuilder.parseJson(json);

/* Build up BPMN 2.0 model */
Diagram2BpmnConverter converter = new Diagram2BpmnConverter(diagram);
Diagram2BpmnConverter converter = new Diagram2BpmnConverter(diagram, factoryClasses);
Definitions bpmnDefinitions = converter.getDefinitionsFromDiagram();

/* Perform XML creation */
Expand Down
14 changes: 11 additions & 3 deletions editor/server/src/org/oryxeditor/server/Bpmn2_0ToXpdlServlet.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
Expand All @@ -49,9 +51,11 @@

import com.sun.xml.bind.marshaller.NamespacePrefixMapper;

import de.hpi.bpmn2_0.factory.AbstractBpmnFactory;
import de.hpi.bpmn2_0.model.Definitions;
import de.hpi.bpmn2_0.transformation.BPMNPrefixMapper;
import de.hpi.bpmn2_0.transformation.Diagram2BpmnConverter;
import de.hpi.util.reflection.ClassFinder;

/**
* This servlet provides an XPDL2.1 Export of BPMN 2.0 using the XSLT Style
Expand All @@ -73,7 +77,11 @@ protected void doPost(HttpServletRequest req, HttpServletResponse res)

/* Transform and return from DI */
try {
StringWriter output = this.performTransformationToDi(json);
List<Class<? extends AbstractBpmnFactory>> factoryClasses = ClassFinder
.getClassesByPackageName(AbstractBpmnFactory.class,
"de.hpi.bpmn2_0.factory", this.getServletContext());

StringWriter output = this.performTransformationToDi(json, factoryClasses);

StringReader reader = new StringReader(output.toString());

Expand Down Expand Up @@ -118,7 +126,7 @@ protected void doPost(HttpServletRequest req, HttpServletResponse res)
* @throws Exception
* Exception occurred while processing
*/
protected StringWriter performTransformationToDi(String json)
protected StringWriter performTransformationToDi(String json, List<Class<? extends AbstractBpmnFactory>> factoryClasses)
throws Exception {
StringWriter writer = new StringWriter();

Expand All @@ -127,7 +135,7 @@ protected StringWriter performTransformationToDi(String json)
Diagram diagram = DiagramBuilder.parseJson(json);

/* Build up BPMN 2.0 model */
Diagram2BpmnConverter converter = new Diagram2BpmnConverter(diagram);
Diagram2BpmnConverter converter = new Diagram2BpmnConverter(diagram, factoryClasses);
Definitions bpmnDefinitions = converter.getDefinitionsFromDiagram();

/* Perform XML creation */
Expand Down
Loading

0 comments on commit 1bfe68f

Please sign in to comment.