001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018:
019: /* $Id: DocumentLanguagesHelper.java 494806 2007-01-10 13:11:01Z andreas $ */
020:
021: package org.apache.lenya.cms.publication.util;
022:
023: import java.util.ArrayList;
024: import java.util.List;
025: import java.util.Map;
026:
027: import org.apache.avalon.framework.service.ServiceManager;
028: import org.apache.cocoon.ProcessingException;
029: import org.apache.cocoon.environment.ObjectModelHelper;
030: import org.apache.cocoon.environment.Request;
031: import org.apache.lenya.cms.publication.Document;
032: import org.apache.lenya.cms.publication.DocumentBuildException;
033: import org.apache.lenya.cms.publication.DocumentFactory;
034: import org.apache.lenya.cms.publication.DocumentLocator;
035: import org.apache.lenya.cms.publication.DocumentUtil;
036: import org.apache.lenya.cms.publication.Publication;
037: import org.apache.lenya.cms.publication.PublicationUtil;
038: import org.apache.lenya.cms.repository.RepositoryUtil;
039: import org.apache.lenya.cms.repository.Session;
040: import org.apache.lenya.util.ServletHelper;
041:
042: /**
043: * Helper class for the policy GUI.
044: */
045: public class DocumentLanguagesHelper {
046:
047: private DocumentFactory factory;
048: private ServiceManager manager;
049: private Publication pub;
050: private String url;
051: private String contextPath;
052:
053: /**
054: * Create a new DocumentlanguageHelper.
055: * @param objectModel the objectModel
056: * @param manager The service manager.
057: * @throws ProcessingException if the page envelope could not be created.
058: */
059: public DocumentLanguagesHelper(Map objectModel,
060: ServiceManager manager) throws ProcessingException {
061:
062: this .manager = manager;
063: Request request = ObjectModelHelper.getRequest(objectModel);
064: this .url = ServletHelper.getWebappURI(request);
065: this .contextPath = request.getContextPath();
066:
067: try {
068: Session session = RepositoryUtil.getSession(manager,
069: request);
070: this .factory = DocumentUtil.createDocumentFactory(
071: this .manager, session);
072:
073: this .pub = PublicationUtil.getPublication(manager,
074: objectModel);
075: } catch (Exception e) {
076: throw new ProcessingException(e);
077: }
078: }
079:
080: /**
081: * @return The requested language.
082: * @throws ProcessingException if an error occurs.
083: */
084: public String getLanguage() throws ProcessingException {
085: try {
086: return getLocator().getLanguage();
087: } catch (DocumentBuildException e) {
088: throw new ProcessingException(e);
089: }
090: }
091:
092: /**
093: * All available languages for the current URL.
094: * @return A string array.
095: * @throws ProcessingException
096: */
097: public String[] getLanguages() throws ProcessingException {
098: List availableLanguages = new ArrayList();
099:
100: try {
101: DocumentLocator locator = getLocator();
102: String[] languages = pub.getLanguages();
103: for (int i = 0; i < languages.length; i++) {
104: DocumentLocator version = locator
105: .getLanguageVersion(languages[i]);
106: Publication pub = factory.getPublication(locator
107: .getPublicationId());
108: if (pub.getArea(version.getArea()).getSite().contains(
109: version.getPath(), version.getLanguage())) {
110: availableLanguages.add(languages[i]);
111: }
112: }
113:
114: } catch (Exception e) {
115: throw new ProcessingException(e);
116: }
117: return (String[]) availableLanguages
118: .toArray(new String[availableLanguages.size()]);
119: }
120:
121: /**
122: * Compute the URL for a given language and the parameters given in the contructor.
123: * @param language the language
124: * @return the url for the given language
125: * @throws ProcessingException if the document for the given language could not be created.
126: */
127: public String getUrl(String language) throws ProcessingException {
128: Document doc = getDocument(language);
129: return this .contextPath + doc.getCanonicalWebappURL();
130: }
131:
132: /**
133: * Create a document for a given language and the parameters given in the contructor.
134: * @param language the language
135: * @return the document with the given language
136: * @throws ProcessingException if the document for the given language could not be created.
137: */
138: protected Document getDocument(String language)
139: throws ProcessingException {
140: Document document;
141: try {
142: DocumentLocator locator = getLocator();
143: DocumentLocator version = locator
144: .getLanguageVersion(language);
145: document = this .factory.get(version);
146: } catch (Exception e) {
147: throw new ProcessingException(e);
148: }
149: return document;
150: }
151:
152: protected DocumentLocator getLocator()
153: throws DocumentBuildException {
154: DocumentLocator locator = this.pub.getDocumentBuilder()
155: .getLocator(this.factory, this.url);
156: return locator;
157: }
158: }
|