/******************************************************************************* * 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 java.io.File; import java.net.URL; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.StringTokenizer; import org.apache.ofbiz.base.component.ComponentConfig; import org.apache.ofbiz.base.config.GenericConfigException; import org.apache.ofbiz.base.config.MainResourceHandler; import org.apache.ofbiz.base.config.ResourceHandler; import org.apache.ofbiz.base.util.Debug; import org.apache.ofbiz.base.util.UtilProperties; import org.apache.ofbiz.base.util.UtilValidate; import org.apache.ofbiz.entity.Delegator; import org.apache.ofbiz.entity.GenericEntityConfException; import org.apache.ofbiz.entity.GenericEntityException; import org.apache.ofbiz.entity.GenericValue; import org.apache.ofbiz.entity.config.model.Datasource; import org.apache.ofbiz.entity.config.model.EntityConfig; import org.apache.ofbiz.entity.config.model.EntityDataReader; import org.apache.ofbiz.entity.config.model.ReadData; import org.apache.ofbiz.entity.config.model.Resource; import org.apache.ofbiz.entity.config.model.SqlLoadPath; import org.apache.ofbiz.entity.model.ModelEntity; import org.apache.ofbiz.entity.model.ModelReader; import org.apache.ofbiz.entity.model.ModelUtil; import org.apache.ofbiz.entity.model.ModelViewEntity; import org.w3c.dom.Element; /** * Some utility routines for loading seed data. */ public class EntityDataLoader { public static final String module = EntityDataLoader.class.getName(); public static String getPathsString(String helperName) { StringBuilder pathBuffer = new StringBuilder(); if (UtilValidate.isNotEmpty(helperName)) { Datasource datasourceInfo = EntityConfig.getDatasource(helperName); for (SqlLoadPath sqlLoadPath : datasourceInfo.getSqlLoadPathList()) { String prependEnv = sqlLoadPath.getPrependEnv(); pathBuffer.append(pathBuffer.length() == 0 ? "" : ";"); if (UtilValidate.isNotEmpty(prependEnv)) { pathBuffer.append(System.getProperty(prependEnv)); pathBuffer.append("/"); } pathBuffer.append(sqlLoadPath.getPath()); } } return pathBuffer.toString(); } public static List<URL> getUrlList(String helperName) { Datasource datasourceInfo = EntityConfig.getDatasource(helperName); return getUrlList(helperName, null, datasourceInfo.getReadDataList()); } public static List<URL> getUrlList(String helperName, String componentName) { Datasource datasourceInfo = EntityConfig.getDatasource(helperName); return getUrlList(helperName, componentName, datasourceInfo.getReadDataList()); } public static <E> List<URL> getUrlList(String helperName, List<E> readerNames) { return getUrlList(helperName, null, readerNames); } public static <E> List<URL> getUrlList(String helperName, String componentName, List<E> readerNames) { String paths = getPathsString(helperName); List<URL> urlList = new LinkedList<URL>(); // first get files from resources if (readerNames != null) { for (Object readerInfo: readerNames) { String readerName = null; if (readerInfo instanceof String) { readerName = (String) readerInfo; } else if (readerInfo instanceof ReadData) { readerName = ((ReadData) readerInfo).getReaderName(); } else if (readerInfo instanceof Element) { readerName = ((Element) readerInfo).getAttribute("reader-name"); } else { throw new IllegalArgumentException("Reader name list does not contain String(s) or Element(s)"); } readerName = readerName.trim(); // ignore the "tenant" reader if multitenant is disabled if ("tenant".equals(readerName) && !EntityUtil.isMultiTenantEnabled()) { continue; } // get all of the main resource model stuff, ie specified in the entityengine.xml file EntityDataReader entityDataReaderInfo = null; try { entityDataReaderInfo = EntityConfig.getInstance().getEntityDataReader(readerName); if (entityDataReaderInfo == null) { // create a reader name defined at runtime Debug.logInfo("Could not find entity-data-reader named: " + readerName + ". Creating a new reader with this name. ", module); entityDataReaderInfo = new EntityDataReader(readerName); } } catch (GenericEntityConfException e) { Debug.logWarning(e, "Exception thrown while getting entity data reader config: ", module); } if (entityDataReaderInfo != null) { for (Resource resourceElement: entityDataReaderInfo.getResourceList()) { ResourceHandler handler = new MainResourceHandler(EntityConfig.ENTITY_ENGINE_XML_FILENAME, resourceElement.getLoader(), resourceElement.getLocation()); try { urlList.add(handler.getURL()); } catch (GenericConfigException e) { String errorMsg = "Could not get URL for Main ResourceHandler: " + e.toString(); Debug.logWarning(errorMsg, module); } } // get all of the component resource model stuff, ie specified in each ofbiz-component.xml file for (ComponentConfig.EntityResourceInfo componentResourceInfo: ComponentConfig.getAllEntityResourceInfos("data", componentName)) { if (readerName.equals(componentResourceInfo.readerName)) { ResourceHandler handler = componentResourceInfo.createResourceHandler(); try { urlList.add(handler.getURL()); } catch (GenericConfigException e) { String errorMsg = "Could not get URL for Component ResourceHandler: " + e.toString(); Debug.logWarning(errorMsg, module); } } } } else { String errorMsg = "Could not find entity-data-reader named: " + readerName; Debug.logWarning(errorMsg, module); } } } else { String errorMsg = "Could not find datasource named: " + helperName; Debug.logWarning(errorMsg, module); } // get files from the paths string if (UtilValidate.isNotEmpty(paths)) { StringTokenizer tokenizer = new StringTokenizer(paths, ";"); while (tokenizer.hasMoreTokens()) { String path = tokenizer.nextToken().toLowerCase(); File loadDir = new File(path); if (loadDir.exists() && loadDir.isDirectory()) { File[] files = loadDir.listFiles(); List<File> tempFileList = new LinkedList<File>(); for (File file: files) { if (file.getName().toLowerCase().endsWith(".xml")) { tempFileList.add(file); } } Collections.sort(tempFileList); for (File dataFile: tempFileList) { if (dataFile.exists()) { URL url = null; try { url = dataFile.toURI().toURL(); urlList.add(url); } catch (java.net.MalformedURLException e) { String xmlError = "Error loading XML file \"" + dataFile.getAbsolutePath() + "\"; Error was: " + e.getMessage(); Debug.logError(xmlError, module); } } else { String errorMsg = "Could not find file: \"" + dataFile.getAbsolutePath() + "\""; Debug.logError(errorMsg, module); } } } } } return urlList; } public static List<URL> getUrlByComponentList(String helperName, List<String> components, List<String> readerNames) { List<URL> urlList = new LinkedList<URL>(); for (String readerName: readerNames) { List<String> loadReaderNames = new LinkedList<String>(); loadReaderNames.add(readerName); for (String component : components) { urlList.addAll(getUrlList(helperName, component, loadReaderNames)); } } return urlList; } public static List<URL> getUrlByComponentList(String helperName, List<String> components) { Datasource datasourceInfo = EntityConfig.getDatasource(helperName); List<String> readerNames = new LinkedList<String>(); for (ReadData readerInfo : datasourceInfo.getReadDataList()) { String readerName = readerInfo.getReaderName(); // ignore the "tenant" reader if the multitenant property is "N" if ("tenant".equals(readerName) && "N".equals(UtilProperties.getPropertyValue("general", "multitenant"))) { continue; } readerNames.add(readerName); } return getUrlByComponentList(helperName, components, readerNames); } public static int loadData(URL dataUrl, String helperName, Delegator delegator, List<Object> errorMessages) throws GenericEntityException { return loadData(dataUrl, helperName, delegator, errorMessages, -1); } public static int loadData(URL dataUrl, String helperName, Delegator delegator, List<Object> errorMessages, int txTimeout) throws GenericEntityException { return loadData(dataUrl, helperName, delegator, errorMessages, txTimeout, false, false, false); } public static int loadData(URL dataUrl, String helperName, Delegator delegator, List<Object> errorMessages, int txTimeout, boolean dummyFks, boolean maintainTxs, boolean tryInsert) throws GenericEntityException { int rowsChanged = 0; if (dataUrl == null) { String errMsg = "Cannot load data, dataUrl was null"; errorMessages.add(errMsg); Debug.logError(errMsg, module); return 0; } Debug.logVerbose("[loadData] Loading XML Resource: \"" + dataUrl.toExternalForm() + "\"", module); try { /* The OLD way List toBeStored = delegator.readXmlDocument(url); delegator.storeAll(toBeStored); rowsChanged += toBeStored.size(); */ EntitySaxReader reader = null; if (txTimeout > 0) { reader = new EntitySaxReader(delegator, txTimeout); } else { reader = new EntitySaxReader(delegator); } reader.setCreateDummyFks(dummyFks); reader.setMaintainTxStamps(maintainTxs); rowsChanged += reader.parse(dataUrl); } catch (Exception e) { String xmlError = "[loadData]: Error loading XML Resource \"" + dataUrl.toExternalForm() + "\"; Error was: " + e.getMessage(); errorMessages.add(xmlError); Debug.logError(e, xmlError, module); } return rowsChanged; } public static int generateData(Delegator delegator, List<Object> errorMessages) throws GenericEntityException { int rowsChanged = 0; ModelReader reader = delegator.getModelReader(); for (String entityName: reader.getEntityNames()) { ModelEntity entity = reader.getModelEntity(entityName); String baseName = entity.getPlainTableName(); if (entity instanceof ModelViewEntity) { baseName = ModelUtil.javaNameToDbName(entity.getEntityName()); } if (baseName != null) { try { List<GenericValue> toBeStored = new LinkedList<GenericValue>(); toBeStored.add( delegator.makeValue( "SecurityPermission", "permissionId", baseName + "_ADMIN", "description", "Permission to Administer a " + entity.getEntityName() + " entity.")); toBeStored.add(delegator.makeValue("SecurityGroupPermission", "groupId", "FULLADMIN", "permissionId", baseName + "_ADMIN")); rowsChanged += delegator.storeAll(toBeStored); } catch (GenericEntityException e) { errorMessages.add("[generateData] ERROR: Failed Security Generation for entity \"" + baseName + "\""); } /* toStore.add(delegator.makeValue("SecurityPermission", "permissionId", baseName + "_VIEW", "description", "Permission to View a " + entity.getEntityName() + " entity.")); toStore.add(delegator.makeValue("SecurityPermission", "permissionId", baseName + "_CREATE", "description", "Permission to Create a " + entity.getEntityName() + " entity.")); toStore.add(delegator.makeValue("SecurityPermission", "permissionId", baseName + "_UPDATE", "description", "Permission to Update a " + entity.getEntityName() + " entity.")); toStore.add(delegator.makeValue("SecurityPermission", "permissionId", baseName + "_DELETE", "description", "Permission to Delete a " + entity.getEntityName() + " entity.")); toStore.add(delegator.makeValue("SecurityGroupPermission", "groupId", "FLEXADMIN", "permissionId", baseName + "_VIEW")); toStore.add(delegator.makeValue("SecurityGroupPermission", "groupId", "FLEXADMIN", "permissionId", baseName + "_CREATE")); toStore.add(delegator.makeValue("SecurityGroupPermission", "groupId", "FLEXADMIN", "permissionId", baseName + "_UPDATE")); toStore.add(delegator.makeValue("SecurityGroupPermission", "groupId", "FLEXADMIN", "permissionId", baseName + "_DELETE")); */ } } return rowsChanged; } }