Update project structure to org.onap.aaf
[aaf/authz.git] / authz-core / src / main / java / org / onap / aaf / authz / org / OrganizationFactory.java
diff --git a/authz-core/src/main/java/org/onap/aaf/authz/org/OrganizationFactory.java b/authz-core/src/main/java/org/onap/aaf/authz/org/OrganizationFactory.java
new file mode 100644 (file)
index 0000000..653e927
--- /dev/null
@@ -0,0 +1,148 @@
+/*******************************************************************************\r
+ * ============LICENSE_START====================================================\r
+ * * org.onap.aaf\r
+ * * ===========================================================================\r
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
+ * * ===========================================================================\r
+ * * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * * you may not use this file except in compliance with the License.\r
+ * * You may obtain a copy of the License at\r
+ * * \r
+ *  *      http://www.apache.org/licenses/LICENSE-2.0\r
+ * * \r
+ *  * Unless required by applicable law or agreed to in writing, software\r
+ * * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * * See the License for the specific language governing permissions and\r
+ * * limitations under the License.\r
+ * * ============LICENSE_END====================================================\r
+ * *\r
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
+ * *\r
+ ******************************************************************************/\r
+package org.onap.aaf.authz.org;\r
+\r
+import java.lang.reflect.Constructor;\r
+import java.lang.reflect.InvocationTargetException;\r
+import java.util.Map;\r
+import java.util.concurrent.ConcurrentHashMap;\r
+\r
+import org.onap.aaf.authz.env.AuthzEnv;\r
+import org.onap.aaf.authz.env.AuthzTrans;\r
+\r
+import org.onap.aaf.inno.env.APIException;\r
+import org.onap.aaf.inno.env.Slot;\r
+\r
+/**\r
+ * Organization Plugin Mechanism\r
+ * \r
+ * Define a NameSpace for the company (i.e. com.att), and put in Properties as \r
+ * "Organization.[your NS" and assign the supporting Class.  \r
+ * \r
+ * Example:\r
+ * Organization.com.att=org.onap.aaf.authz.org.att.ATT\r
+ *\r
+ *\r
+ */\r
+public class OrganizationFactory {\r
+       public static final String ORG_SLOT = "ORG_SLOT";\r
+       private static Organization defaultOrg = null;\r
+       private static Map<String,Organization> orgs = new ConcurrentHashMap<String,Organization>();\r
+       private static Slot orgSlot;\r
+       \r
+       public static void setDefaultOrg(AuthzEnv env, String orgClass) throws APIException {\r
+               orgSlot = env.slot(ORG_SLOT);\r
+               try {\r
+                       @SuppressWarnings("unchecked")\r
+                       Class<Organization> cls = (Class<Organization>) Class.forName(orgClass);\r
+                       Constructor<Organization> cnst = cls.getConstructor(AuthzEnv.class);\r
+                       defaultOrg = cnst.newInstance(env);\r
+               } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | \r
+                               InstantiationException | IllegalAccessException | IllegalArgumentException | \r
+                               InvocationTargetException e) {\r
+                       throw new APIException(e);\r
+               }\r
+       }\r
+       \r
+       public static Organization obtain(AuthzEnv env,String orgNS) throws OrganizationException {\r
+               int at = orgNS.indexOf('@');\r
+               if(at<0) {\r
+                       if(!orgNS.startsWith("com.")) {\r
+                               int dot1;\r
+                               if((dot1 = orgNS.lastIndexOf('.'))>-1) {\r
+                                       int dot2;\r
+                                       StringBuilder sb = new StringBuilder();\r
+                                       if((dot2 = orgNS.lastIndexOf('.',dot1-1))>-1) {\r
+                                               sb.append(orgNS,dot1+1,orgNS.length());\r
+                                               sb.append('.');\r
+                                               sb.append(orgNS,dot2+1,dot1);\r
+                                       } else {\r
+                                               sb.append(orgNS,dot1+1,orgNS.length());\r
+                                               sb.append('.');\r
+                                               sb.append(orgNS,at+1,dot1);\r
+                                       }\r
+                                       orgNS=sb.toString();\r
+                               }\r
+                       }\r
+               } else {\r
+                       // Only use two places (Enterprise) of domain\r
+                       int dot;\r
+                       if((dot= orgNS.lastIndexOf('.'))>-1) {\r
+                               StringBuilder sb = new StringBuilder();\r
+                               int dot2;\r
+                               if((dot2 = orgNS.lastIndexOf('.',dot-1))>-1) {\r
+                                       sb.append(orgNS.substring(dot+1));\r
+                                       sb.append(orgNS.subSequence(dot2, dot));\r
+                                       orgNS = sb.toString();\r
+                               } else {\r
+                                       sb.append(orgNS.substring(dot+1));\r
+                                       sb.append('.');\r
+                                       sb.append(orgNS.subSequence(at+1, dot));\r
+                                       orgNS = sb.toString();\r
+                               }\r
+                       }\r
+               }\r
+               Organization org = orgs.get(orgNS);\r
+               if(org == null) {\r
+                       String orgClass = env.getProperty("Organization."+orgNS);\r
+                       if(orgClass == null) {\r
+                               env.warn().log("There is no Organization." + orgNS + " property");\r
+                       } else {\r
+                               for(Organization o : orgs.values()) {\r
+                                       if(orgClass.equals(o.getClass().getName())) {\r
+                                               org = o;\r
+                                       }\r
+                               }\r
+                               if(org==null) {\r
+                                       try {\r
+                                               @SuppressWarnings("unchecked")\r
+                                               Class<Organization> cls = (Class<Organization>) Class.forName(orgClass);\r
+                                               Constructor<Organization> cnst = cls.getConstructor(AuthzEnv.class);\r
+                                               org = cnst.newInstance(env);\r
+                                       } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | \r
+                                                       InstantiationException | IllegalAccessException | IllegalArgumentException | \r
+                                                       InvocationTargetException e) {\r
+                                               throw new OrganizationException(e);\r
+                                       }\r
+                               }\r
+                               orgs.put(orgNS, org);\r
+                       }\r
+                       if(org==null && defaultOrg!=null) {\r
+                               org=defaultOrg;\r
+                               orgs.put(orgNS, org);\r
+                       }\r
+               }\r
+               \r
+               return org;\r
+       }\r
+\r
+       public static void set(AuthzTrans trans, String orgNS) throws OrganizationException {\r
+               Organization org = obtain(trans.env(),orgNS);\r
+               trans.put(orgSlot, org);\r
+       }\r
+       \r
+       public static Organization get(AuthzTrans trans) {\r
+               return trans.get(orgSlot,defaultOrg);\r
+       }\r
+\r
+}\r