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());
}
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);
}
}
}
}
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);
}
}
}
}
}
}
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";
}
}
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;
}
Aggregations