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: package org.apache.lenya.cms.site.usecases;
019:
020: import java.util.ArrayList;
021: import java.util.List;
022:
023: import org.apache.avalon.framework.service.ServiceSelector;
024: import org.apache.lenya.cms.publication.Document;
025: import org.apache.lenya.cms.publication.DocumentBuildException;
026: import org.apache.lenya.cms.publication.DocumentException;
027: import org.apache.lenya.cms.publication.Publication;
028: import org.apache.lenya.cms.publication.ResourceType;
029: import org.apache.lenya.cms.site.SiteManager;
030:
031: /**
032: * Usecase to create a new language version of a resource.
033: *
034: * @version $Id: CreateLanguage.java 509215 2007-02-19 14:45:55Z andreas $
035: */
036: public class CreateLanguage extends Create {
037:
038: private String documentTypeName;
039:
040: /**
041: * @see org.apache.lenya.cms.usecase.AbstractUsecase#doCheckPreconditions()
042: */
043: protected void doCheckPreconditions() throws Exception {
044: super .doCheckPreconditions();
045:
046: if (getSourceDocument() == null) {
047: addErrorMessage("This operation must be invoked on a document.");
048: return;
049: }
050:
051: String area = getSourceDocument().getArea();
052: if (!area.equals(Publication.AUTHORING_AREA)) {
053: addErrorMessage("This operation is only supported in the authoring area.");
054: return;
055: }
056:
057: if (getNonExistingLanguages().isEmpty()) {
058: addErrorMessage("All language versions already exist.");
059: }
060: }
061:
062: /**
063: * @return All languages supported by the publication for which this document does not yet have
064: * a version
065: * @throws DocumentBuildException if an error occurs.
066: * @throws DocumentException if an error occurs.
067: */
068: protected List getNonExistingLanguages()
069: throws DocumentBuildException, DocumentException {
070: Document source = getSourceDocument();
071: List nonExistingLanguages = new ArrayList();
072: String[] languages = source.getPublication().getLanguages();
073: for (int i = 0; i < languages.length; i++) {
074: if (!source.existsTranslation(languages[i])) {
075: nonExistingLanguages.add(languages[i]);
076: }
077: }
078: return nonExistingLanguages;
079: }
080:
081: /**
082: * @see org.apache.lenya.cms.usecase.AbstractUsecase#initParameters()
083: */
084: protected void initParameters() {
085: super .initParameters();
086:
087: Document source = getSourceDocument();
088: if (source != null) {
089: try {
090: setParameter(PATH, source.getPath());
091: List nonExistingLanguages = getNonExistingLanguages();
092: setParameter(
093: LANGUAGES,
094: nonExistingLanguages
095: .toArray(new String[nonExistingLanguages
096: .size()]));
097: } catch (Exception e) {
098: throw new RuntimeException(e);
099: }
100: }
101: }
102:
103: /**
104: * For new language version of a document, name is the same as that document's
105: * @see Create#getNewDocumentName()
106: */
107: protected String getNewDocumentName() {
108: return getSourceDocument().getName();
109: }
110:
111: /**
112: * For new language version of a document, the path is the same as that document's
113: * @see Create#getNewDocumentPath()
114: */
115: protected String getNewDocumentPath() {
116: try {
117: return getSourceDocument().getPath();
118: } catch (DocumentException e) {
119: throw new RuntimeException(e);
120: }
121: }
122:
123: /**
124: * New language version of a document: use that document's content
125: * @see Create#getInitialDocument()
126: */
127: protected Document getInitialDocument() {
128: return getSourceDocument();
129: }
130:
131: /**
132: * @see Create#getDocumentTypeName()
133: */
134: protected String getDocumentTypeName() {
135: if (this .documentTypeName == null
136: && getSourceDocument() != null) {
137: try {
138: ResourceType type = getSourceDocument()
139: .getResourceType();
140: this .documentTypeName = type.getName();
141:
142: List nonExistingLanguages = getNonExistingLanguages();
143: setParameter(
144: LANGUAGES,
145: nonExistingLanguages
146: .toArray(new String[nonExistingLanguages
147: .size()]));
148:
149: } catch (Exception e) {
150: throw new RuntimeException(e);
151: }
152: }
153: return this .documentTypeName;
154: }
155:
156: protected boolean getVisibleInNav() {
157: Document source = getSourceDocument();
158: ServiceSelector selector = null;
159: SiteManager siteManager = null;
160: try {
161: selector = (ServiceSelector) manager
162: .lookup(SiteManager.ROLE + "Selector");
163: siteManager = (SiteManager) selector.select(source
164: .getPublication().getSiteManagerHint());
165: return siteManager.isVisibleInNav(source);
166: } catch (Exception e) {
167: throw new RuntimeException(e);
168: } finally {
169: if (selector != null) {
170: if (siteManager != null) {
171: selector.release(siteManager);
172: }
173: manager.release(selector);
174: }
175: }
176: }
177:
178: protected String getSourceExtension() {
179: return getSourceDocument().getSourceExtension();
180: }
181:
182: protected boolean createVersion() {
183: return true;
184: }
185:
186: }
|