Skip to content

Commit

Permalink
[DOXIASITETOOLS-311] Rework and simplify the site model
Browse files Browse the repository at this point in the history
This closes #110
  • Loading branch information
michael-o committed Sep 23, 2023
1 parent fc02559 commit 073afea
Show file tree
Hide file tree
Showing 37 changed files with 1,620 additions and 528 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,19 @@
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.doxia.site.Banner;
import org.apache.maven.doxia.site.Body;
import org.apache.maven.doxia.site.Image;
import org.apache.maven.doxia.site.LinkItem;
import org.apache.maven.doxia.site.Logo;
import org.apache.maven.doxia.site.Menu;
import org.apache.maven.doxia.site.MenuItem;
import org.apache.maven.doxia.site.PublishDate;
import org.apache.maven.doxia.site.SiteModel;
import org.apache.maven.doxia.site.Skin;
import org.apache.maven.doxia.site.Version;
import org.apache.maven.doxia.site.decoration.DecorationModel;
import org.apache.maven.doxia.site.decoration.io.xpp3.DecorationXpp3Reader;
import org.apache.maven.doxia.site.inheritance.SiteModelInheritanceAssembler;
import org.apache.maven.doxia.site.io.xpp3.SiteXpp3Reader;
import org.apache.maven.doxia.site.io.xpp3.SiteXpp3Writer;
Expand All @@ -72,6 +81,8 @@
import org.codehaus.plexus.util.ReaderFactory;
import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.util.xml.pull.MXParser;
import org.codehaus.plexus.util.xml.pull.XmlPullParser;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
Expand Down Expand Up @@ -404,7 +415,7 @@ public SiteModel getSiteModel(
// "classical" late interpolation, after full inheritance
siteDescriptorContent = getInterpolatedSiteDescriptorContent(project, siteDescriptorContent, false);

siteModel = readSiteModel(siteDescriptorContent);
siteModel = readSiteModel(siteDescriptorContent, project, locale);

if (parentProject != null) {
populateParentMenu(siteModel, locale, project, parentProject, true);
Expand Down Expand Up @@ -998,7 +1009,7 @@ private Map.Entry<SiteModel, MavenProject> getSiteModel(
// interpolate ${this.*} = early interpolation
siteDescriptorContent = getInterpolatedSiteDescriptorContent(project, siteDescriptorContent, true);

siteModel = readSiteModel(siteDescriptorContent);
siteModel = readSiteModel(siteDescriptorContent, project, locale);
siteModel.setLastModified(siteDescriptor.lastModified());
} else {
LOGGER.debug("No" + (depth == 0 ? "" : (" parent level " + depth)) + " site descriptor");
Expand Down Expand Up @@ -1071,16 +1082,204 @@ private Map.Entry<SiteModel, MavenProject> getSiteModel(
* @return the site model object
* @throws SiteToolException if any
*/
private SiteModel readSiteModel(String siteDescriptorContent) throws SiteToolException {
private SiteModel readSiteModel(String siteDescriptorContent, MavenProject project, Locale locale)
throws SiteToolException {
try {
return new SiteXpp3Reader().read(new StringReader(siteDescriptorContent));
if (project != null && isOldSiteModel(siteDescriptorContent)) {
LOGGER.warn(
"Site model of '" + project.getId() + "' for "
+ (locale.equals(SiteTool.DEFAULT_LOCALE)
? "default locale"
: "locale '" + locale + "'")
+ " is still using the old pre-version 2.0.0 model. You MUST migrate to the new model as soon as possible otherwise your build will break in the future!");
return convertOldToNewSiteModel(
new DecorationXpp3Reader().read(new StringReader(siteDescriptorContent)));
} else {
return new SiteXpp3Reader().read(new StringReader(siteDescriptorContent));
}
} catch (XmlPullParserException e) {
throw new SiteToolException("Error parsing site descriptor", e);
} catch (IOException e) {
throw new SiteToolException("Error reading site descriptor", e);
}
}

private SiteModel convertOldToNewSiteModel(DecorationModel oldModel) {
SiteModel newModel = new SiteModel();
newModel.setName(oldModel.getName());
newModel.setCombineSelf(oldModel.getCombineSelf());
if (oldModel.getBannerLeft() != null) {
newModel.setBannerLeft(convertBanner(oldModel.getBannerLeft()));
}
if (oldModel.getBannerRight() != null) {
newModel.setBannerRight(convertBanner(oldModel.getBannerRight()));
}
if (!oldModel.isDefaultPublishDate()) {
PublishDate newPublishDate = new PublishDate();
newPublishDate.setFormat(oldModel.getPublishDate().getFormat());
newPublishDate.setPosition(oldModel.getPublishDate().getPosition());
newPublishDate.setTimezone(oldModel.getPublishDate().getTimezone());
newModel.setPublishDate(newPublishDate);
}
if (!oldModel.isDefaultVersion()) {
Version newVersion = new Version();
newVersion.setPosition(oldModel.getVersion().getPosition());
newModel.setVersion(newVersion);
}
newModel.setEdit(oldModel.getEdit());
if (oldModel.getSkin() != null) {
Skin newSkin = new Skin();
newSkin.setGroupId(oldModel.getSkin().getGroupId());
newSkin.setArtifactId(oldModel.getSkin().getArtifactId());
newSkin.setVersion(oldModel.getSkin().getVersion());
newModel.setSkin(newSkin);
}
// poweredBy
for (org.apache.maven.doxia.site.decoration.Logo oldLogo : oldModel.getPoweredBy()) {
Logo newLogo = new Logo();
newLogo.setName(oldLogo.getName());
newLogo.setHref(oldLogo.getHref());
newLogo.setTarget(oldLogo.getTarget());
if (oldLogo.getImg() != null) {
newLogo.setImage(convertImage(
oldLogo.getImg(),
oldLogo.getPosition(),
oldLogo.getHeight(),
oldLogo.getWidth(),
oldLogo.getBorder(),
oldLogo.getAlt()));
}
newModel.addPoweredBy(newLogo);
}
newModel.setLastModified(oldModel.getLastModified());
if (oldModel.getBody() != null) {
Body newBody = new Body();
newBody.setHead(oldModel.getBody().getHead());
for (org.apache.maven.doxia.site.decoration.LinkItem oldLink :
oldModel.getBody().getLinks()) {
newBody.addLink(convertLinkItem(oldLink));
}
for (org.apache.maven.doxia.site.decoration.LinkItem oldBreadcrumb :
oldModel.getBody().getBreadcrumbs()) {
newBody.addBreadcrumb(convertLinkItem(oldBreadcrumb));
}

for (org.apache.maven.doxia.site.decoration.Menu oldMenu :
oldModel.getBody().getMenus()) {
Menu newMenu = new Menu();
newMenu.setName(oldMenu.getName());
newMenu.setInherit(oldMenu.getInherit());
newMenu.setInheritAsRef(oldMenu.isInheritAsRef());
newMenu.setRef(oldMenu.getRef());
if (oldMenu.getImg() != null) {
newMenu.setImage(convertImage(
oldMenu.getImg(),
oldMenu.getPosition(),
oldMenu.getHeight(),
oldMenu.getWidth(),
oldMenu.getBorder(),
oldMenu.getAlt()));
}
newMenu.setItems(convertMenuItems(oldMenu.getItems()));
newBody.addMenu(newMenu);
}

newBody.setFooter(oldModel.getBody().getFooter());
newModel.setBody(newBody);
}
newModel.setCustom(oldModel.getCustom());

return newModel;
}

private Banner convertBanner(org.apache.maven.doxia.site.decoration.Banner oldBanner) {
Banner newBanner = new Banner();
newBanner.setName(oldBanner.getName());
newBanner.setHref(oldBanner.getHref());
if (oldBanner.getSrc() != null) {
newBanner.setImage(convertImage(
oldBanner.getSrc(),
null,
oldBanner.getHeight(),
oldBanner.getWidth(),
oldBanner.getBorder(),
oldBanner.getAlt()));
}

return newBanner;
}

private Image convertImage(String src, String position, String height, String width, String border, String alt) {
Image newImage = new Image();
newImage.setSrc(src);
newImage.setPosition(position);
newImage.setHeight(height);
newImage.setWidth(width);
if (border != null) {
newImage.setStyle("border: " + border + ";");
}
newImage.setAlt(alt);

return newImage;
}

private LinkItem convertLinkItem(org.apache.maven.doxia.site.decoration.LinkItem oldLinkItem) {
LinkItem newLinkItem = new LinkItem();
newLinkItem.setName(oldLinkItem.getName());
newLinkItem.setHref(oldLinkItem.getHref());
newLinkItem.setTarget(oldLinkItem.getTarget());
if (oldLinkItem.getImg() != null) {
newLinkItem.setImage(convertImage(
oldLinkItem.getImg(),
oldLinkItem.getPosition(),
oldLinkItem.getHeight(),
oldLinkItem.getWidth(),
oldLinkItem.getBorder(),
oldLinkItem.getAlt()));
}

return newLinkItem;
}

private List<MenuItem> convertMenuItems(List<org.apache.maven.doxia.site.decoration.MenuItem> oldMenuItems) {
List<MenuItem> newMenuItems = new ArrayList<>();
for (org.apache.maven.doxia.site.decoration.MenuItem oldMenuItem : oldMenuItems) {
MenuItem newMenuItem = new MenuItem();
newMenuItem.setName(oldMenuItem.getName());
newMenuItem.setHref(oldMenuItem.getHref());
newMenuItem.setTarget(oldMenuItem.getTarget());
newMenuItem.setCollapse(oldMenuItem.isCollapse());
newMenuItem.setRef(oldMenuItem.getRef());
newMenuItem.setItems(convertMenuItems(oldMenuItem.getItems()));
if (oldMenuItem.getImg() != null) {
newMenuItem.setImage(convertImage(
oldMenuItem.getImg(),
oldMenuItem.getPosition(),
oldMenuItem.getHeight(),
oldMenuItem.getWidth(),
oldMenuItem.getBorder(),
oldMenuItem.getAlt()));
}
newMenuItems.add(newMenuItem);
}

return newMenuItems;
}

private boolean isOldSiteModel(String siteDescriptorContent) throws XmlPullParserException, IOException {
XmlPullParser parser = new MXParser();
parser.setInput(new StringReader(siteDescriptorContent));

if (!(parser.getEventType() == XmlPullParser.START_DOCUMENT && parser.next() == XmlPullParser.START_TAG)) {
return false;
}
if ("project".equals(parser.getName())) {
return true;
}

return false;
}

private SiteModel getDefaultSiteModel() throws SiteToolException {
String siteDescriptorContent;

Expand All @@ -1094,7 +1293,7 @@ private SiteModel getDefaultSiteModel() throws SiteToolException {
IOUtil.close(reader);
}

return readSiteModel(siteDescriptorContent);
return readSiteModel(siteDescriptorContent, null, SiteTool.DEFAULT_LOCALE);
}

private String siteModelToString(SiteModel siteModel) throws SiteToolException {
Expand Down
10 changes: 5 additions & 5 deletions doxia-integration-tools/src/main/resources/default-site.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ specific language governing permissions and limitations
under the License.
-->

<project name="${project.name}">
<bannerLeft>
<name>${project.name}</name>
</bannerLeft>
<site xmlns="http://maven.apache.org/SITE/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SITE/2.0.0 https://maven.apache.org/xsd/site-2.0.0.xsd"
name="${project.name}">
<bannerLeft name="${project.name}" />
<skin>
<groupId>org.apache.maven.skins</groupId>
<artifactId>maven-fluido-skin</artifactId>
Expand All @@ -35,4 +35,4 @@ under the License.
<menu ref="modules" />
<menu ref="reports" />
</body>
</project>
</site>
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import javax.inject.Named;

import java.io.File;
import java.io.StringReader;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
Expand All @@ -38,6 +39,7 @@
import org.apache.maven.doxia.site.LinkItem;
import org.apache.maven.doxia.site.SiteModel;
import org.apache.maven.doxia.site.Skin;
import org.apache.maven.doxia.site.io.xpp3.SiteXpp3Reader;
import org.apache.maven.doxia.site.io.xpp3.SiteXpp3Writer;
import org.apache.maven.doxia.tools.stubs.SiteToolMavenProjectStub;
import org.apache.maven.project.MavenProject;
Expand Down Expand Up @@ -127,7 +129,7 @@ public void testGetSkinArtifactFromRepository() throws Exception {
SiteToolMavenProjectStub project = new SiteToolMavenProjectStub("site-tool-test");
Skin skin = new Skin();
skin.setGroupId("org.apache.maven.skins");
skin.setArtifactId("maven-stylus-skin");
skin.setArtifactId("maven-fluido-skin");
assertNotNull(
tool.getSkinArtifactFromRepository(newRepoSession(), project.getRemoteProjectRepositories(), skin));
}
Expand Down Expand Up @@ -370,13 +372,13 @@ public void testGetSiteModel() throws Exception {
assertEquals("Maven Site", model.getBannerLeft().getName());
assertEquals(
"http://maven.apache.org/images/apache-maven-project.png",
model.getBannerLeft().getSrc());
model.getBannerLeft().getImage().getSrc());
assertEquals("http://maven.apache.org/", model.getBannerLeft().getHref());
assertNotNull(model.getBannerRight());
assertNull(model.getBannerRight().getName());
assertEquals(
"http://maven.apache.org/images/maven-small.gif",
model.getBannerRight().getSrc());
model.getBannerRight().getImage().getSrc());
assertNull(model.getBannerRight().getHref());

// model from repo: https://repo1.maven.org/maven2/org/apache/maven/maven/3.8.6/maven-3.8.6-site.xml
Expand All @@ -396,7 +398,7 @@ public void testGetSiteModel() throws Exception {
assertEquals("dummy", modelFromRepo.getBannerLeft().getName());
assertEquals(
"https://maven.apache.org/images/apache-maven-project.png",
modelFromRepo.getBannerLeft().getSrc());
modelFromRepo.getBannerLeft().getImage().getSrc());
assertEquals("https://maven.apache.org/", modelFromRepo.getBannerLeft().getHref());
assertNull(modelFromRepo.getBannerRight());
}
Expand Down Expand Up @@ -534,6 +536,37 @@ public void testSiteModelInheritanceAndInterpolation() throws Exception {
assertEquals("PATH = PATH property from pom", links.next().getName());
}

/**
* @throws Exception
*/
@Test
public void testConvertOldToNewSiteModel() throws Exception {
assertNotNull(tool);

SiteToolMavenProjectStub project = new SiteToolMavenProjectStub("old-to-new-site-model-conversion-test");
List<MavenProject> reactorProjects = new ArrayList<MavenProject>();

// model from current local build
SiteModel model = tool.getSiteModel(
new File(project.getBasedir(), "src/site"),
SiteTool.DEFAULT_LOCALE,
project,
reactorProjects,
newRepoSession(),
project.getRemoteProjectRepositories());
assertNotNull(model);

File descriptorFile =
getTestFile("src/test/resources/unit/old-to-new-site-model-conversion-test/src/site/new-site.xml");
assertNotNull(descriptorFile);
assertTrue(descriptorFile.exists());

String siteDescriptorContent = FileUtils.fileRead(descriptorFile);
SiteModel newModel = new SiteXpp3Reader().read(new StringReader(siteDescriptorContent));
assertNotNull(newModel);
assertEquals(newModel, model);
}

private void writeModel(SiteModel model, String to) throws Exception {
Writer writer = WriterFactory.newXmlWriter(getTestFile("target/test-classes/" + to));
try {
Expand Down
Loading

0 comments on commit 073afea

Please sign in to comment.