/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.workbench.jcr2vfsmigration.util;
import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.StringWriter;
import javax.inject.Inject;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
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 com.google.common.base.Charsets;
import org.drools.workbench.models.commons.backend.imports.ImportsParser;
import org.drools.workbench.models.commons.backend.packages.PackageNameParser;
import org.drools.workbench.models.commons.backend.packages.PackageNameWriter;
import org.drools.workbench.models.datamodel.imports.Import;
import org.drools.workbench.models.datamodel.imports.Imports;
import org.drools.workbench.models.datamodel.packages.HasPackageName;
import org.guvnor.common.services.backend.exceptions.ExceptionUtilities;
import org.guvnor.common.services.project.model.Package;
import org.kie.workbench.common.services.shared.project.KieProjectService;
import org.uberfire.backend.vfs.Path;
import org.uberfire.java.nio.EncodingUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
public class PackageImportHelper {
@Inject
private KieProjectService projectService;
//Check if the xml contains a Package declaration, appending one if it does not exist
public String assertPackageNameXML( final String xml,
final Path resource ) {
final Package pkg = projectService.resolvePackage( resource );
String pkName =null;
try{
pkName =pkg.getPackageName();
if(pkName!=null && pkg.getPackageName().endsWith( EncodingUtil.decode( resource.getFileName() ))){
pkName = pkg.getPackageName().substring(0,pkg.getPackageName().indexOf(EncodingUtil.decode(resource.getFileName()))-1);
}
}catch (Exception e){
}
final String requiredPackageName = pkName;
if ( requiredPackageName == null || "".equals( requiredPackageName ) ) {
return xml;
}
DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder dombuilder = domfac.newDocumentBuilder();
Document doc = dombuilder.parse( new ByteArrayInputStream( xml.getBytes( Charsets.UTF_8 ) ) );
if ( doc.getElementsByTagName( "packageName" ).getLength() != 0 ) {
return xml;
}
Element root = doc.getDocumentElement();
// Element nameElement = doc.createElement( "name" );
// nameElement.appendChild( doc.createTextNode( resource.getFileName()) );
// root.appendChild( nameElement );
Element packageElement = doc.createElement( "packageName" );
packageElement.appendChild( doc.createTextNode( requiredPackageName ) );
root.appendChild( packageElement );
//output xml with pretty format
TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = transfac.newTransformer();
trans.setOutputProperty( OutputKeys.METHOD, "xml" );
trans.setOutputProperty( OutputKeys.INDENT, "yes" );
trans.setOutputProperty( "{http://xml.apache.org/xslt}indent-amount", Integer.toString( 2 ) );
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult( sw );
DOMSource s = new DOMSource( root );
trans.transform( s, result );
String xmlString = sw.toString();
if(xmlString!=null)
xmlString =xmlString.substring(xmlString.indexOf(">")+1);
return xmlString;
} catch ( TransformerConfigurationException e ) {
e.printStackTrace();
} catch ( ParserConfigurationException e ) {
e.printStackTrace();
} catch ( FileNotFoundException e ) {
e.printStackTrace();
} catch ( SAXException e ) {
e.printStackTrace();
} catch ( IOException e ) {
e.printStackTrace();
} catch ( TransformerException e ) {
e.printStackTrace();
}
return xml;
}
public String assertPackageImportDRL( final String drl,
final String packageHeader,
final Path resource ) {
if ( packageHeader == null ) {
return drl;
}
final Imports imports = ImportsParser.parseImports( packageHeader );
if ( imports == null || drl.toLowerCase().indexOf("import ")!=-1) {
return drl;
}
StringBuilder sb = new StringBuilder();
sb.append( imports.toString() );
if ( imports.getImports().size() > 0 ) {
sb.append( "\n" );
}
sb.append( drl );
return sb.toString();
}
public String assertPackageImportXML( final String xml,
final String packageHeader,
final Path resource ) {
if ( packageHeader == null ) {
return xml;
}
final Imports imports = ImportsParser.parseImports( packageHeader );
if ( imports == null ) {
return xml;
}
DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder dombuilder = domfac.newDocumentBuilder();
Document doc = dombuilder.parse( new ByteArrayInputStream( xml.getBytes( Charsets.UTF_8 ) ) );
if ( doc.getElementsByTagName( "imports" ).getLength() != 0 ) {
return xml;
}
/* The imports should have following format (used by the workbench):
* <imports>
* <imports>
* <org.drools.workbench.models.datamodel.imports.Import>
* <type>java.lang.Number</type>
* </org.drools.workbench.models.datamodel.imports.Import>
* </imports>
* </imports>
*/
Element root = doc.getDocumentElement();
Element topImportsElement = doc.createElement( "imports" );
Element nestedImportsElement = doc.createElement( "imports" );
topImportsElement.appendChild(nestedImportsElement);
for ( final Import i : imports.getImports() ) {
Element importElement = doc.createElement( Import.class.getCanonicalName() );
Element typeElement = doc.createElement( "type" );
typeElement.appendChild( doc.createTextNode( i.getType() ) );
importElement.appendChild( typeElement );
nestedImportsElement.appendChild( importElement );
}
root.appendChild( topImportsElement );
//output xml with pretty format
TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = transfac.newTransformer();
trans.setOutputProperty( OutputKeys.METHOD, "xml" );
trans.setOutputProperty( OutputKeys.INDENT, "yes" );
trans.setOutputProperty( "{http://xml.apache.org/xslt}indent-amount", Integer.toString( 2 ) );
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult( sw );
DOMSource s = new DOMSource( root );
trans.transform( s, result );
String xmlString = sw.toString();
if(xmlString!=null)
xmlString =xmlString.substring(xmlString.indexOf(">")+1);
return xmlString;
} catch ( TransformerConfigurationException e ) {
e.printStackTrace();
} catch ( ParserConfigurationException e ) {
e.printStackTrace();
} catch ( FileNotFoundException e ) {
e.printStackTrace();
} catch ( SAXException e ) {
e.printStackTrace();
} catch ( IOException e ) {
e.printStackTrace();
} catch ( TransformerException e ) {
e.printStackTrace();
}
return xml;
}
public String assertPackageName( final String drl,
final Path resource ) {
try {
final String existingPackageName = PackageNameParser.parsePackageName(drl);
if ( !"".equals( existingPackageName ) ) {
return drl;
}
final Package pkg = projectService.resolvePackage( resource );
String pkName =null;
try{
pkName =pkg.getPackageName();
if(pkName!=null && pkg.getPackageName().endsWith(EncodingUtil.decode(resource.getFileName()))){
pkName = pkg.getPackageName().substring(0,pkg.getPackageName().indexOf(EncodingUtil.decode(resource.getFileName()))-1);
}
}catch (Exception e){
}
final String requiredPackageName = pkName;
final HasPackageName mockHasPackageName = new HasPackageName() {
@Override
public String getPackageName() {
return requiredPackageName;
}
@Override
public void setPackageName( final String packageName ) {
//Nothing to do here
}
};
final StringBuilder sb = new StringBuilder();
PackageNameWriter.write(sb,
mockHasPackageName);
sb.append( drl );
return sb.toString();
} catch ( Exception e ) {
throw ExceptionUtilities.handleException(e);
}
}
}