Skip to content

Commit

Permalink
implements the BIF XMLNew
Browse files Browse the repository at this point in the history
  • Loading branch information
jclausen committed Apr 10, 2024
1 parent 9c613d7 commit 27e9c8f
Show file tree
Hide file tree
Showing 3 changed files with 158 additions and 8 deletions.
57 changes: 57 additions & 0 deletions src/main/java/ortus/boxlang/runtime/bifs/global/xml/XMLNew.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@

/**
* [BoxLang]
*
* Copyright [2023] [Ortus Solutions, Corp]
*
* 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 ortus.boxlang.runtime.bifs.global.xml;

import ortus.boxlang.runtime.bifs.BIF;
import ortus.boxlang.runtime.bifs.BoxBIF;
import ortus.boxlang.runtime.context.IBoxContext;
import ortus.boxlang.runtime.scopes.ArgumentsScope;
import ortus.boxlang.runtime.scopes.Key;
import ortus.boxlang.runtime.types.Argument;
import ortus.boxlang.runtime.types.XML;

@BoxBIF

public class XMLNew extends BIF {

/**
* Constructor
*/
public XMLNew() {
super();
declaredArguments = new Argument[] {
new Argument( true, "boolean", Key.caseSensitive, false )
};
}

/**
* Creates a new empty XML Object
*
* @param context The context in which the BIF is being invoked.
* @param arguments Argument scope for the BIF.
*
* @argument.caseSensitive Whether the identifiers in the XML document ( e.g. dot notation ) are case sensitive
*/
public Object _invoke( IBoxContext context, ArgumentsScope arguments ) {
Boolean caseSensitive = arguments.getAsBoolean( Key.caseSensitive );
return new XML( caseSensitive );
}

}
38 changes: 30 additions & 8 deletions src/main/java/ortus/boxlang/runtime/types/XML.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,11 @@ public class XML implements Serializable, IStruct {
*/
public BoxMeta $bx;

/**
* The type of struct ( private so that the interface method `getType` will be used )
*/
private final TYPES type;

/**
* Function service
*/
Expand All @@ -105,6 +110,8 @@ public class XML implements Serializable, IStruct {
*/
public XML( String xmlData ) {

this.type = TYPES.DEFAULT;

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
try {
Expand All @@ -126,7 +133,15 @@ public XML( String xmlData ) {
* Create a new XML Document from the given string
*/
public XML( Node node ) {
this.node = node;
this.type = TYPES.DEFAULT;
this.node = node;
}

/**
* Create a new XML Document from the given string
*/
public XML( Boolean caseSenstive ) {
this.type = caseSenstive ? TYPES.CASE_SENSITIVE : TYPES.DEFAULT;
}

/**
Expand All @@ -152,12 +167,14 @@ public String getXMLText() {
* @return the element children
*/
public List<XML> getXMLChildrenAsList() {
List<XML> children = new ArrayList<XML>();
NodeList childNodes = node.getChildNodes();
for ( int i = 0; i < childNodes.getLength(); i++ ) {
Node child = childNodes.item( i );
if ( child.getNodeType() == Node.ELEMENT_NODE ) {
children.add( new XML( child ) );
List<XML> children = new ArrayList<XML>();
if ( node != null ) {
NodeList childNodes = node.getChildNodes();
for ( int i = 0; i < childNodes.getLength(); i++ ) {
Node child = childNodes.item( i );
if ( child.getNodeType() == Node.ELEMENT_NODE ) {
children.add( new XML( child ) );
}
}
}
return children;
Expand Down Expand Up @@ -668,14 +685,19 @@ public String toStringWithCase() {
return toString();
}

@Override
public String toString() {
return asString();
}

@Override
public IStruct.TYPES getType() {
return IStruct.TYPES.DEFAULT;
}

@Override
public Boolean isCaseSensitive() {
return false;
return type.equals( TYPES.CASE_SENSITIVE );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@

/**
* [BoxLang]
*
* Copyright [2023] [Ortus Solutions, Corp]
*
* 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 ortus.boxlang.runtime.bifs.global.xml;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import ortus.boxlang.runtime.BoxRuntime;
import ortus.boxlang.runtime.context.IBoxContext;
import ortus.boxlang.runtime.context.ScriptingRequestBoxContext;
import ortus.boxlang.runtime.dynamic.casters.XMLCaster;
import ortus.boxlang.runtime.scopes.IScope;
import ortus.boxlang.runtime.scopes.Key;
import ortus.boxlang.runtime.scopes.VariablesScope;
import ortus.boxlang.runtime.types.XML;

public class XMLNewTest {

static BoxRuntime instance;
IBoxContext context;
IScope variables;
static Key result = new Key( "result" );

@BeforeAll
public static void setUp() {
instance = BoxRuntime.getInstance( true );
}

@AfterAll
public static void teardown() {
}

@BeforeEach
public void setupEach() {
context = new ScriptingRequestBoxContext( instance.getRuntimeContext() );
variables = context.getScopeNearby( VariablesScope.name );
}

@DisplayName( "It tests the BIF XMLNew" )
@Test
public void testBif() {
XML xmlObject = XMLCaster.cast( instance.executeStatement( "XMLNew()" ) );
assertTrue( StringUtils.contains( xmlObject.toString(), "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" ) );
assertEquals( xmlObject.size(), 0 );
}

}

0 comments on commit 27e9c8f

Please sign in to comment.