Repository: juddi Updated Branches: refs/heads/master 8c5350d8f -> 2a243727f
JUDDI-734 new admin function added to rename a node. updates the database and config files Project: http://git-wip-us.apache.org/repos/asf/juddi/repo Commit: http://git-wip-us.apache.org/repos/asf/juddi/commit/2a243727 Tree: http://git-wip-us.apache.org/repos/asf/juddi/tree/2a243727 Diff: http://git-wip-us.apache.org/repos/asf/juddi/diff/2a243727 Branch: refs/heads/master Commit: 2a243727f055bfdf97dc37e1e3dffc8a09a40199 Parents: 8c5350d Author: Alex <[email protected]> Authored: Tue Jan 20 21:39:49 2015 -0500 Committer: Alex <[email protected]> Committed: Tue Jan 20 21:39:49 2015 -0500 ---------------------------------------------------------------------- .../java/org/apache/juddi/config/AppConfig.java | 36 +++- .../juddi/adminconsole/hub/UddiAdminHub.java | 187 ++++++++++++++----- juddiv3-war/src/main/webapp/admin/admin.jsp | 14 +- 3 files changed, 182 insertions(+), 55 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/juddi/blob/2a243727/juddi-core/src/main/java/org/apache/juddi/config/AppConfig.java ---------------------------------------------------------------------- diff --git a/juddi-core/src/main/java/org/apache/juddi/config/AppConfig.java b/juddi-core/src/main/java/org/apache/juddi/config/AppConfig.java index 9a9f5e0..131f067 100644 --- a/juddi-core/src/main/java/org/apache/juddi/config/AppConfig.java +++ b/juddi-core/src/main/java/org/apache/juddi/config/AppConfig.java @@ -19,7 +19,6 @@ package org.apache.juddi.config; import java.io.File; import java.net.MalformedURLException; import java.net.URL; -import java.util.Iterator; import java.util.List; import java.util.Properties; @@ -39,10 +38,6 @@ import org.apache.juddi.ClassUtil; import org.apache.juddi.Registry; import org.apache.juddi.keygen.KeyGenerator; import org.apache.juddi.model.UddiEntityPublisher; -import org.apache.juddi.query.FindBusinessByCategoryQuery; -import org.apache.juddi.query.util.FindQualifiers; -import org.uddi.api_v3.CategoryBag; -import org.uddi.api_v3.KeyedReference; /** * Handles the application level configuration for jUDDI. By default it first @@ -64,6 +59,7 @@ public class AppConfig private Configuration config; private static AppConfig instance=null; private static URL loadedFrom=null; + private static XMLConfiguration propConfig=null; /** * Enables an administrator to identify the physical location of the configuration file from which it was loaded.<br> @@ -84,6 +80,20 @@ public class AppConfig { loadConfiguration(); } + public static void setJuddiProperty(String key, Object val) throws ConfigurationException{ + if (instance==null) { + instance = new AppConfig(); + } + propConfig.setProperty(key, val); + propConfig.save(); + } + + public static void saveConfiguration() throws ConfigurationException{ + Configuration configuration = getConfiguration(); + propConfig.save(); + } + + /** * Does the actual work of reading the configuration from System * Properties and/or juddiv3.xml file. When the juddiv3.xml @@ -97,7 +107,7 @@ public class AppConfig compositeConfig.addConfiguration(new SystemConfiguration()); //Properties from file //changed 7-19-2013 AO for JUDDI-627 - XMLConfiguration propConfig = null; + propConfig = null; final String filename = System.getProperty(JUDDI_CONFIGURATION_FILE_SYSTEM_PROPERTY); if (filename != null) { propConfig = new XMLConfiguration (filename); @@ -118,7 +128,7 @@ public class AppConfig } //Hey! this may break things propConfig.setAutoSave(true); - + log.info("Reading from jUDDI config file from: " + loadedFrom); long refreshDelay = propConfig.getLong(Property.JUDDI_CONFIGURATION_RELOAD_DELAY, 1000l); log.debug("Setting refreshDelay to " + refreshDelay); @@ -194,6 +204,10 @@ public class AppConfig // The node Id is defined as the business key of the business entity categorized as a node. This entity is saved as part of the install. // Only one business entity should be categorized as a node. String nodeId = config.getString(Property.JUDDI_NODE_ID); + if (nodeId==null) + log.fatal("Error! " + Property.JUDDI_NODE_ID + " is not defined in the config!"); + else + result.setProperty(Property.JUDDI_NODE_ID, nodeId); /* CategoryBag categoryBag = new CategoryBag(); KeyedReference keyedRef = new KeyedReference(); @@ -218,9 +232,13 @@ public class AppConfig else throw new ConfigurationException("A node business entity was not found. Please make sure that the application is properly installed."); */ - result.setProperty(Property.JUDDI_NODE_ROOT_BUSINESS, nodeId); + String rootbiz=config.getString(Property.JUDDI_NODE_ROOT_BUSINESS); + if (rootbiz==null) + log.fatal("Error! " + Property.JUDDI_NODE_ROOT_BUSINESS + " is not defined in the config"); + else + result.setProperty(Property.JUDDI_NODE_ROOT_BUSINESS, rootbiz); + - //result.setProperty(Property.JUDDI_NODE_ROOT_BUSINESS, nodeId); tx.commit(); return result; http://git-wip-us.apache.org/repos/asf/juddi/blob/2a243727/juddiv3-war/src/main/java/org/apache/juddi/adminconsole/hub/UddiAdminHub.java ---------------------------------------------------------------------- diff --git a/juddiv3-war/src/main/java/org/apache/juddi/adminconsole/hub/UddiAdminHub.java b/juddiv3-war/src/main/java/org/apache/juddi/adminconsole/hub/UddiAdminHub.java index 5cbd061..233c6ac 100644 --- a/juddiv3-war/src/main/java/org/apache/juddi/adminconsole/hub/UddiAdminHub.java +++ b/juddiv3-war/src/main/java/org/apache/juddi/adminconsole/hub/UddiAdminHub.java @@ -25,6 +25,11 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import javax.persistence.Query; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @@ -37,6 +42,7 @@ import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import javax.xml.ws.BindingProvider; import javax.xml.ws.Holder; +import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.logging.Log; @@ -64,6 +70,10 @@ import org.apache.juddi.v3.client.transport.Transport; import org.apache.juddi.v3_service.JUDDIApiPortType; import org.apache.juddi.adminconsole.AES; import org.apache.juddi.adminconsole.resources.ResourceLoader; +import org.apache.juddi.api.impl.JUDDIApiImpl; +import org.apache.juddi.api.impl.UDDIInquiryImpl; +import org.apache.juddi.api.impl.UDDIPublicationImpl; +import org.apache.juddi.api.impl.UDDIReplicationImpl; import org.apache.juddi.api_v3.AdminSaveBusiness; import org.apache.juddi.api_v3.AdminSaveSubscriptionRequest; import org.apache.juddi.api_v3.AdminSaveSubscriptionResponse; @@ -76,16 +86,25 @@ import org.apache.juddi.api_v3.GetEntityHistoryMessageRequest; import org.apache.juddi.api_v3.GetEntityHistoryMessageResponse; import org.apache.juddi.api_v3.NodeList; import org.apache.juddi.api_v3.SubscriptionWrapper; +import org.apache.juddi.config.AppConfig; +import org.apache.juddi.config.PersistenceManager; +import org.apache.juddi.config.Property; import org.apache.juddi.model.BindingTemplate; import org.apache.juddi.subscription.notify.SMTPNotifier; import org.uddi.api_v3.AuthToken; +import org.uddi.api_v3.BusinessDetail; +import org.uddi.api_v3.BusinessEntity; +import org.uddi.api_v3.BusinessService; +import org.uddi.api_v3.DeleteBusiness; import org.uddi.api_v3.DeleteTModel; import org.uddi.api_v3.DiscardAuthToken; import org.uddi.api_v3.DispositionReport; import org.uddi.api_v3.FindBusiness; import org.uddi.api_v3.FindQualifiers; import org.uddi.api_v3.GetAuthToken; +import org.uddi.api_v3.GetBusinessDetail; import org.uddi.api_v3.Name; +import org.uddi.api_v3.SaveBusiness; import org.uddi.repl_v3.ReplicationConfiguration; import org.uddi.sub_v3.Subscription; import org.uddi.sub_v3.SubscriptionResultsList; @@ -333,74 +352,54 @@ public class UddiAdminHub { String action = parameters.getParameter("soapaction"); if (action.equalsIgnoreCase("adminDelete_tmodel")) { return adminDelete_tmodel(parameters); - } - if (action.equalsIgnoreCase("delete_ClientSubscriptionInfo")) { + } else if (action.equalsIgnoreCase("delete_ClientSubscriptionInfo")) { return delete_ClientSubscriptionInfo(parameters); - } - if (action.equalsIgnoreCase("delete_publisher")) { + } else if (action.equalsIgnoreCase("delete_publisher")) { return delete_publisher(parameters); - } - if (action.equalsIgnoreCase("getAllPublisherDetail")) { + } else if (action.equalsIgnoreCase("getAllPublisherDetail")) { return getAllPublisherDetail(parameters); - } - if (action.equalsIgnoreCase("get_publisherDetail")) { + } else if (action.equalsIgnoreCase("get_publisherDetail")) { return get_publisherDetail(parameters); - } - if (action.equalsIgnoreCase("invoke_SyncSubscription")) { + } else if (action.equalsIgnoreCase("invoke_SyncSubscription")) { return invoke_SyncSubscription(parameters); - } - if (action.equalsIgnoreCase("save_Clerk")) { + } else if (action.equalsIgnoreCase("save_Clerk")) { return save_Clerk(parameters); - } - if (action.equalsIgnoreCase("save_ClientSubscriptionInfo")) { + } else if (action.equalsIgnoreCase("save_ClientSubscriptionInfo")) { return save_ClientSubscriptionInfo(parameters); - } - if (action.equalsIgnoreCase("save_Node")) { + } else if (action.equalsIgnoreCase("save_Node")) { return save_Node(parameters); - } - if (action.equalsIgnoreCase("save_publisher")) { + } else if (action.equalsIgnoreCase("save_publisher")) { return save_publisher(parameters); - } - - if (action.equalsIgnoreCase("send_EmailTest")) { + } else if (action.equalsIgnoreCase("send_EmailTest")) { return sendTestEmail(parameters); - } - if (action.equalsIgnoreCase("get_AllNodes")) { + } else if (action.equalsIgnoreCase("get_AllNodes")) { return getAllNodes(parameters); - } - if (action.equalsIgnoreCase("get_AllClerks")) { + } else if (action.equalsIgnoreCase("get_AllClerks")) { return getAllClerks(parameters); - } - if (action.equalsIgnoreCase("delete_Node")) { + } else if (action.equalsIgnoreCase("delete_Node")) { return deleteNode(parameters); - } - if (action.equalsIgnoreCase("delete_Clerk")) { + } else if (action.equalsIgnoreCase("delete_Clerk")) { return deleteClerk(parameters); - } - if (action.equalsIgnoreCase("admin_DeleteSubscription")) { + } else if (action.equalsIgnoreCase("admin_DeleteSubscription")) { return deleteSubscription(parameters); - } - if (action.equalsIgnoreCase("admin_SaveBusiness")) { + } else if (action.equalsIgnoreCase("admin_SaveBusiness")) { return adminSaveBusiness(parameters); - } - if (action.equalsIgnoreCase("admin_SaveTModel")) { + } else if (action.equalsIgnoreCase("admin_SaveTModel")) { return adminSaveTmodel(parameters); - } - if (action.equalsIgnoreCase("get_AllClientSubscriptionInfo")) { + } else if (action.equalsIgnoreCase("get_AllClientSubscriptionInfo")) { return getAllClientSubscriptionInfo(parameters); - } - if (action.equalsIgnoreCase("set_ReplicationNodes")) { + } else if (action.equalsIgnoreCase("set_ReplicationNodes")) { return setReplicationConfig(parameters); - } - if (action.equalsIgnoreCase("get_ReplicationNodes")) { + } else if (action.equalsIgnoreCase("get_ReplicationNodes")) { return getReplicationNodes(parameters); - } - if (action.equalsIgnoreCase("admin_SaveSubscription")) { + } else if (action.equalsIgnoreCase("admin_SaveSubscription")) { return adminSaveSubscription(parameters); - } - if (action.equalsIgnoreCase("get_EntityHistory")) { + } else if (action.equalsIgnoreCase("get_EntityHistory")) { return getEntityHistory(parameters); + } else if (action.equalsIgnoreCase("change_NodeID")) { + return change_NodeID(parameters); } + } catch (Exception ex) { return "Error!" + HandleException(ex); } @@ -812,6 +811,104 @@ public class UddiAdminHub { return StringEscapeUtils.escapeHtml(sw.toString()); } + private String change_NodeID(HttpServletRequest parameters) { + //check replication config + + EntityManager em = PersistenceManager.getEntityManager(); + EntityTransaction tx = em.getTransaction(); + + try { + + ReplicationConfiguration replicationNodes = new JUDDIApiImpl().getReplicationNodes(GetToken()); + if (replicationNodes.getOperator().size() > 1) { + throw new Exception("Replication is configured with " + replicationNodes.getOperator() + " nodes. Node rename aborted"); + } + Configuration configuration = AppConfig.getConfiguration(); + //this is going to break a few design rules. + String currentnode = configuration.getString(Property.JUDDI_NODE_ID); + String newnode = parameters.getParameter("change_NodeIDKey"); + if (newnode==null) + throw new Exception("The new node id was not specified"); + newnode = newnode.trim(); + newnode=newnode.toLowerCase(); + log.warn("AUDIT - Renaming Node ID from " + currentnode + " to " + newnode); + + UDDIPublicationImpl pub = new UDDIPublicationImpl(); + UDDIInquiryImpl inquire = new UDDIInquiryImpl(); + + GetBusinessDetail gbd = new GetBusinessDetail(); + gbd.setAuthInfo(GetToken()); + gbd.getBusinessKey().add(newnode); + BusinessDetail businessDetail = null; + try { + businessDetail = inquire.getBusinessDetail(gbd); + } catch (Exception ex) { + //business doesn't exist + } + if (businessDetail == null || businessDetail.getBusinessEntity().isEmpty()) { + //copy the existing Root Node and rekey it with the new key + //incase the destination key generator is valid, we'll abort. + gbd.getBusinessKey().clear(); + gbd.getBusinessKey().add(AppConfig.getConfiguration().getString(Property.JUDDI_NODE_ROOT_BUSINESS)); + businessDetail = inquire.getBusinessDetail(gbd); + BusinessEntity get = businessDetail.getBusinessEntity().get(0); + get.setBusinessKey(newnode); + get.getSignature().clear(); + if (get.getBusinessServices() != null) { + for (BusinessService bs : get.getBusinessServices().getBusinessService()) { + bs.setBusinessKey(newnode); + bs.getSignature().clear(); + //we also need to rekey all of the services and bindings wait do we? + //bs.setServiceKey(bs.getServiceKey()); + } + } + SaveBusiness sb = new SaveBusiness(); + sb.setAuthInfo(GetToken()); + sb.getBusinessEntity().add(get); + //if there's something wrong with the new key, this will throw + BusinessDetail saveBusiness = pub.saveBusiness(sb); + newnode = saveBusiness.getBusinessEntity().get(0).getBusinessKey(); + } + + tx.begin(); + //rekey all entities with the new node id + Query createQuery = em.createQuery("Update UddiEntity ue set ue.nodeId=:node where ue.nodeId=:oldnode"); + createQuery.setParameter("node", newnode); + createQuery.setParameter("oldnode", currentnode); + int records = createQuery.executeUpdate(); + //rekey all the existing change records with the new node id + createQuery = em.createQuery("Update ChangeRecord ue set ue.nodeID=:node where ue.nodeID=:oldnode"); + createQuery.setParameter("node", newnode); + createQuery.setParameter("oldnode", currentnode); + records += createQuery.executeUpdate(); + + //rekey is_replaced_by references? nah + tx.commit(); + try{ + DeleteBusiness db = new DeleteBusiness(); + db.setAuthInfo(GetToken()); + db.getBusinessKey().add(currentnode); + pub.deleteBusiness(db); + } + catch (Exception ex){ + log.warn("Node id change error: ", ex); + } + + //finally update the xml config and resave it + AppConfig.setJuddiProperty(Property.JUDDI_NODE_ID, newnode); + AppConfig.setJuddiProperty(Property.JUDDI_NODE_ROOT_BUSINESS, newnode); + + return "Sucess, Records update: " + records + " current node id is now " + AppConfig.getConfiguration().getString(Property.JUDDI_NODE_ID); + } catch (Exception ex) { + return HandleException(ex); + } finally { + if (tx.isActive()) { + tx.rollback(); + } + em.close(); + } + } + public enum AuthStyle { /** http://git-wip-us.apache.org/repos/asf/juddi/blob/2a243727/juddiv3-war/src/main/webapp/admin/admin.jsp ---------------------------------------------------------------------- diff --git a/juddiv3-war/src/main/webapp/admin/admin.jsp b/juddiv3-war/src/main/webapp/admin/admin.jsp index cddda77..d810025 100644 --- a/juddiv3-war/src/main/webapp/admin/admin.jsp +++ b/juddiv3-war/src/main/webapp/admin/admin.jsp @@ -21,6 +21,8 @@ --%> +<%@page import="org.apache.juddi.config.Property"%> +<%@page import="org.apache.juddi.config.AppConfig"%> <%@page import="org.apache.juddi.api_v3.Publisher"%> <%@page import="org.apache.juddi.api_v3.SavePublisher"%> <%@page import="org.apache.juddi.api_v3.Clerk"%> @@ -84,6 +86,7 @@ <option>set_ReplicationNodes</option> <option>get_ReplicationNodes</option> <option>get_EntityHistory</option> + <option>change_NodeID</option> <option>------ Backup/Restore Management -----</option> <option>admin_SaveBusiness</option> @@ -223,12 +226,20 @@ <textarea rows="4" cols="80" id="admin_SaveSubscriptionXML" class="forminput" placeholder="Enter save subscription XML"></textarea> </div> - <div id="get_EntityHistory" style="display:none"> + <div id="get_EntityHistory" style="display:none"> Entity Key <input type="text" id="get_EntityHistoryKey" class="forminput" placeholder="Entity Key"><br> Records to fetch <input type="text" id="get_EntityHistoryMaxCount" class="forminput" value="25"><br> Offset <input type="text" id="get_EntityHistoryOffset" class="forminput" value="0"><br> </div> + <div id="change_NodeID" style="display:none"> + This will change the current node's identifier. During the transaction, no one will be able to modify items stored in the database. + This option is not available if this node is configured for replication. It must be removed from the replication configuration on all nodes before renaming. + <br><br> + Note: Depending on how jUDDI was deployed, you may have to manually edit the juddiv3.xml config file, then restart jUDDI after this process is complete.<br><br> + New Node ID <input type="text" id="change_NodeIDKey" class="forminput" placeholder="Node ID" value="<%=StringEscapeUtils.escapeHtml( AppConfig.getConfiguration().getString(Property.JUDDI_NODE_ID))%>"><br> + </div> + @@ -263,6 +274,7 @@ $("#get_ReplicationNodes").hide(); $("#admin_SaveSubscription").hide(); $("#get_EntityHistory").hide(); + $("#change_NodeID").hide(); $("#" + x).show(); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
