try {
boolean newStructure = false;
boolean publishChanged = false;
boolean expireChanged = false;
StructureForm structureForm = (StructureForm) form;
Structure structure = (Structure) req.getAttribute(WebKeys.Structure.STRUCTURE);
User user = _getUser(req);
HttpServletRequest httpReq = ((ActionRequestImpl) req).getHttpServletRequest();
if (!UtilMethods.isSet(structureForm.getHost()) && (!UtilMethods.isSet(structureForm.getFolder()) || structureForm.getFolder().equals("SYSTEM_FOLDER"))) {
throw new DotDataException(LanguageUtil.get(user, "Host-or-folder-is-required"));
}
// Checking permissions
_checkWritePermissions(structure, user, httpReq);
// Validating structure type
if (structureForm.getStructureType()< 1 ){
throw new DotDataException(LanguageUtil.get(user, "structure-type-is-required"));
}
// Check if another structure with the same name exist
String auxStructureName = structureForm.getName();
auxStructureName = (auxStructureName != null ? auxStructureName.trim() : "");
auxStructureName = auxStructureName.replace("'", "''");
@SuppressWarnings("deprecation")
Structure auxStructure = StructureCache.getStructureByType(auxStructureName);
if (InodeUtils.isSet(auxStructure.getInode()) && !auxStructure.getInode().equalsIgnoreCase(structure.getInode())) {
throw new DotDataException(LanguageUtil.format(user.getLocale(), "structure-name-already-exist",new String[]{auxStructureName},false));
}
Arrays.sort(reservedStructureNames);
if (!InodeUtils.isSet(structureForm.getInode()) && (Arrays.binarySearch(reservedStructureNames, auxStructureName) >= 0)) {
throw new DotDataException("Invalid Reserved Structure Name : " + auxStructureName);
}
// Validate if is a new structure and if the name hasn't change
if (!InodeUtils.isSet(structure.getInode())) {
newStructure = true;
} else {
String structureName = structure.getName();
String structureFormName = structureForm.getName();
if (UtilMethods.isSet(structureName) && UtilMethods.isSet(structureFormName) && !structureName.equals(structureFormName) && !structure.isFixed()) {
StructureCache.removeStructure(structure);
}
}
// If the structure is fixed the name cannot be changed
if (structure.isFixed()) {
structureForm.setName(structure.getName());
}
// if I'm editing a structure the structureType couldn't not be
// change
if (UtilMethods.isSet(structure.getInode()) && InodeUtils.isSet(structure.getInode())) {
// reset the structure type to it's original value
structureForm.setStructureType(structure.getStructureType());
}
if (UtilMethods.isSet(structure.getVelocityVarName())) {
structureForm.setVelocityVarName(structure.getVelocityVarName());
}
if (UtilMethods.isSet(structureForm.getHost())) {
if (!structureForm.getHost().equals(Host.SYSTEM_HOST) && hostAPI.findSystemHost().getIdentifier().equals(structureForm.getHost())) {
structureForm.setHost(Host.SYSTEM_HOST);
}
structureForm.setFolder("SYSTEM_FOLDER");
} else if (UtilMethods.isSet(structureForm.getFolder())) {
structureForm.setHost(folderAPI.find(structureForm.getFolder(), user, false).getHostId());
}
if (UtilMethods.isSet(structureForm.getHost()) && (!UtilMethods.isSet(structureForm.getFolder()) || structureForm.getFolder().equals("SYSTEM_FOLDER"))) {
Host host = hostAPI.find(structureForm.getHost(), user, false);
if (host != null) {
if (structure.getStructureType() == Structure.STRUCTURE_TYPE_FORM) {
if (!perAPI.doesUserHavePermissions(host, "PARENT:" + PermissionAPI.PERMISSION_CAN_ADD_CHILDREN + ", STRUCTURES:" + PermissionAPI.PERMISSION_PUBLISH, user)) {
throw new DotDataException(LanguageUtil.get(user, "User-does-not-have-add-children-permission-on-host-folder"));
}
} else {
if (!perAPI.doesUserHavePermission(host, PermissionAPI.PERMISSION_CAN_ADD_CHILDREN, user)) {
throw new DotDataException(LanguageUtil.get(user, "User-does-not-have-add-children-permission-on-host-folder"));
}
}
}
}
if (UtilMethods.isSet(structureForm.getFolder()) && !structureForm.getFolder().equals("SYSTEM_FOLDER")) {
Folder folder = folderAPI.find(structureForm.getFolder(), user, false);
if (folder != null) {
if (structure.getStructureType() == Structure.STRUCTURE_TYPE_FORM) {
if (!perAPI.doesUserHavePermissions(folder, "PARENT:" + PermissionAPI.PERMISSION_CAN_ADD_CHILDREN + ", STRUCTURES:" + PermissionAPI.PERMISSION_PUBLISH,
user)) {
throw new DotDataException(LanguageUtil.get(user, "User-does-not-have-add-children-permission-on-host-folder"));
}
} else {
if (!perAPI.doesUserHavePermission(folder, PermissionAPI.PERMISSION_CAN_ADD_CHILDREN, user)) {
throw new DotDataException(LanguageUtil.get(user, "User-does-not-have-add-children-permission-on-host-folder"));
}
}
}
}
//Checks if Publish was updated
if (UtilMethods.isSet(structure.getPublishDateVar()) &&
UtilMethods.isSet(structureForm.getPublishDateVar())){
if (!structure.getPublishDateVar().equals(structureForm.getPublishDateVar())){
publishChanged = true;
}
}else{
if(structure.getPublishDateVar() != null ||
structureForm.getPublishDateVar() != null)
publishChanged = true;
}
//Checks if Expire was updated
if (UtilMethods.isSet(structure.getExpireDateVar()) &&
UtilMethods.isSet(structureForm.getExpireDateVar())){
if (!structure.getExpireDateVar().equals(structureForm.getExpireDateVar())){
expireChanged = true;
}
}else{
if(structure.getExpireDateVar() != null ||
structureForm.getExpireDateVar() != null)
expireChanged = true;
}
if(!newStructure && (publishChanged || expireChanged)){
List<Contentlet> results = conAPI.findByStructure(structure, user, true, 0, 0);
for (Contentlet con : results) {
if( UtilMethods.isSet(structureForm.getExpireDateVar())){
Date pub = (Date)con.getMap().get(structureForm.getPublishDateVar());
Date exp = (Date) con.getMap().get(structureForm.getExpireDateVar());
if(UtilMethods.isSet(pub) && UtilMethods.isSet(exp)){
if(exp.before(new Date())){
throw new PublishStateException("'"+con.getTitle()+"'" + LanguageUtil.get(user, "found-expired-content-please-check-before-continue"));
}else if(exp.before(pub)){
throw new PublishStateException("'"+con.getTitle()+"'" + LanguageUtil.get(user, "expire-date-should-not-be-less-than-Publish-date-please-check-before-continue"));
}else if(con.isLive() && pub.after(new Date()) && exp.after(new Date())){
conAPI.unpublish(con, user, true);
}
}
}
}
}
BeanUtils.copyProperties(structure, structureForm);
// if htmlpage doesn't exist page id should be an identifier. Should
// be refactored once we get identifierAPI/HTMLPage API done
String pageDetail = structureForm.getDetailPage();
if (newStructure) {
String structureVelocityName = VelocityUtil.convertToVelocityVariable(structure.getName(), true);
List<String> velocityvarnames = StructureFactory.getAllVelocityVariablesNames();
int found = 0;
if (VelocityUtil.isNotAllowedVelocityVariableName(structureVelocityName)) {
found++;
}
for (String velvar : velocityvarnames) {
if (velvar != null) {
if (structureVelocityName.equalsIgnoreCase(velvar)) {
found++;
} else if (velvar.toLowerCase().contains(structureVelocityName.toLowerCase())) {
String number = velvar.substring(structureVelocityName.length());
if (RegEX.contains(number, "^[0-9]+$")) {
found++;
}
}
}
}
if (found > 0) {
structureVelocityName = structureVelocityName + Integer.toString(found);
}
structure.setVelocityVarName(structureVelocityName);
}
if (UtilMethods.isSet(pageDetail)) {
structure.setDetailPage(pageDetail);
}
// Saving interval review properties
if (structureForm.isReviewContent()) {
structure.setReviewInterval(structureForm.getReviewIntervalNum() + structureForm.getReviewIntervalSelect());
} else {
structure.setReviewInterval(null);
structure.setReviewerRole(null);
}
// If there is no default structure this would be
Structure defaultStructure = StructureFactory.getDefaultStructure();
if (!InodeUtils.isSet(defaultStructure.getInode())) {
structure.setDefaultStructure(true);
}
if (newStructure) {
structure.setFixed(false);
structure.setOwner(user.getUserId());
}
// validate iit is a form structure set it as system by default
if (structureForm.getStructureType() == Structure.STRUCTURE_TYPE_FORM) {
structure.setSystem(true);
}
StructureFactory.saveStructure(structure);
//If structure is modified and Publish/Expire were updated
//have to check if all the content has the same info in Identifiers
if(!newStructure && (publishChanged || expireChanged)){
IdentifierDateJob.triggerJobImmediately(structure, _getUser(req));
}
structureForm.setUrlMapPattern(structure.getUrlMapPattern());
WorkflowScheme scheme = APILocator.getWorkflowAPI().findSchemeForStruct(structure);
String schemeId = req.getParameter("workflowScheme");
if (scheme != null && UtilMethods.isSet(schemeId) && !schemeId.equals(scheme.getId())) {
scheme = APILocator.getWorkflowAPI().findScheme(schemeId);
APILocator.getWorkflowAPI().saveSchemeForStruct(structure, scheme);
}
// if the structure is a widget we need to add the base fields.
if (newStructure && structureForm.getStructureType() == Structure.STRUCTURE_TYPE_WIDGET) {
wAPI.createBaseWidgetFields(structure);
}
// if the structure is a form we need to add the base fields.
if (newStructure && structureForm.getStructureType() == Structure.STRUCTURE_TYPE_FORM) {
fAPI.createBaseFormFields(structure);
}
// if the structure is a form we need to add the base fields.
if (newStructure && structureForm.getStructureType() == Structure.STRUCTURE_TYPE_FILEASSET) {
APILocator.getFileAssetAPI().createBaseFileAssetFields(structure);
}
if (!newStructure) {
perAPI.resetPermissionReferences(structure);
}