CCM NG/ccm-cms:

- CreateForm for Event
- Cleanup resources. Some files were accendentily copied to the wrong place.


git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4698 8810af33-2d31-482b-a856-94f89814c4df
pull/2/head
jensp 2017-05-01 15:48:28 +00:00
parent f1aa5bc54d
commit 34932edfc8
16 changed files with 154 additions and 1200 deletions

View File

@ -0,0 +1,71 @@
/*
* Copyright (C) 2017 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package com.arsdigita.cms.ui.contenttypes;
import com.arsdigita.bebop.FormData;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.form.Date;
import com.arsdigita.bebop.parameters.NotEmptyValidationListener;
import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.ui.authoring.CreationSelector;
import com.arsdigita.cms.ui.authoring.PageCreateForm;
import com.arsdigita.globalization.GlobalizedMessage;
import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentItemInitializer;
import org.librecms.contenttypes.Event;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class EventCreateForm extends PageCreateForm {
private static final String START_DATE = "startDate";
private Date startDate;
public EventCreateForm(final ItemSelectionModel itemSelectionModel,
final CreationSelector creationSelector) {
super(itemSelectionModel, creationSelector);
}
@Override
protected void addWidgets() {
super.addWidgets();
add(new Label(new GlobalizedMessage(
"cms.contenttypes.ui.event.start_date",
CmsConstants.CMS_BUNDLE)));
startDate = new Date(START_DATE);
startDate.addValidationListener(new NotEmptyValidationListener());
add(startDate);
}
@Override
protected ContentItemInitializer<?> getItemInitializer(
final FormData data, final PageState state) {
return item -> ((Event) item)
.setStartDate((java.util.Date) startDate.getValue(state));
}
}

View File

@ -0,0 +1,73 @@
/*
* Copyright (C) 2017 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package com.arsdigita.cms.ui.contenttypes;
import com.arsdigita.bebop.FormData;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.event.FormInitListener;
import com.arsdigita.bebop.event.FormSubmissionListener;
import com.arsdigita.bebop.form.Date;
import com.arsdigita.bebop.parameters.NotEmptyValidationListener;
import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.ui.authoring.CreationSelector;
import com.arsdigita.cms.ui.authoring.PageCreateForm;
import com.arsdigita.globalization.GlobalizedMessage;
import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentItemInitializer;
import org.librecms.contenttypes.News;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class NewsCreateForm extends PageCreateForm {
private static final String NEWS_DATE = "newsDate";
private Date newsDate;
public NewsCreateForm(final ItemSelectionModel itemSelectionModel,
final CreationSelector creationSelector) {
super(itemSelectionModel, creationSelector);
}
@Override
protected void addWidgets() {
super.addWidgets();
add(new Label(new GlobalizedMessage("cms.contenttypes.ui.newsitem.date",
CmsConstants.CMS_BUNDLE)));
newsDate = new Date(NEWS_DATE);
newsDate.addValidationListener(new NotEmptyValidationListener());
add(newsDate);
}
@Override
protected ContentItemInitializer<?> getItemInitializer(
final FormData data, final PageState state) {
return item -> ((News) item)
.setReleaseDate((java.util.Date) newsDate.getValue(state));
}
}

View File

@ -18,7 +18,8 @@
*/ */
package org.librecms.contenttypes; package org.librecms.contenttypes;
import com.arsdigita.cms.ui.authoring.PageCreateForm; import com.arsdigita.cms.ui.contenttypes.EventCreateForm;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import java.util.Objects; import java.util.Objects;
@ -34,12 +35,13 @@ import javax.persistence.Temporal;
import javax.persistence.TemporalType; import javax.persistence.TemporalType;
import org.hibernate.envers.Audited; import org.hibernate.envers.Audited;
import org.hibernate.validator.constraints.NotEmpty;
import org.libreccm.l10n.LocalizedString; import org.libreccm.l10n.LocalizedString;
import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItem;
import javax.validation.constraints.NotNull;
import static org.librecms.CmsConstants.*; import static org.librecms.CmsConstants.*;
/** /**
@ -51,7 +53,7 @@ import static org.librecms.CmsConstants.*;
@Table(name = "EVENTS", schema = DB_SCHEMA) @Table(name = "EVENTS", schema = DB_SCHEMA)
@ContentTypeDescription(labelBundle = "org.librecms.contenttypes.Event", @ContentTypeDescription(labelBundle = "org.librecms.contenttypes.Event",
descriptionBundle = "org.librecms.contenttypes.Event") descriptionBundle = "org.librecms.contenttypes.Event")
@AuthoringKit(createComponent = PageCreateForm.class, @AuthoringKit(createComponent = EventCreateForm.class,
steps = {}) steps = {})
public class Event extends ContentItem implements Serializable { public class Event extends ContentItem implements Serializable {
@ -72,7 +74,7 @@ public class Event extends ContentItem implements Serializable {
@Column(name = "START_DATE", nullable = false) @Column(name = "START_DATE", nullable = false)
@Temporal(TemporalType.DATE) @Temporal(TemporalType.DATE)
@NotEmpty @NotNull
private Date startDate; private Date startDate;
@Column(name = "END_DATE") @Column(name = "END_DATE")

View File

@ -21,7 +21,6 @@ package org.librecms.contenttypes;
import com.arsdigita.cms.ui.contenttypes.NewsCreateForm; import com.arsdigita.cms.ui.contenttypes.NewsCreateForm;
import org.hibernate.envers.Audited; import org.hibernate.envers.Audited;
import org.hibernate.validator.constraints.NotEmpty;
import org.libreccm.l10n.LocalizedString; import org.libreccm.l10n.LocalizedString;
import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItem;
@ -154,7 +153,7 @@ public class News extends ContentItem implements Serializable {
public String toString(final String data) { public String toString(final String data) {
return super.toString(String.format(", text = %s, " return super.toString(String.format(", text = %s, "
+ "releaseDate = %tF %<tT, " + "releaseDate = %tF %<tT, "
+ "homepage = %b%d", + "homepage = %b%s",
Objects.toString(text), Objects.toString(text),
releaseDate, releaseDate,
homepage, homepage,

View File

@ -1,40 +0,0 @@
/*
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms.util;
import com.arsdigita.globalization.Globalized;
/**
* Modules which depend on CMS should implement this interface instead of
* com.arsdigita.globalization.Globalized to gain access to CMS globalization
* resource file (specifically important for content type packages).
*
* @author <a href="mailto:yon@arsdigita.com">yon@arsdigita.com</a>
* @version $Revision: #5 $ $Date: 2004/08/17 $
*/
public interface CMSGlobalized extends Globalized {
/*
* The central CMS resource file (per language) which may be used by
* all of CMS specific modules.
* It overwrites the file provided by globalization package as a generic
* default/fall back!
*/
public static final String BUNDLE_NAME = "com.arsdigita.cms.CMSResources";
}

View File

@ -1,52 +0,0 @@
/*
* Copyright (C) 2004 Red Hat Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms.util;
import com.arsdigita.globalization.ChainedResourceBundle;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
// Developers Note (2013-04):
// No longer used because we found no way to make localization work properly.
// Back to use plain property files as of 2013-04 (version 6.6.8)
// Retained for easy reference to further develop localization infrastructure.
/**
* Main ResourceBundle for CMS UI.
* Can be extended using:
* - addBundle - to add new keys
* - putBundle - to override keys already in CMSResources e.g. to customize
* notification email text
*/
public class CMSResourceBundle extends ChainedResourceBundle implements CMSGlobalized {
public CMSResourceBundle() {
super();
// addBundle((PropertyResourceBundle) getBundle(BUNDLE_NAME));
// try to make proper localisation work, no success, ne regression either
addBundle((PropertyResourceBundle) getBundle(BUNDLE_NAME,
ResourceBundle.Control.getNoFallbackControl(
ResourceBundle.Control.FORMAT_DEFAULT)));
}
}

View File

@ -1,516 +0,0 @@
/*
* Copyright (C) 2004 Red Hat Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms.util;
import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ItemCollection;
import com.arsdigita.cms.Folder;
import com.arsdigita.cms.TextAsset;
import com.arsdigita.cms.contenttypes.GenericArticle;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.kernel.KernelExcursion;
import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.DataObject;
import com.arsdigita.persistence.Session;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.persistence.TransactionContext;
import com.arsdigita.util.cmd.Program;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.OptionBuilder;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.util.HashSet;
import java.util.Set;
/**
*
* @author Jens Pelzetter
*/
@SuppressWarnings("PMD.SystemPrintln")
public class ContentItemNameFix extends Program {
private boolean pretend = false;
public ContentItemNameFix() {
super("ContentItemNameFix", "1.0.0", "");
getOptions().addOption(
OptionBuilder
.hasArg(false)
.withLongOpt("pretend")
.withDescription("Only show what would be done")
.create("p"));
}
public static final void main(final String[] args) {
new ContentItemNameFix().run(args);
}
@Override
protected void doRun(final CommandLine cmdLine) {
System.out.printf("Running ContentItemNameFix...\n");
pretend = cmdLine.hasOption("p");
if (pretend) {
System.out.printf("Pretend option is on, only showing what would be done...\n\n");
} else {
System.out.print("\n");
}
new KernelExcursion() {
@Override
protected void excurse() {
setEffectiveParty(Kernel.getSystemParty());
final Set<LinkToCheck> linksToCheck = new HashSet<LinkToCheck>();
final Session session = SessionManager.getSession();
final TransactionContext transactionContext = session.getTransactionContext();
transactionContext.beginTxn();
final DataCollection draftFolders = session.retrieve(Folder.BASE_DATA_OBJECT_TYPE);
draftFolders.addEqualsFilter(ContentItem.VERSION, "draft");
while (draftFolders.next()) {
checkFolder(draftFolders.getDataObject(), linksToCheck);
}
final DataCollection draftBundles = session.retrieve(
ContentBundle.BASE_DATA_OBJECT_TYPE);
draftBundles.addEqualsFilter(ContentItem.VERSION, "draft");
while (draftBundles.next()) {
checkBundle(draftBundles.getDataObject(), linksToCheck);
}
transactionContext.commitTxn();
System.out.println("-------------------------------------------------------------");
System.out.println("Checking for potentially brocken links...");
System.out.println("GenericArticle (ccm-cms-types-article, ccm-cms-types-news, ...");
System.out.println("");
final DataCollection articles = session.retrieve(
GenericArticle.BASE_DATA_OBJECT_TYPE);
articles.addEqualsFilter(ContentItem.VERSION, "draft");
while (articles.next()) {
checkArticle(articles.getDataObject(), linksToCheck);
}
System.out.println("");
System.out.println("MultiPartArticles...");
System.out.println("");
final DataCollection mpArticles = session.retrieve(
"com.arsdigita.cms.contenttypes.MultiPartArticle");
mpArticles.addEqualsFilter(ContentItem.VERSION, "draft");
while (mpArticles.next()) {
checkMpArticle(mpArticles.getDataObject(), linksToCheck);
}
}
}.run();
}
private void checkFolder(final DataObject folderObj, final Set<LinkToCheck> linksToCheck) {
final Folder draftFolder = new Folder(folderObj);
final Folder liveFolder = (Folder) draftFolder.getLiveVersion();
if (liveFolder != null && !draftFolder.getName().equals(liveFolder.getName())) {
System.out.printf("Problems with folder %s:/%s (id: %s):\n",
draftFolder.getContentSection().getName(),
draftFolder.getPath(),
draftFolder.getID().toString());
System.out.printf("\t Live Folder has wrong name: Is '%s' but should be '%s'.",
liveFolder.getName(),
draftFolder.getName());
linksToCheck.add(new LinkToCheck(liveFolder.getName(),
draftFolder.getName(),
String.format("%s:/%s",
liveFolder.getContentSection().getName(),
liveFolder.getPath()),
String.format("%s:/%s",
draftFolder.getContentSection().getName(),
draftFolder.getPath())));
if (pretend) {
System.out.print("\n\n");
} else {
liveFolder.setName(draftFolder.getName());
System.out.print(" Corrected.\n\n");
}
}
}
private void checkBundle(final DataObject bundleObj, final Set<LinkToCheck> linksToCheck) {
final ContentBundle draftBundle = new ContentBundle(bundleObj);
final ContentItem primaryDraftItem = draftBundle.getPrimaryInstance();
final String itemId = primaryDraftItem.getID().toString();
final String itemPath = String.format("%s:/%s",
primaryDraftItem.getContentSection().getName(),
primaryDraftItem.getPath());
final HeaderStatus headerStatus = new HeaderStatus();
//This is our reference, all bundles, instances etc belonging to the item sould have this
//name
final String itemName = primaryDraftItem.getName();
if (!draftBundle.getName().equals(itemName)) {
printItemHeaderLine(itemId, itemPath, headerStatus);
System.out.printf(
"\t Draft ContentBundle has wrong name: Is '%s' but should be '%s'.",
itemName,
draftBundle.getName());
linksToCheck.add(new LinkToCheck(draftBundle.getName(),
itemName,
String.format("%s:/%s",
draftBundle.getContentSection().getName(),
draftBundle.getPath()),
itemPath));
if (pretend) {
System.out.print("\n");
} else {
draftBundle.setName(itemName);
System.out.printf(" Corrected.\n");
}
}
checkInstances(draftBundle, itemName, itemId, itemPath, headerStatus, linksToCheck);
final ContentBundle liveBundle = (ContentBundle) draftBundle.getLiveVersion();
if (liveBundle != null) {
if (!liveBundle.getName().equals(itemName)) {
printItemHeaderLine(itemId, itemPath, headerStatus);
System.out.printf(
"\tLive ContentBundle has wrong name. Should be '%s' but is '%s'",
itemName,
liveBundle.getName());
linksToCheck.add(new LinkToCheck(liveBundle.getName(),
itemName,
String.format("%s:/%s",
liveBundle.getContentSection()
.getName(),
liveBundle.getPath()),
itemPath));
if (pretend) {
System.out.print("\n");
} else {
liveBundle.setName(itemName);
System.out.printf(" Corrected.\n");
}
}
checkInstances(liveBundle, itemName, itemId, itemPath, headerStatus, linksToCheck);
}
if (headerStatus.isHeaderPrinted()) {
System.out.print("\n");
}
}
private void checkInstances(final ContentBundle draftBundle,
final String itemName,
final String itemId,
final String itemPath,
final HeaderStatus headerStatus,
final Set<LinkToCheck> linksToCheck) {
final ItemCollection instances = draftBundle.getInstances();
ContentItem current;
while (instances.next()) {
current = instances.getContentItem();
if (!itemName.equals(current.getName())) {
printItemHeaderLine(itemId, itemPath, headerStatus);
System.out.printf(
"\t%s instance %s (language: %s has wrong name. Should be '%s', but is '%s'.",
current.getVersion(),
current.getID().toString(),
current.getLanguage(),
itemName,
current.getName());
linksToCheck.add(new LinkToCheck(current.getName(),
itemName,
String.format("%s:/%s",
current.getContentSection().getName(),
current.getPath()),
itemPath));
if (pretend) {
System.out.print("\n");
} else {
current.setName(itemName);
System.out.printf(" Corrected.\n");
}
}
}
}
private class HeaderStatus {
private boolean headerPrinted = false;
public HeaderStatus() {
//Nothing
}
public boolean isHeaderPrinted() {
return headerPrinted;
}
public void setHeaderPrinted(final boolean headerPrinted) {
this.headerPrinted = headerPrinted;
}
}
private void printItemHeaderLine(final String itemId,
final String itemPath,
final HeaderStatus headerStatus) {
if (!headerStatus.isHeaderPrinted()) {
System.out.printf("Problems with item %s (id: %s):\n", itemPath, itemId);
headerStatus.setHeaderPrinted(true);
}
}
private class LinkToCheck {
private String wrongName;
private String correctName;
private String wrongPath;
private String correctPath;
public LinkToCheck() {
//Nothing
}
public LinkToCheck(final String wrongName,
final String correctName,
final String wrongPath,
final String correctPath) {
this.wrongName = wrongName;
this.correctName = correctName;
this.wrongPath = wrongPath;
this.correctPath = correctPath;
}
public String getWrongName() {
return wrongName;
}
public void setWrongName(final String wrongName) {
this.wrongName = wrongName;
}
public String getCorrectName() {
return correctName;
}
public void setCorrectName(final String correctName) {
this.correctName = correctName;
}
public String getWrongPath() {
return wrongPath;
}
public void setWrongPath(final String wrongPath) {
this.wrongPath = wrongPath;
}
public String getCorrectPath() {
return correctPath;
}
public void setCorrectPath(final String correctPath) {
this.correctPath = correctPath;
}
@Override
public int hashCode() {
int hash = 7;
if (wrongName == null) {
hash = 47 * hash;
} else {
hash = 47 * hash + wrongName.hashCode();
}
if (correctName == null) {
hash = 47 * hash;
} else {
hash = 47 * hash + correctName.hashCode();
}
return hash;
}
@Override
public boolean equals(final Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final LinkToCheck other = (LinkToCheck) obj;
if (wrongName == null && other.getWrongName() != null) {
return false;
}
if (wrongName != null && other.getWrongName() == null) {
return false;
}
if (correctName == null && other.getCorrectName() != null) {
return false;
}
if (correctName != null && other.getCorrectName() == null) {
return false;
}
return ((correctName.equals(other.getCorrectName()))
&& (wrongName.equals(other.getWrongName())));
}
}
private void checkArticle(final DataObject articleObj,
final Set<LinkToCheck> linksToCheck) {
final GenericArticle article = new GenericArticle(articleObj);
final TextAsset textAsset = article.getTextAsset();
if (textAsset == null) {
return;
}
final String text = textAsset.getText();
if (text == null) {
return;
}
for (LinkToCheck linkToCheck : linksToCheck) {
//if (text.contains(linkToCheck.getWrongName())) {
/*if (text.matches(String.format("^(.*)href=\"(.*)%s(.*)\"(.*)$"
linkToCheck.getWrongName()))) {*/
if (checkForPotentialBrockenLink(text, linkToCheck.getWrongName())) {
System.out.printf("Found a potenially brocken link in article item %s:/%s:\n",
article.getContentSection().getName(),
article.getPath());
System.out.printf("\tLook for a link containing to path '%s' and replace it with "
+ "the stable link to the target item %s.\n\n",
linkToCheck.getWrongPath(),
linkToCheck.getCorrectPath());
}
}
}
private void checkMpArticle(final DataObject mpArticleObj,
final Set<LinkToCheck> linksToCheck) {
final ContentItem mpItem = new ContentItem(mpArticleObj);
final DataCollection sections = (DataCollection) mpArticleObj.get("sections");
while (sections.next()) {
checkMpSection(mpItem, sections.getDataObject(), linksToCheck);
}
}
private void checkMpSection(final ContentItem mpItem,
final DataObject sectionObj,
final Set<LinkToCheck> linksToCheck) {
final DataObject textAssetObj = (DataObject) sectionObj.get("text");
if (textAssetObj == null) {
return;
}
final String text = (String) textAssetObj.get(TextAsset.CONTENT);
if (text == null) {
return;
}
for (LinkToCheck linkToCheck : linksToCheck) {
//if (text.contains(linkToCheck.getWrongName())) {
/*if (text.matches(String.format("^(.*)href=\"(.*)%s(.*)\"(.*)$",
linkToCheck.getWrongName()))) {*/
if(checkForPotentialBrockenLink(text, linkToCheck.getWrongName())) {
System.out.printf("Found a potenially brocken link in section '%s' of "
+ "MultiPartArticle %s:/%s.\n",
(String) sectionObj.get("title"),
mpItem.getContentSection().getName(),
mpItem.getPath());
System.out.printf("\tLook for a link containing to path '%s' and replace it with "
+ "the stable link to the target item %s.\n\n",
linkToCheck.getWrongPath(),
linkToCheck.getCorrectPath());
}
}
}
/**
* Returns {@code true} if a match for {@code checkFor} is found in the links of {@code text}.
* @param text
* @param checkFor
* @return
*/
private boolean checkForPotentialBrockenLink(final String text, final String checkFor) {
final Document document = Jsoup.parseBodyFragment(text);
final Elements links = document.select("a");
boolean result = false;
for(Element link : links) {
result = (link.attr("href").contains(checkFor));
}
return result;
}
}

View File

@ -1,73 +0,0 @@
/*
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms.util;
import com.arsdigita.globalization.Globalized;
import com.arsdigita.globalization.GlobalizedMessage;
/**
* Compilation of methods to simplify the handling of globalizing keys.
* Basically it adds the name of package's resource bundle files to the
* globalize methods and forwards to GlobalizedMessage, shortening the
* method invocation in the various application classes.
*
* @author <a href="mailto:yon@arsdigita.com">yon@arsdigita.com</a>
* @version $Revision: #7 $ $Date: 2004/08/17 $
*/
public class GlobalizationUtil implements Globalized {
/** Name of Java resource files to handle CMS's globalisation. */
private static final String BUNDLE_NAME = "com.arsdigita.cms.CMSResources";
/**
* Returns a globalized message using the package specific bundle,
* provided by BUNDLE_NAME.
* @param key
* @return
*/
public static GlobalizedMessage globalize(String key) {
return new GlobalizedMessage(key, BUNDLE_NAME);
}
/**
* Returns a globalized message object, using the package specific bundle,
* as specified by BUNDLE_NAME. Also takes in an Object[] of arguments to
* interpolate into the retrieved message using the MessageFormat class.
* @param key
* @param args
* @return
*/
public static GlobalizedMessage globalize(String key, Object[] args) {
return new GlobalizedMessage(key, BUNDLE_NAME, args);
}
/**
* Returns the name of the package specific resource bundle.
*
* Used e.g. by com.arsdigita.cms.ui.item.ItemLanguageTable to get the
* bundle tp pass to DataTable.
*
* @return Name of resource bundle as String
*/
public static String getBundleName() {
return BUNDLE_NAME;
}
}

View File

@ -1,81 +0,0 @@
/*
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms.util;
import com.arsdigita.globalization.GlobalizedMessage;
// Developers Note:
// Counterpart to CMSResourceBundle java class.
// No longer used because we couldn't find a way to make proper localization
// work.
// Retained for easy reference to further develop localization infrastructure.
/**
* <p>
* .
* Contains methods to simplify globalizing keys
* </p>
*
* @author <a href="mailto:yon@arsdigita.com">yon@arsdigita.com</a>
* @version $Revision: #7 $ $Date: 2004/08/17 $
*/
public class GlobalizationUtilOld {
/** Name of the Java class to handle CMS's globalisation. */
//public static String s_bundleName = "com.arsdigita.cms.util.CMSResourceBundle";
public static String s_bundleName = "com.arsdigita.cms.CMSResources";
/**
* This returns a globalized message using the package specific bundle,
* provided by method getBundleName()
*/
public static GlobalizedMessage globalize(String key) {
return new GlobalizedMessage(key, getBundleName());
}
/**
* Returns a globalized message object, using the package specific bundle,
* provided by method getBundleName(). Also takes in an Object[] of
* arguments to interpolate into the retrieved message using the
* MessageFormat class.
*/
public static GlobalizedMessage globalize(String key, Object[] args) {
return new GlobalizedMessage(key, getBundleName(), args);
}
/**
* Returns the name of the package specific resource bundle.
* @return
*/
public static String getBundleName() {
return s_bundleName;
}
/*
* Not a part of API. Otherwise it would need to be properly synchronized.
* Only meant be used to override resource keys in CMSResources
* by a custom application, in Initializer.
*/
public static void internalSetBundleName(String bundleName) {
s_bundleName = bundleName;
}
}

View File

@ -1,238 +0,0 @@
/*
* Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms.util;
import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.ContentPage;
import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.util.Assert;
import com.arsdigita.util.Pair;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.StringTokenizer;
/**
* Utility methods for dealing with the multilingual items.
*
* @author Shashin Shinde (sshinde@redhat.com)
* @author Sören Bernstein <quasi@quasiweb.de>
*/
public class LanguageUtil {
private static org.apache.log4j.Logger s_log = org.apache.log4j.Logger.getLogger(
LanguageUtil.class);
private static String s_languages = null;
private static String[] s_languagesArray = null;
/**
* Mapping from the ISO639-1 2-letter codes to the ISO639-2 3-letter codes
*/
private static final String ISO639_2LA_3LA = "com.arsdigita.cms.util.iso639rev";
private static ResourceBundle s_lang3LA = ResourceBundle.getBundle(ISO639_2LA_3LA);
/**
* Mapping from the ISO639-1 2-letter codes to the full descriptive name
*/
private static final String ISO639_2LA_FULL = "com.arsdigita.cms.util.iso639full";
private static ResourceBundle s_langFull = ResourceBundle.getBundle(ISO639_2LA_FULL);
public static GlobalizedMessage globalize(String key) {
return new LanguageGlobalizedMessage(key);
}
/**
* Sets the supported languages, eliminates all spaces and trims
*
* @param comma separated list of langages initialized from initializer at the server startup
*/
public static void setSupportedLanguages(String languages) {
s_languages = languages.replace(" ", "").trim();
}
/**
* Get the comma separated list of all supported languages
*/
public static String getSupportedLanguages() {
Assert.exists(s_languages, "supported languages not set");
return s_languages;
}
/**
* Returns the collection of all supported languages.
*
* @return all supported languages
*/
public static Collection getSupportedLanguages2LA() {
String allLanguages = getSupportedLanguages();
StringTokenizer tokenizer = new StringTokenizer(allLanguages, ",");
Collection langList = new LinkedList();
while (tokenizer.hasMoreElements()) {
String language = tokenizer.nextToken();
langList.add(language);
}
return langList;
}
/**
* Returns the collection of all supported languages. Each entry is a pair of 2 letter code as
* key and three letter code as value.
*
* @return all supported languages
*/
public static Collection getSupportedLanguages3LA() {
String allLanguages = getSupportedLanguages();
StringTokenizer tokenizer = new StringTokenizer(allLanguages, ",");
Collection langList = new LinkedList();
while (tokenizer.hasMoreElements()) {
String language = tokenizer.nextToken();
langList.add(new Pair(language, getLang3LA(language)));
}
return langList;
}
/**
* Returns the collection of all supported languages. Each entry is a pair of 2 letter code as
* key and full language name as a value.
*
* @return all supported languages
*/
public static Collection getSupportedLanguagesFull() {
String allLanguages = getSupportedLanguages();
StringTokenizer tokenizer = new StringTokenizer(allLanguages, ",");
Collection langList = new LinkedList();
while (tokenizer.hasMoreElements()) {
String language = tokenizer.nextToken();
langList.add(new Pair(language, getLangFull(language)));
}
return langList;
}
/**
* Get the List of languages in which this item can be created. Usefull on UI where we need to
* display the list of languages in which this Item can be created.
*/
public static Collection getCreatableLanguages(ContentPage item) {
ContentBundle bundle = item.getContentBundle();
Collection allList = getSupportedLanguages2LA();
allList.removeAll(bundle.getLanguages());
return allList;
}
/**
* Returns three letter acronym for language code mapped from two letter code.
*
* @return three letter code for the two letter code. If the resource is not found then the key
* itself is returned.
*/
public static String getLang3LA(String lang) {
String threeLA;
try {
// Lookup 3-letter language code via java.util.Locale
threeLA = (new Locale(lang)).getISO3Language();
} catch (MissingResourceException mre) {
// If there is none
try {
// Lookup 3-letter code via ressource bundle
threeLA = s_lang3LA.getString(lang);
} catch (MissingResourceException mexc) {
// if there is still no match, log a warning and return the 2-letter code
s_log.warn("Three letter language code for key '" + lang + "' not found: " + mexc);
threeLA = lang;
}
}
return threeLA;
}
/**
* Returns the full language name mapped from the two letter acronym.
*
* @param lang 2 letter language code
*
* @return full language name for the given two letter code If the resource is not found then
* the key itself is returned.
*/
public static String getLangFull(String lang) {
// Lookup language name via java.util.Locale
String fullName = (new Locale(lang)).getDisplayLanguage(GlobalizationHelper.
getNegotiatedLocale());
if (lang.equals(fullName)) {
// If that fails
try {
// Lookup language name vie ressource bundle
fullName = s_langFull.getString(lang);
} catch (MissingResourceException mexc) {
// If there is still nomatch, log a warning and return 2-letter code
s_log.warn("Full language name for key '" + lang + "' not found " + mexc);
fullName = lang;
}
}
return fullName;
}
/**
* Takes in a list of 2 letter codes and converts into 3 letter codes. Each entry is pair of 2
* letter code as key and 3 letter code as value.
*/
public static Collection convertTo3LA(Collection list) {
Collection conList = new LinkedList();
for (Iterator iter = list.iterator(); iter.hasNext();) {
String lang2Code = (String) iter.next();
conList.add(new Pair(lang2Code, getLang3LA(lang2Code)));
}
return conList;
}
public static Collection convertToFull(Collection list) {
Collection conList = new LinkedList();
for (Iterator iter = list.iterator(); iter.hasNext();) {
String lang2Code = (String) iter.next();
conList.add(new Pair(lang2Code, getLangFull(lang2Code)));
}
return conList;
}
public static Collection convertToG11N(Collection list) {
Collection conList = new LinkedList();
for (Iterator iter = list.iterator(); iter.hasNext();) {
String lang2Code = (String) iter.next();
conList.add(new Pair(lang2Code, globalize(lang2Code)));
}
return conList;
}
// Special GlobalizedMessage for use with the LanguageUtil#globalize method
private static class LanguageGlobalizedMessage extends GlobalizedMessage {
public LanguageGlobalizedMessage(String key) {
super(key);
}
@Override
public Object localize(Locale locale) {
return LanguageUtil.getLangFull(this.getKey());
}
}
}

View File

@ -1,82 +0,0 @@
/*
* Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms.util;
import org.xml.sax.helpers.DefaultHandler;
import java.util.Map;
/**
*
* SAX event handler class for parsing configuration file.
*
* Parse URL-to-Page/Dispatcher/Servlet mappings from a file.
*
* Format of the file is XML:
* <pre>
* &lt;dispatcher-configuration&gt;
* &lt;url-mapping
* &lt;url&gt;my-page&lt;/url&gt;
* OR &lt;page-class&gt;com.arsdigita.Page.class&lt;/page-class&gt;
* &lt;url-mapping
* &lt;/dispatcher-configuration&gt;
* </pre>
*/
public class PageClassConfigHandler extends DefaultHandler {
private Map m_map;
private Map m_rmap;
private StringBuffer m_buffer;
private String m_url;
private String m_className;
/**
* @param map A map to configure (pages-> classes)
* @param rmap A map to configure (classes-> pages)
*
* @pre md.m_map != null
*/
public PageClassConfigHandler(Map map, Map rmap) {
m_map = map;
// reverse map
m_rmap = rmap;
m_buffer = new StringBuffer();
}
@Override
public void characters(char[] ch, int start, int len) {
for (int i = 0; i < len; i++) {
m_buffer.append(ch[start + i]);
}
}
@Override
public void endElement(String uri, String localName, String qn) {
if ( qn.equals("url") ) {
m_url = m_buffer.toString().trim();
} else if ( qn.equals("page-class") ) {
m_className = m_buffer.toString().trim();
} else if ( qn.equals("url-mapping") ) {
m_map.put(m_url, m_className);
m_rmap.put(m_className, m_url);
}
m_buffer = new StringBuffer();
}
}

View File

@ -1,68 +0,0 @@
/*
* Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms.util;
/**
* <p>Security class used for checking and granting privileges in
* CMS.</p>
*
* @author Michael Pih
* @version $Revision: #7 $ $DateTime: 2004/08/17 23:15:09 $
* @version $Id: SecurityConstants.java 2090 2010-04-17 08:04:14Z pboy $
*/
public interface SecurityConstants {
// CMS Actions
public final static String STAFF_ADMIN = "staff_admin";
public final static String WORKFLOW_ADMIN = "workflow_admin";
public final static String CATEGORY_ADMIN = "category_admin";
public final static String LIFECYCLE_ADMIN = "lifecycle_admin";
public final static String CONTENT_TYPE_ADMIN = "content_type_admin";
public final static String PUBLISH = "publish";
public final static String NEW_ITEM = "new_item";
public final static String PUBLIC_PAGES = "public_pages";
public final static String PREVIEW_PAGES = "preview_pages";
public final static String ADMIN_PAGES = "admin_pages";
public final static String EDIT_ITEM = "edit_item";
public final static String SCHEDULE_PUBLICATION = "schedule_publication";
public final static String DELETE_ITEM = "delete_item";
public final static String APPLY_WORKFLOW = "apply_workflow";
public final static String CATEGORIZE_ITEMS = "categorize_items";
public final static String DELETE_IMAGES = "delete_images";
public final static String APPLY_ALTERNATE_WORKFLOWS = "apply_alternate_workflows";
// CMS Privileges
public final static String CMS_APPLY_ALTERNATE_WORKFLOWS = "cms_apply_alternate_workflows";
public final static String CMS_CATEGORIZE_ITEMS = "cms_categorize_items";
public final static String CMS_CATEGORY_ADMIN = "cms_category_admin";
public final static String CMS_CONTENT_TYPE_ADMIN = "cms_content_type_admin";
public final static String CMS_DELETE_ITEM = "cms_delete_item";
public final static String CMS_EDIT_ITEM = "cms_edit_item";
public final static String CMS_ITEM_ADMIN = "cms_item_admin";
public final static String CMS_LIFECYCLE_ADMIN = "cms_lifecycle_admin";
public final static String CMS_NEW_ITEM = "cms_new_item";
public final static String CMS_PREVIEW_ITEM = "cms_preview_item";
public final static String CMS_PUBLISH = "cms_publish";
public final static String CMS_APPROVE_ITEM = "cms_approve_item";
public final static String CMS_READ_ITEM = "cms_read_item";
public final static String CMS_STAFF_ADMIN = "cms_staff_admin";
public final static String CMS_WORKFLOW_ADMIN = "cms_workflow_admin";
}

View File

@ -1,44 +0,0 @@
/*
* Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms.util;
import com.arsdigita.runtime.ConfigError;
import org.apache.oro.text.perl.Perl5Util;
/**
* Utility functions for use by installer classes.
*
* @author Jon Orris (jorris@redhat.com)
* @version $Revision: #6 $ $DateTime: 2004/08/17 23:15:09 $
*/
public class Util {
public static void validateURLParameter(String name, String value)
throws ConfigError {
final String pattern = "/[^A-Za-z_0-9\\-]+/";
Perl5Util util = new Perl5Util();
if ( util.match(pattern, value) ) {
throw new ConfigError
("The \"" + name + "\" parameter must contain only " +
" alpha-numeric characters, underscores, and/or hyphens.");
}
}
}

View File

@ -280,3 +280,4 @@ cms.ui.authoring.workflow=Select a workflow
cms.ui.create=Create cms.ui.create=Create
cms.contenttypes.ui.summary=Summary cms.contenttypes.ui.summary=Summary
cms.contenttypes.ui.newsitem.date\ =Release date cms.contenttypes.ui.newsitem.date\ =Release date
cms.contenttypes.ui.event.start_date=Start date

View File

@ -278,3 +278,4 @@ cms.ui.authoring.workflow=Arbeitsablauf ausw\u00e4hlen
cms.ui.create=Anlegen cms.ui.create=Anlegen
cms.contenttypes.ui.summary=Zusammenfassung cms.contenttypes.ui.summary=Zusammenfassung
cms.contenttypes.ui.newsitem.date\ =Erscheinungsdatum cms.contenttypes.ui.newsitem.date\ =Erscheinungsdatum
cms.contenttypes.ui.event.start_date=Anfangsdatum

View File

@ -237,3 +237,4 @@ cms.ui.authoring.workflow=Select a workflow
cms.ui.create=Create cms.ui.create=Create
cms.contenttypes.ui.summary=Summary cms.contenttypes.ui.summary=Summary
cms.contenttypes.ui.newsitem.date\ =Release date cms.contenttypes.ui.newsitem.date\ =Release date
cms.contenttypes.ui.event.start_date=Start date