/* * 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. * 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.kie.workbench.common.screens.datamodeller.util; import java.util.ArrayList; import java.util.List; import org.kie.workbench.common.screens.datamodeller.model.persistence.CachingType; import org.kie.workbench.common.screens.datamodeller.model.persistence.PersistenceDescriptorModel; import org.kie.workbench.common.screens.datamodeller.model.persistence.PersistenceUnitModel; import org.kie.workbench.common.screens.datamodeller.model.persistence.Property; import org.kie.workbench.common.screens.datamodeller.model.persistence.TransactionType; import org.kie.workbench.common.screens.datamodeller.model.persistence.ValidationMode; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public class DOM2PersistenceDescriptorVisitor { PersistenceDescriptorModel descriptorModel; Document document; public DOM2PersistenceDescriptorVisitor( Document document ) { this.document = document; } public PersistenceDescriptorModel visit() { visitPersistence( document.getDocumentElement() ); return descriptorModel; } private void visitPersistence( Element element ) { descriptorModel = new PersistenceDescriptorModel(); descriptorModel.setVersion( element.getAttribute( PersistenceDescriptorXMLMarshaller.VERSION ) ); NodeList children = element.getElementsByTagName( PersistenceDescriptorXMLMarshaller.PERSISTENCE_UNIT ); if ( children != null && children.getLength() > 0 ) { for ( int i = 0; i < children.getLength(); i++ ) { visitPersistenceUnit( (Element) children.item( i ) ); } } } private void visitPersistenceUnit( Element element ) { PersistenceUnitModel persistenceUnit = new PersistenceUnitModel(); descriptorModel.setPersistenceUnit( persistenceUnit ); persistenceUnit.setName( element.getAttribute( PersistenceDescriptorXMLMarshaller.NAME ) ); String transactionType = element.getAttribute( PersistenceDescriptorXMLMarshaller.TRANSACTION_TYPE ); persistenceUnit.setTransactionType( parseTransactionType( transactionType ) ); visitDescription( persistenceUnit, element.getElementsByTagName( PersistenceDescriptorXMLMarshaller.DESCRIPTION ) ); visitProvider( persistenceUnit, element.getElementsByTagName( PersistenceDescriptorXMLMarshaller.PROVIDER ) ); visitJTADataSource( persistenceUnit, element.getElementsByTagName( PersistenceDescriptorXMLMarshaller.JTA_DATA_SOURCE ) ); visitNonJTADataSource( persistenceUnit, element.getElementsByTagName( PersistenceDescriptorXMLMarshaller.NON_JTA_DATA_SOURCE ) ); visitMappingFile( persistenceUnit, element.getElementsByTagName( PersistenceDescriptorXMLMarshaller.MAPPING_FILE ) ); visitJarFile( persistenceUnit, element.getElementsByTagName( PersistenceDescriptorXMLMarshaller.JAR_FILE ) ); visitClass( persistenceUnit, element.getElementsByTagName( PersistenceDescriptorXMLMarshaller.CLASS ) ); visitExcludeUnlistedClasses( persistenceUnit, element.getElementsByTagName( PersistenceDescriptorXMLMarshaller.EXCLUDE_UNLISTED_CLASSES ) ); visitSharedCacheMode( persistenceUnit, element.getElementsByTagName( PersistenceDescriptorXMLMarshaller.SHARED_CACHE_MODE ) ); visitValidationMode( persistenceUnit, element.getElementsByTagName( PersistenceDescriptorXMLMarshaller.VALIDATION_MODE ) ); visitProperties( persistenceUnit, element.getElementsByTagName( PersistenceDescriptorXMLMarshaller.PROPERTIES ) ); } private void visitDescription( PersistenceUnitModel persistenceUnit, NodeList nodes ) { persistenceUnit.setDescription( parseSimpleTextElement( nodes ) ); } private void visitProvider( PersistenceUnitModel persistenceUnit, NodeList nodes ) { persistenceUnit.setProvider( parseSimpleTextElement( nodes ) ); } private void visitJTADataSource( PersistenceUnitModel persistenceUnit, NodeList nodes ) { persistenceUnit.setJtaDataSource( parseSimpleTextElement( nodes ) ); } private void visitNonJTADataSource( PersistenceUnitModel persistenceUnit, NodeList nodes ) { persistenceUnit.setNonJtaDataSource( parseSimpleTextElement( nodes ) ); } private void visitMappingFile( PersistenceUnitModel persistenceUnit, NodeList nodes ) { persistenceUnit.setMappingFile( parseSimpleTextElementList( nodes ) ); } private void visitJarFile( PersistenceUnitModel persistenceUnit, NodeList nodes ) { persistenceUnit.setJarFile( parseSimpleTextElementList( nodes ) ); } private void visitClass( PersistenceUnitModel persistenceUnit, NodeList nodes ) { persistenceUnit.setClasses( parseSimpleTextElementList( nodes ) ); } private void visitExcludeUnlistedClasses( PersistenceUnitModel persistenceUnit, NodeList nodes ) { persistenceUnit.setExcludeUnlistedClasses( Boolean.parseBoolean( parseSimpleTextElement( nodes ) ) ); } private void visitSharedCacheMode( PersistenceUnitModel persistenceUnit, NodeList nodes ) { String value = parseSimpleTextElement( nodes ); persistenceUnit.setSharedCacheMode( value != null ? CachingType.valueOf( value ) : null ); } private void visitValidationMode( PersistenceUnitModel persistenceUnit, NodeList nodes ) { String value = parseSimpleTextElement( nodes ); persistenceUnit.setValidationMode( value != null ? ValidationMode.valueOf( value ) : null ); } private void visitProperties( PersistenceUnitModel persistenceUnit, NodeList nodes ) { List<Property> properties = new ArrayList<Property>( ); persistenceUnit.setProperties( properties ); if ( nodes != null && nodes.getLength() > 0 ) { Element element = (Element) nodes.item( 0 ); NodeList propertyNodes = element.getElementsByTagName( PersistenceDescriptorXMLMarshaller.PROPERTY ); if ( propertyNodes != null && propertyNodes.getLength() > 0 ) { for ( int i = 0; i < propertyNodes.getLength(); i++ ) { visitProperty( properties, ( Element ) propertyNodes.item( i) ); } } } } private void visitProperty( List<Property> properties, Element item ) { Property property = new Property( item.getAttribute( PersistenceDescriptorXMLMarshaller.NAME ), item.getAttribute( PersistenceDescriptorXMLMarshaller.VALUE ) ); properties.add( property ); } private List<String> parseSimpleTextElementList( NodeList nodes ) { List<String> result = new ArrayList<String>( ); if ( nodes != null && nodes.getLength() > 0 ) { Element element; for ( int i = 0; i < nodes.getLength(); i++ ) { element = (Element) nodes.item( i ); result.add( element.getTextContent() ); } } return result; } private String parseSimpleTextElement( NodeList nodes ) { String result = null; if ( nodes != null && nodes.getLength() > 0 ) { Element element = (Element) nodes.item( 0 ); result = element.getTextContent(); } return result; } private TransactionType parseTransactionType( String value ) { if ( value != null ) { try { return TransactionType.valueOf( value.trim() ); } catch ( Exception e ) { //invalid values will be interpreted as if the transaction type is not set //this will le the user the chance to set a valid value in the UI } } return null; } }