Search in sources :

Example 46 with BroadleafRequestContext

use of org.broadleafcommerce.common.web.BroadleafRequestContext in project BroadleafCommerce by BroadleafCommerce.

the class BroadleafAdminRequestProcessor method process.

@Override
public void process(WebRequest request) throws SiteNotFoundException {
    BroadleafRequestContext brc = BroadleafRequestContext.getBroadleafRequestContext();
    if (brc == null) {
        brc = new BroadleafRequestContext();
        BroadleafRequestContext.setBroadleafRequestContext(brc);
    }
    brc.getAdditionalProperties().putAll(entityExtensionManagers);
    if (brc.getSite() == null) {
        Site site = siteResolver.resolveSite(request);
        brc.setSite(site);
    }
    brc.setWebRequest(request);
    brc.setIgnoreSite(brc.getSite() == null);
    brc.setAdmin(true);
    if (adminStrictValidateProductionChanges) {
        brc.setValidateProductionChangesState(ValidateProductionChangesState.ADMIN);
    } else {
        brc.setValidateProductionChangesState(ValidateProductionChangesState.UNDEFINED);
    }
    Locale locale = localeResolver.resolveLocale(request);
    brc.setLocale(locale);
    brc.setMessageSource(messageSource);
    TimeZone timeZone = broadleafTimeZoneResolver.resolveTimeZone(request);
    brc.setTimeZone(timeZone);
    // Note: The currencyResolver will set the currency on the BroadleafRequestContext but
    // later modules (specifically PriceListRequestProcessor in BLC enterprise) may override based
    // on the desired currency.
    BroadleafRequestedCurrencyDto dto = currencyResolver.resolveCurrency(request);
    if (dto != null) {
        brc.setBroadleafCurrency(dto.getCurrencyToUse());
        brc.setRequestedBroadleafCurrency(dto.getRequestedCurrency());
    }
    AdminUser adminUser = adminRemoteSecurityService.getPersistentAdminUser();
    if (adminUser != null) {
        brc.setAdminUserId(adminUser.getId());
    }
    prepareSandBox(request, brc);
    prepareProfile(request, brc);
    prepareCatalog(request, brc);
    brc.getAdditionalProperties().put(staleStateProtectionService.getStateVersionTokenParameter(), staleStateProtectionService.getStateVersionToken());
}
Also used : Site(org.broadleafcommerce.common.site.domain.Site) Locale(org.broadleafcommerce.common.locale.domain.Locale) TimeZone(java.util.TimeZone) BroadleafRequestContext(org.broadleafcommerce.common.web.BroadleafRequestContext) AdminUser(org.broadleafcommerce.openadmin.server.security.domain.AdminUser) BroadleafRequestedCurrencyDto(org.broadleafcommerce.common.currency.domain.BroadleafRequestedCurrencyDto)

Example 47 with BroadleafRequestContext

use of org.broadleafcommerce.common.web.BroadleafRequestContext in project BroadleafCommerce by BroadleafCommerce.

the class AbstractRuleBuilderFieldService method onApplicationEvent.

@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
    // This bean only is valid when the following bean is active. (admin)
    if (applicationContext.containsBean(PersistenceManagerFactory.getPersistenceManagerRef()) && applicationContext.containsBean("blPersistenceManagerFactory")) {
        // initialize the factory bean
        applicationContext.getBean("blPersistenceManagerFactory");
        PersistenceManager persistenceManager = PersistenceManagerFactory.getDefaultPersistenceManager();
        dynamicEntityDao = persistenceManager.getDynamicEntityDao();
        setFields(new ArrayList<FieldData>());
        // This cannot be null during startup as we do not want to remove the null safety checks in a multi-tenant env.
        boolean contextWasNull = false;
        if (BroadleafRequestContext.getBroadleafRequestContext() == null) {
            BroadleafRequestContext brc = new BroadleafRequestContext();
            brc.setIgnoreSite(true);
            BroadleafRequestContext.setBroadleafRequestContext(brc);
            contextWasNull = true;
        }
        try {
            init();
            // Initialize additional static fields method for the component.
            if (extensionManager != null) {
                extensionManager.getProxy().addFields(fields, getName(), getDtoClassName());
            }
            validateRuleBuilderState(this);
        } finally {
            if (contextWasNull) {
                BroadleafRequestContext.setBroadleafRequestContext(null);
            }
        }
    }
}
Also used : FieldData(org.broadleafcommerce.openadmin.web.rulebuilder.dto.FieldData) PersistenceManager(org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager) BroadleafRequestContext(org.broadleafcommerce.common.web.BroadleafRequestContext)

Example 48 with BroadleafRequestContext

use of org.broadleafcommerce.common.web.BroadleafRequestContext in project BroadleafCommerce by BroadleafCommerce.

the class SequenceGeneratorCorruptionDetection method patchSequenceGeneratorInconsistencies.

protected void patchSequenceGeneratorInconsistencies(EntityManager em, Session session) {
    SessionFactory sessionFactory = session.getSessionFactory();
    for (Object item : sessionFactory.getAllClassMetadata().values()) {
        ClassMetadata metadata = (ClassMetadata) item;
        String idProperty = metadata.getIdentifierPropertyName();
        Class<?> mappedClass = metadata.getMappedClass();
        Field idField;
        try {
            idField = mappedClass.getDeclaredField(idProperty);
        } catch (NoSuchFieldException e) {
            continue;
        }
        idField.setAccessible(true);
        GenericGenerator genericAnnot = idField.getAnnotation(GenericGenerator.class);
        TableGenerator tableAnnot = idField.getAnnotation(TableGenerator.class);
        String segmentValue = null;
        String tableName = null;
        String segmentColumnName = null;
        String valueColumnName = null;
        if (genericAnnot != null && genericAnnot.strategy().equals(IdOverrideTableGenerator.class.getName())) {
            // This is a BLC style ID generator
            for (Parameter param : genericAnnot.parameters()) {
                if (param.name().equals("segment_value")) {
                    segmentValue = param.value();
                }
                if (param.name().equals("table_name")) {
                    tableName = param.value();
                }
                if (param.name().equals("segment_column_name")) {
                    segmentColumnName = param.value();
                }
                if (param.name().equals("value_column_name")) {
                    valueColumnName = param.value();
                }
            }
            // to redefine them. If they aren't defined in the annotation, glean them from the defaults
            if (StringUtils.isBlank(tableName)) {
                tableName = IdOverrideTableGenerator.DEFAULT_TABLE_NAME;
            }
            if (StringUtils.isBlank(segmentColumnName)) {
                segmentColumnName = IdOverrideTableGenerator.DEFAULT_SEGMENT_COLUMN_NAME;
            }
            if (StringUtils.isBlank(valueColumnName)) {
                valueColumnName = IdOverrideTableGenerator.DEFAULT_VALUE_COLUMN_NAME;
            }
        } else if (tableAnnot != null) {
            // This is a traditional Hibernate generator
            segmentValue = tableAnnot.pkColumnValue();
            tableName = tableAnnot.table();
            segmentColumnName = tableAnnot.pkColumnName();
            valueColumnName = tableAnnot.valueColumnName();
        }
        if (!StringUtils.isEmpty(segmentValue) && !StringUtils.isEmpty(tableName) && !StringUtils.isEmpty(segmentColumnName) && !StringUtils.isEmpty(valueColumnName)) {
            StringBuilder sb2 = new StringBuilder();
            sb2.append("select ");
            sb2.append(valueColumnName);
            sb2.append(" from ");
            if (!tableName.contains(".") && !StringUtils.isEmpty(defaultSchemaSequenceGenerator)) {
                sb2.append(defaultSchemaSequenceGenerator);
                sb2.append(".");
            }
            sb2.append(tableName);
            sb2.append(" where ");
            sb2.append(segmentColumnName);
            sb2.append(" = '");
            sb2.append(segmentValue);
            sb2.append("'");
            Long maxSequenceId = 0l;
            boolean sequenceEntryExists = false;
            List results2 = em.createNativeQuery(sb2.toString()).getResultList();
            if (CollectionUtils.isNotEmpty(results2) && results2.get(0) != null) {
                maxSequenceId = ((Number) results2.get(0)).longValue();
                sequenceEntryExists = true;
            }
            if (LOG.isDebugEnabled()) {
                LOG.debug("Detecting id sequence state between " + mappedClass.getName() + " and " + segmentValue + " in " + tableName);
            }
            StringBuilder sb = new StringBuilder();
            sb.append("select max(");
            sb.append(idField.getName());
            sb.append(") from ");
            sb.append(mappedClass.getName());
            sb.append(" entity");
            List results;
            BroadleafRequestContext context = BroadleafRequestContext.getBroadleafRequestContext();
            if (context == null) {
                context = new BroadleafRequestContext();
                BroadleafRequestContext.setBroadleafRequestContext(context);
            }
            try {
                context.setInternalIgnoreFilters(true);
                results = em.createQuery(sb.toString()).getResultList();
            } finally {
                context.setInternalIgnoreFilters(false);
            }
            if (CollectionUtils.isNotEmpty(results) && results.get(0) != null) {
                LOG.debug(String.format("Checking for sequence corruption on entity %s", segmentValue));
                Long maxEntityId = BLCNumberUtils.toLong(results.get(0));
                if (maxEntityId > maxSequenceId) {
                    LOG.error(String.format("The sequence value for %s in %s was found as %d (or an entry did not exist) but the actual max sequence in" + " %s's table was found as %d", segmentValue, tableName, maxSequenceId, mappedClass.getName(), maxEntityId));
                    if (automaticallyCorrectInconsistencies) {
                        long newMaxId = maxEntityId + 10;
                        if (sequenceEntryExists) {
                            String log = String.format("Correcting sequences for entity %s.  Updating the sequence value" + " to %d", mappedClass.getName(), newMaxId);
                            LOG.warn(log);
                            StringBuilder updateQuery = new StringBuilder();
                            updateQuery.append("update ");
                            if (!tableName.contains(".") && !StringUtils.isEmpty(defaultSchemaSequenceGenerator)) {
                                sb2.append(defaultSchemaSequenceGenerator);
                                sb2.append(".");
                            }
                            updateQuery.append(tableName);
                            updateQuery.append(" set ");
                            updateQuery.append(valueColumnName);
                            updateQuery.append(" = ");
                            updateQuery.append(String.valueOf(newMaxId));
                            updateQuery.append(" where ");
                            updateQuery.append(segmentColumnName);
                            updateQuery.append(" = '");
                            updateQuery.append(segmentValue);
                            updateQuery.append("'");
                            int response = em.createNativeQuery(updateQuery.toString()).executeUpdate();
                            if (response <= 0) {
                                throw new RuntimeException("Unable to update " + tableName + " with the sequence generator id for " + segmentValue);
                            }
                        } else {
                            String log = String.format("Correcting sequences for entity %s. Did not find an entry in" + " %s, inserting the new sequence value as %d", mappedClass.getName(), tableName, newMaxId);
                            LOG.warn(log);
                            StringBuilder insertQuery = new StringBuilder();
                            insertQuery.append("insert into ");
                            if (!tableName.contains(".") && !StringUtils.isEmpty(defaultSchemaSequenceGenerator)) {
                                sb2.append(defaultSchemaSequenceGenerator);
                                sb2.append(".");
                            }
                            insertQuery.append(tableName);
                            insertQuery.append(" (" + segmentColumnName + "," + valueColumnName + ")");
                            insertQuery.append("values ('" + segmentValue + "','" + String.valueOf(newMaxId) + "')");
                            int response = em.createNativeQuery(insertQuery.toString()).executeUpdate();
                            if (response <= 0) {
                                throw new RuntimeException("Unable to update " + tableName + " with the sequence generator id for " + segmentValue);
                            }
                        }
                    } else {
                        String reason = "A data inconsistency has been detected between the " + tableName + " table and one or more entity tables for which it manages current max primary key values.\n" + "The inconsistency was detected between the managed class (" + mappedClass.getName() + ") and the identifier (" + segmentValue + ") in " + tableName + ". Broadleaf\n" + "has stopped startup of the application in order to allow you to resolve the issue and avoid possible data corruption. If you wish to disable this detection, you may\n" + "set the 'detect.sequence.generator.inconsistencies' property to false in your application's common.properties or common-shared.properties. If you would like for this component\n" + "to autocorrect these problems by setting the sequence generator value to a value greater than the max entity id, then set the 'auto.correct.sequence.generator.inconsistencies'\n" + "property to true in your application's common.properties or common-shared.properties. If you would like to provide a default schema to be used to qualify table names used in the\n" + "queries for this detection, set the 'default.schema.sequence.generator' property in your application's common.properties or common-shared.properties. Also, if you are upgrading\n" + "from 1.6 or below, please refer to http://docs.broadleafcommerce.org/current/1.6-to-2.0-Migration.html for important information regarding migrating your SEQUENCE_GENERATOR table.";
                        LOG.error("Broadleaf Commerce failed to start", new RuntimeException(reason));
                        System.exit(1);
                    }
                }
            }
        }
    }
}
Also used : SessionFactory(org.hibernate.SessionFactory) ClassMetadata(org.hibernate.metadata.ClassMetadata) BroadleafRequestContext(org.broadleafcommerce.common.web.BroadleafRequestContext) TableGenerator(javax.persistence.TableGenerator) Field(java.lang.reflect.Field) Parameter(org.hibernate.annotations.Parameter) List(java.util.List) GenericGenerator(org.hibernate.annotations.GenericGenerator)

Example 49 with BroadleafRequestContext

use of org.broadleafcommerce.common.web.BroadleafRequestContext in project BroadleafCommerce by BroadleafCommerce.

the class TransactionInfo method initialize.

protected void initialize() {
    RuntimeException e = new RuntimeException();
    StringWriter sw = new StringWriter();
    e.printStackTrace(new PrintWriter(sw));
    boolean isLogged = false;
    if (isCompressed) {
        try {
            compressedBeginStack = new CompressedItem(sw.toString(), true);
            isLogged = true;
        } catch (IOException e1) {
        // do nothing
        }
    }
    if (!isLogged) {
        beginStack = sw.toString();
    }
    thread = new WeakReference<Thread>(Thread.currentThread());
    threadName = thread.get().getName();
    threadId = String.valueOf(thread.get().getId());
    startTime = System.currentTimeMillis();
    lastLogTime = startTime;
    BroadleafRequestContext context = BroadleafRequestContext.getBroadleafRequestContext();
    if (context != null) {
        requestContext = context.createLightWeightCloneJson();
    } else {
        requestContext = "none";
    }
}
Also used : StringWriter(java.io.StringWriter) BroadleafRequestContext(org.broadleafcommerce.common.web.BroadleafRequestContext) IOException(java.io.IOException) PrintWriter(java.io.PrintWriter)

Example 50 with BroadleafRequestContext

use of org.broadleafcommerce.common.web.BroadleafRequestContext in project BroadleafCommerce by BroadleafCommerce.

the class CatalogServiceImpl method createCatalogContextDTO.

protected CatalogContextDTO createCatalogContextDTO() {
    BroadleafRequestContext ctx = BroadleafRequestContext.getBroadleafRequestContext();
    CatalogContextDTO context = new CatalogContextDTO();
    Map<String, Object> ruleMap = (Map<String, Object>) ctx.getRequestAttribute("blRuleMap");
    if (MapUtils.isNotEmpty(ruleMap)) {
        context.setAttributes(ruleMap);
    }
    return context;
}
Also used : BroadleafRequestContext(org.broadleafcommerce.common.web.BroadleafRequestContext) Map(java.util.Map)

Aggregations

BroadleafRequestContext (org.broadleafcommerce.common.web.BroadleafRequestContext)78 Site (org.broadleafcommerce.common.site.domain.Site)16 HashMap (java.util.HashMap)12 HttpServletRequest (javax.servlet.http.HttpServletRequest)11 ArrayList (java.util.ArrayList)9 Map (java.util.Map)9 Locale (org.broadleafcommerce.common.locale.domain.Locale)8 SandBox (org.broadleafcommerce.common.sandbox.domain.SandBox)5 StructuredContentDTO (org.broadleafcommerce.common.structure.dto.StructuredContentDTO)5 MessageSource (org.springframework.context.MessageSource)5 List (java.util.List)4 StructuredContent (org.broadleafcommerce.cms.structure.domain.StructuredContent)4 Field (java.lang.reflect.Field)3 HashSet (java.util.HashSet)3 Locale (java.util.Locale)3 Catalog (org.broadleafcommerce.common.site.domain.Catalog)3 BroadleafAttributeModifier (org.broadleafcommerce.presentation.model.BroadleafAttributeModifier)3 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)2 File (java.io.File)2 PrintWriter (java.io.PrintWriter)2