blob: cc6a08c80bfe2f5d1b3854f3faa08a34245faab8 [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.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.netbeans.api.autoupdate.UpdateElement;
import org.netbeans.api.autoupdate.UpdateManager;
import org.netbeans.api.autoupdate.UpdateUnit;
import org.openide.modules.SpecificationVersion;
public abstract class UpdateUnitImpl extends Object {
private String codeName;
private UpdateElement installed;
private List<UpdateElement> updates;
private UpdateElement installedLocalization;
private List<UpdateElement> localizationUpdates;
private UpdateElement backup;
private UpdateUnit updateUnit;
private static final Logger err = Logger.getLogger (UpdateUnitImpl.class.getName ());
public UpdateUnitImpl (String codename) {
this.codeName = codename;
}
public void setUpdateUnit (UpdateUnit unit) {
assert unit != null : "UpdateUnit cannot for " + this + " cannot be null.";
updateUnit = unit;
}
public UpdateUnit getUpdateUnit () {
return updateUnit;
}
public String getCodeName () {
return codeName;
}
public UpdateElement getInstalled () {
return installed;
}
public List<UpdateElement> getAvailableUpdates () {
return identifyUpdates (getInstalled (), updates);
}
public UpdateElement getInstalledLocalization () {
return installedLocalization;
}
public List<UpdateElement> getAvailableLocalizations () {
return identifyLocalizationUpdates (installedLocalization, localizationUpdates);
}
public UpdateElement getBackup () {
return backup;
}
public void addUpdate (UpdateElement update) {
if (updates == null) {
updates = new ArrayList<UpdateElement> ();
}
//assert ! updates.contains (update);
//TODO: make better
int idx = updates.indexOf(update);
if (idx != -1) {
updates.remove(update);
}
updates.add (update);
}
public void setInstalled (UpdateElement installed) {
assert this.installed == null;
assert installed != null;
this.installed = installed;
}
public void setAsUninstalled () {
assert this.installed != null;
this.installed = null;
}
public void updateInstalled (UpdateElement installed) {
//assert this.installed != null;
this.installed = null;
setInstalled (installed);
}
public void addLocalizationUpdate (UpdateElement update) {
if (localizationUpdates == null) {
localizationUpdates = new ArrayList<UpdateElement> ();
}
assert ! localizationUpdates.contains (update);
localizationUpdates.add (update);
}
public void setInstalledLocalization (UpdateElement installed) {
assert this.installedLocalization == null;
this.installedLocalization = installed;
}
public void setBackup (UpdateElement backup) {
assert this.backup == null;
this.backup = backup;
}
public boolean isPending () {
return false;
}
public abstract UpdateManager.TYPE getType ();
protected List<UpdateElement> getUpdates () {
return updates;
}
public UpdateElement findUpdateSameAsInstalled() {
// check if potentinally updates exist
if (updates != null && !updates.isEmpty()) {
// check if a module is already installed
if (installed == null) {
return null;
} else {
// compare installed with optionallly update
for (UpdateElement update : updates) {
String uspec = update.getSpecificationVersion();
String ispec = installed.getSpecificationVersion();
if (uspec == null && ispec == null) {
err.log(Level.FINE, "Installed UpdateElement w/o version " + installed.getCodeName() + "[" + ispec + "] has update w/o version " + update.getCodeName() + "[" + uspec + "] too");
return update;
} else if (uspec != null && ispec != null
&& new SpecificationVersion(uspec).compareTo(new SpecificationVersion(ispec)) == 0) {
err.log(Level.FINE, "Installed UpdateElement " + installed.getCodeName() + "[" + ispec + "] has update with the same version " + update.getCodeName() + "[" + uspec + "]");
return update;
}
}
return null;
}
} else {
return null;
}
}
public abstract UpdateUnit getVisibleAncestor();
private List<UpdateElement> identifyUpdates (UpdateElement installed, List<UpdateElement> updates) {
List<UpdateElement> res = null;
// check if potentinally updates exist
if (updates != null && ! updates.isEmpty ()) {
// check if a module is already installed
if (installed == null) {
if (updates != null) {
res = updates;
}
} else {
// compare installed with optionallly update
String moduleId = installed.getCodeName ();
List<UpdateElement> realUpdates = new ArrayList<UpdateElement> ();
for (UpdateElement update : updates) {
String uspec = update.getSpecificationVersion ();
String ispec = installed.getSpecificationVersion ();
if (uspec != null && ispec == null) {
err.log (Level.FINE, "UpdateElement " + moduleId + "[" + ispec + "] has update " + moduleId + "[" + uspec + "]");
realUpdates.add (update);
} else if (uspec == null || ispec == null) {
// no update
} else if (new SpecificationVersion (uspec).compareTo (new SpecificationVersion (ispec)) > 0) {
err.log (Level.FINE, "UpdateElement " + moduleId + "[" + ispec + "] has update " + moduleId + "[" + uspec + "]");
realUpdates.add (update);
}
}
if (! realUpdates.isEmpty ()) {
res = realUpdates;
}
}
}
if (res == null) {
res = Collections.emptyList();
} else if (res.size() > 1) {
Collections.sort(res,new Comparator<UpdateElement>(){
@Override
public int compare(UpdateElement o1, UpdateElement o2) {
String sv1 = o1.getSpecificationVersion ();
String sv2 = o2.getSpecificationVersion ();
if (sv1 == null) {
if (sv2 == null) {
return 0;
} else {
return -1;
}
} else if (sv2 == null) {
return 1;
}
return new SpecificationVersion (sv2).compareTo (new SpecificationVersion (sv1));
}
});
}
return res;
}
private List<UpdateElement> identifyLocalizationUpdates (UpdateElement installed, List<UpdateElement> updates) {
// XXX: handle identifyLocalizationUpdates
List<UpdateElement> res = null;
// check if potentinally updates exist
if (updates != null && ! updates.isEmpty ()) {
// check if a module is already installed
if (installed == null) {
return updates;
} else {
// compare installed with optionallly update
String moduleId = installed.getCodeName ();
List<UpdateElement> realUpdates = new ArrayList<UpdateElement> ();
for (UpdateElement update : updates) {
if (update.getSpecificationVersion ().compareTo (installed.getSpecificationVersion ()) > 0) {
err.log (Level.FINE, "Module " + moduleId + "[" + installed.getSpecificationVersion () + "] has update " + moduleId + "[" + update.getSpecificationVersion () + "]");
realUpdates.add (update);
}
}
if (! realUpdates.isEmpty ()) {
res = realUpdates;
}
}
}
return res;
}
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final UpdateUnitImpl other = (UpdateUnitImpl) obj;
if (this.codeName != other.codeName &&
(this.codeName == null || !this.codeName.equals(other.codeName)))
return false;
if (this.installed != other.installed &&
(this.installed == null || !this.installed.equals(other.installed)))
return false;
if (this.updates != other.updates &&
(this.updates == null || !this.updates.equals(other.updates)))
return false;
if (this.installedLocalization != other.installedLocalization &&
(this.installedLocalization == null ||
!this.installedLocalization.equals(other.installedLocalization)))
return false;
if (this.localizationUpdates != other.localizationUpdates &&
(this.localizationUpdates == null ||
!this.localizationUpdates.equals(other.localizationUpdates)))
return false;
if (this.backup != other.backup &&
(this.backup == null || !this.backup.equals(other.backup)))
return false;
return true;
}
@Override
public int hashCode() {
int hash = 7;
hash = 53 * hash + (this.codeName != null ? this.codeName.hashCode()
: 0);
hash = 53 * hash +
(this.installed != null ? this.installed.hashCode()
: 0);
hash = 53 * hash + (this.updates != null ? this.updates.hashCode()
: 0);
hash = 53 * hash +
(this.installedLocalization != null ? this.installedLocalization.hashCode()
: 0);
hash = 53 * hash +
(this.localizationUpdates != null ? this.localizationUpdates.hashCode()
: 0);
hash = 53 * hash + (this.backup != null ? this.backup.hashCode()
: 0);
return hash;
}
}