/*
* Copyright 2015 Time Warner Cable, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.twcable.jackalope.impl.cq;
import com.day.cq.commons.Filter;
import com.day.cq.commons.LabeledResource;
import com.day.cq.tagging.Tag;
import com.day.cq.tagging.TagManager;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageFilter;
import com.day.cq.wcm.api.PageManager;
import com.day.cq.wcm.api.Template;
import com.day.cq.wcm.api.WCMException;
import com.day.text.Text;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ValueMap;
import javax.jcr.Node;
import java.util.Calendar;
import java.util.Iterator;
import java.util.Locale;
/**
* Page implementation.
*/
public class PageImpl implements Page {
private final Resource resource;
private Tag[] tagCache;
public PageImpl(Resource resource) {
this.resource = resource;
}
@Override
public String getPath() {
return this.resource != null ? this.resource.getPath() : null;
}
@Override
public PageManager getPageManager() {
return resource != null ? resource.getResourceResolver().adaptTo(PageManager.class) : null;
}
@Override
public Resource getContentResource() {
return resource != null ? resource.getChild("jcr:content") : null;
}
@Override
public Resource getContentResource(String s) {
if (s == null || s.isEmpty()) return getContentResource();
if (s.startsWith("/")) throw new IllegalArgumentException("Relative path expected.");
return resource.getChild("jcr:content/" + s);
}
@Override
public Iterator<Page> listChildren() {
return listChildren(new PageFilter());
}
@Override
public Iterator<Page> listChildren(Filter<Page> pageFilter) {
return listChildren(pageFilter, false);
}
@Override
public Iterator<Page> listChildren(Filter<Page> pageFilter, boolean deep) {
return new PageIteratorImpl(resource, pageFilter, deep);
}
@Override
public boolean hasChild(String s) {
return resource != null && resource.getChild(s) != null;
}
@Override
public int getDepth() {
throw new UnsupportedOperationException();
}
@Override
public Page getParent() {
return getParent(1);
}
@Override
public Page getParent(int i) {
if (i == 0) return this;
String path = Text.getRelativeParent(resource.getPath(), i);
if (!path.isEmpty() && !path.equals("/")) return null;
Resource parent = resource.getResourceResolver().getResource(path);
return parent != null ? parent.adaptTo(Page.class) : null;
}
@Override
public Page getAbsoluteParent(int i) {
String path = Text.getAbsoluteParent(resource.getPath(), i);
Resource parent = resource.getResourceResolver().getResource(path);
return parent == null ? null : parent.adaptTo(Page.class);
}
@Override
public ValueMap getProperties() {
Resource contentResource = getContentResource();
return contentResource != null ? contentResource.adaptTo(ValueMap.class) : null;
}
@Override
public ValueMap getProperties(String s) {
throw new UnsupportedOperationException();
}
@Override
public String getName() {
return resource != null ? resource.getName() : null;
}
@Override
public String getTitle() {
return getProperties().get("jcr:title", String.class);
}
@Override
public String getDescription() {
return getProperties().get("jcr:description", String.class);
}
@Override
public String getPageTitle() {
return getProperties().get("pageTitle", String.class);
}
@Override
public String getNavigationTitle() {
return getProperties().get("navTitle", String.class);
}
@Override
public boolean isHideInNav() {
ValueMap props = getProperties();
return props.containsKey("hideInNav") ? props.get("hideInNav", Boolean.class) : false;
}
@Override
public boolean hasContent() {
return resource != null && resource.getChild("jcr:content") != null;
}
@Override
public boolean isValid() {
return timeUntilValid() == 0;
}
@Override
public long timeUntilValid() {
if (!hasContent()) return Long.MIN_VALUE;
Calendar onTime = getOnTime(), offTime = getOffTime();
long now = System.currentTimeMillis();
long on = onTime != null ? onTime.getTimeInMillis() : Long.MIN_VALUE;
long off = offTime != null ? offTime.getTimeInMillis() : Long.MAX_VALUE;
return now < on ? on - now :
now >= off ? off - now :
0;
}
@Override
public Calendar getOnTime() {
ValueMap properties = getProperties();
return properties != null ? properties.get("onTime", Calendar.class) : null;
}
@Override
public Calendar getOffTime() {
ValueMap properties = getProperties();
return properties != null ? properties.get("offTime", Calendar.class) : null;
}
@Override
public String getLastModifiedBy() {
ValueMap properties = getProperties();
String lastModifiedBy = properties.get("cq:lastModifiedBy", String.class);
return lastModifiedBy != null ? lastModifiedBy : properties.get("jcr:lastModifiedBy", String.class);
}
@Override
public Calendar getLastModified() {
ValueMap properties = getProperties();
Calendar lastModified = properties.get("cq:lastModified", Calendar.class);
return lastModified != null ? lastModified : properties.get("jcr:lastModified", Calendar.class);
}
@Override
public String getVanityUrl() {
return getProperties().get("vanityUrl", String.class);
}
@Override
public com.day.cq.tagging.Tag[] getTags() {
if (tagCache != null) return tagCache;
Resource contentResource = getContentResource();
TagManager tagManager = contentResource.getResourceResolver().adaptTo(TagManager.class);
tagCache = tagManager == null ? new Tag[0] : tagManager.getTags(contentResource);
return tagCache;
}
@Override
public void lock() throws WCMException {
throw new UnsupportedOperationException();
}
@Override
public boolean isLocked() {
throw new UnsupportedOperationException();
}
@Override
public String getLockOwner() {
throw new UnsupportedOperationException();
}
@Override
public boolean canUnlock() {
throw new UnsupportedOperationException();
}
@Override
public void unlock() throws WCMException {
throw new UnsupportedOperationException();
}
@Override
public Template getTemplate() {
throw new UnsupportedOperationException();
}
@Override
public Locale getLanguage(boolean ignoreContent) {
throw new UnsupportedOperationException();
}
@Override
@SuppressWarnings("unchecked")
public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
if (resource == null) return null;
if (type.equals(Resource.class)) return (AdapterType)resource;
if (type.equals(LabeledResource.class)) return (AdapterType)this;
if (type.equals(Node.class)) return (AdapterType)resource.adaptTo(Node.class);
return resource.adaptTo(type);
}
}