xlawrence 2005/06/21 16:15:18 CEST
Modified files:
core/src/java/org/jahia/engines/shared BigText_Field.java
Log:
Updated the BigText engine so it can handle URL integrity checks
Revision Changes Path
1.9 +217 -102
jahia/core/src/java/org/jahia/engines/shared/BigText_Field.java
http://jahia.mine.nu:8080/cgi-bin/cvsweb.cgi/jahia/core/src/java/org/jahia/engines/shared/BigText_Field.java.diff?r1=1.8&r2=1.9&f=h
Index: BigText_Field.java
===================================================================
RCS file:
/home/cvs/repository/jahia/core/src/java/org/jahia/engines/shared/BigText_Field.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- BigText_Field.java 14 Jun 2005 14:08:58 -0000 1.8
+++ BigText_Field.java 21 Jun 2005 14:15:18 -0000 1.9
@@ -22,18 +22,24 @@
import java.util.Map;
import java.util.HashMap;
import java.util.Collection;
+import java.util.List;
import java.util.Vector;
import org.jahia.data.containers.JahiaContainer;
-import org.jahia.data.fields.*;
+import org.jahia.data.containers.JahiaContainerList;
+import org.jahia.data.fields.JahiaField;
+import org.jahia.data.fields.JahiaBigTextField;
+import org.jahia.engines.EngineMessage;
import org.jahia.engines.EngineMessages;
import org.jahia.engines.JahiaEngine;
import org.jahia.engines.JahiaEngineTools;
import org.jahia.exceptions.JahiaException;
+import org.jahia.exceptions.JahiaPageNotFoundException;
import org.jahia.params.ParamBean;
import org.jahia.registries.ServicesRegistry;
import org.jahia.services.acl.JahiaBaseACL;
import org.jahia.services.htmlparser.JahiaTextContentTidy;
import org.jahia.services.sites.JahiaSite;
+import org.jahia.services.sites.SiteLanguageSettings;
import org.jahia.utils.JahiaString;
import org.jahia.utils.JahiaTools;
import org.jahia.services.htmlparser.ExtractLinksDOMVisitor;
@@ -51,15 +57,18 @@
import org.jahia.utils.I18n;
import org.jahia.services.acl.JahiaACLEntry;
-
-import org.jahia.content.ContentObject;
-import org.jahia.content.ObjectKey;
-import org.jahia.content.JahiaObject;
+import org.jahia.data.fields.FieldsEditHelper;
+import org.jahia.data.fields.FieldsEditHelperAbstract;
import org.jahia.services.version.EntryLoadRequest;
import org.jahia.services.workflow.WorkflowService;
+/**
+ * Sub-Engine for managing BigText Fields
+ *
+ * Modified by Xavier Lawrence, June 2005
+ */
public class BigText_Field {
private static org.apache.log4j.Logger logger =
@@ -72,12 +81,10 @@
public static final String HTMLEDITOR_VIEW_HELPER_ATTRIBUTE =
"org.jahia.engines.shared.BigText_Field.HTMLEditorsViewHelper";
- protected StringBuffer buff;
+protected final StringBuffer buff;
/**
* getInstance
- * AK 19.12.2000
- *
*/
public static BigText_Field getInstance() {
return theObject;
@@ -100,9 +107,9 @@
public boolean handleField( ParamBean jParams, Integer modeInt, HashMap
engineMap )
throws JahiaException {
final int mode = modeInt.intValue();
- String fieldsEditCallingEngineName = (String) engineMap.get(
+ final String fieldsEditCallingEngineName = (String) engineMap.get(
"fieldsEditCallingEngineName" );
- JahiaField theField = (JahiaField) engineMap.get(
+ final JahiaField theField = (JahiaField) engineMap.get(
buff.append(fieldsEditCallingEngineName).append(".theField").
toString() );
buff.delete(0, buff.length());
@@ -141,7 +148,12 @@
private boolean getFormData( ParamBean jParams, HashMap engineMap,
JahiaField theField )
throws JahiaException {
- boolean out = true;
+ final String theScreen = (String) engineMap.get("screen");
+ if (theScreen.equals("cancel")) {
+ return true;
+ }
+
+ boolean out = true;
String fieldValue = (String)jParams.getRequest().getParameter(
buff.append("_").append(theField.getID()).toString());
buff.delete(0, buff.length());
@@ -161,9 +173,9 @@
// case.
fieldValue = I18n.windows1252ToISO(fieldValue);
}
- String oriFieldValue = fieldValue;
+ final String oriFieldValue = fieldValue;
- JahiaSite site =
ServicesRegistry.getInstance().getJahiaSitesService()
+ final JahiaSite site =
ServicesRegistry.getInstance().getJahiaSitesService()
.getSite(theField.getJahiaID());
if ( site.getHtmlCleanup() == 1 ){
@@ -197,7 +209,7 @@
}
}
- EngineMessages resultMessages = ServicesRegistry.getInstance().
+ final EngineMessages resultMessages =
ServicesRegistry.getInstance().
getHtmlParserService().checkTextParsingErrors(fieldValue);
if ( !resultMessages.isEmpty() ) {
resultMessages.saveMessages(
@@ -208,15 +220,35 @@
fieldValue = oriFieldValue;
out = false;
}
-
+
} else {
fieldValue = theField.getValue();
}
fieldValue = JahiaString.getProperStr(fieldValue,
jParams.getLocale());
- theField.setValue(fieldValue);
+ final String values[] = ((JahiaBigTextField)theField).
+ cleanUpHardCodedLinks(fieldValue, jParams.getRequest(),
+ jParams.getLocale().toString());
+
+ theField.setRawValue(values[0]);
+ theField.setValue(values[1]);
theField.setObject(null);
+ if (jParams.getRequest().getParameter("ignoreWarnings") == null) {
+ final EngineMessages warningMessages =
composeWarningMessages(jParams,
+ engineMap, theField, false);
+
+ if ( ! warningMessages.isEmpty() ) {
+ warningMessages.saveMessages(
+
buff.append(theField.getID()).append(".warning.").toString(),
+ jParams.getRequest());
+ buff.delete(0, buff.length());
+ logger.debug("There are some warning messages !");
+
+ return false;
+ }
+ }
+
return out;
} // end getFormData
@@ -225,8 +257,8 @@
*/
private void findAndStoreCrossLinks(ExtractLinksDOMVisitor
linkExtractionVisitor, ParamBean paramBean, HashMap engineMap) {
- Set pageXRefs = new HashSet();
- Iterator linkIter =
linkExtractionVisitor.getDocumentLinks().iterator();
+ final Set pageXRefs = new HashSet();
+ final Iterator linkIter =
linkExtractionVisitor.getDocumentLinks().iterator();
while (linkIter.hasNext()) {
String curLink = (String) linkIter.next();
logger.debug("Found link [" + curLink + "] in bigtext field.");
@@ -331,33 +363,33 @@
// 0 for parentAclID in saveField, because field already exists
// -> field already has an aclID
// -> no need to create a new one
- Set pageXRefs = (Set) engineMap.get("pageXRefs");
+ final Set pageXRefs = (Set) engineMap.get("pageXRefs");
if ((pageXRefs != null) && (pageXRefs.size() > 0)) {
- ContentFieldKey fieldKey = new ContentFieldKey(theField.getID());
+ final ContentFieldKey fieldKey = new
ContentFieldKey(theField.getID());
// first we remove all the existing references for this object.
- ArrayList references = ObjectLink.findByTypeAndLeftObjectKey(
+ final ArrayList references =
ObjectLink.findByTypeAndLeftObjectKey(
"hardcodedLink", fieldKey);
- Iterator refIterator = references.iterator();
+ final Iterator refIterator = references.iterator();
while (refIterator.hasNext()) {
- ObjectLink curLink = (ObjectLink) refIterator.next();
+ final ObjectLink curLink = (ObjectLink) refIterator.next();
curLink.remove();
}
- Iterator pageXRefIter = pageXRefs.iterator();
+ final Iterator pageXRefIter = pageXRefs.iterator();
while (pageXRefIter.hasNext()) {
- Integer curPageIDInt = (Integer) pageXRefIter.next();
+ final Integer curPageIDInt = (Integer) pageXRefIter.next();
logger.debug("Found reference to page " + curPageIDInt + "
in this bigtext");
- ObjectLink newLink = ObjectLink.createLink(fieldKey,
+ final ObjectLink newLink = ObjectLink.createLink(fieldKey,
new ContentPageKey(curPageIDInt.intValue()),
"hardcodedLink", 1,
new Date(),
"root:0", new Date(), "root:0", new HashMap(),
new HashMap(), new HashMap());
}
}
- return theField.save(jParams);
+ return theField.save(jParams);
} // end saveData
/**
@@ -372,14 +404,14 @@
private boolean composeEngineMap( ParamBean jParams, HashMap engineMap,
JahiaField theField )
throws JahiaException {
- String fieldsEditCallingEngineName = (String) engineMap.get(
"fieldsEditCallingEngineName" );
- FieldsEditHelper feh = (FieldsEditHelper)engineMap.get(
+ final String fieldsEditCallingEngineName = (String) engineMap.get(
"fieldsEditCallingEngineName" );
+ final FieldsEditHelper feh = (FieldsEditHelper)engineMap.get(
buff.append(fieldsEditCallingEngineName).append(".").
append(FieldsEditHelperAbstract.FIELDS_EDIT_HELPER_CONTEXTID));
buff.delete(0, buff.length());
boolean editable = false;
- JahiaContainer theContainer = (JahiaContainer)engineMap.get(
+ final JahiaContainer theContainer = (JahiaContainer)engineMap.get(
buff.append(fieldsEditCallingEngineName).
append(".theContainer"));
buff.delete(0, buff.length());
@@ -388,7 +420,7 @@
// in case of a field , not a field in a container
editable = true;
} else if ( theContainer.getListID()!=0 && feh.getCtnListFieldAcls()
!= null ){
- JahiaBaseACL acl = JahiaEngineTools.getCtnListFieldACL(
+ final JahiaBaseACL acl = JahiaEngineTools.getCtnListFieldACL(
feh.getCtnListFieldAcls(), theField.getID());
if ( acl != null ){
editable = acl.getPermission(jParams.getUser(),
@@ -398,12 +430,12 @@
editable = true;
}
- String output = "";
+ initHtmlEditorsHelpers(engineMap, jParams);
- initHtmlEditorsHelpers(engineMap,jParams);
+ final String output;
if ( editable ){
- JahiaSite site =
ServicesRegistry.getInstance().getJahiaSitesService()
+ final JahiaSite site =
ServicesRegistry.getInstance().getJahiaSitesService()
.getSite(theField.getJahiaID());
String fieldValue = theField.getValue();
@@ -422,7 +454,7 @@
fieldValue =
JahiaTextContentTidy.tidyPostProcessing(fieldValue);
}
- EngineMessages resultMessages = ServicesRegistry.getInstance().
+ final EngineMessages resultMessages =
ServicesRegistry.getInstance().
getHtmlParserService().checkTextParsingErrors(fieldValue);
if ( !resultMessages.isEmpty() ){
resultMessages.saveMessages(String.valueOf(theField.getID())
+
@@ -449,7 +481,6 @@
return true;
} // end composeEngineMap
-
private void initHtmlEditorsHelpers(HashMap engineMap, ParamBean jParams)
throws JahiaException {
@@ -462,61 +493,21 @@
heViewHelper);
}
// define a default Html Editor
- String selectedHtmlEditor =
+ final String selectedHtmlEditor =
jParams.getRequest().getParameter("htmlEditor");
if ( selectedHtmlEditor != null ){
- heViewHelper.setDefaultEditorID(selectedHtmlEditor);
+ heViewHelper.setDefaultEditorID(selectedHtmlEditor);
}
// define a default CSS
- String selectedCSS =
+ final String selectedCSS =
jParams.getRequest().getParameter("htmlEditorCSS");
if ( selectedCSS != null ){
- heViewHelper.setDefaultCSSID(selectedCSS);
+ heViewHelper.setDefaultCSSID(selectedCSS);
}
};
/**
- * Finds all the ContentObjects which point to the current BigText.
- * @param pageID The page nesting the BigText.
- * @return A Set of ObjectKey Objects
- */
- private Set contentObjectsPointingOnPage(int pageID)
- throws JahiaException {
- ArrayList objectLinks = ObjectLink.findByTypeAndRightObjectKey(
- "hardcodedLink", new ContentPageKey(pageID));
- Iterator objectLinkIter = objectLinks.iterator();
- Set result = new HashSet();
- while (objectLinkIter.hasNext()) {
- ObjectLink curLink = (ObjectLink) objectLinkIter.next();
- ObjectKey objectKey = curLink.getLeftObjectKey();
- try {
- ContentObject contentObject = (ContentObject) JahiaObject.
- getInstance(objectKey);
- if (contentObject != null) {
- if
(!contentObject.getActiveAndStagingEntryStates().isEmpty()) {
- result.add(objectKey);
- } else {
- logger.debug(
- "No active or staging entries found for
objectKey=" +
- objectKey +
- ", not displaying deleted or archived
references");
- }
- } else {
- logger.warn(
- "Hardcoded URL link found for object that no
longer exists:" +
- objectKey + ", removing reference");
- curLink.remove();
- }
- } catch (ClassNotFoundException cnfe) {
- logger.error("Error while loading Jahia object from
objectKey=" +
- objectKey, cnfe);
- }
- }
- return result;
- }
-
- /**
* Returns a Collection of the GroupIDs not having Read Access on the
given page
*/
public Collection getFieldGroupsNotHavingAccessOnPage(int pageID,
@@ -524,14 +515,14 @@
logger.debug("Comparing ACLs of field "+field.getID()+ " and page "+
pageID);
final ContentPage page = ContentPage.getPage(pageID);
- final ContentObject aclObject = getFieldACLObject(field, jParams,
engineMap);
+ final JahiaBaseACL aclObject = getFieldACLObject(field, jParams,
engineMap);
// Define an ACLEntry for "Read" Rights
final JahiaACLEntry aclEntry = new JahiaACLEntry();
aclEntry.setPermission(JahiaBaseACL.READ_RIGHTS,
JahiaACLEntry.ACL_YES);
// Get all the groups which can see the field
- final Vector fieldACLGroups =
aclObject.getACL().getGroupnameListNoAdmin(aclEntry);
+ final Vector fieldACLGroups =
aclObject.getGroupnameListNoAdmin(aclEntry);
logger.debug("fieldACLGroups: "+fieldACLGroups);
if (page == null) { return fieldACLGroups; }
@@ -540,11 +531,11 @@
final Vector pageACLGroups =
page.getACL().getGroupnameListNoAdmin(aclEntry);
logger.debug("pageACLGroups: "+pageACLGroups);
- Vector result = new Vector(fieldACLGroups.size());
+ final Vector result = new Vector(fieldACLGroups.size());
- Iterator ite = fieldACLGroups.iterator();
+ final Iterator ite = fieldACLGroups.iterator();
while (ite.hasNext()) {
- String groupID = (String)ite.next();
+ String groupID = (String)ite.next();
if (!pageACLGroups.contains(groupID)) {
// get rid of the site ID
@@ -564,11 +555,12 @@
/**
* Returns a String of comma separated GroupIDs not having Read Access
on the given page
*/
- public String getFieldGroupsNotHavingAccessOnPageAsString (int pageID,
+ public String getFieldGroupsNotHavingAccessOnPageAsString(int pageID,
JahiaField field, ParamBean jParams, HashMap engineMap) throws
JahiaException {
- Collection c = getFieldGroupsNotHavingAccessOnPage(pageID, field,
jParams, engineMap);
- Iterator ite = c.iterator();
+ final Collection c = getFieldGroupsNotHavingAccessOnPage(pageID,
field,
+ jParams, engineMap);
+ final Iterator ite = c.iterator();
while (ite.hasNext()) {
String groupID = (String)ite.next();
@@ -576,10 +568,10 @@
}
if (buff.length() > 0) {
- buff = buff.deleteCharAt(buff.length() - 1);
+ buff.deleteCharAt(buff.length() - 1);
}
- String result = buff.toString();
+ final String result = buff.toString();
buff.delete(0, buff.length());
return result;
}
@@ -587,11 +579,11 @@
/**
* Returns the ContentObject of the given field or its closest parent.
*/
- private ContentObject getFieldACLObject(JahiaField field, ParamBean
jParams,
+ private JahiaBaseACL getFieldACLObject(JahiaField field, ParamBean
jParams,
HashMap engineMap) throws JahiaException {
if (field.getID() <= 0) { // this means the field has not yet been
saved
// fetch the parent container ACL entry instead...
- JahiaContainer container =
(JahiaContainer)engineMap.get("theContainer");
+ final JahiaContainer container =
(JahiaContainer)engineMap.get("theContainer");
logger.debug("Trying to use parent Container ACL instead: ID = "
+
container.getID());
@@ -603,7 +595,7 @@
if (ctnListID <= 0) { // this means the containerList is
empty
// fetch the page ACL entry instead
- ContentPage fieldPage =
ContentPage.getPage(field.getPageID());
+ final ContentPage fieldPage =
ContentPage.getPage(field.getPageID());
logger.debug("Trying to use parent ContentPage ACL
instead: ID = " +
field.getPageID());
@@ -615,20 +607,20 @@
JahiaException.ERROR_SEVERITY);
}
- return fieldPage;
+ return fieldPage.getACL();
} else {
- return
ServicesRegistry.getInstance().getJahiaContainersService().
- loadContainerList(ctnListID, LoadFlags.ALL,
jParams).
- getContentContainerList();
+ final JahiaContainerList list =
ServicesRegistry.getInstance().
+
getJahiaContainersService().loadContainerListInfo(ctnListID);
+ return list.getACL();
}
} else {
- return container.getContentContainer();
+ return container.getACL();
}
} else {
- return field.getContentField();
+ return field.getACL();
}
}
@@ -646,10 +638,10 @@
*/
public String getPageState(int pageId, String currentLanguageCode)
throws JahiaException {
- ContentPage page = ContentPage.getPage(pageId);
+ final ContentPage page = ContentPage.getPage(pageId);
if (page == null) { return "staging"; }
- Map languagesStates =
WorkflowService.getInstance().getLanguagesStates(page);
+ final Map languagesStates =
WorkflowService.getInstance().getLanguagesStates(page);
final Integer state =
((Integer)languagesStates.get(currentLanguageCode));
if (state == null) { return "staging"; }
@@ -668,4 +660,127 @@
}
}
-} // end BigText_Field
+ /**
+ * Composes Warning messages that will be used/displayed by the
addContainer
+ * engine when the user clicks on the "OK" button to submit the
container.
+ * The warnings are related to hardcoded links in BigTexts. <br/>
+ * Issues are:
+ * <ul>
+ * <li> User enters a URL to a page that does not exist (brokenLinks,
404 error) </li>
+ * <li> User enters a URL to a page that is in 'staging', 'approval' or
'markForDelete' state (404 error) </li>
+ * <li> User enters a URL to a page, which has less rights than the
current field (403 error) </li>
+ * </ul>
+ *
+ * @param allLangs If set to True and if the site has more than 1
language, the method
+ * will generate warning messages for all the active
languages.
+ * If set to False, the method will only consider the
current language
+ * of the ParamBean instance.
+ */
+ protected EngineMessages composeWarningMessages(final ParamBean jParams,
final HashMap engineMap,
+ final JahiaField theField, final boolean allLangs) throws
JahiaException {
+ logger.debug("composeWarningMessages... "+theField.getValue());
+
+ final List pids = ((JahiaBigTextField)theField).getInternalLinks();
+ final EngineMessages result = new EngineMessages();
+
+ if (pids.size() > 0) {
+ logger.debug("PIDs are: " + pids);
+
+ final Iterator ite = pids.iterator();
+ final Vector langs;
+ final String currentLang;
+ // counter for the "for" loop coming up
+ final int count;
+
+ if (allLangs) {
+ langs = jParams.getSite().getLanguageSettings(true);
+ count = langs.size();
+ currentLang = null;
+
+ } else {
+ currentLang = jParams.getLocale().toString();
+ count = 1;
+ langs = null;
+ }
+
+ // For each page referenced in a hardcoded link
+ while (ite.hasNext()) {
+ final Integer pid = (Integer)ite.next();
+ final ContentPage page;
+ try {
+ page = ContentPage.getPage(pid.intValue());
+ } catch (JahiaPageNotFoundException e) {
+ final EngineMessage msg = new EngineMessage(
+
"org.jahia.engines.shared.BigText_Field.notExistingWarning",
+ pid);
+ result.add("BigText.notExisting", msg);
+ continue;
+ }
+
+ if (page == null) {
+ final EngineMessage msg = new EngineMessage(
+
"org.jahia.engines.shared.BigText_Field.notExistingWarning",
+ pid);
+ result.add("BigText.notExisting", msg);
+ continue;
+ }
+
+ final String noAccess =
getFieldGroupsNotHavingAccessOnPageAsString(
+ pid.intValue(), theField, jParams, engineMap);
+
+ if (noAccess != null && noAccess.length() > 0) {
+ final String[] values = {pid.toString(), noAccess};
+ final EngineMessage msg = new EngineMessage(
+
"org.jahia.engines.shared.BigText_Field.lessAccessWarning",
+ values);
+ result.add("BigText.staging", msg);
+ }
+
+ // For each active site language or only the current language
+ for (int i=0; i < count; i++) {
+ final String lang;
+ final String state;
+
+ if (allLangs) {
+ lang =
((SiteLanguageSettings)langs.elementAt(i)).getCode();
+
+ } else {
+ lang = currentLang;
+ }
+
+ state = getPageState(pid.intValue(), lang);
+
+ if ("active".equals(state)) { continue; }
+ if ("staging".equals(state)) {
+ final String[] values = {pid.toString(), lang};
+ final EngineMessage msg = new EngineMessage(
+
"org.jahia.engines.shared.BigText_Field.stagingWarning",
+ values);
+ result.add("BigText.staging", msg);
+
+ } else if ("markForDeleted".equals(state)) {
+ final EngineMessage msg = new EngineMessage(
+
"org.jahia.engines.shared.BigText_Field.markForDeleteWarning",
+ pid);
+ result.add("BigText.markForDeleted", msg);
+
+ } else if ("waiting".equals(state)) {
+ final String[] values = {pid.toString(), lang};
+ final EngineMessage msg = new EngineMessage(
+
"org.jahia.engines.shared.BigText_Field.approvalWarning",
+ values);
+ result.add("BigText.waiting", msg);
+
+ } else {
+ throw new JahiaException("Unknown state value:
"+state,
+ "Unknown state value: "+state,
+ JahiaException.ENGINE_ERROR,
+ JahiaException.ERROR_SEVERITY);
+ }
+ }
+ }
+ }
+ logger.debug("Returning "+result.getSize()+ " warning message(s):
"+result);
+ return result;
+ }
+}