📄 worker.java
字号:
//==============================================================================//=== Copyright (C) 2001-2007 Food and Agriculture Organization of the//=== United Nations (FAO-UN), United Nations World Food Programme (WFP)//=== and United Nations Environment Programme (UNEP)//===//=== This program is free software; you can redistribute it and/or modify//=== it under the terms of the GNU General Public License as published by//=== the Free Software Foundation; either version 2 of the License, or (at//=== your option) any later version.//===//=== This program is distributed in the hope that it will be useful, but//=== WITHOUT ANY WARRANTY; without even the implied warranty of//=== MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU//=== General Public License for more details.//===//=== You should have received a copy of the GNU General Public License//=== along with this program; if not, write to the Free Software//=== Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA//===//=== Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2,//=== Rome - Italy. email: geonetwork@osgeo.org//==============================================================================package org.fao.gast.gui.panels.migration.oldinst;import java.sql.SQLException;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Set;import jeeves.resources.dbms.Dbms;import jeeves.utils.Util;import jeeves.utils.Xml;import org.dlib.gui.ProgressDialog;import org.fao.gast.app.App;import org.fao.gast.lib.DatabaseLib;import org.fao.gast.lib.Lib;import org.fao.gast.lib.Resource;import org.fao.gast.lib.druid.Codec;import org.fao.gast.lib.druid.DdfLoader;import org.fao.gast.lib.druid.ImportField;import org.fao.geonet.kernel.XmlSerializer;import org.jdom.Element;//==============================================================================public class Worker implements Runnable{ //--------------------------------------------------------------------------- //--- //--- Constructor //--- //--------------------------------------------------------------------------- public Worker(ProgressDialog d) { dlg = d; } //--------------------------------------------------------------------------- //--- //--- API methods //--- //--------------------------------------------------------------------------- public void setOldDir(String dir) { appPath = dir; } //--------------------------------------------------------------------------- //--- //--- Migration process //--- //--------------------------------------------------------------------------- public void run() { if (!openSource()) return; Resource oldRes = null; Resource newRes = null; try { oldRes = source.config.createResource(); newRes = Lib.config.createResource(); executeJob((Dbms) oldRes.open(), (Dbms) newRes.open()); } catch(Throwable t) { Lib.gui.showError(dlg, t); } finally { if (oldRes != null) oldRes.close(); if (newRes != null) newRes.close(); dlg.stop(); } } //--------------------------------------------------------------------------- private boolean openSource() { try { source = new GNSource(appPath); return true; } catch (Exception e) { Lib.gui.showError(dlg, "It seems that the specified folder does not \n"+ "contain an old GeoNetwork installation"); return false; } } //--------------------------------------------------------------------------- private void executeJob(Dbms oldDbms, Dbms newDbms) throws Exception { dlg.reset(9); dlg.advance("Removing data in new installation"); removeAll(newDbms); Set<String> langs = getLanguages(newDbms); dlg.advance("Migrating users"); migrateUsers(oldDbms, newDbms); dlg.advance("Migrating groups"); migrateGroups(oldDbms, newDbms, langs); dlg.advance("Migrating categories"); migrateCategories(oldDbms, newDbms, langs); dlg.advance("Migrating metadata"); migrateMetadata(oldDbms, newDbms); dlg.advance("Migrating privileges"); migrateOperationAllowed(oldDbms, newDbms); dlg.advance("Migrating metadata categories"); migrateMetadataCateg(oldDbms, newDbms); dlg.advance("Migrating settings"); migrateSettings(newDbms); dlg.advance("Restoring localized labels"); restoreLocalizedRecords(newDbms); Lib.metadata.clearIndexes(); } //--------------------------------------------------------------------------- private void removeAll(Dbms newDbms) throws SQLException { //--- we commit at each step because an old migration could have failed and //--- we could have plenty of records newDbms.execute("DELETE FROM OperationAllowed"); newDbms.commit(); newDbms.execute("DELETE FROM UserGroups"); newDbms.commit(); newDbms.execute("DELETE FROM MetadataCateg"); newDbms.commit(); newDbms.execute("DELETE FROM Users"); newDbms.commit(); newDbms.execute("DELETE FROM Metadata"); newDbms.commit(); newDbms.execute("DELETE FROM GroupsDes"); newDbms.execute("DELETE FROM Groups"); newDbms.commit(); newDbms.execute("DELETE FROM CategoriesDes"); newDbms.execute("DELETE FROM Categories"); newDbms.commit(); } //--------------------------------------------------------------------------- private Set<String> getLanguages(Dbms newDbms) throws SQLException { List langs = newDbms.select("SELECT * FROM Languages").getChildren(); Set<String> set = new HashSet<String>(); for (Object l : langs) { Element lang = (Element) l; set.add(lang.getChildText("id")); } newDbms.commit(); return set; } //--------------------------------------------------------------------------- private void migrateUsers(Dbms oldDbms, Dbms newDbms) throws SQLException { String query = "SELECT * FROM Users"; List oldUsers = oldDbms.select(query).getChildren(); //--- copy users for (Object user : oldUsers) Lib.database.insert(newDbms, "Users", (Element) user, userMapper); oldDbms.commit(); newDbms.commit(); } //--------------------------------------------------------------------------- /** Migrates Groups, UserGroups */ private void migrateGroups(Dbms oldDbms, Dbms newDbms, Set<String> langs) throws SQLException { String query1 = "SELECT * FROM Groups"; String query2 = "SELECT * FROM UserGroups"; List oldGroups = oldDbms.select(query1).getChildren(); //--- copy groups for (Object g : oldGroups) { Element group = (Element) g; String id = group.getChildText("id"); String label = group.getChildText("name"); Lib.database.insert(newDbms, "Groups", group, groupsMapper); Lib.database.insert(newDbms, "GroupsDes", langs, id, label); } //--- copy user groups List oldUsrGrp = oldDbms.select(query2).getChildren(); for (Object usrGrp : oldUsrGrp) Lib.database.insert(newDbms, "UserGroups", (Element) usrGrp, relationMapper); oldDbms.commit(); newDbms.commit(); } //--------------------------------------------------------------------------- /** Migrates Categories */ private void migrateCategories(Dbms oldDbms, Dbms newDbms, Set<String> langs) throws SQLException { String query = "SELECT * FROM Categories"; List categs = oldDbms.select(query).getChildren(); //--- copy categories for (Object c : categs) { Element categ = (Element) c; String id = categ.getChildText("id"); String label = categ.getChildText("name"); Lib.database.insert(newDbms, "Categories", categ, idMapper); Lib.database.insert(newDbms, "CategoriesDes", langs, id, label); } oldDbms.commit(); newDbms.commit(); } //--------------------------------------------------------------------------- private void migrateMetadata(Dbms oldDbms, Dbms newDbms) throws Exception { String query = "SELECT id, uuid, schemaId, isTemplate, createDate, "+ " lastChangeDate as changeDate, source "+ "FROM Metadata"; List metadata = oldDbms.select(query).getChildren(); String oldSiteId = source.getSiteId(); String newSiteId = Lib.site.getSiteId(newDbms); oldDbms.commit(); newDbms.commit(); mdIds.clear(); //--- copy metadata for (Object m : metadata) { Element md = (Element) m; String id = md.getChildText("id"); String source = md.getChildText("source"); //--- has the old metadata been harvested ? if (!oldSiteId.equals(source)) continue; //--- calculate owner and group owner query = "SELECT groupId FROM OperationAllowed WHERE metadataId=? AND operationId=4"; List privil = oldDbms.select(query, new Integer(id)).getChildren(); oldDbms.commit(); if (privil.size() == 0) throw new Exception("Metadata has no admin privilege --> id:"+id); String groupOwner = ((Element) privil.get(0)).getChildText("groupid"); query = "SELECT DISTINCT id FROM Users, UserGroups WHERE id=userId AND profile='Editor' AND groupId=?"; List usrGrps = oldDbms.select(query, new Integer(groupOwner)).getChildren(); oldDbms.commit();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -