/*
* Copyright 2014 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.
* You may obtain a copy of the License at
*
* 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.xml.format;
import java.util.Date;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.drools.workbench.jcr2vfsmigration.xml.model.Module;
import org.drools.workbench.jcr2vfsmigration.xml.model.ModuleType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import static org.drools.workbench.jcr2vfsmigration.xml.ExportXmlUtils.*;
public class ModuleXmlFormat implements XmlFormat<Module> {
private static final Logger logger = LoggerFactory.getLogger(ModuleXmlFormat.class);
protected static final String MODULE = "module";
protected static final String MODULE_UUID = "uuid";
protected static final String MODULE_TYPE = "type";
protected static final String MODULE_NAME = "name";
protected static final String MODULE_LAST_CONTRIBUTOR = "lastContrib";
protected static final String MODULE_CHECKIN_COMMENT = "comment";
protected static final String MODULE_LAST_MODIFIED = "lastModif";
protected static final String MODULE_NORM_PACKAGENAME = "normalizedPackageName";
protected static final String MODULE_PACKAGEHEADER = "packageHeaderInfo";
protected static final String MODULE_GLOBALS = "globals";
protected static final String MODULE_CATRULES = "catRules";
protected static final String MODULE_ASSET_FILE = "assetExportFileName";
@Override
public void format( StringBuilder sb, Module module ) {
if ( sb == null || module == null ) throw new IllegalArgumentException( "No output or Module specified" );
sb.append( LT ).append( MODULE ).append( GT );
sb.append( LT ).append( MODULE_UUID ).append( GT ).append( module.getUuid() ).append( LT_SLASH )
.append( MODULE_UUID ).append( GT );
sb.append( LT ).append( MODULE_TYPE ).append( GT ).append( module.getType() ).append( LT_SLASH )
.append( MODULE_TYPE ).append( GT );
sb.append( LT ).append( MODULE_NAME ).append( GT ).append( escapeXml( module.getName() ) ).append( LT_SLASH )
.append( MODULE_NAME ).append( GT );
String lastContributor = StringUtils.isNotBlank( module.getLastContributor() ) ? module.getLastContributor() : "--";
sb.append( LT ).append( MODULE_LAST_CONTRIBUTOR ).append( GT ).append( lastContributor ).append( LT_SLASH )
.append( MODULE_LAST_CONTRIBUTOR ).append( GT );
// Check-in comment as CData section
sb.append( formatCheckinComment( module.getCheckinComment() ) );
Date lastModified = module.getLastModified() != null ? module.getLastModified() : new Date();
sb.append( LT ).append( MODULE_LAST_MODIFIED ).append( GT ).append( lastModified.getTime() ).append( LT_SLASH )
.append( MODULE_LAST_MODIFIED ).append( GT );
sb.append( LT ).append( MODULE_NORM_PACKAGENAME ).append( GT ).append( module.getNormalizedPackageName() )
.append( LT_SLASH ).append( MODULE_NORM_PACKAGENAME ).append( GT );
sb.append( LT ).append( MODULE_ASSET_FILE ).append( GT ).append( module.getAssetExportFileName() )
.append( LT_SLASH ).append( MODULE_ASSET_FILE ).append( GT );
// Package header info
sb.append( formatPackageHeaderInfo( module.getPackageHeaderInfo() ) );
// Globals String
sb.append( formatGlobals( module.getGlobalsString() ) );
// Category rules
sb.append( formatCatRules( module ) );
sb.append( LT_SLASH ).append( MODULE ).append( GT );
// logger.info( " Module [{}] exported.", module.getName() );
}
@Override
public Module parse( Node moduleNode ) {
if ( moduleNode == null || !MODULE.equals( moduleNode.getNodeName() ) ) throw new IllegalArgumentException( "No input module node specified for parsing" );
String name = null;
String lastContributor = null;
String checkinComment = null;
Date lastModified = null;
String normalizedPackageName = null;
String uuid = null;
String packageHeaderInfo = null;
String globals = null;
ModuleType type = null;
Map<String, String> catRules = null;
String assetExportFileName = null;
NodeList moduleProps = moduleNode.getChildNodes();
for ( int i = 0; i < moduleProps.getLength(); i++ ) {
Node propertyNode = moduleProps.item( i );
String nodeContent = propertyNode.getTextContent();
if ( MODULE_NAME.equalsIgnoreCase( propertyNode.getNodeName() ) ) {
name = unEscapeXml( nodeContent );
} else if ( MODULE_LAST_CONTRIBUTOR.equalsIgnoreCase( propertyNode.getNodeName() ) ) {
lastContributor = nodeContent;
} else if ( MODULE_CHECKIN_COMMENT.equalsIgnoreCase( propertyNode.getNodeName() ) ) {
checkinComment = parseCheckinComment( propertyNode );
} else if ( MODULE_LAST_MODIFIED.equalsIgnoreCase( propertyNode.getNodeName() ) ) {
lastModified = new Date( Long.parseLong( nodeContent, 10 ) );
} else if ( MODULE_NORM_PACKAGENAME.equalsIgnoreCase( propertyNode.getNodeName() ) ) {
normalizedPackageName = nodeContent;
} else if ( MODULE_UUID.equalsIgnoreCase( propertyNode.getNodeName() ) ) {
uuid = nodeContent;
} else if ( MODULE_TYPE.equalsIgnoreCase( propertyNode.getNodeName() ) ) {
type = ModuleType.getByName( nodeContent );
} else if ( MODULE_PACKAGEHEADER.equalsIgnoreCase( propertyNode.getNodeName() ) ) {
packageHeaderInfo = parsePackageHeaderInfo( propertyNode );
} else if ( MODULE_GLOBALS.equalsIgnoreCase( propertyNode.getNodeName() ) ) {
globals = parseGlobals( propertyNode );
} else if ( MODULE_CATRULES.equalsIgnoreCase( propertyNode.getNodeName() ) ) {
catRules = parseCatRules( propertyNode );
} else if ( MODULE_ASSET_FILE.equalsIgnoreCase( propertyNode.getNodeName() ) ) {
assetExportFileName = nodeContent;
}
}
return new Module( type,
uuid,
name,
lastContributor,
checkinComment,
lastModified,
normalizedPackageName,
packageHeaderInfo,
globals,
catRules,
assetExportFileName );
}
private String formatCheckinComment( String checkinComment ) {
StringBuilder sbCheckinComment = new StringBuilder( LT );
sbCheckinComment.append( MODULE_CHECKIN_COMMENT ).append( GT );
if ( StringUtils.isNotBlank( checkinComment ) ) {
sbCheckinComment.append( formatCdataSection( checkinComment ) );
}
sbCheckinComment.append( LT_SLASH ).append( MODULE_CHECKIN_COMMENT ).append( GT );
return sbCheckinComment.toString();
}
private String parseCheckinComment( Node checkinCommentNode ) {
if ( !MODULE_CHECKIN_COMMENT.equalsIgnoreCase( checkinCommentNode.getNodeName() ) )
throw new IllegalArgumentException( "Wrong xml format: " + MODULE_CHECKIN_COMMENT );
return parseCdataSection( checkinCommentNode ); // Need the CData parent-node
}
private String formatCatRules( Module module ) {
StringBuilder sbCatRules = new StringBuilder( LT ).append( MODULE_CATRULES ).append( GT );
Map<String, String> mapCatRules = module.getCatRules();
if ( mapCatRules.size() > 0 ) {
sbCatRules.append( formatMap( mapCatRules ) );
}
sbCatRules.append( LT_SLASH ).append( MODULE_CATRULES ).append( GT );
return sbCatRules.toString();
}
private Map<String, String> parseCatRules( Node catRulesNode ) {
Map<String, String> catRules;
NodeList catRulesNodeChildren = catRulesNode.getChildNodes();
if ( catRulesNodeChildren.getLength() > 1 ) throw new IllegalArgumentException( "Wrong xml format: " + MODULE_CATRULES );
catRules = parseMap( catRulesNodeChildren.item( 0 ) );
return catRules;
}
private String formatPackageHeaderInfo( String packageHeaderInfo ) {
StringBuilder sbPackageHeader = new StringBuilder( LT );
sbPackageHeader.append( MODULE_PACKAGEHEADER ).append( GT );
if ( StringUtils.isNotBlank( packageHeaderInfo ) ) {
sbPackageHeader.append( formatCdataSection( packageHeaderInfo ) );
}
sbPackageHeader.append( LT_SLASH ).append( MODULE_PACKAGEHEADER ).append( GT );
return sbPackageHeader.toString();
}
private String parsePackageHeaderInfo( Node headerInfoNode ) {
if ( !MODULE_PACKAGEHEADER.equalsIgnoreCase( headerInfoNode.getNodeName() ) )
throw new IllegalArgumentException( "Wrong xml format: " + MODULE_PACKAGEHEADER );
return parseCdataSection( headerInfoNode ); // Need the CData parent-node
}
private String formatGlobals( String globals ) {
StringBuilder sbGlobals = new StringBuilder( LT );
sbGlobals.append( MODULE_GLOBALS ).append( GT );
if ( StringUtils.isNotBlank( globals ) ) {
sbGlobals.append( formatCdataSection( globals ) );
}
sbGlobals.append( LT_SLASH ).append( MODULE_GLOBALS ).append( GT );
return sbGlobals.toString();
}
private String parseGlobals( Node globalsNode ) {
if ( !MODULE_GLOBALS.equalsIgnoreCase( globalsNode.getNodeName() ) )
throw new IllegalArgumentException( "Wrong xml format: " + MODULE_GLOBALS );
return parseCdataSection( globalsNode ); // Need the CData parent-node
}
}