| /******************************************************************************* |
| * 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.config.model; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| |
| import org.apache.ofbiz.base.lang.ThreadSafe; |
| import org.apache.ofbiz.base.util.UtilXml; |
| import org.apache.ofbiz.entity.GenericEntityConfException; |
| import org.w3c.dom.Element; |
| |
| /** |
| * An object that models the <code><datasource></code> element. |
| * |
| * @see <code>entity-config.xsd</code> |
| */ |
| @ThreadSafe |
| public final class Datasource { |
| |
| /* |
| public static final int TYPE_JNDI_JDBC = 1; |
| public static final int TYPE_INLINE_JDBC = 2; |
| public static final int TYPE_TYREX_DATA_SOURCE = 3; |
| public static final int TYPE_OTHER = 4; |
| */ |
| |
| private final String name; // type = xs:string |
| private final String helperClass; // type = xs:string |
| private final String fieldTypeName; // type = xs:string |
| private final boolean useSchemas; |
| private final String schemaName; // type = xs:string |
| private final boolean checkOnStart; |
| private final boolean addMissingOnStart; |
| private final boolean usePkConstraintNames; |
| private final boolean checkPksOnStart; |
| private final int constraintNameClipLength; // type = xs:nonNegativeInteger |
| private final boolean useProxyCursor; |
| private final String proxyCursorName; // type = xs:string |
| private final int resultFetchSize; // type = xs:integer |
| private final boolean useForeignKeys; |
| private final boolean useForeignKeyIndices; |
| private final boolean checkFksOnStart; |
| private final boolean checkFkIndicesOnStart; |
| private final String fkStyle; |
| private final boolean useFkInitiallyDeferred; |
| private final boolean useIndices; |
| private final boolean useIndicesUnique; |
| private final boolean checkIndicesOnStart; |
| private final String joinStyle; |
| private final boolean aliasViewColumns; |
| private final boolean alwaysUseConstraintKeyword; |
| private final boolean dropFkUseForeignKeyKeyword; |
| private final boolean useBinaryTypeForBlob; |
| private final boolean useOrderByNulls; |
| private final String offsetStyle; |
| private final String tableType; // type = xs:string |
| private final String characterSet; // type = xs:string |
| private final String collate; // type = xs:string |
| private final int maxWorkerPoolSize; // type = xs:integer |
| private final List<SqlLoadPath> sqlLoadPathList; // <sql-load-path> |
| private final List<ReadData> readDataList; // <read-data> |
| private final InlineJdbc inlineJdbc; // <inline-jdbc> |
| private final JndiJdbc jndiJdbc; // <jndi-jdbc> |
| private final TyrexDataSource tyrexDataSource; // <tyrex-dataSource> |
| |
| Datasource(Element element) throws GenericEntityConfException { |
| String lineNumberText = EntityConfig.createConfigFileLineNumberText(element); |
| String name = element.getAttribute("name").intern(); |
| if (name.isEmpty()) { |
| throw new GenericEntityConfException("<datasource> element name attribute is empty" + lineNumberText); |
| } |
| this.name = name; |
| String helperClass = element.getAttribute("helper-class").intern(); |
| if (helperClass.isEmpty()) { |
| throw new GenericEntityConfException("<datasource> element helper-class attribute is empty" + lineNumberText); |
| } |
| this.helperClass = helperClass; |
| String fieldTypeName = element.getAttribute("field-type-name").intern(); |
| if (fieldTypeName.isEmpty()) { |
| throw new GenericEntityConfException("<datasource> element field-type-name attribute is empty" + lineNumberText); |
| } |
| this.fieldTypeName = fieldTypeName; |
| this.useSchemas = !"false".equals(element.getAttribute("use-schemas")); |
| this.schemaName = element.getAttribute("schema-name").intern(); |
| this.checkOnStart = !"false".equals(element.getAttribute("check-on-start")); |
| this.addMissingOnStart = "true".equals(element.getAttribute("add-missing-on-start")); |
| this.usePkConstraintNames = !"false".equals(element.getAttribute("use-pk-constraint-names")); |
| this.checkPksOnStart = !"false".equals(element.getAttribute("check-pks-on-start")); |
| String constraintNameClipLength = element.getAttribute("constraint-name-clip-length"); |
| if (constraintNameClipLength.isEmpty()) { |
| this.constraintNameClipLength = 30; |
| } else { |
| try { |
| this.constraintNameClipLength = Integer.parseInt(constraintNameClipLength); |
| } catch (Exception e) { |
| throw new GenericEntityConfException("<datasource> element constraint-name-clip-length attribute is invalid" + lineNumberText); |
| } |
| } |
| this.useProxyCursor = "true".equalsIgnoreCase(element.getAttribute("use-proxy-cursor")); |
| String proxyCursorName = element.getAttribute("proxy-cursor-name").intern(); |
| if (proxyCursorName.isEmpty()) { |
| proxyCursorName = "p_cursor"; |
| } |
| this.proxyCursorName = proxyCursorName; |
| String resultFetchSize = element.getAttribute("result-fetch-size"); |
| if (resultFetchSize.isEmpty()) { |
| this.resultFetchSize = -1; |
| } else { |
| try { |
| this.resultFetchSize = Integer.parseInt(resultFetchSize); |
| } catch (Exception e) { |
| throw new GenericEntityConfException("<datasource> element result-fetch-size attribute is invalid" + lineNumberText); |
| } |
| } |
| this.useForeignKeys = !"false".equals(element.getAttribute("use-foreign-keys")); |
| this.useForeignKeyIndices = !"false".equals(element.getAttribute("use-foreign-key-indices")); |
| this.checkFksOnStart = "true".equals(element.getAttribute("check-fks-on-start")); |
| this.checkFkIndicesOnStart = "true".equals(element.getAttribute("check-fk-indices-on-start")); |
| String fkStyle = element.getAttribute("fk-style").intern(); |
| if (fkStyle.isEmpty()) { |
| fkStyle = "name_constraint"; |
| } |
| this.fkStyle = fkStyle; |
| this.useFkInitiallyDeferred = "true".equals(element.getAttribute("use-fk-initially-deferred")); |
| this.useIndices = !"false".equals(element.getAttribute("use-indices")); |
| this.useIndicesUnique = !"false".equals(element.getAttribute("use-indices-unique")); |
| this.checkIndicesOnStart = "true".equals(element.getAttribute("check-indices-on-start")); |
| String joinStyle = element.getAttribute("join-style").intern(); |
| if (joinStyle.isEmpty()) { |
| joinStyle = "ansi"; |
| } |
| this.joinStyle = joinStyle; |
| this.aliasViewColumns = "true".equals(element.getAttribute("alias-view-columns")); |
| this.alwaysUseConstraintKeyword = "true".equals(element.getAttribute("always-use-constraint-keyword")); |
| this.dropFkUseForeignKeyKeyword = "true".equals(element.getAttribute("drop-fk-use-foreign-key-keyword")); |
| this.useBinaryTypeForBlob = "true".equals(element.getAttribute("use-binary-type-for-blob")); |
| this.useOrderByNulls = "true".equals(element.getAttribute("use-order-by-nulls")); |
| String offsetStyle = element.getAttribute("offset-style").intern(); |
| if (offsetStyle.isEmpty()) { |
| offsetStyle = "none"; |
| } |
| this.offsetStyle = offsetStyle; |
| this.tableType = element.getAttribute("table-type").intern(); |
| this.characterSet = element.getAttribute("character-set").intern(); |
| this.collate = element.getAttribute("collate").intern(); |
| String maxWorkerPoolSize = element.getAttribute("max-worker-pool-size").intern(); |
| if (maxWorkerPoolSize.isEmpty()) { |
| this.maxWorkerPoolSize = 1; |
| } else { |
| try { |
| int maxWorkerPoolSizeInt = Integer.parseInt(maxWorkerPoolSize); |
| if (maxWorkerPoolSizeInt == 0) { |
| maxWorkerPoolSizeInt = 1; |
| } else if (maxWorkerPoolSizeInt < 0) { |
| maxWorkerPoolSizeInt = Math.abs(maxWorkerPoolSizeInt) * Runtime.getRuntime().availableProcessors(); |
| } |
| this.maxWorkerPoolSize = maxWorkerPoolSizeInt; |
| } catch (Exception e) { |
| throw new GenericEntityConfException("<datasource> element max-worker-pool-size attribute is invalid" + lineNumberText); |
| } |
| } |
| List<? extends Element> sqlLoadPathElementList = UtilXml.childElementList(element, "sql-load-path"); |
| if (sqlLoadPathElementList.isEmpty()) { |
| this.sqlLoadPathList = Collections.emptyList(); |
| } else { |
| List<SqlLoadPath> sqlLoadPathList = new ArrayList<SqlLoadPath>(sqlLoadPathElementList.size()); |
| for (Element sqlLoadPathElement : sqlLoadPathElementList) { |
| sqlLoadPathList.add(new SqlLoadPath(sqlLoadPathElement)); |
| } |
| this.sqlLoadPathList = Collections.unmodifiableList(sqlLoadPathList); |
| } |
| List<? extends Element> readDataElementList = UtilXml.childElementList(element, "read-data"); |
| if (readDataElementList.isEmpty()) { |
| this.readDataList = Collections.emptyList(); |
| } else { |
| List<ReadData> readDataList = new ArrayList<ReadData>(readDataElementList.size()); |
| for (Element readDataElement : readDataElementList) { |
| readDataList.add(new ReadData(readDataElement)); |
| } |
| this.readDataList = Collections.unmodifiableList(readDataList); |
| } |
| int jdbcElementCount = 0; |
| Element inlineJdbcElement = UtilXml.firstChildElement(element, "inline-jdbc"); |
| if (inlineJdbcElement == null) { |
| this.inlineJdbc = null; |
| } else { |
| this.inlineJdbc = new InlineJdbc(inlineJdbcElement); |
| jdbcElementCount++; |
| } |
| Element jndiJdbcElement = UtilXml.firstChildElement(element, "jndi-jdbc"); |
| if (jndiJdbcElement == null) { |
| this.jndiJdbc = null; |
| } else { |
| this.jndiJdbc = new JndiJdbc(jndiJdbcElement); |
| jdbcElementCount++; |
| } |
| Element tyrexElement = UtilXml.firstChildElement(element, "tyrex-dataSource"); |
| if (tyrexElement == null) { |
| this.tyrexDataSource = null; |
| } else { |
| this.tyrexDataSource = new TyrexDataSource(tyrexElement); |
| jdbcElementCount++; |
| } |
| if (jdbcElementCount > 1) { |
| throw new GenericEntityConfException("<datasource> element is invalid: Only one of <inline-jdbc>, <jndi-jdbc>, <tyrex-dataSource> is allowed" + lineNumberText); |
| } |
| } |
| |
| /** Returns the value of the <code>name</code> attribute. */ |
| public String getName() { |
| return this.name; |
| } |
| |
| /** Returns the value of the <code>helper-class</code> attribute. */ |
| public String getHelperClass() { |
| return this.helperClass; |
| } |
| |
| /** Returns the value of the <code>field-type-name</code> attribute. */ |
| public String getFieldTypeName() { |
| return this.fieldTypeName; |
| } |
| |
| /** Returns the value of the <code>use-schemas</code> attribute. */ |
| public boolean getUseSchemas() { |
| return this.useSchemas; |
| } |
| |
| /** Returns the value of the <code>schema-name</code> attribute. */ |
| public String getSchemaName() { |
| return this.schemaName; |
| } |
| |
| /** Returns the value of the <code>check-on-start</code> attribute. */ |
| public boolean getCheckOnStart() { |
| return this.checkOnStart; |
| } |
| |
| /** Returns the value of the <code>add-missing-on-start</code> attribute. */ |
| public boolean getAddMissingOnStart() { |
| return this.addMissingOnStart; |
| } |
| |
| /** Returns the value of the <code>use-pk-constraint-names</code> attribute. */ |
| public boolean getUsePkConstraintNames() { |
| return this.usePkConstraintNames; |
| } |
| |
| /** Returns the value of the <code>check-pks-on-start</code> attribute. */ |
| public boolean getCheckPksOnStart() { |
| return this.checkPksOnStart; |
| } |
| |
| /** Returns the value of the <code>constraint-name-clip-length</code> attribute. */ |
| public int getConstraintNameClipLength() { |
| return this.constraintNameClipLength; |
| } |
| |
| /** Returns the value of the <code>use-proxy-cursor</code> attribute. */ |
| public boolean getUseProxyCursor() { |
| return this.useProxyCursor; |
| } |
| |
| /** Returns the value of the <code>proxy-cursor-name</code> attribute. */ |
| public String getProxyCursorName() { |
| return this.proxyCursorName; |
| } |
| |
| /** Returns the value of the <code>result-fetch-size</code> attribute. */ |
| public int getResultFetchSize() { |
| return this.resultFetchSize; |
| } |
| |
| /** Returns the value of the <code>use-foreign-keys</code> attribute. */ |
| public boolean getUseForeignKeys() { |
| return this.useForeignKeys; |
| } |
| |
| /** Returns the value of the <code>use-foreign-key-indices</code> attribute. */ |
| public boolean getUseForeignKeyIndices() { |
| return this.useForeignKeyIndices; |
| } |
| |
| /** Returns the value of the <code>check-fks-on-start</code> attribute. */ |
| public boolean getCheckFksOnStart() { |
| return this.checkFksOnStart; |
| } |
| |
| /** Returns the value of the <code>check-fk-indices-on-start</code> attribute. */ |
| public boolean getCheckFkIndicesOnStart() { |
| return this.checkFkIndicesOnStart; |
| } |
| |
| /** Returns the value of the <code>fk-style</code> attribute. */ |
| public String getFkStyle() { |
| return this.fkStyle; |
| } |
| |
| /** Returns the value of the <code>use-fk-initially-deferred</code> attribute. */ |
| public boolean getUseFkInitiallyDeferred() { |
| return this.useFkInitiallyDeferred; |
| } |
| |
| /** Returns the value of the <code>use-indices</code> attribute. */ |
| public boolean getUseIndices() { |
| return this.useIndices; |
| } |
| |
| /** Returns the value of the <code>use-indices-unique</code> attribute. */ |
| public boolean getUseIndicesUnique() { |
| return this.useIndicesUnique; |
| } |
| |
| /** Returns the value of the <code>check-indices-on-start</code> attribute. */ |
| public boolean getCheckIndicesOnStart() { |
| return this.checkIndicesOnStart; |
| } |
| |
| /** Returns the value of the <code>join-style</code> attribute. */ |
| public String getJoinStyle() { |
| return this.joinStyle; |
| } |
| |
| /** Returns the value of the <code>alias-view-columns</code> attribute. */ |
| public boolean getAliasViewColumns() { |
| return this.aliasViewColumns; |
| } |
| |
| /** Returns the value of the <code>always-use-constraint-keyword</code> attribute. */ |
| public boolean getAlwaysUseConstraintKeyword() { |
| return this.alwaysUseConstraintKeyword; |
| } |
| |
| /** Returns the value of the <code>drop-fk-use-foreign-key-keyword</code> attribute. */ |
| public boolean getDropFkUseForeignKeyKeyword() { |
| return this.dropFkUseForeignKeyKeyword; |
| } |
| |
| /** Returns the value of the <code>use-binary-type-for-blob</code> attribute. */ |
| public boolean getUseBinaryTypeForBlob() { |
| return this.useBinaryTypeForBlob; |
| } |
| |
| /** Returns the value of the <code>use-order-by-nulls</code> attribute. */ |
| public boolean getUseOrderByNulls() { |
| return this.useOrderByNulls; |
| } |
| |
| /** Returns the value of the <code>offset-style</code> attribute. */ |
| public String getOffsetStyle() { |
| return this.offsetStyle; |
| } |
| |
| /** Returns the value of the <code>table-type</code> attribute. */ |
| public String getTableType() { |
| return this.tableType; |
| } |
| |
| /** Returns the value of the <code>character-set</code> attribute. */ |
| public String getCharacterSet() { |
| return this.characterSet; |
| } |
| |
| /** Returns the value of the <code>collate</code> attribute. */ |
| public String getCollate() { |
| return this.collate; |
| } |
| |
| /** Returns the value of the <code>max-worker-pool-size</code> attribute. */ |
| public int getMaxWorkerPoolSize() { |
| return this.maxWorkerPoolSize; |
| } |
| |
| /** Returns the <code><sql-load-path></code> child elements. */ |
| public List<SqlLoadPath> getSqlLoadPathList() { |
| return this.sqlLoadPathList; |
| } |
| |
| /** Returns the <code><read-data></code> child elements. */ |
| public List<ReadData> getReadDataList() { |
| return this.readDataList; |
| } |
| |
| /** Returns the <code><inline-jdbc></code> child element. */ |
| public InlineJdbc getInlineJdbc() { |
| return this.inlineJdbc; |
| } |
| |
| /** Returns the <code><jndi-jdbc></code> child element. */ |
| public JndiJdbc getJndiJdbc() { |
| return this.jndiJdbc; |
| } |
| |
| /** Returns the <code><tyrex-dataSource></code> child element. */ |
| public TyrexDataSource getTyrexDataSource() { |
| return this.tyrexDataSource; |
| } |
| } |