/*
* Copyright (c) 2012-2015 iWave Software LLC
* All Rights Reserved
*/
package com.iwave.ext.linux.command.parser;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import com.google.common.collect.Lists;
import com.iwave.ext.linux.model.FcTarget;
import com.iwave.ext.text.TextParser;
public class FcTargetParser {
private static final Pattern TARGET_PATTERN = Pattern
.compile("target: target(\\d+):(\\d+):(\\d+)");
private static final Pattern NODE_NAME_PATTERN = Pattern
.compile("node:\\s*0x([0-9a-fA-F]*)\\b");
private static final Pattern PORT_NAME_PATTERN = Pattern
.compile("port:\\s*0x([0-9a-fA-F]*)\\b");
private TextParser parser;
public FcTargetParser() {
parser = new TextParser();
parser.setRepeatPattern(TARGET_PATTERN);
}
public List<FcTarget> parseFcTargets(String text) {
List<FcTarget> targets = Lists.newArrayList();
for (String textBlock : parser.parseTextBlocks(text)) {
FcTarget target = parseFcTarget(textBlock);
if (target != null) {
targets.add(target);
}
}
return targets;
}
public FcTarget parseFcTarget(String text) {
if (StringUtils.isBlank(text)) {
return null;
}
Matcher m = TARGET_PATTERN.matcher(text);
if (!m.find()) {
return null;
}
FcTarget target = new FcTarget();
target.setScsiHost(NumberUtils.toInt(m.group(1)));
target.setScsiChannel(NumberUtils.toInt(m.group(2)));
target.setScsiId(NumberUtils.toInt(m.group(3)));
String nodeName = parser.findMatch(NODE_NAME_PATTERN, text);
target.setNodeName(normalizeWWN(nodeName));
String portName = parser.findMatch(PORT_NAME_PATTERN, text);
target.setPortName(normalizeWWN(portName));
return target;
}
private String normalizeWWN(String wwn) {
wwn = StringUtils.trim(wwn);
wwn = StringUtils.leftPad(wwn, 16, '0');
wwn = StringUtils.lowerCase(wwn);
return wwn;
}
}