Author: jacopoc
Date: Fri Sep 23 18:23:23 2016 New Revision: 1762079 URL: http://svn.apache.org/viewvc?rev=1762079&view=rev Log: Implemented: converted EntitySaxReader to use the default Sax reader instead of the legacy implementation from Javolution; removed a bunch of unused or deprecated methods; created some unit tests to test the EntitySaxReader in isolation. Removed the dependency from Javolution since this was the last class dependent on it. (OFBIZ-5169) Added: ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/util/ ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/util/EntitySaxReaderTests.java (with props) Modified: ofbiz/trunk/build.gradle ofbiz/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityTestSuite.java ofbiz/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/util/EntitySaxReader.java Modified: ofbiz/trunk/build.gradle URL: http://svn.apache.org/viewvc/ofbiz/trunk/build.gradle?rev=1762079&r1=1762078&r2=1762079&view=diff ============================================================================== --- ofbiz/trunk/build.gradle (original) +++ ofbiz/trunk/build.gradle Fri Sep 23 18:23:23 2016 @@ -99,7 +99,6 @@ dependencies { compile 'javax.el:javax.el-api:3.0.1-b04' compile 'javax.servlet:javax.servlet-api:3.1.0' compile 'javax.servlet.jsp:javax.servlet.jsp-api:2.3.0' - compile 'javolution:javolution:5.4.3' compile 'junit:junit-dep:4.10' compile 'net.fortuna.ical4j:ical4j:1.0-rc3-atlassian-11' compile 'org.apache.ant:ant-junit:1.9.0' Modified: ofbiz/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityTestSuite.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityTestSuite.java?rev=1762079&r1=1762078&r2=1762079&view=diff ============================================================================== --- ofbiz/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityTestSuite.java (original) +++ ofbiz/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityTestSuite.java Fri Sep 23 18:23:23 2016 @@ -1041,13 +1041,15 @@ public class EntityTestSuite extends Ent * Tests EntitySaxReader, verification loading data with tag create, create-update, create-replace, delete */ public void testEntitySaxReaderCreation() throws Exception { - String xmlContentLoad = + String xmlContentLoad = + "<entity-engine-xml>" + "<TestingType testingTypeId=\"JUNIT-TEST\" description=\"junit test\"/>" + "<create>" + " <TestingType testingTypeId=\"JUNIT-TEST2\" description=\"junit test\"/>" + " <Testing testingId=\"T1\" testingTypeId=\"JUNIT-TEST\" testingName=\"First test\" testingSize=\"10\" testingDate=\"2010-01-01 00:00:00\"/>" + "</create>" + - "<Testing testingId=\"T2\" testingTypeId=\"JUNIT-TEST2\" testingName=\"Second test\" testingSize=\"20\" testingDate=\"2010-02-01 00:00:00\"/>"; + "<Testing testingId=\"T2\" testingTypeId=\"JUNIT-TEST2\" testingName=\"Second test\" testingSize=\"20\" testingDate=\"2010-02-01 00:00:00\"/>" + + "</entity-engine-xml>"; EntitySaxReader reader = new EntitySaxReader(delegator); long numberLoaded = reader.parse(xmlContentLoad); assertEquals("Create Entity loaded ", 4, numberLoaded); @@ -1068,8 +1070,10 @@ public class EntityTestSuite extends Ent public void testEntitySaxReaderCreateSkip() throws Exception { String xmlContentLoad = + "<entity-engine-xml>" + "<TestingType testingTypeId=\"reader-create-skip\" description=\"reader create skip\"/>" + - "<Testing testingId=\"reader-create-skip\" testingTypeId=\"reader-create-skip\" testingName=\"reader create skip\" testingSize=\"10\" testingDate=\"2010-01-01 00:00:00\"/>"; + "<Testing testingId=\"reader-create-skip\" testingTypeId=\"reader-create-skip\" testingName=\"reader create skip\" testingSize=\"10\" testingDate=\"2010-01-01 00:00:00\"/>" + + "</entity-engine-xml>"; EntitySaxReader reader = new EntitySaxReader(delegator); long numberLoaded = reader.parse(xmlContentLoad); xmlContentLoad = @@ -1089,13 +1093,15 @@ public class EntityTestSuite extends Ent public void testEntitySaxReaderUpdate() throws Exception { String xmlContentLoad = + "<entity-engine-xml>" + "<TestingType testingTypeId=\"create-update\" description=\"create update\"/>" + "<TestingType testingTypeId=\"create-updated\" description=\"create update updated\"/>" + "<Testing testingId=\"create-update-T3\" testingTypeId=\"create-update\" testingName=\"Test 3\" testingSize=\"10\" testingDate=\"2010-01-01 00:00:00\"/>" + "<create-update>" + " <Testing testingId=\"create-update-T1\" testingTypeId=\"create-update\" testingName=\"First test update\" testingSize=\"20\" testingDate=\"2010-01-01 00:00:00\"/>" + " <Testing testingId=\"create-update-T3\" testingTypeId=\"create-updated\" testingName=\"Third test\" testingSize=\"30\" testingDate=\"2010-03-01 00:00:00\"/>" + - "</create-update>"; + "</create-update>" + + "</entity-engine-xml>"; EntitySaxReader reader = new EntitySaxReader(delegator); long numberLoaded = reader.parse(xmlContentLoad); assertEquals("Update Entity loaded ", 5, numberLoaded); @@ -1116,12 +1122,14 @@ public class EntityTestSuite extends Ent public void testEntitySaxReaderReplace() throws Exception { String xmlContentLoad = + "<entity-engine-xml>" + "<TestingType testingTypeId=\"create-replace\" description=\"reader create skip\"/>" + "<Testing testingTypeId=\"create-replace\" testingId=\"create-replace-T1\" testingName=\"First test\" testingSize=\"10\" testingDate=\"2010-01-01 00:00:00\"/>" + "<create-replace>" + " <Testing testingTypeId=\"create-replace\" testingId=\"create-replace-T1\" testingName=\"First test replace\" />" + "</create-replace>" + - "<Testing testingTypeId=\"create-replace\" testingId=\"create-replace-T2\" testingName=\"Second test update\" testingSize=\"20\" testingDate=\"2010-02-01 00:00:00\"/>"; + "<Testing testingTypeId=\"create-replace\" testingId=\"create-replace-T2\" testingName=\"Second test update\" testingSize=\"20\" testingDate=\"2010-02-01 00:00:00\"/>" + + "</entity-engine-xml>"; EntitySaxReader reader = new EntitySaxReader(delegator); long numberLoaded = reader.parse(xmlContentLoad); assertEquals("Replace Entity loaded ", 4, numberLoaded); Modified: ofbiz/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/util/EntitySaxReader.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/util/EntitySaxReader.java?rev=1762079&r1=1762078&r2=1762079&view=diff ============================================================================== --- ofbiz/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/util/EntitySaxReader.java (original) +++ ofbiz/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/util/EntitySaxReader.java Fri Sep 23 18:23:23 2016 @@ -27,10 +27,14 @@ import java.io.StringWriter; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; import org.apache.ofbiz.base.location.FlexibleLocation; import org.apache.ofbiz.base.util.Base64; @@ -53,24 +57,20 @@ import org.apache.ofbiz.entity.transacti import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; -import org.xml.sax.ErrorHandler; +import org.xml.sax.Attributes; import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; import freemarker.ext.dom.NodeModel; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import freemarker.template.TemplateHashModel; -import javolution.text.CharArray; -import javolution.text.Text; -import javolution.xml.sax.Attributes; -import javolution.xml.sax.XMLReaderImpl; /** * SAX XML Parser Content Handler for Entity Engine XML files */ -public class EntitySaxReader implements javolution.xml.sax.ContentHandler, ErrorHandler { - +public class EntitySaxReader extends DefaultHandler { public static final String module = EntitySaxReader.class.getName(); public static final int DEFAULT_TX_TIMEOUT = 7200; @@ -79,7 +79,7 @@ public class EntitySaxReader implements protected EntityEcaHandler<?> ecaHandler = null; protected GenericValue currentValue = null; protected CharSequence currentFieldName = null; - protected CharSequence currentFieldValue = null; + private char[] currentFieldValue = null; protected long numberRead = 0; protected long numberCreated = 0; protected long numberUpdated = 0; @@ -94,16 +94,14 @@ public class EntitySaxReader implements protected boolean maintainTxStamps = false; protected boolean createDummyFks = false; protected boolean checkDataOnly = false; - @Deprecated - protected boolean doCacheClear = true; protected boolean disableEeca = false; protected enum Action {CREATE, CREATE_UPDATE, CREATE_REPLACE, DELETE}; protected List<String> actionTags = UtilMisc.toList("create", "create-update", "create-replace", "delete"); protected Action currentAction = Action.CREATE_UPDATE; protected List<Object> messageList = null; - protected List<GenericValue> valuesToWrite = new ArrayList<GenericValue>(valuesPerWrite); - protected List<GenericValue> valuesToDelete = new ArrayList<GenericValue>(valuesPerWrite); + protected List<GenericValue> valuesToWrite = new ArrayList<>(valuesPerWrite); + protected List<GenericValue> valuesToDelete = new ArrayList<>(valuesPerWrite); protected boolean isParseForTemplate = false; protected CharSequence templatePath = null; @@ -124,22 +122,6 @@ public class EntitySaxReader implements this(delegator, DEFAULT_TX_TIMEOUT); } - public int getValuesPerWrite() { - return this.valuesPerWrite; - } - - public void setValuesPerWrite(int valuesPerWrite) { - this.valuesPerWrite = valuesPerWrite; - } - - public int getValuesPerMessage() { - return this.valuesPerMessage; - } - - public void setValuesPerMessage(int valuesPerMessage) { - this.valuesPerMessage = valuesPerMessage; - } - public int getTransactionTimeout() { return this.transactionTimeout; } @@ -155,26 +137,14 @@ public class EntitySaxReader implements } } - public boolean getMaintainTxStamps() { - return this.maintainTxStamps; - } - public void setMaintainTxStamps(boolean maintainTxStamps) { this.maintainTxStamps = maintainTxStamps; } - public boolean getCreateDummyFks() { - return this.createDummyFks; - } - public void setCreateDummyFks(boolean createDummyFks) { this.createDummyFks = createDummyFks; } - public boolean getCheckDataOnly() { - return this.checkDataOnly; - } - public void setCheckDataOnly(boolean checkDataOnly) { this.checkDataOnly = checkDataOnly; } @@ -183,20 +153,6 @@ public class EntitySaxReader implements this.placeholderValues = placeholderValues; } - @Deprecated - public boolean getDoCacheClear() { - return this.doCacheClear; - } - - @Deprecated - public void setDoCacheClear(boolean doCacheClear) { - this.doCacheClear = doCacheClear; - } - - public boolean getDisableEeca() { - return this.disableEeca; - } - public List<Object> getMessageList() { if (this.checkDataOnly && this.messageList == null) { messageList = new LinkedList<Object>(); @@ -204,10 +160,6 @@ public class EntitySaxReader implements return this.messageList; } - public void setMessageList(List<Object> messageList) { - this.messageList = messageList; - } - public void setDisableEeca(boolean disableEeca) { this.disableEeca = disableEeca; if (disableEeca) { @@ -262,34 +214,12 @@ public class EntitySaxReader implements } public long parse(InputStream is, String docDescription) throws SAXException, java.io.IOException { - - /* NOTE: this method is not used because it doesn't work with various parsers... - String orgXmlSaxDriver = System.getProperty("org.xml.sax.driver"); - if (UtilValidate.isEmpty(orgXmlSaxDriver)) orgXmlSaxDriver = "org.apache.xerces.parsers.SAXParser"; - XMLReader reader = XMLReaderFactory.createXMLReader(orgXmlSaxDriver); - */ - - /* This code is for a standard SAXParser and XMLReader like xerces or such; for speed we are using the Javolution reader - XMLReader reader = null; - + SAXParser parser; try { - SAXParserFactory parserFactory = SAXParserFactory.newInstance(); - SAXParser parser = parserFactory.newSAXParser(); - - reader = parser.getXMLReader(); - } catch (javax.xml.parsers.ParserConfigurationException e) { - Debug.logError(e, "Failed to get a SAX XML parser", module); - throw new IllegalStateException("Failed to get a SAX XML parser"); - } - */ - - XMLReaderImpl parser = new XMLReaderImpl(); - - parser.setContentHandler(this); - parser.setErrorHandler(this); - // LocalResolver lr = new UtilXml.LocalResolver(new DefaultHandler()); - // reader.setEntityResolver(lr); - + parser = SAXParserFactory.newInstance().newSAXParser(); + } catch(ParserConfigurationException pce) { + throw new SAXException("Unable to create the SAX parser", pce); + } numberRead = 0; try { boolean beganTransaction = false; @@ -298,7 +228,7 @@ public class EntitySaxReader implements Debug.logImportant("Transaction Timeout set to " + transactionTimeout / 3600 + " hours (" + transactionTimeout + " seconds)", module); } try { - parser.parse(is); + parser.parse(is, this); // make sure all of the values to write got written... if (! valuesToWrite.isEmpty()) { writeValues(valuesToWrite); @@ -335,6 +265,16 @@ public class EntitySaxReader implements } } + private void countValue(boolean skip, boolean exist) { + if (skip) numberSkipped++; + else if (Action.DELETE == currentAction) numberDeleted++; + else if (Action.CREATE == currentAction || ! exist) numberCreated++; + else if (Action.CREATE_REPLACE == currentAction) numberReplaced++; + else numberUpdated++; + } + + // ======== ContentHandler interface implementation ======== + public void characters(char[] values, int offset, int count) throws org.xml.sax.SAXException { if (isParseForTemplate) { // if null, don't worry about it @@ -346,22 +286,22 @@ public class EntitySaxReader implements } if (currentValue != null && currentFieldName != null) { - Text value = Text.valueOf(values, offset, count); - - // Debug.logInfo("characters: value=" + value, module); + char[] newChunk = Arrays.copyOfRange(values, offset, offset + count); if (currentFieldValue == null) { - currentFieldValue = value; + // this is the first chunk + currentFieldValue = newChunk; } else { - currentFieldValue = Text.valueOf(currentFieldValue).concat(value); + // append the new chunk to currentFieldValue + char[] combined = new char[currentFieldValue.length + newChunk.length]; + System.arraycopy(currentFieldValue, 0, combined, 0, currentFieldValue.length); + System.arraycopy(newChunk, 0, combined, currentFieldValue.length, newChunk.length); + currentFieldValue = combined; } } } - public void endDocument() throws org.xml.sax.SAXException {} - - public void endElement(CharArray namespaceURI, CharArray localName, CharArray fullName) throws org.xml.sax.SAXException { - if (Debug.verboseOn()) Debug.logVerbose("endElement: localName=" + localName + ", fullName=" + fullName + ", numberRead=" + numberRead, module); - String fullNameString = fullName.toString(); + public void endElement(String namespaceURI, String localName, String fullNameString) throws org.xml.sax.SAXException { + if (Debug.verboseOn()) Debug.logVerbose("endElement: localName=" + localName + ", fullName=" + fullNameString + ", numberRead=" + numberRead, module); if ("entity-engine-xml".equals(fullNameString)) { return; } @@ -435,13 +375,10 @@ public class EntitySaxReader implements ModelField modelField = modelEntity.getField(currentFieldName.toString()); String type = modelField.getType(); if (type != null && type.equals("blob")) { - byte strData[] = new byte[currentFieldValue.length()]; - strData = currentFieldValue.toString().getBytes(); - byte binData[] = new byte[currentFieldValue.length()]; - binData = Base64.base64Decode(strData); + byte[] binData = Base64.base64Decode((new String(currentFieldValue)).getBytes()); currentValue.setBytes(currentFieldName.toString(), binData); } else { - currentValue.setString(currentFieldName.toString(), currentFieldValue.toString()); + currentValue.setString(currentFieldName.toString(), new String(currentFieldValue)); } } else { Debug.logWarning("Ignoring invalid field name [" + currentFieldName + "] found for the entity: " + currentValue.getEntityName() + " with value=" + currentFieldValue, module); @@ -465,7 +402,7 @@ public class EntitySaxReader implements boolean exist = true; boolean skip = false; //if verbose on, check if entity exist on database for count each action - //It's necessay to check also for specific action CREATE and DELETE to ensure it's ok + //It's necessary to check also for specific action CREATE and DELETE to ensure it's ok if (Action.CREATE == currentAction || Action.DELETE == currentAction || Debug.verboseOn()) { GenericHelper helper = delegator.getEntityHelper(currentValue.getEntityName()); if (currentValue.containsPrimaryKey()) { @@ -527,35 +464,12 @@ public class EntitySaxReader implements } } - //Use for detail the loading entities - protected void countValue(boolean skip, boolean exist) { - if (skip) numberSkipped++; - else if (Action.DELETE == currentAction) numberDeleted++; - else if (Action.CREATE == currentAction || ! exist) numberCreated++; - else if (Action.CREATE_REPLACE == currentAction) numberReplaced++; - else numberUpdated++; - } - - public void endPrefixMapping(CharArray prefix) throws org.xml.sax.SAXException {} - - public void ignorableWhitespace(char[] values, int offset, int count) throws org.xml.sax.SAXException { - // String value = new String(values, offset, count); - // Debug.logInfo("ignorableWhitespace: value=" + value, module); - } - - public void processingInstruction(CharArray target, CharArray instruction) throws org.xml.sax.SAXException {} - public void setDocumentLocator(org.xml.sax.Locator locator) { this.locator = locator; } - public void skippedEntity(CharArray name) throws org.xml.sax.SAXException {} - - public void startDocument() throws org.xml.sax.SAXException {} - - public void startElement(CharArray namepsaceURI, CharArray localName, CharArray fullName, Attributes attributes) throws org.xml.sax.SAXException { - if (Debug.verboseOn()) Debug.logVerbose("startElement: localName=" + localName + ", fullName=" + fullName + ", attributes=" + attributes, module); - String fullNameString = fullName.toString(); + public void startElement(String namepsaceURI, String localName, String fullNameString, Attributes attributes) throws org.xml.sax.SAXException { + if (Debug.verboseOn()) Debug.logVerbose("startElement: localName=" + localName + ", fullName=" + fullNameString + ", attributes=" + attributes, module); if ("entity-engine-xml".equals(fullNameString)) { // check the maintain-timestamp flag CharSequence maintainTx = attributes.getValue("maintain-timestamps"); @@ -563,13 +477,6 @@ public class EntitySaxReader implements this.setMaintainTxStamps("true".equalsIgnoreCase(maintainTx.toString())); } - // check the do-cache-clear flag - @Deprecated - CharSequence doCacheClear = attributes.getValue("do-cache-clear"); - if (doCacheClear != null) { - this.setDoCacheClear("true".equalsIgnoreCase(doCacheClear.toString())); - } - // check the disable-eeca flag CharSequence ecaDisable = attributes.getValue("disable-eeca"); if (ecaDisable != null) { @@ -626,7 +533,7 @@ public class EntitySaxReader implements if (currentValue != null) { // we have a nested value/CDATA element - currentFieldName = fullName; + currentFieldName = fullNameString; } else { String entityName = fullNameString; @@ -694,10 +601,7 @@ public class EntitySaxReader implements } } - //public void startPrefixMapping(String prefix, String uri) throws org.xml.sax.SAXException {} - public void startPrefixMapping(CharArray arg0, CharArray arg1) throws SAXException {} - - // ======== ErrorHandler interface implementations ======== + // ======== ErrorHandler interface implementation ======== public void error(org.xml.sax.SAXParseException exception) throws org.xml.sax.SAXException { Debug.logWarning(exception, "Error reading XML on line " + exception.getLineNumber() + ", column " + exception.getColumnNumber(), module); Added: ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/util/EntitySaxReaderTests.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/util/EntitySaxReaderTests.java?rev=1762079&view=auto ============================================================================== --- ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/util/EntitySaxReaderTests.java (added) +++ ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/util/EntitySaxReaderTests.java Fri Sep 23 18:23:23 2016 @@ -0,0 +1,66 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.ofbiz.entity.util; + +import org.apache.ofbiz.entity.Delegator; +import org.apache.ofbiz.entity.GenericValue; +import org.apache.ofbiz.entity.model.ModelEntity; +import org.junit.Test; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +public class EntitySaxReaderTests { + @Test + public void constructorWithDefaultTimeout() { + Delegator delegator = mock(Delegator.class); + EntitySaxReader esr = new EntitySaxReader(delegator); // create a reader with default tx timeout + verify(delegator).cloneDelegator(); + verifyNoMoreInteractions(delegator); + assertEquals(esr.DEFAULT_TX_TIMEOUT, esr.getTransactionTimeout()); + } + + @Test + public void constructorWithTimeout() { + Delegator delegator = mock(Delegator.class); + EntitySaxReader esr = new EntitySaxReader(delegator, 14400); // create a reader with a non default tx timeout + verify(delegator).cloneDelegator(); + verifyNoMoreInteractions(delegator); + assertEquals(14400, esr.getTransactionTimeout()); + } + + @Test + public void parse() throws Exception { + Delegator delegator = mock(Delegator.class); + Delegator clonedDelegator = mock(Delegator.class); + GenericValue genericValue = mock(GenericValue.class); + ModelEntity modelEntity = mock(ModelEntity.class); + when(delegator.cloneDelegator()).thenReturn(clonedDelegator); + when(clonedDelegator.makeValue("EntityName")).thenReturn(genericValue); + when(genericValue.getModelEntity()).thenReturn(modelEntity); + when(genericValue.containsPrimaryKey()).thenReturn(true); + when(modelEntity.isField("fieldName")).thenReturn(true); + + EntitySaxReader esr = new EntitySaxReader(delegator); + String input = "<entity-engine-xml><EntityName fieldName=\"field value\"/></entity-engine-xml>"; + long recordsProcessed = esr.parse(input); + verify(clonedDelegator).makeValue("EntityName"); + assertEquals(1, recordsProcessed); + } +} Propchange: ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/util/EntitySaxReaderTests.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/util/EntitySaxReaderTests.java ------------------------------------------------------------------------------ svn:keywords = Date Rev Author URL Id Propchange: ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/util/EntitySaxReaderTests.java ------------------------------------------------------------------------------ svn:mime-type = text/plain |
Free forum by Nabble | Edit this page |