blob: 8ca3c763437e22baaec7766809590f637400c0e7 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* 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.
*/
package com.maddyhome.idea.copyright.options;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.maddyhome.idea.copyright.CopyrightUpdaters;
import com.maddyhome.idea.copyright.psi.UpdateCopyrightsProvider;
import com.maddyhome.idea.copyright.util.FileTypeUtil;
import org.jdom.Element;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/**
*/
public class Options implements Cloneable {
public LanguageOptions getOptions(String name) {
String lang = FileTypeUtil.getInstance().getFileTypeNameByName(name);
LanguageOptions res = options.get(lang);
if (res == null) {
// NOTE: If any change is made here you need to update ConfigTabFactory and UpdateCopyrightFactory too.
final FileType fileType = FileTypeUtil.getInstance().getFileTypeByName(name);
if (fileType != null) {
final UpdateCopyrightsProvider provider = CopyrightUpdaters.INSTANCE.forFileType(fileType);
if (provider != null) return provider.getDefaultOptions();
}
res = new LanguageOptions();
}
return res;
}
public LanguageOptions getTemplateOptions() {
return getOptions(LANG_TEMPLATE);
}
public void setOptions(String name, LanguageOptions options) {
String lang = FileTypeUtil.getInstance().getFileTypeNameByName(name);
this.options.put(lang, options);
}
public void setTemplateOptions(LanguageOptions options) {
setOptions(LANG_TEMPLATE, options);
}
@Nullable
public LanguageOptions getMergedOptions(String name) {
try {
LanguageOptions lang = getOptions(name).clone();
LanguageOptions temp = getTemplateOptions().clone();
switch (lang.getFileTypeOverride()) {
case LanguageOptions.USE_TEMPLATE:
temp.setFileLocation(lang.getFileLocation());
temp.setFileTypeOverride(lang.getFileTypeOverride());
lang = temp;
break;
case LanguageOptions.USE_TEXT:
break;
}
return lang;
}
catch (CloneNotSupportedException e) {
// This shouldn't happen
}
return null;
}
public void readExternal(Element element) throws InvalidDataException {
logger.debug("readExternal()");
List<Element> languageOptions = element.getChildren("LanguageOptions");
if (languageOptions != null && !languageOptions.isEmpty()) {
//noinspection ForLoopReplaceableByForEach
for (int i = 0; i < languageOptions.size(); i++) {
Element languageOption = languageOptions.get(i);
// NOTE: If any change is made here you need to update ConfigTabFactory and UpdateCopyrightFactory too.
LanguageOptions opts = new LanguageOptions();
opts.readExternal(languageOption);
setOptions(languageOption.getAttributeValue("name"), opts);
}
}
else {
Element root = null;
Element jOpts = element.getChild("JavaOptions");
if (jOpts != null) // version 2.1.x
{
root = jOpts;
}
else // versions 0.0.1 - 2.0.x
{
Element child = element.getChild("option");
if (child != null && child.getAttribute("name") != null) {
root = element;
}
}
if (root != null) {
String languageName = StdFileTypes.JAVA.getName();
// NOTE: If any change is made here you need to update ConfigTabFactory and UpdateCopyrightFactory too.
LanguageOptions opts = new LanguageOptions();
opts.setFileTypeOverride(LanguageOptions.USE_TEMPLATE);
for (Object option : root.getChildren("option")) {
String name = ((Element)option).getAttributeValue("name");
String val = ((Element)option).getAttributeValue("value");
if ("body".equals(name)) {
//todo opts.setNotice(val);
}
else if ("location".equals(name)) {
opts.setFileLocation(Integer.parseInt(val));
}
}
setOptions(languageName, opts);
}
}
logger.debug("options=" + this);
}
public void writeExternal(Element element) throws WriteExternalException {
logger.debug("writeExternal()");
for (String lang : options.keySet()) {
Element elem = new Element("LanguageOptions");
elem.setAttribute("name", lang);
element.addContent(elem);
options.get(lang).writeExternal(elem);
}
logger.debug("options=" + this);
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final Options options1 = (Options)o;
return options.equals(options1.options);
}
public int hashCode() {
int result;
result = options.hashCode();
return result;
}
public String toString() {
return "Options" + "{options=" + options + '}';
}
@Override
public Options clone() throws CloneNotSupportedException {
Options res = (Options)super.clone();
res.options = new TreeMap<String, LanguageOptions>();
for (String lang : options.keySet()) {
LanguageOptions opts = options.get(lang);
res.options.put(lang, opts.clone());
}
return res;
}
private Map<String, LanguageOptions> options = new TreeMap<String, LanguageOptions>();
private static final String LANG_TEMPLATE = "__TEMPLATE__";
private static final Logger logger = Logger.getInstance(Options.class.getName());
}