2 * Copyright (C) 2009 The Android Open Source Project
\r
4 * Licensed under the Apache License, Version 2.0 (the "License");
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an "AS IS" BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
17 package com.android.sdklib.internal.repository;
\r
19 import com.android.sdklib.AndroidVersion;
\r
20 import com.android.sdklib.SdkConstants;
\r
21 import com.android.sdklib.SdkManager;
\r
22 import com.android.sdklib.internal.repository.Archive.Arch;
\r
23 import com.android.sdklib.internal.repository.Archive.Os;
\r
24 import com.android.sdklib.repository.SdkRepoConstants;
\r
26 import org.w3c.dom.Node;
\r
28 import java.io.File;
\r
29 import java.util.Map;
\r
30 import java.util.Properties;
\r
33 * Represents a doc XML node in an SDK repository.
\r
35 * Note that a doc package has a version and thus implements {@link IPackageVersion}.
\r
36 * However there is no mandatory dependency that limits installation so this does not
\r
37 * implement {@link IPlatformDependency}.
\r
39 public class DocPackage extends Package implements IPackageVersion {
\r
41 private final AndroidVersion mVersion;
\r
44 * Creates a new doc package from the attributes and elements of the given XML node.
\r
45 * This constructor should throw an exception if the package cannot be created.
\r
47 * @param source The {@link SdkSource} where this is loaded from.
\r
48 * @param packageNode The XML element being parsed.
\r
49 * @param nsUri The namespace URI of the originating XML document, to be able to deal with
\r
50 * parameters that vary according to the originating XML schema.
\r
51 * @param licenses The licenses loaded from the XML originating document.
\r
53 DocPackage(SdkSource source, Node packageNode, String nsUri, Map<String,String> licenses) {
\r
54 super(source, packageNode, nsUri, licenses);
\r
56 int apiLevel = XmlParserUtils.getXmlInt (packageNode, SdkRepoConstants.NODE_API_LEVEL, 0);
\r
57 String codeName = XmlParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_CODENAME);
\r
58 if (codeName.length() == 0) {
\r
61 mVersion = new AndroidVersion(apiLevel, codeName);
\r
65 * Manually create a new package with one archive and the given attributes.
\r
66 * This is used to create packages from local directories in which case there must be
\r
67 * one archive which URL is the actual target location.
\r
69 * By design, this creates a package with one and only one archive.
\r
71 static Package create(SdkSource source,
\r
81 String archiveOsPath) {
\r
82 return new DocPackage(source, props, apiLevel, codename, revision, license, description,
\r
83 descUrl, archiveOs, archiveArch, archiveOsPath);
\r
86 private DocPackage(SdkSource source,
\r
96 String archiveOsPath) {
\r
106 mVersion = new AndroidVersion(props, apiLevel, codename);
\r
110 * Save the properties of the current packages in the given {@link Properties} object.
\r
111 * These properties will later be give the constructor that takes a {@link Properties} object.
\r
114 void saveProperties(Properties props) {
\r
115 super.saveProperties(props);
\r
117 mVersion.saveProperties(props);
\r
121 * Returns the version, for platform, add-on and doc packages.
\r
122 * Can be 0 if this is a local package of unknown api-level.
\r
124 public AndroidVersion getVersion() {
\r
129 * Returns a description of this package that is suitable for a list display.
\r
134 public String getListDescription() {
\r
135 if (mVersion.isPreview()) {
\r
136 return String.format("Documentation for Android '%1$s' Preview SDK%2$s",
\r
137 mVersion.getCodename(),
\r
138 isObsolete() ? " (Obsolete)" : "");
\r
140 return String.format("Documentation for Android SDK%2$s",
\r
141 mVersion.getApiLevel(),
\r
142 isObsolete() ? " (Obsolete)" : "");
\r
147 * Returns a short description for an {@link IDescription}.
\r
150 public String getShortDescription() {
\r
151 if (mVersion.isPreview()) {
\r
152 return String.format("Documentation for Android '%1$s' Preview SDK, revision %2$s%3$s",
\r
153 mVersion.getCodename(),
\r
155 isObsolete() ? " (Obsolete)" : "");
\r
157 return String.format("Documentation for Android SDK, API %1$d, revision %2$s%3$s",
\r
158 mVersion.getApiLevel(),
\r
160 isObsolete() ? " (Obsolete)" : "");
\r
165 * Returns a long description for an {@link IDescription}.
\r
167 * The long description is whatever the XML contains for the <description> field,
\r
168 * or the short description if the former is empty.
\r
171 public String getLongDescription() {
\r
172 String s = getDescription();
\r
173 if (s == null || s.length() == 0) {
\r
174 s = getShortDescription();
\r
177 if (s.indexOf("revision") == -1) {
\r
178 s += String.format("\nRevision %1$d%2$s",
\r
180 isObsolete() ? " (Obsolete)" : "");
\r
187 * Computes a potential installation folder if an archive of this package were
\r
188 * to be installed right away in the given SDK root.
\r
190 * A "doc" package should always be located in SDK/docs.
\r
192 * @param osSdkRoot The OS path of the SDK root folder.
\r
193 * @param sdkManager An existing SDK manager to list current platforms and addons.
\r
194 * @return A new {@link File} corresponding to the directory to use to install this package.
\r
197 public File getInstallFolder(String osSdkRoot, SdkManager sdkManager) {
\r
198 return new File(osSdkRoot, SdkConstants.FD_DOCS);
\r
202 public boolean sameItemAs(Package pkg) {
\r
203 // only one doc package so any doc package is the same item.
\r
204 return pkg instanceof DocPackage;
\r
210 * The comparison between doc packages is a bit more complex so we override the default
\r
213 * Docs are upgrade if they have a higher api, or a similar api but a higher revision.
\r
215 * What makes this more complex is handling codename.
\r
218 public UpdateInfo canBeUpdatedBy(Package replacementPackage) {
\r
219 if (replacementPackage == null) {
\r
220 return UpdateInfo.INCOMPATIBLE;
\r
223 // check they are the same item.
\r
224 if (sameItemAs(replacementPackage) == false) {
\r
225 return UpdateInfo.INCOMPATIBLE;
\r
228 DocPackage replacementDoc = (DocPackage)replacementPackage;
\r
230 AndroidVersion replacementVersion = replacementDoc.getVersion();
\r
232 // the new doc is an update if the api level is higher (no matter the codename on either)
\r
233 if (replacementVersion.getApiLevel() > mVersion.getApiLevel()) {
\r
234 return UpdateInfo.UPDATE;
\r
237 // Check if they're the same exact (api and codename)
\r
238 if (replacementVersion.equals(mVersion)) {
\r
239 // exact same version, so check the revision level
\r
240 if (replacementPackage.getRevision() > this.getRevision()) {
\r
241 return UpdateInfo.UPDATE;
\r
244 // not the same version? we check if they have the same api level and the new one
\r
245 // is a preview, in which case it's also an update (since preview have the api level
\r
246 // of the _previous_ version.)
\r
247 if (replacementVersion.getApiLevel() == mVersion.getApiLevel() &&
\r
248 replacementVersion.isPreview()) {
\r
249 return UpdateInfo.UPDATE;
\r
253 // not an upgrade but not incompatible either.
\r
254 return UpdateInfo.NOT_UPDATE;
\r