From e0385921034ae9ce860038ea65d2d13259f7cc4c Mon Sep 17 00:00:00 2001 From: "Tej, Tarun" Date: Fri, 15 Sep 2017 00:52:13 -0400 Subject: Adding Junits for policy engine Adding Junits to Policy Engine Utils project, removed duplicates, fixed few defects along the way and fixes to projects. Issue-Id: POLICY-52 Change-Id: Ia0598300f9bd60f5372b9ef7d8984657478a1611 Signed-off-by: Tej, Tarun --- .../java/org/onap/policy/std/StdLoadedPolicy.java | 2 +- .../java/org/onap/policy/std/StdRemovedPolicy.java | 2 +- .../org/onap/policy/utils/AAFPolicyClientImpl.java | 8 +- .../java/org/onap/policy/utils/BackUpMonitor.java | 85 +++--- .../java/org/onap/policy/utils/BusConsumer.java | 2 +- .../java/org/onap/policy/utils/BusPublisher.java | 5 +- .../java/org/onap/policy/utils/PolicyUtils.java | 321 +++++++++++++++------ .../org/onap/policy/utils/XMLErrorHandler.java | 47 +++ 8 files changed, 336 insertions(+), 136 deletions(-) create mode 100644 PolicyEngineUtils/src/main/java/org/onap/policy/utils/XMLErrorHandler.java (limited to 'PolicyEngineUtils/src/main') diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdLoadedPolicy.java b/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdLoadedPolicy.java index c1f4fed7f..10268f658 100644 --- a/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdLoadedPolicy.java +++ b/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdLoadedPolicy.java @@ -34,7 +34,7 @@ public class StdLoadedPolicy implements LoadedPolicy{ @Override public String getPolicyName() { if(policyName!=null && policyName.contains(".xml")){ - return (policyName.substring(0, policyName.substring(0, policyName.lastIndexOf(".")).lastIndexOf("."))); + return (policyName.substring(0, policyName.substring(0, policyName.lastIndexOf('.')).lastIndexOf('.'))); } return this.policyName; } diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdRemovedPolicy.java b/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdRemovedPolicy.java index bdce33a3b..5430e24ef 100644 --- a/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdRemovedPolicy.java +++ b/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdRemovedPolicy.java @@ -38,7 +38,7 @@ public class StdRemovedPolicy implements RemovedPolicy{ @Override public String getPolicyName() { if(policyName!=null && policyName.contains(".xml")){ - return (policyName.substring(0, policyName.substring(0, policyName.lastIndexOf(".")).lastIndexOf("."))); + return (policyName.substring(0, policyName.substring(0, policyName.lastIndexOf('.')).lastIndexOf('.'))); } return this.policyName; } diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFPolicyClientImpl.java b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFPolicyClientImpl.java index 0f4876051..ecb51b286 100644 --- a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFPolicyClientImpl.java +++ b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFPolicyClientImpl.java @@ -65,9 +65,6 @@ public class AAFPolicyClientImpl implements AAFPolicyClient{ private static Access access = null; private AAFPolicyClientImpl(Properties properties) throws AAFPolicyException{ - if(instance == null){ - instance = this; - } setup(properties); } @@ -93,7 +90,6 @@ public class AAFPolicyClientImpl implements AAFPolicyClient{ props.setProperty("AFT_LATITUDE", properties.getProperty("AFT_LATITUDE", DEFAULT_AFT_LATITUDE)); props.setProperty("AFT_LONGITUDE", properties.getProperty("AFT_LONGITUDE", DEFAULT_AFT_LONGITUDE)); String aftEnv = TEST_AFT_ENVIRONMENT; - //props.setProperty(Config.CADI_KEYFILE,"keyfile"); props.setProperty("aaf_id",properties.getProperty("aaf_id", "aafID")); props.setProperty("aaf_password", properties.getProperty("aaf_password", "aafPass")); if(properties.containsKey(Config.AAF_URL)){ @@ -203,8 +199,8 @@ public class AAFPolicyClientImpl implements AAFPolicyClient{ private static boolean setUpAAF(){ try { aafCon = new AAFConDME2(access); - aafLurPerm = aafCon.newLur();//new AAFLurPerm(aafCon); - aafAuthn = aafCon.newAuthn(aafLurPerm);//new AAFAuthn(aafCon, aafLurPerm); + aafLurPerm = aafCon.newLur(); + aafAuthn = aafCon.newAuthn(aafLurPerm); return true; } catch (Exception e) { logger.error("Error while setting up AAF Connection " + e.getMessage() + e); diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BackUpMonitor.java b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BackUpMonitor.java index d4f111637..3cdb51577 100644 --- a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BackUpMonitor.java +++ b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BackUpMonitor.java @@ -53,8 +53,11 @@ import com.github.fge.jsonpatch.diff.JsonDiff; */ public class BackUpMonitor { private static final Logger LOGGER = Logger.getLogger(BackUpMonitor.class.getName()); - private static final int DEFAULT_PING = 15000; // Value is in milliseconds. - + private static final int DEFAULT_PING = 500; // Value is in milliseconds. + private static final String PING_INTERVAL = "ping_interval"; + private static final String MASTER = "MASTER"; + private static final String SLAVE = "SLAVE"; + private static BackUpMonitor instance = null; private static String resourceName = null; private static String resourceNodeName = null; @@ -65,6 +68,8 @@ public class BackUpMonitor { private static Object lock = new Object(); private static Object notificationLock = new Object(); private static BackUpHandler handler = null; + private static Boolean stopFlag = false; + private static Thread t = null; private EntityManager em; private EntityManagerFactory emf; @@ -77,14 +82,11 @@ public class BackUpMonitor { private BackUpMonitor(String resourceNodeName, String resourceName, Properties properties, BackUpHandler handler) throws BackUpMonitorException { - if (instance == null) { - instance = this; - } - BackUpMonitor.resourceNodeName = resourceNodeName; - BackUpMonitor.resourceName = resourceName; - BackUpMonitor.handler = handler; + init(resourceName, resourceNodeName, handler); // Create Persistence Entity - properties.setProperty(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML, "META-INF/persistencePU.xml"); + if(!properties.containsKey(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML)){ + properties.setProperty(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML, "META-INF/persistencePU.xml"); + } emf = Persistence.createEntityManagerFactory("PolicyEngineUtils", properties); if (emf == null) { LOGGER.error("Unable to create Entity Manger Factory "); @@ -94,12 +96,31 @@ public class BackUpMonitor { // Check Database if this is Master or Slave. checkDataBase(); - // Start thread. - Thread t = new Thread(new BMonitor()); + startThread(new BMonitor()); + } + + private static void startThread(BMonitor bMonitor) { + t = new Thread(bMonitor); t.start(); } + public static void stop() throws InterruptedException{ + stopFlag = true; + if(t!=null){ + t.interrupt(); + t.join(); + } + instance = null; + } + + private static void init(String resourceName, String resourceNodeName, BackUpHandler handler) { + BackUpMonitor.resourceNodeName = resourceNodeName; + BackUpMonitor.resourceName = resourceName; + BackUpMonitor.handler = handler; + stopFlag = false; + } + /** * Gets the BackUpMonitor Instance if given proper resourceName and properties. Else returns null. * @@ -142,17 +163,12 @@ public class BackUpMonitor { LOGGER.error("javax.persistence.jdbc.user property is empty"); return false; } - if (properties.getProperty("javax.persistence.jdbc.password") == null - || properties.getProperty("javax.persistence.jdbc.password").trim().equals("")) { - LOGGER.error("javax.persistence.jdbc.password property is empty"); - return false; - } - if (properties.getProperty("ping_interval") == null - || properties.getProperty("ping_interval").trim().equals("")) { + if (properties.getProperty(PING_INTERVAL) == null + || properties.getProperty(PING_INTERVAL).trim().equals("")) { LOGGER.info("ping_interval property not specified. Taking default value"); } else { try { - pingInterval = Integer.parseInt(properties.getProperty("ping_interval").trim()); + pingInterval = Integer.parseInt(properties.getProperty(PING_INTERVAL).trim()); } catch (NumberFormatException e) { LOGGER.warn("Ignored invalid proeprty ping_interval. Taking default value: " + pingInterval); pingInterval = DEFAULT_PING; @@ -185,7 +201,7 @@ public class BackUpMonitor { @Override public void run() { LOGGER.info("Starting BackUpMonitor Thread.. "); - while (true) { + while (!stopFlag) { try { TimeUnit.MILLISECONDS.sleep(pingInterval); checkDataBase(); @@ -198,26 +214,27 @@ public class BackUpMonitor { // Set Master private static BackUpMonitorEntity setMaster(BackUpMonitorEntity bMEntity) { - bMEntity.setFlag("MASTER"); + bMEntity.setFlag(MASTER); setFlag(true); return bMEntity; } // Set Slave private static BackUpMonitorEntity setSlave(BackUpMonitorEntity bMEntity) { - bMEntity.setFlag("SLAVE"); + bMEntity.setFlag(SLAVE); setFlag(false); return bMEntity; } // Check Database and set the Flag. private void checkDataBase() throws BackUpMonitorException { - EntityTransaction et = em.getTransaction(); - setNotificationRecord(); - // Clear Cache. - LOGGER.info("Clearing Cache"); - em.getEntityManagerFactory().getCache().evictAll(); + EntityTransaction et = null; try { + et = em.getTransaction(); + setNotificationRecord(); + // Clear Cache. + LOGGER.info("Clearing Cache"); + em.getEntityManagerFactory().getCache().evictAll(); LOGGER.info("Checking Datatbase for BackUpMonitor.. "); et.begin(); Query query = em.createQuery("select b from BackUpMonitorEntity b where b.resourceNodeName = :nn"); @@ -247,7 +264,7 @@ public class BackUpMonitor { BackUpMonitorEntity bMEntity = (BackUpMonitorEntity) bMList.get(i); LOGGER.info("Refreshing Entity. "); em.refresh(bMEntity); - if (bMEntity.getFlag().equalsIgnoreCase("MASTER")) { + if (bMEntity.getFlag().equalsIgnoreCase(MASTER)) { masterEntities.add(bMEntity); } if (bMEntity.getResourceName().equals(resourceName)) { @@ -256,7 +273,7 @@ public class BackUpMonitor { } if (selfEntity != null) { LOGGER.info("Resource Name already Exists: " + resourceName); - if (selfEntity.getFlag().equalsIgnoreCase("MASTER")) { + if (selfEntity.getFlag().equalsIgnoreCase(MASTER)) { // Already Master Mode. setFlag(true); LOGGER.info(resourceName + " is on Master Mode"); @@ -306,19 +323,19 @@ public class BackUpMonitor { // Slave. BackUpMonitorEntity masterEntity = null; for (BackUpMonitorEntity currentEntity : masterEntities) { - if (currentEntity.getFlag().equalsIgnoreCase("MASTER")) { + if (currentEntity.getFlag().equalsIgnoreCase(MASTER)) { if (masterEntity == null) { masterEntity = currentEntity; } else if (currentEntity.getTimeStamp().getTime() > masterEntity.getTimeStamp() .getTime()) { // False Master, Update master to slave and take currentMaster as Master. - masterEntity.setFlag("SLAVE"); + masterEntity.setFlag(SLAVE); masterEntity.setTimeStamp(new Date()); em.persist(masterEntity); em.flush(); masterEntity = currentEntity; } else { - currentEntity.setFlag("SLAVE"); + currentEntity.setFlag(SLAVE); currentEntity.setTimeStamp(new Date()); em.persist(currentEntity); em.flush(); @@ -339,7 +356,7 @@ public class BackUpMonitor { if (timeDiff > (pingInterval + 1500)) { // This is down or has an issue and we need to become Master while turning the // Master to slave. - masterEntity.setFlag("SLAVE"); + masterEntity.setFlag(SLAVE); String lastNotification = null; if (masterEntity.getNotificationRecord() != null) { lastNotification = calculatePatch(masterEntity.getNotificationRecord()); @@ -366,7 +383,7 @@ public class BackUpMonitor { et.commit(); } catch (Exception e) { LOGGER.error("failed Database Operation " + e.getMessage(), e); - if (et.isActive()) { + if (et!=null && et.isActive()) { et.rollback(); } throw new BackUpMonitorException(e); diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BusConsumer.java b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BusConsumer.java index 1b31394d0..2c867a3d1 100644 --- a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BusConsumer.java +++ b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BusConsumer.java @@ -70,7 +70,7 @@ public interface BusConsumer { public DmaapConsumerWrapper(List servers, String topic, String aafLogin, String aafPassword, String consumerGroup, String consumerInstance, - int fetchTimeout, int fetchLimit) throws MalformedURLException{ + int fetchTimeout, int fetchLimit) throws MalformedURLException{ this.consumer = new MRConsumerImpl(servers, topic, consumerGroup, consumerInstance, diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BusPublisher.java b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BusPublisher.java index 3190aa035..3a12122bf 100644 --- a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BusPublisher.java +++ b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BusPublisher.java @@ -42,7 +42,7 @@ public interface BusPublisher { * @return true if success, false otherwise * @throws IllegalArgumentException if no message provided */ - public boolean send(String partitionId, String message) throws IllegalArgumentException; + public boolean send(String partitionId, String message); /** * closes the publisher @@ -114,8 +114,7 @@ public interface BusPublisher { * {@inheritDoc} */ @Override - public boolean send(String partitionId, String message) - throws IllegalArgumentException { + public boolean send(String partitionId, String message){ if (message == null) throw new IllegalArgumentException("No message provided"); diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/PolicyUtils.java b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/PolicyUtils.java index 8bc83dcb8..b74bd28cc 100644 --- a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/PolicyUtils.java +++ b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/PolicyUtils.java @@ -26,96 +26,142 @@ import java.io.UnsupportedEncodingException; import java.util.Arrays; import java.util.Base64; import java.util.List; +import java.util.Scanner; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + import org.drools.core.io.impl.ReaderResource; import org.drools.verifier.Verifier; import org.drools.verifier.VerifierError; import org.drools.verifier.builder.VerifierBuilder; import org.drools.verifier.builder.VerifierBuilderFactory; import org.kie.api.io.ResourceType; +import org.onap.policy.common.logging.flexlogger.FlexLogger; +import org.onap.policy.common.logging.flexlogger.Logger; +import org.xml.sax.InputSource; +import org.xml.sax.XMLReader; +import com.att.aft.dme2.internal.gson.JsonParser; +import com.att.aft.dme2.internal.gson.JsonSyntaxException; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.CharMatcher; public class PolicyUtils { - - public static final String EMAIL_PATTERN = + private static final Logger LOGGER = FlexLogger.getLogger(PolicyUtils.class); + + public static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; - private static final String PACKAGE_ERROR = "mismatched input '{' expecting one of the following tokens: '[package"; - private static final String SUCCESS = "success"; - - private PolicyUtils(){ - // Private Constructor - } - public static String objectToJsonString(Object o) throws JsonProcessingException{ - ObjectMapper mapper = new ObjectMapper(); - return mapper.writeValueAsString(o); - } - - public static T jsonStringToObject(String jsonString, Class className) throws IOException{ - ObjectMapper mapper = new ObjectMapper(); - return mapper.readValue(jsonString, className); - } - - public static String decode(String encodedString) throws UnsupportedEncodingException { - if(encodedString!=null && !encodedString.isEmpty()){ - return new String(Base64.getDecoder().decode(encodedString) ,"UTF-8"); - }else{ - return null; - } - } - - public static String[] decodeBasicEncoding(String encodedValue) throws UnsupportedEncodingException { - if(encodedValue!=null && encodedValue.contains("Basic ")){ - String encodedUserPassword = encodedValue.replaceFirst("Basic" + " ", ""); - String usernameAndPassword = null; - byte[] decodedBytes = Base64.getDecoder().decode(encodedUserPassword); - usernameAndPassword = new String(decodedBytes, "UTF-8"); - StringTokenizer tokenizer = new StringTokenizer(usernameAndPassword, ":"); - String username = tokenizer.nextToken(); - String password = tokenizer.nextToken(); - return new String[]{username, password}; - }else{ - return new String[]{}; - } - } - - public static String emptyPolicyValidator(String field){ + private static final String PACKAGE_ERROR = "mismatched input '{' expecting one of the following tokens: '[package"; + private static final String SUCCESS = "success"; + + private PolicyUtils(){ + // Private Constructor + } + + /** + * Converts an Object to JSON String + * + * @param o Object + * @return String format of Object JSON. + * @throws JsonProcessingException + */ + public static String objectToJsonString(Object o) throws JsonProcessingException{ + ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(o); + } + + /** + * Converts JSON string into Object + * + * @param jsonString + * @param className equivalent Class of the given JSON string + * @return T instance of the class given. + * @throws IOException + */ + public static T jsonStringToObject(String jsonString, Class className) throws IOException{ + ObjectMapper mapper = new ObjectMapper(); + return mapper.readValue(jsonString, className); + } + + /** + * Decode a base64 string + * + * @param encodedString + * @return String + * @throws UnsupportedEncodingException + */ + public static String decode(String encodedString) throws UnsupportedEncodingException { + if(encodedString!=null && !encodedString.isEmpty()){ + return new String(Base64.getDecoder().decode(encodedString) ,"UTF-8"); + }else{ + return null; + } + } + + /** + * Decodes Basic Authentication + * + * @param encodedValue + * @return + * @throws UnsupportedEncodingException + */ + public static String[] decodeBasicEncoding(String encodedValue) throws UnsupportedEncodingException { + if(encodedValue!=null && encodedValue.contains("Basic ")){ + String encodedUserPassword = encodedValue.replaceFirst("Basic" + " ", ""); + String usernameAndPassword = null; + byte[] decodedBytes = Base64.getDecoder().decode(encodedUserPassword); + usernameAndPassword = new String(decodedBytes, "UTF-8"); + StringTokenizer tokenizer = new StringTokenizer(usernameAndPassword, ":"); + String username = tokenizer.nextToken(); + String password = tokenizer.nextToken(); + return new String[]{username, password}; + }else{ + return new String[]{}; + } + } + + /** + * Validate a field if contains space or unacceptable policy input and return "success" if good. + * + * @param field + * @return + */ + public static String policySpecialCharValidator(String field){ String error; if ("".equals(field) || field.contains(" ") || !field.matches("^[a-zA-Z0-9_]*$")) { error = "The Value in Required Field will allow only '{0-9}, {a-z}, {A-Z}, _' following set of Combinations"; - return error; - } else { - if(CharMatcher.ASCII.matchesAllOf((CharSequence) field)){ - error = SUCCESS; - }else{ - error = "The Value Contains Non ASCII Characters"; - return error; - } + return error; } - return error; + return SUCCESS; } - public static String emptyPolicyValidatorWithSpaceAllowed(String field){ + /** + * Validate a field (accepts space) if it contains unacceptable policy input and return "success" if good. + * + * @param field + * @return + */ + public static String policySpecialCharWithSpaceValidator(String field){ String error; if ("".equals(field) || !field.matches("^[a-zA-Z0-9_ ]*$")) { error = "The Value in Required Field will allow only '{0-9}, {a-z}, {A-Z}, _' following set of Combinations"; return error; - } else { - if(CharMatcher.ASCII.matchesAllOf((CharSequence) field)){ - error = SUCCESS; - }else{ - error = "The Value Contains Non ASCII Characters"; - return error; - } } - return error; + return SUCCESS; } + + /** + * Validate the XACML description tag and return "success" if good. + * + * @param field + * @return + */ public static String descriptionValidator(String field) { String error; if (field.contains("@CreatedBy:") || field.contains("@ModifiedBy:")) { @@ -127,15 +173,38 @@ public class PolicyUtils { return error; } + /** + * Validate if string contains non ASCII characters + * + * @param value + * @return + */ + public static boolean containsNonAsciiEmptyChars(String value) { + return (value == null|| value.contains(" ") || "".equals(value.trim())|| !CharMatcher.ASCII.matchesAllOf((CharSequence) value))? true:false; + } + + /** + * Validate if given string is an integer. + * + * @param number + * @return + */ public static Boolean isInteger(String number){ - try{ - Integer.parseInt(number); - }catch(NumberFormatException e){ - return false; - } - return true; + if(number==null) { + return false; + } + for (char c : number.toCharArray()){ + if (!Character.isDigit(c)) return false; + } + return true; } + /** + * Validate Email Address and return "success" if good. + * + * @param emailAddressValue + * @return + */ public static String validateEmailAddress(String emailAddressValue) { String error = SUCCESS; List emailList = Arrays.asList(emailAddressValue.split(",")); @@ -152,8 +221,11 @@ public class PolicyUtils { return error; } - /* - * Check for "[ERR" to see if there are any errors. + /** + * Validates BRMS rule as per Policy Platform and return string contains "[ERR" if there are any errors. + * + * @param rule + * @return String error message */ public static String brmsRawValidate(String rule){ VerifierBuilder vBuilder = VerifierBuilderFactory.newVerifierBuilder(); @@ -161,19 +233,19 @@ public class PolicyUtils { verifier.addResourcesToVerify(new ReaderResource(new StringReader(rule)), ResourceType.DRL); // Check if there are any Errors in Verification. if(!verifier.getErrors().isEmpty()){ - boolean ignore = false; + boolean ignore = false; StringBuilder message = new StringBuilder("Not a Valid DRL rule"); for(VerifierError error: verifier.getErrors()){ // Ignore annotations Error Messages if(!error.getMessage().contains("'@'") && !error.getMessage().contains(PACKAGE_ERROR)){ - ignore= true; + ignore= true; message.append("\n" + error.getMessage()); } } - // Ignore new package names with { + // Ignore new package names with '{' // More checks for message to check if its a package error. if(ignore && !message.toString().contains("Parser returned a null Package")){ - message.append("[ERR 107]"); + message.append("[ERR 107]"); } return message.toString(); } @@ -181,21 +253,90 @@ public class PolicyUtils { } /** - * Given a version string consisting of integers with dots between them, convert it into an array of ints. - * - * @param version - * @return - * @throws NumberFormatException - */ - public static int[] versionStringToArray(String version) throws NumberFormatException { - if (version == null || version.length() == 0) { - return new int[0]; - } - String[] stringArray = version.split("\\."); - int[] resultArray = new int[stringArray.length]; - for (int i = 0; i < stringArray.length; i++) { - resultArray[i] = Integer.parseInt(stringArray[i]); - } - return resultArray; - } -} + * Validates if the given string is proper JSON format. + * + * @param data + * @return + */ + public static boolean isJSONValid(String data) { + try{ + JsonParser parser = new JsonParser(); + parser.parse(data); + }catch(JsonSyntaxException e){ + LOGGER.error("Exception Occurred While Validating"+e); + return false; + } + return true; + } + + /** + * Validates if the given string is proper XML format. + * + * @param data + * @return + */ + public static boolean isXMLValid(String data) { + SAXParserFactory factory = SAXParserFactory.newInstance(); + factory.setValidating(false); + factory.setNamespaceAware(true); + try { + SAXParser parser = factory.newSAXParser(); + XMLReader reader = parser.getXMLReader(); + reader.setErrorHandler(new XMLErrorHandler()); + reader.parse(new InputSource(new StringReader(data))); + } catch (Exception e) { + LOGGER.error("Exception Occured While Validating"+e); + return false; + } + return true; + } + + /** + * Validates if given string is valid Properties format. + * + * @param prop + * @return + */ + public static boolean isPropValid(String prop) { + Scanner scanner = new Scanner(prop); + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + line = line.replaceAll("\\s+", ""); + if (line.startsWith("#")) { + continue; + } else { + if (line.contains("=")) { + String[] parts = line.split("="); + if (parts.length < 2) { + scanner.close(); + return false; + } + } else if(!line.trim().isEmpty()){ + scanner.close(); + return false; + } + } + } + scanner.close(); + return true; + } + + /** + * Given a version string consisting of integers with dots between them, convert it into an array of integers. + * + * @param version + * @return + * @throws NumberFormatException + */ + public static int[] versionStringToArray(String version){ + if (version == null || version.length() == 0) { + return new int[0]; + } + String[] stringArray = version.split("\\."); + int[] resultArray = new int[stringArray.length]; + for (int i = 0; i < stringArray.length; i++) { + resultArray[i] = Integer.parseInt(stringArray[i].trim()); + } + return resultArray; + } +} \ No newline at end of file diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/XMLErrorHandler.java b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/XMLErrorHandler.java new file mode 100644 index 000000000..3037a423c --- /dev/null +++ b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/XMLErrorHandler.java @@ -0,0 +1,47 @@ +/*- + * ============LICENSE_START======================================================= + * PolicyEngineUtils + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.utils; + +import org.onap.policy.common.logging.flexlogger.FlexLogger; +import org.onap.policy.common.logging.flexlogger.Logger; +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +public class XMLErrorHandler implements ErrorHandler { + private static final Logger LOGGER = FlexLogger.getLogger(XMLErrorHandler.class); + + @Override + public void warning(SAXParseException exception) throws SAXException { + LOGGER.debug(exception); + } + + @Override + public void error(SAXParseException exception) throws SAXException { + LOGGER.error(exception); + } + + @Override + public void fatalError(SAXParseException exception) throws SAXException { + LOGGER.error(exception); + } + +} -- cgit 1.2.3-korg