Author: guixl
Date: Tue Jun 29 13:01:55 2010
New Revision: 958957

URL: http://svn.apache.org/viewvc?rev=958957&view=rev
Log:
Finish transition element import convert function

Modified:
    
commons/sandbox/gsoc/2010/scxml-eclipse/trunk/src/main/java/org.apache.commons.scxml.modeling.diagram/src/org/apache/commons/scxml/modeling/diagram/part/ModelingImportWizard.java
    
commons/sandbox/gsoc/2010/scxml-eclipse/trunk/src/main/java/org.apache.commons.scxml.modeling.diagram/xslt/import.xsl

Modified: 
commons/sandbox/gsoc/2010/scxml-eclipse/trunk/src/main/java/org.apache.commons.scxml.modeling.diagram/src/org/apache/commons/scxml/modeling/diagram/part/ModelingImportWizard.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/gsoc/2010/scxml-eclipse/trunk/src/main/java/org.apache.commons.scxml.modeling.diagram/src/org/apache/commons/scxml/modeling/diagram/part/ModelingImportWizard.java?rev=958957&r1=958956&r2=958957&view=diff
==============================================================================
--- 
commons/sandbox/gsoc/2010/scxml-eclipse/trunk/src/main/java/org.apache.commons.scxml.modeling.diagram/src/org/apache/commons/scxml/modeling/diagram/part/ModelingImportWizard.java
 (original)
+++ 
commons/sandbox/gsoc/2010/scxml-eclipse/trunk/src/main/java/org.apache.commons.scxml.modeling.diagram/src/org/apache/commons/scxml/modeling/diagram/part/ModelingImportWizard.java
 Tue Jun 29 13:01:55 2010
@@ -17,14 +17,28 @@
 package org.apache.commons.scxml.modeling.diagram.part;
 
 import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.io.StringReader;
+import java.io.StringWriter;
 import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
 import org.apache.commons.scxml.modeling.export.ScxmlExportStreamHandlerAction;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.runtime.CoreException;
@@ -49,9 +63,12 @@ import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.ui.INewWizard;
 import org.eclipse.ui.IWorkbench;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.InputSource;
 
 /**
- * @generated
+ * @SCXML document import to workspace
  */
 public class ModelingImportWizard extends Wizard implements INewWizard {
 
@@ -184,6 +201,7 @@ public class ModelingImportWizard extend
 
                private boolean indeterminate;
                private IFile xmlFile;
+               private HashMap<String,XpathMapClass> targetList = new 
HashMap<String,XpathMapClass>();
 
                /**
                 * LongRunningOperation constructor
@@ -212,7 +230,7 @@ public class ModelingImportWizard extend
                 */
                public void run(IProgressMonitor monitor)
                                throws InvocationTargetException, 
InterruptedException {
-                       monitor.beginTask("SCXML document export progress", 13);
+                       monitor.beginTask("SCXML document export progress", 14);
 
                        try {
                                ScxmlExportStreamHandlerAction shc = new 
ScxmlExportStreamHandlerAction();
@@ -220,14 +238,16 @@ public class ModelingImportWizard extend
                                monitor.worked(1);
                                
documentContent=documentContent.replace("xmlns=\"http://www.w3.org/2005/07/scxml\"";,
 "");
                                monitor.worked(1);
-                               monitor.worked(1);
-                               monitor.worked(1);
-                               monitor.worked(1);
+                               
documentContent=preHandlerContent(documentContent);
                                System.out.println(documentContent);
+                               monitor.worked(1);
                                String content = 
shc.ExecuteXSL(documentContent, this
                                                
.getClass().getClassLoader().getResourceAsStream(
                                                                
"xslt/import.xsl"));
+                               System.out.println(content);
                                monitor.worked(1);
+                               content=getTargetList(content);
+                               monitor.worked(3);
                                
content=content.replace("CONSTANT_org.apache.commons.scxml_CONSTANT", 
"org.apache.commons.scxml:");
                                monitor.worked(1);
                                
content=content.replace("CONSTANT_xmi_version_CONSTANT", "xml:version");
@@ -248,6 +268,211 @@ public class ModelingImportWizard extend
                                e.printStackTrace();
                        }
                }
+               //pre-handler document content, get subState elements
+               public String preHandlerContent(String documentContent){
+                       try {
+                             DocumentBuilderFactory factory = 
DocumentBuilderFactory.newInstance();
+                             DocumentBuilder builder = 
factory.newDocumentBuilder();
+                             InputSource is = new InputSource( new 
StringReader( documentContent ) );
+                             Document doc = builder.parse( is );
+                             Element root=doc.getDocumentElement();
+                             getSubStateElement(root);
+                             TransformerFactory tFactory = 
TransformerFactory.newInstance();
+                                 Transformer transformer = null;
+                                       try {
+                                               transformer = 
tFactory.newTransformer();
+                                               
transformer.setOutputProperty("encoding","UTF-8");
+                                       } catch 
(TransformerConfigurationException e1) {
+                                               e1.printStackTrace();
+                                       }
+                                       DOMSource source = new DOMSource(doc);
+                                       ByteArrayOutputStream byteRep = new 
ByteArrayOutputStream();
+                                       StreamResult result = new 
StreamResult(byteRep);
+                                       try {
+                                               transformer.transform(source, 
result);
+                                       } catch (TransformerException e) {
+                                               e.printStackTrace();
+                                       }
+                                       String retContent=byteRep.toString();
+                                       return retContent;
+                       }
+                   catch( Exception ex ) {
+                       ex.printStackTrace();
+                       return documentContent;
+                   }
+               }
+               
+               public String getTargetList(String documentContent) {
+                       try {
+                             DocumentBuilderFactory factory = 
DocumentBuilderFactory.newInstance();
+                             DocumentBuilder builder = 
factory.newDocumentBuilder();
+                             InputSource is = new InputSource( new 
StringReader( documentContent ) );
+                             Document doc = builder.parse( is );
+                             Element root=doc.getDocumentElement();
+                             root.setAttribute("tempId", "/");
+                             convertParseTargetElement(root);
+                             replaceTargetElement(root);
+                             root.removeAttribute("tempId");
+                             removeTempIdElement(root);
+                             TransformerFactory tFactory = 
TransformerFactory.newInstance();
+                                 Transformer transformer = null;
+                                       try {
+                                               transformer = 
tFactory.newTransformer();
+                                               
transformer.setOutputProperty("encoding","UTF-8");
+                                       } catch 
(TransformerConfigurationException e1) {
+                                               e1.printStackTrace();
+                                       }
+                                       DOMSource source = new DOMSource(doc);
+                                       ByteArrayOutputStream byteRep = new 
ByteArrayOutputStream();
+                                       StreamResult result = new 
StreamResult(byteRep);
+                                       try {
+                                               transformer.transform(source, 
result);
+                                       } catch (TransformerException e) {
+                                               e.printStackTrace();
+                                       }
+                                       String retContent=byteRep.toString();
+                                       Iterator 
ite=targetList.keySet().iterator();
+                                       while(ite.hasNext()){
+                                               XpathMapClass map = 
targetList.get(ite.next());
+                                               String target = map.getTarget();
+                                               
if(target!=null&&map.getXpath()!=null){
+                                                       retContent = 
retContent.replace("targetStatus=\"" + target
+                                                                       + "\"", 
"targetStatus=\"" + map.getXpath() + "\"");
+                                               }
+                                       }
+                                       return retContent;
+                       }
+                   catch( Exception ex ) {
+                       ex.printStackTrace();
+                       return documentContent;
+                   }
+
+               }
+               
+               //change state to subState
+               private void getSubStateElement(Element element){
+                       org.w3c.dom.NodeList children = element.getChildNodes();
+                       String elementName = element.getNodeName();
+                       Element childElement = null;
+               for(int j = 0; j < children.getLength(); j++)
+               {
+                       if(children.item(j) instanceof org.w3c.dom.Element){
+                               childElement = ((Element)children.item(j));
+                               if("state".equalsIgnoreCase(elementName)){
+                                       childElement.setAttribute("state_type", 
"subState");
+                               }
+                               getSubStateElement(childElement);
+                       }
+               }
+               }
+               
+               //add tempId for each element and get all transition target 
value list
+               private void convertParseTargetElement(Element element){
+                       org.w3c.dom.NodeList children = element.getChildNodes();
+                       String elementName = null;
+                       Element childElement = null;
+                       int stateListNumber=0;
+                       int subStateNumber=0;
+               for(int j = 0; j < children.getLength(); j++)
+               {
+                       if(children.item(j) instanceof org.w3c.dom.Element){
+                               childElement = ((Element)children.item(j));
+                               elementName = childElement.getNodeName();
+                               
if("targetConnection".equalsIgnoreCase(elementName)){
+                                       String 
target=childElement.getAttribute("targetStatus");
+                                       if(target!=null){
+                                               XpathMapClass map = new 
XpathMapClass();
+                                               map.setTarget(target);
+                                               targetList.put(target,map);
+                                       }
+                               }else{
+                                       
if("stateList".equalsIgnoreCase(elementName)||"subState".equalsIgnoreCase(elementName)){
+                                               String 
fatherTempId=element.getAttribute("tempId");
+                                               if(fatherTempId!=null){
+                                                       
if("stateList".equalsIgnoreCase(elementName)) 
childElement.setAttribute("tempId", 
fatherTempId+"/@stateList."+String.valueOf(stateListNumber++));
+                                                       else 
if("subState".equalsIgnoreCase(elementName)) 
childElement.setAttribute("tempId", 
fatherTempId+"/@subState."+String.valueOf(subStateNumber++));
+                                               }
+                                       }
+                                       convertParseTargetElement(childElement);
+                               }
+                       }
+               }
+               }
+               
+               //get xpath value for each stateList element, subState element
+               private void replaceTargetElement(Element element){
+                       org.w3c.dom.NodeList children = element.getChildNodes();
+                       String elementName = null;
+                       Element childElement = null;
+               for(int j = 0; j < children.getLength(); j++)
+               {
+                       if(children.item(j) instanceof org.w3c.dom.Element){
+                               childElement = ((Element)children.item(j));
+                               elementName = childElement.getNodeName();
+                               
if("stateList".equalsIgnoreCase(elementName)||"subState".equalsIgnoreCase(elementName)){
+                                       String 
tempId=childElement.getAttribute("tempId");
+                                       String 
id=childElement.getAttribute("id");
+                                       if(tempId!=null&&id!=null){
+                                               XpathMapClass 
targetMap=targetList.get(id);
+                                               if(targetMap!=null){
+                                                       
targetMap.setXpath(tempId);
+                                                       targetList.put(id, 
targetMap);
+                                               }
+                                       }
+                               }
+                               replaceTargetElement(childElement);
+                       }
+               }
+               }
+               
+               //remove tempId attribute from dom tree
+               private void removeTempIdElement(Element element){
+                       org.w3c.dom.NodeList children = element.getChildNodes();
+                       Element childElement = null;
+               for(int j = 0; j < children.getLength(); j++)
+               {
+                       if(children.item(j) instanceof org.w3c.dom.Element){
+                               childElement = ((Element)children.item(j));
+                               if(childElement.getAttribute("tempId")!=null){
+                                       childElement.removeAttribute("tempId");
+                               }
+                               
if(childElement.getAttribute("state_type")!=null){
+                                       
childElement.removeAttribute("state_type");
+                               }
+                               removeTempIdElement(childElement);
+                       }
+               }
+               }
+       }
+       
+       class XpathMapClass {
+               private String target;
+               private String xpath;
+               private String id;
+
+               public String getTarget() {
+                       return target;
+               }
+
+               public void setTarget(String target) {
+                       this.target = target;
+               }
+
+               public String getXpath() {
+                       return xpath;
+               }
+
+               public void setXpath(String xpath) {
+                       this.xpath = xpath;
+               }
+
+               public String getId() {
+                       return id;
+               }
+
+               public void setId(String id) {
+                       this.id = id;
+               }
        }
 
        /**

Modified: 
commons/sandbox/gsoc/2010/scxml-eclipse/trunk/src/main/java/org.apache.commons.scxml.modeling.diagram/xslt/import.xsl
URL: 
http://svn.apache.org/viewvc/commons/sandbox/gsoc/2010/scxml-eclipse/trunk/src/main/java/org.apache.commons.scxml.modeling.diagram/xslt/import.xsl?rev=958957&r1=958956&r2=958957&view=diff
==============================================================================
--- 
commons/sandbox/gsoc/2010/scxml-eclipse/trunk/src/main/java/org.apache.commons.scxml.modeling.diagram/xslt/import.xsl
 (original)
+++ 
commons/sandbox/gsoc/2010/scxml-eclipse/trunk/src/main/java/org.apache.commons.scxml.modeling.diagram/xslt/import.xsl
 Tue Jun 29 13:01:55 2010
@@ -17,26 +17,34 @@
 </xsl:template>
 
 <xsl:template match="state">
-       <xsl:element name="stateList">
-               <xsl:choose>
-               <xsl:when test="@id">
-                       <xsl:attribute name="id"><xsl:value-of  
select="@id"/></xsl:attribute>
-               </xsl:when>
-               <xsl:otherwise>
-                       <xsl:attribute name="id"><xsl:value-of  
select="generate-id()"/></xsl:attribute>
-               </xsl:otherwise>
-               </xsl:choose>
-               <xsl:for-each select="*">
+       <xsl:choose>
+       <xsl:when test="@state_type">
+               <xsl:element name="subState">
                        <xsl:choose>
-                       <xsl:when test="name()='state'">
-                               <xsl:call-template name="subState" />
+                       <xsl:when test="@id">
+                               <xsl:attribute name="id"><xsl:value-of  
select="@id"/></xsl:attribute>
                        </xsl:when>
                        <xsl:otherwise>
-                               <xsl:apply-templates/>
+                               <xsl:attribute name="id"><xsl:value-of  
select="generate-id()"/></xsl:attribute>
                        </xsl:otherwise>
                        </xsl:choose>
-               </xsl:for-each>
-       </xsl:element>
+                       <xsl:apply-templates/>
+               </xsl:element>
+       </xsl:when>
+       <xsl:otherwise>
+               <xsl:element name="stateList">
+                       <xsl:choose>
+                       <xsl:when test="@id">
+                               <xsl:attribute name="id"><xsl:value-of  
select="@id"/></xsl:attribute>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <xsl:attribute name="id"><xsl:value-of  
select="generate-id()"/></xsl:attribute>
+                       </xsl:otherwise>
+                       </xsl:choose>
+                       <xsl:apply-templates/>
+               </xsl:element>
+       </xsl:otherwise>
+       </xsl:choose>
 </xsl:template>
 
 <xsl:template match="parallel">
@@ -48,20 +56,6 @@
        </xsl:element>
 </xsl:template>
 
-<xsl:template name="subState">
-       <xsl:element name="subState">
-               <xsl:choose>
-               <xsl:when test="@id">
-                       <xsl:attribute name="id"><xsl:value-of  
select="@id"/></xsl:attribute>
-               </xsl:when>
-               <xsl:otherwise>
-                       <xsl:attribute name="id"><xsl:value-of  
select="generate-id()"/></xsl:attribute>
-               </xsl:otherwise>
-               </xsl:choose>
-               <xsl:apply-templates/>
-       </xsl:element>
-</xsl:template>
-
 <xsl:template match="onEntry">
        <xsl:element name="onEntry">
                <xsl:apply-templates/>
@@ -82,7 +76,7 @@
                <xsl:if test="@cond">
                        <xsl:attribute name="cond"><xsl:value-of  
select="@cond"/></xsl:attribute>
                </xsl:if>
-               <xsl:attribute name="target"><xsl:value-of  
select="@target"/></xsl:attribute>
+               <xsl:attribute name="targetStatus"><xsl:value-of  
select="@target"/></xsl:attribute>
        </xsl:element>
 </xsl:template>
 


Reply via email to