blob: 7840751a97adf0ac4fb257be5c838b817ba58b51 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.netbeans.modules.autoupdate.services;
import java.io.File;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.netbeans.Module;
import org.netbeans.api.autoupdate.UpdateElement;
import org.netbeans.api.autoupdate.UpdateManager;
import org.netbeans.api.autoupdate.UpdateManager.TYPE;
import org.netbeans.modules.autoupdate.updateprovider.InstallInfo;
import org.netbeans.modules.autoupdate.updateprovider.InstalledModuleItem;
import org.netbeans.modules.autoupdate.updateprovider.ModuleItem;
import org.netbeans.updater.UpdateTracking;
import org.openide.filesystems.FileUtil;
import org.openide.modules.ModuleInfo;
import org.openide.modules.SpecificationVersion;
/**
*
* @author Jiri Rechtacek
*/
public class ModuleUpdateElementImpl extends UpdateElementImpl {
private String codeName;
private String displayName;
private SpecificationVersion specVersion;
private String description;
private String source;
private String author;
private String homepage;
private int downloadSize;
private String category;
private String rawCategory;
private InstallInfo installInfo;
private static final Logger log = Logger.getLogger (ModuleUpdateElementImpl.class.getName ());
private ModuleInfo moduleInfo;
private ModuleItem item;
private String providerName;
private String date;
private boolean isEager;
private boolean isAutoload;
private boolean isPreferredUpdate;
private String installationCluster;
public ModuleUpdateElementImpl (ModuleItem item, String providerName) {
super (item, providerName);
this.moduleInfo = item.getModuleInfo ();
this.item = item;
this.providerName = providerName;
codeName = item.getCodeName ();
specVersion = item.getSpecificationVersion () == null ? null : new SpecificationVersion (item.getSpecificationVersion ());
installInfo = new InstallInfo (item);
author = item.getAuthor ();
downloadSize = item.getDownloadSize ();
homepage = item.getHomepage ();
date = item.getDate ();
isEager = item.isEager ();
isAutoload = item.isAutoload ();
this.isPreferredUpdate = item.isPreferredUpdate();
}
@Override
public String getCodeName () {
return codeName;
}
@Override
public String getDisplayName () {
if (displayName == null) {
String dn = moduleInfo.getDisplayName ();
assert dn != null : "Module " + codeName + " doesn't provider display name. Value of \"OpenIDE-Module-Name\" cannot be null.";
if (dn == null) {
log.log (Level.WARNING, "Module " + codeName + " doesn't provider display name. Value of \"OpenIDE-Module-Name\" cannot be null.");
}
displayName = dn == null ? codeName : dn;
}
return displayName;
}
@Override
public SpecificationVersion getSpecificationVersion () {
return specVersion;
}
@Override
public String getDescription () {
if (description == null) {
description = (String) moduleInfo.getLocalizedAttribute ("OpenIDE-Module-Long-Description");
}
return description;
}
@Override
public String getNotification() {
String notification = item.getModuleNotification ();
if (notification != null) {
notification = notification.trim();
}
return notification;
}
@Override
public String getAuthor () {
return author;
}
@Override
public String getHomepage () {
return homepage;
}
@Override
public int getDownloadSize () {
return downloadSize;
}
@Override
public String getSource () {
if (source == null) {
source = item instanceof InstalledModuleItem ? ((InstalledModuleItem) item).getSource () : providerName;
if (source == null) {
source = Utilities.getProductVersion ();
}
}
return source;
}
@Override
public String getDate () {
return date;
}
public String getRawCategory() {
if (rawCategory == null) {
rawCategory = item.getCategory ();
if (rawCategory == null) {
rawCategory = (String) moduleInfo.getLocalizedAttribute ("OpenIDE-Module-Display-Category");
}
if (rawCategory == null) {
rawCategory = "";
}
}
return rawCategory;
}
@Override
public String getCategory () {
if (category == null) {
category = getRawCategory();
if (isAutoload () || isFixed ()) {
category = UpdateUnitFactory.LIBRARIES_CATEGORY;
} else if (category.isEmpty() && isEager ()) {
category = UpdateUnitFactory.BRIDGES_CATEGORY;
} else if (category.isEmpty()) {
category = UpdateUnitFactory.UNSORTED_CATEGORY;
}
}
return category;
}
@Override
public String getLicenseId() {
if (item instanceof InstalledModuleItem) {
// find the same item from UC
UpdateUnitImpl impl = Trampoline.API.impl(getUpdateUnit());
UpdateElement elWithSameVersion = impl.findUpdateSameAsInstalled();
if (elWithSameVersion != null) {
return elWithSameVersion.getLicenseId();
}
} else {
assert item.getUpdateLicenseImpl() != null : item + " has UpdateLicenseImpl.";
if (item.getUpdateLicenseImpl() != null) {
return item.getUpdateLicenseImpl().getName();
}
}
return null;
}
@Override
public String getLicence () {
return item.getAgreement ();
}
@Override
public InstallInfo getInstallInfo () {
return installInfo;
}
@Override
public List<ModuleInfo> getModuleInfos () {
return Collections.singletonList (getModuleInfo ());
}
public ModuleInfo getModuleInfo () {
assert moduleInfo != null : "Each ModuleUpdateElementImpl has ModuleInfo, but " + this;
// find really module info if present
ModuleInfo info = Utilities.toModule (this.moduleInfo);
if (info != null) {
this.moduleInfo = info;
} else {
this.moduleInfo = item.getModuleInfo ();
}
return this.moduleInfo;
}
@Override
public TYPE getType () {
return UpdateManager.TYPE.MODULE;
}
@Override
public boolean isEnabled () {
return getModuleInfo ().isEnabled ();
}
@Override
public boolean isAutoload () {
return isAutoload;
}
@Override
public boolean isEager () {
return isEager;
}
@Override
public boolean isPreferredUpdate() {
return isPreferredUpdate;
}
@Override
public boolean isFixed () {
return Utilities.toModule(getCodeName (), null) == null ? false : Utilities.toModule(getCodeName (), null).isFixed ();
}
public String getInstallationCluster() {
if (! (item instanceof InstalledModuleItem)) {
return null;
}
if (installationCluster == null) {
installationCluster = findInstallationCluster();
}
return installationCluster;
}
private String findInstallationCluster() {
Module m = Utilities.toModule(this.moduleInfo);
if (m == null) {
return null;
}
File jarFile = m.getJarFile();
String res = null;
if (jarFile != null) {
for (File cluster : UpdateTracking.clusters(true)) {
cluster = FileUtil.normalizeFile(cluster);
if (isParentOf(cluster, jarFile)) {
res = cluster.getName();
break;
}
}
} else if (UpdateTracking.getPlatformDir() != null) {
return UpdateTracking.getPlatformDir().getName();
}
return res;
}
private static boolean isParentOf(File parent, File child) {
File tmp = child.getParentFile();
while (tmp != null && !parent.equals(tmp)) {
tmp = tmp.getParentFile();
}
return tmp != null;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final ModuleUpdateElementImpl other = (ModuleUpdateElementImpl) obj;
if (this.specVersion != other.specVersion &&
(this.specVersion == null ||
!this.specVersion.equals(other.specVersion))) {
return false;
}
if (this.codeName != other.codeName &&
(this.codeName == null || !this.codeName.equals(other.codeName))) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 5;
hash = 61 * hash + (this.codeName != null ? this.codeName.hashCode()
: 0);
hash = 61 * hash +
(this.specVersion != null ? this.specVersion.hashCode()
: 0);
return hash;
}
@Override
public String toString () {
return "Impl[" + getUpdateElement () + "]"; // NOI18N
}
}